2013-02-27 54 views
2

我真的很討厭發佈一個關於整個代碼塊的問題,但我一直在這個過去3個小時的工作,我不能包裹我的頭周圍發生的事情。我從具有不同得分值(-2到2)的CSV文件中檢索大約600條推文,反映了對總統候選人的情緒。NLTK情緒分析只返回一個值

但是,當我在任何其他數據上運行此訓練樣本時,只返回一個值(正數)。我檢查了分數是否正確添加,他們是。對於我來說,85,000條推文全部被評爲「積極」,從600多種培訓套餐中獲得的評價是沒有意義的。有人知道這裏發生了什麼嗎?謝謝!

import nltk 
import csv 

tweets = [] 
import ast 
with open('romney.csv', 'rb') as csvfile: 
    mycsv = csv.reader(csvfile) 
    for row in mycsv: 
     tweet = row[1] 
     try: 
      score = ast.literal_eval(row[12]) 
      if score > 0: 
       print score 
       print tweet 
       tweets.append((tweet,"positive")) 

     elif score < 0: 
      print score 
      print tweet 
      tweets.append((tweet,"negative")) 
    except ValueError: 
     tweet = "" 

def get_words_in_tweets(tweets): 
    all_words = [] 
    for (words, sentiment) in tweets: 
     all_words.extend(words) 
    return all_words 

def get_word_features(wordlist): 
    wordlist = nltk.FreqDist(wordlist) 
    word_features = wordlist.keys() 
    return word_features 

def extract_features(document): 
    document_words = set(document) 
    features = {} 
    for word in word_features: 
    features['contains(%s)' % word] = (word in document_words) 
    return features 

word_features = get_word_features(get_words_in_tweets(tweets)) 
training_set = nltk.classify.apply_features(extract_features, tweets) 
classifier = nltk.NaiveBayesClassifier.train(training_set) 
c = 0 
with open('usa.csv', "rU") as csvfile: 
    mycsv = csv.reader(csvfile) 
    for row in mycsv: 
     try: 
      tweet = row[0] 
      c = c + 1 
        print classifier.classify(extract_features(tweet.split()))                                              
     except IndexError: 
      tweet = "" 
+0

'extract_features'中的'document'參數的類型是什麼? – 2013-02-27 08:09:25

+0

此外,對此不是100%肯定的,但根據NLTK文檔,特徵詞典中的特徵的適當鍵名是'contains-word(%s)',而不是'contains(%s)'。 – 2013-02-27 08:18:54

回答

2

樸素貝葉斯分類器通常在評估出現在文檔中的單詞時忽略沒有單詞的情況下效果最好。由於您使用的是

features['contains(%s)' % word] = (word in document_words) 

每個文檔主要由value = False的要素表示。

嘗試,而不是像這樣:

if word in document_words: 
    features['contains(%s)' % word] = True 

(你應該也改變循環的東西比遍歷所有詞語的詞彙,而不是循環在文檔中出現的單詞更有效)。

+0

「樸素貝葉斯分類器通常最適合...」這是一個有趣的評論。你對此有任何定量或理論結果。它甚至可以說是NBC嗎? – 2015-09-09 12:29:52

+0

有很多方法可以將樸素貝葉斯分類器應用於文檔分類。問題中使用的一個(使用二元向量考慮單詞的缺席和存在)是一個多變量的伯努利事件模型。另一種常用的方法是通過文檔中出現的一組詞出現文檔。這個被稱爲多項事件模型。對於文本分類,多項式方法(僅考慮詞的存在)通常優於多變量方法。參考:http://www.kamalnigam.com/papers/multinomial-aaaiws98.pdf – 2016-01-28 21:29:17