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