下面是前向最大匹配、后项最大匹配和双向最大匹配的具体实现,使用的是python。
class WordSeg(object):
def __init__(self, dic):
self.dic = dic
self.window_size = len(max(dic, key=len, default=''))
def forward_max_match(self, text):
fmm_result = []
index = 0
text_length = len(text)
piece = ''
while index < text_length:
for size in range(self.window_size + index, index, -1):
piece = text[index:size]
if piece in self.dic:
index = size - 1
break
index += 1
fmm_result.append(piece)
return fmm_result
def backward_max_match(self, text):
bmm_result = []
index = len(text)
piece = ''
while index > 0:
for size in range(index - self.window_size, index):
piece = text[size:index]
if piece in self.dic:
index = size + 1
break
index -= 1
bmm_result.append(piece)
bmm_result.reverse()
return bmm_result
def bi_directional_max_match(self, text):
fmm_list = self.forward_max_match(text)
bmm_list = self.backward_max_match(text)
if len(fmm_list) != len(bmm_list):
return fmm_list if len(fmm_list) < len(bmm_list) else bmm_list
else:
is_same = True
fmm_single = 0
bmm_single = 0
for i in range(0, len(fmm_list)):
if fmm_list[i] != bmm_list[i]:
is_same = False
if len(fmm_list[i]) == 1:
fmm_single += 1
if len(bmm_list[i]) == 1:
bmm_single += 1
if is_same:
return fmm_list
else:
return fmm_list if fmm_single < bmm_single else bmm_list
dic = ['研究', '研究生', '生命', '命', '的', '起源']
text = '研究生命的起源'
print('分词前的句子:', text)
wordSeg = WordSeg(dic)
fmm_result = wordSeg.forward_max_match(text)
print('前向最大匹配:', fmm_result)
bmm_result = wordSeg.backward_max_match(text)
print('后向最大匹配:', bmm_result)
bdmm_result = wordSeg.bi_directional_max_match(text)
print('双向最大匹配:', bdmm_result)
结果:
分词前的句子: 研究生命的起源
前向最大匹配: ['研究生', '命', '的', '起源']
后向最大匹配: ['研究', '生命', '的', '起源']
双向最大匹配: ['研究', '生命', '的', '起源']