Python實作

大學生在想什麼?Netflix什麼最紅?Python 5分鐘告訴你!

使用爬蟲以及NLP呈現訊息滿滿的文字雲

Harry Cheng
Jul 24, 2021
使用python跑出來的文字雲

在當今資訊爆炸的社會,資訊不斷增加,但一個人始終只有一天24小時,因此人類的注意力也變成了一種稀缺的資源。

在社群網路演算法的不斷變化之下,網友的注意力越來越難搶。FB的organic reach(未付費po文接觸到的人÷可能接觸到的人的總和)逐年下降,掉到了只有5%左右。

在這種情況之下,粉絲專頁就算有許多的follower還是沒有用。真正有用的,是更加客製化、更加貼近客戶生活的行銷內容。

那要如何知道客戶在想什麼呢?一個好方法是利用社群網路上的文本資料。也就是透過社群網路上各種文章、留言的文字集合體,來判斷社群整體的話題趨勢。

使用Python能夠很輕易的做到這件事。接下來的文章,我會以Dcard分析為例,帶你走過整個實作過程,並且附上我所有的程式碼

目錄

  1. 資料搜集 — Dcard API
  2. 資料處理 — 自然語言處理
  3. 資料視覺化 — 文字雲
  4. 結語

資料搜集 — Dcard API

假設你今天是一個大學社團社長,或是大學附近的商店,你的TA就是大學學生。要搜集大學生的想法,一個很好的去處是專門給大學生的社群平台 — Dcard。Dcard有全台每一所大學的專屬看板,也有分不同話題的看板(穿搭、遊戲、Netflix等等)。

以我的學校政大為例,每天政大Dcard板平均有30篇左右的貼文。是一個很活躍的社群。

要搜集Dcard的文章有兩個方式。第一個是使用beautifulSoup,selenium等爬蟲套件。這個方式在大多數網站都可行。另一種是使用Dcard的API。這個方式比較方便,但因為並不是每個網站都有API,所以不一定都適用。本文使用的是Dcard API

Dcard API

API(Application Programming Interface),是一個用來幫助開發者快速完成某些事情的工具。API就像是7–11裡的ibon機器,你只要輸入你要做的事情(取票、退貨、影印),機器就會自動處理,並且吐出結果給你(車票、退貨單、自動啟用影印機)。在本文的例子當中,我們只要輸入一些參數(想抓的看板、文章),API就會吐回抓到的文章、看板等等。

workflow大概是這樣:使用request套件get API的網址、使用json decode、製作成dataFrame。同時,一次request只能抓100篇文章。如果還想要繼續抓,就要輸入上一次抓的資料中最後一篇文章的id,再發一次request。因此我寫了以下函式,只要輸入兩個參數,alias(想要抓的看板名稱)、x(想要抓的文章數量,無上限),python就會反復發出request抓資料並且最後合併,回傳一個dataFrame。

從程式中也可以看出,我設定回傳的的dataFrame只有【文章標題】跟【看板名稱】兩個欄位。但是API能抓到的東西遠遠不止於此,包括文章內文、留言、讚數、po文者學校科系等等,都可以抓到。我這邊只抓標題是因為標題通常就是文章的精華,能夠簡潔的呈現文章主題。若是抓了文章、留言,容易發生特定文章多次重複使用特定字眼的偏誤(有些人在內文反復提到某些字)或是內文空洞的偏誤(如下圖)。

一篇隨機dcard文

Requests太頻繁被擋怎麼辦

另外,如果使用Dcard API發出的requests(抓文章的請求)太過頻繁,網站會跳出captcha來擋你。

Dcard跳出來的captcha

通常遇到這種問題,會使用python的套件來繞過captcha,像是cloudscraper。但是由於Dcard使用的是比較高級的Captcha2,一般免費的套件是無法繞過的,必須付錢買比較強的套件(背後使用人工幫忙解captcha的套件)。

但是經過無數的trial and error,我測出了一個可以不被captcha擋住的停頓區間。也就是每一次requests之間隨機停頓2~6秒(少一秒也不行!)。API每次request能夠抓100篇文章,所以程式的速度大概是平均4秒抓100篇文,還算可以!

回傳的資料

根據Dcard顯示,政大板平均每天30篇po文。所以如果要抓最近一年的所有po文,就是11000篇。截至7/23/2021,抓到的貼文如下:

資料處理 — 自然語言處理

我們所搜集到的資料當然不能直接丟進文字雲產生器,要先經過一些自然語言處理的步驟。

自然語言處理是什麼

大家平時聽到資料,想到的大概是一行行的數字。但是文字其實也是一種資料,而且裡面蘊藏的資訊一點都不比數字少。不過文字的處理實在是比數字tricky許多,因此人類結合人工智慧以及語言學,發展出了自然語言處理(Natural Language Processing,以下簡稱NLP)這個分支。這門學科現在仍在不斷地有新突破,從最早期的bag of words,到word2vec,再到這幾年非常火紅的BERT,人工智慧處理文本資訊的能力已經相當驚人。

網路上大多數的資源都是集中在英文的處理,但是中文需要一套很不一樣的處理方式。最明顯的差異,就是中文獨特的處理步驟 — 斷詞。

斷詞、標詞性

