scikit-learn ma an implementation of multinomial naive Bayes, który jest właściwym wariantem naiwnych Bayes w tej sytuacji. Maszyna do obsługi wektora nośnego (SVM) prawdopodobnie zapewne działałaby lepiej.
Jak zauważył Ken w komentarzach, NLTK ma a nice wrapper for scikit-learn classifiers. Zmodyfikowane z dokumentów, tutaj jest nieco skomplikowane, które dokonuje ważenia TF-IDF, wybiera 1000 najlepszych funkcji na podstawie statystyki chi2, a następnie przekazuje je do wielomianowego naiwnego klasyfikatora Bayesa. (. Założę się, to jest nieco niezdarny, jak nie jestem bardzo obeznany z obu NLTK lub 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())
Ten wydrukowany dla mnie:
Confusion matrix:
524 376
202 698
Nie idealne, ale przyzwoity, biorąc pod uwagę nie jest to bardzo łatwy problem i jest wyszkolony tylko na 100/100.
Właściwie to prawdopodobnie chce modeli maszyn obsługi wektorów nauczyć się scikit. NLTK ma ładny wrapper 'nltk.classify.scikitlearn.SklearnClassifier', który sprawia, że te klasyfikatory dobrze pasują do jego API. –
@KenBloom Tak, SVMs byłoby prawdopodobnie lepsze, ale specjalnie zapytał o naiwne Bayes.:) To opakowanie jest miłe, i właśnie zdałem sobie sprawę, że istnieje również wielomianowa naiwna Bayes w nauce scikita, więc zmienię odpowiedź, aby to wykorzystać. – Dougal
, który wygląda świetnie. Szkoda, że nie nauczyłem się Pythona, kiedy robiłem mój doktorat. w tym. Zrobiłem wiele zawinięć do pracy w Ruby, które byłyby zupełnie niepotrzebne. –