0 序言
比賽已經過去一段時間,現在才來寫總結似乎有點兒晚,但是擋不住內心發出的強烈呼喚的聲音,所以決定靜下心來梳理一遍,查缺補漏。
參賽契機:
2017年9月偶然在學校的官方微信推送中看到2017年CCF大數據與計算智能大賽正式啟動的信息,仔細閱讀了參加規則后就決定找隊友一起參賽,試一試自己的能力。
有想法就立即行動,及時把比賽信息分享出去。經過不斷宣傳、溝通,最終與2位同門成功組隊,開啟我們的首次競賽之旅。
成績/排名:
136/796
1 賽題(引自大賽官網)
基於主題的文本情感分析
以網上電商購物評論為例,原始的主題模型主要針對篇幅較大的文檔或者評論句子的集合,學習到的主題主要針對整個產品品牌;而現實情形是,用戶評論大多針圍繞產品的某些特征或內容主題展開(如口味、服務、環境、性價比、交通、快遞、內存、電池續航能力、原料、保質期等等,這說明相比於對產品的整體評分, 用戶往往更關心產品特征),而且評論文本往往較短。
2 任務描述(引自大賽官網)
本次大賽提供脫敏后的電商評論數據。參賽隊伍需要通過數據挖掘的技術和機器學習的算法,根據語句中的主題特征和情感信息來分析用戶對這些主題的偏好,並以<主題,情感詞>序對作為輸出。
3 評分規則(引自大賽官網)
本賽題采用F1-score進行評價。
注意:
1. 如果某些row_id樣本中有多個主題,您只識別出其中幾個,那么會被當做漏判識別。若識別出的主題多於答案,則會被當做多判識別。
2. 在最終評測時,我們按照“主題詞-情感詞-情感值”為最小粒度逐條與標注數據進行比對,若三者均與答案相符,則判為情感匹配正確,否則為錯誤。評分計算如下:
a) 情感匹配正確數量:tp
b) 情感匹配錯誤數量:fp
c) 情感匹配漏判數量:fn1
d) 情感匹配多判數量:fn2
3. 最終根據以上值計算選手的准確率(P)與召回率(R),按照含有度量參數β的Fβ公式進行計算:
准確率:P=tp/(tp+fp+fn2)
召回率:R=tp/( tp+fp+fn1)
Fβ的數學定義如下:Fβ=(1+β2)∗P∗R/(
β2∗P+R)
β=1
4 比賽過程
環境和工具:
Ubuntu16.04 + Pycharm
4.1 原始數據分析
原始數據部分截圖
- 包含空白的行(評論內容基本無價值,視為無效)
- 情感關鍵詞與情感值聯系密切,迅速判定從情感分析這個點入手。想到之前見過2分類的模型,現在是3分類,需要調整模型才能適用或者重新設計算法。
- 注意到情感詞幾乎是形容詞,而主題幾乎是名詞,這也比較符合評論用語的習慣。考慮使用規則匹配,找到<名詞,形容詞>對。
- 情感值相當於標簽,可以看做分類問題來處理。常用的分類模型可以嘗試一下。
- 主題暫時不考慮(分任務進行)
- 評論文本需要分詞,考慮使用jieba分詞工具,再用word2vec轉換成向量,以備后續處理。
4.2 數據預處理
這個階段主要完成缺失值填充、重復值去除。
初步使用EXCEL 2013篩選查看了一遍數據,沒有發現重復值,所以重點放在了缺失值的填充上。
2位隊友和我一起篩選出包含缺失值的行,發現只要情感詞缺失的,情感值和主題也缺失,再看評論內容也沒有價值,所以我們討論決定將這類數據剔除。
繼續使用Python編程查看數據,發現情感關鍵詞關聯情感值和主題,決定利用情感詞去填充主題。我們用最簡單的思想,就是找到距離情感關鍵詞最近的名詞,把它定為主題。
對於情感值的缺失,也是依據情感關鍵詞去做分類,最終確定對應的值。
至此,基本完成缺失值填充。
4.3 特征提取
這一步主要是針對評論內容的處理。首先就是分詞,我們使用了jieba分詞工具,外加它提供的自定義詞典,完成分詞。之后利用開源工具word2vec將分好的詞轉換成向量,以備后續使用。
4.4 選擇模型
比賽進行到這個階段,我們就開始廣泛地查找資料。一位隊友提出可以使用深度學習模型RNN來做分類,由於我完全沒接觸過,這部分就交給他繼續跟進嘗試。我和另一位隊友選擇使用情感詞典+自定義規則構建模型,我主要負責構造情感詞典,提供思路,隊友則負責完善規則和優化代碼。我們三人按照各自的分工分頭行動,遇到問題就集中討論。
4.5 代碼實現
這里附上我們比賽的代碼,細節就不在贅述。
請移步我的GitHub(https://github.com/digfound/CCFCompetition)查看,謝謝。
4.6 模型優化
由於沒有找到比較合適的優化方法,所以這個步驟沒有起到特別明顯的作用。我們沒有時間換用其他模型嘗試,只是繼續改進情感詞典,但作用不大。
4.7 提交結果
使用官網的提交系統,直接提交最后的結果文件,保存成CSV格式。
最終結果的部分截圖如下:
5 致謝
- 感謝學校的微信推送,讓我有遇見這次大賽的機會;
- 感謝2位同門的努力與陪伴,讓我們在不斷分析、討論、研究中順利完成比賽;
- 感謝自己的付出,讓自己在專業實踐方面、團隊協作方面、表達溝通方面都得到不同程度的鍛煉;
- 感謝其他的參賽隊伍,有競爭才有進步!
6 總結反思
收獲:
- 選擇了與自己研究方向比較相關的賽題,加深了對平時所學理論知識的認知,特別是分詞的處理和情感詞典的構建;
- 在將近1個月的比賽過程中和2位隊友相處比較融洽。隊友們和自己的想法都得到比較充分的表達,有分歧的時候也能夠理性地說服對方,鍛煉了自己的思維表達能力;
- 比賽主要考察算法設計、數據處理方式等技術點,自己通過查找各種資料做參考,嘗試分析解決實際問題,學習如何遷移別人的優秀經驗來適應自己的需求,培養了自己的快速學習與實踐能力。
不足:
- 存在第一次參賽容易出現的問題。比如磨合時間長、反饋不及時、任務分工不夠清晰,導致做了一些重復的工作;
- 選擇的模型比較簡單,只是使用情感詞典+自定義規則處理數據,導致最終的成績不理想,與排名靠前的隊伍成績差距有點大;
- 沒有找到合適的優化方法,導致調優的階段幾乎沒有明顯提升,所以最后無緣復賽。
7 寫在最后
至此,自己能夠想到的點已經寫下來了,其中涉及到的理論知識點(比如數據預處理、特征提取、分詞、word2vec、分類、情感分析等),之所以沒有在此記錄是因為本人覺得不適合將它們放在總結里,所以全部略去了,喜歡研究理論依據的博友們請自行學習。
最后,感謝各位的耐心閱讀,歡迎大家給我留言,期待與你們討論交流。