2011-03-09 6 views
2

나는 Python에서 NLTK를 사용하여 스팸 필터를 만들고 있습니다. 이제 단어의 출현을 확인하고 NaiveBayesClassifier를 사용하여 정확도는 .98, F 측정 값은 .92, 비 스팸의 경우 : 0.98입니다. 그러나 내 프로그램 오류로 인해 스팸이 아닌 것으로 분류 된 많은 스팸이 매우 짧은 메시지 인 문서를 확인할 때.NLTK Python의 Naive Bayes 분류 자에서 문서 길이 사용

그래서 문서의 길이를 NaiveBayesClassifier의 기능으로 지정하고 싶습니다. 문제는 이제 이진 값만 처리한다는 것입니다. 예를 들어, 다음과 같이 할 수있는 다른 방법이 있습니까? 길이 < 100 = true/false?

답변

3

Naive Bayes의 NLTK 구현은 그렇게하지 않지만 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에서 구현되지 (추신 나는 http://nltk.googlecode.com/svn/trunk/doc/book/ch06.html 예와 유사 스팸 검출기를 구축해야). NLTK NaiveBayesClassifier의 경우 바이너리 기능으로 몇 가지 다른 길이 임계 값을 사용할 수 있습니다. 또한 Maxent Classifier를 사용하여 작은 텍스트를 처리하는 방법을 확인하는 것이 좋습니다.

+0

팁 주셔서 감사합니다! – Javaaaa