如何批量处理评论信息情感分析,而且在时间轴上可视化呈现?舆情分析并不难,让咱们用Python来实现它吧。python
你是一家连锁火锅店的区域经理,很注重顾客对餐厅的评价。从前,你苦恼的是顾客不爱写评价。最近由于餐厅火了,分店愈来愈多,写评论的顾客也多了起来,因而你新的痛苦来了——评论太多了,读不过来。git
从我这儿,你了解到了情感分析这个好用的自动化工具,一会儿以为见到了曙光。github
你从某知名点评网站上,找到了本身一家分店的页面,让助手把上面的评论和发布时间数据弄下来。由于助手不会用爬虫,因此只能把评论从网页上一条条复制粘贴到Excel里。下班的时候,才弄下来27条。(注意这里咱们使用的是真实评论数据。为了不对被评论商家形成困扰,统一将该餐厅的名称替换为“A餐厅”。特此说明。)bash
好在你只是想作个试验而已,将就了吧。你用我以前介绍的中文信息情感分析工具,依次得出了每一条评论的情感数值。刚开始作出结果的时候,你很兴奋,以为本身找到了舆情分析的终极利器。微信
但是美好的时光老是短暂的。很快你就发现,若是每一条评论都分别运行一次程序,用机器来作分析,还真是不如本身挨条去读省事儿。app
怎么办呢?机器学习
办法天然是有的。咱们能够利用《贷仍是不贷:如何用Python和机器学习帮你决策?》一文介绍过的数据框,一次性处理多个数据,提高效率。函数
可是这还不够,咱们还能够把情感分析的结果在时间序列上可视化出来。这样你一眼就能够看见趋势——近一段时间里,你们是对餐厅到底是更满意了,仍是愈来愈不满意呢?工具
咱们人类最擅长处理的,就是图像。由于漫长的进化史逼迫咱们不断提高对图像快速准确的处理能力,不然就会被环境淘汰掉。所以才会有“一幅图赛过千言万语”的说法。post
首先,你须要安装Anaconda套装。详细的流程步骤请参考《 如何用Python作词云 》一文。
助手好不容易作好的Excel文件restaurant-comments.xlsx
,请从这里下载。
用Excel打开,若是一切正常,请将该文件移动到我们的工做目录demo下。
由于本例中咱们须要对中文评论做分析,所以使用的软件包为SnowNLP。情感分析的基本应用方法,请参考《如何用Python作情感分析?》。
到你的系统“终端”(macOS, Linux)或者“命令提示符”(Windows)下,进入咱们的工做目录demo,执行如下命令。
pip install snownlp
pip install ggplot
复制代码
运行环境配置完毕。
在终端或者命令提示符下键入:
jupyter notebook
复制代码
若是Jupyter Notebook正确运行,下面咱们就能够开始编写代码了。
咱们在Jupyter Notebook中新建一个Python 2笔记本,起名为time-series。
首先咱们引入数据框分析工具Pandas,简写成pd以方便调用。
import pandas as pd
复制代码
接着,读入Excel数据文件:
df = pd.read_excel("restaurant-comments.xlsx")
复制代码
咱们看看读入内容是否完整:
df.head()
复制代码
结果以下:
注意这里的时间列。若是你的Excel文件里的时间格式跟此处同样,包含了日期和时间,那么Pandas会很是智能地帮你把它识别为时间格式,接着往下作就能够了。
反之,若是你获取到的时间只精确到日期,例如"2017-04-20"这样,那么Pandas只会把它当作字符串,后面的时间序列分析没法使用字符串数据。解决办法是在这里加入如下两行代码:
from dateutil import parser
df["date"] = df.date.apply(parser.parse)
复制代码
这样,你就得到了正确的时间数据了。
确认数据完整无误后,咱们要进行情感分析了。先用第一行的评论内容作个小实验。
text = df.comments.iloc[0]
复制代码
而后咱们调用SnowNLP情感分析工具。
from snownlp import SnowNLP
s = SnowNLP(text)
复制代码
显示一下SnowNLP的分析结果:
s.sentiments
复制代码
结果为:
0.6331975099099649
复制代码
情感分析数值能够正确计算。在此基础上,咱们须要定义函数,以便批量处理全部的评论信息。
def get_sentiment_cn(text):
s = SnowNLP(text)
return s.sentiments
复制代码
而后,咱们利用Python里面强大的apply语句,来一次性处理全部评论,而且将生成的情感数值在数据框里面单独存为一列,称为sentiment。
df["sentiment"] = df.comments.apply(get_sentiment_cn)
复制代码
咱们看看情感分析结果:
df.head()
复制代码
新的列sentiment已经生成。咱们以前介绍过,SnowNLP的结果取值范围在0到1之间,表明了情感分析结果为正面的可能性。经过观察前几条数据,咱们发现点评网站上,顾客对这家分店评价整体上仍是正面的,并且有的评论是很是积极的。
可是少许数据的观察,可能形成咱们结论的偏颇。咱们来把全部的情感分析结果数值作一下平均。使用mean()
函数便可。
df.sentiment.mean()
复制代码
结果为:
0.7114015318571119
复制代码
结果数值超过0.7,总体上顾客对这家店的态度是正面的。
咱们再来看看中位数值,使用的函数为median()
。
df.sentiment.median()
复制代码
结果为:
0.9563139038622388
复制代码
咱们发现了有趣的现象——中位数值不只比平均值高,并且几乎接近1(彻底正面)。
这就意味着,大部分的评价一边倒表示很是满意。可是存在着少部分异常点,显著拉低了平均值。
下面咱们用情感的时间序列可视化功能,直观查看这些异常点出如今什么时间,以及它们的数值究竟有多低。
咱们须要使用ggplot绘图工具包。这个工具包本来只在R语言中提供,让其余数据分析工具的用户羡慕得流口水。幸亏,后来它很快被移植到了Python平台。
咱们从ggplot中引入绘图函数,而且让Jupyter Notebook能够直接显示图像。
%pylab inline
from ggplot import *
复制代码
这里可能会报一些警告信息。没有关系,不理会就是了。
下面咱们绘制图形。这里你能够输入下面这一行语句。
ggplot(aes(x="date", y="sentiment"), data=df) + geom_point() + geom_line(color = 'blue') + scale_x_date(labels = date_format("%Y-%m-%d"))
复制代码
你能够看到ggplot的绘图语法是多么简洁和人性化。只须要告诉Python本身打算用哪一个数据框,从中选择哪列做为横轴,哪列做为纵轴,先画点,后连线,而且能够指定连线的颜色。而后,你须要让X轴上的日期以何种格式显示出来。全部的参数设定跟天然语言很类似,直观并且易于理解。
执行后,就能够看到结果图形了。
在图中,咱们发现许多正面评价情感分析数值极端的高。同时,咱们也清晰地发现了那几个数值极低的点。对应评论的情感分析数值接近于0。这几条评论,被Python断定为基本上没有正面情感了。
从时间上看,最近一段时间,几乎每隔几天就会出现一次比较严重的负面评价。
做为经理,你可能如坐针毡。但愿尽快了解发生了什么事儿。你不用在数据框或者Excel文件里面一条条翻找情感数值最低的评论。Python数据框Pandas为你提供了很是好的排序功能。假设你但愿找到全部评论里情感分析数值最低的那条,能够这样执行:
df.sort(['sentiment'])[:1]
复制代码
结果为:
情感分析结果数值几乎就是0啊!不过这里数据框显示评论信息不彻底。咱们须要将评论总体打印出来。
print(df.sort(['sentiment']).iloc[0].comments)
复制代码
评论完整信息以下:
此次是在情人节当天过去的,之前历来没在情人节正日子出来过,不是由于没有男友,而是感受哪哪人都多,因此特地错开,此次实在是馋A餐厅了,因此赶在正日子也出来了,从下午四点多的时候我看排号就排到一百多了,我从家开车过去得堵的话一个小时,我一看提早两个小时就在网上先排着号了,差很少咱们是六点半到的,到那的时候我看号码前面还有才三十多号,我想着确定没问题了,等一会就能吃上的,没想到悲剧了,就从咱们到那坐到等位区开始,大约是十分二十分一叫号,中途屡次我都想走了,哈哈,哎,等到最后早上九点才吃上的,服务员感受也没之前悠闲时周到了,不过这确定的,一人负责好几桌,今天节日这么多人,确定是很累的,因此大多也都是我本身跑腿,没让服务员给弄太多,就虾滑让服务员下的,而后环境来讲感受卫生方面是不错,就是有些太吵了,味道仍是一如既往的那个味道,不过A餐厅最人性化的就是看咱们等了两个多小时,上来送了咱们一张打折卡,并且当次就可使用,这点感受仍是挺好的,不愧是A餐厅,就是比通常的要人性化,不过此次就是选错日子了,之后仍是得提早预定,要不就别赶节日去,太火爆了!
经过阅读,你能够发现这位顾客确实有了一次比较糟糕的体验——等候的时间太长了,以致于使用了“悲剧”一词;另外还说起服务不够周到,以及环境吵闹等因素。正是这些词汇的出现,使得分析结果数值很是低。
好在顾客很通情达理,并且对该分店的人性化作法给予了正面的评价。
从这个例子,你能够看出,虽然情感分析能够帮你自动化处理不少内容,然而你不能彻底依赖它。
天然语言的分析,不只要看表达强烈情感的关键词,也须要考虑到表述方式和上下文等诸多因素。这些内容,是如今天然语言处理领域的研究前沿。咱们期待着早日应用到科学家们的研究成果,提高情感分析的准确度。
不过,即使目前的情感分析自动化处理不能达到很是准确,却依然能够帮助你快速定位到那些可能有问题的异常点(anomalies)。从效率上,比人工处理要高出许多。
你读完这条评论,长出了一口气。总结了经验教训后,你决定将人性化的服务贯彻到底。你又想到,能够收集用户等候时长数据,用数据分析为等待就餐的顾客提供更为合理的等待时长预期。这样就能够避免顾客一直等到很晚了。
祝贺你,经理!在数据智能时代,你已经走在了正确的方向上。
下面,你该认真阅读下一条负面评论了……
除了情感分析和时间序列可视化,你以为还能够如何挖掘中文评论信息?除了点评网站以外,你还知道哪些舆情分析的数据来源?欢迎留言分享给你们,咱们一块儿交流讨论。
喜欢请点赞。还能够微信关注和置顶个人公众号“玉树芝兰”(nkwangshuyi)。
若是你对数据科学感兴趣,不妨阅读个人系列教程索引贴《如何高效入门数据科学?》,里面还有更多的有趣问题及解法。