下面利用條件隨機場的統計分詞算法。條件隨機場是一種判別式模型,是指在給定輸入節點條件下計算輸出節點的條件概率,其核心思想是利用無向圖理論使序列標註的結果達到在整個序列上全局最優。
第一步:工具包準備
利用CRF++工具包,下載編譯安裝。同時,在其python目錄下執行python包安裝。
第二步:語料準備
還是利用backoff2005的熟語料進行加工,成爲CRF++需要的語料格式,如:
“ S
人 B
們 E
常 S
說 S
生 B
活 E
是 S
一 S
部 S
"
這裏加工北京大學提供的訓練語料(icwb2-data\training\pku_training.utf8)
第三步:執行CRF訓練
crf_learn -f 3 -c 4.0 example/seg/template ../python_script/pku_traing.crf.utf8 ../python_script/crf_model
.....
iter=537 terr=0.00288 serr=0.10796 act=2159868 obj=32091.56690 diff=0.00015
iter=538 terr=0.00289 serr=0.10785 act=2159868 obj=32093.34783 diff=0.00006
iter=539 terr=0.00289 serr=0.10775 act=2159868 obj=32088.59278 diff=0.00015
iter=540 terr=0.00291 serr=0.10859 act=2159868 obj=32085.61548 diff=0.00009
iter=541 terr=0.00291 serr=0.10880 act=2159868 obj=32083.32276 diff=0.00007
iter=542 terr=0.00290 serr=0.10864 act=2159868 obj=32080.38667 diff=0.00009
Done!4678.35 s
Redhat Linux,8G內存的虛擬機進行訓練,迭代542次後收斂,跑了78分鐘。訓練語料10M,生成CRF模型26.3M。
第四步:利用模型分詞
利用CRF++的python工具包。python crf_segmentation.py crf_model ../icwb2-data/testing/pku_test.utf8 pku_test.seq.utf8 。分好詞後:
" 共同 創造 美好 的 新 世紀 —— 二○○ 一 年 新年 賀詞
( 二○○○年 十二月 三十一日 ) ( 附 圖片 1 張 )
女士 們 , 先生 們 , 同志 們 , 朋友 們 :
...
第五步:評測
利用score腳本打分,最終結果:
=== SUMMARY:
=== TOTAL INSERTIONS: 1512
=== TOTAL DELETIONS: 3195
=== TOTAL SUBSTITUTIONS: 5011
=== TOTAL NCHANGE: 9718
=== TOTAL TRUE WORD COUNT: 104372
=== TOTAL TEST WORD COUNT: 102689
=== TOTAL TRUE WORDS RECALL: 0.921
=== TOTAL TEST WORDS PRECISION: 0.936
=== F MEASURE: 0.929
=== OOV Rate: 0.058
=== OOV Recall Rate: 0.553
=== IV Recall Rate: 0.944
召回率92.1%,準確率93.6%,比最大熵高出不少.
如何利用模型文件呢?推薦HanLP。值得注意的是,在上面第三步執行訓練時,增加一個參數-t(crf_learn template_file training_file model -t),即同時得到txt格式的模型文件。可直接加載到HanLP,進行CRF分詞。
[HanLP/null, 是/vshi, 由/p, 一/null, 系列/n, 模型/n, 與/cc, 算法/n, 組成/v, 的/ude1, Java工/null, 具包/null, ,/w, 目標/n, 是/vshi, 普及/v, 自然/n, 語言/n, 處理/vn, 在/p, 生產/vn, 環境/n, 中/f, 的/ude1, 應用/vn, 。/w]
[鐵桿/null, 部隊/null, 憤怒情緒集/null, 結 /null, 馬/nz, 英/b, 九/null, 腹/ng, 背/v, 受/v, 敵/null]
[馬/nz, 英九/null, 回/v, 應/null, 連/null, 勝文/null, “/w, 丐幫說/null, ”/w, :/w, 稱/v, 黨內/null, 同志/n, 談話/null, 應/null, 謹慎/null]
[高/a, 錳酸鉀/null, ,/w, 強/a, 氧化劑/n, ,/w, 紫紅色/n, 晶體/n, ,/w, 可/v, 溶於/v, 水/n, ,/w, 遇/v, 乙/Mg, 醇即/null, 被/pbei, 還原/vi, 。/w, 常/d, 用作/v, 消毒劑/n, 、/w, 水/n, 淨化劑/null, 、/w, 氧化劑/n, 、/w, 漂白劑/n, 、/w, 毒氣/n, 吸收劑/nz, 、/w, 二氧化碳/n, 精製劑/null, 等/udeng, 。/w]
[《/w, 夜晚/n, 的/ude1, 骰子/n, 》/w, 通過/p, 描述/v, 淺/a, 草/n, 的/ude1, 舞女/n, 在/p, 暗夜/nz, 中扔/null, 骰子/n, 的/ude1, 情景/n, ,/null, 寄託/v, 了/ule, 作者/nnt, 對/p, 庶民/n, 生活區/n, 的/ude1, 情感/n]
[這個/rz, 像/v, 是/vshi, 真的/d, [/null, 委屈/a, ]/null, 前面/f, 那個/rz, 打扮/vn, 太/d, 江戶/ns, 了/ule, ,/w, 一點/m, 不/d, 上/f, 品./null, ../null, @hankcs/null]
[鼎/ng, 泰豐/nz, 的/ude1, 小籠/nz, 一點/m, 味道/n, 也/d, 沒有/v, ./null, ../null, 每樣/nz, 都/d, 淡淡/z, 的/ude1, ../null, ./null, 淡淡/z, 的/ude1, ,/w, 哪/ry, 有/vyou, 食堂/n, 2A/null, 的/ude1, 好/a, 次/qv]
[克里斯蒂娜·克羅爾/null, 說/v, :/w, 不/d, ,/w, 我/rr, 不/d, 是/vshi, 虎媽/nz, 。/w, 我/rr, 全家/n, 都/d, 熱愛/v, 音樂/n, ,/w, 我/rr, 也/d, 鼓勵/v, 他們/rr, 這麼/rz, 做/v, 。/w]
...
當然由於語料庫規模的關係,分詞效果看起來不佳,但分詞流程(語料->加工語料->CRF訓練模型->利用模型分詞)已跑通。