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
)。然而,在我的测试中,没有来自neg
或pos
训练集分区的文档归类为pos
,所以虽然你可能是对的,分类器似乎做得不好——至少@ 987654329@ 训练示例应归类为pos
- 您给出的示例并不是一个很好的衡量标准。
【讨论】:
以上是关于Python nltk朴素贝叶斯似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章