NLP 二 編輯距離

2021-06-19 02:47:23 字數 2791 閱讀 4317

編輯距離,又稱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 ...