命名實體識別NER & 如何使用BERT實現

目錄

1、NER 簡介

2. NER方法

2.1 傳統機器學習方法:HMM和CRF      

2.2 LSTM+CRF:BiLSTM-CRF

2.3 CNN+CRF:IDCNN-CRF

2.4 BERT+(LSTM)+CRF:BERT實現

(1)獲取BERT預訓練模型

(2)修改 數據預處理代碼:DataProcessor

(3)構建模型:create_model

(4) 模型訓練

2.5 tensorflow裏的CRF原理

3. 實戰應用

3.1 語料準備

3.2 數據增強

4. 命名實體識別的難點與現狀

5. 未來研究的重點

6. 開源實現


論文:從機器學習到深度學習的代表性研究論文

項目:NLP經典項目實現和論文總結

實體識別關係抽取是例如構建知識圖譜等上層自然語言處理應用的基礎。實體識別可以簡單理解爲一個序列標註問題:給定一個句子,爲句子序列中的每一個字做標註。因爲同是序列標註問題,除去實體識別之外,相同的技術也可以去解決諸如分詞、詞性標註(POS)等不同的自然語言處理問題。

說到序列標註直覺是會想到RNN的結構。現在大部分表現最好的實體識別或者詞性標註算法基本都是biLSTM的套路。就算是關係抽取這種本來應該很適合CNN來做的文本分類的問題,我們也用了biGRU加字級別與句子級別的雙重Attention結構解決掉了。就像Ruder在他的博客 Deep Learning for NLP Best Practices 裏面說的,There has been a running joke in the NLP community that an LSTM with attention will yield state-of-the-art performance on any task.

1、NER 簡介

       NER又稱作專名識別,是自然語言處理中的一項基礎任務,應用範圍非常廣泛。命名實體一般指的是文本中具有特定意義或者指代性強的實體,通常包括人名、地名、組織機構名、日期時間、專有名詞等。NER系統就是從非結構化的輸入文本中抽取出上述實體,並且可以按照業務需求識別出更多類別的實體,比如產品名稱、型號、價格等。因此實體這個概念可以很廣,只要是業務需要的特殊文本片段都可以稱爲實體。

                

學術上NER所涉及的命名實體一般包括3大類(實體類,時間類,數字類)和7小類(人名、地名、組織機構名、時間、日期、貨幣、百分比)。隨着 NLP 任務的不斷擴充,在特定領域中會出現特定的類別,比如醫藥領域中,藥名、疾病等類別。

       實際應用中,NER模型通常只要識別出人名、地名、組織機構名、日期時間即可,一些系統還會給出專有名詞結果(比如縮寫、會議名、產品名等)。貨幣、百分比等數字類實體可通過正則搞定。另外,在一些應用場景下會給出特定領域內的實體,如書名、歌曲名、期刊名等。

       NER是NLP中一項基礎性關鍵任務。從自然語言處理的流程來看,NER可以看作詞法分析中未登錄詞識別的一種,是未登錄詞中數量最多、識別難度最大、對分詞效果影響最大問題。同時NER也是關係抽取、事件抽取、知識圖譜、機器翻譯、問答系統等諸多NLP任務的基礎。

NER當前並不算是一個大熱的研究課題,因爲學術界部分學者認爲這是一個已經解決的問題。當然也有學者認爲這個問題還沒有得到很好地解決,原因主要有:命名實體識別只是在有限的文本類型(主要是新聞語料中)和實體類別(主要是人名、地名、組織機構名)中取得了不錯的效果;與其他信息檢索領域相比,實體命名評測預料較小,容易產生過擬合;命名實體識別更側重高召回率,但在信息檢索領域,高準確率更重要;通用的識別多種類型的命名實體的系統性能很差。

2. NER方法

NER一直是NLP領域中的研究熱點,從早期基於詞典和規則的方法,到傳統機器學習的方法,到近年來基於深度學習的方法,NER研究進展的大概趨勢大致如下圖所示。

                   

                                                              圖1:NER發展趨勢

2.1 傳統機器學習方法:HMM和CRF      

