2011-03-09 18 views
2

私はPythonでNLTKを使用してスパムフィルタを構築しています。私は単語の出現を確認し、NaiveBayesClassifierを使用して精度は.98、F measureは.92、非スパムは0.98です。しかし、私のプログラムのエラーが私が気づいた文書をチェックすると、スパム以外のものとして分類されている多くのメッセージは非常に短いメッセージになります。NLTK PythonのNaive Bayesクラシファイアでのドキュメント長の使用

したがって、ドキュメントの長さをNaiveBayesClassifierのフィーチャーにしたいと考えています。問題は現在、バイナリ値のみを扱うことです。たとえば、以下のようにする以外の方法がありますか?長さ< 100 = true/false?

(私はhttp://nltk.googlecode.com/svn/trunk/doc/book/ch06.html例に類似したスパムの検出器を構築する必要がありP.S.)

答えて

3

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)に必要なものを与えるはずです。

3

あり範囲の値を扱うことができる多項NaiveBayesアルゴリズムがありますが、NLTKで実装されていません。 NLTK NaiveBayesClassifierの場合、バイナリ機能としていくつかの異なる長さのしきい値を試すことができます。また、Maxentクラシファイアで小さなテキストをどのように処理するかを見てみることをお勧めします。

+0

あなたのヒントありがとう! – Javaaaa

関連する問題