NLTKのNaive Bayesの実装はそうしませんが、NaiveBayesClassifierの予測とドキュメントの長さの分布を組み合わせることができます。 NLTKのprob_classifyメソッドは、文書中の単語、すなわちP(cl | doc)を与えられたクラスに対する条件付確率分布を与えます。あなたが望むのは、P(cl | doc、len)です - ドキュメントの単語とその長さを与えられたクラスの確率。我々はさらにいくつかの独立性の仮定を行う場合は、我々が得る:
P(cl|doc,len) = (P(doc,len|cl) * P(cl))/P(doc,len)
= (P(doc|cl) * P(len|cl) * P(cl))/(P(doc) * P(len))
= (P(doc|cl) * P(cl))/P(doc) * P(len|cl)/P(len)
= P(cl|doc) * P(len|cl)/P(len)
あなたはすでにこれを行うに残っているすべてはPを推定することで、prob_classifyからの最初の項を持っている(LEN | CL)とP(LEN) 。
ドキュメントの長さをモデリングする場合、あなたは好きなだけ好きになるかもしれませんが、ドキュメントの長さのログが正規分布していると仮定できます。各クラスと全体のログ文書の長さの平均と標準偏差を知っていれば、P(len | cl)とP(len)を簡単に計算できます。ここで
は、P(LEN)を推定ついて行くの一つの方法です:
from nltk.corpus import movie_reviews
from math import sqrt,log
import scipy
loglens = [log(len(movie_reviews.words(f))) for f in movie_reviews.fileids()]
sd = sqrt(scipy.var(loglens))
mu = scipy.mean(loglens)
p = scipy.stats.norm(mu,sd)
覚えておくべき唯一のトリッキーな事は、これは、ログの長さではなく、長さ以上の分布であり、それは連続的な分布だということです。だから、長さLの文書の確率は次のようになります。
p.cdf(log(L+1)) - p.cdf(log(L))
条件付き長分布は、各クラスの文書のログ長さを使用して、同じ方法で推定することができます。それはP(cl | doc、len)に必要なものを与えるはずです。
あなたのヒントありがとう! – Javaaaa