命名實體識別(Name Entity Recognition) 是自然語言處理中一個比較基礎的問題。要解決的問題是,從unstructure的文字當中找到實體並歸類。當然我這麼定義已經有了一定的bias,認為是先找實體在歸類,但實現過程則並不一定如此。
定義一般來說都比較抽象,我們舉一些例子來理解一下NER試圖要解決的問題。比如說,一篇作文中,找出時間,人物,地點; 一個醫學報告中,找出疾病名稱及藥品名稱等; 一份合同中,找出甲方乙方,付款方式以及到期日期等。
這些問題看上去似乎並不難,近幾年的BiLSTM, BERT以及各種變形模型也不斷重新整理分數棒,F1高達0.95.
然而,當把NER運用到實際中來時,效果並不像理論上那麼好。很多人稱,NER問題離被解決還有很長的路要走。
為什麼呢?
首先,對於實體的定義,據說即使都是行業專家,認同度達到95%已是非常難。人類尚未清楚自己想要什麼,怎能期待模型能給出完美答案呢。這句話其實不然,也許模型就是知道你想要什麼。
扯遠了,其實要說的是,定義的模糊是這個問題的難點之一。舉一個藥品的例子。上下文是,一個人得了感冒,醫生建議吃點泡騰片,補充一下vc。那,這個泡騰片可以是藥品嗎?
難點之二,一詞多義,在簡短的上下文中無法正確歸類。比如說, 甲殼蟲走了。這句話中,甲殼蟲可以是汽車,可以是昆蟲。
難點之三,邊界模糊,主要原因是複雜的實體在標註的時候,就很難有一致的認識,以及實體prevalence(出現率)比較低導致邊界在哪裡嘛,太難說了。對於前者,比如說合同型別,"某某公司的員工僱傭合同”和"員工僱傭合同”都可以歸類為合同型別,但字首取不取呢,在不同上下文中可能有不同的需求。
NER問題解決經歷了三個階段。
最早的技術是,規則匹配和詞典查詢匹配。為了提高precision和recall,規則會變得非常的複雜,詞典會變得非常的龐大。要構造完整的詞典代價非常的大,於是在詞典匹配上又結合了叢集以及相似度查詢的方法。
第二階段,手工特徵工程➕機器學習。這個階段的特徵工程的工作相當繁重,除了n-gram的詞之外,比如說POS tag, 大小寫,數字替代,詞語叢集等等。機器學習部分一般是比較簡單的邏輯迴歸加CRF解碼。即使手動工作量相當繁重,但是比起規則匹配和完善詞典的工作還是輕鬆不少,效果也好很多。
第三階段,深度學習。這個階段,重要特徵在深度神經網路中基本上可以做到自動提取,並且,效果明顯比手動的特徵工程好很多。加上embedding的使用,使得模型的輸入含有更加豐富的資訊。排行榜不斷被重新整理的事實也可以說明這一點。
那為什麼深度學習還是不能完美解決實際的問題呢。這和之前提出來的難點息息相關的。
一詞多義需要很長的上下文才能明確意思,但一般的深度學習模型不能有太長的輸入。比如說經典的用來解決NER的深度模型BERT或BiLSTM一般輸入為512或728個token,如果太長,系統資源消耗太大。
另外,一般的評分系統都是基於token的,最終整個片語被準確識別出來的分數並未受到非常大的關注。片語分界問題在不同的領域難度也差別很大,但如何在token模型之後準確解碼到片語,並沒有被很好的research過。
實際的NER問題比公共資料庫,比如說CoNLL的難度要大很多。每個行業可能有自己的twist,但是並沒有系統的被討論和共享起來。
難以得到完美的資料集,使得這個問題即使解決的再完美也只能停留在某個水平。
之前看spacy的創始人講NER, 說大家要達到一個基礎水平很容易,要上一個臺階就非常難了。NER這個問題尚未解決也是相當fair的一種說法。
閱讀作者更多原創,觀眾微信公眾號: