那些自然語言處理 (Natural Language Processing, NLP) 踩的坑

Deep Learning 101 Meetup (The top private AI Meetup in Taiwan launched on 2016)



本文純屬個人與小夥伴們近年研究NLP心得匯整回憶
歡迎討論交流 ! 人設是大神的各位想嘴砲或幹話? 

會議記錄大師 | Deep Learning 101 | 臺灣深度大師
御守臺灣・科技抗疫提高聲紋辨識正確率 更添防疫新利器
台灣人工智慧社團 FB | YouTube | Odysee Deep Learning 101 FB

關於自然語言處理,如果你在臺灣,那你第一時間應該會想到俗稱Chatbot的聊天機器人 (就是要人工維運關鍵字跟正規表示式的機器人)吧?目前為止,從最早的中英文的情感分析,陸續接觸過文本糾錯(校正)文本分類文本相似度命名實體識別文本摘要機器閱讀理解等 (語音部份擇日另篇分享),當然自然語言處理其實博大精深,還有像是分詞、詞性標註、句法分析、語言生成等,傳說中的知識圖譜 (Ontology?) 更是大魔王了;這邊僅先匯整接觸過的做說明,當然在深度學習還未爆紅前,已經有非常多的演算法,未來也盡量針對各個項目與領域持續更新簡單介紹,就當近幾次專題演講的摘要,也算是這幾年跟小夥伴們奮鬥NLP充滿血與淚的回憶;另外,根據經驗,論文當然要追,更要實作跟實驗,但算法模型其實效果已經都差不多,如果你想將算法實際落地,別懷疑,請好好的處理你的數據,這會是蠻關鍵的地方。另外,你一定也要知道 BERT家族,早在2018年11月,Google 大神釋出 BERT 後,就差不多屌打各種自然語言處理應用 (在這之前,你想搞自然語言處理,勢必用到騰訊所開源需要16GB記憶體的Tencent_ChineseEmbedding),再後來還有像是 transformer 跟 huggingface,所以你一定要花點時間瞭解;當然,如果你真的沒太多時間投入去換跟處理數據然後重新訓練,那交流聯絡一下吧,不然公開數據都是對岸用語或簡體跟英文還要擠GPU計算資源,你會很頭痛 ! 對啦,你也可以試試 NVIDIA GTC 2021 介紹的Javis等對話式AI等東西,但我想你還是會覺得不容易上手就是,除非你想自己從頭硬幹去瘋狂的標註適合自己場景的數據,然後瞭解怎樣重新訓練模型

適用針對文章提出問題並從中抽取出答案 (用文章中一段原文來回答問題)


投入約120天,早期想上線需要不少計算資源 (沒有昂貴的GPU想上線簡直是難如登天,好險時代在進步,現在CPU就能搞定)。記得我2018從老闆口中第一次聽到新項目是機器閱讀理解時,一頭霧水不知道是在幹麼,Google後突然發現這還真是它X的超級難的東西,而當時落地場景是要解決機器人在博物館或者展場的Q&A,不想再預先建一堆關鍵字與正規表示式來幫相似度和分類做前處理。


那麼在機器閱讀理解 (MRC) 會踩到什麼坑呢?機器閱讀理解坑真的不小,首先當然是數據,公開數據有SQuAD 1.0和2.0,但這是英文,你想用在中文 ? 你可以自己試試啦,再來有了個中文的CMRC,但用得是對岸用語跟簡體中文,而且數據格式不太一樣;後來台達電放出了DRCD還有科技部辦的科技大擂台,依然有格式不同的問題,數據量真的不太夠,所以想要落地你真的得要自己標註。


為了解決像是多文章還有問非文章內問題還有公開數據要嘛英文不然就是簡體中文或對岸用語,然後本地化用語的數據實在不足的狀況,但小夥伴們真的很給力,我們也用機器翻譯SQuAD 1.0和2.0還有自己手工爬維基百科跟開發了數據標註系統自己標註 ! 不得不說小夥伴們真的是投入超多精神在機器閱讀理解,更在Deep Learning 101做了分享。 XD ~ 有圖有證據,看看下方截圖效果,不信你真的可以試試右下角的 FB Messenger;或者直接看下方最新的整合了聲紋識別的閱讀理解 DEMO。





適用於針對輸入文本(對話),特別是語音識別同音異字等進行改錯

這個項目堪稱是在NLP這個坑裡投入第二多的,記得當時的場景是機器人在商場裡回答問題所顯示出來的文字會有一些ASR的錯字 (關於ASR的部份擇日再分享),但是問題一樣卡在數據集,還因此讓小夥伴們花了好長時間辛苦去標註 XD,但看看現在效果,我想這是值得的 ! 

記得一開始是先依賴 pycorrector,然後再換 ConvSeq2Seq,當然 bert 也做了相關優化實驗,中間一度被那三番二次很愛嗆我多讀書,從RD轉職覺得自己很懂得做產品的PM拿來跟百度對幹,從一開始的看實驗結果輸,到後來慢慢贏了,卻又自己亂測說還是不夠好之類的叭啦叭啦,說實話,你最後不也人設也垮了然後閃人 ~ 攤手 ~


