使用Java-Hanlp训练CRF模型
文章目錄
- 一、CRF分詞
- 二、CRF模型訓(xùn)練
- 1、語(yǔ)料庫(kù)準(zhǔn)備
- 2、詞性標(biāo)注
- 3、訓(xùn)練
- 4、結(jié)果文件
- 5、BEMS標(biāo)注
- 三、實(shí)驗(yàn)結(jié)果
CRF是序列標(biāo)注場(chǎng)景中常用的一種語(yǔ)言模型,與基于隱馬爾可夫模型(HMM)的最短路徑分詞、N-最短路徑分詞相比,基于條件隨機(jī)場(chǎng)(CRF)的分詞對(duì)未登錄詞有更好的支持。CRF的效果比感知機(jī)稍好一些,然而訓(xùn)練速度較慢,也不支持在線學(xué)習(xí)。
一、CRF分詞
官網(wǎng)給出的CRF分詞方法如下:
public class DemoCRFSegment {public static void main(String[] args){HanLP.Config.ShowTermNature = false; // 關(guān)閉詞性顯示Segment segment = new CRFSegment();String[] sentenceArray = new String[]{"HanLP是由一系列模型與算法組成的Java工具包,目標(biāo)是普及自然語(yǔ)言處理在生產(chǎn)環(huán)境中的應(yīng)用。","鐵桿部隊(duì)?wèi)嵟榫w集結(jié) 馬英九腹背受敵", // 繁體無(wú)壓力"馬英九回應(yīng)連勝文“丐幫說(shuō)”:稱黨內(nèi)同志談話應(yīng)謹(jǐn)慎","高錳酸鉀,強(qiáng)氧化劑,紫紅色晶體,可溶于水,遇乙醇即被還原。常用作消毒劑、水凈化劑、氧化劑、漂白劑、毒氣吸收劑、二氧化碳精制劑等。", // 專業(yè)名詞有一定辨識(shí)能力"《夜晚的骰子》通過(guò)描述淺草的舞女在暗夜中扔骰子的情景,寄托了作者對(duì)庶民生活區(qū)的情感", // 非新聞?wù)Z料"這個(gè)像是真的[委屈]前面那個(gè)打扮太江戶了,一點(diǎn)不上品...@hankcs", // 微博"鼎泰豐的小籠一點(diǎn)味道也沒(méi)有...每樣都淡淡的...淡淡的,哪有食堂2A的好次","克里斯蒂娜·克羅爾說(shuō):不,我不是虎媽。我全家都熱愛(ài)音樂(lè),我也鼓勵(lì)他們這么做。","今日APPS:Sago Mini Toolbox培養(yǎng)孩子動(dòng)手能力","財(cái)政部副部長(zhǎng)王保安調(diào)任國(guó)家統(tǒng)計(jì)局黨組書記","2.34米男子娶1.53米女粉絲 稱夫妻生活沒(méi)問(wèn)題","你看過(guò)穆赫蘭道嗎","樂(lè)視超級(jí)手機(jī)能否承載賈布斯的生態(tài)夢(mèng)"};for (String sentence : sentenceArray){List<Term> termList = segment.seg(sentence);System.out.println(termList);}} }針對(duì)項(xiàng)目需求,主要對(duì)地址文本進(jìn)行分詞,但是由于地址文本與一般文本相比,是具有空間結(jié)構(gòu)和空間嵌套關(guān)系的字符串,尤其注重對(duì)地址元素的抽取和拆分。例如以`湖北省荊州市荊州區(qū)荊秘路266-1號(hào)`門牌號(hào)地址為例,在Hanlp原生訓(xùn)練的CRF模型下,得到的分詞結(jié)果為:
該模型無(wú)法區(qū)分地址元素【荊州區(qū)】【荊秘路】,因此無(wú)法滿足實(shí)際需要。
本文對(duì)其做出的改進(jìn)為,在默認(rèn)語(yǔ)料庫(kù)添加地址語(yǔ)料庫(kù)進(jìn)行自定義模型訓(xùn)練。
二、CRF模型訓(xùn)練
1、語(yǔ)料庫(kù)準(zhǔn)備
hanlp提供了默認(rèn)的訓(xùn)練模型,默認(rèn)模型訓(xùn)練語(yǔ)料庫(kù)為 OpenCorpus/pku98/199801.txt,隨1.6.2以上版本發(fā)布。
語(yǔ)料庫(kù)格式為人民日?qǐng)?bào)2014語(yǔ)料格式:
訓(xùn)練時(shí)將滿足上述格式的語(yǔ)料以純文本txt導(dǎo)出到一個(gè)目錄下即可。OpenCorpus/pku98/199801.txt即為一個(gè)單文檔的例子,可供參考。
2、詞性標(biāo)注
HanLP使用的HMM詞性標(biāo)注模型訓(xùn)練自2014年人民日?qǐng)?bào)切分語(yǔ)料,隨后增加了少量98年人民日?qǐng)?bào)中獨(dú)有的詞語(yǔ)。
本文所用到的詞性標(biāo)注包括:
- ns 地名
- q 量詞
- m 數(shù)詞
其余詞性標(biāo)注集如鏈接所示。
語(yǔ)料庫(kù)示例:
3、訓(xùn)練
CRF模型訓(xùn)練可以直接使用在hanlp Java API進(jìn)行,使用CRFSegmenter.train,確定好語(yǔ)料庫(kù)和輸出文件路徑即可。
private static final String CWS_MODEL_PATH = "模型輸出路徑/文件名.txt"; public static void main(String[] args) throws IOException {CRFSegmenter segmenter = new CRFSegmenter(null);segmenter.train("語(yǔ)料庫(kù)路徑/文件名.txt", CWS_MODEL_PATH);}訓(xùn)練過(guò)程為:
4、結(jié)果文件
生成結(jié)果文件為:
其中version說(shuō)明了模型的版本,通過(guò)-c參數(shù)指定的cost-factor,maxid特征函數(shù)的最大id,xsize是特征維數(shù),也就是訓(xùn)練語(yǔ)料列數(shù)-1。
訓(xùn)練時(shí)候用到的模板文件如下:
U0:%x[-1,0] U1:%x[0,0] U2:%x[1,0] U3:%x[-2,0]%x[-1,0] U4:%x[-1,0]%x[0,0] U5:%x[0,0]%x[1,0] U6:%x[1,0]%x[2,0] B后面部分為特征函數(shù)和依照id順序?qū)?yīng)的特征函數(shù)權(quán)值:
5、BEMS標(biāo)注
如果想采用CRF++的方法進(jìn)行訓(xùn)練,也可以將其轉(zhuǎn)換為CRF++支持的格式。CRF++是著名的條件隨機(jī)場(chǎng)開源工具,也是目前綜合性能最佳的CRF工具,有直接的工具包可以進(jìn)行使用。CRF++工具包使用介紹
同時(shí)java-hanlp也提供了CRF++支持的語(yǔ)料庫(kù)格式轉(zhuǎn)換方法,該格式使用BEMS對(duì)文本進(jìn)行標(biāo)注。
public static void main(String[] args) throws IOException {CRFSegmenter segmenter = new CRFSegmenter(null);segmenter.convertCorpus("語(yǔ)料庫(kù)路徑/文件名.txt", "文件輸出路徑/文件名.tsv");}BEMS所說(shuō)是中科院的提出一種標(biāo)注,也有說(shuō)BEIS的,hanlp用的是BEMS
B:開始
E:結(jié)束
M/I:中間
S:單獨(dú)成詞的位置
HMM模型就采用了狀態(tài)為(B,E,M,S)這四種狀態(tài)來(lái)標(biāo)記中文詞語(yǔ),比如北京可以標(biāo)注為BE,即 北/B 京/E,表示“北”是開始位置,“京”是結(jié)束位置,“中華民族”可以標(biāo)注為BMME,就是開始-中間-中間-結(jié)束。地址文本標(biāo)注結(jié)果如下:
參考鏈接:CRF++模型格式說(shuō)明
三、實(shí)驗(yàn)結(jié)果
將訓(xùn)練好的文本模型替換原語(yǔ)料庫(kù)的模型。在hanlp.properties中進(jìn)行路徑設(shè)置,
若選擇模型替換,模型路徑參數(shù)直接缺省即可。或者使用HanLP.Config.CRFCWSModelPath讀取新模型路徑。
以下兩種方式調(diào)用CRF分詞均可。
public static void main(String[] args) throws IOException {CRFLexicalAnalyzer segment = new CRFLexicalAnalyzer(HanLP.Config.CRFCWSModelPath);System.out.println(HanLP.Config.CRFCWSModelPath);segment.enablePartOfSpeechTagging(true);System.out.println(segment.seg("湖北省荊州市荊州區(qū)珞南街道金山路29-9號(hào)"));CRFSegmenter segmenter = new CRFSegmenter();List<String> wordList = segmenter.segment("湖北省荊州市荊州區(qū)荊秘路266-1號(hào)");System.out.println(wordList);}實(shí)驗(yàn)結(jié)果如下,成功滿足項(xiàng)目需要。
總結(jié)
以上是生活随笔為你收集整理的使用Java-Hanlp训练CRF模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 水星MW300R无线路由器的设置方法
- 下一篇: 二叉树相关题(Java实现)