一、什么是最小編輯距離
最小編輯距離:是用以衡量兩個字符串之間的相似度,是兩個字符串之間的最小操作數,即從一個字符轉換成另一個字符所需要的操作數,包括插入、刪除和置換。
每個操作數的cost:
- 每個操作數的cost一般是1
- 如果置換的cost是2,而插入和刪除的cost是1,我們稱之為Levenshtein 距離。
作用:
- 計算衡量機器翻譯和語音識別的好壞:將機器得到的字符串與專家寫的字符串比較最小編輯距離,以一個單詞為一個單位。
- 命名實體識別和鏈接:比如通過計算最小編輯距離,可以判定IBM.Inc和IBN非常相似,只有一個單詞不同,所以認為這是指向同一個命名實體。
二、如何找到最小編輯距離
實質:尋找一條從“開始字符串”到“最終字符串”的路徑(一個操作序列)
具體過程:
- 初始狀態:機器翻譯出來的單詞
- 操作:插入、刪除、置換
- 黃金狀態:我們盡力希望得到的單詞
- 路徑花費:操作數目,要求最小化
- 實例:
單詞intention通過刪除i可以得到ntention,通過插入e可以得到eintention,通過將i換成e可以得到entention。以上從intention到葉子節點的任意一個單詞經過的操作數就是一條路徑。
- 可以發現枚舉出所有可轉變成的單詞的花費是十分巨大的,我們不可能用枚舉遍歷的方式來尋找一條最短路徑,一種解決方法是:使用剪枝
- 每層中有很多路徑被剪枝了,只在每一層中保留最短的那條路徑
定義:
- 設有兩個字符串:X和Y。其中X長度為n,Y長度為m
- 定義D(i,j),表示
- X[1..i]和Y[]1..j]之間的編輯距離,
- 從而X和Y之間的編輯距離為D(n,m)
三、如何計算中間距離D(n,m)
基准方法:動態規划從i=0,j=0
具體算法:
初始X的長度為i,則Y的長度為0時,需要在Y中插入i個字符才能使Y變成X,所以D(i,0)=i;同理X的長度為0,Y的長度為j時,需要刪去j個字符才能使Y變成X,所以D(0,j)=j.
環條件:三個式子分別對應在i-1的基礎上刪除一個字符使之變成j、在j-1的基礎上插入1個字符使之變成i和置換這三個操作,其中若X(i)=Y(j),則無需置換,所以cost等於1,否則需要各在i-1和j-1上插入一個字符,cost等於2
計算實例:
四、如何回溯計算兩個字符串之間對齊的字符
在上一步計算矩陣的過程中,加入方向,具體可參考《算法導論》中的尋找最長公共子序列
計算實例:
五、帶權重的最短距離
權重:指插入、刪除和置換三種操作有不同的權重,不再簡單都認為cost是1
原因:
- 拼寫校正:有些單詞通常更容易被拼錯,比如根據統計e非常容易被拼錯成a
- 生物學:某幾種插入或刪除更容易出現
經過調整的算法如下:
注:使用Levenshtein距離
六、計算生物學上的最小編輯距離(相似度)
問題:找到以下兩個序列中的對齊序列,其可能是核苷酸或者蛋白質的結構
要求得到以下對齊序列:
在NLP上,我們稱之為最小距離,而在計算生物學上,我們稱之為相似度
算法:Needleman-Wunsch 算法
其中d表示插入和刪除的cost,s表示置換的positive value
1. 變形一
特殊情況:兩個字符串的頭尾沒有對齊,只有中間一部分重合
具體可能有兩種情形:
要求:檢測重疊部分中的相似度,即重疊檢測問題
算法:
注:調整算法開始的起點和終點
2. 變形二
要求:要求找到兩個字符串中相似度最大的序列,可以有多個,即局部對齊問題
實例:要求找到以下cccggg的部分
算法:Smith-Waterman算法
計算實例:
結果:
其中找到兩個最大局部對齊序列
一是ATCAT和ATTAT的相似度為3,其中A與A相等,得一分;T與T相等,得一分;T與C不相等,要刪除,所以減一分;A與A相等,得一分;T與T相等,得一分
二是ATC和ATC的相似度也為3。