AI Challenger 2018 細粒度使用者評論情感分析 fastText Baseline
上一篇《 ofollow,noindex">AI Challenger 2018 進行時 》文尾我們提到 AI Challenger 官方已經在 GitHub 上提供了多個賽道的 Baseline: https://github.com/AIChallenger/AI_Challenger_2018 ,其中文字挖掘相關的3個主賽道均有提供,非常適合用來學習:英中文字機器翻譯的 baseline 就直接用了Google官方基於Tensorflow實現的Tensor2Tensor跑神經網路機器翻譯Transformer模型,這個思路是我在去年《 AI Challenger 2017 奇遇記 》裡的終極方案,今年已成標配;細粒度使用者評論情感分析提供了一個基於支援向量機(SVM)的多分類模型 baseline ;觀點型問題閱讀理解提供一個深度學習模型 baseline , 基於pytorch實現論文《 Multiway Attention Networks for Modeling Sentence Pairs 》裡的思路。
本次 AI Challenger 2018, 除了 英中文字機器翻譯 ,另一個我比較關注的賽道是: 細粒度使用者評論情感分析 。情感分析是自然語言處理裡面的一個經典任務,估計很多同學入門NLP的時候都玩過 IMDB Movie Reviews Dataset , 這個可以定義為一個二分類的情感分類問題。不過這次 AI Challenger 的細粒度使用者評論情感分析問題,並不是這麼簡單:
簡介
線上評論的細粒度情感分析對於深刻理解商家和使用者、挖掘使用者情感等方面有至關重要的價值,並且在網際網路行業有極其廣泛的應用,主要用於個性化推薦、智慧搜尋、產品反饋、業務安全等。本次比賽我們提供了一個高質量的海量資料集,共包含6大類20個細粒度要素的情感傾向。參賽人員需根據標註的細粒度要素的情感傾向建立演算法,對使用者評論進行情感挖掘,組委將通過計算參賽者提交預測值和場景真實值之間的誤差確定預測正確率,評估所提交的預測演算法。
資料說明
資料集分為訓練、驗證、測試A與測試B四部分。資料集中的評價物件按照粒度不同劃分為兩個層次,層次一為粗粒度的評價物件,例如評論文字中涉及的服務、位置等要素;層次二為細粒度的情感物件,例如“服務”屬性中的“服務人員態度”、“排隊等候時間”等細粒度要素。評價物件的具體劃分如下表所示。
層次一(The first layer) | 層次二(The second layer) |
位置(location) | 交通是否便利(traffic convenience) |
距離商圈遠近(distance from business district) | |
是否容易尋找(easy to find) | |
服務(service) | 排隊等候時間(wait time) |
服務人員態度(waiter’s attitude) | |
是否容易停車(parking convenience) | |
點菜/上菜速度(serving speed) | |
價格(price) | 價格水平(price level) |
價效比(cost-effective) | |
折扣力度(discount) | |
環境(environment) | 裝修情況(decoration) |
嘈雜情況(noise) | |
就餐空間(space) | |
衛生情況(cleaness) | |
菜品(dish) | 分量(portion) |
口感(taste) | |
外觀(look) | |
推薦程度(recommendation) | |
其他(others) | 本次消費感受(overall experience) |
再次消費的意願(willing to consume again) |
每個細粒度要素的情感傾向有四種狀態:正向、中性、負向、未提及。使用[1,0,-1,-2]四個值對情感傾向進行描述,情感傾向值及其含義對照表如下所示:
情感傾向值(Sentimental labels) | 1 | 0 | -1 | -2 |
含義(Meaning) | 正面情感(Positive) | 中性情感(Neutral) | 負面情感(Negative) | 情感傾向未提及(Not mentioned) |
首先有20個粒度的評價指標,每個粒度又有4種情感狀態,從官方baseline來看,分別訓練了20個(4標籤)分類器。抱著學習的態度,我跑了一下官方的 baseline,不過結果有點慘不忍睹,最終的F1均值只有0.2多一點,不知道哪個環節出了問題,另外一個問題是,整個訓練過程大概花了2、3天,對於我來說稍微有點長。對於文字分類問題,自從有了 fastText ,我最喜歡用fastText 做 baseline,最大的原因就是快,另外就是結果也不遜於傳統的機器學習模型。
但是,要用facebook官方的 fastText 以及自帶的 Python fastText 工具包做這件事並不容易,或者說對於20個多標籤分類器來說這事很繁瑣。不過沿著 AI Challenger 2018官方提供的 baseline 程式碼思路,它裡面用了sklearn的分類器介面,我在想能否借用這個介面把fastText引入,這個時候,自然想到了google,google了一下關鍵詞"fasttext sklearn", 果然發現了兩個第三方工具:
sklearn-fasttext :A scikit learn based interface to facebook fasttext.
skift :scikit-learn wrappers for Python fastText.
分別試了一下,發現後者能滿足我的需求,於是動手修改了一下 AI Challenger 官方的 baseline 程式碼,引入 fastText,於是就有了這個版本: fastText for AI Challenger Sentiment Analysis
AI Challenger 2018 Sentiment Analysis Baseline with fastText
功能描述
本專案主要基於AI Challenger官方 baseline 修改了一個基於fastText的baseline,方便參賽者快速上手比賽,主要功能涵蓋完成比賽的全流程,如資料讀取、分詞、特徵提取、模型定義以及封裝、 模型訓練、模型驗證、模型儲存以及模型預測等。baseline僅是一個簡單的參考,希望參賽者能夠充分發揮自己的想象,構建在該任務上更加強大的模型。
開發環境
- 主要依賴工具包以及版本,詳情見requirements.txt
專案結構
- src/config.py 專案配置資訊模組,主要包括檔案讀取或儲存路徑資訊
- src/util.py 資料處理模組,主要包括資料的讀取以及處理等功能
- src/main_train.py 模型訓練模組,模型訓練流程包括 資料讀取、分詞、特徵提取、模型訓練、模型驗證、模型儲存等步驟
- src/main_predict.py 模型預測模組,模型預測流程包括 資料和模型的讀取、分詞、模型預測、預測結果儲存等步驟
使用方法
- 準備 virtualenv -p python3 venv & source venv/bin/activate & pip install -r requirement.txt
- 配置 在config.py中配置好檔案儲存路徑
- 訓練 執行 python main_train.py -mn your_model_name 訓練模型並儲存,同時通過日誌可以得到驗證集的F1_score指標
- 預測 執行 python main_predict.py -mn your_model_name 通過載入上一步的模型,在測試集上做預測
以下是我在家裡這臺深度學習機器上的測試,不過並沒有用到GPU,主要用的是CPU和記憶體:CPU是Intel/英特爾 Xeon E5-1620V4 CPU 4核心8執行緒,記憶體是48G。因為 skift 只支援python3, 所以是在Ubuntu16.04, python3.5的環境下測試的,其他環境是否能順利測試通過不清楚。
git clone https://github.com/panyang/fastText-for-AI-Challenger-Sentiment-Analysis.git cd fastText-for-AI-Challenger-Sentiment-Analysis/ virtualenv -p python3 venv source venv/bin/activate pip install -r requirement.txt
注意準備工作做完後,需要在config裡設定相關檔案的路徑,預設配置大概是這樣的:
import os data_path = os.path.abspath('..') + "/data" model_path = data_path + "/model/" train_data_path = data_path + "/train/train.csv" validate_data_path = data_path + "/valid/valid.csv" test_data_path = data_path + "/test/testa.csv" test_data_predict_output_path = data_path + "/predict/testa_predict.csv"
注意執行程式碼前需要將相關輸入輸出路徑建好,並將相關資料路徑指定好,可以直接拷貝AI Challenger官方提供的資料檔案,也可以用軟連線指向。如果不做任何設定,可以直接用預設配置引數訓練fasttext多模型,直接執行“python main_train.py” 即可。這樣大概跑了不到10分鐘,記憶體峰值佔用不到8G,在驗證集上得到一個f1均值為0.53的fasttext多模型,模型儲存位置在 model_path 下:fasttext_model.pkl,大概1.8G,在驗證集上詳細的F1值大致如下:
location_traffic_convenience:0.5175700387941342 location_distance_from_business_district:0.427891674259875 location_easy_to_find:0.570805555583767 service_wait_time:0.5052181634999748 service_waiters_attitude:0.6766570408968818 service_parking_convenience:0.5814636947460745 service_serving_speed:0.5701241141533907 price_level:0.6161258412096242 price_cost_effective:0.5679586399625348 price_discount:0.5763345656700684 environment_decoration:0.5554146717297597 environment_noise:0.563452055291662 environment_space:0.5288336794721515 environment_cleaness:0.5511776910510577 dish_portion:0.5527095496220675 dish_taste:0.6114994440656155 dish_look:0.43750894239614163 dish_recommendation:0.41756941548558957 others_overall_experience:0.5322283082904627 others_willing_to_consume_again:0.5404900044311536 2018-10-02 14:32:18,927 [INFO] <mainprocess> (MainThread) f1_score: 0.5450516545305993 </mainprocess>
這是預設引數跑出來的結果,另外程式碼裡增加了一些fastText可用的引數選項,例如learning_rate,word_ngrams, min_count引數,也可以基於這些引數進行調參:
if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('-mn', '--model_name', type=str, nargs='?', default='fasttext_model.pkl', help='the name of model') parser.add_argument('-lr', '--learning_rate', type=float, nargs='?', default=1.0) parser.add_argument('-ep', '--epoch', type=int, nargs='?', default=10) parser.add_argument('-wn', '--word_ngrams', type=int, nargs='?', default=1) parser.add_argument('-mc', '--min_count', type=int, nargs='?', default=1) args = parser.parse_args() model_name = args.model_name learning_rate = args.learning_rate epoch = args.epoch word_ngrams = args.word_ngrams min_count = args.min_count
作為一個例子,這裡將word_ngrams設定為2再跑一次:
python main_train.py -mn fasttext_wn2_model.pkl -wn 2
這次大約跑了15分鐘,記憶體峰值最大到37G,儲存的模型大約在17G,驗證集F1值結果如下:
location_traffic_convenience:0.5307135699666478 location_distance_from_business_district:0.41178139516141876 location_easy_to_find:0.6156875759062456 service_wait_time:0.5114907074729627 service_waiters_attitude:0.6940357480283125 service_parking_convenience:0.6008820085404767 service_serving_speed:0.5867426517364074 price_level:0.6291617331582601 price_cost_effective:0.6017875104678703 price_discount:0.5677976735859852 environment_decoration:0.582366084744112 environment_noise:0.6221561310937738 environment_space:0.6001616872362427 environment_cleaness:0.604086158544501 dish_portion:0.5661343456806507 dish_taste:0.5890330092264686 dish_look:0.43187500470419216 dish_recommendation:0.433545411430067 others_overall_experience:0.5315357555764633 others_willing_to_consume_again:0.5600310122536963 f1_score: 0.5635502587257377
這個結果看起來還不錯,我們可以基於這個fasttext多分類模型進行測試集的預測:
python main_predict.py -mn fasttext_wn2_model.pkl
大約執行不到3分鐘,預測結果就出爐了,可以在 test_data_predict_output_path 找到這個預測輸出檔案: testa_predict.csv ,然後就可以去官網提交了,線上提交的結果和驗證集F1值大致相差0.01~0.02。這裡還可以做一些事情來優化結果,譬如去停用詞,不過我試了去停用詞和去一些標點符號,結果還有一些降低;調參,learning_rate的影響是比較直接的,min_count設定為2貌似也有一些負向影響,有興趣的同學可以多試試,尋找一個最有組合。
歡迎關注我們的公眾號:
注:原創文章,轉載請註明出處及保留連結“我愛自然語言處理”: http://www.52nlp.cn
本文連結地址: AI Challenger 2018 細粒度使用者評論情感分析 fastText Baseline http://www.52nlp.cn/?p=10537