在进入正题之前,还是先说两句篇外话,上一篇《中文分词入门之篇外》中说到了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

《中文分词入门之最大匹配法扩展2》有4条评论
  1. 向前辈请教一个切词方面的问题:
    在切词中,除了会遇到新名词、交集歧义、组合歧义之外,还有变体词问题(原型为已登录词,但又变化,如“清核”就是清算核算的意思,“名令智昏”源于“利令智昏”),对于这些变体词,应该如何克服,前辈是否有这方面的经验或者资料,不妨给我们大家介绍介绍、指导指导,十分感谢!

    [回复]

    52nlp 回复:

    称不上前辈,中文分词我也仅仅是初步了解,没有深入的研究,你说的这个问题我还是首次听说,更谈不上指导了。不过我觉得研究这个问题挺有意思的,可以划分到新词识别或者未登录词识别吧。

    [回复]

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注