Levenshtein编辑距离Python

时间:2016-09-19 19:15:33

标签: python levenshtein-distance

这段代码返回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])))

1 个答案:

答案 0 :(得分:1)

您需要考虑两个地方,以降低添加或删除元音的成本。它们是函数基本情况下的return jreturn 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函数中的代码调用它。