Python做文本挖掘的情感极性分析(基于情感词典的方法)

简介:

Python做文本挖掘的情感极性分析(基于情感词典的方法)

「情感极性分析」是对带有感情色彩的主观性文本进行分析、处理、归纳和推理的过程。按照处理文本的类别不同,可分为基于新闻评论的情感分析和基于产品评论的情感分析。其中,前者多用于舆情监控和信息预测,后者可帮助用户了解某一产品在大众心目中的口碑。目前常见的情感极性分析方法主要是两种:基于情感词典的方法和基于机器学习的方法。

1. 基于情感词典的文本情感极性分析

笔者是通过情感打分的方式进行文本情感极性判断,score > 0判断为正向,score < 0判断为负向。

1.1 数据准备

1.1.1 情感词典及对应分数

词典来源于BosonNLP数据下载http://bosonnlp.com/dev/resource 的情感词典,来源于社交媒体文本,所以词典适用于处理社交媒体的情感分析。

词典把所有常用词都打上了唯一分数有许多不足之处。

不带情感色彩的停用词会影响文本情感打分。由于中文的博大精深,词性的多变成为了影响模型准确度的重要原因。一种情况是同一个词在不同的语境下可以是代表完全相反的情感意义,用笔者模型预测偏最大的句子为例(来源于朋友圈文本):

有车一族都用了这个宝贝,后果很严重哦[偷笑][偷笑][偷笑]1,交警工资估计会打5折,没有超速罚款了[呲牙][呲牙][呲牙]2,移动联通公司大幅度裁员,电话费少了[呲牙][呲牙][呲牙]3,中石化中石油裁员2成,路痴不再迷路,省油[悠闲][悠闲][悠闲]5,保险公司裁员2成,保费折上折2成,全国通用[憨笑][憨笑][憨笑]买不买你自己看着办吧[调皮][调皮][调皮]

里面严重等词都是表达的相反意思,甚至整句话一起表示相反意思,不知死活的笔者还没能深入研究如何用词典的方法解决这类问题,但也许可以用机器学习的方法让神经网络进行学习能够初步解决这一问题。另外,同一个词可作多种词性,那么情感分数也不应相同,例如:

这部电影真垃圾

垃圾分类

很明显在第一句中垃圾表现强烈的贬义,而在第二句中表示中性,单一评分对于这类问题的分类难免有失偏颇。

1.1.2 否定词词典

否定词的出现将直接将句子情感转向相反的方向,而且通常效用是叠加的。常见的否定词:不、没、无、非、莫、弗、勿、毋、未、否、别、無、休、难道等。

1.1.3 程度副词词典

既是通过打分的方式判断文本的情感正负,那么分数绝对值的大小则通常表示情感强弱。既涉及到程度强弱的问题,那么程度副词的引入就是势在必行的。词典可从《知网》情感分析用词语集(beta版)http://www.keenage.com/download/sentiment.rar

词典内数据格式可参考如下格式,即共两列,第一列为程度副词,第二列是程度数值,> 1表示强化情感,< 1表示弱化情感。

1.1.4 停用词词典

中科院计算所中文自然语言处理开放平台发布了有1208个停用词的中文停用词表,http://www.datatang.com/data/43894

也有其他不需要积分的下载途径。

http://www.hicode.cc/download/view-software-13784.html

1.2 数据预处理

1.2.1 分词

即将句子拆分为词语集合,结果如下:

e.g. 这样/的/酒店/配/这样/的/价格/还算/不错

Python常用的分词工具(在此笔者使用Jieba进行分词):结巴分词 Jieba

Pymmseg-cpp

Loso

smallseg

 
  1. from collections import defaultdict 
  2. import os 
  3. import re 
  4. import jieba 
  5. import codecs 
  6.  
  7. “”” 
  8.  
  9. 1. 文本切割 
  10. “””def sent2word(sentence): 
  11. “”” 
  12. Segment a sentence to words 
  13. Delete stopwords 
  14. “”” 
  15. segList = jieba.cut(sentence) 
  16. segResult = [] for w in segList: 
  17. segResult.append(w) 
  18.  
  19. stopwords = readLines(‘stop_words.txt’) 
  20. newSent = [] for word in segResult: if word in stopwords: 
  21. continue 
  22. else
  23. newSent.append(word) return newSent  

1.2.2 去除停用词

遍历所有语料中的所有词语,删除其中的停用词

e.g. 这样/的/酒店/配/这样/的/价格/还算/不错–> 酒店/配/价格/还算/不错

1.3 构建模型

1.3.1 将词语分类并记录其位置

