逆向最大匹配算法(python实现)

  1. 代码如下
# 获取词组最长长度
def getMaxLength(dict_list):
    max_length = 0
    for item in dict_list:
        if len(item) > max_length:
            max_length = len(item)
    return max_length

# 逆向最大匹配
def RMM(text, dict_list, max_length):
    result = []
    index = len(text)
    while index > 0:
        print('index=' + str(index))
        word = None
        # range (start stop step)
        for size in range(max_length, 0, -1):
            print('size=' + str(size))
            # 切片起始位置:index - size
            if index - size < 0:
                continue
            # 逆向切片  切分词组
            piece = text[(index - size):index]
            print('piece=' + str(piece))
            # 切分
            if piece in dict_list:
                word = piece
                result.append(word)
                # 切分词后 剩下的字符串长度
                index -= size
                break
        if word is None:
            index -= 1
        print()
    return result[::-1]

if __name__ == '__main__':
    text = "南京市长江大桥"
    # text = "南京市长江大桥欢迎您"
    # 词组
    dict_list = ['南京', '南京市', '长江大桥', '大桥', '市长','江大桥']
    # dict_list = ['南京', '南京市', '长江大桥', '大桥', '市长','江大桥', '欢迎您', '欢', '迎', '您']

    # 获取词组最长长度
    max_length = getMaxLength(dict_list)
    result = RMM(text, dict_list, max_length)
    print(result)

    # ['南京市', '长江大桥']
    # 结果: ['南京市', '长江大桥', '欢迎您']
  1. 执行结果
index=7
size=5
piece=市长江大桥
size=4
piece=长江大桥

index=3
size=5
size=4
size=3
piece=南京市
['南京市', '长江大桥']
  1. 程序执行过程解析:

1、初始值
待切分字符串长度index =7
最大词典长度maximum=5
2、第1次大循环while
 index =7
 (1)第1次for循环
   size=5
   切分出可能的最长词(5)=市长江大桥,非词,进入下次循环
 (2)第2次for循环
   size=4
   切分出可能的最长词=长江大桥,命中
   剩下待切分长度index=3
   跳出for循环
3、第2次大循环while
 index =3
 (1)第1次for循环
   size=5,大于待切分长度3
 (2)第2次for循环
   size=4,大于待切分长度3
 (3)第3次for循环
   size=3,等于待切分长度3
   切分出可能的最长词=南京市,命中
   剩下待切分长度index=0
   跳出for循环
4、第3次大循环while
 不满足index > 0,退出

参考博客:中文分词算法:逆向最大匹配法

你可能感兴趣的:(Python,数据结构,算法,python,算法)