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

时间: 2024-10-18 14:21:35

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

想用R和Python做文本挖掘又不知如何下手?方法来了!

1.对文章产生好奇 在数据科学中,几乎做所有事情的第一步都是产生好奇,文本挖掘也不例外. 文本挖掘应用领域无比广泛,可以与电影台本.歌词.聊天记录等产生奇妙的化学反应:如南方公园的对话,电影对白的文本挖掘和分析等也都是受到了文本挖掘的启发:近期大数据文摘相关文章<从恋爱到婚后的短信词频图发生了这些变化,你中了几枪?>带各位分析了聊天记录中隐藏的文本信息:而对各类歌词的文本信息分析,也颇有意思.(点击查看<这四十年来的香港歌坛在唱些什么>.<分析了42万字的歌词,为了搞清楚民谣

手把手教你如何用 Python 做情感分析

商品评论挖掘.电影推荐.股市预测--情感分析大有用武之地.本文帮助你一步步用Python做出自己的情感分析结果,难道你不想试试看? 需求 如果你关注数据科学研究或是商业实践,"情感分析"(sentiment analysis)这个词你应该不陌生吧? 维基百科上,情感分析的定义是: 文本情感分析(也称为意见挖掘)是指用自然语言处理.文本挖掘以及计算机语言学等方法来识别和提取原素材中的主观信息. 听着很高大上,是吧?如果说得具体一点呢? 给你一段文本,你就可以用情感分析的自动化方法获得这一

如何科学地蹭热点:用python爬虫获取热门微博评论并进行情感分析

前言:本文主要涉及知识点包括新浪微博爬虫.python对数据库的简单读写.简单的列表数据去重.简单的自然语言处理(snowNLP模块.机器学习).适合有一定编程基础,并对python有所了解的盆友阅读. 甩锅の声明 1.本数据节选自新浪热门微博评论,不代表本人任何观点 2.本人不接受任何非技术交流类批评指责(夸我可以) 3.本次分析结果因技术问题存在一定误差(是引入的包的问题,不是我的) 4.本次选取热门微博为一个月以前的(翻译一下:热点已经冷了,我只是个写教程的) 顶锅盖逃 继上次更完"国庆去

一文详解如何用 python 做中文分词

打算绘制中文词云图?那你得先学会如何做中文文本分词.跟着我们的教程,一步步用 Python 来动手实践吧.   需求 在此前发布的文章<从零开始教你用 Python 做词云>一文中,我们介绍了英文文本的词云制作方法.大家玩儿得可还高兴? 文中提过,选择英文文本作为示例,是因为处理起来最简单.但是很快就有读者尝试用中文文本做词云了.按照前文的方法,你成功了吗? 估计是不成功的.因为这里面缺了一个重要的步骤. 观察你的英文文本.你会发现英文单词之间采用空格作为强制分隔符. 例如: Yes Mini

用Python做股市数据分析(一)

这篇博文是用Python分析股市数据系列两部中的第一部,内容基于我犹他大学 数学3900 (数据科学)的课程.在这些博文中,我会讨论一些基础知识.比如如何用pandas从雅虎财经获得数据, 可视化股市数据,平局数指标的定义,设计移动平均交汇点分析移动平均线的方法,回溯测试, 基准分析法.最后一篇博文会包含问题以供练习.第一篇博文会包含平局数指标以及之前的内容. 注意:本文仅代表作者本人的观点.文中的内容不应该被当做经济建议.我不对文中代码负责,取用者自己负责. 引言 金融业使用高等数学和统计已经

python做爬虫时,如何获取下一页的html?

问题描述 python做爬虫时,如何获取下一页的html? 具体网址http://data.10jqka.com.cn/market/yybhyd/![图片说明](http://img.ask.csdn.net/upload/201603/09/1457522333_494323.png) 解决方案 分析网页数据,提取链接先做了再说. 解决方案二: 遍历页面内容中的tag a等内容 然后循环爬出下一层 解决方案三: 一般都通过一个当前页面整数作为请求参数,每次访问的时候递增这个参数就行了 解决方

Python做文本按行去重的实现方法_python

文本: 每行在promotion后面包含一些数字,如果这些数字是相同的,则认为是相同的行,对于相同的行,只保留一行. 思路: 根据字典和字符串切割. 建立一个空字典. 读入文本,并对每行切割前半部分,在读入文本的过程中循环在这个字典中查找,如果没找到,则写入该行到字典.否则,则表示该行已经被写入过字典了(即出现重复的行了),不再写入字典,这就实现了对于重复的行只保留一行的目的. 文本如下: /promotion/232 utm_source /promotion/237 LandingPage/

32位-用Python做web 选择什么服务器软件?除了apache

问题描述 用Python做web 选择什么服务器软件?除了apache apapce只能选择32位的Python解释器 ? Apache只有32位的? 用Python写网站 除了apache 还可以用什么服务器软件??? 解决方案 用nginx加uwsgi,然后用flask框架提高web framework.也可以支持64位python. 解决方案二: CGI比较老了.用标准的输入输出直接生成网页.asp与php类似...还有servlet....还支持psp 解决方案三: 用过apache,和

python 做的web 暴力猜解密码程序 出错

问题描述 python 做的web 暴力猜解密码程序 出错 在Linux环境下运行 这是错误: Traceback (most recent call last): File "brute.py", line 15, in response = urllib2.urlopen(req,timeout=100) File "/usr/lib/python2.7/urllib2.py", line 127, in urlopen return _opener.open(