2012-12-22 8 views
5

के साथ एन-ग्राम पाइथन के लिए नया और मदद चाहिए! मैं अजगर एनएलटीके पाठ वर्गीकरण के साथ अभ्यास कर रहा था। यहाँ कोड उदाहरण मैं पर http://www.laurentluce.com/posts/twitter-sentiment-analysis-using-python-and-nltk/नाइव बेयस क्लासिफायरफायर

Ive अभ्यास कर रहा हूँ की कोशिश की यह एक

from nltk import bigrams 
from nltk.probability import ELEProbDist, FreqDist 
from nltk import NaiveBayesClassifier 
from collections import defaultdict 

train_samples = {} 

with file ('positive.txt', 'rt') as f: 
    for line in f.readlines(): 
     train_samples[line]='pos' 

with file ('negative.txt', 'rt') as d: 
    for line in d.readlines(): 
     train_samples[line]='neg' 

f=open("test.txt", "r") 
test_samples=f.readlines() 

def bigramReturner(text): 
    tweetString = text.lower() 
    bigramFeatureVector = {} 
    for item in bigrams(tweetString.split()): 
     bigramFeatureVector.append(' '.join(item)) 
    return bigramFeatureVector 

def get_labeled_features(samples): 
    word_freqs = {} 
    for text, label in train_samples.items(): 
     tokens = text.split() 
     for token in tokens: 
      if token not in word_freqs: 
       word_freqs[token] = {'pos': 0, 'neg': 0} 
      word_freqs[token][label] += 1 
    return word_freqs 


def get_label_probdist(labeled_features): 
    label_fd = FreqDist() 
    for item,counts in labeled_features.items(): 
     for label in ['neg','pos']: 
      if counts[label] > 0: 
       label_fd.inc(label) 
    label_probdist = ELEProbDist(label_fd) 
    return label_probdist 


def get_feature_probdist(labeled_features): 
    feature_freqdist = defaultdict(FreqDist) 
    feature_values = defaultdict(set) 
    num_samples = len(train_samples)/2 
    for token, counts in labeled_features.items(): 
     for label in ['neg','pos']: 
      feature_freqdist[label, token].inc(True, count=counts[label]) 
      feature_freqdist[label, token].inc(None, num_samples - counts[label]) 
      feature_values[token].add(None) 
      feature_values[token].add(True) 
    for item in feature_freqdist.items(): 
     print item[0],item[1] 
    feature_probdist = {} 
    for ((label, fname), freqdist) in feature_freqdist.items(): 
     probdist = ELEProbDist(freqdist, bins=len(feature_values[fname])) 
     feature_probdist[label,fname] = probdist 
    return feature_probdist 



labeled_features = get_labeled_features(train_samples) 

label_probdist = get_label_probdist(labeled_features) 

feature_probdist = get_feature_probdist(labeled_features) 

classifier = NaiveBayesClassifier(label_probdist, feature_probdist) 

for sample in test_samples: 
    print "%s | %s" % (sample, classifier.classify(bigramReturner(sample))) 

लेकिन यह त्रुटि मिल रही है, क्यों है?

Traceback (most recent call last): 
    File "C:\python\naive_test.py", line 76, in <module> 
    print "%s | %s" % (sample, classifier.classify(bigramReturner(sample))) 
    File "C:\python\naive_test.py", line 23, in bigramReturner 
    bigramFeatureVector.append(' '.join(item)) 
AttributeError: 'dict' object has no attribute 'append' 
+0

आप 'वीका' का उपयोग क्यों नहीं करते हैं, क्या यह आपका असाइनमेंट है? –

+0

यह कोड द्वि-ग्राम –

उत्तर

11

एक बिग्राम फीचर वेक्टर सटीक प्रधानाचार्यों को एक यूनिग्राम फीचर वेक्टर के रूप में पालन करता है। इसलिए, आपके द्वारा उल्लेखित ट्यूटोरियल की तरह आपको यह जांचना होगा कि आपके द्वारा उपयोग किए जाने वाले किसी भी दस्तावेज़ में कोई बड़ी सुविधा मौजूद है या नहीं। बिग्राम सुविधाओं और उन्हें निकालने के लिए, मैंने इसके लिए कोड लिखा है। आप उन्हें ट्यूटोरियल में परिवर्तनीय "ट्वीट्स" को बदलने के लिए बस उन्हें अपनाने के लिए कर सकते हैं।

import nltk 
text = "Hi, I want to get the bigram list of this string" 
for item in nltk.bigrams (text.split()): print ' '.join(item) 

उन्हें प्रिंट करने के बजाय आप उन्हें "ट्वीट्स" सूची में जोड़ सकते हैं और आप जाने के लिए अच्छे हैं! मुझे उम्मीद है कि यह काफी मददगार होगा। अन्यथा, अगर आपको अभी भी समस्याएं हैं तो मुझे बताएं। कृपया ध्यान दें कि भावनाओं के विश्लेषण जैसे अनुप्रयोगों में कुछ शोधकर्ता शब्दों को टोकननाइज़ करते हैं और विराम चिह्न को हटाते हैं और कुछ अन्य नहीं करते हैं। प्रयोगकर्ता से मुझे पता है कि यदि आप विराम चिह्नों को नहीं हटाते हैं, तो बेवकूफ बेय लगभग समान काम करते हैं, हालांकि एक एसवीएम में कमी की सटीकता दर होगी। आपको इस सामान के साथ खेलना पड़ सकता है और यह तय कर सकता है कि आपके डेटासेट पर क्या बेहतर काम करता है। संपादित 1: "पाइथन के साथ प्राकृतिक भाषा प्रसंस्करण" नामक एक पुस्तक है जिसे मैं आपको अनुशंसा कर सकता हूं। इसमें बिग्राम के साथ-साथ कुछ अभ्यास शामिल हैं। हालांकि, मुझे लगता है कि आप इसके बिना इस मामले को भी हल कर सकते हैं। Bigrams को चुनने के पीछे विचार यह है कि हम संभावना को जानना चाहते हैं कि शब्द ए हमारे कॉर्पस में बी शब्द के बाद दिखाई देगा। उदाहरण के लिए, "मैं एक ट्रक चलाता हूं" शब्द में यूनिग्राम विशेषताएं प्रत्येक उन 4 शब्द जबकि बिग्राम फीचर्स शब्द होंगे: [मैं ड्राइव करता हूं, ड्राइव करता हूं, एक ट्रक]। अब आप उन 3 का उपयोग अपनी सुविधाओं के रूप में करना चाहते हैं। तो कोड फ़ंक्शन bellow bigramFeatureVector नाम की एक सूची में एक स्ट्रिंग के सभी bigrams डालता है।

def bigramReturner (tweetString): 
    tweetString = tweetString.lower() 
    tweetString = removePunctuation (tweetString) 
    bigramFeatureVector = [] 
    for item in nltk.bigrams(tweetString.split()): 
     bigramFeatureVector.append(' '.join(item)) 
    return bigramFeatureVector 

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

+0

के लिए है वास्तव में आपकी सलाह के लिए धन्यवाद! मैं इसके साथ सबसे अच्छा प्रयास करेंगे! – Aikin

+0

आह नहीं समझते कि पायथन में बिग्राम का उपयोग कैसे करें ... क्या कोई ट्यूटोरियल है? – Aikin

+0

उपरोक्त मेरा संपादन देखें। मुझे लगता है कि यह अब स्पष्ट होना चाहिए! – user823743

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