Python nltk Naive Bayes似乎不起作用

时间:2013-11-28 02:44:40

标签: python text classification nltk

我正在使用nltk书 - 使用Python进行自然语言处理(2009)并查看朴素贝叶斯分类器。特别是,我的版本中的Pg 228上的例6-3。 训练集是电影评论。

classifier = nltk.NaiveBayesClassifier.train(train_set)

我查看最具信息性的功能 -

classifier.show_most_informative_features(5)

我得到'杰出','花木兰'和'奇妙'的排名最高的句子被标记为'积极'。

所以,我尝试以下内容 -

in1 = 'wonderfully mulan'
classifier.classify(document_features(in1.split()))

我得到'否'。现在这毫无意义。这些应该是最重要的功能。

document_features函数直接来自本书 -

def document_features(document): 
 document_words = set(document) 
 features = {}
 for word in word_features:
  features['contains(%s)' % word] = (word in document_words)
 return features

2 个答案:

答案 0 :(得分:2)

请注意,该示例中的特征向量由“整个语料库中最常用的2000个单词”组成。因此,假设语料库是全面的,定期审查可能会有相当多的单词。 (在最新的Jackass电影和达拉斯买家俱乐部的实际评论中,我分别得到了26/2000和28/2000的功能。)

如果您只提供一个仅包含“奇妙花木兰”的评论,则生成的特征向量仅将2/2000个特征设置为True。基本上,你给它一个伪视图,几乎没有它知道的信息或它可以做任何事情。对于那个向量,很难说它会预测什么。

特征向量应该健康地填充向量向前倾斜的向量,以便输出pos。也许看一下信息最丰富,比方说500个功能,看看哪些是积极的,然后创建一个只有那些?这可能会让你更接近pos,但不一定。

train_set中的某些要素向量归类为pos。 (有趣的是,我发现其中一个有417个特征等于True)。但是,在我的测试中,来自negpos训练集分区的文档没有归类为pos的分区,所以尽管分类器看起来并不是很好工作 - 至少pos培训示例应归类为pos - 您提供的示例并不是一个很好的衡量标准。

答案 1 :(得分:0)

天真的贝叶斯分类器至少有两种不同的风格。在快速搜索中,似乎NLTK实现了伯努利风格:Different results between the Bernoulli Naive Bayes in NLTK and in scikit-learn。在任何情况下,一些天真的贝叶斯都会注意文档中缺少的单词/特征和可见单词一样多。因此,如果您尝试对包含少量正面词语的文档进行分类,但该文档在缺少时也缺少许多表示否定文档的单词,则将该文档归类为否定是非常合理的。因此,最重要的是,不仅要注意可见特征,还要注意缺少的特征(取决于朴素贝叶斯实现的细节)。