Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析

时间:2023-03-09 22:13:43
Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析

爬取过程在这里:

Python爬取你好李焕英豆瓣短评并利用stylecloud制作更酷炫的词云图

本文基于前文爬取生成的douban.txt,基于SnowNLP做情感分析。


依赖库:

豆瓣镜像比较快:

pip install snownlp -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple

Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析


初识SnowNLP:

SnowNLP是一个常用的Python文本分析库,是受到TextBlob启发而发明的。由于当前自然语言处理库基本都是针对英文的,而中文没有空格分割特征词,Python做中文文本挖掘较难,后续开发了一些针对中文处理的库,例如SnowNLP、Jieba、BosonNLP等。

Snownlp主要功能包括:

  • 中文分词(算法是Character-Based Generative Model)
  • 词性标注(原理是TnT、3-gram 隐马)
  • 情感分析
  • 文本分类(原理是朴素贝叶斯)
  • 转换拼音、繁体转简体
  • 提取文本关键词(原理是TextRank)
  • 提取摘要(原理是TextRank)、分割句子
  • 文本相似(原理是BM25)

情感分析实战:

SnowNLP情感分析是基于情感词典实现的,其简单的将文本分为两类,积极和消极,返回值为情绪的概率,也就是情感评分在[0,1]之间,越接近1,情感表现越积极,越接近0,情感表现越消极。

下面对爬取的豆瓣电影《你好李焕英》评论进行情感分析。

情感各分数段出现频率

首先统计各情感分数段出现的评率并绘制对应的柱状图。

对douban.txt文件逐行进行情感倾向值计算,代码如下:

 1 # -*- coding: utf-8 -*-
2 # -*- coding: utf-8 -*-
3 from snownlp import SnowNLP
4 import matplotlib.pyplot as plt
5 import numpy as np
6
7 source = open("douban.txt","r", encoding='utf8')
8 line = source.readlines()
9 sentimentslist = []
10 for i in line:
11 s = SnowNLP(i)
12 print(s.sentiments)
13 sentimentslist.append(s.sentiments)
14
15
16 plt.hist(sentimentslist, bins = np.arange(0, 1, 0.01), facecolor = 'g')
17 plt.xlabel('Sentiments Probability')
18 plt.ylabel('Quantity')
19 plt.title('Analysis of Sentiments')
20 plt.show()

输出结果如下图所示:
Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析

对应的情感倾向值如下(部分):
Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析

情感波动分析

接下来分析评论,每条评论的波动情况,代码如下所示:

 1 # -*- coding: utf-8 -*-
2 # 区间[0,1]
3 from snownlp import SnowNLP
4
5 import matplotlib.pyplot as plt
6 import numpy as np
7
8 source = open("douban.txt","r", encoding='utf8')
9 line = source.readlines()
10 sentimentslist = []
11 for i in line:
12 s = SnowNLP(i)
13 print(s.sentiments)
14 sentimentslist.append(s.sentiments)
15
16
17 plt.plot(np.arange(0, 166, 1), sentimentslist, 'b-')
18 plt.xlabel('Number')
19 plt.ylabel('Sentiment')
20 plt.title('Analysis of Sentiments')
21 plt.show()

输出结果如下所示,接近1.0代表好评,可以看出好评率很高。
Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析

改进

将情感区间从[0, 1.0]转换为[-0.5, 0.5],这样的曲线更加直观,位于0以上的是积极评论,反之消极评论。
修改代码如下:

 1 # -*- coding: utf-8 -*-
2 import matplotlib.pyplot as plt
3 import numpy as np
4
5 from snownlp import SnowNLP
6
7
8 #获取情感分数
9 source = open("douban.txt","r", encoding='utf8')
10 line = source.readlines()
11 sentimentslist = []
12 for i in line:
13 s = SnowNLP(i)
14 print(s.sentiments)
15 sentimentslist.append(s.sentiments)
16
17 #区间转换为[-0.5, 0.5]
18 result = []
19 i = 0
20 while i<len(sentimentslist):
21 result.append(sentimentslist[i]-0.5)
22 i = i + 1
23
24 #可视化画图
25
26 plt.plot(np.arange(0, 166, 1), result, 'r-')
27 plt.xlabel('Number')
28 plt.ylabel('Sentiment')
29 plt.title('Analysis of Sentiments')
30 plt.show()

绘制图形如下所示:

Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析

可以看到0以上好评的远远超出差评。

爬取猫眼电影,此刻的《你好李焕英》票房已经超过46忆!!!
Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析

Python爬取《你好李焕英》豆瓣短评并基于SnowNLP做情感分析