• 中文分词的整理

    作者:  • 2009 年 10 月 2 日 • 历史研究, 技术主义 • 暂无评论

    最近读了份Proposal,其中有一项很吸引我,就是对台湾中研院的所有中文历史文献进行text data mining。关于data mining,在这份proposal里面只是提及了regular expression的方式,但是更多的,我觉得我们应该注意近几年来所发展的全文检索技术(full-text search)技术。大体上讲,全文检索技术是在对一定容量的文献进行快速检索。最为著名的检索,就是google,他可以按照他的一套规则对整个互联网进行检索,而对于中小型网站,大家可能更中意于开源的检索器,比如sphinx和apache项目中的Lucene。所以来讲,对于全文检索技术似乎发展已经很完善了,但是现在要提出的问题是,由于中文有一套自己的语法习惯以及字符集。所以,对于中文的检索还牵扯到对中文的分词问题,这一点是对于中文全文检索来说最困难的。

    谈到中文分词,它牵涉到汉语分词、未定义词识别、词性标注以及语言特例等多个因素。目前大概主要有三个方法:辞典分词法、统计分词法以及规则分词法(也就是基于语义的分词法)。

    (1)辞典分词法:一般是最大匹配算法,有正向匹配和逆向匹配之分,当然有其他算法,就像蒋志欣所提及的双序匹配法。

    (2)统计分词法:前提就是单词是有字节构成的,通过研究组词的概率来判断是否是在此分词,李海波举了一个很形象例子说,比如“我”,单独出现的概率是“50%”,“我爱”组合出现的概率是“10%”,那么“我爱”就不是一个词。比如“北京”,“北京”在很多文章中老放在一起,那么就应该在一起,是一个地名。一

    (3)规则分词法:该分词法最有名的实例就是中科院开发的ICTCLAS汉语分词系统。该系统根据他们自己介绍说,采用了层叠隐马尔可夫模型(Hierarchical Hidden Markov Model),将汉语词法分析的所有环节都统一到了一个完整的理论框架中。”

    提到辞典分词法,不得不提到到一个人,来自中国台北的蔡志浩同学。他写了一篇名为”MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm 的文章,介绍了MMSeg,一个现在很通用的中文分词方法,当今很多分词机都受到了蔡同学的启迪,诸如我一会要向大家介绍的 pymmseg-cppcoreseek.cn的李沫南同学翻译了这篇文章,这里给大家一个basic idea,

    蔡同学提出,中文行文有其自己的规则,所以我们可以通过总结这些行文规则来进行分词。在MMSEG里面,有两个需要注意的概念,一个为Chunk,它包含依据上下文分出的一组词和相关的属性,包括长度(Length)、平均长度(Average Length)、标准差的平方(Variance)和自由语素度(Degree Of Morphemic Freedom);另一个为规则(Rule),实际上就是过滤器(Filter),过滤掉不符合要求的chunk。MMSeg分词算法中涉及了4个规则:

    • 规则1:取最大匹配的chunk (Rule 1: Maximum matching)
    • 规则2:取平均词长最大的chunk (Rule 2: Largest average word length)
    • 规则3:取词长标准差最小的chunk (Rule 3: Smallest variance of word lengths)
    • 规则4:取单字词自由语素度之和最大的chunk (Rule 4: Largest sum of degree of morphemic freedom of one-character words)

    这4个规则符合汉语成词的基本习惯,所以蔡同学希望通过这四个规则来近似的进行中文分词。大概就是这样样子,通过以上的规则参数,然后进行匹配,匹配主要有两种方式简单最大匹配(Simple maximum matching)和复杂最大匹配(Complex maximum matching)。这里就不再熬述,大家直接看他的原文吧,比较清晰的。

    关于中文分词,几个比较有名的是庖丁,bamboo,mmseg(以及由mmseg派生的coreseek,pymmseg-cpp、rmmseg等)、IK Analyzer。关于理论方面,大家不妨看看这个博客(http://blog.csdn.net/jyz3051/category/356808.aspx?PageNumber=1)。

    关于我最近的使用,我比较倾向于使用coreseek以及pymmseg-cpp.使用coreseek因为他和sphinx结合的比较紧,首先做全文检索,紧接着就可以做分词,而用pymmseg-cpp,由于是基于python,而像bamboo和庖丁都是基于java的,我这人本身就有点java fool,所以还是喜欢python一些。同时cpp是通过ctypes和python链接,方便我自己定义一些自己的匹配方式,对于今后我要做文言文的中文分词,单单从分词方面来讲,可能是比较小巧精干的东西。关于pymmseg-cpp的研发历程,可以看看free mind同学的帖子。大概就是这么多,本想和大家讨论使用心得,等到下一个帖子吧。

    参考文献:

    相关文章:

    关于

    生于古城長安,求學金陵,輾轉赴美深造,現漂泊於長安與北京。

    http://www.yenching.org