在基於機器學習的方法中,NER被當作序列標註問題。利用大規模語料來學習出標註模型,從而對句子的各個位置進行標註。NER 任務中的常用模型包括生成式模型HMM、判別式模型CRF等。

        條件隨機場(ConditionalRandom Field,CRF)是NER目前的主流模型。它的目標函數不僅考慮輸入的狀態特徵函數,而且還包含了標籤轉移特徵函數。在訓練時可以使用SGD學習模型參數。在已知模型時,給輸入序列求預測輸出序列即求使目標函數最大化的最優序列,是一個動態規劃問題,可以使用Viterbi算法解碼來得到最優標籤序列。CRF的優點在於其爲一個位置進行標註的過程中可以利用豐富的內部及上下文特徵信息

                            

                                                                   圖2:一種線性鏈條件隨機場

                       

  • crf++學習模塊:crf++提供的一個基於CRF條件隨機域學習策略的學習方法。
  • 訓練語料:關於中文命名實體識別的訓練語料,網上有一些公開的語料庫(eg:人民日報語料庫),將其處理爲crf++能識別的格式,加入自己的標籤即可。
  • 特徵選取函數:告訴crf機器學習過程中需要考慮訓練語料中的哪些特徵(如上下文,詞性特徵等)
  • model:crf++將學習結果以一定格式保存到model文件中。
  • 測試語料:可以選擇語料庫中的一部分作爲測試語料。
  • crf++測試模塊:用於測試crf學習的效果,使用學習部分生成model去預測測試語料中的標籤。

如何提升系統的準確率和召回率

  • 訓練語料的質量和數量

  • 特徵的選取

  • 調整crf++的參數

  • 在召回的基礎上,進行二次crf學習,可以提高準確率 

2.2 LSTM+CRF:BiLSTM-CRF

參考:通俗理解BiLSTM-CRF命名實體識別模型中的CRF層

近年來,隨着硬件計算能力的發展以及詞的分佈式表示(word embedding)的提出,神經網絡可以有效處理許多NLP任務。這類方法對於序列標註任務(如CWS、POS、NER)的處理方式是類似的:將token從離散one-hot表示映射到低維空間中成爲稠密的embedding,隨後將句子的embedding序列輸入到RNN中,用神經網絡自動提取特徵,Softmax來預測每個token的標籤。

這種方法使得模型的訓練成爲一個端到端的過程,而非傳統的pipeline,不依賴於特徵工程,是一種數據驅動的方法,但網絡種類繁多、對參數設置依賴大,模型可解釋性差。此外,這種方法的一個缺點是對每個token打標籤的過程是獨立的進行,不能直接利用上文已經預測的標籤(只能靠隱含狀態傳遞上文信息),進而導致預測出的標籤序列可能是無效的,例如標籤I-PER後面是不可能緊跟着B-PER的,但Softmax不會利用到這個信息。

學術界提出了DL-CRF模型做序列標註。在神經網絡的輸出層接入CRF層(重點是利用標籤轉移概率)來做句子級別的標籤預測,使得標註過程不再是對各個token獨立分類。

應用於NER中的biLSTM-CRF模型主要構成:

  • Embedding層:主要有詞向量、字向量以及一些額外特徵

  • 雙向LSTM層:特徵抽取器

  • 最後的CRF層:做句子級別的標籤預測。

實驗結果表明biLSTM-CRF已經達到或者超過了基於豐富特徵的CRF模型,成爲目前基於深度學習的NER方法中的最主流模型。在特徵方面,該模型繼承了深度學習方法的優勢,無需特徵工程,使用詞向量以及字符向量就可以達到很好的效果,如果有高質量的詞典特徵,能夠進一步獲得提高。

我們來好好分析一下這個模型,看數據的流轉和各層的作用。

1.embedding layer 將中文轉化爲字向量,獲得輸入embedding

2.將embedding輸入到BiLSTM層,進行特徵提取(編碼),得到序列的特徵表徵,logits。

3.logits需要解碼,得到標註序列。將其輸入到解碼CRF層,獲得每個字的序列。

總結一下,該模型的重點其實有兩個:

