天天看點

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以上好評的遠遠超出差評。