編輯距離演算法(Levenshtein)

2021-09-07 11:10:29 字數 2798 閱讀 3113

編輯距離定義

編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。

例如將eeba轉變成abac:

eba(刪除第乙個e)

aba(將剩下的e替換成a)

abac(在末尾插入c)

所以eeba和abac的編輯距離就是3

俄羅斯科學家vladimir levenshtein在2023年提出這個概念。

演算法:

演算法就是簡單的線性動態規劃(最長上公升子串行就屬於線性動態規劃)。

設我們要將s1變成s2

定義狀態矩陣edit[len1][len2],len1和len2分別是要比較的字串s1和字串s2的長度+1(+1是考慮到動歸中,乙個串為空的情況)

然後,定義edit[i][j]是s1中前i個字元組成的串,和s2中前j個字元組成的串的編輯距離

具體思想是,對於每個i,j從0開始依次遞增,對於每一次j++,由於前j-1個字元跟i的編輯距離已經求出,所以只用考慮新加進來的第j個字元即可

刪除操作:刪除s1[i],以期望s1[i-1]能與s2[j]匹配(如果s1[i-1]前邊的幾個字元能與s2[j]前邊的幾個字元有較好的匹配,那麼這麼做就能得到更好的結果)。另外,對於s1[i-1]之前的字元跟s2[j]匹配的情況,edit[i-1][j]中已經考慮過。於是刪除字元ch的編輯距離就是edit[i-1][j]+1

替換操作:期望s1[i]與s2[j]匹配,或者將s1[i]替換成s2[j]後匹配。於是替換操作的編輯距離就是edit[i-1][j-1]+f(i,j)。其中,當s1[i]==s2[j]時,f(i,j)為0;反之為1

於是動態規劃公式如下:

python實現:

官方擴充套件包:

python有乙個官方擴充套件包(在pypi裡面,即python package index),叫做python-levenshtein,這個包不僅可以計算編輯距離,還能計算hamming(漢明)距離,jaro-winkler距離等,鏈結如下:

python setup.py build

python setup.py install

即可。python setup.py build

python setup.py install

即可。檢查是否安裝成功:進入python,執行from levenshtein import *,如果沒有報錯則安裝成功

具體使用方法見如下博文(這邊博文下方還有完整的使用文件的連線):

注意:如果採用from levenshtein import *匯入,則呼叫函式的時候不用加levenshtein.

簡單的實現**:

如果你想要更加輕量級的實現的話,就用下面的**吧:

(選自邊蘇濤的部落格,

[python]view plain

copy

#!/user/bin/env python  

# -*- coding: utf-8 -*-  

class arithmetic():  

def __init__(self):  

pass  

''''' 【編輯距離演算法】 【levenshtein distance】 【字串相似度演算法】 '''  

def levenshtein(self,first,second):  

if len(first) > len(second):  

first,second = second,first  

if len(first) == 0:  

return len(second)  

if len(second) == 0:  

return len(first)  

first_length = len(first) + 1  

second_length = len(second) + 1  

distance_matrix = [range(second_length) for x in range(first_length)]   

#print distance_matrix  

for i in range(1,first_length):  

for j in range(1,second_length):  

deletion = distance_matrix[i-1][j] + 1  

insertion = distance_matrix[i][j-1] + 1  

substitution = distance_matrix[i-1][j-1]  

if first[i-1] != second[j-1]:  

substitution += 1  

distance_matrix[i][j] = min(insertion,deletion,substitution)  

print distance_matrix  

return distance_matrix[first_length-1][second_length-1]  

if __name__ == "__main__":  

arith = arithmetic()  

print arith.levenshtein('gumbosdafsadfdsafsafsadfasfadsfasdfasdfs','gambol00000000000dfasfasfdafsaf

編輯距離及編輯距離演算法

編輯距離概念描述 編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。例如將kitten一字轉成sitting sitten k s sittin e i sitting g 俄...

編輯距離及編輯距離演算法

include include include using namespace std const int max 1001 int maxlen max max int maxlen string str1,string str2 return maxlen len1 len2 int main ...

編輯距離及編輯距離演算法

include include include using namespace std const int max 1001 int maxlen max max int maxlen string str1,string str2 return maxlen len1 len2 int main ...