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方法):

分词标注
我 S
想 B
听 E
周 B
杰 M
伦 E
的 S
夜 B
曲 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来分词,反而用字典分词达到的效果要好得多,也易于控制。

如果要对类似音乐这种语料进行分词,可以这样做

1)先按正常句子做出分词,即不切分出歌名

比如播放2002年的第一场雪,切分成“播放 2002年  的 第一场 雪”

2)通过自定义字典识别出“2002年的第一场雪”这首歌

“播放 2002年  的 第一场 雪”-->“播放 2002年的第一场雪”

posted @ 2017-08-08 22:52  hx78  阅读(5189)  评论(1编辑  收藏  举报