最小編輯距離python

1 什麼是編輯距離
在計算文本的相似性時,經常會用到編輯距離(Levenshtein距離),其指兩個字符串之間,由一個字符串轉成另一個所需的最少編輯操作次數。在字符串形式上來說,編輯距離越小,那麼兩個文本的相似性越大,暫時不考慮語義上的問題。其中,編輯操作包括以下三種:

插入:將一個字符插入某個字符串
刪除:將字符串中的某個字符刪除
替換:將字符串中的某個字符串替換爲另一個字符
爲了更好地說明編輯距離的概念,我們看看一個例子,將字符串“batyu”變爲“beauty”,編輯距離是多少呢?分析步驟如下:

將batyu插入字符e有:beatyu
將beatyu刪除字符u有:beaty
將beaty插入字符u有:beauty
所以,字符串“batyu”與字符串“beauty”之間的編輯距離爲:3.

2 數學化
先拋開具體編程語言實現,我們簡單地分析一下如何計算兩個字符串之間的編輯距離

當兩個字符串都爲空串的時候,那麼編輯距離就是0
當其中一個字符串爲空串時,那麼編輯距離爲另一個非空字符串的長度
當兩個字符串A,B均爲非空時(假設長度分別爲i,j),那麼有如下三種情況,我們取這三種情況的最小值即可:
1). 已知字符串A中長爲 i - 1(從字符串首開始,以下描述字符串長默認此種描述)和字符串B長爲j的編輯距離,那麼在此基礎上加1即可
2).長度分別爲i,h和j-1的編輯距離已知,那麼加1即可
3).長度分別爲i-1和j-1的編輯距離已知,這個時候需要考慮兩種情況,若第i個字符和第j個字符不同,那麼加1即可,如果相同,那麼就不需要加1.
從上面的描述,很明顯可以發現是動態規劃的思想。
我們將上面的敘述數學化,則有:求長度爲m和n的字符A、B串編輯距離,即函數:edit(i,j),它表示第一個長度爲i(從字符首開始)的字符串與第二個長度爲j的字符串之間的編輯距離。動態規劃表達式則有如下寫法,假設i,j表示字符串A,B的字串長度:

if i==0 且 j==0,edit(i,j)=0
if (i==0 且 j>0) 或者(i>0 且j ==0),edit(i,j)=i + j
if i>= 1 且 j >= i, edit(i, j) = min(edit(i-1,j) + 1, edit(i, j-1) + 1, edit(i-1,j-1) + d(i,j);當第一個字符串的第i個字符不等於第二個字符串第j個字符時,d(i,j)=1,否則爲0
字符串“batyu”與字符串“beauty”之間的編輯距離矩陣則有如下表示:

 

 

最終的編輯距離即爲edit(m,n)。

3 編程實現
有了上面的思路,使用Python去實現計算兩個字符串的編輯距離就簡單多了。

def test(s1,s2):
edit = [[i+j for j in range(len(s2)+1)] for i in range(len(s1)+1)]

for i in range(1,len(s1)+1):
for j in range(1,len(s2)+1):
if s1[i-1]==s2[j-1]:
d=0
else:
d=1
edit[i][j] = min(edit[i-1][j]+1,edit[i][j-1]+1,edit[i-1][j-1]+d)
return edit[len(s1)][len(s2)]
t = test('batyu','beauty')
print(t)
根據最小編輯距離的算法思路很容易讓我們想到生成指定編輯距離的單詞,方法如下:

 

 代碼如下:

def generate_edit_one(s):
'''
生成所有距離爲1的所有字符串列表
:param s:
:return:
'''
letters = 'qwertyuioplkjhgfdsazxcvbnm'
splits = [(s[:i],s[i:]) for i in range(len(s)+1)]
inserts = [L+c+R for L,R in splits for c in letters]
deletes = [L+R[1:] for L,R in splits if R]
replaces = [L+c+R for L,R in splits if R for c in letters]
return set(inserts+deletes+replaces)


def generate_edit_two(s):
'''
編輯距離不大於2的所有字符串
:param s:
:return:
'''
return [e2 for e1 in generate_edit_one(s) for e2 in generate_edit_one(e1)]

 

 

 



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章