2012-12-22 26 views
5

Im新しいpythonには助けが必要です! 私はPythonのNLTKテキスト分類で練習していました。ここ が、私はこの1つn-gramとNaive Bayesクラシファイア

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

しかし、なぜこのエラーを取得してみました http://www.laurentluce.com/posts/twitter-sentiment-analysis-using-python-and-nltk/

アイブ氏に練習していたコードの例ですか?

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

なぜ「Weka」を使用しないのですか、あなたの割り当てですか? –

+0

このコードはバイグラム用です –

答えて

11

bigram特徴ベクトルは、ユニグラム特徴ベクトルとまったく同じ原理に従う。したがって、あなたが言及したチュートリアルのように、使用するドキュメントにbigram機能が存在するかどうかをチェックする必要があります。 バイグラムの特徴とそれをどのように抽出するかについては、私はそれのためにコードを書いています。このチュートリアルで変数「ツイート」を変更するためにそれらを採用するだけで済みます。

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

これらを印刷するのではなく、単に「つぶやき」リストに追加するだけでよいです。これが十分に役立つことを願っています。そうでない場合は、まだ問題がある場合は教えてください。 センチメント分析のようなアプリケーションでは、一部の研究者が単語をトークン化して句読点を削除する傾向があり、他の人はそうしないことに注意してください。あなたが句読点を削除しないと、Naive Bayesはほぼ同じように動作しますが、SVMの精度は低下することが経験からわかります。このようなもので遊んで、あなたのデータセットでうまくいくものを決める必要があるかもしれません。 Edit1:「Pythonでの自然言語処理」という本があります。私はあなたにそれをお勧めします。バイグラムの例といくつかの演習が含まれています。しかし、私はあなたがそれなしでこの事件を解決することさえできると思います。バイグラムを選択する背景にあるアイデアは、単語Aがコーパスの後ろに単語Bが続く確率を知りたいということです。たとえば、「私はトラックを運転します」という文章で、ユニグラムの単語はそれぞれこれらの4つの単語は、bigramの機能は、次のようになります。[私は運転する、運転する、トラック]。今度は、これらの3つをあなたの機能として使いたいと思っています。したがって、コード関数bellowは、bigramFeatureVectorという名前のリストに文字列のすべてのバイグラムを入れます。

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

独自のremovePunctuation関数を記述する必要があります。上記の関数の出力としてバイグラム特徴ベクトルが得られます。あなたは、あなたが言及したチュートリアルでunigram特徴ベクトルが扱われるのとまったく同じ方法で扱います。

+0

あなたのアドバイスに本当に感謝します!私はそれで最高のママを試してみましょう! – Aikin

+0

ahhhhはPythonでバイグラムを使う方法を理解していません...チュートリアルはありますか? – Aikin

+0

上記の私の編集をチェックしてください。私はそれが今よりはっきりしているはずだと思います! – user823743

関連する問題