用senticnet做简单的细粒度情感分析-36大数据
作者:邓旭东HIT
细粒度情感分析
说细粒度情感分析,先说传统的情感分析(即粗粒度分析)。
粗粒度情感分析只是简单的积极或消极情感的划分,并计算出情感的强度。但是情绪更细的维度层次,应该还可以对正负情绪进行划分。比如,积极情绪的期待、喜悦,负面情绪的愤怒、悲伤、害怕等,分析单位更小更精准。
senticnet库
Sentic API基于SenticNet4词典,可以对词语进行文本分析,得出每个词的语义和情感。这个库很有特点,
优点在于可以进行细粒度情感分析,这一点很多库是做不到的。
缺点是只是对每个词语进行分析,还无法做到句子层面的情感分析。
但是以这个库为基础,我们还是可以做很多事情的。
能对多少语言进行处理呢?
40种,本文就以英文en和中文cn为例讲解。
一、官方示例
from senticnet.senticnet import Senticnet #初始化Senticnet,参数为英文。中文'cn' sn = Senticnet('en') concept_info = sn.concept('love') print(concept_info)
返回的是字典
{'polarity_value': 'positive', 'polarity_intense': '0.655', 'moodtags': ['#joy', '#admiration'], 'sentics': {'pleasantness': '0.703', 'attention': '-0.60', 'sensitivity': '0', 'aptitude': '0.654'}, 'semantics': ['emotion', 'conditioned_emotional_response', 'conditioned_emotion', 'fright', 'reverence']}
参数参数含义polarity_value积极或消极情绪polarity_intense情绪极性(强度)moodtags情绪标签sentics细粒度情感分析semantics语义
还可以这样对每个参数单独调用
from senticnet.senticnet import Senticnet sn = Senticnet('en') polarity_value = sn.polarity_value('love') polarity_intense = sn.polarity_intense('love') moodtags = sn.moodtags('love') semantics = sn.semantics('love') sentics = sn.sentics('love')
二、中文的使用
from senticnet.senticnet import Senticnet sn = Senticnet('cn') concept_info = sn.concept('难过') print(concept_info)
返回
{'polarity_value': -0.333, 'polarity_intense': '难受', 'moodtags': ['#难过', '#难过'], 'sentics': {'pleasantness': -1, 'attention': 0, 'sensitivity': 0, 'aptitude': 0}, 'semantics': ['悲伤', '痛苦', '悲痛欲绝', '流泪']}
三、使用注意
3.1 词典不全面
不过奇葩的是
from senticnet.senticnet import Senticnet sn = Senticnet('cn') concept_info = sn.concept('好的') print(concept_info)
居然返回
Traceback (most recent call last): File "/Users/suosuo/Desktop/句子情感分析函数.py", line 40, in <module> concept_info = sn.concept('好的') File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/senticnet/senticnet.py", line 20, in concept result["polarity_value"] = self.polarity_value(concept) File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/senticnet/senticnet.py", line 56, in polarity_value concept_info = self.data[concept] KeyError: '好的'
说明senticnet词典并不全面,随便输入了个词语就这样保存。英文也是这样,也就说词典只是对某些情感词进行了收录,但还不全面。
3.2 词典不准确
我随便试了试,一个中文“非常”、英文“very”,返回的数据超出了我的认知。
from senticnet.senticnet import Senticnet sn = Senticnet('cn') concept_info = sn.concept('非常') print(concept_info)
居然返回这个
{'polarity_value': 0.03, 'polarity_intense': '意大利餐厅', 'moodtags': ['#快乐', '#有趣'], 'sentics': {'pleasantness': 0.068, 'attention': 0.066, 'sensitivity': 0.011, 'aptitude': -0.034}, 'semantics': ['吃披萨', '披萨店', '在餐馆吃饭', '餐馆']}
说明senticnet词典中并不准确全面,需要使用的同学要合理衡量,设置一些规则才能避免掉坑。
四、对句子进行情感分析
现在nltk库的语料数据下载不了,导致无法使用nltk进行分词和词干化,这里就以空格为标志对英文句子进行分词,测度其情感。
这里我要计算整个句子的情感,返回句子的词语数、正面词语数、负面词语数、正面得分、负面得分。
from senticnet.senticnet import Senticnet import re def input_sentence(sentence): positive_score = 0 positive_word_num = 0 negative_score = 0 negative_word_num = 0 sn = Senticnet() wordlist = sentence.split(' ') word_num = len(wordlist) for word in wordlist: try: concept_info = sn.concept(word) polarity_value = concept_info['polarity_value'] polarity_intense = concept_info['polarity_intense'] if polarity_value == 'positive': positive_score+=float(polarity_intense) positive_word_num+=1 else: negative_score+=float(polarity_intense) negative_word_num+=1 except: continue return {'word_num': word_num, 'positive_word_num': positive_word_num, 'positive_score': positive_score, 'negative_word_num': negative_word_num, 'negative_score': negative_score} print(input_sentence(sentence='Today is happy day'))
返回情感
{'word_num': 4, 'positive_word_num': 2, 'positive_score': 1.059, 'negative_word_num': 0, 'negative_score': 0}
End.
转载请注明来自36大数据(36dsj.com): 36大数据 » 用senticnet做简单的细粒度情感分析