編輯距離是對兩個字串差異化的量化,其含義是將乙個字串轉化為另乙個字串所需的最少操作次數,允許的編輯操作包括將乙個字元替換為另乙個字元,插入乙個字元,刪除乙個字元。編輯距離可用在自然語言處理中,用於計算兩個文字之間的相似度。
如果a[i]和b[j]相同,則edit[i][j]=edit[i-1][j-1]。
如果a[i]和b[j]不相同,則有如下情況:
1) a[1:i]經過多次操作轉化為b[1:j-1],然後再在結尾插入字元b[j]即可,edit[i][j]=edit[i][j-1]+1;
2)a[1:i-1]經過多次操作轉化為b[1:j],然後再將字元a[i]刪除即可,edit[i][j]=edit[i-1][j]+1;
3)a[1:i-1]經過多次操作轉化為b[1:j-1],然後再將字元a[i]替換為b[j]即可,edit[i][j]=edit[i-1][j-1]+1。
在這三種情況中取最小值即可。其中edit[0][j]表示將空串轉為b[1:j]的操作次數,為j;edit[i][0]表示將a[1:i]轉為空串的操作次數,為i。
核心思想:看到這裡,應該明白了這是乙個動態規劃(dynamic programming)問題。動態規劃是一種通過求子問題的最優解,從而求得原問題的最優解的方法。其中子問題稱為狀態,由子問題推出原問題的解稱為狀態轉移方程。這是動態規劃演算法的核心。
在本問題中,狀態定義為求edit[i][j]這樣乙個二維陣列,而上述的多個求解edit[i][j]的公式則為狀態轉移方程。
該問題的動態規劃方程可表示如下:
**實現:
測試用例:class levenshteindistance(object):
def distance(self, a, b):
"""計算字串a和b之間的編輯距離
"""edit = [[0 for j in range(len(b) + 1)] for i in range(len(a) + 1)]
for i in range(len(a)):
edit[i + 1][0] = i + 1
for j in range(len(b)):
edit[0][j + 1] = j + 1
for i in range(len(a) + 1)[1:]:
for j in range(len(b) + 1)[1:]:
flag = b[j - 1] == a[i - 1]
num = 0 if flag else 1
edit[i][j] = min(edit[i - 1][j] + 1, edit[i][j - 1] + 1, edit[i - 1][j - 1] + num)
return edit[-1][-1]
def similarity(self, a, b):
"""計算字串a和b之間的相似度
"""m = max(len(a), len(b))
d = self.distance(a, b)
return (m - d) / m
if __name__ == '__main__':
edit = levenshteindistance()
print(edit.distance('kitten', 'sitting'))
print(edit.similarity('kitten', 'sitting'))
結果為:
30.5714285714285714
編輯距離演算法求文字相似度
編輯距離,又稱levenshtein距離 萊文斯坦距離也叫做edit distance 是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數,如果它們的距離越大,說明它們越是不同。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。在概念中,我們可以看出一些重點那就是,編輯...
文字相似度計算 編輯距離
一 概念 編輯距離 編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。如 將sailn一字轉成failing sailn failn s f 插入,刪除 sailn faili...
文字編輯距離演算法實現(文字相似度比較)
演算法簡介 levenshtein distance,又稱編輯距離,指的是兩個字串之間,由乙個轉換成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。編輯距離的演算法是首先由 科學家levenshtein提出的,故又叫levenshtein di...