# 資料分析專案-巴哈姆特動漫瘋彈幕分析 資料分析的日常實現:巴哈姆特動漫瘋的彈幕留言。 ## 專案概述 [巴哈姆特動漫瘋](https://ani.gamer.com.tw/)是一個免費收看,且付費訂閱已經超過10%的動漫平台。平台可以享受動漫即時更新的追劇體驗,且使用者登入後,可以邊看影片邊發言參與,留言多的話如同機關槍掃射瘋狂出現,這些留言被稱為「彈幕」。 透過分析彈幕的內容、情感、以及觀眾互動頻率,我們可以獲得對動漫的一些深入洞察,同時也展現了對於資料蒐集、分析與運用工具的能力。 ## 專案結構 > 描述你專案的目錄結構,以及每個檔案或資料夾的用途。這可以幫助其他使用者更好地理解你的專案組織和如何導覽。 ``` . ├── README.md # 本文件,說明專案的目的和使用方法 ├── requirements.txt # 定義專案需要的Python套件 ├── data # 存放原始資料和處理過的資料 │ ├── raw # 原始資料 │ └── processed # 處理過的資料 ├── scripts # 資料收集和處理的程式碼 ├── notebooks # Jupyter notebooks,包含資料探索和分析的程式碼 └── figures # 存放資料視覺化的圖表 ``` ## 安裝與使用方法 提供安裝和使用你的專案的指示。包括所需的相依套件、如何設置環境、安裝步驟和執行專案的指令。 - 你可以在requirements.txt文件中找到需要的套件。在終端機使用以下的命令來安裝: ``` pip install -r requirements.txt ``` - 本示範的requirements.txt包含套件與版本號如下: ``` playwright==1.35.0 beautifulsoup4==4.12.2 pandas==2.0.2 wordcloud==1.9.2 jieba==0.42.1 matplotlib==3.7.2 selenium==4.10.0 webdriver-manager==3.8.6 textblob==0.17.1 plotly==5.15.0 nbformat==5.9.0 ``` ## 資料收集 > 如果你的專案需要特定的資料集,這裡可以提供一些關於如何獲取、處理或下載資料的指示。 本專案的資料主要來自巴哈姆特動漫瘋的公開彈幕留言,利用動態網頁擷取工具(PlayWright)擷取。資料收集去識別化,以尊重所有使用者的隱私。 ### 使用Playwright模組,模擬網頁操作擷取彈幕 - 使用Playwright,需要安裝Playwright模組以及瀏覽器,該模組已經包含在`requirements.txt`之中。 - 接續安裝 playwright 所需要的瀏覽器,只需要一行指令: > 跟 selenium 相比,不用另起網頁安裝對應版本 ``` ! python -m playwright install ``` - 呼叫出瀏覽器與程式互動介面,以下兩種皆可 ``` # 用預設的瀏覽器 ! python -m playwright codegen # 用chrome ! python -m playwright codegen -b chromium ``` - 呼叫出瀏覽器與程式互動介面,操作過程會記錄在`codegen`,再將`codegen`輸出為`.py`的檔案 ``` ! python -m playwright codegen --target python -o ./script/damun.py -b webkit https://ani.gamer.com.tw/ ``` - 修改`damun.py`檔案,將彈幕解析結果整理為JSON結構的檔案,以列表推導式整理抓取資料。 ```python res = [ { 'userid': li.select_one('.name > span').text.strip(), 'text' : li.select_one('.sub_content').text.strip(), 'msg_time' : li.select_one('b').text.strip() } for li in soup.select('.sub-list-li')] ``` 其中userid以hash值去識別化 ```python import hashlib def anonymize_username(username): return hashlib.sha256(username.encode()).hexdigest() ``` 擷取及整理的成果檔案儲存在`../data/raw/damun_{sn}.json`路徑 ``` # write JSON data to a file with open(f'../data/raw/damun_{sn}.json', 'w') as f: json.dump(res, f) ``` ## 資料分析流程 這一部分描述你的資料分析流程,包括你使用的方法、模型或演算法。你可以提供程式碼片段或流程圖來幫助讀者理解你的分析過程。 - 資料首先整理為DataFrame格式,JSON可以很輕鬆地轉換成DataFrame ``` import pandas as pd df = pd.read_json('../data/damun_33846.json') ``` ![](https://hackmd.io/_uploads/rJHwWyvtn.png) - 接著透過`jieba`套件斷詞、用`WordCount`製作文字雲觀察詞頻。 - 透過`TextBlob`進行語意分析 - 以`matplotlib`與`ploty`視覺化呈現留言在影片的時間籌分布、留言數、情緒分析。 ## 結果展示 展示和解釋你的資料分析結果。可以包括圖表、視覺化效果或統計數據,並提供解釋和洞察。 ### 觀察文字雲 - 將所有留言透過`jieba`套件斷詞,在實作中保留所有符號,並且用`WordCount`製作文字雲觀察詞頻。 ![](https://hackmd.io/_uploads/HJ4vNuPY3.png) - 可以看到關鍵字居然是 Happy, BMG, Enging, YOASOBI...看文字雲猜得出影片大家最熱烈挑論的內容嗎? 文字雲可以讓你知道劇情概要! ### 觀察留言數量分佈 - 我們可以先看看10大留言者的留言數量 ``` df.groupby('userid').count().sort_values(by='text', ascending=False)[:10] ``` ![](https://hackmd.io/_uploads/HJu5bkvY3.png) - 可以看到第一名在不到25分鐘的影片留言82次,第2名也有42次,前10名幾乎在影片每分鐘都要留言一次。 ![](https://hackmd.io/_uploads/r1vWfywYh.png) - 通常熱留言者會有「字幕君」將片頭OP或片尾EP歌曲中日對照翻譯,超過字幕君的人表示真的很愛留言。多數人是在10則以內。 ![](https://hackmd.io/_uploads/SkPcUyPFn.png) - 大多數用戶的留言都在1則左右,也有一些用戶發送了2條或更多的消息。以下圖表只顯示了留言在1到10條之間的用戶,可能會有一些活躍用戶(發送了10條或更多消息的用戶)並未在圖中顯示出來。 ![](https://hackmd.io/_uploads/SydI-dDtn.png) ### 時間趨勢分析 - 因為影片大約25分鐘,以影片每分鐘作為一個刻度計算留言頻率。這集影片在片尾曲出現時留言爆量。 ![](https://hackmd.io/_uploads/rJKJryvY3.png) ![](https://hackmd.io/_uploads/Bk24BkDF2.png) ### 情緒分析 - 使用的情緒分析`TextBlob`來觀察每則留言的正向與負向(-1~+1),在此分析中多數無法分出正負向,多判別為中性,可能是需要進一步資料清理,或者需要更改分析套件。 ![](https://hackmd.io/_uploads/H1AVLyPF2.png) ![](https://hackmd.io/_uploads/Sy-PLyvYn.png)