24

我基本上和这个人有同样的问题.. Naive Bayes 分类器的 NLTK 书中的示例只考虑一个单词是否出现在文档中作为一个特征.. 它没有考虑单词的频率作为特征看看(“词袋”)。

答案之一似乎表明使用内置的 NLTK 分类器无法做到这一点。是这样吗?如何使用 NLTK 进行频率/词袋 NB 分类?

4

3 回答 3

32

scikit-learn一个多项式朴素贝叶斯的实现,这是在这种情况下朴素贝叶斯的正确变体。不过,支持向量机 (SVM) 可能会更好。

正如 Ken 在评论中指出的那样,NLTK 有一个很好的 scikit-learn 分类器包装器。根据文档修改,这里有一个有点复杂的,它进行 TF-IDF 加权,根据 chi2 统计选择 1000 个最佳特征,然后将其传递给多项式朴素贝叶斯分类器。(我打赌这有点笨拙,因为我对 NLTK 或 scikit-learn 都不太熟悉。)

import numpy as np
from nltk.probability import FreqDist
from nltk.classify import SklearnClassifier
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_selection import SelectKBest, chi2
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import Pipeline

pipeline = Pipeline([('tfidf', TfidfTransformer()),
                     ('chi2', SelectKBest(chi2, k=1000)),
                     ('nb', MultinomialNB())])
classif = SklearnClassifier(pipeline)

from nltk.corpus import movie_reviews
pos = [FreqDist(movie_reviews.words(i)) for i in movie_reviews.fileids('pos')]
neg = [FreqDist(movie_reviews.words(i)) for i in movie_reviews.fileids('neg')]
add_label = lambda lst, lab: [(x, lab) for x in lst]
classif.train(add_label(pos[:100], 'pos') + add_label(neg[:100], 'neg'))

l_pos = np.array(classif.classify_many(pos[100:]))
l_neg = np.array(classif.classify_many(neg[100:]))
print "Confusion matrix:\n%d\t%d\n%d\t%d" % (
          (l_pos == 'pos').sum(), (l_pos == 'neg').sum(),
          (l_neg == 'pos').sum(), (l_neg == 'neg').sum())

这是为我打印的:

Confusion matrix:
524     376
202     698

不完美,但体面,考虑到这不是一个超级简单的问题,而且它只接受了 100/100 的训练。

于 2012-04-11T02:00:03.157 回答
7

NLTK 贝叶斯分类器中的特征是“名义的”,而不是数字的。这意味着它们可以采用有限数量的离散值(标签),但不能将它们视为频率。

所以使用贝叶斯分类器,你不能直接使用词频作为特征——你可以做一些事情,比如使用每个文本中 50 个更频繁的词作为特征集,但这是完全不同的事情

但也许 NLTK 中还有其他依赖于频率的分类器。我不知道,但你看过吗?我会说值得一试。

于 2012-04-11T01:26:19.837 回答
3
  • 将您正在查看的字符串放入列表中,分成单词
  • 对于列表中的每个项目,询问:这个项目是我的功能列表中的一个功能吗?
  • 如果是,则正常添加日志概率,如果不是,则忽略它。

如果您的句子多次使用相同的单词,它只会多次添加概率。如果单词在同一个类中出现多次,您的训练数据应该反映在字数中。

为了提高准确性,将所有二元组、三元组等视为单独的特征。

它有助于手动编写您自己的分类器,以便您准确了解正在发生的事情以及您需要做些什么来提高准确性。如果您使用预打包的解决方案并且效果不佳,那么您无能为力。

于 2014-03-10T14:43:49.917 回答