赞
踩
官网给出的CRF分词方法如下:
public class DemoCRFSegment { public static void main(String[] args) { HanLP.Config.ShowTermNature = false; // 关闭词性显示 Segment segment = new CRFSegment(); String[] sentenceArray = new String[] { "HanLP是由一系列模型与算法组成的Java工具包,目标是普及自然语言处理在生产环境中的应用。", "鐵桿部隊憤怒情緒集結 馬英九腹背受敵", // 繁体无压力 "馬英九回應連勝文“丐幫說”:稱黨內同志談話應謹慎", "高锰酸钾,强氧化剂,紫红色晶体,可溶于水,遇乙醇即被还原。常用作消毒剂、水净化剂、氧化剂、漂白剂、毒气吸收剂、二氧化碳精制剂等。", // 专业名词有一定辨识能力 "《夜晚的骰子》通过描述浅草的舞女在暗夜中扔骰子的情景,寄托了作者对庶民生活区的情感", // 非新闻语料 "这个像是真的[委屈]前面那个打扮太江户了,一点不上品...@hankcs", // 微博 "鼎泰丰的小笼一点味道也没有...每样都淡淡的...淡淡的,哪有食堂2A的好次", "克里斯蒂娜·克罗尔说:不,我不是虎妈。我全家都热爱音乐,我也鼓励他们这么做。", "今日APPS:Sago Mini Toolbox培养孩子动手能力", "财政部副部长王保安调任国家统计局党组书记", "2.34米男子娶1.53米女粉丝 称夫妻生活没问题", "你看过穆赫兰道吗", "乐视超级手机能否承载贾布斯的生态梦" }; for (String sentence : sentenceArray) { List<Term> termList = segment.seg(sentence); System.out.println(termList); } } }
该模型无法区分地址元素【荆州区】【荆秘路】,因此无法满足实际需要。
本文对其做出的改进为,在默认语料库添加地址语料库进行自定义模型训练。
hanlp提供了默认的训练模型,默认模型训练语料库为 OpenCorpus/pku98/199801.txt,随1.6.2以上版本发布。
语料库格式为人民日报2014语料格式:
训练时将满足上述格式的语料以纯文本txt导出到一个目录下即可。OpenCorpus/pku98/199801.txt即为一个单文档的例子,可供参考。
HanLP使用的HMM词性标注模型训练自2014年人民日报切分语料,随后增加了少量98年人民日报中独有的词语。
本文所用到的词性标注包括:
其余词性标注集如链接所示。
语料库示例:
CRF模型训练可以直接使用在hanlp Java API进行,使用CRFSegmenter.train
,确定好语料库和输出文件路径即可。
private static final String CWS_MODEL_PATH = "模型输出路径/文件名.txt";
public static void main(String[] args) throws IOException {
CRFSegmenter segmenter = new CRFSegmenter(null);
segmenter.train("语料库路径/文件名.txt", CWS_MODEL_PATH);
}
训练过程为:
生成结果文件为:
其中version
说明了模型的版本,通过-c参数指定的cost-factor
,maxid
特征函数的最大id,xsize
是特征维数,也就是训练语料列数-1。
训练时候用到的模板文件如下:
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
后面部分为特征函数和依照id顺序对应的特征函数权值:
如果想采用CRF++的方法进行训练,也可以将其转换为CRF++支持的格式。CRF++是著名的条件随机场开源工具,也是目前综合性能最佳的CRF工具,有直接的工具包可以进行使用。CRF++工具包使用介绍
同时java-hanlp也提供了CRF++支持的语料库格式转换方法,该格式使用BEMS对文本进行标注。
public static void main(String[] args) throws IOException {
CRFSegmenter segmenter = new CRFSegmenter(null);
segmenter.convertCorpus("语料库路径/文件名.txt", "文件输出路径/文件名.tsv");
}
BEMS所说是中科院的提出一种标注,也有说BEIS的,hanlp用的是BEMS
B:开始
E:结束
M/I:中间
S:单独成词的位置
HMM模型就采用了状态为(B,E,M,S)
这四种状态来标记中文词语,比如北京可以标注为BE
,即 北/B 京/E,表示“北”是开始位置,“京”是结束位置,“中华民族”可以标注为BMME
,就是开始-中间-中间-结束
。地址文本标注结果如下:
参考链接:CRF++模型格式说明
将训练好的文本模型替换原语料库的模型。在hanlp.properties
中进行路径设置,
若选择模型替换,模型路径参数直接缺省即可。或者使用HanLP.Config.CRFCWSModelPath
读取新模型路径。
以下两种方式调用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("湖北省荆州市荆州区珞南街道金山路29-9号"));
CRFSegmenter segmenter = new CRFSegmenter();
List<String> wordList = segmenter.segment("湖北省荆州市荆州区荆秘路266-1号");
System.out.println(wordList);
}
实验结果如下,成功满足项目需要。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。