我正在尝试使用scikit学习模块进行文本分类。它是一个包含大量独特单词的数据集。它的性质将从下面的示例中显而易见,
train_counts = count_vect.fit_transform(data)
train_counts.shape
print len(range(len(data)-1))
clf = MultinomialNB(alpha=1).fit(train_counts, range(len(data)) )
docs_new = ['Modern Warfare 2', 'Modern Warfare 3', 'Modern Warfare 1', 'Modern Warfare 4', 'Modern Warfare', 'Mahjong Kakutou Club', 'Mass Effect 2']
new_counts = count_vect.transform(docs_new)
predicted = clf.predict(new_counts)
for doc, category in zip(docs_new, predicted):
print '%r => %s' % (doc, target_names[category])输出如下所示。
763
'Modern Warfare 2' => Call of Duty: Modern Warfare 3
'Modern Warfare 3' => Call of Duty: Modern Warfare 3
'Modern Warfare 1' => Call of Duty: Modern Warfare 3
'Modern Warfare 4' => Call of Duty: Modern Warfare 3
'Modern Warfare' => Call of Duty: Modern Warfare 3
'Mahjong Kakutou Club' => Mahjong Kakutou Club
'Mass Effect 2' => Mass Effect 2这是一个多项式的例子,但我得到的结果与伯努利的例子相同。我已经尝试使用从0到1000000的alpha值。有人能给我解释一下为什么会这样吗?
编辑:我应该说清楚,以下职业存在使命召唤:现代战争,使命召唤:现代战争2…大多数其他游戏,所有play-station游戏的列表都取自维基百科。
此外,完整的版本,例如调用的职责:现代战争2作为测试字符串产生相同的结果
我最初使用的是NLTK分类器,但由于某种原因,它并没有赋予像"Kakutou“这样的词太多的价值,这些词在任何其他示例中都没有出现。(显然Scikit one有)它没有像scikit分类器那样的数字问题。
这里的任何指导或信息都是非常有价值的。
谢谢
编辑:数据集是从这里开始的,它是第一列,每个示例都有一个相同的标签和内容
发布于 2014-05-08 09:29:58
代码没有显示count_vect是如何构造的,但如果它只是一个默认的初始化CountVectorizer,那么它会忽略字符标记(即序列号),使所有的“现代战争……”标题和“现代战争”是一样的:
>>> from sklearn.feature_extraction.text import CountVectorizer as CV
>>> count_vect=CV()
>>> docs_new = ['Modern Warfare 2', 'Modern Warfare 3', 'Modern Warfare 1', 'Modern Warfare 4', 'Modern Warfare A', 'Modern Warfare 44', 'Modern Warfare AA', 'Modern Warfare', 'Mahjong Kakutou Club', 'Mass Effect 2']
>>> new_counts = count_vect.fit_transform(docs_new)
>>> count_vect.inverse_transform(new_counts)
[array([u'modern', u'warfare'],
dtype='<U7'), array([u'modern', u'warfare'],
dtype='<U7'), array([u'modern', u'warfare'],
dtype='<U7'), array([u'modern', u'warfare'],
dtype='<U7'), array([u'modern', u'warfare'],
dtype='<U7'), array([u'44', u'modern', u'warfare'],
dtype='<U7'), array([u'aa', u'modern', u'warfare'],
dtype='<U7'), array([u'modern', u'warfare'],
dtype='<U7'), array([u'club', u'kakutou', u'mahjong'],
dtype='<U7'), array([u'effect', u'mass'],
dtype='<U7')]这是因为scikit向量化器具有默认设置token_pattern=r'(?u)\b\w\w+\b'模型只是随意打破了这种联系,因为无论是训练还是预测都看不到这些标题之间的任何区别。您可以通过使用token_pattern=r'(?u)\b\w+\b'来解决此问题
>>> from sklearn.feature_extraction.text import CountVectorizer as CV
>>> count_vect=CV(token_pattern=r'(?u)\b\w+\b')
>>> docs_new = ['Modern Warfare 2', 'Modern Warfare 3', 'Modern Warfare 1', 'Modern Warfare 4', 'Modern Warfare A', 'Modern Warfare 44', 'Modern Warfare AA', 'Modern Warfare', 'Mahjong Kakutou Club', 'Mass Effect 2']
>>> new_counts = count_vect.fit_transform(docs_new)
>>> count_vect.inverse_transform(new_counts)
[array([u'2', u'modern', u'warfare'],
dtype='<U7'), array([u'3', u'modern', u'warfare'],
dtype='<U7'), array([u'1', u'modern', u'warfare'],
dtype='<U7'), array([u'4', u'modern', u'warfare'],
dtype='<U7'), array([u'a', u'modern', u'warfare'],
dtype='<U7'), array([u'44', u'modern', u'warfare'],
dtype='<U7'), array([u'aa', u'modern', u'warfare'],
dtype='<U7'), array([u'modern', u'warfare'],
dtype='<U7'), array([u'club', u'kakutou', u'mahjong'],
dtype='<U7'), array([u'2', u'effect', u'mass'],
dtype='<U7')]https://stackoverflow.com/questions/12033086
复制相似问题