
前言你有沒有看到一個很好玩的產(chǎn)品,突然有想用自己擅長的語言來實現(xiàn)的沖動?本文的作者就在類似的刺激驅(qū)動下完成了一個『微博指數(shù)』,用到了 sklearn 做簡單的分類訓(xùn)練。供大家參考。
本文作者:林浩威,分享自騰訊云社區(qū)(https://www.qcloud.com/community/)
隨著人工智能的大熱,越來越多的小伙伴們開始投身到機器學(xué)習(xí)的大潮中。作為其中的一員,我對此也是極有興趣的。當然我更感興趣的,是怎么利用這些有趣的算法,來實現(xiàn)腦海里各種奇奇怪怪的點子。寫這篇文章的契機,是我在某天看完騰訊指數(shù)的推送后,突發(fā)奇想,想自己實現(xiàn)類似這樣的一個東西,感覺蠻好玩的。然后就在上周末,利用了一些空余時間,寫了一個簡單的輿情監(jiān)控系統(tǒng)。
思路
基于機器學(xué)習(xí)的輿情監(jiān)控,這樣的一個想法,其實可以有很大的想象空間,可以做很多有意思的事情。比如可以關(guān)注你喜歡的明星或電影的口碑情況,或者了解你所關(guān)注股票的輿論變化,甚至預(yù)測其未來的走向等等。但我決定先從最簡單的例子入手:就是從新浪微博中,識別出關(guān)于騰訊的正面或負面的新聞。本文的論述也將圍繞這個場景展開,不會涉及太多復(fù)雜難懂的東西,可以說是很簡單的一個東西,請放心閱讀。
技術(shù)上的實現(xiàn),主要是用sklearn對采集到的微博文本做分類訓(xùn)練,關(guān)于sklearn就不需要介紹了,很有名的一個python機器學(xué)習(xí)工具,如果想詳細地了解可以移步它的官網(wǎng):
下面是我們接下來需要做的所有工作:

環(huán)境
機器:mac
語言:python
第三方庫:sklearn、jieba、pyquery 等
數(shù)據(jù)采集
數(shù)據(jù)采集是對我來說是最好做的一步,其實就是寫爬蟲從各大網(wǎng)站收集大量的信息,存起來,以便我們后續(xù)分析處理。如下圖:

因為這只是一個試驗性的興趣項目,沒辦法花太多時間投入,所以我這次只打算從微博的搜索結(jié)果中,取1000條數(shù)據(jù)來分析。當然如果有可能的話,數(shù)據(jù)越多越好,訓(xùn)練出來的模型就越準確。
采集的頁面是百度的微博搜索結(jié)果頁:https://www.baidu.com/s?wd=騰訊&pn=0&tn=baiduwb&ie=utf-8&rtt=2
用python對該頁面逐頁抓取,然后用pyquery模塊對抓取到的頁面進行解析,得到一條條的微博文本。下面貼下這個頁面的解析代碼:

人工處理
這一步是最苦逼也是最花時間的一步,我們需要把采集到的數(shù)據(jù),一條條精確地人工分類整理好,才能給后續(xù)的算法訓(xùn)練使用。如果你的場景在網(wǎng)上能找到現(xiàn)成的訓(xùn)練數(shù)據(jù)集,那么恭喜你已經(jīng)節(jié)省了大把時間,但大多數(shù)情況還得自己來,所有臟活累活都在這了。而且人工分類的準確性,也決定了訓(xùn)練出來的模型的準確性,所以這一步的工作也是至關(guān)重要的。
我們的目標是把消息分為"正面"、"負面"和"中性"三個類別。首先我們要先給這三個類別下一個明確的定義,這樣在分類的時候才不會迷茫。我個人給它們下的定義是:
正面:有利的新聞、積極正面的用戶言論;
負面:不利的新聞、消極反面的用戶言論;
中性:客觀提及的新聞、不帶感情色彩的用戶言論。
按照上面的標準,我們把采集到的1000條微博一一分類標記好。
文本預(yù)處理
采集過來的微博文本,帶有很多無效的信息,在開始訓(xùn)練之前,我們需要對這些文本做預(yù)處理,并保存為sklearn能接收的數(shù)據(jù),主要工作包括:
1、去雜質(zhì),包括表情符號、特殊符號、短鏈接等無效信息,這里用正則過濾掉即可,不再詳細描述; 2、保存為文本文件,因為sklearn要求訓(xùn)練數(shù)據(jù)以特定的格式存放在本地目錄,所以我們需要用腳本對原數(shù)據(jù)進行處理,目錄格式如下:


train:存放待訓(xùn)練的數(shù)據(jù),子目錄名稱為分類名,子目錄下存放訓(xùn)練文本文件,文件名隨意,內(nèi)容為單條微博文本;
test:存放帶測試的數(shù)據(jù),子目錄名稱隨意,在子目錄下存放測試文本文件。
建議訓(xùn)練集和測試集按8:2的比例劃分,用python自動生成以上的本地文件。
3、分詞,因為微博的數(shù)據(jù)大部分都是中文,所以推薦用jieba分詞,對中文的支持比較給力,效果也很好。支持自定義詞典,支持返回指定詞性的分詞結(jié)果,可以去除一些停用詞和語氣助詞等。使用起來也很簡單,這里不詳細介紹,有需要可以訪問它的github地址:
算法選擇
準備好訓(xùn)練數(shù)據(jù)之后,我們就可以開始訓(xùn)練了,為此我們需要選擇一個合適的分類算法。但機器學(xué)習(xí)算法那么多,如果一個個去測試對比,將花費我們不少精力。幸好sklearn已經(jīng)考慮到了這個問題,并提供了一個算法選擇方案。通過把多個算法的運行結(jié)果進行圖形化對比,可以很直觀的看到哪個算法比較合適。
這個是官方提供的測試代碼: 把這個官方案例的數(shù)據(jù)輸入部分替換成自己的即可。結(jié)果如下圖:

綜合運算效率和得分情況,我選擇了LinearSVC算法(SVM)來作為我的訓(xùn)練算法。
訓(xùn)練
文本分類的訓(xùn)練主要有以下4個步驟:

這4個步驟 sklearn都已封裝了相應(yīng)的方法,所以使用起來極其方便。參考如下代碼:

注:以上代碼為了方便展示,把模塊引入也放到方法內(nèi)部了,僅作參考
應(yīng)用
最后就是對訓(xùn)練好的模型進行測試和應(yīng)用。
通過已有的模型,對新的數(shù)據(jù)進行預(yù)測,代碼如下:

注:本代碼只是展示用,僅作參考
打印出來的部分結(jié)果見下圖:

經(jīng)統(tǒng)計,預(yù)測的準確率為95%,該模型算出的當天騰訊相關(guān)的輿情如下:

結(jié)語
本文只是記錄下我這兩天的一些想法和試驗過程,沒有涉及太多代碼實現(xiàn)或者其他高深的算法,相信不難看懂。如果有人感興趣的話,后面我可以把源碼整理完發(fā)布出來。
感謝閱讀!