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]
輸出結果為:
05.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 的編...