在NLTK中实现单词袋Naive-Bayes分类器 [英] Implementing Bag-of-Words Naive-Bayes classifier in NLTK
问题描述
我基本上有与此人相同的问题..示例"仅考虑文档中是否出现单词作为特征. 词袋".
I basically have the same question as this guy.. The example in the NLTK book for the Naive Bayes classifier considers only whether a word occurs in a document as a feature.. it doesn't consider the frequency of the words as the feature to look at ("bag-of-words").
答案之一似乎表明,内置NLTK分类器无法做到这一点.是这样吗如何使用NLTK进行词频/词袋NB分类?
One of the answers seems to suggest this can't be done with the built in NLTK classifiers. Is that the case? How can I do frequency/bag-of-words NB classification with NLTK?
推荐答案
scikit-learn 具有多项式朴素贝叶斯的实现,它是朴素贝叶斯的正确变体在这种情况下.不过,支持向量机(SVM)可能会更好.
scikit-learn has an implementation of multinomial naive Bayes, which is the right variant of naive Bayes in this situation. A support vector machine (SVM) would probably work better, though.
正如Ken在评论中指出的那样,NLTK具有一个不错的选择scikit学习分类器的包装器.根据文档进行了修改,这是一个有点复杂的操作,它执行TF-IDF加权,根据chi2统计量选择1000个最佳功能,然后将其传递给多项式朴素的贝叶斯分类器. (我打赌这有点笨拙,因为我对NLTK或scikit-learn都不是很熟悉.)
As Ken pointed out in the comments, NLTK has a nice wrapper for scikit-learn classifiers. Modified from the docs, here's a somewhat complicated one that does TF-IDF weighting, chooses the 1000 best features based on a chi2 statistic, and then passes that into a multinomial naive Bayes classifier. (I bet this is somewhat clumsy, as I'm not super familiar with either NLTK or 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的训练,这不是一个完美的例子,但还算不错.
Not perfect, but decent, considering it's not a super easy problem and it's only trained on 100/100.
这篇关于在NLTK中实现单词袋Naive-Bayes分类器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!