私は基本的にこの男と同じ質問をします..ナイーブベイズ分類器のNLTKブックの例では、単語がドキュメント内で特徴として出現するかどうかのみを考慮します..単語の頻度を特徴として考慮しません("bag-of-words")を見てください。
答えの1つは、組み込みのNLTK分類器ではこれを実行できないことを示唆しているようです。そうですか?NLTKを使用して頻度/単語の袋のNB分類を行うにはどうすればよいですか?
私は基本的にこの男と同じ質問をします..ナイーブベイズ分類器のNLTKブックの例では、単語がドキュメント内で特徴として出現するかどうかのみを考慮します..単語の頻度を特徴として考慮しません("bag-of-words")を見てください。
答えの1つは、組み込みのNLTK分類器ではこれを実行できないことを示唆しているようです。そうですか?NLTKを使用して頻度/単語の袋のNB分類を行うにはどうすればよいですか?
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でのみトレーニングされていることを考えると、まともです。
NLTKベイ分類器の機能は「名目」であり、数値ではありません。これは、有限数の離散値(ラベル)を取得できることを意味しますが、頻度として扱うことはできません。
したがって、ベイズ分類子では、単語の頻度を機能として直接使用することはできません。各テキストからより頻繁に使用される50の単語を機能セットとして使用するようなことはできますが、それはまったく異なります。
しかし、NLTKには、頻度に依存する他の分類子があるかもしれません。わかりませんが、見たことがありますか?チェックする価値があると思います。
文に同じ単語が複数回含まれている場合は、問題が複数回追加されるだけです。単語が同じクラスに複数回出現する場合、トレーニングデータはそれを単語数に反映する必要があります。
精度を高めるには、すべてのバイグラム、トライグラムなどを個別の機能としてカウントします。
何が起こっているのか、正確さを損なうために何をする必要があるのかを正確に理解できるように、独自の分類子を手動で作成すると便利です。あらかじめパッケージ化されたソリューションを使用していて、それが十分に機能しない場合、それについてできることはあまりありません。