基于情感词典的情感分析

基于情感词典的情感分析

及妙思 2024-10-09 服务 12 次浏览 0个评论

思路以及代码都来源于下面两篇文章:

一个不知死活的胖子:Python做文本情感分析之情感极性分析


基于情感词典的情感分析应该是最简单的情感分析方法了,大致说一下使用情感词典进行情感分析的思路:

对文档分词,找出文档中的情感词、否定词以及程度副词,然后判断每个情感词之前是否有否定词及程度副词,将它之前的否定词和程度副词划分为一个组,如果有否定词将情感词的情感权值乘以-1,如果有程度副词就乘以程度副词的程度值,最后所有组的得分加起来,大于0的归于正向,小于0的归于负向。


准备:

1.BosonNLP情感词典

既然是基于情感词典的分析,当然需要一份包含所有情感词的词典,网上已有现成的,直接下载即可。

https://bosonnlp.com/dev/resource

从下载的文件里,随便粘了几个正向的情感词,词后面的数字表示的是情感词的情感分值,一般正向的都是正数,负向的是负数:

 

注:由于BosonNLP是基于微博、新闻、论坛等数据来源构建的情感词典,因此拿来对其他类别的文本进行分析效果可能不好

也有一种将所有情感词的情感分值设为1的方法来计算,想要详细了解可参考此文章:

文本情感分类(一):传统模型

2.否定词词典

文本情感分类(一):传统模型中提供了一个情感极性词典的下载包,包中带了一个否定词的txt。

 
3.程度副词词典 

程度副词如:非常、很、特别...等词

原博中提供了《知网》情感分析用词语集(beta版)的下载链接,该词典中包含了程度副词已经对应的程度值,但是下载下来之后发现只有程度副词,并没有对应的程度值。

从程度级别词语.txt中选取了一部分程度副词,可以看到只有程度词,没有程度值,这个时候就自己看情况赋一个值好了:

 

改完之后的格式如下,程度副词和程度值用逗号分割,程度值可以自己定义:

 

4.停用词词典

数据堂的下载本地总是打不开,因此原博中提供的数据堂的中文停用词下载也是没下载下来,然后使用了snownlp源码中的停用词词典,但是后来发现有些情感词被当做停用词了

数据堂停用词下载:http://www.datatang.com/data/43894

snownlp源码:https://github.com/isnowfy/snownlp (停用词在snownlp/normal文件夹下 stopwords.txt)

5.分词工具

由于使用python,选择了jieba分词

数据和工具都准备好了,现在可以开始情感分析了~

来一个简单的句子:我今天很高兴也非常开心

(1)分词,去除停用词

我、今天、也被当作停用词去掉,剩下很、高兴、非常、开心

 
(2)将分词结果转为字典,key为单词,value为单词在分词结果中的索引,后来想到一个问题,如果把单词作为key的话假如一个情感词在文中出现了多次,那么应该是只记录了这个词最后一次出现的位置,其他的被覆盖掉了。 

将上一步得到的分词结果转为字典:

{'很': 0, '高兴': 1, '非常': 2, '开心': 3}

 

(3)对分词结果分类,找出情感词、否定词和程度副词

情感词sen_word(高兴和开心,key为单词的索引,value为情感权值):

 {1: '1.48950851679', 3: '2.61234173173'}


程度副词degree_word(很和非常,key为索引,value为程度值)
{0: '1.75', 2: '2'}

否定词not_word,由于没有出现否定词,所以否定词为空:
{}

 
(4)计算得分 

首先设置初始权重W为1,从第一个情感词开始,用权重W*该情感词的情感值作为得分(用score记录),然后判断与下一个情感词之间是否有程度副词及否定词,如果有否定词将W*-1,如果有程度副词,W*程度副词的程度值,此时的W作为遍历下一个情感词的权重值,循环直到遍历完所有的情感词,每次遍历过程中的得分score加起来的总和就是这篇文档的情感得分。

 

W=1

score=0

第一个情感词是高兴,高兴的情感权值为1.48950851679,score=W*情感权值=1*1.48950851679=1.48950851679

高兴和下一个情感词开心之间出现了程度副词非常,程度值为2,因此W=W*2=1*2=2,然后获取下一个情感词

下一个情感词是开心,此时W=2,score=score+2*2.61234173173=1.48950851679+2*2.61234173173=6.71419198025

遍历结束

这里也发现两个问题:

(1)第一个情感词之前出现的程度副词和否定词被忽略了

(2)在判断两个情感词之间出现否定词以及程度副词时,W没有被初始化为1,这样W就被累乘了

        有兴趣的可以修改一下~

完整代码:

 

转载请注明来自广东菲塔赫医药生物科技有限公司,本文标题:《基于情感词典的情感分析》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!
Top