在进入正题之前,还是先说两句篇外话,上一篇《中文分词入门之篇外》中说到了solol提供了Java版的mmseg,相似的,python版mmseg的作者fakechris也在这里留了言:
你好,我是pychseg的作者,一直没时间加上download,大家check out源代码就可以用了。。。
我才发现在pychseg的"Source"页面下有一个通过命令行方式获取其代码方式:
svn checkout http://pychseg.googlecode.com/svn/trunk/ pychseg-read-only
对pychseg感兴趣的读者可以先装一个svn,再通过上述命令行方式获取源代码。这里非常感谢fakechris,不过他建议大家:
另外coreseek里带的c版本的mmseg很快而且也有python接口,推荐大家用那个了
Coreseek 是专业的全文检索技术供应商:北京选择软件科技有限公司,在他们主页的“开放源码”页面里,提供了包括改进的CRF++及Sphinx源代码,同时包括LibMMSeg,一个采用C++开发mmseg版本,不过fakechri提到的应该是“全文搜索 3.1-rc1”里的mmseg,其增加了win32 only的python接口,以下我们介绍的是LibMMSeg。
LibMMSeg有一个简介页面,关于安装及使用说明及词典格式都有介绍,这里不再详述。再说一点题外话,LibMMSeg作者李沐南大哥,对中文分词这一块儿研究的很深刻,有兴趣的读者可以看看他博客中关于“中文分词”的一些文章,尤其是利用CRF进行字标注中文分词,他做了很多实验及改进。
由于我想在SIGHAN Bakeoff提供的中文分词语料库上做个测试,所以对LibMMSeg作了一点点修改。测试环境是ubuntu9.04,下载LibMMSeg的压缩包 mmseg-0.7.3.tar.gz后,对其解压。LibMMSeg默认的输出形式类似“中文/x 分词/x ..”,这里首先修改 ./src目录下的mmseg_main.cpp文件,将其228行及245行:
printf("%*.*s/x ",symlen,symlen,tok);
修改为:
printf("%*.*s ",symlen,symlen,tok);
将第249行:
printf("\\n\\nWord Splite took: %d ms.\\n", srch);
修改为:
cerr << "\\n\\nWord Splite took: " << srch << " ms.\\n";
然后就可以“./configure && make && make install”了,不过我make的时候遇到了如下的错误:
...
css/UnigramCorpusReader.cpp:89: error: 'strncmp' was not declared in this scope
make[2]: *** [UnigramCorpusReader.lo] Error 1
...
查了一下,似乎是g++版本高的缘故,解决方案有两个,降低g++版本,或者修改src/css目录下UnigramCorpusReader.cpp 文件,加上:
#include <string.h>
然后重新 make,即可通过。编译完毕后,会在./src目录下产生一个mmseg的可执行文件。
mmseg-0.7.3里有一个data目录,在data目录里,包括了一个LibMMSeg提供的默认词典文件unigram.txt,关于该词典文件格式的说明,请参考其说明页面,这里我们仅利用该词典作相关的中文分词实验,不做任何扩充。需要注意的是,unigram.txt 必须为UTF-8编码。首先构造一个二进制词典:
../src/mmseg -u unigram.txt
该命令执行后,将会产生一个名为unigram.txt.uni的文件,将其改名为uni.lib,完成词典的构造。
然后进行中文分词,我们首先将北大提供的人民日报语料库测试集pku_test.utf8拷贝到data目录下,然后执行命令:
../src/mmseg -d . pku_test.utf8 > pku_test.mmseg.result
终端上会显示分词所用的时间,而pku_test.mmseg.result则保存了分词结果,把这个结果拷贝回icwb2-data/gold目录下,利用评分脚本对其结果进行打分:
../scripts/score pku_training_words.utf8 pku_test_gold.utf8 pku_test.mmseg.result > mmseg.score
mmseg.score的最终结果如下:
...
=== SUMMARY:
=== TOTAL INSERTIONS: 5512
=== TOTAL DELETIONS: 1435
=== TOTAL SUBSTITUTIONS: 6981
=== TOTAL NCHANGE: 13928
=== TOTAL TRUE WORD COUNT: 104372
=== TOTAL TEST WORD COUNT: 108449
=== TOTAL TRUE WORDS RECALL: 0.919
=== TOTAL TEST WORDS PRECISION: 0.885
=== F MEASURE: 0.902
=== OOV Rate: 0.058
=== OOV Recall Rate: 0.487
=== IV Recall Rate: 0.946
### pku_test.mmseg.result 5512 1435 6981 13928 104372 108449 0.919 0.885 0.902 0.058 0.487 0.946
说明了本次测试中文分词结果的召回率为91.9%,准确率为88.5%,F值为90.2%。如果读者还记着SIGHAN Bakeoff提供的基于最大匹配法的中文分词器mwseg.pl的结果的话,那么这次测试的结果有所提高。不过问题再于二者使用的是不同的词典资源,仍不具有可比性:使用LibMMseg自带的词典资源可称之为开放测试,而仅采用icwb2-data里的词典资源则称之为封闭测试。有兴趣的读者可以根据icwb2-data里提供的人民日报训练语料库统计单个汉字词的词频及其他词条,构造成LibMMseg的词典文件形式,再重复上述实验,也许会得到更有说服力的结果。
注:原创文章,转载请注明出处“我爱自然语言处理”:www.52nlp.cn
本文链接地址:https://www.52nlp.cn/中文分词入门之最大匹配法扩展2
向前辈请教一个切词方面的问题:
在切词中,除了会遇到新名词、交集歧义、组合歧义之外,还有变体词问题(原型为已登录词,但又变化,如“清核”就是清算核算的意思,“名令智昏”源于“利令智昏”),对于这些变体词,应该如何克服,前辈是否有这方面的经验或者资料,不妨给我们大家介绍介绍、指导指导,十分感谢!
[回复]
52nlp 回复:
26 1 月, 2010 at 20:42
称不上前辈,中文分词我也仅仅是初步了解,没有深入的研究,你说的这个问题我还是首次听说,更谈不上指导了。不过我觉得研究这个问题挺有意思的,可以划分到新词识别或者未登录词识别吧。
[回复]
写的不错。
也欢迎访问我的图片Blog: http://www.nianzuo.com
[回复]
52nlp 回复:
27 1 月, 2010 at 00:17
谢谢!
[回复]