使用自定义词汇表进行TfidfVectorizer scikit-learn的问题

时间:2013-02-20 18:07:02

标签: python scikit-learn tf-idf vocabulary

我正在尝试在scikit中使用自定义词汇 - 学习一些聚类任务,我得到了非常奇怪的结果。

当不使用自定义词汇表时,程序运行正常,我对群集创建感到满意。但是,我已经确定了一组单词(大约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']

我必须说当使用的词汇表是从输入文档中确定的词汇时,程序运行得很好,所以我强烈怀疑这个问题与使用自定义词汇表有关。

有没有人知道发生了什么?

(我没有使用管道,所以这个问题与先前已经修复过的bug无关)

3 个答案:

答案 0 :(得分:0)

让我感到不同寻常的一件事是,当您创建矢量图时,指定ngram_range=(1,2)。这意味着您无法使用标准标记生成器获取功能'21 CFR Part 11'。我怀疑'{1}}的'缺失'特征是n-gram。有多少预先选择的词汇项目是unigrams或bigrams?

答案 1 :(得分:0)

我很确定这是由min_df=2的(可以说是令人困惑的)默认值导致的,如果数据集中至少两次没有出现任何特征,则会截断词汇表中的任何特征。您能否在代码中明确设置min_df=1来确认?

答案 2 :(得分:0)

在Python for-in循环中,它不能使用count + = 1来使count在每个循环时添加一个。您可以在范围(n)中使用i:替换它。因为count的值将保持为1。