Python nltk朴素贝叶斯似乎不起作用

Posted

技术标签:

【中文标题】Python nltk朴素贝叶斯似乎不起作用【英文标题】:Python nltk Naive Bayes doesn't seem to work 【发布时间】:2013-12-13 22:35:18 【问题描述】:

我正在使用 nltk 书 - Natural Language Processing with Python (2009) 并查看朴素贝叶斯分类器。特别是我的版本中第 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

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

特征向量应该健康地填充有向正方向倾斜的向量,以便输出pos。也许看看信息量最大的,比如 500 个特征,看看哪些是积极的,然后创建一个只有这些的字符串?这可能会让您更接近pos,但不一定。

train_set 中的一些特征向量归类为pos。 (有趣的是,我发现其中一个有 417 个特征等于True)。然而,在我的测试中,没有来自negpos 训练集分区的文档归类为pos,所以虽然你可能是对的,分类器似乎做得不好——至少@ 987654329@ 训练示例应归类为pos - 您给出的示例并不是一个很好的衡量标准。

【讨论】:

以上是关于Python nltk朴素贝叶斯似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

python nltk 朴素贝叶斯概率

NLTK 朴素贝叶斯分类错误

使用 NLTK 的半监督朴素贝叶斯 [关闭]

NLTK,朴素贝叶斯:为啥有些特征没有?

将朴素贝叶斯分类器保存在内存中

朴素贝叶斯的 nltk 词干和停用词