将句子中各类词分别存储并标注位置。

 
  1. “””2. 情感定位””” 
  2.  
  3. def classifyWords(wordDict): # (1) 情感词 
  4.  
  5. senList = readLines(‘BosonNLP_sentiment_score.txt’) senDict = defaultdict() 
  6.  
  7. for s in senList: 
  8.  
  9. senDict[s.split(‘ ‘)[0]] = s.split(‘ ‘)[1] # (2) 否定词 
  10.  
  11. notList = readLines(‘notDict.txt’) # (3) 程度副词 degreeList = readLines(‘degreeDict.txt’) 
  12.  
  13. degreeDict = defaultdict() 
  14.  
  15. for d in degreeList: 
  16.  
  17. degreeDict[d.split(‘,’)[0]] = d.split(‘,’)[1] 
  18.  
  19. senWord = defaultdict() 
  20.  
  21. notWord = defaultdict() 
  22.  
  23. degreeWord = defaultdict() 
  24.  
  25. for word in wordDict.keys(): 
  26. if word in senDict.keys() and word not in notList and word not in degreeDict.keys(): 
  27.  
  28. senWord[wordDict[word]] = senDict[word] 
  29. elif word in notList and word not in degreeDict.keys(): notWord[wordDict[word]] = -1 
  30.  
  31. elif word in degreeDict.keys(): degreeWord[wordDict[word]] = degreeDict[word] 
  32. return senWord, notWord, degreeWord  

1.3.2 计算句子得分

在此,简化的情感分数计算逻辑:所有情感词语组的分数之和.

定义一个情感词语组:两情感词之间的所有否定词和程度副词与这两情感词中的后一情感词构成一个情感词组,即notWords + degreeWords + sentiWords,例如不是很交好,其中不是为否定词,为程度副词,交好为情感词,那么这个情感词语组的分数为:

finalSentiScore = (-1) ^ 1 * 1.25 * 0.747127733968

其中1指的是一个否定词,1.25是程度副词的数值,0.747127733968为交好的情感分数。

 
  1. “””3. 情感聚合””” 
  2.  
  3. def scoreSent(senWord, notWord, degreeWord, segResult): 
  4.  
  5. W = 1 score = 0 # 存所有情感词的位置的列表 senLoc = senWord.keys() 
  6.  
  7. notLoc = notWord.keys() 
  8.  
  9. degreeLoc = degreeWord.keys() 
  10.  
  11. senloc = -1 # notloc = -1 # degreeloc = -1 
  12.  
  13. # 遍历句中所有单词segResult,i为单词绝对位置 
  14.  
  15. for i in range(0, len(segResult)): 
  16.  
  17. # 如果该词为情感词 
  18.  
  19. if i in senLoc: # loc为情感词位置列表的序号 senloc += 1 # 直接添加该情感词分数 score += W * float(senWord[i]) 
  20. # print “score = %f” % score 
  21.  
  22. if senloc < len(senLoc) – 1: 
  23. # 判断该情感词与下一情感词之间是否有否定词或程度副词 # j为绝对位置 
  24.  
  25. for j in range(senLoc[senloc], senLoc[senloc + 1]): # 如果有否定词 
  26.  
  27. if j in notLoc: 
  28.  
  29. W *= -1 # 如果有程度副词 
  30.  
  31. elif j in degreeLoc: 
  32.  
  33. W *= float(degreeWord[j]) 
  34. # i定位至下一个情感词 
  35.  
  36. if senloc < len(senLoc) – 1: 
  37.  
  38. i = senLoc[senloc + 1] 
  39.  
  40. return score  

1.4 模型评价

其中大多数文本被判为正向文本符合实际情况,且绝大多数文本的情感得分的绝对值在10以内,这是因为笔者在计算一个文本的情感得分时,以句号作为一句话结束的标志,在一句话内,情感词语组的分数累加,如若一个文本中含有多句话时,则取其所有句子情感得分的平均值。然而,这个模型的缺点与局限性也非常明显:

首先,段落的得分是其所有句子得分的平均值,这一方法并不符合实际情况。正如文章中先后段落有重要性大小之分,一个段落中前后句子也同样有重要性的差异。

其次,有一类文本使用贬义词来表示正向意义,这类情况常出现与宣传文本中,还是那个例子:

有车一族都用了这个宝贝,后果很严重哦[偷笑][偷笑][偷笑]1,交警工资估计会打5折,没有超速罚款了[呲牙][呲牙][呲牙]2,移动联通公司大幅度裁员,电话费少了[呲牙][呲牙][呲牙]3,中石化中石油裁员2成,路痴不再迷路,省油[悠闲][悠闲][悠闲]5,保险公司裁员2成,保费折上折2成,全国通用[憨笑][憨笑][憨笑]买不买你自己看着办吧[调皮][调皮][调皮]2980元轩辕魔镜带回家,推广还有返利[得意]

