1. 程式人生 > 其它 >用Python分析張同學dy評論資料

用Python分析張同學dy評論資料

首先

相信有很多小夥伴都喜歡玩抖音吧,最近抖音張同學突然火了,兩個月漲粉一千多萬。看了他的視訊,滿滿的生活氣息,讓人有一種家的感覺。這就讓我很感興趣了,必須得用Python對他分析一下。

今天這篇文章,我抓取了張同學的視訊的評論資料,想從文字分析的角度,挖掘一下大家對張同學感興趣的點。

張同學 10.4號開始發視訊,視訊的點贊量一直很高,11.17 號的視訊達到了頂峰,收穫 250w 個贊,之後關注量也開啟了暴漲。

所以挖掘 11.17 號視訊的評論,更有助於我們達成目的。

1. 抓取資料

抖音出了 web 版,抓取資料方便了很多。

滑到網頁評論區,在瀏覽器網路請求裡過濾包含comment的請求,不斷重新整理評論就可以看到評論的介面。

有了介面,就可以寫 Python 程式模擬請求,獲取評論資料。

請求資料要設定一定間隔,避免過大請求,影響別人服務

抓取評論資料有兩點需要注意:

•有時候介面可能返回空資料,因此需要多試幾次,一般過了人工滑動驗證後的介面基本可用

•不同頁面之間的資料可能會重複,所以需要跳頁請求

2. EDA

11.17 號的視訊有 12w 條評論,我只抓取了 1w 多條。

text列是評論。

先對資料做一些探索性的分析,之前介紹過幾個EDA工具,可以自動產出基礎的資料統計和圖表。

這次我用的是ProfileReport

#
####Python學習交流Q群:906715085##### #eda profile = ProfileReport(df, title='張同學抖音評論資料', explorative=True) profile

 

評論時間分佈

從評論的時間分佈來看,由於釋出的視訊的時間是17號,所有17、18號評論釋出量比較多。不過再往後甚至到了 12.9 號,仍然有不少新評論產生,說明視訊熱度確實很高。

評論的長度分佈

大多數評論的字數在 20 以內,基本不超過 40 個字,說明都是短文字。

評論者身份

參與評論的人裡, 99.8% 是沒有認證身份的,說明評論使用者裡基本都是普通使用者。

3. LDA

上面的統計資料還是太粗略了。

但我們要想知道大家的感興趣點在哪,又不可能細到把 1.2w 條評論全部看完。

所以需要對這些評論先做一次歸類,相當於把資料升維,抽象。因為只有將資料升維,瞭解每個維度的含義和佔比,才能幫助我們從全域性角度掌握資料。

這裡我用LDA演算法對文字聚類,聚合在一起的評論可以看做屬於同一個主題。

LDA演算法的核心思想有兩點:

•具有一定相似性的文字會聚合在一起,形成一個主題。每個主題包含生成該主題需要的詞,以及這些詞的概率分佈。以此可以人為推斷出主題的類別。

•每篇文章會它有在所有主題下的概率分佈,以此可以推斷出文章屬於哪個主題。

比如,經過LDA演算法聚類後,某個主題中,戰爭、軍費這類詞出現概率很高,那麼我們可以將該主題歸類為軍事。如果有一篇文章屬於軍事主題的概率很高,我們就可以將該文章分為軍事一類。

簡單介紹完LDA的理論,下面我們來實戰一下。

3.1 分詞、去停用詞

#分詞

emoji = {'可憐', '發呆', '', '靈機一動', '擊掌', '送心', '泣不成聲', '哈欠', '舔屏', '偷笑', '愉快', '再見', '666', '熊吉', '尬笑', '吐舌', '撇嘴', '', '綠帽子', '捂臉', '呆無辜', '強壯', '震驚', '陰險', '', '給力', '打臉', '咖啡', '', '一起加油', '酷拽', '流淚', '黑臉', '愛心', '笑哭', '機智', '', '微笑袋鼠', '', '閉嘴', '來看我', '', '憨笑', '不失禮貌的微笑', '紅臉', '摳鼻', '調皮', '紫薇別走', '', '比心', '悠閒', '玫瑰', '抱拳', '小鼓掌', '握手', '奸笑', '害羞', '快哭了', '', '驚訝', '豬頭', '', '暗中觀察', '不看', '啤酒', '呲牙', '發怒', '絕望的凝視', '大笑', '吐血', '壞笑', '凝視', '可愛', '擁抱', '擦汗', '鼓掌', '勝利', '感謝', '思考', '微笑', '疑問', '我想靜靜', '靈光一閃', '白眼', '淚奔', ''}
stopwords = [line.strip() for line in open('stop_words.txt', encoding='UTF-8').readlines()]

def fen_ci(x):
    res = []
    for x in jieba.cut(x):
        if x in stopwords or x in emoji or x in ['[', ']']:
            continue
        res.append(x)
    return ' '.join(res)

df['text_wd'] = df['text'].apply(fen_ci)

 

由於評論中有許多 emoji 表情, 我抽取了所以 emoji 表情對應的文字,生成 emoji 陣列,用於過濾表情詞。

3.2 呼叫LDA

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.decomposition import LatentDirichletAllocation
import numpy as np

def run_lda(corpus, k):
    cntvec = CountVectorizer(min_df=2, token_pattern='\w+')
    cnttf = cntvec.fit_transform(corpus)
    
    lda = LatentDirichletAllocation(n_components=k)
    docres = lda.fit_transform(cnttf)
    
    return cntvec, cnttf, docres, lda
    
cntvec, cnttf, docres, lda = run_lda(df['text_wd'].values, 8)

 

經過多次試驗,將資料分成 8 類效果較好。

選取每個主題下出現概率 top20 的詞:

主題的詞分佈

從這些詞概率分佈,歸納各主題的類別,主題0 ~ 主題7分別是:居然看完、知道鑰匙在哪、農村生活、喂狗、拍攝手法、還用鎖門?、雞蛋放鹽多、襪子放枕頭下。

統計主題佔比:

主題佔比

紅色的是主題3(喂狗),佔比最大,很多人評論是:以為要做給自己吃,沒想到是喂狗的。我看的時候也是這樣認為的。

其他各主題佔比比較均勻。

經過主題分類後,我們可以發現,張同學不僅僅是農村生活引起了大家的關注,更多的是視訊中大量反常態的鏡頭。

最後,用樹狀圖展示各主題及對應的具體評論。

主題下的文章

圖太大,只截取了一部分。

從抓資料到分析,做得比較倉促。

核心程式碼已經貼在文章裡。完整程式碼還在整理,需要程式碼或者文章有疑問的朋友可以在評論區留言。應該很多人還是喜歡張同學的,這一篇就到這裡就莫得了。