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

相关文章
|
18天前
|
数据采集 缓存 定位技术
网络延迟对Python爬虫速度的影响分析
网络延迟对Python爬虫速度的影响分析
|
2月前
|
测试技术 API Python
【10月更文挑战第1天】python知识点100篇系列(13)-几种方法让你的电脑一直在工作
【10月更文挑战第1天】 本文介绍了如何通过Python自动操作鼠标或键盘使电脑保持活跃状态,避免自动息屏。提供了三种方法:1) 使用PyAutoGUI,通过安装pip工具并执行`pip install pyautogui`安装,利用`moveRel()`方法定时移动鼠标;2) 使用Pymouse,通过`pip install pyuserinput`安装,采用`move()`方法移动鼠标绝对位置;3) 使用PyKeyboard,同样需安装pyuserinput,模拟键盘操作。文中推荐使用PyAutoGUI,因其功能丰富且文档详尽。
WK
|
1月前
|
Python
Python中format_map()方法
在Python中,`format_map()`方法用于使用字典格式化字符串。它接受一个字典作为参数,用字典中的键值对替换字符串中的占位符。此方法适用于从字典动态获取值的场景,尤其在处理大量替换值时更为清晰和方便。
WK
70 36
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
2月前
|
机器学习/深度学习 数据采集 数据挖掘
11种经典时间序列预测方法:理论、Python实现与应用
本文将总结11种经典的时间序列预测方法,并提供它们在Python中的实现示例。
68 2
11种经典时间序列预测方法:理论、Python实现与应用
|
20天前
|
数据采集 存储 JSON
Python爬虫开发中的分析与方案制定
Python爬虫开发中的分析与方案制定
|
27天前
|
数据可视化 开发者 Python
Python GUI开发:Tkinter与PyQt的实战应用与对比分析
【10月更文挑战第26天】本文介绍了Python中两种常用的GUI工具包——Tkinter和PyQt。Tkinter内置于Python标准库,适合初学者快速上手,提供基本的GUI组件和方法。PyQt基于Qt库,功能强大且灵活,适用于创建复杂的GUI应用程序。通过实战示例和对比分析,帮助开发者选择合适的工具包以满足项目需求。
85 7
|
27天前
|
存储 数据处理 Python
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第27天】在科学计算和数据分析领域,Python凭借简洁的语法和强大的库支持广受欢迎。NumPy和SciPy作为Python科学计算的两大基石,提供了高效的数据处理和分析工具。NumPy的核心功能是N维数组对象(ndarray),支持高效的大型数据集操作;SciPy则在此基础上提供了线性代数、信号处理、优化和统计分析等多种科学计算工具。结合使用NumPy和SciPy,可以显著提升数据处理和分析的效率,使Python成为科学计算和数据分析的首选语言。
32 3
|
28天前
|
存储 机器学习/深度学习 算法
Python科学计算:NumPy与SciPy的高效数据处理与分析
【10月更文挑战第26天】NumPy和SciPy是Python科学计算领域的两大核心库。NumPy提供高效的多维数组对象和丰富的数学函数,而SciPy则在此基础上提供了更多高级的科学计算功能,如数值积分、优化和统计等。两者结合使Python在科学计算中具有极高的效率和广泛的应用。
46 2
|
2月前
|
数据采集 机器学习/深度学习 搜索推荐
Python自动化:关键词密度分析与搜索引擎优化
Python自动化:关键词密度分析与搜索引擎优化