1. 引入雙向LSTM層作爲特徵提取工具,LSTM擁有較強的長序列特徵提取能力,是個不錯的選擇。雙向LSTM,在提取某個時刻特徵時,能夠利用該時刻之後的序列的信息,無疑能夠提高模型的特徵提取能力。

2. 引入CRF作爲解碼工具。中文輸入經過雙向LSTM層的編碼之後,需要能夠利用編碼到的豐富的信息,將其轉化成NER標註序列。通過觀察序列,預測隱藏狀態序列,CRF無疑是首選。LSTM的輸出=觀測序列Y=一句話,CRF輸出=隱狀態序列X=標記序列,CRF使用維特比算法解碼得到隱藏狀態序列S(s1,s2,...st+1)。

    解碼問題:給出觀測序列O和模型μ,怎樣選擇一個隱藏狀態序列S(s1,s2,...st+1),能最好的解釋觀測序列O;

2.3 CNN+CRF:IDCNN-CRF

模型參考:https://github.com/crownpku/Information-Extraction-Chinese/tree/master/NER_IDCNN_CRF

解讀參考:https://www.toutiao.com/i6751585874980372995/

CNN雖然在長序列的特徵提取上有弱勢,然而CNN模型有並行能力,有運算速度快的優勢。膨脹卷積的引入,使得CNN在NER任務中,能夠兼顧運算速度和長序列的特徵提取。

基於2017年7月一篇paper Fast and Accurate Entity Recognition with Iterated Dilated Convolutions, 介紹一個使用 Iterated Dilated CNN加CRF的模型來做中文實體識別的方法。代碼主要是基於開源項目zjy-ucas/ChineseNER開發,在原來biLSTM模型的基礎上增加了IDCNN模型的選項,而IDCNN的模型參考了koth/kcws的實現。感謝!兩位大牛都基於tensorflow寫代碼,雖然風格迥異,代碼卻都非常漂亮!

Paper: Fast and Accurate Entity Recognition with Iterated Dilated Convolutions

對於序列標註來講,普通CNN有一個不足,就是卷積之後,末層神經元可能只是得到了原始輸入數據中一小塊的信息。而對NER來講,整個輸入句子中每個字都有可能對當前位置的標註產生影響,即所謂的長距離依賴問題。爲了覆蓋到全部的輸入信息就需要加入更多的卷積層,導致層數越來越深,參數越來越多。而爲了防止過擬合又要加入更多的Dropout之類的正則化,帶來更多的超參數,整個模型變得龐大且難以訓練。因爲CNN這樣的劣勢對於大部分序列標註問題人們還是選擇biLSTM之類的網絡結構,儘可能利用網絡的記憶力記住全句的信息來對當前字做標註。

但這又帶來另外一個問題,biLSTM本質是一個序列模型,在對GPU並行計算的利用上不如CNN那麼強大。如何能夠像CNN那樣給GPU提供一個火力全開的戰場,而又像LSTM這樣用簡單的結構記住儘可能多的輸入信息呢?

Fisher Yu and Vladlen Koltun 2015 提出了dilated CNN模型,意思是“膨脹的”CNN。其想法並不複雜:正常CNN的filter,都是作用在輸入矩陣一片連續的區域上,不斷sliding做卷積。dilated CNN爲這個filter增加了一個dilation width,作用在輸入矩陣的時候,會skip所有dilation width中間的輸入數據;而filter本身的大小保持不變,這樣filter獲取到了更廣闊的輸入矩陣上的數據,看上去就像是“膨脹”了一般。

具體使用時,dilated width會隨着層數的增加而指數增加。這樣隨着層數的增加,參數數量是線性增加的,而receptive field卻是指數增加的,可以很快覆蓋到全部的輸入數據。

                   

圖7中可見感受域是以指數速率擴大的。原始感受域是位於中心點的1x1區域:

(a)圖中經由原始感受域按步長爲1向外擴散,得到8個1x1的區域構成新的感受域,大小爲3x3;

(b)圖中經過步長爲2的擴散,上一步3x3的感受域擴展爲爲7x7;

(c)圖中經步長爲4的擴散,原7x7的感受域擴大爲15x15的感受域。每一層的參數數量是相互獨立的。感受域呈指數擴大,但參數數量呈線性增加。