英文每個詞中間都用空格隔開,但中文都是黏在一起的。所以,在處理中文最早期的步驟之一就是把黏在一起的字詞斷開成一個個單獨的字詞。

台灣中研院有開發出一個方便的套件,叫CKIP,在繁體中文的斷詞有極高的準確率(97%)。此外,該套件也提供詞性辨識以及實體辨識的功能。

我寫了一個函式幫助文字的清洗跟斷詞。這個函式會刪掉所有的標點符號、表情符號等等不必要的資訊,並且使用CKIP斷詞。

我們把這個函式放到迴圈,處理所有dataframe的資料,並且標上詞性。

結果如下:

斷詞以及詞性

資料視覺化 — 文字雲

資料處理完了,終於到了做文字雲的時候了!

詞性挑選

首先我會根據CKIP標示的詞性挑選要使用的字詞。這麼做是因為許多頻繁出現的字詞其實是感歎詞、語助詞、動詞等等,並沒有任何的意義。如果要知道政大學生在紅什麼,名詞跟形容詞是最有意義的。

因此我抓了普通名詞、專有名詞以及形容詞。完整詞性列表在此

產生文字雲

選好詞性之後,直接把資料丟進文字雲看看結果。

這邊文字雲使用的是wordcloud套件。文字雲裡面有許多參數可以調,可以自定義形狀顏色等等,這邊就是用比較一般的。注意,中文還要特別下載字體,並且輸入參數(font_path那一行)。

結果如下:

政大文字雲

越常出現的字就會越大。能夠大概看出一些在政大十分火紅的話題。

如何調整文字雲

從上圖可以看出,許多最大的字詞其實並沒有太大意義,像是“問題”。幸好文字雲有一個參數叫stopwords,可以讓程式略過你標註出來的字詞。我隨意挑選了一些我覺得沒有太大意義的字詞。當然,這部分的挑選會依照不同的應用客製化。

更新後的結果:

這就清楚多了!有一些原本沒抓到的字詞也被抓出來了,例如“花花”(政大的校狗)跟“黃子銘”(政大教授)。

簡單整理一下圖片的insights:

政大話題:

  • 達賢、圖書館(政大最近蓋了一間超級霸氣的達賢圖書館)、健身房、總圖、莊九(學生宿舍)
  • 遠距、防疫、確診、口罩
  • 文山聯盟(校長主導的文山區大學聯盟)
  • 雙輔、雙主修、分數、學程
  • 雄鷹(UBA冠軍超屌校隊)

熱門科系:

  • 商院(號稱政大的天龍院)、財管、金融
  • 法律系(聽說很愛在網路上打嘴炮的一個系)、財政
  • 歷史、哲學(偶爾被戰的系)
  • 以上言論不代表本文立場

熱門課程:

  • 財務管理(本人也很愛的一堂課)、商事法、貨幣銀行學
  • 生命、文化(甜涼通識課的關鍵字)
  • 程式設計、大學外文、英文、民法

課外話題:

  • 男生、女生、妹子、帥哥、政大生
  • 面試、薪水、出路、工作、計劃

不同的商家、單位對於這些關鍵字會有不同的用法,但是無論是誰都能夠快速地看出現在在政大流行的事物。

隨便舉例,假設有個政大附近的酒吧的老闆,正要思考新的促銷活動,但是對於政大事物沒概念。老闆使用最近的100篇文章做出文字雲,發現這幾天大家都在講雄鷹,一查之下原來是雄鷹奪冠了。因此老闆推出“慶祝雄鷹奪冠!來店消費每人招待一杯shot”的促銷活動,大成功。

其他的文字雲

除了政大之外,我還做了一個清大的文字雲。這兩間學校正好是分別以文科、理科為主的頂尖大學,也正好是我(政大)跟我哥(清大)唸的學校,因此拿來比較一下會很有趣。

非常的不一樣呢!一個對於這兩件學校完全沒有背景知識的人也能夠從這兩張圖片中萃取出“政大是文科學校,清大的理科學校”這樣的資訊。

此外,我也使用Dcard的netflix板做了一個文字雲,挖的也是近一年的文章:

這邊可以非常清楚的得知哪些影集比較紅。這對於廠商的行銷、代言也都是很有利的資訊。

結語

其實做出了文字雲之後,還能夠搭配情感分析,進一步地分析大眾對於特定議題的看法。目前情感分析python也有許多套件可以使用,只不過中文的偏少。有中文的套件也大部分是中國大陸開發的,例如百度的Senta。台灣似乎只有中研院開發的CSentiPackage,但是該套件還沒有開放下載,我寄信跟他們要但他們不理我,所以我就算了。不過這邊要說的是,情感分析不難做,各種語言都有意見詞詞典,套件只是把文字根據詞典打分數(正負)而已(當然還是可以根據use case fine tune)。

除了情感分析之外,現在NLP能做到的事還很多很多。在人們發現把文字轉換成向量的技術之後,現在的模型已經可以做問答、剋漏字、語義判讀等等的事情。有興趣的人可以看看BERT

最後,如果喜歡這篇文章,請幫我拍手(按住可以拍很多下)~也歡迎follow我的medium以及在Linkedin上跟我聯絡!我們下回見:)

--

--

Harry Cheng

Research Intern @ MBB Consulting. Data Science enthusiast.