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

问题描述 投票:3回答:3

我正试图在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无关)

python scikit-learn tf-idf vocabulary
3个回答
0
投票

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


0
投票

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.