對應在文本上,輸入是一個一維的向量,每個元素是一個character embedding:

                             

IDCNN對輸入句子的每一個字生成一個logits,這裏就和biLSTM模型輸出logits完全一樣,加入CRF層,用Viterbi算法解碼出標註結果。

在biLSTM或者IDCNN這樣的網絡模型末端接上CRF層是序列標註的一個很常見的方法。biLSTM或者IDCNN計算出的是每個詞的各標籤概率,而CRF層引入序列的轉移概率,最終計算出loss反饋回網絡。

2.4 BERT+(LSTM)+CRF:BERT實現

模型參考:https://github.com/macanv/BERT-BiLSTM-CRF-NER

BERT中蘊含了大量的通用知識,利用預訓練好的BERT模型,再用少量的標註數據進行FINETUNE是一種快速的獲得效果不錯的NER的方法。

(1)獲取BERT預訓練模型

BERT源碼可以從google-research的github中獲取:https://github.com/google-research/bert

在其GitHub中,也公佈了獲取BERT Chinese的預訓練模型,正是我們需要的,鏈接如下:

             https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip

(2)修改 數據預處理代碼:DataProcessor

參照DataProcessor,結合NER任務的特點,我們需要定義一個NerProcessor來處理NER標記語料,主要的工作就是將語料組織成Estimator能夠接受的格式。主要就是實現_read_data,_create_example和get_labels三個函數,具體需要組織成什麼樣的形式,可以看看源代碼。

我們可以實現如下形式的_create_example函數,它讀取語料和標記,並且通過InputExample函數,構造成Estimator能夠接受的格式。

def _create_example(self, lines, set_type):
   examples = []
   for (i, line) in enumerate(lines):
       guid = "%s-%s" % (set_type, i)
       text = tokenization.convert_to_unicode(line[1])
       label = tokenization.convert_to_unicode(line[0])
  examples.append(InputExample(guid=guid,     text=text, label=label))
   return examples

(3)構建模型:create_model

   首先,在create_model()中,我們利用BERT的BertModel類構造BERT結構,然後獲取其最後一層的輸出:

# 使用數據加載BertModel,獲取對應的字embedding
model = modeling.BertModel(
   config=bert_config,
   is_training=is_training,
   input_ids=input_ids,
   input_mask=input_mask,
   token_type_ids=segment_ids,
   use_one_hot_embeddings=use_one_hot_embeddin
   )
# 獲取對應的BertModel的輸出
embedding = model.get_sequence_output()

 然後增加(BiLSTM)CRF層,進行解碼:

max_seq_length = embedding.shape[1].value
# 算序列真實長度

used = tf.sign(tf.abs(input_ids))
lengths = tf.reduce_sum(used, reduction_indices=1) 

# 添加CRF output layer
blstm_crf =                   
    BLSTM_CRF(embedded_chars=embedding, 
                        hidden_unit=lstm_size, 
                        cell_type=cell, 
                        num_layers=num_layers,
                        dropout_rate=dropout_rate, 
                        initializers=initializers, 
                        num_labels=num_labels,
                        seq_length=max_seq_length, 
                        labels=labels,
                         lengths=lengths, 
                        is_training=is_training)
    rst = blstm_crf.add_blstm_crf_layer(crf_only=True)

(4) 模型訓練

做了上述的準備工作之後,模型的訓練只需參照run_pretraining.py的main函數即可。主要的工作有:

1. processors初始化

processor = processors[task_name]()

2. 加載訓練數據

train_examples = processor.get_train_examples(FLAGS.data_dir)

3. 利用model_fn_builder構造模型,加載模型參數等。這是Tensorflow中新的架構方法,通過定義model_fn函數,定義模型。然後用Estimator API進行模型的訓練,預測,評估等。

model_fn = model_fn_builder()

4. estimator配置

estimator = tf.contrib.tpu.TPUEstimator(
            model_fn=model_fn,...)

5.調用Estimator進行訓練過程的控制及正式開始訓練等。

5.1 將數據轉化爲tf_record 數據
5.2 讀取record 數據,組成batch
5.3 訓練模型

