用senticnet做简单的细粒度情感分析-36大数据

我是创始人李岩:很抱歉!给自己产品做个广告,点击进来看看。  

用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做简单的细粒度情感分析

随意打赏

大数据 情感分析
提交建议
微信扫一扫,分享给好友吧。