- 代码如下
# 获取词组最长长度
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)
# ['南京市', '长江大桥']
# 结果: ['南京市', '长江大桥', '欢迎您']
- 执行结果
index=7
size=5
piece=市长江大桥
size=4
piece=长江大桥
index=3
size=5
size=4
size=3
piece=南京市
['南京市', '长江大桥']
- 程序执行过程解析:
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,退出
参考博客:中文分词算法:逆向最大匹配法