2012-12-22 11 views
5

Python'a yeni kayıt oldum ve yardıma ihtiyacım var! python NLTK metin sınıflandırması ile çalışıyordum. İşte ben bu tekNaif Bayes sınıflandırıcı ile n-gram

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))) 

ama, neden bu hatayı almaya çalıştı http://www.laurentluce.com/posts/twitter-sentiment-analysis-using-python-and-nltk/

Ive üzerinde pratik yapıyorum kod örneği nedir?

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

Neden Weka'yu kullanmıyorsunuz, Ödeviniz mi? –

+0

Bu kod biberi –

cevap

11

Bir bigram özellik vektörü, bir unigram özellik vektörüyle tam olarak aynı ilkeleri izler. Yani, bahsettiğiniz öğretici gibi, kullanacağınız belgelerin herhangi birinde bir bigram özelliğinin olup olmadığını kontrol etmeniz gerekecektir. Baca özelliklerine ve bunların nasıl çıkarılacağına ilişkin olarak, bunun için kodun belgesini yazdım. Eğiticideki "tweets" değişkenini değiştirmek için bunları kolayca kullanabilirsiniz.

Bunları yazdırmak yerine, bunları "tweet" listesine eklemeniz yeterlidir. Umarım bu yeterli olur. Aksi halde, hala sorun yaşıyorsanız bildirin. Duygu analizi gibi uygulamalarda, bazı araştırmacıların kelimeleri belirtme ve noktalama işaretlerini kaldırma eğiliminde olduklarını ve bazılarının da yapmadığını unutmayın. Deneyimden, noktalama işaretleri çıkarmazsanız, Naif koyların hemen hemen aynı olduğunu, ancak bir SVM'nin azaltılmış doğruluk oranına sahip olacağını biliyorum. Bu şeylerle oynamak ve veri kümenizde nelerin daha iyi olduğuna karar vermeniz gerekebilir. Edit1: Size önerebileceğim "Python ile doğal dil işleme" adlı bir kitap var. Bazı egzersizlerin yanı sıra bigram örnekleri içerir. Ancak, bu davayı bile onsuz çözebileceğinizi düşünüyorum. Bir bigramın özelliklerin seçilmesinin ardındaki fikir, A kelimesinin B kelimesinin ardından B harfinin çıkması olasılığını bilmek istememizdir. Yani, örneğin, "Bir kamyon sürüyorum" cümlesiyle, unigram özellikleri her birinin Bu 4 kelime bigram kelimesi iken: [Ben sürüyorum, bir kamyon sürüyorum]. Şimdi bu 3'ü özellikleriniz olarak kullanmak istiyorsunuz. Bu nedenle, kod işlevi, bir dizgenin tüm bigramlarını bigramFeatureVector adlı bir listeye yerleştirir.

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

Kendi removePunctuation işlevinizi yazmanız gerektiğini unutmayın. Yukarıdaki işlevin çıkışı olarak aldığınız şey, bigram özellik vektörüdür. Tam olarak unigram özellik vektörlerinin bahsettiğiniz derste ele alındığı gibi davranırsınız.

+0

için gerçekten tavsiyeleriniz için teşekkürler! Onunla en iyisini deneyeceğim! – Aikin

+0

ahhhh python'da bigramların nasıl kullanıldığını anlamıyor ... herhangi bir öğretici var mı? – Aikin

+0

Yukarıdaki düzenlemeye göz atın. Sanırım şimdi daha açık olmalı! – user823743

İlgili konular