Mmseg中文分词算法解析,mmseg分词算法


Mmseg中文分词算法解析

@author linjiexing

开发中文搜索和中文词库语义自动识别的时候,我采用都是基于mmseg中文分词算法开发的Jcseg开源工程。使用场景涉及搜索索引创建时的中文分词、新词发现的中文分词、语义词向量空间构建过程的中文分词和文章特征向量提取前的中文分词等,总体使用下来,感觉jcseg是一个很优秀的开源中文分词工具,而且可配置和开源的情况下,可以满足很多场景的中文分词逻辑。本文先把jcseg使用到最基本的mmseg算法解析一下。

 

1. 中文分词算法之争

在分析mmseg算法前,先讲述一段中文分词的基本历史,在吴军著的《数学之美》中有详述,我主要聊聊我的想法。算法开发的思维流程其实和这段历史基本上是吻合的。我们的直观思维很容易受限于我们的知识储备和经验,比如我们在设计出飞机之前,想到是仿生的方式去模拟鸟儿的扇动翅膀姿势,直到后来空气动力学发现飞翔的本质是扇动翅膀可以产生空气涡流而给以上升驱动力,由螺旋桨推升比空气质量高的物体,飞机由此发明。

在中文分词的道路上,也曾走过这样一段类似的探索之路。一开始,为了实现合理的中文分词,我们能想到的是使用语言学家已经归纳的语法规则,根据传统的“句读”分割,给语句分词。但是,我们知道,很多出名的诗句或文学语句都不是来自于正常的语法,甚至有些口语化的语句也不满足语法规则,但是并不影响人的识别,而且可能还是流传千古的创新之作。所以,直觉的有限定义并不能满足千变万化的语言环境。在IBM花费很多时间和人力之后,发现走传统思维是行不通的,转而走向现在流行的统计学语言模型。我个人是这么理解统计学模型的,本质上语言学家的语法规则也是来自于大量语料的统计和归纳,并加以个人或专家团队的约束,组织成有限的语法规则,但是这个语法规则被约束成有限的,从而不满足人类的无线创作的可能性——用概率学的角度看,语法规则可能可以覆盖到一个标准差内的可能发生的事件(事实上,并没有到这个覆盖率),但是其它小概率事件并没有覆盖,甚至随着时间的演变,语料库的迅速增加,长尾效应和创新效应的存在,覆盖率更快的降低。使用有限非完备的方式,是很难应对无限扩展的方式。这个时候,就是基于统计学的机器学习占了实践的上风。

发展到现在,有很多基于统计理论的中文分词算法,也有很多成熟的产品。他们在实践中虽然并非达到百分百正确率,但是在很多应用场景已经可以满足要求,适定性比基于语法的方式要优越很多。当然,但凡基于统计学的模型,其探索之路就意味着永无止境。

不同的算法模型也有不同的适定场景,各位可以自己尝试。我所使用到的场景使用mmseg算法就可以有很好的效果,所以没有深入查阅其它算法的原理,暂时无法给出比较客观的比较。

 

2. Mmseg算法原理

如上所述,mmseg算法是基于统计模型的,所以算法的规则也是来自于对语料库的分析和归纳,作者根据语料库总结出分词的规则,分为四个步骤,算法原文为 http://technology.chtsai.org/mmseg/ 。具体规则如下:

① 规则1,最大匹配:如果词语可以找到一个简单的词匹配,则认为该词即为该词语的分词

类似,词语“国际化”,通过词典分词,可以有如下分词结果

1. 国_际_化
2. 国际_化
3. 国际化

1. C1_C2_C3
2. C1C2_C3
3. C1_C2C3
4. C1C2C3

可见“国际化”有完全对应的词,则认为这个词语即是一个词。规则总结如下:

选取C1C2C3模式

 

② 规则2,最大平均词汇长度。如果词语分词不满足规则1,则使用规则2

类似,词语“南京市长江大桥”,分词结果可能如下

1. 南京市_长江大桥  —— 平均词长度为7/2=3.5
2. 南京_市长_江大桥  —— 平均词长度为7/3=2.3

归纳该规则为则选取第一种分词方式,可见这个规则是兼容第一个规则的

1. C1C2_C3C4C5C6
2. C1C2_C3C4_C5C6

③ 规则3,最小词长方差。如果规则②不成立,则进行规则三。这个规则和我们平时用语有关,一般我们在组织语句时,为了朗朗上口,往往使用的词汇组成长度比较一致。比如,“幸福_快乐”,“人之初_性本善”,“君子一言,驷马难追”。 

类似,词语“研究生命科学”

1. 研究生_命_科学  ——词长方差0.82
2. 研究_生命_科学  ——词长方差0

上述平均词长都是2,但是词长方差不一致。根据规则③,选择第二种分词方式,这种规则可以归纳为

1. _C1C2_C3C4_C5C6_
2. _C1C2C3_C4_C5C6_


④ 规则4,最大单字自由度。所谓单字自由度,可以简单的理解为这个字作为单独出现的语境次数,比如“的”经常作为定语修饰字,经常出现在各种语境,但是“的”偶尔也会和其他字词组成成语,比如“目的”等,这种组合会影响改字的自由度。有关自由度和凝固度,回头在《新词发现》中讨论。这种判断主要是使用在单字存在的场景。

在规则③不成立的情况下,进行规则④的判断。

1. 化妆_和(10)_服装
2. 化妆_和服_装(3)

总结该规则为(备注,上面自由度属于个人瞎编)平均词长和词长方差是一致的,但是单字的自由度不同,选择第一种分词方式

1. _C1C2_C3_C4C5_

2. _C1C2_C3C4_C5_

Compare the freedom(C3) to freedom(C5)

 

3. 该算法的错误情况

    该算法的错误案例可以详见原论文的Example of errors小节。个别错误是可以避免的,尤其是单字自由度,主要是语料库的训练问题,有些问题可以通过新词发现解决。查看该约束,可以判断是否满足自己的应用场景。

 

4. 小结

    能感觉这篇算法阐述还是非常精炼漂亮的,在很多场景适定性也很强。后续将对基于mmseg算法开源的jcseg做个分析。

 

相关内容