Hanlp中使用純JAVA實現CRF分詞
Hanlp 中使用純 JAVA 實現 CRF 分詞
與基於隱馬爾可夫模型的最短路徑分詞、 N- 最短路徑分詞相比,基於條件隨機場( CRF )的分詞對未登入詞有更好的支援。本文( HanLP )使用純 Java 實現 CRF 模型的讀取與維特比後向解碼,內部特徵函式採用 雙陣列 Trie 樹 (DoubleArrayTrie) 儲存,得到了一個高效能的中文分詞器。
開源專案
本文程式碼已整合到 HanLP 中開源: http://hanlp.com/
CRF 簡介
CRF 是序列標註場景中常用的模型,比 HMM 能利用更多的特徵,比 MEMM 更能抵抗標記偏置的問題。
CRF 訓練
這類耗時的任務,還是交給了用 C++ 實現的 CRF++ 。關於 CRF++ 輸出的 CRF 模型,請參考《 CRF++ 模型格式說明》。
CRF 解碼
解碼採用維特比演算法實現。並且稍有改進,用中文偽碼與白話描述如下:
首先任何字的標籤不僅取決於它自己的引數,還取決於前一個字的標籤。但是第一個字前面並沒有字,何來標籤?所以第一個字的處理稍有不同,假設第 個字的標籤為 X ,遍歷 X 計算第一個字的標籤,取分數最大的那一個。
如何計算一個字的某個標籤的分數呢?某個字根據 CRF 模型提供的模板生成了一系列特徵函式,這些函式的輸出值乘以該函式的權值最後求和得出了一個分數。該分數只是“點函式”的得分,還需加上“邊函式”的得分。邊函式在本分詞模型中簡化為 f(s',s) ,其中 s' 為前一個字的標籤, s 為當前字的標籤。於是該邊函式就可以用一個 4*4 的矩陣描述,相當於 HMM 中的轉移概率。
實現了評分函式後,從第二字開始即可運用維特比後向解碼,為所有字打上 BEMS 標籤。
例項
還是取經典的 “商品和服務”為例,首先 HanLP 的 CRFSegment 分詞器將其拆分為一張表:
null 表示分詞器還沒有對該字標註。
程式碼
上面說了這麼多,其實我的實現非常簡練:
標註結果
標註後將 table 列印出來:
最終處理
將 BEMS 該合併的合併,得到:
然後將詞語送到詞典中查詢一下,沒查到的暫時當作 nx ,並記下位置(因為這是個新詞,為了表示它的特殊性,最後詞性設為 null ),再次使用維特比標註詞性:
新詞識別
CRF 對新詞有很好的識別能力,比如:
輸出:
null表示新詞。
轉載自 hankcs的部落格
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2216870/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Hanlp分詞之CRF中文詞法分析詳解HanLP分詞CRF詞法分析
- 開源自然語言處理工具包hanlp中CRF分詞實現詳解自然語言處理HanLPCRF分詞
- Hanlp在java中文分詞中的使用介紹HanLPJava中文分詞
- Hanlp分詞例項:Java實現TFIDF演算法HanLP分詞Java演算法
- java分詞工具hanlp介紹Java分詞HanLP
- HanLP分詞工具中的ViterbiSegment分詞流程HanLP分詞Viterbi
- HanLP-實詞分詞器詳解HanLP分詞
- HanLP分詞命名實體提取詳解HanLP分詞
- Elasticsearch整合HanLP分詞器ElasticsearchHanLP分詞
- Spark中分散式使用HanLP(1.7.0)分詞示例Spark分散式HanLP分詞
- Spring MVCD框架中呼叫HanLP分詞的方法SpringMVC框架HanLP分詞
- HanLP中文分詞Lucene外掛HanLP中文分詞
- MapReduce實現與自定義詞典檔案基於hanLP的中文分詞詳解HanLP中文分詞
- 分詞工具Hanlp基於感知機的中文分詞框架HanLP中文分詞框架
- NLP入門學習中關於分詞庫HanLP匯入使用教程分詞HanLP
- Ansj與hanlp分詞工具對比HanLP分詞
- python呼叫hanlp分詞包手記PythonHanLP分詞
- ElasticSearch中使用ik分詞器進行實現分詞操作Elasticsearch分詞
- HanLP分類模組的分詞器介紹HanLP分詞
- NLP自然語言處理中的hanlp分詞例項自然語言處理HanLP分詞
- 基於hanlp的es分詞外掛HanLP分詞
- 簡明條件隨機場CRF介紹 | 附帶純Keras實現條件隨機場CRFKeras
- 使用cjieba(結巴分詞庫)實現php擴充套件中文分詞JiebaPHP套件中文分詞
- HanLP-停用詞表的使用示例HanLP
- 基於 HanLP 的 ES 中文分詞外掛HanLP中文分詞
- Hanlp分詞1.7版本在Spark中分散式使用記錄HanLP分詞Spark分散式
- python使用jieba實現中文文件分詞和去停用詞PythonJieba分詞
- 三種方式使用純 CSS 實現星級評分CSS
- 中文分詞演算法工具hanlp原始碼解析中文分詞演算法HanLP原始碼
- HanLP程式碼與詞典分離方案與流程HanLP
- VicWord 一個純php的分詞PHP分詞
- hanlp原始碼解析之中文分詞演算法詳解HanLP原始碼中文分詞演算法
- hanlp中文智慧分詞自動識別文字提取例項HanLP分詞
- python 實現中文分詞統計Python中文分詞
- 純前端實現詞雲展示+附微博熱搜詞雲Demo程式碼前端
- 使用 FastText 實現詞嵌入AST
- 中文分詞的探索,CRF(條件隨機場)和HMM(隱馬爾可夫模型)用於分詞的對比,以及中文分詞的評估中文分詞CRF條件隨機場HMM隱馬爾可夫模型
- 自然語言處理工具HanLP-N最短路徑分詞自然語言處理HanLP分詞