2012-12-22 72 views
5

我新來python,需要幫助! 我正在練習python NLTK文本分類。 下面是代碼示例我在練上 http://www.laurentluce.com/posts/twitter-sentiment-analysis-using-python-and-nltk/n-grams與樸素貝葉斯分類器

我用盡這一

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

爲什麼你不使用'Weka',它是你的任務嗎? –

+0

此代碼適用於雙格 –

回答

11

雙特徵向量遵循與單特徵向量完全相同的原則。所以,就像你提到的教程,你將不得不檢查你將使用的任何文檔中是否存在bigram特性。 至於tworam功能,以及如何提取它們,我已經寫了下面的代碼。您可以簡單地採用它們來更改教程中的變量「tweets」。

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

而不是打印它們,你可以簡單地將它們附加到「tweets」列表,你很好去!我希望這會有所幫助。否則,讓我知道你是否仍然有問題。 請注意,在情感分析等應用程序中,一些研究人員傾向於標記化單詞並刪除標點符號,而另一些則不會。從經驗中我知道,如果不刪除標點符號,樸素貝葉斯的工作原理幾乎相同,但是支持向量機的準確率會降低。你可能需要玩這個東西,並決定什麼更適合你的數據集。編輯1:有一本名爲「Python的自然語言處理」的書,我可以推薦給你。它包含了bigrams的例子以及一些練習。但是,我認爲你甚至可以在沒有它的情況下解決這個問題。選擇bigrams作爲一個特徵的想法是,我們想知道A字會出現在我們的語料庫中,然後是B字的概率。因此,例如在「我駕駛卡車」這個句子中,單字特徵一詞應該是那些4字的單詞bigram的特點是:[我開着車,開着一輛卡車]。現在你想使用這3個功能。所以下面的代碼函數將一個字符串的所有字符串放在一個名爲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函數。作爲上述函數的輸出得到的是bigram特徵向量。你將會像處理你所提到的教程一樣處理單字符特徵向量。

+0

真的非常感謝您的建議!我會盡最大努力與它! – Aikin

+0

ahhhh不知道如何在Python中使用bigrams ...有沒有任何教程? – Aikin

+0

看看我上面的編輯。我想現在應該更清楚了! – user823743