我正在使用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
答案 0 :(得分:2)
请注意,该示例中的特征向量由“整个语料库中最常用的2000个单词”组成。因此,假设语料库是全面的,定期审查可能会有相当多的单词。 (在最新的Jackass电影和达拉斯买家俱乐部的实际评论中,我分别得到了26/2000和28/2000的功能。)
如果您只提供一个仅包含“奇妙花木兰”的评论,则生成的特征向量仅将2/2000个特征设置为True。基本上,你给它一个伪视图,几乎没有它知道的信息或它可以做任何事情。对于那个向量,很难说它会预测什么。
特征向量应该健康地填充向量向前倾斜的向量,以便输出pos
。也许看一下信息最丰富,比方说500个功能,看看哪些是积极的,然后创建一个只有那些?这可能会让你更接近pos
,但不一定。
train_set
中的某些要素向量归类为pos
。 (有趣的是,我发现其中一个有417个特征等于True
)。但是,在我的测试中,来自neg
或pos
训练集分区的文档没有归类为pos
的分区,所以尽管分类器看起来并不是很好工作 - 至少pos
培训示例应归类为pos
- 您提供的示例并不是一个很好的衡量标准。
答案 1 :(得分:0)
天真的贝叶斯分类器至少有两种不同的风格。在快速搜索中,似乎NLTK实现了伯努利风格:Different results between the Bernoulli Naive Bayes in NLTK and in scikit-learn。在任何情况下,一些天真的贝叶斯都会注意文档中缺少的单词/特征和可见单词一样多。因此,如果您尝试对包含少量正面词语的文档进行分类,但该文档在缺少时也缺少许多表示否定文档的单词,则将该文档归类为否定是非常合理的。因此,最重要的是,不仅要注意可见特征,还要注意缺少的特征(取决于朴素贝叶斯实现的细节)。