衆所周知,命名實體識別(Named Entity Recognition,NER)是一項基礎而又重要的NLP詞法分析任務,也每每做爲信息抽取、問答系統、機器翻譯等方向的或顯式或隱式的基礎任務。在不少人眼裏,NER彷佛只是一個書本概念,跟句法分析同樣存在感不強。一方面是由於深度學習在NLP領域遍地開花,使得智能問答等曾經複雜的NLP任務,變得能夠端到端學習,因而分詞、詞性分析、NER、句法分析等曾經的顯式任務都隱式地編碼到了大型神經網絡的參數中;另外一方面,深度學習流行以後,NER問題相比以前有了比較長足的進步,LSTM+CRF的模式基本成爲業內標配,不少人認爲「這個事情應該差很少了」。算法
但!是!網絡
真正在工業界解決NLP業務問題的NLPer,每每發現事情遠無法這樣輕描淡寫。在真實的工業界場景中,一般面臨標註成本昂貴、泛化遷移能力不足、可解釋性不強、計算資源受限等問題,想要將NER完美落(bian)地(xian)可不簡單,那些在經典benchmark上自稱作到SOTA的方法放在現實場景中每每「也就那樣」。以醫療領域爲例:框架
那些口口聲聲遇事不決上BERT的人們,應該像我同樣,看着大家在NER問題上翻車機器學習
幾天前,賣萌屋的天然語言處理討論羣內就命名實體識別問題進行了一番激烈的討論,因爲討論持續了接近2小時,這裏就不貼詳細過程了(省略8k字)。ide
通過一番激烈的辯論,最後賣萌屋的做者傑神(JayLou婁傑)就討論中出現的若干問題給出了工業界視角下的實戰建議(每一條都是實打實的實戰經驗哇)。工具
傑神首先分享了他在醫療業務上作NER的七條經驗教訓:性能
很是直接的1層lstm+crf!
注:本文所說的lstm都是雙向的。學習
如何快速有效地提高NER性能? 若是這麼直接的打開方式致使NER性能達不到業務目標,這一點也不意外,這時候除了badcase分析,不要忘記一個快速提高的重要手段:規則+領域詞典。在垂直領域,一個不斷積累、不斷完善的實體詞典對NER性能的提高是穩健的,基於規則+詞典也能夠快速應急處理一些badcase;對於通⽤領域,能夠多種分詞工具和多種句法短語⼯具進行融合來提取候選實體,並結合詞典進行NER。此外,怎麼更好地將實體詞典融入到NER模型中,也是一個值得探索的問題(如嵌入到圖神經網絡中提取特徵[3])。優化
如何在模型層面提高NER性能? 若是想在模型層面(仍然是1層lstm+crf)搞點事情,上文講過NER是一個重底層的任務,咱們應該集中精力在embedding層下功夫,引入豐富的特徵:好比char、bigram、詞典特徵、詞性特徵、elmo等等,還有更多業務相關的特徵;在垂直領域,若是能夠預訓練一個領域相關的字向量&語言模型,那是最好不過的了~總之,底層的特徵越豐富、差別化越大越好(構造不一樣視角下的特徵)。編碼
將詞向量引入到模型中,一種簡單粗暴的作法就是將詞向量對齊到相應的字符,而後將字詞向量進行混合,但這須要對原始文本進行分詞(存在偏差),性能提高一般是有限的。
如何解決NER實體span過長的問題? 若是NER任務中某一類實體span比較長(⽐如醫療NER中的⼿術名稱是很長的),直接採起CRF解碼可能會致使不少連續的實體span斷裂。除了加入規則進行修正外,這時候也可嘗試引入指針網絡+CRF構建多任務學習(指針網絡會更容易捕捉較長的span,不過指針網絡的收斂是較慢的,能夠試着調節學習率)。
如何客觀看待BERT在NER中的做用? 對於工業場景中的絕大部分NLP問題(特別是垂直領域),都沒有必要堆資源。但這毫不表明BERT是「一無可取」的,在不受計算資源限制、通用領域、小樣本的場景下,BERT表現會更好。咱們要更好地去利用BERT的優點:
a. 在低耗時場景中,BERT能夠做爲一個「對標競品」,咱們能夠採起輕量化的多種策略組合去逼近甚至超越BERT的性能;
b. 在垂直領域應用BERT時,咱們首先確認領域內的語料與BERT原始的預訓練語料之間是否存在gap,若是這個gap越大,那麼咱們就不要中止預訓練:繼續進行領域預訓練、任務預訓練。
c. 在小樣本條件下,利用BERT能夠更好幫助咱們解決低資源問題:好比基於BERT等預訓練模型的文本加強技術[7],又好比與主動學習、半監督學習、領域自適應結合(後續詳細介紹)。
d. 在競賽任務中,能夠選取不一樣的預訓練語⾔模型在底層進行特徵拼接。具體地,咱們能夠將char、bigram和BERT、XLNet等一塊兒拼接喂入1層lstm+crf中。語⾔模型的差別越⼤,效果越好。若是須要對語言模型finetune,須要設置不一樣的學習率。
7.如何有效解決低資源NER問題? 若是拿到的NER標註數據仍是不夠,又不想標註人員介入,這確實是一個比較困難的問題。低資源NLP問題的解決方法一般都針對分類任務,這相對容易一些,如能夠採起文本加強、半監督學習等方式,詳情可參考 《如何解決NLP中的少樣本困境》 。而這些解決低資源NLP問題的方法,每每在NER中提高並不明顯。NER本質是基於token的分類任務,其對噪聲極其敏感的。若是盲目應用弱監督方法去解決低資源NER問題,可能會致使全局性的性能降低,甚至還不如直接基於詞典的NER。這裏給出一些能夠嘗試的解決思路(也許還會翻車):
a. 上文已介紹BERT在低資源條件下能更好地發揮做用:咱們可使用BERT進行數據蒸餾(半監督學習+置信度選擇),同時利用實體詞典輔助標註。
b. 還能夠利用實體詞典+BERT相結合,進行半監督自訓練,具體可參考文獻[8]。
c. 工業界畢竟不是搞學術,要想更好地解決低資源NER問題,RD在必要時仍是要介入覈查的。
9.如何克服NER中的類別不平衡問題? NER任務中,經常會出現某個類別下的實體個數稀少的問題,而常規的解決方法無外乎是重採樣、loss懲罰、Dice loss[10]等等。而在醫療NER中,咱們經常會發現這類實體自己就是一個長尾實體(填充率低),若是能挖掘相關規則模板、構建詞典庫也許會比模型更加魯棒。
10.如何對NER任務進行領域遷移? 在醫療領域,咱們但願NER模型可以在不一樣醫院、不一樣疾病間進行更好地泛化遷移(領域自適應:源域標註數據多,目標域標註數據較少),如能夠嘗試將特徵對抗遷移[11]。在具體實踐中,對抗&特徵遷移一般還不如直接採起finetune方式(對源域進行預訓練,在目標域finetune),特別是在後BERT時代。在醫療領域,泛化遷移問題並非一個容易解決的問題,試圖去將NER作成一個泛化工具每每是困難的。或許咱們更應該從業務角度出發去將NER定製化,而不是拘泥於技術致使沒法落地。
11.如何讓NER系統變得「透明」且健壯? 一個好的NER系統並非「一竿子插到底」的黑箱算法。在醫療領域,實體類型衆多,咱們每每須要構建一套多層級、多粒度、多策略的NER系統。
a. 多層級的NER系統更加「透明」,能夠回溯實體的來源(利於醫學實體消歧),方便「可插拔」地迭代優化;同時也不須要構建數目衆多的實體類型,讓模型「吃不消」。
b. 多粒度的NER系統能夠提升準召。第⼀步抽取⽐較粗粒度的實體,經過模型+規則+詞典等多策略保證⾼召回;第⼆步進⾏細粒度的實體分類,經過模型+規則保證⾼準確。
綜上,若是能在1層lstm+CRF的基礎上引入更豐富的embedding特徵、並進行多策略組合,足以解決垂直領域的NER問題;此外,咱們要更好地利用BERT、使其價值最大化;要更加穩妥地解決複雜NER問題(詞彙加強、冷啓動、低資源、噪聲、不平衡、領域遷移、可解釋、低耗時)。
除了上面的12條工業界實戰經驗,羣內的一個小夥伴@一一 還提出了一個實際場景常常遇到的問題:
lstm+crf作實體提取時,保證精度的狀況下,在提高模型速度上有沒有什麼好的辦法或者建議?
傑神一樣給予了一個飽含實戰經驗的回答:
個⼈經驗來講,1層lstm+CRF夠快了。