3

我正在尝试使用 scikit learn 模块进行文本分类。它是一个包含许多独特单词的数据集。从以下示例中可以看出其性质,

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 ......大多数其他游戏,所有游戏站游戏的列表均来自维基百科。

此外,完整版本,例如使命召唤:现代战争 2 作为测试字符串会产生相同的结果

我最初使用的是 NLTK 分类器,但由于某种原因,它没有放置太多有价值的词,例如“Kakutou”,而这些词在任何其他示例中都不存在。(显然 Scikit 有)它没有像 scikit 分类器那样的数字问题。

这里的任何指导或信息都将非常有价值。

谢谢

编辑:数据集来自这里http://en.wikipedia.org/wiki/List_of_PlayStation_3_games它的第一列,每个示例都有一个标签和相同的内容

4

1 回答 1

1

该代码没有显示 count_vect 是如何构造的,但如果它只是一个默认的 initialized 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')]
于 2014-05-08T01:29:58.003 回答