我正在尝试使用scikit learn中的自定义词汇表执行一些集群任务,结果非常奇怪。
当不使用自定义词汇表时,程序运行正常,我对集群的创建感到满意。不过,我已经确定了一组单词(大约24000个),我想用作自定义词汇表。
这些单词存储在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的形状是(65124321),因为我有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 = np.asarray(vectorizer.get_feature_names())

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

我必须说,当使用的词汇表是由输入文档确定的词汇表时,程序运行得很好,所以我强烈怀疑这个问题与使用自定义词汇表有关。
有人知道发生了什么事吗?
(我没有使用管道,因此此问题与之前已修复的错误无关)

最佳答案

有一件事让我觉得很不寻常,那就是当你创建矢量器时,你指定了ngram_range=(1,2)。这意味着您无法使用标准的标记赋予器获得特性'21 CFR Part 11'。我怀疑“丢失”的功能是n>2的n-grams。您预先选择的词汇表项目中有多少是unigrams或bigrams?

08-25 15:13