赞
踩
本文使用的中文语料资源是SIGHAN提供的backoff 2005语料,目前封闭测试最好的结果是4-tag+CFR标注分词,在北大语料库上可以在准确率,召回率以及F值上达到92%以上的效果,在微软语料库上可以到达96%以上的效果。
第一部分 条件随机场模型工具包安装说明
在Linux或者Mac OS系统下,下载C++源代码安装包(这里用的是 CRF++-0.58.tar.gz )之后,按照如下步骤进行安装:
1.进入到代码主目录后,正常按照“configure & make & (sudo) make install就可以完成C++库的安装。
2.再进入到子目录python下,安装python包:python setup.py build & (sudo) python setup.py install,这个python库是通过强大的SWIG生成的。
3.安装完毕之后,可以在python解释器下测试,是否能成功import CRFPP,如果ok,则准备工作就绪。
注意:在安装过程中或者是后面的运行过程中(具体什么时候我忘记了),如果报出下面的错误:
ImportError: libcrfpp.so.0: cannot open shared object file: No such file or directory
错误的原因是未能引入libcrfpp.so.0库,查找库文件存在,于是建立链接:
32位系统 ln -s /usr/local/lib/libcrfpp.so.* /usr/lib/
64位系统 ln -s /usr/local/lib/libcrfpp.so.* /usr/lib64/
问题解决。
第二部分 模型相关知识介绍
在CRF++ example里有个seg目录,这个seg目录对应的是一个日文分词的样例,正好可以套用到我们的中文分词中来。在安装包目录下,执行cd example和cd seg命令后,切换到seg目录后,发现有4个文件:
exec.sh(执行脚本)
template(特征模板)
test.data(测试集)
train.data(训练集)
有了这4个文件,我们可以做得事情就比较简单,只要按测试集,训练集的格式准备数据就可以了,特征模板和执行脚本可以套用,不过这里简单解读一下这几个CRF++文件。首先来看训练集:
生成的特征函数的数目 = (L * N),其中L是输出的类型的个数,这里是B,I这两个tag,N是通过模板扩展出来的所有单个字符串(特征)的个数,这里指的是在扫描所有训练集的过程中找到的日文字(特征)。
而Bigram特征主要是当前的token和前面一个位置token的自动组合生成的bigram特征集合。最后需要注意的是U01和U02这些标志位,与特征token组合到一起主要是区分“U01:問”和“U02:問”这类特征,虽然抽取的日文”字”特征是一样的,但是在CRF++中这是有区别的特征。
最后我们再来看一下执行脚本:
第三部分 中文分词实践
1.将backoff2005里的训练数据转化为CRF++所需的训练数据格式,语料选取的是以北京大学《人民日报》的语料,采用4-tag( B(Begin,词首), E(End,词尾), M(Middle,词中), S(Single,单字词))标记集,处理utf-8编码文本。
原始训练集./icwb2-data/training/pku_training.utf8的形式是人工分好词的中文句子形式。根据如下的脚本 make_train.py,将这个训练语料转换为CRF++训练用的语料格式(2列,4-tag):
2.有了这份训练语料,就可以利用crf的训练工具crf_learn来训练模型了,执行如下命令即可:crf_learn -f 3 -c 4.0 template pku_training_tag.utf8 crf_model
训练的时间稍微有些长,在我的2G内存的机器上跑了将近567轮,大约21个小时,最终训练的crf_model约37M。有了模型,现在我们需要做得还是准备一份CRF++用的测试语料,然后利用CRF++的测试工具crf_test进行字标注。原始的测试语料是icwb2-data/testing/pku_test.utf8 ,下面的脚本会把测试语料转化为模型需要的格式(详见第二部分的介绍),并且把切分好的文件展现出来。脚本如下:
第四部分 分词结果
有了CRF字标注分词结果,我们就可以利用backoff2005的测试脚本来测一下这次分词的效果了:
./icwb2-data/scripts/score ./icwb2-data/gold/pku_training_words.utf8 ./icwb2-data/gold/pku_test_gold.utf8 pku_result.utf8 > pku_result.score
注:pku_result.utf8为最终得到的分词结果文件
结果如下:
从上图可以看出,CRF分词的准确率为93.7%,召回率为92.3%。
本文运用字标注法进行中文分词,使用4-tag对语料进行字标注,观察分词效果。模型方面选用开源的条件随机场工具包“ CRF++: Yet Another CRF toolkit ”进行分词。 本文使用的中文语料资源是SIGHAN提供的backoff 2005语料,目前封闭测试最好的结果是4-tag+CFR标注分词,在北大语料库上可以在准确率,召回率以及F值上达到92%以上的效果,在微软语料库上可以到达96%以上的效果。
第一部分 条件随机场模型工具包安装说明
在Linux或者Mac OS系统下,下载C++源代码安装包(这里用的是 CRF++-0.58.tar.gz )之后,按照如下步骤进行安装:
1.进入到代码主目录后,正常按照“configure & make & (sudo) make install就可以完成C++库的安装。
2.再进入到子目录python下,安装python包:python setup.py build & (sudo) python setup.py install,这个python库是通过强大的SWIG生成的。
3.安装完毕之后,可以在python解释器下测试,是否能成功import CRFPP,如果ok,则准备工作就绪。
注意:在安装过程中或者是后面的运行过程中(具体什么时候我忘记了),如果报出下面的错误:
ImportError: libcrfpp.so.0: cannot open shared object file: No such file or directory
错误的原因是未能引入libcrfpp.so.0库,查找库文件存在,于是建立链接:
32位系统 ln -s /usr/local/lib/libcrfpp.so.* /usr/lib/
64位系统 ln -s /usr/local/lib/libcrfpp.so.* /usr/lib64/
问题解决。
第二部分 模型相关知识介绍
在CRF++ example里有个seg目录,这个seg目录对应的是一个日文分词的样例,正好可以套用到我们的中文分词中来。在安装包目录下,执行cd example和cd seg命令后,切换到seg目录后,发现有4个文件:
exec.sh(执行脚本)
template(特征模板)
test.data(测试集)
train.data(训练集)
有了这4个文件,我们可以做得事情就比较简单,只要按测试集,训练集的格式准备数据就可以了,特征模板和执行脚本可以套用,不过这里简单解读一下这几个CRF++文件。首先来看训练集:
生成的特征函数的数目 = (L * N),其中L是输出的类型的个数,这里是B,I这两个tag,N是通过模板扩展出来的所有单个字符串(特征)的个数,这里指的是在扫描所有训练集的过程中找到的日文字(特征)。
而Bigram特征主要是当前的token和前面一个位置token的自动组合生成的bigram特征集合。最后需要注意的是U01和U02这些标志位,与特征token组合到一起主要是区分“U01:問”和“U02:問”这类特征,虽然抽取的日文”字”特征是一样的,但是在CRF++中这是有区别的特征。
最后我们再来看一下执行脚本:
第三部分 中文分词实践
1.将backoff2005里的训练数据转化为CRF++所需的训练数据格式,语料选取的是以北京大学《人民日报》的语料,采用4-tag( B(Begin,词首), E(End,词尾), M(Middle,词中), S(Single,单字词))标记集,处理utf-8编码文本。
原始训练集./icwb2-data/training/pku_training.utf8的形式是人工分好词的中文句子形式。根据如下的脚本 make_train.py,将这个训练语料转换为CRF++训练用的语料格式(2列,4-tag):
2.有了这份训练语料,就可以利用crf的训练工具crf_learn来训练模型了,执行如下命令即可:crf_learn -f 3 -c 4.0 template pku_training_tag.utf8 crf_model
训练的时间稍微有些长,在我的2G内存的机器上跑了将近567轮,大约21个小时,最终训练的crf_model约37M。有了模型,现在我们需要做得还是准备一份CRF++用的测试语料,然后利用CRF++的测试工具crf_test进行字标注。原始的测试语料是icwb2-data/testing/pku_test.utf8 ,下面的脚本会把测试语料转化为模型需要的格式(详见第二部分的介绍),并且把切分好的文件展现出来。脚本如下:
第四部分 分词结果
有了CRF字标注分词结果,我们就可以利用backoff2005的测试脚本来测一下这次分词的效果了:
./icwb2-data/scripts/score ./icwb2-data/gold/pku_training_words.utf8 ./icwb2-data/gold/pku_test_gold.utf8 pku_result.utf8 > pku_result.score
注:pku_result.utf8为最终得到的分词结果文件
结果如下:
从上图可以看出,CRF分词的准确率为93.7%,召回率为92.3%。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。