下面利用条件随机场的统计分词算法。条件随机场是一种判别式模型,是指在给定输入节点条件下计算输出节点的条件概率,其核心思想是利用无向图理论使序列标注的结果达到在整个序列上全局最优。
第一步:工具包准备
利用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训练模型->利用模型分词)已跑通。