基於CRF序列標註的中文依存句法分析器的Java實現

adnb34g發表於2019-01-16


這是一個基於 CRF的中文依存句法分析器,內部CRF模型的特徵函式採用 雙陣列Trie樹(DoubleArrayTrie)儲存,解碼採用特化的維特比後向演算法。相較於《最大熵依存句法分析器的實現》,分析速度翻了一倍,達到了1262.8655 sent/s

開源專案

本文程式碼已整合到 HanLP中開源 專案中,最新 hanlp1.7版本已經發布

CRF簡介

CRF是序列標註場景中常用的模型,比HMM能利用更多的特徵,比MEMM更能抵抗標記偏置的問題。在生產中經常使用的訓練工具是CRF++,關於CRF++的使用以及模型格式請參閱《CRF++模型格式說明》。

CRF訓練

語料庫

與《最大熵依存句法分析器的實現》相同,採用清華大學語義依存網路語料的 20000句作為訓練集。

預處理

依存關係事實上由三個特徵構成 ——起點、終點、關係名稱。在本CRF模型中暫時忽略掉關係名稱(在下文可以利用其它模型補全)。

根據依存文法理論 , 我們可以知道決定兩個詞之間的依存關係主要有二個因素: 方向和距離。因此我們將類別標籤定義為具有如下的形式:

[ + |- ] dPOS

其中 , [ + | – ]表示方向, + 表示支配詞在句中的位置出現在從屬詞的後面, – 表示支配詞出現在從屬詞的前面; POS表示支配詞具有的詞性類別; d表示距離。

比如原樹庫:

 

轉換後:

 

特徵模板

 

訓練引數

 

1. crf_learn -f 3 -c 4.0 -p 3 template.txt train.txt model -t

 

我的試驗條件(機器效能)有限,每迭代一次要花 5分鐘,最後只能設定最大迭代次數為100。經過痛苦的迭代,得到了一個效果非常有限的模型,其serr高達50%,暫時只做演算法測試用。

解碼

標準的維特比演算法假定所有標籤都是合法的,但是在本 CRF模型中,標籤還受到句子的約束。比如最後一個詞的標籤不可能是+nPos,必須是負數,而且任何詞的[+/-]nPos都得保證後面(或前面,當符號為負的時候)有n個詞語的標籤是Pos。所以我覆寫了CRF的維特比tag演算法,程式碼如下:

 

注意上面的

 

 1. if (!isLegal(j, i, table)) continue;

 

保證了標籤的合法性。

這一步的結果:

 

後續處理

有了依存的物件,還需要知道這條依存關係到底是哪種具體的名稱。我從樹庫中統計了兩個詞的詞與詞性兩兩組合出現概率,姑且稱其為 2gram模型,用此模型接受依存邊兩端的詞語,輸出其最可能的關係名稱。

最終結果

轉換為 CoNLL格式輸出:

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2561498/,如需轉載,請註明出處,否則將追究法律責任。

相關文章