介绍
双向最大匹配法是将正向最大匹配法和逆向最大匹配法的结果进行比较,按照最大匹配法的原则,选择词数切分最少的作为结果。
根据研究者表明,中文中90.0%左右的句子,正向最大匹配法和逆向最大匹配法完全重合而且正确,只有9.0%的句子两种切分方法的结果不一样,但其中有一个是正确的(歧义检测成功),只有大概不到1.0%的句子,使用正向最大匹配法和逆向最大匹配法的切分虽重合是错的。这也正是该算法在中文信息处理系统得以广泛使用的原因
算法流程
设正向最大匹配法得到的结果为R1,逆向最大结果得到的结果为R2,
- 如果len(R1)!=len(R2),取min{len(R1),len(R2)}
- 如果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)