Python NLTK情绪分析仅返回一个值

Python NLTK情绪分析仅返回一个值,python,twitter,nltk,sentiment-analysis,Python,Twitter,Nltk,Sentiment Analysis,我真的不想就一整段代码发问,但我已经为此工作了3个小时了,我无法理解到底发生了什么。我从一个CSV文件中检索到了大约600条推文,这些推文的分值不同(介于-2到2之间),反映了我对总统候选人的感情 但是,当我在任何其他数据上运行此训练样本时,只返回一个值(正值)。我已经检查了分数是否被正确添加,并且它们是正确的。在我看来,从600个不同的培训集中,85000条推文都被评为“积极”是没有意义的。有人知道这里发生了什么吗?谢谢 import nltk import csv tweets = []

我真的不想就一整段代码发问,但我已经为此工作了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 = ""
导入nltk
导入csv
tweets=[]
导入ast
以open('romney.csv','rb')作为csvfile:
mycsv=csv.reader(csvfile)
对于mycsv中的行:
tweet=行[1]
尝试:
分数=ast.literal\u eval(第[12]行)
如果得分>0:
打印分数
打印推文
追加((tweet,“肯定”))
elif评分<0:
打印分数
打印推文
追加((tweet,“否定”))
除值错误外:
tweet=“”
def获取推文中的文字(推文):
所有单词=[]
对于推文中的(文字、情感):
所有单词。扩展(单词)
返回所有单词
def get_word_功能(单词列表):
wordlist=nltk.FreqDist(单词列表)
word\u features=wordlist.keys()
返回单词或特征
def提取功能(文档):
文档\单词=集合(文档)
特征={}
对于word中的word功能:
功能['contains(%s)'%word]=(文档中的word\u words)
返回特性
word\u features=get\u word\u features(在tweets(tweets)中获取单词)
training_set=nltk.classify.apply_功能(提取功能、推文)
分类器=nltk.NaiveBayesClassifier.train(训练集)
c=0
将open('usa.csv',“rU”)作为csvfile:
mycsv=csv.reader(csvfile)
对于mycsv中的行:
尝试:
tweet=行[0]
c=c+1
打印分类器。分类(提取特征(tweet.split())
除索引器外:
tweet=“”

朴素贝叶斯分类器通常在评估文档中出现的单词时效果最好,忽略单词的缺失。既然你用

features['contains(%s)' % word] = (word in document_words)
每个文档主要由值为False的功能表示

尝试以下方法:

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

(您可能还应该更改for循环,使其比遍历词典中的所有单词更有效,而不是遍历文档中出现的单词)

extract\u features
中的
document
参数的类型是什么?同样,对此也不是100%确定,但根据NLTK文档,feature dict中功能的适当关键字名称是
包含单词(%s)
,而不是
包含(%s)
“朴素贝叶斯分类器通常在以下情况下工作得最好…”那是一句有趣的话。你对此有任何定量或理论上的结果吗。甚至可以说是NBC吗?有很多方法可以将朴素贝叶斯分类器应用于文档分类。问题中使用的是一个多变量伯努利事件模型(使用二进制向量考虑单词的存在和不存在)。另一种常见的方法是通过文档中出现的一组单词来表示文档。这个叫做多项式事件模型。对于文本分类,多项式方法(仅考虑单词的存在)通常优于多变量方法。裁判: