1. 程式人生 > >網易雲音樂“王牌冤家”使用者評論:評論爬蟲及情感分析(SnowNLP)

網易雲音樂“王牌冤家”使用者評論:評論爬蟲及情感分析(SnowNLP)

李榮浩上週發的《耳朵》專輯,你萌聽了嗎?小編真的超級喜歡“王牌冤家”這首歌,在新說唱聽了李老師的那幾句就一直念念不忘,這一週可是一直單曲迴圈中。恰好前兩天看了SnowNLP的一點東西,所以,這一次基於這首歌的評論,來做個非常easy的情感分析。文字資訊是選取的網易雲音樂下的評論,所以本文是爬蟲+分析。

爬蟲

網易雲音樂上萬首hiphop歌曲解析rapper們的最愛(爬蟲篇)一文中,我們基於selenium爬取了歌單,歌曲和歌詞的資訊,本來在評論的爬取也可以選擇selenium的方式,但是,小編上網一搜,就找到評論的API,這可就非常簡單了。

Step 1:在網頁開啟需要爬取歌曲的介面:

這個歌曲ID非常重要,而,目前,我們僅需要這一個資訊就OK了。

Step 2:上API:

http://music.163.com/api/v1/resource/comments/R_SO_4_862129612?limit=20&offset=0

API其實是

http://music.163.com/api/v1/resource/comments/R_SO_4_歌曲ID?limit=每頁展示評論數量&offset=(頁數-1)*20.

是不是對於API下的程式碼有點看不懂,沒關係,你可以把這些程式碼貼上到一個json解碼網站,比如說

這麼是不是自己想要爬取的資訊更直觀了。

Step 3:上程式碼

import requests
import json
import time
import random
import pandas as pd

#下載第一頁資料
def get_one_page(url):
    headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36'
    }
    response = requests.get(url,headers=headers)
    if response.status_code == 200:  #頁面正常響應
        return response.text # 返回頁面原始碼
    return None


commentId=[]
nickname=[]
userId=[]
content=[]
likedCount=[]

#解析第一頁資料
def parse_ono_page(html):
    data = json.loads(html)['comments'] #評論以json形式儲存,故以json形式擷取
    for item in data:
        commentId.append(item['commentId']),#評論id
        nickname.append(item['user']['nickname']),#評論使用者的暱稱
        userId.append(item['user']['userId']),#評論使用者的id
        content.append(item['content']),#評論內容
        likedCount.append(item['likedCount'])#點贊數


#儲存資料到文字文件
def save_to_txt():
    for i in range(1, 755):
        url='http://music.163.com/api/v1/resource/comments/R_SO_4_862129612?limit=20&offset=' + str(20*(i-1))
        html = get_one_page(url)
        print('正在儲存第%d頁.'% i)
        parse_ono_page(html)
        time.sleep(5 + float(random.randint(1,100)) /20)             
if __name__ =='__main__':
    save_to_txt()
wangpai = {'commentId': commentId, 'nickname': nickname, 'userId': userId, 'content': content, 'likedCount':likedCount}
wangpai = pd.DataFrame(wangpai, columns=['commentId', 'nickname', 'userId', 'content','likedCount'])
wangpai.to_csv("wangpaiyuanjia.csv",encoding="utf_8_sig",index = False) 

爬蟲部分,done!

分析

這裡小編用到了SnowNLP,官方介紹是:SnowNLP是一個python寫的類庫,可以方便的處理中文文字內容,是受到了TextBlob的啟發而寫的,由於現在大部分的自然語言處理庫基本都是針對英文的,於是寫了一個方便處理中文的類庫,並且和TextBlob不同的是,這裡沒有用NLTK,所有的演算法都是自己實現的,並且自帶了一些訓練好的字典。注意本程式都是處理的unicode編碼,所以使用時請自行decode成unicode。簡單的說,SnowNLP就是可以中文自然語言處理庫,可以完成中文分析,詞性標註,情感分析,等等功能。

在本文,我們僅藉助其對評論進行情感分析,舉一個簡單的例子:

s1 = '我喜歡,作曲作詞我都好喜歡'
s2 = '一般般'
s3 = '感覺水平下降了好多,不好聽'
print('s1: ',SnowNLP(s1).sentiments)
print('s2: ',SnowNLP(s2).sentiments)
print('s3: ',SnowNLP(s3).sentiments)
#s1:  0.9574420076803888
#s2:  0.5033557046979866
#s3:  0.183861270052044 

給出的情感評分在[0,1]之間,越接近1,情感表現越積極,越接近0,情感表現越消極。所以,我們將所有的評論都計算了情感得分,並將大於0.5的歸於正向情感,反之則為負向情感。程式碼如下:

from snownlp import SnowNLP
data = pd.read_csv("wangpaiyuanjia.csv",lineterminator='\n')
data["semiscore"] = data['content'].apply(lambda x: SnowNLP(x).sentiments)
data['semilabel'] = data["semiscore"].apply(lambda x: 1 if x>0.5 else -1)
 
import numpy as np
import matplotlib.pyplot as plt
plt.hist(data["semiscore"], bins = np.arange(0, 1.01, 0.01),label="semisocre", color="#ff9999")
plt.xlabel("semiscore")
plt.ylabel("number")
plt.title("The semi-score of comment")
plt.show()


semilabel = data["semilabel"].value_counts()
plt.bar(semilabel.index,semilabel.values,tick_label=semilabel.index,color='#90EE90')
plt.xlabel("semislabel")
plt.ylabel("number")
plt.title("The semi-label of comment")
plt.show()

基於情感的得分,我們得到下圖:

非常直觀,大家對“王牌冤家”這首歌喜歡的人居多,和我一樣,非常喜歡的人數也是相當可觀的。那麼以0.5為界限進行劃分後呢:

正向情感的人數是負向情感人數的兩倍多。作為粉絲,非常欣慰啊。

這裡,再對這些評論做一個簡單的詞雲圖吧,詞雲圖主要是jieba分詞,因為SnowNLP分詞的效果不如jieba。如下:

import jieba
comment=''.join(data['content'])
wordlist = jieba.cut(comment, cut_all=False)
stopwords_chinese = [line.strip() for line in open('stopwords_chinese.txt',encoding='UTF-8').readlines()]
#過濾點單個字
word_list=[]
for seg in wordlist:
    if seg not in stopwords_chinese:
        word_list.append(seg)

word_list=pd.DataFrame({'comment':word_list})
word_rank = word_list["comment"].value_counts()


from pyecharts import WordCloud
wordcloud_chinese = WordCloud(width=1500, height=820)
wordcloud_chinese.add("", word_rank.index[0:100], word_rank.values[0:100], word_size_range=[20, 200], is_more_utils=True)
wordcloud_chinese.render("comment.html")

結語

結合之前寫的關於rap歌詞的三篇文章,好像把網易雲音樂相關能爬的資訊都爬了,。網頁爬蟲,小編寫了很多了,之後,小編給大家帶來一些不一樣的爬蟲吧。

更多內容,關注:經管人學資料分析