【python 自然語言處理】對胡歌【獵場】電視劇評論進行情感值分析
阿新 • • 發佈:2019-01-01
主要內容
1、什麼是SnowNLP?
2、SnowNLP可以幹哪些事兒?
3、如何進行情緒判斷?
4、獵場豆瓣熱門短評抓取。
5、獵場熱門短評情感分析。
6、附錄(python 畫詞雲圖)
什麼是SnowNLP?
snowNLP,可以分詞,標註,還可以進行情緒分析。
SnowNLP是一個python寫的類庫,可以方便的處理中文文字內容,是受到了TextBlob的啟發而寫的,由於現在大部分的自然語言處理庫基本都是針對英文的,於是寫了一個方便處理中文的類庫,並且和TextBlob不同的是,這裡沒有用NLTK,所有的演算法都是自己實現的,並且自帶了一些訓練好的字典。注意本程式都是處理的unicode編碼,所以使用時請自行decode成unicode。
SnowNLP可以幹哪些事兒?
- 1、分詞
- 2、詞性標註
- 3、斷句
- 4、情緒判斷
- 5、拼音
- 6、繁體轉簡體
- 7、關鍵詞抽取
- 8、概括總結文意
- 9、資訊量衡量
- 10、文字相似性
如何進行情緒判斷?
返回值為正面情緒的概率,
越接近1表示正面情緒
越接近0表示負面情緒
當值大於 0.5 時代表句子的情感極性偏向積極,當分值小於 0.5 時,情感極性偏向消極,當然越偏向兩邊,情緒越偏激。
一個例子:
# encoding: utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
from snownlp import SnowNLP
text1="這個人脾氣真壞,動不動就罵人"
text2='這個人脾氣真好,經常笑'
s1 = SnowNLP(text1.decode('utf-8'))
s2=SnowNLP(text2.decode('utf-8'))
print text1,s1.sentiments
print text2,s2.sentiments
"D:\Program Files\Python27\python.exe" D:/PycharmProjects/情感分析/情感分析測試例子.py
這個人脾氣真壞,動不動就罵人 0.0363076212908
這個人脾氣真好,經常笑 0.730173371865
Process finished with exit code 0
python 3.6 版本
import sys
import importlib
importlib.reload(sys)
from snownlp import SnowNLP
text1="這個人脾氣真壞,動不動就罵人"
text2='這個人脾氣真好,經常笑'
s1 = SnowNLP(text1)
s2=SnowNLP(text2)
print(text1,s1.sentiments)
print(text2,s2.sentiments)
豆瓣獵場短評爬蟲。
# encoding: utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import re
import requests
import codecs
import time
import random
from bs4 import BeautifulSoup
absolute = 'https://movie.douban.com/subject/26322642/comments'
absolute_url = 'https://movie.douban.com/subject/26322642/comments?start=20&limit=20&sort=new_score&status=P&percent_type='
url = 'https://movie.douban.com/subject/26322642/comments?start={}&limit=20&sort=new_score&status=P'
header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:54.0) Gecko/20100101 Firefox/54.0','Connection':'keep-alive'}
def get_data(html):
soup=BeautifulSoup(html,'lxml')
comment_list = soup.select('.comment > p')
next_page= soup.select('#paginator > a')[2].get('href')
date_nodes = soup.select('.comment-time')
return comment_list,next_page,date_nodes
if __name__ == '__main__':
########先登入豆瓣,把cookie複製放在cookie.txt
f_cookies = open('cookie.txt', 'r')
cookies = {}
for line in f_cookies.read().split(';'):
name, value = line.strip().split('=', 1)
cookies[name] = value
html = requests.get(absolute_url, cookies=cookies, headers=header).content
# print html
comment_list = []
# 獲取評論
comment_list, next_page,date_nodes= get_data(html)
soup = BeautifulSoup(html, 'lxml')
comment_list = []
while (next_page != []): #檢視“下一頁”的A標籤連結
print(absolute + next_page)
html = requests.get(absolute + next_page, cookies=cookies, headers=header).content
soup = BeautifulSoup(html, 'lxml')
comment_list, next_page,date_nodes = get_data(html)
with open(u"comments.txt", 'a+') as f:
for node in comment_list:
comment = node.get_text().strip().replace("\n", "")
print comment
f.writelines(comment + u'\n')
time.sleep(1 + float(random.randint(1, 100)) / 20)
獵場熱門短評情感分析
下面我們對獵場熱門短評基於原有 SnowNLP 進行積極和消極情感分類,讀取每段評論並依次進行情感值分析,最後會計算出來一個 0-1 之間的值。
# encoding: utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import numpy as np
from snownlp import SnowNLP
import matplotlib.pyplot as plt
comment = []
with open('comments.txt', mode='r') as f:
rows = f.readlines()
for row in rows:
if row not in comment:
comment.append(row.strip('\n'))
def snowanalysis(self):
sentimentslist = []
for li in self:
s = SnowNLP(li.decode('utf-8'))
print li
print s.sentiments
sentimentslist.append(s.sentiments)
plt.hist(sentimentslist, bins=np.arange(0, 1, 0.01))
plt.show()
if __name__ == '__main__':
snowanalysis(comment)
結論:通過熱門短評的情感分析,好評稍大於差評,獵場還是值得一看的。
附錄(python 畫詞雲圖)
# encoding: utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import jieba.analyse # 匯入結巴分詞
import numpy as np # numpy
from wordcloud import WordCloud, STOPWORDS # 詞雲工具和自帶的的停用詞
from PIL import Image # 圖片處理
import matplotlib.pyplot as plt
def handle(filename, stopword):
with open(filename, 'r') as f:
data = f.read()
wordlist = jieba.analyse.extract_tags(data, topK=100) # 分詞,取前100
wordStr = " ".join(wordlist)
print wordStr
hand = np.array(Image.open('hang1.jpg')) # 開啟一張圖片,詞語以圖片形狀為背景分佈
my_cloudword = WordCloud(
# wordcloud引數配置
width=1024,
height=768,
background_color = 'white', # 背景顏色
mask = hand, # 背景圖片
max_words = 300, # 最大顯示的字數
stopwords = stopword, # 停用詞
max_font_size = 100, # 字型最大值
font_path='simsun.ttc', # 設定中文字型,若是有中文的話,這句程式碼必須新增,不然會出現方框,不出現漢字
random_state=3, # 設定有多少種隨機生成狀態,即有多少種配色方案
)
my_cloudword.generate(wordStr) # 生成圖片
my_cloudword.to_file('wordcloud.png') # 儲存
plt.imshow(my_cloudword) # 顯示詞雲圖
plt.axis('off') # 是否顯示x軸、y軸下標
plt.show() # 顯示
if __name__ == '__main__':
handle('comments.txt', STOPWORDS)