[英]Levenshtein edit distance Python
这段代码返回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])))
您需要在两个地方考虑增加或删除元音的成本。 在函数的基本情况下,它们是return j
和return i
行,在前两次递归调用之后,在min
调用中是+1
。
我们需要更改每个字符以使用“三进制”表达式: 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)
对于以后的情况,我们可以用三元表达式本身(用索引而不是ch
迭代变量)替换+1
:
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
函数中的代码中调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.