分词的算法有很多种,比如有基于词表的“正向最大匹配法” (Forward Maximum Matching Method),“逆向最大匹配法”等(Backward Maximum Matching Method)。
分词的算法有很多种,比如有基于词表的“正向最大匹配法” (Forward Maximum Matching Method),“逆向最大匹配法”等(Backward Maximum Matching Method)。这两种简单说就是捋着一句话中的字一个一个走,然后每一步都向句子尾部方向看一下,看看一个字的词、两个字的词、三个字的词……看看从词表(也就是字典)里能找到的最长的词是哪个,然后就用这个最长的词来直接划分,划完了就直接跳到新位置去继续这个过程,只不过两个算法一个是从前向后遍历,一个是从后向前遍历。
例如,“小李昨天刚刚去了中国科学院计算所面试”。一开始指针指向“小李”,那么就要在词表里面去找,如果能够找到“小李”这样一个词,那么就划分开,把它当成一个词切出来,然后指针下移到“昨”的位置继续查找匹配。请注意这里的“正向最大匹配法”中的“最大”的概念,指的就是找到最长的词汇。还是这个例子,当指针指向“中”,分词程序将前去查找词表中的词汇。“中国”、“中国科学院”、“中国科学院计算所”,这三个都是专有名词,而且再这个场景中“中国科学院计算所”是一个独立的含义单元应该被划分出来作为一个词,而不应划成“中国”、“科学院”、“计算所”这样的三个词汇。因此,如果能够找到“中国科学院计算所”这么长的一个词就直接把这个词划出来,而包含在其中的“中国”和“中国科学院”就被“吞了”。这种“向前”能够匹配到最远词汇的划分原则就是“正向最大匹配法”的含义。怎么样,并不难理解吧?这样一个程序相信有过一点程序经验的读者朋友都能够依靠 List 、或者 Array 一类的数据结构实现,当然,在这个词汇匹配的过程中如果需要加速匹配查找可能还需要用到索引等技巧。

假如,我们只能在词表中找到“中国科学院”这个词,而不能找到“中国科学院计算所”这个词汇,那就只能从这里划开——把“中国科学院”划出来,指针跳到“计”继续工作。
显而易见这种方法是对于词表的依赖是比较严重的,优点是实施简单,缺点是错误率相对较高。
除了最大正向匹配法之外,还有一种“反向最大匹配法”(Backward Maximum Matching Method)或者叫“逆向最大匹配法”(Reverse Maximum Matching Method)。方法很类似,只不过扫描是从尾部开始的,从尾部向前找,能够找到的最长词汇会被切成一个词汇。
我们可以脑补一下这个扫描过程,大概是这样:
当开始第一次扫描的时候,先尝试查找“小李昨天刚刚去了中国科学院计算所面试”这个词,显然是不存在的。
第二次扫描,尝试查找“李昨天刚刚去了中国科学院计算所面试”,当然也不存在。
接着第三次扫描,尝试查找“昨天刚刚去了中国科学院计算所面试”,也不存在。
……
直到最后找到“面试”是一个词,把它切出来,然后继续尝试查找“小李昨天刚刚去了中国科学院计算所”这个词汇。当然,这一轮的查找会导致切出来“中国科学院计算所”这个词。后面就不用我说了,过程是一样的。直到最后把一句话切成了:
“小李/昨天/刚刚/去了/中国科学院计算所/面试”
正向最大匹配法(FMM)和逆向最大匹配法(RMM)两种方式是两种非常基础的分词方法,大家知道原理就可以了,也无需手动编写这个程序。而下一篇我们即将介绍的是结巴分词中默认使用的一种很经典的方法,基于隐马尔科夫模型的分词方法(HMM)。
思考题:你能够想到并举出几个因为分词断句的不当所产生的笑话,或者一些分词断句不当所引起的重大歧义吗?欢迎在下面跟我留言互动。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69954080/viewspace-3154477/ ,如需转载,请注明出处,否则将追究法律责任。