基礎演算法四 編輯距離和文字相似度計算

2021-09-12 19:22:31 字數 1874 閱讀 2758

編輯距離是對兩個字串差異化的量化,其含義是將乙個字串轉化為另乙個字串所需的最少操作次數,允許的編輯操作包括將乙個字元替換為另乙個字元,插入乙個字元,刪除乙個字元。編輯距離可用在自然語言處理中,用於計算兩個文字之間的相似度。

如果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...