玉山人工智慧公開挑戰賽2020夏季賽 — NLP應用挑戰賽
第十名 Simple Baseline
我第一篇Medium 睡不著亂寫 你各位也亂看就好 反正不是為了獎品寫的
前言
感謝來面試我們地名大學時候認識的Chris找我打比賽 但他後來去頂大了
隊友好像有很多人 但感覺只有兩個人在忙
基本上我負責分類模型跟NER模型 然後Ethan當我架Api的顧問 Chris兼PM跟QA跟第三步驟跟爬蟲 Hank上中山說要找教授然後人就消失了 要領獎的時候又出現了
步驟
玉山BOT會有新聞打過來 需要判斷新聞是不是AML焦點新聞並回傳AML焦點人名。我們的步驟為:
一、判斷是否為AML相關新聞(BERT分類模型)
二、提取新聞中的人名(Kashgari NER)
三、排除不相關的人名(Rule)
作法
步驟一、用了蘇劍林的BERT分類模型 基本上照著下面教學做應該跑得出東西
https://github.com/bojone/bert_in_keras/blob/master/sentiment.py
然後把neg跟pos檔案換成爬蟲爬下來的新聞 玉山資料集有給名字的放pos 沒名字的放neg(反過來也可)
爬蟲就不多說了 我爬了一點 其他另一個隊友爬的
然後輸出的部分 蘇劍林大神會嗆你認真把Keras看完再來 所以我後來就在Keras的source code找到單句子預測的方法
輸出我設預測的值>0.5當AML焦點新聞
def predict_one(s): indices, segments = tokenizer.encode(first=s, max_len=512) predicts = model.predict([np.array([indices]), np.array([segments])])[0] return predicts[0]
步驟二、用BrikerMan的Kashgari
看別組都用CKIP 不知道效果怎樣 CKIP應該跑比較快但準確度可能低一些
也不多說了 反正就那樣 模型蠻強大的 就是預測時間久了點 畢竟要趕五秒內回傳api 後面介紹怎麼解決
步驟三、排除不相干人名
不知道 隊友寫的 本來想叫他用單詞情緒分類 但後來他不知道用了什麼規則 有時候會把我NER輸出的名字全砍光 以計分來說該有名字但沒輸出就是0分 他再跑來說我分類模型不準 說如果分類就不準他那邊也沒辦法
怪我囉
API
就照官方給的code起了API
但因為Tensorflow版本問題(NER用TF1.多, 分類模型用TF2) 所以起了兩個PORT
流程大概是
8080port 收到請求->先傳給8081做步驟一的分類->分數傳回8080port->分數小於0.5直接回傳空List 大於等於 0.5的話就繼續-> 步驟二NER提取人名->步驟三排除不相干人
Finetune
微調的部分
第一部份分類模型: 人工檢查 把測試賽跟正式賽應該要是AML卻誤判不是的新聞加進去訓練資料 就醬。(效果不錯
第二部份NER:沒調 這模型很強
第三部份:我看隊友每天調但效果好像...
小技巧
- 第一天21名 第二天好像只有把GCP的CPU調高就變第10名了 可能因為一個新聞預測時間接近5秒 然後玉山又同時好幾個BOT在打 可能有的趕不上HealthCheck時間 調高CPU後每個新聞在三秒左右
- 本組全程使用GCP 這次A某平台好像災情遍野
- 新聞取10~2000字 字太多會爆時間 第10字前通常是記者XXXOO報導 沒啥意義
- 每天看分數變化 用Excel Vlookup看每天分數跟別人分數去思考問題在哪裡
5. 看到NLP就無腦用BERT就好了
6. 分類分數>0.5但名字被隊友奇怪規則砍光的新聞 我就把名字全撈回來 至少有名字有分數這樣
7. 寫LOG然後每天看 看模型準不準
結論
然後就第十了
領獎囉