scikit-learn có an implementation of multinomial naive Bayes, là biến thể phù hợp của Bay ngây thơ trong tình huống này. Tuy nhiên, một máy vectơ hỗ trợ (SVM) có thể hoạt động tốt hơn.
Như Ken đã chỉ ra trong các ý kiến, NLTK có a nice wrapper for scikit-learn classifiers. Sửa đổi từ các tài liệu, đây là một phần hơi phức tạp mà không TF-IDF trọng, chọn 1000 tính năng tốt nhất dựa trên thống kê chi2, và sau đó vượt qua đó vào một phân loại đa dạng Bayes ngây thơ. (. Tôi đặt cược này có phần vụng về, như tôi không phải siêu quen thuộc với một trong hai NLTK hoặc scikit-học)
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())
này in cho tôi:
Confusion matrix:
524 376
202 698
Không hoàn hảo, nhưng đàng hoàng, xem xét nó không phải là một vấn đề siêu dễ dàng và nó chỉ được đào tạo trên 100/100.
Thực ra, anh ấy có thể muốn các mô hình Máy Vector hỗ trợ tìm hiểu. NLTK có một trình bao bọc đẹp 'nltk.classify.scikitlearn.SklearnClassifier' làm cho các trình phân loại này phù hợp với API của nó. –
@KenBloom Vâng, SVM có lẽ sẽ tốt hơn, nhưng anh ấy đã hỏi cụ thể về Bayes ngây thơ.:) Đó là wrapper là tốt đẹp, và tôi chỉ nhận ra rằng đó cũng là một vịnh ngây thơ đa thức trong scikit-học, vì vậy tôi sẽ thay đổi câu trả lời của tôi để sử dụng đó. – Dougal
trông rất đơn giản. Tôi ước tôi đã học được python khi tôi đang làm bằng tiến sĩ của tôi trong này. Tôi đã làm rất nhiều công việc phân loại gói trong Ruby mà có thể hoàn toàn không cần thiết. –