开源自然语言处理工具包hanlp中CRF分词实现详解
?CRF簡介
CRF是序列標(biāo)注場景中常用的模型,比HMM能利用更多的特征,比MEMM更能抵抗標(biāo)記偏置的問題。
[gerative-discriminative.png]?
CRF訓(xùn)練
這類耗時(shí)的任務(wù),還是交給了用C++實(shí)現(xiàn)的CRF++。關(guān)于CRF++輸出的CRF模型,請(qǐng)參考《CRF++模型格式說明》。?
CRF解碼
解碼采用維特比算法實(shí)現(xiàn)。并且稍有改進(jìn),用中文偽碼與白話描述如下:
首先任何字的標(biāo)簽不僅取決于它自己的參數(shù),還取決于前一個(gè)字的標(biāo)簽。但是第一個(gè)字前面并沒有字,何來標(biāo)簽?所以第一個(gè)字的處理稍有不同,假設(shè)第0個(gè)字的標(biāo)簽為X,遍歷X計(jì)算第一個(gè)字的標(biāo)簽,取分?jǐn)?shù)最大的那一個(gè)。
如何計(jì)算一個(gè)字的某個(gè)標(biāo)簽的分?jǐn)?shù)呢?某個(gè)字根據(jù)CRF模型提供的模板生成了一系列特征函數(shù),這些函數(shù)的輸出值乘以該函數(shù)的權(quán)值最后求和得出了一個(gè)分?jǐn)?shù)。該分?jǐn)?shù)只是“點(diǎn)函數(shù)”的得分,還需加上“邊函數(shù)”的得分。邊函數(shù)在本分詞模型中簡化為f(s’,s),其中s’為前一個(gè)字的標(biāo)簽,s為當(dāng)前字的標(biāo)簽。于是該邊函數(shù)就可以用一個(gè)4*4的矩陣描述,相當(dāng)于HMM中的轉(zhuǎn)移概率。
實(shí)現(xiàn)了評(píng)分函數(shù)后,從第二字開始即可運(yùn)用維特比后向解碼,為所有字打上BEMS標(biāo)簽。?
實(shí)例
還是取經(jīng)典的“商品和服務(wù)”為例,首先HanLP的CRFSegment分詞器將其拆分為一張表:
?
?
null表示分詞器還沒有對(duì)該字標(biāo)注。
代碼
上面說了這么多,其實(shí)我的實(shí)現(xiàn)非常簡練:
?
?
?
標(biāo)注結(jié)果
標(biāo)注后將table打印出來:
?
最終處理
?
將BEMS該合并的合并,得到:
[商品/null, 和/null, 服務(wù)/null]
然后將詞語送到詞典中查詢一下,沒查到的暫時(shí)當(dāng)作nx,并記下位置(因?yàn)檫@是個(gè)新詞,為了表示它的特殊性,最后詞性設(shè)為null),再次使用維特比標(biāo)注詞性:
[商品/n, 和/cc, 服務(wù)/vn]
新詞識(shí)別
?
CRF對(duì)新詞有很好的識(shí)別能力,比如:
CRFSegment segment = new CRFSegment();
segment.enablePartOfSpeechTagging(true);
System.out.println(segment.seg("你看過穆赫蘭道嗎"));
輸出:
?
CRF標(biāo)注結(jié)果
你 ??S ??
看 ??S ??
過 ??S ??
穆 ??B ??
赫 ??M ??
蘭 ??M ??
道 ??E ??
嗎 ??S ??
[你/rr, 看/v, 過/uguo, 穆赫蘭道/null, 嗎/y]
?
null表示新詞。
?
總結(jié)
以上是生活随笔為你收集整理的开源自然语言处理工具包hanlp中CRF分词实现详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: web网页设计实例作业 ——校园文化(7
- 下一篇: React开发(107):回显数据直接g