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

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

開源項目數組

本文代碼已集成到HanLP中開源項目中,最新hanlp1.7版本已經發布網絡

CRF簡介函數

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

CRF訓練性能

語料庫測試

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

預處理3d

依存關係事實上由三個特徵構成——起點、終點、關係名稱。在本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格式輸出:

相關文章
相關標籤/搜索