查看原文
其他

用SenticNet库做细粒度情感分析

2017-09-09 大邓 大邓带你玩python

细粒度情感分析

说细粒度情感分析,先说传统的情感分析(即粗粒度分析)。

粗粒度情感分析只是简单的积极或消极情感的划分,并计算出情感的强度。但是情绪更细的维度层次,应该还可以对正负情绪进行划分。比如,积极情绪的期待、喜悦,负面情绪的愤怒、悲伤、害怕等,分析单位更小更精准。

senticnet库

Sentic API基于SenticNet4词典,可以对词语进行文本分析,得出每个词的语义和情感。这个库很有特点,

优点在于可以进行细粒度情感分析,这一点很多库是做不到的。

缺点是只是对每个词语进行分析,还无法做到句子层面的情感分析。

但是以这个库为基础,我们还是可以做很多事情的。

能对多少语言进行处理呢?

语言语言代码
Arabicar
Bosnianba
Bulgarianbg
Catalanca
Chinesecn
Croatianhr
Czechcz
Danishdk
Dutchnl
Englishen
Estonianee
Finnishfi
Frenchfr
Germande
Greekgr
Haitianht
Hebrewhe
Hindihi
Hmonghm
Hungarianhu
Indonesianid
Italianit
Japanesejp
Koreankr
Latvianlv
Lithuanianlt
Malaymy
Maltesemt
Portuguesept
Romanianro
Russianru
Serbianrs
Singlishsg
Slovaksk
Sloveniansi
Spanishes
Thaith
Turkishtr
Ukrainianua
Urduur

一、官方示例

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/


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存