繁体   English   中英

Levenshtein编辑距离Python

[英]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 jreturn 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM