1. 程式人生 > >【python 自然語言處理】對胡歌【獵場】電視劇評論進行情感值分析

【python 自然語言處理】對胡歌【獵場】電視劇評論進行情感值分析

主要內容

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)