2012-04-11 12 views
23

में बैग-ऑफ-वर्ड्स नाइव-बेयस क्लासिफायरफायर लागू करना मूल रूप से same question as this guy है। example in the NLTK book बेवकूफ बेयस वर्गीकृत के लिए केवल यह मानता है कि दस्तावेज़ में एक शब्द के रूप में कोई शब्द होता है .. यह आवृत्ति पर विचार नहीं करता है इस शब्द को देखने के लिए शब्द ("बैग ऑफ द शब्द")।एनएलटीके

One of the answers ऐसा लगता है कि यह एनएलटीके क्लासिफायरों में निर्मित के साथ नहीं किया जा सकता है। क्या यह मामला है? एनएलटीके के साथ मैं आवृत्ति/बैग-ऑफ-एनबी वर्गीकरण कैसे कर सकता हूं?

उत्तर

31

scikit-learn में an implementation of multinomial naive Bayes है, जो इस स्थिति में बेवकूफ बेयस का सही संस्करण है। एक समर्थन वेक्टर मशीन (एसवीएम) शायद बेहतर काम करेगा, हालांकि।

जैसा कि केन ने टिप्पणियों में बताया, एनएलटीके में a nice wrapper for scikit-learn classifiers है। दस्तावेज़ों से संशोधित, यहां कुछ जटिल है जो टीएफ-आईडीएफ वेटिंग करता है, चीई 2 आंकड़े के आधार पर 1000 सर्वश्रेष्ठ सुविधाओं का चयन करता है, और उसके बाद इसे बहुराष्ट्रीय बेवकूफ बेयस वर्गीकृत में भेजता है। (। मुझे यकीन है यह कुछ हद तक अनाड़ी है, जैसा कि मैंने या तो NLTK या साथ सुपर परिचित नहीं हूँ scikit सीखने)

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 पर प्रशिक्षित है।

+1

दरअसल, वह शायद विज्ञान-सीखने वाले समर्थन वेक्टर मशीन मॉडल चाहता है। एनएलटीके में एक अच्छा रैपर 'nltk.classify.scikitlearn.SklearnClassifier' है जो इन क्लासिफायरों को अपने एपीआई में अच्छी तरह फिट करता है। –

+0

@ केनब्लूम हाँ, एसवीएम शायद बेहतर होगा, लेकिन उन्होंने विशेष रूप से बेवकूफ बेयस के बारे में पूछा था।:) वह रैपर अच्छा है, और मुझे अभी एहसास हुआ कि विज्ञान-सीखने में एक बहुआयामी बेवकूफ बेय भी है, इसलिए मैं इसका उपयोग करने के लिए अपना जवाब बदल दूंगा। – Dougal

+1

जो शानदार रूप से सरल दिखता है। काश मैं पाइथन सीखा था जब मैं अपना पीएचडी कर रहा था। इसमें। मैंने रूबी में बहुत से काम लपेटने वाले क्लासिफायरों को किया जो पूरी तरह से अनावश्यक थे। –

6

एनएलटीके बेयस क्लासिफायरफायर की विशेषताएं "नाममात्र" हैं, संख्यात्मक नहीं। इसका मतलब है कि वे अलग-अलग मूल्यों (लेबल) की सीमित संख्या ले सकते हैं, लेकिन इन्हें आवृत्तियों के रूप में नहीं माना जा सकता है।

Bayes वर्गीकारक साथ

तो, आप सीधे feature-- आप अपनी सुविधा सेट के रूप में प्रत्येक पाठ से 50 अधिक लगातार शब्दों का प्रयोग की तरह कुछ कर सकता है एक के रूप में उपयोग के लिए शब्द आवृत्ति, लेकिन यह काफी अलग बात

नहीं है सकते हैं

लेकिन शायद एनएलटीके में अन्य क्लासिफायर हैं जो आवृत्ति पर निर्भर करते हैं। मुझे नहीं पता, लेकिन क्या तुमने देखा? मैं कहूंगा कि यह जांचने लायक है।

3
  • एक सूची में स्ट्रिंग आप देख रहे हैं डाल दिया, पूछने शब्द
  • सूची में प्रत्येक आइटम के लिए
  • में टूट,: यह आइटम एक विशेषता मैं अपने सुविधा सूची में है।
  • यदि यह है, तो लॉग की जांच सामान्य के रूप में जोड़ें, यदि नहीं, तो इसे अनदेखा करें।

यदि आपकी वाक्य में एक ही शब्द एक ही शब्द है, तो यह केवल कई बार प्रोब जोड़ देगा। यदि शब्द एक ही कक्षा में कई बार प्रकट होता है, तो आपके प्रशिक्षण डेटा को प्रतिबिंबित करना चाहिए कि शब्द गणना में।

अतिरिक्त सटीकता के लिए, सभी बाय-ग्राम, त्रि-ग्राम इत्यादि को अलग-अलग सुविधाओं के रूप में गिनें।

यह मैन्युअल रूप से अपने स्वयं के वर्गीकरण लिखने में मदद करता है ताकि आप समझ सकें कि क्या हो रहा है और सटीकता को लागू करने के लिए आपको क्या करना है। यदि आप प्री-पैक किए गए समाधान का उपयोग करते हैं और यह काफी अच्छी तरह से काम नहीं करता है, तो आप इसके बारे में ज्यादा कुछ नहीं कर सकते हैं।

संबंधित मुद्दे