簡體   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