Edit Distance 編輯距離

2021-09-05 19:37:38 字數 1462 閱讀 8810

nlpjoe 關注

今天看了stanford編輯距離**,感覺寫得不錯,寫一篇部落格記錄下。

為什麼?

我們舉乙個實際例子

編輯距離dp公式

先不要急著看懂,我慢慢解釋。

理解了上面的文字就理解編輯距離dp演算法了,寫得有點冗長。

這裡給乙個帶damerau–levenshteindistance距離的**,其中新增了一種操作:

核心部分為score_edit_distance(self, source, target):

def score_edit_distance(self, source, target):

if source == target:

return 0

s_pos = len(source)

t_pos = len(target)

self.clear(s_pos, t_pos)

for i in range(s_pos + 1):

for j in range(t_pos + 1):

b_score = self.score[i][j]

if b_score != self.worse():

continue

if i == 0 and j == 0: # 0,0位置為空,預設為正確

b_score = self.best()

else:

if i > 0: # 刪除權重

b_score = min(b_score, self.score[i-1][j] + self.delete_cost(source[i-1]))

if j > 0: # 插入權重

b_score = min(b_score, self.score[i][j-1] + self.insert_cost(target[j-1]))

if i > 0 and j > 0: # 替換權重

b_score = min(b_score, self.score[i-1][j-1] + self.substitute_cost(source[i-1], target[j-1]))

if i > 1 and j > 1: # 置換權重

b_score = min(b_score, self.score[i-2][j-2] + self.transpose_cost(source[i-2], source[i-1], target[j-2], target[j-1]))

self.score[i][j] = b_score

return self.score[s_pos][t_pos]

輸出結果為:

0

5.01.0

Edit Distance 編輯距離

編輯距離是一道經典的動態規劃 dynamic programing 問題。下面將詳細地介紹解法。我們先定義一下cache i j 表示,要將word1 0.i 1 轉化成word2 0.j 1 的最小步驟。比如,我們的word1 aeee world2 adef a def aeee 我們先來考慮一...

編輯距離 Edit distance

插入乙個字元,例如 fj fxj 刪除乙個字元,例如 fxj fj 替換乙個字元,例如 jxj fyj 用分治的思想解決比較簡單,將複雜的問題分解成相似的子問題 假設字串 a,共 m 位,從a 1 到a m 字串 b,共 n 位,從b 1 到b n d i j 表示字串a 1 a i 轉換為b 1 ...

編輯距離(Edit Distance)

edit distance 1000 ms 65535 kb 568 2526 設a 和b 是2 個字串。要用最少的字元操作將字串a 轉換為字串b。這裡所說的字元操作包括 1 刪除乙個字元 2 插入乙個字元 3 將乙個字元改為另乙個字元。將字串a變換為字串b 所用的最少字元運算元稱為字串a到b 的編...