其他
用SenticNet库做细粒度情感分析
细粒度情感分析
说细粒度情感分析,先说传统的情感分析(即粗粒度分析)。
粗粒度情感分析只是简单的积极或消极情感的划分,并计算出情感的强度。但是情绪更细的维度层次,应该还可以对正负情绪进行划分。比如,积极情绪的期待、喜悦,负面情绪的愤怒、悲伤、害怕等,分析单位更小更精准。
senticnet库
Sentic API基于SenticNet4词典,可以对词语进行文本分析,得出每个词的语义和情感。这个库很有特点,
优点在于可以进行细粒度情感分析,这一点很多库是做不到的。
缺点是只是对每个词语进行分析,还无法做到句子层面的情感分析。
但是以这个库为基础,我们还是可以做很多事情的。
能对多少语言进行处理呢?
语言 | 语言代码 |
---|---|
Arabic | ar |
Bosnian | ba |
Bulgarian | bg |
Catalan | ca |
Chinese | cn |
Croatian | hr |
Czech | cz |
Danish | dk |
Dutch | nl |
English | en |
Estonian | ee |
Finnish | fi |
French | fr |
German | de |
Greek | gr |
Haitian | ht |
Hebrew | he |
Hindi | hi |
Hmong | hm |
Hungarian | hu |
Indonesian | id |
Italian | it |
Japanese | jp |
Korean | kr |
Latvian | lv |
Lithuanian | lt |
Malay | my |
Maltese | mt |
Portuguese | pt |
Romanian | ro |
Russian | ru |
Serbian | rs |
Singlish | sg |
Slovak | sk |
Slovenian | si |
Spanish | es |
Thai | th |
Turkish | tr |
Ukrainian | ua |
Urdu | ur |
一、官方示例
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
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:
#防止有的词不存在于senticnet词典,导致程序报错!
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}
senticnet文档:http://sentic.net/api/