中文分词-双向最大匹配算法

介绍

双向最大匹配法是将正向最大匹配法和逆向最大匹配法的结果进行比较,按照最大匹配法的原则,选择词数切分最少的作为结果。

根据研究者表明,中文中90.0%左右的句子,正向最大匹配法和逆向最大匹配法完全重合而且正确,只有9.0%的句子两种切分方法的结果不一样,但其中有一个是正确的(歧义检测成功),只有大概不到1.0%的句子,使用正向最大匹配法和逆向最大匹配法的切分虽重合是错的。这也正是该算法在中文信息处理系统得以广泛使用的原因

算法流程

设正向最大匹配法得到的结果为R1,逆向最大结果得到的结果为R2,

  1. 如果len(R1)!=len(R2),取min{len(R1),len(R2)}
  2. 如果len(R1)=len(R2)
    • R1=R2,说明没有歧义,任意返回
    • R1!=R2,返回单字最少的那个(这个就是前面实现前向和逆向最大匹配的时候给两个类增加的_simple_num变量)

python实现

"""
@author: Alex
@contact: 1272296763@qq.com or jakinmili@gmail.com
@file: BDMM.py
@time: 2019/9/14 23:03
"""
import max_Match
import Re_max_Match

class BDMM:
    def __init__(self, window_size=3):
        self.window_size = window_size

    def cut(self, text):
        tokenizer_MM = max_Match.MM(window_size=3)
        tokenizer_RMM = Re_max_Match.RMM(window_size=3)

        # 三种主要的匹配算法
        result1 = tokenizer_MM.cut(text)
        result2 = tokenizer_RMM.cut(text)
        '''
        如果两种方法的分词数量不相同,取分词最少的那个
        '''
        if len(result1) > len(result2):
            return result2
        elif len(result1) > len(result2):
            return result1

        '''
        分词词数相同
        (1).结果相同,任意返回一个
        (2).结果不同,返回单字最少的一个
        '''
        if result1 == result2:
            return result1
        else:
            if tokenizer_MM._simple_num > tokenizer_RMM._simple_num:
                return result2
            else:
                result1

运行:

text = '研究生命的起源'
tokenizer = BDMM()
result = tokenizer.cut(text)
print(result)

 上一篇
拼写纠错-最小编辑距离算法 拼写纠错-最小编辑距离算法
引言拼写纠错(Spelling Correction),又称拼写检查(Spelling Checker),往往被用于字处理软件、输入法和搜索引擎中: 用户输入(input) 用户输入(correction) 天起 天气 t
2019-09-26
下一篇 
中文分词-逆向最大匹配算法 中文分词-逆向最大匹配算法
基本思想从处理文档的最末端开始匹配扫描,每次取最末端的i个字符,其中i是字典最长的词数,若匹配失败,则去掉最前面的第一个字,继续匹配。 python实现RMM类 """ @author: Alex @contact: 1272296763@
2019-09-14
  目录