這是一個基於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格式輸出: