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

from collections import defaultdict

import os

import re

import jieba

import codecs

"""

1. 文本切割
"""def sent2word(sentence):
    """
    Segment a sentence to words
    Delete stopwords
    """
    segList = jieba.cut(sentence)
    segResult = []    for w in segList:
        segResult.append(w)

    stopwords = readLines('stop_words.txt')
    newSent = []                                                                                  for word in segResult:                                                                       if word in stopwords:                 
            continue
        else:
            newSent.append(word)    return newSent

1.2.2 去除停用词

遍历所有语料中的所有词语,删除其中的停用词 e.g. 这样/的/酒店/配/这样/的/价格/还算/不错

--> 酒店/配/价格/还算/不错

1.3 构建模型

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

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

"""2. 情感定位"""
def classifyWords(wordDict):    # (1) 情感词   
 senList = readLines('BosonNLP_sentiment_score.txt')    senDict = defaultdict()    
for s in senList:        
    senDict[s.split(' ')[0]] = s.split(' ')[1]    # (2) 否定词    
    notList = readLines('notDict.txt')    # (3) 程度副词    degreeList = readLines('degreeDict.txt')    
degreeDict = defaultdict()   
 for d in degreeList:        
    degreeDict[d.split(',')[0]] = d.split(',')[1]    
    senWord = defaultdict()    
    notWord = defaultdict()    
    degreeWord = defaultdict()    
for word in wordDict.keys():     
   if word in senDict.keys() and word not in notList and word not in degreeDict.keys():            
       senWord[wordDict[word]] = senDict[word]      
    elif word in notList and word not in degreeDict.keys():              notWord[wordDict[word]] = -1       
    elif word in degreeDict.keys():                          degreeWord[wordDict[word]] = degreeDict[word]  
      return senWord, notWord, degreeWord

1.3.2 计算句子得分

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

定义一个情感词语组:两情感词之间的所有否定词和程度副词与这两情感词中的后一情感词构成一个情感词组,即notWords + degreeWords + sentiWords,例如不是很交好,其中不是为否定词,很为程度副词,交好为情感词,那么这个情感词语组的分数为: finalSentiScore = (-1) ^ 1 * 1.25 * 0.747127733968 其中1指的是一个否定词,1.25是程度副词的数值,0.747127733968为交好的情感分数。

"""3. 情感聚合"""
def scoreSent(senWord, notWord, degreeWord, segResult):    
    W = 1    score = 0    # 存所有情感词的位置的列表                    senLoc = senWord.keys()    
     notLoc = notWord.keys()   
     degreeLoc =     degreeWord.keys()    
    senloc = -1    # notloc = -1    # degreeloc = -1    
# 遍历句中所有单词segResult,i为单词绝对位置   
     for i in range(0, len(segResult)):       
 # 如果该词为情感词       
         if i in senLoc:            # loc为情感词位置列表的序号                    senloc += 1            # 直接添加该情感词分数                        score += W * float(senWord[i])           
             # print "score = %f" % score           
         if senloc < len(senLoc) - 1:             
    # 判断该情感词与下一情感词之间是否有否定词或程度副词                # j为绝对位置                
    for j in range(senLoc[senloc], senLoc[senloc + 1]):                    # 如果有否定词                   
         if j in notLoc:                       
             W *= -1                    # 如果有程度副词                   
          elif j in degreeLoc:                      
              W *= float(degreeWord[j])     
       # i定位至下一个情感词        
if senloc < len(senLoc) - 1:           
     i = senLoc[senloc + 1]    
return score

1.4 模型评价

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

然而,这个模型的缺点与局限性也非常明显:

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

其次,有一类文本使用贬义词来表示正向意义,这类情况常出现与宣传文本中,还是那个例子: 有车一族都用了这个宝贝,后果很严重哦[偷笑][偷笑][偷笑]1,交警工资估计会打5折,没有超速罚款了[呲牙][呲牙][呲牙]2,移动联通公司大幅度裁员,电话费少了[呲牙][呲牙][呲牙]3,中石化中石油裁员2成,路痴不再迷路,省油[悠闲][悠闲][悠闲]5,保险公司裁员2成,保费折上折2成,全国通用[憨笑][憨笑][憨笑]买不买你自己看着办吧[调皮][调皮][调皮]2980元轩辕魔镜带回家,推广还有返利[得意] Score Distribution中得分小于-10的几个文本都是与这类情况相似,这也许需要深度学习的方法才能有效解决这类问题,普通机器学习方法也是很难的。

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

原文发布于微信公众号 - 机器学习算法与Python学习(guodongwei1991)

原文发表时间:2017-05-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI科技大本营的专栏

【NLP年度重磅盘点】12项重大行业突破!详解2017年深度学习加持下的NLP大事件

翻译 | 林椿眄、刘畅、彭硕 编辑 | Donna Suisui 过去几年,深度学习架构和算法在图像识别和语音处理等领域取得了重大的进步。而在NLP(自然语言处...

44280
来自专栏机器之心

专访 | 诺基亚首席科学家范力欣:用模糊逻辑实现可解释的深度神经网络

深度学习发展到今天,很大程度上依然是一个「实验主导」的、「先有实验结果再找可能解释」的学科。对实验结果的理论解释,争议不断,而且随着时间的推移,研究者们给出的解...

18620
来自专栏人工智能头条

通俗理解信息熵

20630
来自专栏专知

【深度】浅析Geoffrey Hinton最近提出的Capsule计划

【导读】本文全面介绍了深度学习的来龙去脉以及Hinton最近提出的Capsule计划。希望做物理的、做数学的、做生物的、做化学的、做计算机、包括做科幻的都能看的...

31160
来自专栏量子位

史上最强NLP知识集合:知识结构、发展历程、导师名单

自然语言处理(NaturalLanguage Processing,NLP)是计算机科学领域与人工智能领域中的一个重要方向,旨在研究能实现人与计算机之间用自然语...

37820
来自专栏AI科技大本营的专栏

资源 | 李飞飞、吴恩达、Bengio等人的15大顶级深度学习课程,你收集全了吗?

翻译 | AI科技大本营 参与 | 刘畅 编辑 | Donna 目前,深度学习和深度强化学习已经在实践中得到了广泛的运用。资源型博客sky2learn整理了15...

47390
来自专栏AI2ML人工智能to机器学习

易图秒懂の神经网络潜行-RNN前生

在“易图秒懂の神经网络潜行-CNN前生"里面,简述了CNN的前生Neocognitron横空出世的环境和当时的影响。 这里描述RNN的前生, 叫SRN,简单递归...

9720
来自专栏CreateAMind

智能的几点随想

9330
来自专栏大数据文摘

学界 | 北邮夺冠CVPR 2018 DeepGlobe比赛,他们是这样做卫星图像识别的

在刚刚结束的CVPR2018: DeepGlobe Road Extraction Challenge(全球卫星图像道路提取)比赛中,北京邮电大学信息与通信工程...

41050
来自专栏AI科技大本营的专栏

当这位70岁的Hinton老人还在努力推翻自己积累了30年的学术成果时,我才知道什么叫做生命力(附Capsule最全解析)

Hinton,这个以“深度学习之父”和“神经网络先驱”响彻AI领域的名字,他的一举一动,都是热点导向。 当我们远望一位顶级人物时,除了他的学术,也许,我们更...

41860

扫码关注云+社区

领取腾讯云代金券