NLP之CRF分词训练

Posted hx78

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NLP之CRF分词训练相关的知识,希望对你有一定的参考价值。

 

分三步
1、先分词
2、做BEMS标注,同时做词性标注
3、训练模型

 

1、对语料进行分词

拿到测试部的语料或者其他渠道的语料,先对语料进行分词,我刚刚开始是用NS分词的,等CRF模型训练好后,可以直接用CRF进行分词,分完词后要人工核对分词结果,将分词分得不正确的地方修改好


2、标注词性,标注BEMS

BEMS所说是中科院的提出一种标注,也有说BEIS的,hanlp用的是BEMS
B:开始
E:结束
M/I:中间
S:单独
BEMS标注已经写了一个方法generateCRF在SegAndSave.class中。
词性标注只能人工标注了。

 

3、训练

安装CRF++
./configure
make
make install
cd /CRF++-0.58/example/seg
执行crf++的crf_learn指令
../../crf_learn -f 3 -c 4.0 template train.data model -t
产生的model.txt就是我们要的文件,model二进制文件hanlp运行不起来
eg: 我想听周杰伦的夜曲
1)分词:我 想听 周杰伦 的 夜曲
2)BEMS和词性标注(每列用\t分隔开,一般键入tab键,windows的tab似乎有问题,可以参考用SegAndSave.class的generateSeg方法):

分词标注
我 rr S
想 v B
听 v E
周 nr B
杰 nr M
伦 nr E
的 ude1 S
夜 nz B
曲 nz E
注:周杰伦的词性标注存在争议,周杰伦作为一个整体是nr,但 “周” “杰” “伦” 分别应该标注为什么词性,我还不确定。

分词和词性同时标注(CRF只预测一列。通常做法是将词性附加在BMES后面:B_nr)
我 S_rr
想 B_v
听 E_v
周 B_nr
杰 M_nr
伦 E_rn
的 S_ude1
夜 B_nz
曲 E_nz

3)../../crf_learn -f 3 -c 4.0 template train.data model -t
template用的是例子自带的特征模板,对这个我还不会制作,先用着
train.data是我们上面整理好的语料
model是我们训练好的模型文件(二进制名称)
-t生成model.txt文本模型文件(这个就是我们要的模型了,直接copy到hanlp中使用即可)

 

mark

用43万个句子的语料(约25M,约100个句式)训练了一个音乐的CRF分词模型,在本地用虚拟机,开9个G的内存,跑了90分钟才训练好一个模型,但分词的效果并没有达到想要的效果;本想增大语料(对语料进行复制)以加强每种句式的概率,但发现仅仅是复制一次,即约50M,86万个句子,开了10个G也跑不起来,只能作罢。
总的来说,CRF能考虑每个字词的上下文,然后进行分词,这样的分词是很合理的,我认为这里的模型分词的结果不理想和音乐的歌名、歌手等专有名词本身没有规律所造成的,也就是说CRF学习到的规律本身就是不正确的。对于音乐这些语料,我觉得已经不适用CRF来分词,反而用字典分词达到的效果要好得多,也易于控制。

以上是关于NLP之CRF分词训练的主要内容,如果未能解决你的问题,请参考以下文章

中文分词技术深度学习篇

浅谈分词算法基于字的分词方法(CRF)

NLP分词数据准备及模型训练实例

随笔中文分词 | 给 CRF 方法加点料,F 值提高了 1~2 个百分点

NLP常用术语解析

97.5%准确率的深度学习中文分词(字嵌入+Bi-LSTM+CRF)