Mmseg中文分词算法解析
@author linjiexing
开发中文搜索和中文词库语义自己主动识别的时候,我採用都是基于mmseg中文分词算法开发的Jcseg开源project。使用场景涉及搜索索引创建时的中文分词、新词发现的中文分词、语义词向量空间构建过程的中文分词和文章特征向量提取前的中文分词等,整体使用下来,感觉jcseg是一个非常优秀的开源中文分词工具,并且可配置和开源的情况下,能够满足非常多场景的中文分词逻辑。本文先把jcseg使用到最主要的mmseg算法解析一下。
1. 中文分词算法之争
在分析mmseg算法前,先讲述一段中文分词的基本历史,在吴军著的《数学之美》中有详述。我主要聊聊我的想法。算法开发的思维流程事实上和这段历史基本上是吻合的。我们的直观思维非常easy受限于我们的知识储备和经验,比方我们在设计出飞机之前,想到是仿生的方式去模拟鸟儿的扇动翅膀姿势,直到后来空气动力学发现飞翔的本质是扇动翅膀能够产生空气涡流而给以上升驱动力,由螺旋桨推升比空气质量高的物体。飞机由此发明。
在中文分词的道路上,也曾走过这样一段类似的探索之路。
一開始。为了实现合理的中文分词。我们能想到的是使用语言学家已经归纳的语法规则,依据传统的“句读”切割,给语句分词。可是。我们知道,非常多出名的诗句或文学语句都不是来自于正常的语法,甚至有些口语化的语句也不满足语法规则,可是并不影响人的识别,并且可能还是流传千古的创新之作。
所以。直觉的有限定义并不能满足千变万化的语言环境。
在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做个分析。