2.5 tensorflow裏的CRF原理

        在tensorflow中,實現了crf_log_likelihood函數。在命名實體識別項目中,自然語言是已知的序列,自然語言經過特徵提取過後的logits,是發射矩陣,對應着t_k函數;隨機初始化的self.trans矩陣是狀態轉移矩陣,對應着參數s_l,隨着訓練的過程不斷的優化。

代碼講解參考:https://mp.weixin.qq.com/s/79M6ehrQTiUc0l_sO9fUqA

3. 實戰應用

3.1 語料準備

Embedding:我們選擇中文維基百科語料來訓練字向量和詞向量。

基礎語料:選擇人民日報1998年標註語料作爲基礎訓練語料。

附加語料:98語料作爲官方語料,其權威性與標註正確率是有保障的。但由於其完全取自人民日報,而且時間久遠,所以對實體類型覆蓋度比較低。比如新的公司名,外國人名,外國地名。爲了提升對新類型實體的識別能力,我們收集了一批標註的新聞語料。主要包括財經、娛樂、體育,而這些正是98語料中比較缺少的。由於標註質量問題,額外語料不能加太多,約98語料的1/4。

3.2 數據增強

對於深度學習方法,一般需要大量標註語料,否則極易出現過擬合,無法達到預期的泛化能力。我們在實驗中發現,通過數據增強可以明顯提升模型性能。具體地,我們對原語料進行分句,然後隨機地對各個句子進行bigram、trigram拼接,最後與原始句子一起作爲訓練語料。

另外,我們利用收集到的命名實體詞典,採用隨機替換的方式,用其替換語料中同類型的實體,得到增強語料。

4. 命名實體識別的難點與現狀

參考:https://blog.csdn.net/u012879957/article/details/81281428

       中文的命名實體識別與英文的相比,挑戰更大,目前未解決的難題更多。英語中的命名實體具有比較明顯的形式標誌,即實體中的每個詞的第一個字母要大寫,所以實體邊界識別相對容易,任務的重點是確定實體的類別。和英語相比,漢語命名實體識別任務更加複雜,而且相對於實體類別標註子任務,實體邊界的識別更加困難。

       漢語命名實體識別的難點主要存在於:(1)漢語文本沒有類似英文文本中空格之類的顯式標示詞的邊界標示符,命名實體識別的第一步就是確定詞的邊界,即分詞;(2)漢語分詞和命名實體識別互相影響;(3)除了英語中定義的實體,外國人名譯名和地名譯名是存在於漢語中的兩類特殊實體類型;(4)現代漢語文本,尤其是網絡漢語文本,常出現中英文交替使用,這時漢語命名實體識別的任務還包括識別其中的英文命名實體;(5)不同的命名實體具有不同的內部特徵,不可能用一個統一的模型來刻畫所有的實體內部特徵。

      最後,現代漢語日新月異的發展給命名實體識別也帶來了新的困難。

其一,標註語料老舊,覆蓋不全。譬如說,近年來起名字的習慣用字與以往相比有很大的變化,以及各種複姓識別、國外譯名、網絡紅人、虛擬人物和暱稱的湧現。

                                            

其二,命名實體歧義嚴重,消歧困難。譬如下列句子:

                  餘則成潛伏在敵後 VS 餘則成潛伏在線

                 我和你一起唱《我和你》吧。

                 看完嚇死你:驚悚視頻,膽小勿入。

5. 未來研究的重點

最後進行一下總結,將神經網絡與CRF模型相結合的CNN/RNN-CRF成爲了目前NER的主流模型。對於CNN與RNN,並沒有誰佔據絕對優勢,各有各的優點。由於RNN有天然的序列結構,所以RNN-CRF使用更爲廣泛。基於神經網絡結構的NER方法,繼承了深度學習方法的優點,無需大量人工特徵。只需詞向量和字向量就能達到主流水平,加入高質量的詞典特徵能夠進一步提升效果。對於少量標註訓練集問題,遷移學習、半監督學習應該是未來研究的重點

