爬取過程在這裡:
Python爬取你好李煥英豆瓣短評并利用stylecloud制作更酷炫的詞雲圖
本文基于前文爬取生成的douban.txt,基于SnowNLP做情感分析。
依賴庫:
豆瓣鏡像比較快:
pip install snownlp -i http://pypi.douban.com/simple/ --trusted-host=pypi.douban.com/simple
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsATOfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SOyczM1QGOlN2Y3YWZmJmNzIDZkZTOmRWYyIWZlZWN38CXwIzLcdDMxIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjL5M3Lc9CX6MHc0RHaiojIsJye.png)
初識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()
輸出結果如下圖所示:
對應的情感傾向值如下(部分):
情感波動分析
接下來分析評論,每條評論的波動情況,代碼如下所示:
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代表好評,可以看出好評率很高。
改進
将情感區間從[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()
繪制圖形如下所示:
可以看到0以上好評的遠遠超出差評。