我正在尝试在 scikit-learn 中使用自定义词汇表来执行一些聚类任务,但我得到了非常奇怪的结果。
该程序在不使用自定义词汇表时运行正常,并且我对集群创建感到满意。但是,我已经确定了一组我想用作自定义词汇表的单词(大约 24,000 个)。
单词存储在 SQL Server 表中。到目前为止,我已经尝试了 2 种方法,但最后我得到了相同的结果。第一个是创建列表,第二个是创建字典。创建字典的代码是这样的:
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']
我必须说,当使用的词汇表是根据输入文档确定的词汇表时,程序运行良好,所以我强烈怀疑问题与使用自定义词汇表有关。
有没有人知道发生了什么?
(我没有使用管道,所以这个问题与之前已经修复的错误无关)