基於CRF序列標註的中文依存句法分析器的Java實現
這是一個基於 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 依存句法分析器的簡單實現
- 基於keras的BiLstm與CRF實現命名實體標註KerasCRF
- NLP教程(4) - 句法分析與依存解析
- NLP(十二)依存句法分析的視覺化及圖分析視覺化
- 中文分詞工具之基於字標註法的分詞中文分詞
- 基於Label studio實現UIE資訊抽取智慧標註方案,提升標註效率!UI
- Spring Aop基於註解的實現Spring
- 編譯器前端之如何實現基於DFA的詞法分析器編譯前端詞法分析
- java版gRPC實戰之七:基於eureka的註冊發現JavaRPC
- 基於註解的 PHP 列舉類實現PHP
- Hanlp中使用純JAVA實現CRF分詞HanLPJavaCRF分詞
- 基於 “typesys” 實現序列指令碼框架指令碼框架
- 基於Java Instrument的Agent實現Java
- 詞法分析器的實現詞法分析
- spring和ehcache整合,實現基於註解的快取實現Spring快取
- 基於CNN和序列標註的對聯機器人 | 附資料集 & 開原始碼CNN機器人原始碼
- 基於標註策略的實體和關係聯合抽取 | 經典論文復現
- 經典論文復現 | 基於標註策略的實體和關係聯合抽取
- CRF基礎知識以及如何實現Learning,InferenceCRF
- ncdu – 基於ncurses庫的磁碟使用分析器
- Java 專案現在基於註解開發Java
- 基於以太坊上實現DApp的登入註冊APP
- 基於時間序列檢測演算法的智慧報警實現演算法
- java 實現開箱即用基於 redis 的分散式鎖JavaRedis分散式
- 一種融合指代消解序列標註方法在中文人名識別上的應用(下)
- 基於JWT標準的使用者認證介面實現JWT
- 基於MeanShift的目標跟蹤演算法、實現演算法
- C++基於模板實現智慧指標C++指標
- 雙向最大匹配演算法——基於詞典規則的中文分詞(Java實現)演算法中文分詞Java
- 基於 java 註解的 csv 檔案讀寫框架Java框架
- 基於jquery實現的ExceljQueryExcel
- 基於JVMTI的Agent實現JVM
- 用RMI實現基於Java的分散式計算(轉)Java分散式
- 基於gRPC的註冊發現與負載均衡的原理和實戰RPC負載
- 請問為什麼越來越多的技術偏向於基於註解的實現方式?
- spring基於註解配置實現事務控制Spring
- 支援中文的基於詞為基本粒度的字首樹(prefix trie)python實現Python
- 基於java的網路招聘系統的設計與實現Java