scikit-learn имеет an implementation of multinomial naive Bayes, что является правильным вариантом наивного Байеса в этой ситуации. Однако векторная машина поддержки (SVM) будет работать лучше.
Как отметил Кен в комментариях, NLTK имеет a nice wrapper for scikit-learn classifiers. Модифицированный из документов, вот несколько сложный, который делает TF-IDF-взвешивание, выбирает 1000 лучших функций, основанных на статистике chi2, а затем передает это в мультиномиальный наивный классификатор Байеса. (. Я держал пари, что это несколько неуклюже, так как я не очень знакомы ни с NLTK или scikit учиться)
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.
На самом деле, он, вероятно, хочет, чтобы scikit-learn поддерживали модели Vector Machine. NLTK имеет красивую оболочку 'nltk.classify.scikitlearn.SklearnClassifier', которая делает эти классификаторы хорошо вписаны в его API. –
@ KenBloom Да, SVM, вероятно, будет лучше, но он специально спросил о наивных байесах.:) Эта обертка хороша, и я просто понял, что есть также многомиллионный наивный Байес в scikit-learn, поэтому я изменю свой ответ, чтобы использовать это. – Dougal
эта выглядит блестяще простой. Мне жаль, что я не научился питону, когда занимался своим Ph.D. в этом. В Ruby я много работал с классификаторами упаковки, что было бы совершенно ненужным. –