情感分析是大数据时代常见的一种分析方法,多用于对产品评论的情感挖掘,以探究顾客的满意度程度。在做情感分析时,有两种途径:一种是基于情感词典的分析方法,一种是基于机器学习的方法,两者各有利弊。
在此,笔者主要想跟大家分享基于python平台利用情感词典做情感分析的方法。本文主要参考https://blog.csdn.net/lom9357bye/article/details/79058946这篇文章,在此文章中,博主用一句简单的语句“我今天很高兴也非常开心”向我们清楚的展示的利用情感词典做情感分析的方法,这篇文章对笔者很受用。
然而这篇文章博主也向我们抛出了几个问题,笔者就是基于此改写的算法。主要分以下几个步骤:
(1)过滤掉停用词表中的否定词和程度副词
有时候,停用词表中的词包括了否定词和程度副词,因此在做情感分析时首要先过滤掉停用词表中的否定词和程度副词,防止这些有意义的词被过滤掉。词表的下载见上述博主。

"""在停用词表中过滤否定词和程度副词"""
#生成stopword表,需要去除一些否定词和程度词汇
stopwords = set()
fr = open('stopwords.txt','r',encoding='utf-8')
for word in fr:stopwords.add(word.strip())#Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。# #读取否定词文件not_word_file = open('否定词.txt','r+',encoding='utf-8')not_word_list = not_word_file.readlines()not_word_list = [w.strip() for w in not_word_list]#读取程度副词文件degree_file = open('程度副词.txt','r+')degree_list = degree_file.readlines()degree_list = [item.split(',')[0] for item in degree_list]#生成新的停用词表with open('stopwords_new.txt','w',encoding='utf-8') as f:for word in stopwords:if(word not in not_word_list) and (word not in degree_list):f.write(word+'\n')

(2)分词,过滤停用词

def seg_word(sentence):jieba.load_userdict("./dict.txt")seg_list = jieba.cut(sentence)seg_result = []# 读取停用词文件stopwords = [line.strip() for line in open('stopwords_new.txt', encoding='UTF-8').readlines()]# 去停用词for word in seg_list:  # 读取每一行分词if word not in stopwords:  # 如果分词不在停用词列表中if word != '\t':seg_result.append(word)print(seg_result)return seg_result

(3)找出分词结果中的情感词、否定词和程度副词
在博主的文章中,这里出现了一个错误就是如果句子中出现两个相同的情感词、程度副词和否定词的话,前面的就会被后面的覆盖掉了,这是因为博主将分词结果转换成了以词作为key,索引作为value的字典形式,但如果我们只对分词结果以列表的形式进行遍历,则可避免这种情况的发生。

def classify_words( word_list):"""词语分类,找出情感词、否定词、程度副词"""# 读取情感字典文件sen_file = open('BosonNLP_sentiment_score.txt', 'r+', encoding='utf-8')# 获取字典文件内容sen_list = sen_file.readlines()  # sen_list是一个二维列表# 创建情感字典sen_dict = defaultdict()# 读取字典文件每一行内容,将其转换为字典对象,key为情感词,value为对应的分值for s in sen_list:# 每一行内容根据空格分割,索引0是情感词,索引1是情感分值(情感词典文件中有一行是空行,因此执行的时候会报错,注意处理一下空行,这里没有处理)# print(s)sen_dict[s.split(' ')[0]] = s.split(' ')[1]  # 字典的键值对形式# 读取否定词文件not_word_file = open('否定词.txt', 'r+', encoding='utf-8')# 由于否定词只有词,没有分值,使用list即可not_word_list = not_word_file.readlines()not_dict = defaultdict()for n in not_word_list:not_dict[n.split(',')[0]] = n.split(',')[1]# 读取程度副词文件degree_file = open('程度副词.txt', 'r+', encoding='ANSI')degree_list = degree_file.readlines()degree_dict = defaultdict()# 程度副词与情感词处理方式一样,转为程度副词字典对象,key为程度副词,value为对应的程度值for d in degree_list:degree_dict[d.split(',')[0]] = d.split(',')[1]# 分类结果,词语的index作为key,词语的分值作为value,否定词分值设为-1sen_word = dict()not_word = dict()degree_word = dict()# 分类for i in range(len(word_list)):word = word_list[i]if word in sen_dict.keys() and word not in not_dict.keys() and word not in degree_dict.keys():# 找出分词结果中在情感字典中的词sen_word[i] = sen_dict[word]elif word in not_dict.keys() and word not in degree_dict.keys():# 分词结果中在否定词列表中的词not_word[i] = -1elif word in degree_dict.keys():# 分词结果中在程度副词中的词degree_word[i] = degree_dict[word]# 将分类结果返回print(sen_word,not_word,degree_word)return sen_word, not_word, degree_word

