IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    几种中文分词算法的比较

    isnowfy发表于 2013-12-10 10:04:50
    love 0

    logo-static

    中文自然语言处理最首要的就是要中文分词了,现在而言效果最好的还是要算crf了,具体可以查看Stanford NLP,不过鉴于crf速度比较慢,而且咱对其还没有完全的理解,所以这里就没有比较crf算法了。这里主要比较的是最大匹配算法,隐马尔可夫,uni-gram,和一种character based generative model这四种进行比较。

    在52nlp上的这篇文章介绍到了Bakeoff 2005的数据。SIGHAN是国际计算语言学会(ACL)中文语言处理小组的简称,其英文全称为“Special Interest Group for Chinese Language Processing of the Association for Computational Linguistics”,而Bakeoff则是SIGHAN所主办的国际中文语言处理竞赛,然后在Bakeoff 2005的主页上,我们可以下载到用于测试的数据,数据主要是由北京大学,微软亚洲研究院,香港城市大学,台湾中央研究院提供。

    下载后可以看到包括doc,training,gold,scripts,testing几个文件夹,其中training中有训练用的分词好的数据,testing中有测试用的未分词的数据,gold中有用于检验的测试的分词好的数据,scripts里是包括一个最大匹配分词的脚本和一个计算分数的脚本,而且数据都提供了gbk和utf8版本。

    scripts下的mwseg.pl是自带的最大匹配分词脚本,可以作为baseline来比较

    1. ./mwseg.pl ../gold/pku_training_words.txt < ../testing/pku_test.txt > pku_test_seg.txt

    可以生成分好词的文件

    1. ./score ../gold/pku_training_words.txt ../gold/pku_test_gold.txt pku_test_seg.txt > score.txt

    可以生成评分文件,文件中主要内容入下

    1. === SUMMARY:
    2. === TOTAL INSERTIONS: 9274
    3. === TOTAL DELETIONS: 1365
    4. === TOTAL SUBSTITUTIONS: 8377
    5. === TOTAL NCHANGE: 19016
    6. === TOTAL TRUE WORD COUNT: 104372
    7. === TOTAL TEST WORD COUNT: 112281
    8. === TOTAL TRUE WORDS RECALL: 0.907
    9. === TOTAL TEST WORDS PRECISION: 0.843
    10. === F MEASURE: 0.874

    可以看到最大匹配算法在pku数据集上的效果精确率是0.843

    然后我们再考虑HMM算法,这里用了这篇论文里写的TnT算法,uni-gram写法主要是我这篇文章实现的算法,还有前面提到的这篇论文里的character based generative model。然后跑了北京大学和微软亚洲研究院的数据,下面是算法在两个数据集上的准确率。

    --------+----------+--------+----------+------------+
            |  最大匹配 |  TnT   | uni-gram | generative |
    --------+----------+--------+----------+------------+
       PKU  |   0.843  |  0.801 |  0.853   |   0.871    |
    --------+----------+--------+----------+------------+
       MSR  |   0.917  |  0.759 |  0.925   |   0.944    |
    --------+----------+--------+----------+------------+
    

    可以看出character based generative model的表现都很不错,而TnT的表现却不怎么好,不过TnT在词性标注的表现却是异常的好,下面我们可以看看这几种算法的主要思路,首先是uni-gram

    \(argmax(\Pi{P(word_i)})\)

    TnT的公式是

    \(argmax(\Pi{P(word_i|tag_i)*P(tag_i|tag_{i-1}, tag_{i-2})})\)

    而character based generative model是

    \(argmax(\Pi{P((word_i, tag_i)|(word_{i-1}, tag_{i-1}), (word_{i-2}, tag_{i-2}))})\)

    看上去character based generative model像是n-gram和TnT的综合,这也可能是他表现比较好的原因吧,话说大概还有很多细节的优化或者训练测试集的不同导致了和论文里的评测值不太一样。

    最后我就把这个分词算法扔到我新完成的项目SnowNLP里了,代码可以看这个。
    我猜您可能还会喜欢:

    • 浅谈中文分词
    • c++智能指针的简单实现
    • python中文分词
    • 谈谈SVD和LSA
    • 关于相似图片搜索
    • 程序解决flash-gear的拼图问题
    • CUDA编程入门



沪ICP备19023445号-2号
友情链接