分三步
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年的第一場雪”
