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

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


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

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

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

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


記得我第一次聽到新項目是機器閱讀理解時,一頭霧水不知道是在幹麼,在Google後發現這還真是個超級難的東西,記得當時場景是想幫機器人在博物館或者展場的Q&A提升準確度,不用建一堆關鍵字與正規表示式來做前處理;那時可以查到的就是一些SQuAD等的數據集還有QANET等模型,然後千辛萬苦的訓練好,卻卡在沒有GPU想上線簡直是難如天,結果時代在進步,現在跑起來就蠻好的,不信你快點試試右下角的 FB Messemger 啊 (有圖有證劇) ! 關於閱讀理解小夥伴們真的是陸續投入最多精神的,也在 Deep Learning 101 做了分享。


那麼在機器閱讀理解 (MRC) 會踩到什麼坑呢?:首先當然是數據,公開數據有前述提到的 SQuAD 1.0 和 2.0,但這是英文,你想用在中文 ? 你可以自己試試啦,再來有了個中文的 CMRC,但是用得是對岸用語跟簡體中文,而且數據格式不太一樣;後來台達電子放出了DRCD,數量堪用,效果也不差;後來還有科技部辦的科技大擂台,依然有格式不同的問題,最後就是數據量真的不太夠,所以想要落地你真的還是得要自己標註;最後當然是許多開源的模型了,嗯 ! 你懂的,開源通常會因為開發環境不同而有令人頭痛的bug,至於模型有興趣之後可以再做個介紹。


而我們有解決像是多文章還有問非文章內問題的還有計算資源不足本地化用語的數據實在不足的狀況嗎? XD ~ 有圖有證據,看看下方截圖效果,不信你真的可以試試右下角的 FB Messenger;或者直接看下方最新的整合了聲紋識別的閱讀理解 DEMO。




值得一提的是,有陣子深感數據真的就是最關鍵的,然後公開數據要嘛英文不然就是簡體中文或對岸用語,實在很苦腦,不過小夥伴們真的給力,因此開發了好幾個數據處理系統,而這正是臺灣深度大師還是比較方便好用一點的關鍵 !

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

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

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


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


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

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


關於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 "時的第一頁 結果。。。😎