現在看看這截圖效果,不是蠻勵害的嗎 ? 真的想說這社會真的充滿一堆人設嚇死人的人,無敵愛嘴砲 ! 搞的為了滿足那位人設比天高的需求,真的是想了像是用拼音還兼NER來整合的好幾種方法 !


所以文本糾錯會有什麼坑呢?數據啊、格式啊 !!! 還有幾個套件所要處理的目標不太一樣,有的可以處理疊字有的可以處理連錯三個字,還有最麻煩的就是斷字了,因為現有公開大家最愛用的仍舊是Jieba,即便它是有繁中版,當然也能試試 pkuseg,但就是差了點感覺。

適用針對文本(對話)內容之實體 (店名、人名、食物名等等)進行識別


關於NER要踩的坑命名實體識別 (Named Entity Recognition, NER) 是指將語句中的元素分成預先定義的類別(人名、地名...),而比較廣義的應用就屬填槽 (Slot-Filling)。最早 (2019/01時) 我們需處理的場景是針對電話助理的話內容(就是APP幫你接電話跟對方對話) 做處理,印像中沒做到非常深入;後來剛好招聘到熟悉NER這部份的小夥伴們,剛好一直想把聊天對話做個流程處理 (多輪對話的概念) 就再花了點時間當做上手,因為一直想要做個不需要依賴大量關鍵字和正規表示式做前處理的對話,中間更是試了不少數據集,做了像是用拼音還有直接漢字或者品牌定義等超多的實驗,甚至還一度想硬整合 RASA 等等的開源套件,還有也嘗試用了 " 改寫 " 來修正對話內容,比較容易去識別出語句中的重點字。至於這個的數據標據就真的更累人,意外找到一個蠻好用的標註系統 ChineseAnnotator,然後我們就瘋狂開始標註 !

針對輸入文本(對話)或候選詞比較是否語義相似

簡單來說便是比對兩個文句是否雷同/帶有一樣意思,特別是中文博大精深,認真探討其實很難,像是廁所在那裡跟洗手間在那裡,兩句話的意思是一樣,但字卻又完全不同;至於像是我不喜歡你跟你真是個好人 ~ xDDD,這就是另一種相似度了 ! 

相似度的坑就比較少:一樣要處理的是先看看常見的相似度數據格式 ! 通常是兩段話,各以 tab 或 "," 做相隔,然後最後補上表示相同的 " 1 " 或是不相同的 " 0 "。

換一首歌曲好不好 換一首 1
你在哪邊 你在哪裡 0
你怎麼不下樓啊 請問你在幾樓呀 0
你會你會唱唱 你會唱歌嗎 0
衛生間在哪裡 衛生間在哪兒找 1
這個沒有用了 拜拜不用了 0
拜拜再見我要回家了 拜拜再見 1
你聽明白了嗎 我要聽 0

 

那麼相似度可以用在什麼地方呢 ? 現在常見的有:
  1. 做一個Q&A的問答系統,會需要準備一些經典/常見的問題以及其對應的答案,如果有問題和經典/常見問題很相似,需要可以回答其經典/常見問題的答案。
  2. 整理數據資料,需要將相類似的做為集合,這部份在下一個文本分類的介紹就很需要。

你可能也聽過 TF-IDF 或者 n-gram 等,這邊就不多加解釋,建議也多查查,現在 github 上可以找到非常的範例程式碼,建議一定要先自己動手試試看 ! 最後附上當初小夥伴們做的實驗和API的結果。

Albert - Acc: 0.888
MatchSRNN - Acc: 0.8674
Bert + BiLSTM + Att Acc: 0.8881
Recall: 0.8881
Precision: 0.8882
Confusion Matrix:
[[ 4408 592]
[ 527 4473]]

適用針對輸入文本(對話/語音識別後)進行分類以供下一步對話搜尋

文本分類相對也是較沒啥難搞的坑:數據上比較好搜集,像是amazon的評價等等這些,問題比較大的就是分類標準/項目可能不太一樣,然後這個項目後來一樣是跟那位人設比天高的懟了好幾次,想針對機器人的對話做分類。
數據資料
Train: 76991 (other: 53966, mall_service: 23025)
Test: 5788 (other: 5503, mall_service: 285)
Epoch: 10,000
Early stop: 100 (old model is 10)
BERT+BiLSTM+Attention實驗結果
Epoch: 66
Training time: 1h 34m 33s
Accuracy: 0.9267
loss: 0.5153
Confusion matrix:
[[5162, 341],
[83, 202]]
BERT+TextCNN實驗結果
Epoch: 175
Training time: 2h 18m 16s
Accuracy: 0.9155
loss: 0.9044
Confusion matrix:
[[5091, 412],
[77, 208]]
Tencent Embedding + BiGRU + Attention (old model)實驗結果
Epoch: 17
Training time: 6h 1m 18s
Accuracy: 0.8944
loss: 0.5656
Confusion matrix:
[[4946, 557],
[54, 231]]


另外值得一提的是,搞分類跟相似度還做了中文(60天)跟英文(90天)的情感分析,用來分析相關留言評價,開發概念差不多,關鍵就還是數據搜集與處理,像是要去爬FB上面的留言等等;系統上線運作好一陣子;也算體驗到所謂的系統上線,其實要考慮的東西真的不少啊。最後,發現 Google " nlp asr "時的第一頁 結果。。。😎