浅谈MMSEG分词算法

最近看了下MMSEG分词算法,觉得这个算法简单高效,而且还非常准确 作者声称这个规则达到了99.69%的准确率并且93.21%的歧义能被这个规则消除。

核心思想是抽取3个可能的词(存在多个组合),然后根据4个消歧义规则确定到底选择那个组合

 1. 组合长度最大
 2. 组合中平均词语长度最大
 3. 词语长度的变化率最小
 4. 计算组合中所有单字词词频的自然对数,然后将得到的值相加,取总和最大的词组

歧义规则介绍

下面分别举例说明

1.组合长度最大

比如长春市长春药店,这个会有如下几种组合

长春市_长春_药店_
长春市_长_春药_
长春_市长_春药_
长春_市_长春_
长_春_市长_

第一种组合长度最长,所以就以第一种方式分词, 实际效果看起来也合理

2.组合中平均词语长度最大

比如国际化,这个会有如下几种组合

国际化_
国际_化_
国_际_化_

显然规则1无法过滤,长度都是3 经过规则2,之后发现第一个组合平均长度为3/1=3,第二个是3/2=1.5,第三个3/3=1 第一个平均长度最大,所以胜出

这个规则和规则1看上去没啥区别,但因为有的时候句子不够被分成3个词的组合,有可能只够分2个词 上面就是个例子,国际化被分别分成了1个词的组合/2个词的组合/3个词的组合,优选词个数最少的组合

3.词语长度的变化率最小

比如北京大学生,这个会有如下几种集合

北京大学_生_
北京_大学生_
北京_大学_生_
北京_大_学生_
北_京_大学生_

显然规则1无法过滤,长度都是5

在经过规则2之后剩下

北京大学_生_
北京_大学生_

因为上面2个组合的平均长度为5/2=2.5,其他为5/3=1.66

经过规则3之后剩下

北京_大学生_

这是我们想要的,因为第一条是变化是sqrt(((4-2.5)^2+(1-2.5)^2))/2)=1.5,

后面是sqrt(((3-2.5)^2+(2-2.5)^2))/2)=0.5,第二条变化小,所以后面胜出

4.单字词词频自然对数累加计算

比如设施和服务,这个会有如下几种组合

设施_和服_务_
设施_和_服务_
设_施_和服_

经过规则1过滤得到

设施_和服_务_
设施_和_服务_

规则2和规则3都无法确定谁胜出,只能走最后一个规则 第一条中的和第二条中的,从直观看,显然是的词频在日常场景下要高,这依赖一个词频字典 的词频决定了最后的分词是设施_和_服务_

为什么要取自然对数之和而不是简单的求和? 比如某个组合有两个单字,词频为37,另一个为553+7=5+5,但ln3+ln7<ln5+ln5

小结

从4个规则来看,算法处处强调长度和均衡

1.3个词的组合要尽可能长
2.每个词也要尽可能长
3.每个词要尽可能长度接近
4.单个词的词频也要较为接近

这还是比较符合日常的语言习惯的,只是不太明白为什么选3个词作为一个组合,为啥不是4?5?

反例

想到的反例把手抬起来 正确的分词是把_手_抬起_来,但经过本算法的规则过滤为把手_抬起_来


你可能感兴趣的:(浅谈MMSEG分词算法)