• MMSeg分词算法简述

    2008-04-11

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://nebulaeagle.blogbus.com/logs/18828195.html

    本文来源于: http://www.solol.org/archives/200707202300.html

    MMSeg只是实现了Chih-Hao Tsai的MMSEG算法,这是一个来源于网络的分词算法。我照抄了算法开始的部分:

    MMSEG: A Word Identification System for Mandarin Chinese Text Based on Two Variants of the Maximum Matching Algorithm

    Published: 1996-04-29
    Updated: 1998-03-06
    Document updated: 2000-03-12
    License: Free for noncommercial use
    Copyright   1996-2006 Chih-Hao Tsai (Email: hao520 at yahoo.com )

    您可以在Chih-Hao Tsai's Technology Page找到算法的原文。

    我将依据自己的理解来简述MMSeg分词算法的基本原理,如有错误请不吝赐教。

    首先来理解一下chunk,它是MMSeg分词算法中一个关键的概念。Chunk中包含依据上下文分出的一组词和相关的属性,包括长度(Length)、平均长度(Average Length)、标准差的平方(Variance)和自由语素度(Degree Of Morphemic Freedom)。我在下面列出了这4个属性的计算方法:

    属性含义代码位置
    长度(Length)chuck中各个词的长度之和org.solol.mmseg.internal.Chunk.getLength()
    平均长度(Average Length)长度(Length)/词数org.solol.mmseg.internal.Chunk.getAverageLength()
    标准差的平方(Variance)同数学中的定义org.solol.mmseg.internal.Chunk.getVariance()
    自由语素度(Degree Of Morphemic Freedom)各单字词词频的对数之和org.solol.mmseg.internal.Chunk.getDegreeOfMorphemicFreedom()

    注意:表中的含义列可能有些模糊,最好参照MMSeg的源代码进行理解,代码所在的函数已经给出了。

    Chunk中的4个属性采用Lazy的方式来计算,即只有在需要该属性的值时才进行计算,而且只计算一次。

    其次来理解一下规则(Rule),它是MMSeg分词算法中的又一个关键的概念。实际上我们可以将规则理解为一个过滤器(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个规则分别位于org.solol.mmseg.internal.MMRule.java、org.solol.mmseg.internal.LAWLRule.java、org.solol.mmseg.internal.SVWLRule.java和org.solol.mmseg.internal.LSDMFOCWRule.java4个源文件中。之所以这样来处理是因为我们可以方便的增加规则和修改应用规则的顺序。

    这4个规则符合汉语成词的基本习惯。

    再次来理解一下两种匹配方式,简单最大匹配(Simple maximum matching)和复杂最大匹配(Complex maximum matching)。

    简单最大匹配仅仅使用了规则1。

    复杂最大匹配先使用规则1来过滤chunks,如果过滤后的结果多于或等于2,则使用规则2继续过滤,否则终止过滤过程。如果使用规则2得到的过滤结果多于或等于2,则使用规则3继续过滤,否则终止过滤过程。如果使用规则3得到的过滤结果多于或等于2,则使用规则4继续过滤,否则终止过滤过程。如果使用规则4得到的过滤结果多于或等于2,则抛出一个表示歧义的异常,否则终止过滤过程。

    最后通过一个例句--研究生命起源来简述一下复杂最大匹配的分词过程。MMSeg分词算法会得到7个chunk,分别为:

    编号chunk长度
    0研_究_生3
    1研_究_生命4
    2研究_生_命4
    3研究_生命_起5
    4研究_生命_起源6
    5研究生_命_起5
    6研究生_命_起源6

    使用规则1过滤后得到2个chunk,如下:

    编号chunk长度
    4研究_生命_起源6
    6研究生_命_起源6

    计算平均长度后为:

    编号chunk长度平均长度
    4研究_生命_起源62
    6研究生_命_起源62

    使用规则2过滤后得到2个chunk,如下:

    编号chunk长度平均长度
    4研究_生命_起源62
    6研究生_命_起源62

    计算标准差的平方后为:

    编号chunk长度平均长度标准差的平方
    4研究_生命_起源620
    6研究生_命_起源624/9

    使用规则3过滤后得到1个chunk,如下:

    编号chunk长度平均长度标准差的平方
    4研究_生命_起源620

    匹配过程终止。最终取“研究”成词,以相同的方法继续处理“生命起源”。

    分词效果:

    Simple ->研究生_命_起源_
    Complex->研究_生命_起源_
    Simple ->研究生_教育_
    Complex->研究生_教育_

    注意:Simple表示简单最大匹配的分词效果,Complex表示复杂最大匹配的分词效果。


    历史上的今天:

    贼强讨论 2008-04-11
    REST 2008-04-11

    收藏到:Del.icio.us