分享

Data Mining Final Exam:四位人選中誰在PTT最受定居外國鄉民歡迎?其中的網路聲量又是誰最高?

TianZhang
Jun 19, 2019·11 min read
本文僅作為台中科技大學 Data mining Final Exam 報告使用
僅討論網路聲量,不追究其正向或負向,因為很麻煩
前言:
這次選用了四位2020年預期總統候選人,分別是 柯文哲、蔡英文、郭台銘、韓國瑜,希望能透過他們四位在PTT上討論的熱度,希望從中得到些資料,希望可以從中找到關於這四位人選粉絲們的一些蛛絲馬跡。
圖片轉自網路
資料:
至從6/13日起 PTT八卦版開始了推文顯示IP,讓跳板仔和公關公司無所遁形
( https://www.ptt.cc/bbs/Gossiping/M.1560407238.A.264.html)
那我們這次的資料為何呢? 就是6/13起對所有關於四位人選的爆文的篇數,一開始的目標篇數是每位100篇,預期這樣至少可以取得每位至少1萬筆的推文數,以避免不公,但畢竟是6/13才開啟推文的IP顯示,所以每個人僅能得到約10筆左右的爆文,而很可惜的,郭先生就算包含沒有IP顯示的文章也沒有達到100篇爆文僅只有86篇,再6/13之後的相關爆文更只有3篇,原本以為這樣會造成整體計算上對他的聲量較為不公,但比較完結果也出乎我意料之外,故最後決定改成從新制上線起的每篇相關爆文都列入考量,而其最後的結果為柯:9篇 蔡:10篇 郭:3篇 韓:13篇 皆在6/17號由筆者統計完,因文章是開放性的故推文數會稍微有點出入,請見諒。
執行前的預測:
在還沒動手之前僅僅看資料來說,大膽預測國外鄉民討論度最高的會是,而筆者也估計的整體聲量會是最高的,而後續總網路聲量的預測結果排序應該是是 韓 > 蔡 >柯> 郭,畢竟資料量大,有了基礎數據的支持,相對較高應該也是合理的,當然後面處理的部分筆者會盡量去做公平化,那接下來上網用一些現成的工具來做一下賽前推測其結果如下兩張圖
兩張圖分別是在網路溫度計跟Google Trends做出的聲量結果,網路溫度計上面指出網路聲量 韓>蔡>柯>郭 而Google Trends因為是用關鍵字去做資料計算不知道會不會有所差別,而明顯的兩個峰點來自於去年的六都選舉以及今年4/17宣布參選總統開始拉高聲量 於是Google Trends 的分析結果為 韓>蔡>郭>柯 ,故目前筆者的預測跟網路溫度計是一致的!
開始動手實作
以下畫面使用Atom Editor且由Python 3.7.0版本完成運行
以上是筆者所用到的所有import模組
先利用Requests 抓到網頁原始碼
這邊要注意的是因為抓的網頁進入前有一個"同意是否滿18歲"這時候就要按下按下 F12 然後找到Network 裡面會有個over18的選項,這時候就可以判斷over18 cookies的值就是踏入看板的關鍵,而利用request進行看板的搜尋也是同理!
踏入看板的關鍵
接下來一般情況下瀏覽器拿到了網頁原始碼之後,會先解析然後把畫面顯示成我們平常看見的樣子;但這邊我們並不做顯示只想分析原始碼內的資訊。所以用 requests_html.HTML 來分析剛剛抓到的文字,在 HTML() 的建構式參數放入 html=剛剛 requests.Response 裡的 html 也就是 resp.text。再藉由我們打開瀏覽器查看網頁原始碼 (可用F12開發人員工具) 得知 PTT 網頁版中,每一篇文章的推文回覆皆放在 class="push"div 標籤裡。這裡我們使用到 find 方法與 CSS selector 語法來操作 HTML() 物件並指定尋找目標,找到之後的結果是一串串回文資訊。那在 CSS 中,想要找到 class"push" 且元素為 div 的語法是 div.push,在操作 find() 時直接將一模一樣的語法字串放進去即可達成目標。
找到推文的關鍵屬性div.push
而因為 HTML 本來就是具有階層式的標記語言,可以透過觀察剛剛 開發人員工具Elements 頁籤來判斷到底放在哪個標籤哪一階層裡,例如:推文就在 
這個標籤下。所以接下來就是對每個 entry 進行近一步的解析,而對應的 CSS selector 語法為 div.title 並且是操作於 entry 物件上。而因為.find() 會回傳一串的結果但在這邊 的解析中,我們通常最後只會選中唯一元素,所以增加一個 first=True 參數讓它直接回傳該結果元素。
依序為推噓文/作者ID/內容ID/回覆IP及時間
而這邊為避免浪費篇幅僅展示抓內文的程式碼部分,文章的抓取大同小異,不多贅述但因為實際文章抓取上可能會出現文章被刪除而產生Attribute Error
這邊提供筆者找到的解決辦法,如下圖
那終於都得到了我們想要的資料後就是開始進行分析了,首先是呼應標題的鄉民地區調查,將我們剛剛拿到的push-ipdatetime 拿去做切割 僅拿出我們要的IP位址 再丟去IP檢測網站上坐定位分析判斷該留言是不是在台灣境內
(以為例)將IP及時間切割丟入清單
統計總人數及非台灣人數
這邊因網站的限制不得不做delay而四位人選加起來有近兩萬筆回文,跑完一輪就要花近4個小時,所以只再6/18跑完資料作出統計而已避免耽誤報告時間而後續得到的結果分別是如下4張圖順序為 韓 蔡 柯 郭
韓國瑜的外國討論回文
蔡英文的外國討論回文
柯文哲的外國討論回文
郭台銘的外國討論回文
怕圖片不清做個簡單的比較表好了~
韓:文章數為13篇 總數量為8109 其中302來自國外 比例約為3.7%
蔡:文章數為10篇 總數量為4107 其中123來自國外 比例約為2.9%
柯:文章數為09篇 總數量為5199 其中172來自國外 比例約為3.3%
郭:文章數為03篇 總數量為1382 其中29來自國外 比例約為2.1%

而國外地區中 蔡和韓的外國比例最多的是來自US,
柯的則是來自DE最多(德國柯粉的力量?
郭的則是較為平均 沒有特別突出 都略再2-4筆
因為圖片好像被覆蓋掉了所以沒有存到QQ,再跑一輪又太浪費時間,所以算了吧XD

這邊先小結一下講一下國外討論度好了
單論國外鄉民討論度來講整體上差異是不大的,韓 蔡 柯誤差皆再1%以內只是的比例略低於其他三者 跟相比差距更接近2%以目前得出的結果來看最大可能影響國外比例的原因可能還是來自於文章推文的總數,故再這邊得到得結果是會吸引到國外鄉民來討論的終究是來自文章本身的熱度
國外討論度的結果出來了,再來就是尬我們本地的聲量了
那因為網路聲量的討論聲量並沒有一定公式,所以首先我決定就從最基本的推+1 噓-1開始
得到總分數去除以文章篇數
Ver 1.0
突然發現僅顯示分數好像不太好判斷基準,所以決定把數量也丟進去
Ver 1.1(增訂總數)
這時候有了重大發現! 跟當初預測的結果一樣 聲量是最高的沒錯,但我們堂堂中華民國的總統卻是討論量最低的?!然而這時候也注意到了,總數量與當初作國外IP分析時大有出入,原本八千多筆的僅剩下五千八百筆左右,才想起來PTT的推文系統上不只有還有所以趕快把箭頭們也丟進去做評分但不知道箭頭該算是還是所以索性就全部通通+0.5
推+1 噓-1 →+0.5

Ver 2.0 (將→納入評分標準)

這時穩穩坐再第一名的又坐得更穩了,靠著本身回覆量的基數大量加分,而也靠著本身回覆量多就是硬把給比下去了,另外雖然選手還是墊底但也因為基數優勢拉近了與的距離原本的分數差距由59分拉近到44分。這時候又想到這樣子去算好像對原本基數較低的不公平,所以又產生了第三種分數版本,這次把推噓分開計算用百分比來表示做正負向評分
ver 3.0(正負項評分)
推文分數是越靠近1越好,噓文分數則是越靠近0越好,但畢竟資料來源是爆文,正向分數偏高也是理所當然,就圖來看,排名又有變動了,單論正向排名分數順序為>>>柯,兩者相減後排名也是>>>,但是單論負向分數排名則會變成>>>,蔡選手脫離萬年老四開始有競爭第一的本錢,韓選手則是繼續霸佔第一寶座,反倒是柯選手在第三版本的分數計算中全部拿到墊底的成績。
討論度總結:
照剛剛三個版本的比較下排名為:
Ver 1.0 韓 > 郭 > 柯 > 蔡
Ver 2.0 韓 > 郭 > 柯 > 蔡
Ver 3.0 韓 > 郭 > 蔡 > 柯 ///// 韓 > 蔡 >郭 > 柯
照上面數據看下來韓確實是討論度第一名,連續三個版本的評分方式都是第一名,而至於其他三位選手在各個評分方式中都各有自己突出的地方,跟比者一開始預測的韓>蔡>柯>郭大有出入,本以為會最後一名的郭選手即使在低資料數的逆風場下仍然穩紮在韓之後,反倒蔡和柯的表現令人失望,但這邊討論的終究只是聲量,實際的討論內容還是要看過文章才知道,畢竟韓選手的文章都是批評他自己居多~,郭選手的文章有一篇是所謂的’發錢文’藉著發放P幣來藉此順便分享自己要放出的消息,故多少有點不公,就整體而已,這樣算下來最能肯定的是,韓選手的討論聲量是最高的沒錯!則另外三位就有待高人商確了

心血來潮的小計畫:

個別排名分數抓得差不多了,這次直接做成大雜燴,通通摻在一起做最後的推文分析~來看看這幾篇文章中推跟噓通常伴隨著甚麼文字呢?
把所有文章的下面的推文全部抓下來,這邊需要用到的東西就多了
抓文章的步驟跟上面差不多,就不多講,直接跳入重點, 首先利用結巴分詞,把每篇文章的詞收集起來,順便紀錄文章分數:
然後用 TfidfTransformer 做出特徵向量,配合 LinearSVC 進行預測訓練:
然後就開始畫圖
windows系統要特別注意2.3.4行
因為是抓爆文的關係,推文正向的部分特別強,只好分開顯示
最後得到的結果反而令人困惑XD,正向分數最高的是'本質',中間也很多奇奇怪怪的單句出現
負向倒不知道為什麼有兩個長長的棒子頂出來,不過中間也確實有一些明顯負面的單詞在裡面
最終-總結
做完之後覺得PTT真的是一個很棒的東西, 尤其各種特殊看板似乎很適合拿來測風向,雖然討論度的部分沒有一個完善的公式做出完美的結果來,但至少大方向的預測來說,結果是達成了~而後在補上所有文章內的大雜燴總結,來看看推噓文內在四位選手中個會出現哪些單詞,以結果來說不算是成功,但也成功的看到了正向和負向推文內的一些蛛絲馬跡。
資料參考
Scrapy + Python 3: PTT 資料抓取與分析
IP檢測網址
爬蟲極簡教學
「網路聲量=實際選票」?幕後製作心得分享
解決Python 3 Matplotlib與Seaborn視覺化套件中文顯示問題
分類:學習

各位日安,我是TianRy,來自雲林,資訊工程系畢業,在2021年03月被野放到台灣社會,資工系讀得很混,所以不敢自稱是資工人,略懂程式設計,平常喜好看美劇打遊戲看迷因,目前致力於Unity製作,繁體中文化Unity筆記,迷因翻譯

評論
上一篇
  • Data mining Midterm exam: 運用KMeans進行RFM模型分析探討結果
  • 下一篇
  • Unity學習筆記_Z-Fighting
  • 更多文章
    載入中... 沒有更多了