編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。
許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。
例如將kitten一字轉成sitting:
sitten (k→s)
sittin (e→i)
sitting (→g)
俄羅斯科學家levenshtein在2023年提出這個概念。
考慮長度為n1,n2的兩個字串s1,s2.
如果已知長度為i-1,j-1的兩個子字串s1[1],s1[2]…s1[i-1]; s2[1],s2[2]…s2[j-1].編輯距離為d[i-1][j-1].
考慮長為i,j的兩個子串.
如果s1[i]!=s2[j],我們可以做如下操作:
1. 刪除s1[i]
2. 刪除s2[j]
3. 改變s1[i]為s2[j]
4. 改變s2[j]為s1[i]
如果s1[i]==s2[j],那麼d[i][j]=d[i-1][j-1];
歸納一下就是:
s1[i]==s2[j]?
d[i][j]=max(d[i-1][j],d[i][j-1],d[i-1][j-1])+1;
else
d[i][j]=d[i-1][j-1];
那麼解法就有:
1.遞迴,不過開銷太大,重複計算太多.
2.加入動態陣列儲存中間變數,以空間換時間,就是動態規劃的演算法.
動態規劃**:
#includeusing namespace std;
#define max 3000
char s1[max];
char s2[max];
int f[max][max];
int min(int a,int b,int c)
int dis(char *s1,char *s2)
for(int i=0;i<=len1;i++)
for(int j=0;j<=len2;j++)
for(int i=1;i<=len1;i++)
}return f[len1][len2];
}int main()
為什麼要引入編輯距離?記得有一篇關於距離與相似性度量的blog,列舉了一些如歐式距離,余弦夾角,kl相對熵等.
(blog: ).
上述這些距離,有一些是基於統計的變數與向量之間的距離.顯然,我們在判斷字串相似度的時候,貌似沒有必要引入統計資訊.如:
字串abcd與efgh的皮爾森相關係數為0,不過就字串來說,貌似沒有特別大的關係.
沒有統計相關的距離,我們用什麼來衡量呢?想到乙個距離--切比雪夫距離.
公式為:
這種距離有何意義?看到引出切比雪夫距離的具體問題時,我發現,某個距離在特定的場合下時候,是恰如其分的.
切比雪夫距離起源於西洋棋中國王的走法,我們知道西洋棋國王每次只能往周圍的8格中走一步,那麼如果要從棋盤中a格(x1, y1)走到b格(x2, y2)最少需要走幾步?
假設下面是棋盤的一小塊,國王要從a到b,只能橫,豎,斜地走.那麼無論怎麼走,最短距離始終是7=max(4,7);
再來看編輯距離,我們書寫文字的時候,特別是英文的時候,容易寫錯,漏寫,多寫幾個字母.那麼修改為正確的單詞,不外乎三個方法:改寫,刪除,增加.這樣的操作越少,書寫的越正確.
再聯絡編輯距離的」編輯」二字,就有了關於編輯距離直觀上的理解.
編輯距離可以有如下的運用:糾錯
(就像我們前面舉得例子,通過改寫,刪除,增加最少化來糾錯)
dna分析
抄襲檢測
語音辨識
文字糾錯
簡單介紹下其中乙個運用,文字糾錯.
按照上面的敘述,假設乙個錯誤拼寫a,如何在字典中找出編輯距離最小的正確拼寫a』?暴力法就是遍歷字典.
下面的方法參考matrix67.com.
度量空間:
度量空間是二元組 (m,d),這裡的 m 是集合, d 是在 m 上的度量(metric),就是函式
存在:d(x, y) ≥ 0 (非負性)
d(x, y) = 0 當且僅當x = y (不可區分者的同一性)
d(x, y) = d(y, x) (對稱性)
d(x, z) ≤ d(x, y)+ d(y, z) (三角不等式)。
三維空間就是典型的度量空間,d定義為兩點間的距離.
bk樹.
bk樹是一棵度量樹,用於離散度量空間.用d(a,b)表示a,b之間的距離.
建樹:以任意元素為頭結點建樹,其第k個子樹為d(a,x)==k的元素.遞迴建樹.
通過上述方式建立的bk字典樹,可以用於有效地查詢與某個元素距離為k的所有元素.
查詢:比如要查詢與a距離為n的所有字串.
從頭結點開始,如果a與頭結點d為k,那麼問題轉而變為與頭結點距離為k-n和k+n的字串.遞迴查詢,直到葉子節點
偷一張使用編輯距離建立好的bktrie如下:
「 實踐表明,一次查詢所遍歷的節點不會超過所有節點的5%到8%,兩次查詢則一般不會17-25%,效率遠遠超過暴力列舉。適當進行快取,減小levenshtein距離常數n可以使演算法效率更高。」
NLP 最小編輯距離
最小編輯距離 編輯距離 edit distance 又稱 levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的編輯操作次數。最小編輯距離,是指所需最小的編輯操作次數。動態規劃的核心思想是 將待求解的問題分解為若干個子問題 階段 按順序求解子階段,前一子問題的解,為後一子問題的求解提供...
編輯距離及編輯距離演算法
編輯距離概念描述 編輯距離,又稱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 ...