使用机器学习算法打造一个简单的“微博指数”
歡迎大家前往騰訊云技術社區,獲取更多騰訊海量技術實踐干貨哦~
作者:林浩威
前言
隨著人工智能的大熱,越來越多的小伙伴們開始投身到機器學習的大潮中。作為其中的一員,我對此也是極有興趣的。當然我更感興趣的,是怎么利用這些有趣的算法,來實現腦海里各種奇奇怪怪的點子。寫這篇文章的契機,是我在某天看完騰訊指數的推送后,突發奇想,想自己實現類似這樣的一個東西,感覺蠻好玩的。然后就在上周末,利用了一些空余時間,寫了一個簡單的輿情監控系統。
思路
基于機器學習的輿情監控,這樣的一個想法,其實可以有很大的想象空間,可以做很多有意思的事情。比如可以關注你喜歡的明星或電影的口碑情況,或者了解你所關注股票的輿論變化,甚至預測其未來的走向等等。但我決定先從最簡單的例子入手:就是從新浪微博中,識別出關于騰訊的正面或負面的新聞。本文的論述也將圍繞這個場景展開,不會涉及太多復雜難懂的東西,可以說是很簡單的一個東西,請放心閱讀。
技術上的實現,主要是用sklearn對采集到的微博文本做分類訓練,關于sklearn就不需要介紹了,很有名的一個python機器學習工具,如果想詳細地了解可以移步它的官網:http://scikit-learn.org 。
下面是我們接下來需要做的所有工作:
環境
機器:mac
語言:python
第三方庫:sklearn、jieba、pyquery 等
數據采集
數據采集是對我來說是最好做的一步,其實就是寫爬蟲從各大網站收集大量的信息,存起來,以便我們后續分析處理。如下圖:
因為這只是一個試驗性的興趣項目,沒辦法花太多時間投入,所以我這次只打算從微博的搜索結果中,取1000條數據來分析。當然如果有可能的話,數據越多越好,訓練出來的模型就越準確。
采集的頁面是百度的微博搜索結果頁:https://www.baidu.com/s?wd=騰訊&pn=0&tn=baiduwb&ie=utf-8&rtt=2
用python對該頁面逐頁抓取,然后用pyquery模塊對抓取到的頁面進行解析,得到一條條的微博文本。下面貼下這個頁面的解析代碼:
人工處理
這一步是最苦逼也是最花時間的一步,我們需要把采集到的數據,一條條精確地人工分類整理好,才能給后續的算法訓練使用。如果你的場景在網上能找到現成的訓練數據集,那么恭喜你已經節省了大把時間,但大多數情況還得自己來,所有臟活累活都在這了。而且人工分類的準確性,也決定了訓練出來的模型的準確性,所以這一步的工作也是至關重要的。
我們的目標是把消息分為“正面”、“負面”和“中性”三個類別。首先我們要先給這三個類別下一個明確的定義,這樣在分類的時候才不會迷茫。我個人給它們下的定義是:
正面:有利的新聞、積極正面的用戶言論;
負面:不利的新聞、消極反面的用戶言論;
中性:客觀提及的新聞、不帶感情色彩的用戶言論。
按照上面的標準,我們把采集到的1000條微博一一分類標記好。
文本預處理
采集過來的微博文本,帶有很多無效的信息,在開始訓練之前,我們需要對這些文本做預處理,并保存為sklearn能接收的數據,主要工作包括:
1、去雜質,包括表情符號、特殊符號、短鏈接等無效信息,這里用正則過濾掉即可,不再詳細描述;
2、保存為文本文件,因為sklearn要求訓練數據以特定的格式存放在本地目錄,所以我們需要用腳本對原數據進行處理,目錄格式如下:
train:存放待訓練的數據,子目錄名稱為分類名,子目錄下存放訓練文本文件,文件名隨意,內容為單條微博文本;
test:存放帶測試的數據,子目錄名稱隨意,在子目錄下存放測試文本文件。
建議訓練集和測試集按8:2的比例劃分,用python自動生成以上的本地文件。
3、分詞,因為微博的數據大部分都是中文,所以推薦用jieba分詞,對中文的支持比較給力,效果也很好。支持自定義詞典,支持返回指定詞性的分詞結果,可以去除一些停用詞和語氣助詞等。使用起來也很簡單,這里不詳細介紹,有需要可以訪問它的github地址:https://github.com/fxsjy/jieba
算法選擇
準備好訓練數據之后,我們就可以開始訓練了,為此我們需要選擇一個合適的分類算法。但機器學習算法那么多,如果一個個去測試對比,將花費我們不少精力。幸好sklearn已經考慮到了這個問題,并提供了一個算法選擇方案。通過把多個算法的運行結果進行圖形化對比,可以很直觀的看到哪個算法比較合適。
這個是官方提供的測試代碼:http://scikit-learn.org/stable/auto_examples/text/document_classification_20newsgroups.html#example-text-document-classification-20newsgroups-py
把這個官方案例的數據輸入部分替換成自己的即可。結果如下圖:
綜合運算效率和得分情況,我選擇了LinearSVC算法(SVM)來作為我的訓練算法。
訓練
文本分類的訓練主要有以下4個步驟:
這4個步驟 sklearn都已封裝了相應的方法,所以使用起來極其方便。參考如下代碼:
注:以上代碼為了方便展示,把模塊引入也放到方法內部了,僅作參考
應用
最后就是對訓練好的模型進行測試和應用。
通過已有的模型,對新的數據進行預測,代碼如下:
注:本代碼只是展示用,僅作參考
打印出來的部分結果見下圖:
經統計,預測的準確率為95%,該模型算出的當天騰訊相關的輿情如下:
結語
本文只是記錄下我這兩天的一些想法和試驗過程,沒有涉及太多代碼實現或者其他高深的算法,相信不難看懂。如果有人感興趣的話,后面我可以把源碼整理完發布出來。
感謝閱讀!
相關閱讀
通過一個 kaggle 實例學習解決機器學習問題
更快更準的異常檢測?交給分布式的 Isolation Forest 吧
機器學習之決策樹與隨機森林模型
此文已由作者授權騰訊云技術社區發布,轉載請注明文章出處
原文鏈接:https://cloud.tencent.com/community/article/515228
總結
以上是生活随笔為你收集整理的使用机器学习算法打造一个简单的“微博指数”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java环境变量(Env)和系统属性(P
- 下一篇: Zookeeper Ephemeral结