Python 抖音評論數據抓取分析
張同學 10.4號開始發視頻,視頻的點贊量一直很高,11.17 號的視頻達到瞭頂峰,收獲 250w 個贊,之後關註量也開啟瞭暴漲。
所以挖掘 11.17 號視頻的評論,更有助於我們達成目的。另外,為方便大傢更好的學習爬蟲技術和數據可視化分析,完整版代碼我放在文末。
1. 抓取數據
抖音出瞭 web 版,抓取數據方便瞭很多。
抓評論
滑到網頁評論區,在瀏覽器網絡請求裡過濾包含comment
的請求,不斷刷新評論就可以看到評論的接口。
有瞭接口,就可以寫 Python 程序模擬請求,獲取評論數據。
請求數據要設置一定間隔,避免過大請求,影響別人服務
抓取評論數據有兩點需要註意:
- 有時候接口可能返回空數據,因此需要多試幾次,一般過瞭人工滑動驗證後的接口基本可用
- 不同頁面之間的數據可能會重復,所以需要跳頁請求
2. EDA
11.17 號的視頻有 12w 條評論,我隻抓取瞭 1w 多條。
text
列是評論。
先對數據做一些探索性的分析,之前介紹過幾個EDA
工具,可以自動產出基礎的數據統計和圖表。
這次我用的是ProfileReport
# 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
(喂狗
),占比最大,很多人評論是:以為要做給自己吃,沒想到是喂狗的。我看的時候也是這樣認為的。
其他各主題占比比較均勻。
經過主題分類後,我們可以發現,張同學不僅僅是農村生活引起瞭大傢的關註,更多的是視頻中大量反常態的鏡頭。
最後,用樹狀圖展示各主題及對應的具體評論。
核心代碼已經貼在文章裡,完整代碼如下方式領取。
代碼
鏈接:https://pan.baidu.com/s/1FnIgkW2b_uVtQq1Z-i8PJA
提取碼:1234
推薦閱讀:
- Python實現文本特征提取的方法詳解
- python機器學習算法與數據降維分析詳解
- python機器學習創建基於規則聊天機器人過程示例詳解
- python機器學習基礎特征工程算法詳解
- Python實現emoji表情的簡單方法