使用python进行sentiwordnet评分

时间:2016-07-08 09:16:54

标签: python nltk senti-wordnet

我一直致力于与Twitter情绪分析相关的研究。我对如何在Python上编码有一点了解。由于我的研究与编码有关,我已经做了一些关于如何使用Python分析情绪的研究,以下是我走了多远: 1.推文的宣传 2.令牌的POS标记 剩下的就是计算我现在面临的问题的正面和负面,需要你的帮助。

以下是我的代码示例:

import nltk
sentence = "Iphone6 camera is awesome for low light "
token = nltk.word_tokenize(sentence)
tagged = nltk.pos_tag(token)

因此,我想问一下是否有人可以帮我展示/指导使用python编写关于sentiwordnet的代码来计算已经被POS标记的tweeets的正负分数。提前谢谢

3 个答案:

答案 0 :(得分:13)

关于你的问题究竟是什么,有点不清楚。您需要使用Sentiwordnet的指南吗?如果是这样,请查看此链接,

http://www.nltk.org/howto/sentiwordnet.html

由于您已经对其进行了标记化和POS标记,因此您现在需要做的只是使用此语法,

swn.senti_synset('breakdown.n.03')

打破论点,

  • '击穿' =你需要得分的单词。
  • ' N' =词性
  • ' 03' =用法(01表示最常见的用法,较高的数字表示较少的常用用法)

因此,对于标记数组中的每个元组,如上所述创建一个字符串并将其传递给senti_synset函数,以获得该单词的正,负和客观分数。

警告:POS标记器为您提供的标签与senti_synset接受的标签不同。使用以下命令转换为synset表示法。

n - NOUN 
v - VERB 
a - ADJECTIVE 
s - ADJECTIVE SATELLITE 
r - ADVERB 

(上述表示法的Using Sentiwordnet 3.0的积分)

话虽如此,使用Sentiwordnet进行Twitter情绪分析通常不是一个好主意,这就是原因,

推文中充满了拼音和非词典词,Sentiwordnet经常无法识别。要解决这个问题,可以在发布标记之前对推文进行词形变换,或者使用机器学习分类器,例如NLTK内置函数的Naive Bayes。对于分类器的训练数据集,可以手动注释数据集,也可以使用预先标记的集合,例如,作为Sentiment140语料库。

如果您对实际执行情绪分析不感兴趣但需要针对给定推文的情感标记,则可以始终使用Sentiment140 API来实现此目的。

答案 1 :(得分:1)

@Saravana Kumar有一个很好的答案。

要向其中添加详细代码,我正在编写此代码。 我已引用链接https://nlpforhackers.io/sentiment-analysis-intro/

from nltk.corpus import wordnet as wn
from nltk.corpus import sentiwordnet as swn
from nltk.stem import PorterStemmer

def penn_to_wn(tag):
"""
Convert between the PennTreebank tags to simple Wordnet tags
"""
if tag.startswith('J'):
    return wn.ADJ
elif tag.startswith('N'):
    return wn.NOUN
elif tag.startswith('R'):
    return wn.ADV
elif tag.startswith('V'):
    return wn.VERB
return None

from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()

def get_sentiment(word,tag):
""" returns list of pos neg and objective score. But returns empty list if not present in senti wordnet. """


wn_tag = penn_to_wn(tag)
if wn_tag not in (wn.NOUN, wn.ADJ, wn.ADV):
    return []

lemma = lemmatizer.lemmatize(word, pos=wn_tag)
if not lemma:
    return []

synsets = wn.synsets(word, pos=wn_tag)
if not synsets:
    return []

# Take the first sense, the most common
synset = synsets[0]
swn_synset = swn.senti_synset(synset.name())

return [swn_synset.pos_score(),swn_synset.neg_score(),swn_synset.obj_score()]


ps = PorterStemmer()
words_data = ['this','movie','is','wonderful']
words_data = [ps.stem(x) for x in words_data]

pos_val = nltk.pos_tag(words_data)
senti_val=[ get_sentiment(x,y) for (x,y) in pos_val]

答案 2 :(得分:-1)

对于积极和消极的情绪,首先你需要进行培训并且必须训练模型。对于训练模型,您可以使用SVM,他们可以使用名为LibSVM的开放库。