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

大数据

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

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

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

1.1 数据准备

1.1.1 情感词典及对应分数

词典来源于BosonNLP数据下载 的情感词典,来源于社交媒体文本,所以词典适用于处理社交媒体的情感分析。

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

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

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

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

这部电影真垃圾

垃圾分类

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

1.1.2 否定词词典

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

1.1.3 程度副词词典

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

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

大数据

1.1.4 停用词词典

中科院计算所中文自然语言处理开放平台发布了有1208个停用词的中文停用词表,
也有其他不需要积分的下载途径。

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 计算句子得分

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


you might also like

【数据封神榜】360数据中心傅志华:数据实施的三大误区(附傅志华推荐架构图)

什么时候该用 RabbitMQ ,什么时候该用 Apache Kafka

Learn R | Random Forest of Data Mining(上)

爬虫进阶:反爬策略的应对机制

张溪梦:来自硅谷的数据驱动增长实践(二)

三维形状数据的深度特征表示

为什么没人愿意为大数据洞察报告买单?

零基础搭建Hadoop大数据处理-集群安装

挖掘软件 | KNIME中的K-means聚类

大数据的核心:数据挖掘


上一篇:婚恋命案情况令人惊醒 金钱和感情是主要导火索

下一篇:优美的情感电台广播稿


编辑推荐
  • 27年,这家企业实现“扎根济南、立足山东、服务

  • 区领导走访外资外贸企业

  • “简”信息“减”材料,这些企业间合并收购不

  • 73家煤炭企业发布2023年度社会责任报告