这段代码返回2个术语的Levenshtein编辑距离。 我怎样才能使插入和删除只花费0.5而不是1?替换仍然需要花费1。
def substCost(x,y):
if x == y:
return 0
else:
return 1
def levenshtein(target, source):
i = len(target); j = len(source)
if i == 0:
return j
elif j == 0:
return i
return(min(levenshtein(target[:i-1],source)+1,
levenshtein(target, source[:j-1])+1,
levenshtein(target[:i-1], source[:j-1])+substCost(source[j-1],target[i-1])))
答案 0 :(得分:1)
您需要考虑两个地方,以降低添加或删除元音的成本。它们是函数基本情况下的return j
和return i
行,以及前两次递归调用后+1
调用中的min
。
我们需要改变每一个使用"三元"表达式:0.5 if ch in 'aeiou' else 1
代替假设每个字符添加或删除1
的费用。
对于基本情况,我们可以使用包含三元表达式的生成器表达式上的sum
调用替换返回值:
if i == 0:
return sum(0.5 if ch in 'aeiou' else 1 for ch in source)
elif j == 0:
return sum(0.5 if ch in 'aeiou' else 1 for ch in target)
对于后面的情况,我们可以用三元表达式本身替换+1
(使用索引而不是ch
迭代变量):
return min(levenshtein(target[:i-1],source) + (0.5 if target[-1] in 'aeiou' else 1),
levenshtein(target, source[:j-1]) + (0.5 if source[-1] in 'aeiou' else 1),
levenshtein(target[:i-1], source[:j-1])+substCost(source[j-1],target[i-1]))
如果你想概括一下,你可以将三元表达式移到它自己的函数中,命名为addCost
,并从levenshtein
函数中的代码调用它。