文字編輯距離計算,簡單清晰

2021-08-01 15:39:25 字數 3325 閱讀 6952

編輯距離的作用主要是用來比較兩個字串的相似度的

基本的定義如下所示:

編輯距離,又稱levenshtein距離(萊文斯坦距離也叫做edit distance),是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數,如果它們的距離越大,說明它們越是不同。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。

這個概念是由俄羅斯科學家vladimir levenshtein在2023年提出來的,所以也叫 levenshtein 距離。它可以用來做dna分析,拼字檢測,抄襲識別等等。總是比較相似的,或多或少我們可以考慮編輯距離。

在概念中,我們可以看出一些重點那就是,編輯操作只有三種。插入,刪除,替換這三種操作,我們有兩個字串,將其中乙個字串經過上面的這三種操作之後,得到兩個完全相同的字串付出的代價是什麼就是我們要討論和計算的。

例如: 

我們有兩個字串: kitten 和 sitting: 

現在我們要將kitten轉換成sitting 

我們可以做如下的一些操作;

k i t t e n –> s i t t e n 將k替換成s

sitten –> sittin 將 e 替換成i

sittin –> sitting 新增g

在這裡我們設定每經過一次編輯,也就是變化(插入,刪除,替換)我們花費的代價都是1。

例如:

1.str1或str2的長度為0返回另乙個字串的長度。 if(str1.length==0) return str2.length; if(str2.length==0) return str1.length;

2.初始化(n+1)*(m+1)的矩陣d,並讓第一行和列的值從0開始增長。掃瞄兩字串(n*m級的),如果:str1[i] == str2[j],用temp記錄它,為0。否則temp記為1。然後在矩陣d[i,j]賦於d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+temp三者的最小值。

3.掃瞄完後,返回矩陣的最後乙個值d[n][m]即是它們的距離。

計算相似度公式:1-它們的距離/兩個字串長度的最大值。

其實這個演算法並不難實現 

我們用字串「ivan1」和「ivan2」舉例來看看矩陣中值的狀況:

1、第一行和第一列的值從0開始增長 

圖一首先我們先建立乙個矩陣,或者說是我們的二維數列,假設有兩個字串,我們的字串的長度分別是m和n,那麼,我們矩陣的維度就應該是(m+1)*(n+1).

注意,我們先給數列的第一行第一列賦值,從0開始遞增賦值。我們就得到了圖一的這個樣子

之後我們計算第一列,第二列,依次類推,算完整個矩陣。

我們的計算規則就是: 

d[i,j]=min(d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+temp) 這三個當中的最小值。

其中:str1[i] == str2[j],用temp記錄它,為0。否則temp記為1

我們用d[i-1,j]+1表示增加操作 

d[i,j-1]+1 表示我們的刪除操作 

d[i-1,j-1]+temp表示我們的替換操作

2、舉證元素的產生 matrix[i - 1, j] + 1 ; matrix[i, j - 1] + 1 ; matrix[i - 1, j - 1] + t 三者當中的最小值 

3.依次類推直到矩陣全部生成 

這個就得到了我們的整個完整的矩陣。

下面我們來看下**,我最擅長的就是python,下面我們來看實現:

#!/usr/bin/env python

# coding=utf-8

# function : calculate the mineditdistance of two strings

# author : chicho

# date : 2016-12-31

defmineditdist

(sm,sn):

m,n = len(sm)+1,len(sn)+1

# create a matrix (m*n)

matrix = [[0]*n for i in range(m)]

matrix[0][0]=0

for i in range(1,m):

matrix[i][0] = matrix[i-1][0] + 1

for j in range(1,n):

matrix[0][j] = matrix[0][j-1]+1

for i in range(m):

print matrix[i]

print

"********************"

cost = 0

for i in range(1,m):

for j in range(1,n):

if sm[i-1]==sn[j-1]:

cost = 0

else:

cost = 1

matrix[i][j]=min(matrix[i-1][j]+1,matrix[i][j-1]+1,matrix[i-1][j-1]+cost)

for i in range(m):

print matrix[i]

return matrix[m-1][n-1]

mindist=mineditdist("ivan1","ivan2")

print mindist

我們來看下最後得到的執行結果: 

上面是乙個初始化的矩陣

最後得到的結果,距離就是最後右下角的那個值1

下面我們在根據計算出兩個字串的相似度:

最後得到它們的距離=1

相似度:1-1/math.max(「ivan1」.length,「ivan2」.length) =0.8

文字編輯距離

題目 給定乙個字串word。再給定n個字串s1,s2,sn.求出s中和word相似度最小的字串。注意 兩個字串的相似度是,修改s1或s2的中的任一字元,一次只能改一次,或者是在s1或s2的任一位置增加乙個字元,一次只能增加一次。是的最後s1 s2.比如 helo hea。相似度為2。步驟分別是去掉o...

scala文字編輯距離演算法實現

編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括 將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。例如將eeba轉變成abac 1.eba 刪除第乙個e 2.aba 將剩下的e替換成a 3.abac 在末尾插入c 所以ee...

文字編輯框 調整文字編輯區域

在多行模式下的cedit類提供void cedit setrectnp lpcrect lprect 函式,此函式用來調整文字編輯的區域,用這個函式可以設定上下左右margins,而void setmargins uint nleft,uint nright 函式只能設定左右margins。crec...