(4)计算情感值
在计算情感值的过程中,博主提出了两个问题,第一是对第一个情感词之前的程度副词和否定词的判断情况,第二个就是权重W没有初始化,被累乘的情况。笔者将它改成下面的代码形式,完美解决了这两个问题。

#1.用来判断第一个情感词之前的程度副词和否定词
def get_init_weight(sen_word, not_word, degree_word):# 权重初始化为1W = 1# 将情感字典的key转为listsen_word_index_list = list(sen_word.keys())if len(sen_word_index_list) == 0:return W# 获取第一个情感词的下标,遍历从0到此位置之间的所有词,找出程度词和否定词for i in range(0, sen_word_index_list[0]):if i in not_word.keys():W *= -1elif i in degree_word.keys():#更新权重,如果有程度副词,分值乘以程度副词的程度分值W *= float(degree_word[i])return W#2.计算得分
def socre_sentiment(sen_word, not_word, degree_word, seg_result):W = get_init_weight(sen_word, not_word, degree_word)print(W)score = 0# 情感词下标初始化sentiment_index = -1# 情感词的位置下标集合sentiment_index_list = list(sen_word.keys())#print(sentiment_index_list)# 遍历分词结果(遍历分词结果是为了定位两个情感词之间的程度副词和否定词)for i in range(0, len(seg_result)):# 如果是情感词(根据下标是否在情感词分类结果中判断)if i in sen_word.keys():# 权重*情感词得分score += W * float(sen_word[i])print(score)# 情感词下标加1,获取下一个情感词的位置sentiment_index += 1print("sentiment_index:",sentiment_index)if sentiment_index < len(sentiment_index_list) - 1:  #总的情感词的个数# 判断当前的情感词与下一个情感词之间是否有程度副词或否定词"""这个是解决W累乘情况的"""W=1  #防止第二轮的权重出现累乘的情况for j in range(sentiment_index_list[sentiment_index], sentiment_index_list[sentiment_index + 1]):# 更新权重,如果有否定词,取反if j in not_word.keys():W *= -1elif j in degree_word.keys():# 更新权重,如果有程度副词,分值乘以程度副词的程度分值W *= float(degree_word[j])print(W)"""这里又出现了一个问题,就是后一个没有否定词和程度副词的权重会将前一个覆盖掉,所以初始化权重W=1不能放在for循环中"""# 定位到下一个情感词if sentiment_index < len(sentiment_index_list) - 1:i = sentiment_index_list[sentiment_index + 1]return score

(5)测试
测试过程中,笔者用了一句和博主测试语句情感相反的语句,“我很不高兴也非常不开心”

seg_list = seg_word("我很不高兴也非常不开心")
sen_word, not_word, degree_word = classify_words(seg_list)
score = socre_sentiment(sen_word, not_word, degree_word, seg_list)
print(score)

测试结果如下图所示:
其中,第一行表示的是分词结果,第二行表示的是分词结果中情感词、否定词和程度副词词典
第三行表示的就是第一个情感词之前的否定词和程度副词所代表的权重,其中“很”的权重是1.6,“不”的权重是-1,那么第一次循环中的得分score=(-1)1.6score(“高兴”),第二次循环求得的是第一个情感词“高兴”和第二个情感词“开心”之间的权重,也就是“非常”=1.8,"不“=-1,第二次求得的分数score=上一次循环中求得的分值+(-1)1.8score(”开心“)。由于没有下一个情感词了,所以这也是最终句子的情感值得分。

参考来源:https://blog.csdn.net/lom9357bye/article/details/79058946

