知識圖譜學習系列之二:命名實體識別2(基於BiLSTM及CRF)

!!!這是一篇未完成的文章,不慎點擊發布,請注意!!!

之前的一篇文章寫了基於CRF的命名實體識別模型,並上傳了代碼,現在添加BiLSTM部分。關於BiLSTM的介紹,可以看我的另一篇文章,這裏主要是訓練過程以及其中的一些問題。

聲明:訓練部分的代碼及數據來源於網上,對原作者的成果表示感謝。遺失了原文鏈接,找到後會添加。

1.爲什麼是BiLSTM與CRF的結合

在利用CRF搭建模型的時候已經指出,這種方法的一大不足之處就是,需要人工手動設置特徵模板,據此算法纔可以提取出特徵。由此可知,特徵模板設置的好壞就會直接影響到實體識別的效果。爲了解決這個問題,人們提出了利用BiLSTM進行特徵的提取。

實際上,如果在BiLSTM模型後添加一個softmax層,即將BiLSTM的輸出控制到你想要的輸出維度(在NER任務中,假設輸入文本的長度爲LL,實體種類爲nn,那麼輸出維度就是n×Ln×L),這個最終的輸出矩陣就看以看做是得分矩陣,我們只需要逐個找出輸入單字的得分最大的標籤即可。圖示如下:
在這裏插入圖片描述
可以看出,利用BiLSTM構建的模型可以取得一定的效果。然而,根據最大得分選擇標籤並不總是得到正確的結果,儘管BiLSTM可以考慮上下文的信息,但它不能檢查輸出結果的邏輯,即根據BiLSTM搭建的NER模型可能會得到B_Per I_Loc B_Loc I_Per O等結果。如果可以對結果進行一定的篩選,比如:O後面不能接I開頭的標籤、不會單獨出現I標籤等,那麼結果的準確率將會得到提升。

要完成這樣的功能,需要怎麼做呢?我們知道,CRF模型中計算了轉移概率,而上述所說的那些邏輯錯誤的例子在對語料進行標註時是不會出現的,即它們的轉移概率會非常小。如果把BiLSTM的輸出作爲CRF的輸入,那麼就可以將發生邏輯錯誤的部分“扭轉”過來,從而提高準確率。

2.模型構建

這部分,將展示如何利用tensorflow框架來搭建一個上述NER模型並對其進行訓練。

2.1.數據部分

2.1.1.數據描述

./data文件夾中保存了三個文件,分別是example.devexample.testexample.trian,分別對應開發集、測試集與訓練集。其中的數據格式如下:

海 O
釣 O
比 O
賽 O
地 O
點 O
在 O
廈 B-LOC
門 I-LOC
與 O
金 B-LOC
門 I-LOC
之 O
間 O
的 O
海 O
域 O
。 O

可以看出,每個字佔一行,後面是一個空格,然後是它的實體標籤。在原始數據中,標籤的方式是B-I-O。一個句子結束後,是一個空行,然後按照同樣的格式接第二個句子。

2.1.2.數據導入

讀入原始數據,用到了loader.py包中的load_sentences函數,該函數的輸出爲一個三層的嵌套列表,原始數據中每一行組成一個列表,每個句子組成第二層列表,所有的句子組成第三層列表。

2.1.3.標籤更新

一般來說,實體標籤分的越細,則NER的結果越好。因此,用B-E-S-I-O的標籤替換掉B-I-O標籤。loader.py中還有一個update_tag_scheme函數,用於將導入的數據的標籤進行轉換。該函數只是對原始數據的標籤進行了轉換操作,並沒有輸出。

2.1.4.詞向量

任何神經網絡均只能接受數值型的輸入,所以自然語言處理的首要任務就是將字轉化爲數值。一種合適的轉化方法叫做“詞嵌入”(word embedding),或者叫“詞向量”。通過這種方式,可以把所有的詞轉化爲特定長度的向量,而且它可以保證具有類似意義的詞之間的餘弦距離很小,反之則距離很大。

在本次訓練中,保存好的詞向量文件爲wiki_100.utf8。用文本編輯器打開後可以發現,文件的正文部分就是每個字(字符)及其對應的詞向量,這裏維度是100。當語料庫更新時,應該重新生成該映射文件,以免有新的漢字加入。關於如何訓練得到詞向量,超出本文的範圍,不做過多說明。

2.1.5.數據分批

接下來就是將數據按照batch_size的大小進行分批。這裏定義了一個類BatchManager,通過調用該類,我們可以實現數據的分批

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