半監督式學習是最近興起的一項技術,主要技術成爲“bootstrapping",它也包括了一些監督式學習的方法,例如,都需要從一系列種子來開始學習的過程,比如一個主要是別疾病名稱的系統運行之前就需要用戶提供幾個疾病實體的名稱,然後系統就開始搜索包含這些名稱的文本,並根據上下文的線索和一些其他的規則來找出相同文本中的其他疾病實例的名稱。之後系統再用新找到的實體作爲新的種子,重讀的在文本中進行搜索的過程並尋找新的實例。通過多次的重複,可以從大量的文本中找出大量的疾病名稱實體。近期進行的半監督的命名實體識別實驗的結果顯示,其性能和基線監督方法的性能相比具有很大競爭力。

命名實體識別近年來在多媒體索引、半監督和無監督的學習、複雜語言環境和機器翻譯等方面取得大量新的研究成果。隨着半監督的學習和無監督的學習方法不斷被引入到這個領域, 採用未標註語料集等方法將逐步解決語料庫不足的問題。在複雜語言現象(如借喻等)研究以及命名實體識別系統與機器翻譯的互提高方面, 也有廣闊的發展空間。命名實體識別將在更加開放的領域中, 綜合各方面的發展成果, 爲自然語言處理的深層次發展奠定更堅實的基礎。

6. 開源實現

1, https://github.com/Hironsan/anago

可以換成中文預料就可以訓練,bidirectional LSTM + CRF

2,https://github.com/ljingsheng/Named-Entity-Recognition

語料來自人民日報預料,keras,LSTM

3,https://github.com/zjy-ucas/ChineseNER

bidirectional LSTM + CRF tensorflow(其中的conlleval代碼可以用來評測命名實體識別結果,參考https://blog.argcv.com/articles/2104.c

4, https://github.com/crownpku/Information-Extraction-Chinese/tree/master/NER_IDCNN_CRF

Chinese Named Entity Recognition using IDCNN/biLSTM+CRF TensorFlow

5, (優先閱讀)https://github.com/Determined22/zh-NER-TF
BiLSTM-CRF TensorFlow 文章參考:http://www.cnblogs.com/Determined22/p/7238342.html

6, https://github.com/fangwater/Medical-named-entity-recognition-for-ccks2017

醫療領域命名實體 A LSTM+CRF model for the seq2seq task for Medical named entity recognition in ccks2017

7,達觀數據如何打造一箇中文NER系統(傳統CRF)

CRF打造的命名實體系統

8,BILSTM-CRF在命名實體識別NER上的應用

https://github.com/guillaumegenthial/sequence_tagging

https://guillaumegenthial.github.io/sequence-tagging-with-tensorflow.html

https://mp.weixin.qq.com/s?src=11&timestamp=1507706758&ver=445&signature=W71hFyMaaTnzLv5utt24BJQ9bSFndQzCDqFeg6Dg2ACdD0y3nlFDHNazDzzQees8VN21cbcUlXYBSN9AFJ7tNWX4ZJ2O-pj71Rhcc4ReX09HdLrk40whV09ojT9Jbsi*&new=1

9,CRF有用的Github

9.1,一個使用條件隨機場的中文命名實體識別模型(用sklearn_crfsuite,用人民日報語料)
https://github.com/lpty/nlp_base/tree/master/ner
https://blog.csdn.net/sinat_33741547/article/details/79131223

9.2,CRF++ 實現中文分詞 ( 有把分詞轉換爲CRF格式的代碼以及調用舉例的特徵模板)
http://www.stay-stupid.com/?p=224
https://github.com/ictlyh/CRFSegment
中文分詞工具測評
http://rsarxiv.github.io/2016/11/29/%E4%B8%AD%E6%96%87%E5%88%86%E8%AF%8D%E5%B7%A5%E5%85%B7%E6%B5%8B%E8%AF%84/
http://sighan.cs.uchicago.edu/bakeoff2005/

重要:命名實體現有可用訓練數據以及人民日報語料庫
https://github.com/hltcoe/golden-horse/tree/master/data

有CRF PPT介紹 CRF++模型格式說明
http://www.hankcs.com/nlp/the-crf-model-format-description.html

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章