Python利用情感词典做情感分析相关推荐

  1. 基于情感词典的情感分析

    思路以及代码都来源于下面两篇文章: 一个不知死活的胖子:Python做文本情感分析之情感极性分析 Ran Fengzheng 的博客:基于情感词典的文本情感极性分析相关代码 基于情感词典的情感分析应该 ...

  2. 利用PrimeTime PX做功耗分析

    利用PrimeTime PX做功耗分析 在Prime Time安装目录中,有个文件夹 /opt/Synopsys/PrimeTime2015/doc/pt/tutpx,里面有PDF文件和Lab文件,看 ...

  3. [Python人工智能] 二十二.基于大连理工情感词典的情感分析和情绪计算

    从本专栏开始,作者正式研究Python深度学习.神经网络及人工智能相关知识.前一篇文章分享了CNN实现中文文本分类的过程,并与贝叶斯.决策树.逻辑回归.随机森林.KNN.SVM等分类算法进行对比.这篇 ...

  4. python 基于情感词典的情感分析之乐,惧,惊,哀,恶,怒和未知七种情感分析

    背景 情感分析是通过计算技术对文本内容的主观客观性.情绪等挖掘分析,对文本的情感偏向做出判断.目的是识别出文本中的具体情感分类,之前做文本分类都是通过深度学习或者机器学习进行文本分类,但是需要进行数据 ...

  5. python情感词典计算得分_基于情感词典的情感打分

    原理我就不讲了,请移步下面这篇论文,包括情感词典的构建(各位读者可以根据自己的需求稍作简化),以及打分策略(程序对原论文稍有改动). 论文在这里下载:基于情感词典的中文微博情感倾向性研究 (大家可以上 ...

  6. 基于情感词典的情感打分

    原理我就不讲了,请移步下面这篇论文,包括情感词典的构建(各位读者可以根据自己的需求稍作简化),以及打分策略(程序对原论文稍有改动). 论文在这里下载:基于情感词典的中文微博情感倾向性研究  (大家可以 ...

  7. 基于情感词典的情感值分析

    #utils.py import reclass ToolGeneral():"""Tool function"""def is_odd(s ...

  8. Python 利用深度学习做文本摘要

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 python免费学习资料 ...

  9. 21-Chrome开发者工具:利用网络面板做性能分析

    浏览器中的页面循环系统"模块我们已经介绍完了,循环系统是页面的基础,理解了循环系统能让我们从本质上更好地理解页面的工作方式,加深我们对一些前端概念的理解. 接下来我们就要进入新的模块了,也就 ...

  10. 浏览器原理 20 # Chrome开发者工具:利用网络面板做性能分析

    说明 浏览器工作原理与实践专栏学习笔记 DevTools Chrome 开发者工具(简称 DevTools)是一组网页制作和调试的工具,内嵌于 Google Chrome 浏览器中.它提供了通过界面访 ...

最新文章

  1. linux 普通用户crond,linux下普通用户的定时任务
  2. 26 MM配置-采购-采购申请-定义编码范围
  3. python 连接 oracle 循环,4.使用cx_Oracle连接Oracle(高级篇)
  4. Java设计模式(10)代理模式(Proxy模式)
  5. apt apt 用法_apt命令–实用用法指南
  6. psp开发------汉化插件
  7. 生成base64二维码带logo
  8. 夜曲歌词 拼音_周杰伦夜曲的歌词
  9. 各位大佬,别再拿人工智能当春药了!
  10. 监控摄像机的视频摘要(Video Summarization of Surveillance Cameras)
  11. Fastlane使用说明
  12. 测绘资质高性能数据服务器,测绘资质分级标准2020年
  13. 2个动作,让研发效率提升120%,代码减少50%
  14. oracle如何增加initial,Oracle修改表和索引的INITIAL初始化大小
  15. gateway官网解读(三)
  16. 机器学习和统计学习的区别:10个统计分析方法
  17. STM32学习(窗口看门狗)
  18. Android 国际化和完整的语言代码表
  19. CMD的debug命令
  20. 【揚皓原创文章生成器 】原创文章简单原理(文)

热门文章

  1. 以30字符宽居中输出python字符串_从零开始学 Python 之字符串
  2. asp.net+mysql,asp.net+mysql后台盲注入
  3. ubunt18 mysql_Ubuntu18.04下安装MySQL教程
  4. 只腐蚀毛刺 腐蚀算法_工件刺虽小,去除却难!介绍几种先进去毛刺工艺,操作简单实用...
  5. python 赋值_关于 python 分片赋值
  6. java经常用到的英文_Java中用到的英文单词,你知道多少?
  7. CDN实战:访问苹果开发者网站太慢、访问github太慢
  8. DevExpress.XtraEditors.Repository.RepositoryItem.CreateDesigner()
  9. uva live 4394 String painter 区间dp
  10. centos 6.5 安装qt5.2