在Python中使用nltk Sentiwordnet

4
我正在使用Python NLTK对Twitter数据进行情感分析。我需要一个包含积极和消极词汇极性的词典。我已经阅读了很多关于sentiwordnet的资料,但当我在我的项目中使用它时,它没有给出高效和快速的结果。我认为我没有正确地使用它。有人能告诉我正确的使用方法吗?以下是我迄今为止所做的步骤:
1. 对推文进行分词 2. 对标记进行POS标记 3. 将每个标记传递给sentinet
我正在使用nltk软件包进行分词和标记。下面是我的一部分代码:
import nltk
from nltk.stem import *
from nltk.corpus import sentiwordnet as swn

tokens=nltk.word_tokenize(row) #for tokenization, row is line of a file in which tweets are saved.
tagged=nltk.pos_tag(tokens) #for POSTagging

for i in range(0,len(tagged)):
     if 'NN' in tagged[i][1] and len(swn.senti_synsets(tagged[i][0],'n'))>0:
            pscore+=(list(swn.senti_synsets(tagged[i][0],'n'))[0]).pos_score() #positive score of a word
            nscore+=(list(swn.senti_synsets(tagged[i][0],'n'))[0]).neg_score()  #negative score of a word
    elif 'VB' in tagged[i][1] and len(swn.senti_synsets(tagged[i][0],'v'))>0:
           pscore+=(list(swn.senti_synsets(tagged[i][0],'v'))[0]).pos_score()
           nscore+=(list(swn.senti_synsets(tagged[i][0],'v'))[0]).neg_score()
    elif 'JJ' in tagged[i][1] and len(swn.senti_synsets(tagged[i][0],'a'))>0:
           pscore+=(list(swn.senti_synsets(tagged[i][0],'a'))[0]).pos_score()
           nscore+=(list(swn.senti_synsets(tagged[i][0],'a'))[0]).neg_score()
    elif 'RB' in tagged[i][1] and len(swn.senti_synsets(tagged[i][0],'r'))>0:
           pscore+=(list(swn.senti_synsets(tagged[i][0],'r'))[0]).pos_score()
           nscore+=(list(swn.senti_synsets(tagged[i][0],'r'))[0]).neg_score()

最后,我将计算有多少推文是积极的,有多少是消极的。 我错在哪里? 我应该如何使用它? 是否有其他类似且易于使用的词典?


我不完全理解你的问题是什么。速度? - b3000
不行。我有大约4000条推文。使用sentiwordnet,我只得到了10个积极和18个消极的推文,这显然不是正确的结果。当然速度也是一个问题,但主要问题是效率。我的代码中是否有任何错误? - jeny
2
SentiWordNet的覆盖范围比从推特获取的嘈杂输入要小,因此您必须对真实推文中的单词进行规范化以适应SentiWordNet,例如u're -> you + are等。 - alvas
好的。那么有没有办法用Python规范化这些单词?我的意思是,有没有任何库、包或外部字典可以使用?因为手动编写将非常困难。 - jeny
2个回答

4

0

计算情感

alist = [all_tokens_in_doc]

totalScore = 0

count_words_included = 0

for word in all_words_in_comment:

    synset_forms = list(swn.senti_synsets(word[0], word[1]))

    if not synset_forms:

        continue

    synset = synset_forms[0] 

    totalScore = totalScore + synset.pos_score() - synset.neg_score()

    count_words_included = count_words_included +1

final_dec = ''

if count_words_included == 0:

    final_dec = 'N/A'

elif totalScore == 0:

    final_dec = 'Neu'        

elif totalScore/count_words_included < 0:

    final_dec = 'Neg'

elif totalScore/count_words_included > 0:

    final_dec = 'Pos'

return final_dec

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