HanLP 分詞——隱馬爾可夫模型

序列標註與分詞

所謂序列標註,就是講一個序列進行切分,並對切分結果進行標註的過程。
最常見的序列標註當屬詞性標註。此時,需要將句子切分成塊,並對每一個單詞進行詞性標註,這就是一個典型的序列標註問題。
分詞當然也可以說是一個序列標註的過程,只不過標註集可爲**{B,M,E,S}**,其中 B 爲開頭、M 爲中間、E 爲結尾、S 爲單個詞。從而將分詞問題,轉換爲序列標註問題!

隱馬爾科夫模型模型

隱馬爾可夫模型模型實際上是一種狀態轉移模型
隱馬爾可夫模型
其中 y 爲序列, x爲狀態。換句話說, y 爲單詞,x 爲{B,M,E,S} 。
因此,在單詞拆分中,我們認爲狀態決定單詞拆分。

HanLP 實現

可見,要訓練一個能夠用於分詞的隱馬爾科夫模型模型,首先需要對已經分詞的語料庫進行標註。之後,再將語料庫轉換成二元組 (x,y)(x,y) 。所幸的是,這些 HanLP 都爲我們實現了。使用語料庫訓練模型如下(語料庫爲分詞後的詞典):

from pyhanlp import *
FirstOrderHiddenMarkovModel = JClass('com.hankcs.hanlp.model.hmm.FirstOrderHiddenMarkovModel')
HMMSegmenter = JClass('com.hankcs.hanlp.model.hmm.HMMSegmenter')

corpus_path = r'E:\Anaconda3\Lib\site-packages\pyhanlp\static\data\test\icwb2-data\training\msr_training.utf8'    #數據集所在路徑。可用txt文件

model = FirstOrderHiddenMarkovModel()    #實例化一個馬爾可夫模型
segmenter = HMMSegmenter(model)    #實例化一個馬爾可夫分類器
segmenter.train(corpus_path)    #使用語料庫訓練模型
segment = segmenter.toSegment()
print(segment.seg('商品和服務'))    #seg接口拆分句子

二階馬爾可夫模型

二階模型認爲,當前狀態不僅與上一個狀態有關,而且與上上個狀態有關。我們亦可以用二階馬爾可夫模型,來實現句子的分詞:

SecondOrderHiddenMarkovModel = JClass('com.hankcs.hanlp.model.hmm.SecondOrderHiddenMarkovModel')
model = SecondOrderHiddenMarkovModel()    #實例化一個二階馬爾可夫模型
segmenter = HMMSegmenter(model)    #實例化一個馬爾可夫分類器
segmenter.train(corpus_path)    #使用語料庫訓練模型
segment = segmenter.toSegment()
print(segment.seg('商品和服務'))    #seg接口拆分句子
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章