最近看了下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都无法确定谁胜出,只能走最后一个规则 第一条中的务
和第二条中的和
,从直观看,显然是和
的词频在日常场景下要高,这依赖一个词频字典 和
的词频决定了最后的分词是设施_和_服务_
为什么要取自然对数之和而不是简单的求和? 比如某个组合有两个单字,词频为3
和7
,另一个为5
和5
3+7=5+5
,但ln3+ln7<ln5+ln5
小结
从4个规则来看,算法处处强调长度和均衡
1.3个词的组合要尽可能长
2.每个词也要尽可能长
3.每个词要尽可能长度接近
4.单个词的词频也要较为接近
这还是比较符合日常的语言习惯的,只是不太明白为什么选3个词作为一个组合,为啥不是4?5?
反例
想到的反例把手抬起来
正确的分词是把_手_抬起_来
,但经过本算法的规则过滤为把手_抬起_来