原理很好理解,话不多说。
def forwardMaxMatch(dict_word,strng):
result = []
while len(strng):
#定义的最大匹配长度,中文5个字组一个词不多,5个以上的字组一个词的情况就更少了,这里就取5就行了。值得注意的是当原句子本身长度不够定义的最大匹配长度时就取整个句子的长度作为最大匹配长度。
maxlength = 5 if len(strng)>=5 else len(strng)
sub_word = strng[:maxlength]
while sub_word not in dict_word and len(sub_word)>1: #判断子句子的长度是否大于1,是为了直接把单字视作一个词
sub_word = sub_word[:len(sub_word)-1] #正向最大匹配是从右往左依次减少子句子中的字
result.append(sub_word)
strng = strng[len(sub_word):]
return "/".join(result)
def backwardMaxMatch(dict_word,strng):
result = []
while len(strng):
maxlength = 5 if len(strng)>=5 else len(strng)
sub_word = strng[-maxlength:]
while sub_word not in dict_word and len(sub_word)>1:
sub_word = sub_word[1:] ##逆向最大匹配是从左往右依次减少子句子中的字
result.append(sub_word)
strng = strng[:-len(sub_word)]
return "/".join(result[::-1]) #逆向最大匹配分词结果是倒序的,所以要调整方向
dict_word = ["结婚","尚未","未结婚","和尚","尚未结婚"]
print("正向最大匹配分词结果:",forwardMaxMatch(dict_word,"结婚的和尚未结婚的"))
print("------------------------------------------")
print("逆向最大匹配分词结果:",backwardMaxMatch(dict_word,"结婚的和尚未结婚的"))
字典是自己为了迎合这个句子随手创建的,效果就凑合看吧,是那个意思就行了。还有一个双向最大匹配算法,其实就是把上述两者结合,判断一下两者的结果,选取最优者作为最终结果。判断标准如下:
1、若正向、逆向的分词结果一样,任取其一;
2、若正向、逆向的分词结果不一样:
(1): 若两者分词结果的总词数一样,选取单字词少的那个;
(2): 若两者分词结果的总词数不一样,则选取总词数少的那个。