玉山人工智慧公開挑戰賽2020夏季賽 — NLP應用挑戰賽

Jerry Chang
4 min readAug 21, 2020

--

第十名 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:沒調 這模型很強

第三部份:我看隊友每天調但效果好像...

小技巧

  1. 第一天21名 第二天好像只有把GCP的CPU調高就變第10名了 可能因為一個新聞預測時間接近5秒 然後玉山又同時好幾個BOT在打 可能有的趕不上HealthCheck時間 調高CPU後每個新聞在三秒左右
  2. 本組全程使用GCP 這次A某平台好像災情遍野
  3. 新聞取10~2000字 字太多會爆時間 第10字前通常是記者XXXOO報導 沒啥意義
  4. 每天看分數變化 用Excel Vlookup看每天分數跟別人分數去思考問題在哪裡

5. 看到NLP就無腦用BERT就好了

6. 分類分數>0.5但名字被隊友奇怪規則砍光的新聞 我就把名字全撈回來 至少有名字有分數這樣

7. 寫LOG然後每天看 看模型準不準

結論

然後就第十了

領獎囉

--

--