2013-02-20 224 views
3

我试图在scikit-learn中使用一些自定义词汇来处理一些聚类任务,并且我得到了很奇怪的结果。使用TfidfVectorizer自定义词汇表的问题scikit-learn

当不使用自定义词汇时,程序运行正常,我对集群创建感到满意。但是,我已经确定了一组我希望用作自定义词汇的单词(约24,000个)。

单词存储在SQL Server表中。到目前为止,我尝试了两种方法,但最后我得到了相同的结果。第一个是创建一个列表,第二个是创建一个字典。为创建字典的代码是这样的:

myvocab = {} 
vocabulary = [] 

count = 0 

for row in results: 
    skillName = re.sub(r'&#?[a-z0-9]+;', ' ', row['SkillName']) 
    skillName = unicode(skillName,"utf-8") 
    vocabulary.append(skillName) #Using a list 
    myvocab[str(skillName)] = count #Using a dictionary 
    count+=1 

然后我用在TfidfVectorizer词汇(列表中的每个版本或字典中,他们都给予末相同的结果),如下所示:

vectorizer = TfidfVectorizer(max_df=0.8, 
         stop_words='english' ,ngram_range=(1,2) ,vocabulary=myvocab) 
X = vectorizer.fit_transform(dataset2) 

X的形状是(651,24321),因为我有651个实例群集和在词汇24321个字。

如果我打印X的内容,这就是我得到:

(14, 11462) 1.0 
(20, 10218) 1.0 
(34, 11462) 1.0 
(40, 11462) 0.852815313278 
(40, 10218) 0.52221264006 
(50, 11462) 1.0 
(81, 11462) 1.0 
(84, 11462) 1.0 
(85, 11462) 1.0 
(99, 10218) 1.0 
(127, 11462) 1.0 
(129, 10218) 1.0 
(132, 11462) 1.0 
(136, 11462) 1.0 
(138, 11462) 1.0 
(150, 11462) 1.0 
(158, 11462) 1.0 
(186, 11462) 1.0 
(210, 11462) 1.0 

: : 

如可以看出,大多数情况下,只有从词汇词存在(这是不对的,因为至少10个),并且对于很多实例,甚至没有找到一个单词。而且,所发现的单词在实例中总是相同的,这是没有意义的。

如果我使用打印feature_names:

feature_names = np.asarray(vectorizer.get_feature_names()) 

我得到:

['.NET' '10K' '21 CFR Part 11' ..., 'Zend Studio' 'Zendesk' 'Zenworks'] 

我必须说,这一项目是完全运行时所使用的词汇是一个从输入文件确定,所以我强烈怀疑问题与使用自定义词汇有关。

有没有人有线索发生了什么?

(我不使用流水线所以这个问题不能与以前的错误,这已经被固定)

回答

0

这在我看来是不寻常的一件事是,当你创建矢量化您指定ngram_range=(1,2)。这意味着您无法使用标准标记器获取功能'21 CFR Part 11'。我怀疑'缺少'的功能是n>2的n-grams。你有多少预先选择的词汇项目是unigrams或bigrams?

+0

我尝试过使用ngram_range从(1,1)到(1,5)的不同变化,我总是得到相同的结果。 1克词汇项目的数量是9692,2克:13215,3克:1337,4克:77。我不认为这是问题所在。 – FRiverai 2013-02-21 10:55:46

0

我敢肯定,这是由min_df=2的(可以令人困惑的)默认值造成的,如果它在数据集中至少没有出现两次,就会从词汇表中删除任何特征。您可以通过在您的代码中明确设置min_df=1来确认吗?

+0

我将值更改为min_df = 1,结果完全相同。如果我打印TdidfVectorizer,这就是我得到的:TfidfVectorizer(analyzer = word,binary = False,charset = utf-8, charset_error = strict,dtype = ,input = content, lowercase = True,max_df = 0.8,max_features = None,max_n = None, min_df = 1,min_n =无,ngram_range =(1,2),norm = token_pattern =(?u)\ b \ w \ w + \ b,tokenizer = None,use_idf = True, vocabulary = None) – FRiverai 2013-02-21 10:48:19

+0

那么也许您的'dataset2'不是'TfidfVectorizer'所期待的?检查'TfidfVectorizer'文档中的'input'参数。 您可以通过'TfidfVectorizer(** params).build_analyzer()(dataset2)'来检查文本分析步骤的结果(预处理,标记化和n-gram提取)。 – ogrisel 2013-02-21 12:28:39

+0

我已经广泛地使用该数据集进行分类和聚类,但现在我正尝试使用自己的词汇表,这是我一直遇到问题的时候。不过,我会做你的建议并报告结果 – FRiverai 2013-02-21 16:30:06

0

在Python for-in循环中,无法使用count + = 1在每个循环中使count加1。你可以在范围(n)中使用我:替换它。因为计数的值将保持为1.