NLTK情感分析只返回一个值

3

我真的很不想发一个有关整个代码块的问题,但是我已经在这上面工作了3个小时,而且我无法理解正在发生的事情。我从CSV文件中检索了大约600条推文,其得分值(介于-2到2之间)反映了对总统候选人的情感。

然而,当我在任何其他数据上运行此训练样本时,只返回一个值(积极的)。我已经检查过得分是否被正确添加,它们确实被正确添加了。对于来自600个不同来源的多元化训练集,85000条推文全部被评为“积极”,这对我来说毫无意义。有人知道这里发生了什么吗?谢谢!

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 = ""

extract_features函数中的document参数是什么类型? - Joel Cornett
此外,我不是100%确定,但根据NLTK文档,特征字典中特征的适当键名为contains-word(%s),而不是contains(%s) - Joel Cornett
1个回答

2
朴素贝叶斯分类器通常在评估文档中出现的单词时效果最佳,忽略单词缺失。由于您使用了HTML标签,请注意保留格式。
features['contains(%s)' % word] = (word in document_words)

每个文档通常由值为False的特征表示。请尝试以下内容:
if word in document_words:
   features['contains(%s)' % word] = True

你可能需要将for循环更改为比在词典中循环所有单词更有效的东西,而是在文档中出现的单词上进行循环。


“朴素贝叶斯分类器通常在以下情况下表现最佳…” 这是一个有趣的评论。您是否有任何定量或理论结果?甚至可以说这是朴素贝叶斯分类器吗? - Finn Årup Nielsen
应用朴素贝叶斯分类器进行文档分类的方法有很多种。题目中使用的是多变量Bernoulli事件模型,其中使用二元向量来考虑单词的缺失和存在情况。另一个常见的方法是通过文档中单词出现的集合来表示文档,这个方法被称为多项式事件模型。在文本分类中,通常只考虑单词的存在时,多项式方法要比多变量方法表现更好。参考来源:http://www.kamalnigam.com/papers/multinomial-aaaiws98.pdf - Pascal Soucy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接