Score Distribution中得分小于-10的几个文本都是与这类情况相似,这也许需要深度学习的方法才能有效解决这类问题,普通机器学习方法也是很难的。

对于正负向文本的判断,该算法忽略了很多其他的否定词、程度副词和情感词搭配的情况;用于判断情感强弱也过于简单。


本文作者:佚名

来源:51CTO

相关文章
|
3天前
|
消息中间件 安全 开发者
Python global关键字分析
Python 是一种高级编程语言,拥有非常强大的功能和灵活性。在 Python 中,global 关键字可以用于在函数内部修改全局变量的值。本篇技术博客将介绍 global 关键字的使用方法和实现原理。
17 5
|
3天前
|
Python
Python语言提供了多种输出格式化的方法,这些方法随着时间的推移和版本的更新而发展
【6月更文挑战第19天】Python格式化方法包括过时的`%`操作符,`str.format()`,推荐的f-string(Python 3.6+)和Template strings。f-string提供最佳的可读性和性能,`str.format()`是通用的,而`%`不推荐使用。模板字符串用于特定场景。对于旧版Python,使用`str.format()`或`%`。
12 4
|
3天前
|
存储 Python
Python的命名空间和作用域分析
在Python中,命名空间(Namespace)是用来存储变量名和对象引用之间映射关系的字典,而作用域(Scope)是指程序中变量可以被访问的区域范围。Python中的命名空间是用来存储变量名和对象引用之间映射关系的字典,Python中存在3种命名空间:内置命名空间、全局命名空间和局部命名空间。Python中存在3种命名空间:内置命名空间、全局命名空间和局部命名空间。局部作用域:由局部命名空间定义,在函数内部定义的变量只能在该函数内部访问。在全局命名空间中定义的变量可以在模块内的任何函数或类中直接使用。
14 3
|
3天前
|
Python
Python三种标准输出重定向方法
Python 提供了标准库中的 sys.stdout 对象来代表标准输出。如果我们想将输出重定向到其他位置,例如内存、文件或自定义类,我们可以通过一些技巧来实现。
9 2
|
3天前
|
存储 缓存 调度
Python教程:一文了解10种数据结构在Python中的实现方法
数据结构是计算机科学中非常重要的概念,它用于组织和存储数据,使得数据可以高效地被访问和操作。在编程中,选择合适的数据结构对于解决问题和提高程序性能至关重要。
19 1
|
3天前
|
Java 索引 Python
深入理解 Python 类中的各种方法
在 Python 中,类不仅仅是对象的蓝图,它还提供了多种方法,使我们能够以更灵活和强大的方式编写代码。本文将详细介绍 Python 类中的各种方法,包括实例方法、类方法、静态方法、特殊方法等,并通过示例展示它们的用法和区别。
|
21小时前
|
Python
Python优雅遍历字典删除元素的方法
本文详细介绍了Python优雅遍历字典删除元素的五种方法,字典推导式是删除字典中元素的最常见且最优雅的方法,因为它清晰、简洁且易于理解。其他方法可能在某些特定情况下有用,但通常不如字典推导式通用或高效。
6 0
|
21小时前
|
机器学习/深度学习 算法 索引
Python梯度提升决策树的方法示例
本文简要介绍了Python梯度提升决策树的方法示例,包括鸢尾花(Iris)数据集进行分类、房价预测(回归)、垃圾邮件分类、特征选择等示例。
7 0
|
12月前
|
Python
28.从入门到精通:Python3 面向对象 面向对象技术简介 类定义 类对象 类的方法
28.从入门到精通:Python3 面向对象 面向对象技术简介 类定义 类对象 类的方法
|
Python
Python面向对象、类的抽象、类的定义、类名遵循大驼峰的命名规范创建对象、类外部添加和获取对象属性、类内部操作属性魔法方法__init__()__str__()__del__()__repr__()
面向对象和面向过程,是两种编程思想. 编程思想是指对待同一个问题,解决问题的套路方式.面向过程: 注重的过程,实现的细节.亲力亲为.面向对象: 关注的是结果, 偷懒.类和对象,是面向对象中非常重要的两个概念object 是所有的类基类,即最初始的类class 类名(object): 类中的代码PEP8代码规范:类定义的前后,需要两个空行 创建的对象地址值都不一样如dog和dog1的地址就不一样,dog的地址为2378043254528dog1的地址为2378044849840 8.类内部操作属性 sel
194 1
Python面向对象、类的抽象、类的定义、类名遵循大驼峰的命名规范创建对象、类外部添加和获取对象属性、类内部操作属性魔法方法__init__()__str__()__del__()__repr__()