NLTK情感分析只返回一个值

3 投票
1 回答
1904 浏览
提问于 2025-04-17 17:16

我真的不想发一个关于整段代码的问题,但我已经花了三个小时在这个上面,还是搞不明白发生了什么。我从一个CSV文件中提取了大约600条推文,这些推文的评分值各不相同(范围在-2到2之间),反映了人们对一位总统候选人的情感。

可是,当我用这个训练样本去处理其他数据时,结果只返回了一个值(正面)。我检查过评分是否正确添加了,确实是的。可是我就是搞不懂,为什么85000条推文在一个多样化的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 = ""

1 个回答

2

朴素贝叶斯分类器通常在评估文档中出现的单词时效果最好,它会忽略那些没有出现的单词。因为你使用了

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

所以每个文档大部分是由值为 False 的特征来表示的。

你可以尝试用这样的方式:

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

(你可能还应该把 for 循环换成更高效的方法,不要遍历所有单词,而是只遍历文档中出现的单词)。

撰写回答