前言
文本情感分析
(也称为意见挖掘)是指用自然语言处理、文本挖掘以及计算机语言学等方法来识别和提取原素材中的主观信息,其主要任务就是对文本中的主观信息(如观点、情感、态度、评价、情绪等)进行提取、分析、处理、归纳和推理。
当前的情感分析技术分流成两类,一是基于规则(情感词典)的方法
;二是基于统计学习的方法
。第一类情感分析根据情感词典所提供的词的情感倾向性信息,结合语言知识和统计信息,进行不同粒度下的文本情感分析。第二类方法主要研究如何在本文表示层面寻找更加有效的情感特征,以及如何在机器学习模型中合理地使用这些特征。与第一类相比,第二类方法虽沿袭了传统基于主体的文本分类框架,但存在一些特殊问题需要单独处理,如情感极性的转移和领域适应问题(宗成庆等,2019)。
具体一点就是,基于情感词典的情感分析,将文本中的词句与词典配对计算它的情感数值,例如可能“快乐”在某个词典中情感信息值为0.9。而基于统计学习的情感分析,需要用到机器学习的算法,将文本中的数据集先做情感评判,后去训练模型,再用训练好的模型去判断新的句子的情感是偏向“正情绪”还是“负情绪”。这一方法的核心是构造数据集,标注数据集,基于数据集进行特征提取(传统机器学习)或者深度学习自动特征提取后建模,再去做情感分析。
在这里,我们先了解基于情感词典的情感分析是如何进行的。主要用到snownlp
包来完成入门学习。SnowNLP是一个python写的类库,主要用于处理中文文本,可实现分词、词性标注、情感分析、汉字转拼音、繁体转简体、关键词提取以及文本摘要等等。
安装、导入snownlp
pip install snownlp #安装
from snownlp import SnowNLP #导入
分析句子的情感值
sentence1 = '我爱机器学习,我爱文本挖掘!'
s1 = SnowNLP(sentence1)
s1.sentiments
下一个句子
sentence2 = '我不舒服,很愤怒'
s2 = SnowNLP(sentence2)
s2.sentiments
如下图所示:
SnowNLP的结果取值范围在0到1之间,越接近1表示正面情绪;越接近0表示负面情绪。我们可以看到,句子1得到了0.999的评价,是非常积极的;句子2得到了0.083的评价,是非常消极的。
简单对某餐厅评论做情感分析
在这里用我事先准备好的对某餐厅的十几条评论,保存在excel文件中,如图:
# 读如数据并显示数据的前五条
import pandas as pd
df = pd.read_excel("comments.xlsx")
df.head()
如下图所示:
然后我们可以试着看看第一个评论的情感分析结果。
text = df.comments.iloc[0]
from snownlp import SnowNLP
s = SnowNLP(text)
s.sentiments
如下图所示:
试着看第二个评论的情感分析结果:
text = df.comments.iloc[1]
from snownlp import SnowNLP
s = SnowNLP(text)
s.sentiments
如下图所示:
可以看到,第一个评论评分非常积极,而第二个评论则相对消极,从内容看直观盘判断这是合理的。
在此基础上,我们可以定义函数,批量处理所有的评论信息。
def get_sentiment_cn(text):
s = SnowNLP(text)
return s.sentiments
df["sentiment"] = df.comments.apply(get_sentiment_cn)
df.head()
如下图所示:
通过mean()函数可以知道评论的平均值。
df.sentiment.mean()
如下图所示:
然后我们可以借助matplotlib画出时间的趋势图
x=df["data"]
y=df["sentiment"]
plt.figure(figsize=(20, 8), dpi=80)
plt.plot(x, y)
plt.show()
如下图所示:
可以看到2020-03-10这天评论的情感分析得分是最低的,我们想看看是怎么回事。
通过排序,找到情感分析得分倒数第一位的评论,并将内容打印出来:
df.sort_values(['sentiment'])[:1]
print(df.sort_values(['sentiment']).iloc[0].comments)
如下图所示:
得到这个结果,牛排店就可以按照评论的情况,去寻找出现问题的原因了。
后记
以上就是用python的snownlp包进行简单情感分析的过程。未来继续探索基于机器学习的情感分析过程,做运用于特定问题的情景之中的情感分析。本次学习参考了宗成庆等人著的《文本数据挖掘》(清华大学出版社,2019年版),分析过程主要借鉴了文科生数据科学上手指南中自然语言处理相应的部分,以及Python_文本分析入门_SnowNLP(1),初学者|今天掌握SnowNLP好不好等网站的辅助,感谢前人的分享。
此外,Github官网的信息也是重要资料。
看了你的系列分享,哈哈哈,很受用,很多也是我关注的方法,例如社会网络、政策评估、结构方程模型,有兴趣可以一起交流!!!
你好,我想知道如何通过读取本地excel从而分析情感倾向呢,我看您这个没有读取过程啊
你好,将ipynb文件与数据文件comments.xlsx放在同一文件夹下,可导入pandas后直接用df = pd.read_excel("comments.xlsx")读取。如文中下列内容:
# 读如数据并显示数据的前五条
import pandas as pd
df = pd.read_excel("comments.xlsx")
df.head()
您好,请问这种方式分析的数据可以再输出成excel表格吗
你好,问下如果我用bilstm给情绪预测,也可以预测出一个个分数吗,而不是0-1分类吗?
麻烦问一下,我选择了分析全部文本的,但是报错TypeError: object of type 'float' has no len(),请问我该怎么改正?