4

我正在尝试在 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']

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

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

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

4

3 回答 3

1

让我感到不寻常的一件事是,当您创建您指定的矢量化器时ngram_range=(1,2)。这意味着您无法'21 CFR Part 11'使用标准标记器获得该功能。我怀疑“缺失”的特征是n>2. 您预先选择的词汇项目中有多少是一元词或二元词?

于 2013-02-20T18:12:52.313 回答
0

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

于 2013-02-20T21:57:26.117 回答
-1

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

于 2015-07-07T16:18:50.353 回答