商品评论挖掘、电影推荐、股市预测……情感分析大有用武之地。本文帮助你一步步用Python做出自己的感情分析结果,难道你不想试试看?
如果你关注数据科学研究或是商业实践,“情感分析”(sentiment analysis)这个词你必须不陌生吧?
维基百科上,情感分析的定义是:
文本情感分析(也称为意见挖掘)是指用自然语言处理、文本挖掘或者计算机语言学等方式来甄别和提取原素材中的主观信息。
听着很大大上,是吧?如果说得具体一点呢?
给你一段文本情感分析,你就可以用情感分析的自动化方法获取这一段内容里包括的感情色彩是哪个。
神奇吧?
情感分析不是炫技工具。它是闷声发大财的方式。早在2010年,就有专家强调,可以借助Twitter公开信息的情感分析来推测股市的涨落,准确率高达87.6%!
在这种学者看来,一旦你无法获取大量即时社交媒体文本数据,且运用情感分析的黑魔法,你就取得了一颗预测近期投资行业趋势的水晶球。
这种用数据科学碾压竞争者的体会,是不是妙不可言啊?
大数据时代,我们可以获得的文本数据实在太多了。仅仅是大众点评、豆瓣和亚马逊上海量的评论信息就足够我们挥锹抡镐,深挖一通了。
你是不是疑惑,这么高深的技术,自己这个非计算机专业的文科生,如何能够应用呢?
不必担忧。从前情感分析还仅仅实验室或者大公司的独门技巧。现在已经飞入寻常百姓家。门槛的减少并且我们普通人也可以用Python的几行代码,完成长期文本的情感分析处理。
是不是摩拳擦掌,打算动手尝试了?
那我们就开始吧。
为了更好地使用Python和相关工具包,你必须先安装Anaconda套装。详细的流程方法请参考《如何用Python做词云》一文。
到你的平台“终端”(macOS, Linux)或者“命令提示符”(Windows)下,进入我们的工作目录demo,执行下面命令。
pip install snownlp
pip install -U textblob
python -m textblob.download_corpora
好了,至此你的情感分析运行环境尚未配置完毕。
在终端以及命令提示符下输入:
jupyter notebook
你会发现目录里之前的这些文件,忽略它们就好。
好了,下面我们就可以愉快地运用Python来撰写程序,做文本情感分析了。
我们先来看英文文本的情感分析。
这里我们必须用到的是TextBlob包。
其实,从上图可以看出,这个包可以做许许多多跟文本处理相关的事情。本文我们只专注于情感分析这一项。其他功能之后有时间我们再介绍。
我们新建一个Python 2笔记本,并且将其命名为“sentiment-analysis”。
先打算一下英文文本数据。
text = "I am happy today. I feel sad today."
这里我们输入了两句话,把它存入了text这个函数上面。学了十几年英语的你,应该立刻判断出这两句话的感情属性。第一句是“我现在很高兴”,正面;第二句是“我现在最伤心”,负面。
下面我们说说情感分析软件TextBlob能否正确辨识这两句话的情感属性。
首先我们呼唤TextBlob出来。
from textblob import TextBlob
blob = TextBlob(text)
blob
按Shift+Enter执行,结果似乎也是把这两句话原封不动打印了下来而已嘛。
别着急,TextBlob已经给我们把一段文本分成了不同的语句。我们不妨看看它的划分对不对。
blob.sentences
执行后输出结果如下:
划分无误。可是你可断句有啥了不起?!我要情感分析结果!
你如何这般着急啊?一步步来嘛。好,我们输出第一句的情感分析结果:
blob.sentences[0].sentiment
执行后,你会发现有意思的结果发生了:
情感极性0.8,主观性1.0。说明一下,情感极性的差异范围是[-1, 1],-1代表完全消极,1代表完全正面。
既然我说自己“高兴”,那情感分析结果是正面的就对了啊。
趁热打铁,我们看第二句。
blob.sentences[1].sentiment
执行后结果如下:
“沮丧”对应的情感极性是负的0.5,没毛病!
更有趣的是,我们还可以使TextBlob综合探讨出整段文本的情感。
blob.sentiment
执行结果是哪个?
给你10秒钟情感分析,猜猜看。
不卖关子了,是这种的:
你可能会觉得没有道理。怎么一句“高兴”,一句“沮丧”,合并上去最后会受到正向结果呢?
首先不同极性的词,在数值上是有差别的。我们必须可以找到比“沮丧”更为负面的词汇。而且这也符合逻辑,谁会这样“天上一脚,地下一脚”矛盾地表述自己这时的心态呢?
试验了英文文本情感分析,我们该回归母语了。毕竟,互联网上我们经常接触最多的文本,还是中文的。
中文文本探讨,我们使用的是SnowNLP包。这个包跟TextBlob一样,也是多才多艺的。
我们还是先打算一下文本。这次我们换2个形容词试试看。
text = u"我今天很快乐。我今天很愤怒。"
注意在引号里面我们加了一个字母u,它很重要。因为它提醒Python,“这一段我们输入的文本编码格式是Unicode,别搞错了哦”。至于文本编码格式的细节,有机会我们再具体聊。
好了,文本有了,下面我们令SnowNLP来工作吧。
from snownlp import SnowNLP
s = SnowNLP(text)
我们想看看SnowNLP能不能像TextBlob一样正确界定我们输入的语句,所以我们执行下面输出:
for sentence in s.sentences:
print(sentence)
执行的结果是这种的:
好的,看来SnowNLP对词语的界定是恰当的。
我们来看第一句的情感分析结果吧。
s1 = SnowNLP(s.sentences[0])
s1.sentiments
执行后的结果是:
看来“快乐”这个关键词真是很可表明问题。基本上得到满分了。
我们来看第二句:
s2 = SnowNLP(s.sentences[1])
s2.sentiments
执行结果如下:
这里你肯定看到了疑问——“愤怒”这个词表达了这么强烈的消极感情,为何得分仍然是正的?
这是因为SnowNLP和textblob的计分方法不同。SnowNLP的情感分析取值,表达的是“这句话代表正面感情的概率”。也就是说,对“我现在最愤怒”一句,SnowNLP认为,它表达正面感情的概率最低更低。
这么解释就合理多了。
学会了基本招式,很开心吧?下面你可以自己找一些中英文文本来实践情感分析了。
但是你或许很快还会碰到难题。例如你输入一些明确的消极心情语句,得到的结果仍最正面。
不要以为自己既被误导了。我来解释一下问题出在那里。
首先,许多词语的情感判断应该上下文和背景知识,因此即使这类信息缺失,判别正确率就会得到影响。这就是人比机器(至少在现在)更强大的地方。
其次,任何一个情感分析工具,实际上都是被训练起来的。训练时用的是何种文本材料,直接影响到模型的适应性。
例如SnowNLP,它的训练文本就是评论数据。因此,你既然用它来预测中文评论信息,效果需要不错。但是,如果你用它预测其它种类的文本——例如小说、诗歌等,效果才会大打折扣。因为这种的文本数据组合形式,它之前没有见过。
解决方法或许有,就是用其它类型的文本去练习它。见多识广,自然就“见惯不怪”了。至于该怎么训练,请跟相关软件包的作者联系咨询。
原文链接: