1. 程式人生 > >NLP之CRF分詞訓練(六)

NLP之CRF分詞訓練(六)

分鐘 -c data ++ del 控制 rdquo 進制 文本

分三步
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分詞訓練(六)