基于用户评论的短文本情感分析模型设计
文章禁止转载,虽然也是copy的。出问题必纠。
准备采用python尝试一下基于用户评论的短文本情感分析模型。
英文文本。发现英文单词之间采用空格作为强制分隔符。比如 I love play computergame,but I hate to design games.英文一个单词就可以表达一个感情色彩,但是对于中文,比如“我特别喜欢看网络小说,但是讨厌言情类的小说。” 中文是字构成,相关情感词不好划分。这时我们需要分词了,中文分词的工具有很多种。有的免费,有的收费。在python中 可以使用结巴分词划分成英语那样的词汇。
用户的评论,可以通过requests或者beautiful库爬去网页的html源码,通过正则表达式提取,或者xpath技术,然后写成文件,txt文件,csv文件(excel也行),或者放入mysql数据库中。可能需要中文字体库。
下面就是要对情感进行分析了,先要对词语分析,在python中我们可以wordcloud 做词云,wordcloud 就是统计了关键词词频。我们也可以自己统计词频。或者使用TF-idf方式提取关键词和权重,。或者使用TF-idf方式提取关键词和权重。
其原理摘抄与老王的原话如下。
我们简要讲解一下,前文出现的2种不同关键词提取方式——TF-idf和TextRank的基本原理。
为了不让大家感到枯燥,这里咱们就不使用数学公式了。后文我会给出相关的资料链接。如果你对细节感兴趣,欢迎按图索骥,查阅学习。
先说TF-idf。
它的全称是 Term Frequency - inverse document frequency。中间有个连字符,左右两侧各是一部分,共同结合起来,决定某个词的重要程度。
第一部分,就是词频(Term Frequency),即某个词语出现的频率。
我们常说“重要的事说三遍”。
同样的道理,某个词语出现的次数多,也就说明这个词语重要性可能会很高。
但是,这只是可能性,并不绝对。
例如现代汉语中的许多虚词——“的,地,得”,古汉语中的许多句尾词“之、乎、者、也、兮”,这些词在文中可能出现许多次,但是它们显然不是关键词。
这就是为什么我们在判断关键词的时候,需要第二部分(idf)配合。
逆文档频率(inverse document frequency)首先计算某个词在各文档中出现的频率。假设一共有10篇文档,其中某个词A在其中10篇文章中都出先过,另一个词B只在其中3篇文中出现。请问哪一个词更关键?
给你一分钟思考一下,然后继续读。
公布答案时间到。
答案是B更关键。
A可能就是虚词,或者全部文档共享的主题词。而B只在3篇文档中出现,因此很有可能是个关键词。
逆文档频率就是把这种文档频率取倒数。这样第一部分和第二部分都是越高越好。二者都高,就很有可能是关键词了。
TF-idf讲完了,下面我们说说TextRank。
相对于TF-idf,TextRank要显得更加复杂一些。它不是简单做加减乘除运算,而是基于图的计算。下图是原始文献中的示例图。
![](https://img.haomeiwen.com/i4976516/0cba8e21fd097a9d.png)
TextRank首先会提取词汇,形成节点;然后依据词汇的关联,建立链接。
依照连接节点的多少,给每个节点赋予一个初始的权重数值。
然后就开始迭代。
根据某个词所连接所有词汇的权重,重新计算该词汇的权重,然后把重新计算的权重传递下去。直到这种变化达到均衡态,权重数值不再发生改变。这与Google的网页排名算法PageRank,在思想上是一致的。
根据最后的权重值,取其中排列靠前的词汇,作为关键词提取结果。
如果你对原始文献感兴趣,请参考以下链接:
我们可以自己制定关键字,计算概率也可以。
说了这么多,我的主题是要情感分析,根据用户的评论进行情感分析,
文本情感分析(也称为意见挖掘)是指用自然语言处理、文本挖掘以及计算机语言学等方法来识别和提取原素材中的主观信息。听着很高大上,是吧?如果说得具体一点呢?给你一段文本,你就可以用情感分析的自动化方法获得这一段内容里包含的情感色彩是什么。
先来看英文文本的情感分析,正如上面所说英文比较简单。情感分析也容易,python中可以使用 TextBlob包 ,给出词语的情感概率。但是对于中文了,中文文本分析,我们使用的是 SnowNLP包 。这个包跟TextBlob一样,也是多才多艺的。
SnowNLP的结果取值范围在0到1之间,代表了情感分析结果为正面的可能性,我们可以使用ggplot绘图工具包。做出相关的舆情时间序列可视化?
但是上面的情感分析是别人的,不一定是我需要的,老王的如何用Python和机器学习训练中文文本情感分类模型? 给了一种方法,但是我是渣渣。
老师给了一篇 [文本情感分类(一):传统模型]说一下其内容(https://kexue.fm/archives/3360)文章。
对短文本情感分析是 用python模拟传统的基于情感词典的文本情感分类,
传统的基于情感词典如下图
![](https://img.haomeiwen.com/i4976516/0f9e19f40a06451e.png)
基于上述思路,我们可以通过以下几个步骤实现基于情感词典的文本情感分类:预处理、分词、训练情感词典、判断,整个过程可以如下图所示。
![](https://img.haomeiwen.com/i4976516/a0b2e307ca9f30c2.png)
其中 情感词典是非常重要的, 情感词典分为四个部分:积极情感词典、消极情感词典、否定词典以及程度副词词典。为了得到更加完整的情感词典,我们从网络上收集了若干个情感词典,并且对它们进行了整合去重,同时对部分词语进行了调整,以达到尽可能高的准确率。
![](https://img.haomeiwen.com/i4976516/ec8466366ee3a790.png)
但是基于情感词典的文本还有许多不足之处。
1.0 词典可以有针对性和目的性地对词典进行了去杂、更新。特别地,我们加入了某些行业词汇,以增加分类中的命中率。不同行业某些词语的词频会有比较大的差别,而这些词有可能是情感分类的关键词之一。
2.0 基于情感词典的文本情感分类规则比较机械化。简单起见,我们将每个积极情感词语赋予权重1,将每个消极情感词语赋予权重-1,并且假设情感值满足线性叠加原理;然后我们将句子进行分词,如果句子分词后的词语向量包含相应的词语,就加上向前的权值,其中,否定词和程度副词会有特殊的判别规则,否定词会导致权值反号,而程度副词则让权值加倍。最后,根据总权值的正负性来判断句子的情感。基本的算法如图。
![](https://img.haomeiwen.com/i4976516/819b315d88189e0a.png)
这个算法感觉好像很复杂啊,
文章接着提到困难所在
1.0 语言系统是相当复杂的
2.0 大脑不仅仅在情感分类
3.0 活水:学习预测
文章随即给出优化思路
a 非线性特征的引入
b 情感词典的自动扩充
上面的文章结束了。
我的基于用户评论的短文本情感分析模型设计, 想借助上面的情感词典分析,在看看中文文本分析 SnowNLP包的原理,综合一下,可以寻找更好的优化思路。
有点想试一下老王的如何用Python和机器学习训练中文文本情感分类模型?,自己机器学习训练一下,开玩笑的,嘻嘻我懂什么机器学习。
文章的难点在于情感分析模型设计,数据的挖掘,收集都不难。模型设计是重点,对于情感的结果可以采用panads和matplotlib做出数据可视化。
老王也给出了情感分析的问题如下
例如你输入一些明确的负面情绪语句,得到的结果却很正面。
不要以为自己又被忽悠了。我来解释一下问题出在哪儿。
首先,许多语句的情感判定需要上下文和背景知识,因此如果这类信息缺乏,判别正确率就会受到影响。这就是人比机器(至少在目前)更强大的地方。
其次,任何一个情感分析工具,实际上都是被训练出来的。训练时用的是什么文本材料,直接影响到模型的适应性。
例如SnowNLP,它的训练文本就是评论数据。因此,你如果用它来分析中文评论信息,效果应该不错。但是,如果你用它分析其他类型的文本——例如小说、诗歌等,效果就会大打折扣。因为这样的文本数据组合方式,它之前没有见过。
解决办法当然有,就是用其他类型的文本去训练它。见多识广,自然就“见惯不怪”了。至于该如何训练,请和相关软件包的作者联系咨询。
幸好我的是短文本
参考文献
如何用Python做情感分析?
如何用Python做舆情时间序列可视化?
https://www.jianshu.com/p/29aa3ad63f9d
如何用Python做中文分词?
如何用Python提取中文关键词?
如何用Python和R对故事情节做情绪分析?
如何用Python做词云?