语音识别:时间序列Damerau–Levenshtein距离
一、基本概念
1.1 基本編輯距離的定義
????????在學習Levenshtein 距離的時候,其定義為編輯距離,基礎的編輯距離只有3種原子操作:
- 插入1個字符,
 - 刪除1個字符,
 - 更改1個字符.
 
??且3種操作的代價均為1.
??將編輯距離定義成:給定字串A和B,從A字串通過以上操作變成B字串的過程中,最少的操作次數。
設串A為a1 a2 ... am, 串B為b1 b2 ... bn;將串A經過n個操作x1 - x2 - ... - xn,使之變成串B,且該操作序列為最優操作(代價之和最小)的一種,則2個串的L氏距離即為該序列代價之和。
????????通常3個操作的代價都為1,也有可能按某種方案加權(即3種操作的代價不一致,導致更復雜的情況,這里只討論都是1的)
1.2 Damerau–Levenshtein distance編輯距離的定義
Damerau–Levenshtein distance定義,通俗地說,兩個單詞之間的 Damerau-Levenshtein 距離是將一個單詞變為另一個單詞所需的最小操作數:
- 包括單個字符的插入、
 - 刪除或
 - 替換
 - 或兩個相鄰字符的轉置
 
????????可見Damerau-Levenshtein 距離與經典 Levenshtein 距離的不同之處在于,除了三個經典的單字符編輯操作(插入、刪除和替換)之外,它還包括在其允許操作中的換位。
???????? 在他的開創性論文中,[5] Damerau 表示,在對信息檢索系統的拼寫錯誤的調查中,超過 80% 是由四種類型中的一種錯誤造成的。 Damerau 的論文只考慮了最多可以通過一次編輯操作糾正的拼寫錯誤。雖然最初的動機是測量人類拼寫錯誤之間的距離以改進拼寫檢查器等應用程序,但 Damerau-Levenshtein 距離也已在生物學中用于測量蛋白質序列之間的變異。
1.3? Damerau–Levenshtein distance編輯距離的數學定義
????????為了表示兩個字符串 a 和 b 之間的 Damerau-Levenshtein 距離,函數 d_{a,b}(i, j) 被定義,其值為字符串a 的i-symbol 前綴(初始子串)與 b的 j-symbol 前綴之間的距離灣。 受限距離函數遞歸定義為:[7]:
????????其中 是當 ? 否則等于 1。 每個遞歸調用都匹配 Damerau-Levenshtein 距離所涵蓋的一種情況:
? 對應于刪除(從 a 到 b)
? 對應于插入(從 a 到 b)
? ? 對應匹配或不匹配,取決于各自的符號是否相同,
? 對應于兩個連續符號之間的轉置。
????????然后,a 和 b 之間的 Damerau-Levenshtein 距離由完整字符串的函數值給出: {\displaystyle d_{a,b}{\big (}|a|,|b|{\big )}}{\displaystyle d_{a,b}{\big (}|a|,|b|{\big )}},其中 {\displaystyle i=|a|}{\displaystyle i=|a|} 表示字符串 a 的長度, {\displaystyle j=|b|}{\displaystyle j=|b|} 是 b 的長度。
二、 Damerau-Levenshtein 距離的算法
? ? ? ? 這里介紹了兩種算法:第一種,[8] 更簡單的一種,計算所謂的最佳字符串對齊距離或受限編輯距離,[7] 而第二種[9] 計算具有相鄰換位的 Damerau-Levenshtein 距離。添加轉置會顯著增加復雜性。兩種算法之間的區別在于,最佳字符串對齊算法計算在沒有子字符串被多次編輯的情況下使字符串相等所需的編輯操作數,而第二種算法則沒有這樣的限制。
????????以 CA 和 ABC 之間的編輯距離為例。 Damerau-Levenshtein 距離 LD(CA, ABC) = 2 因為 CA → AC → ABC,但最佳字符串對齊距離 OSA(CA, ABC) = 3 因為如果使用操作 CA → AC,則無法使用AC → ABC,因為這將需要多次編輯子字符串,這在 OSA 中是不允許的,因此最短的操作序列是 CA → A → AB → ABC。請注意,對于最佳字符串對齊距離,三角不等式不成立:OSA(CA, AC) + OSA(AC, ABC) < OSA(CA, ABC),因此它不是真正的度量。
三、算法偽代碼
algorithm OSA-distance isinput: strings a[1..length(a)], b[1..length(b)]output: distance, integerlet d[0..length(a), 0..length(b)] be a 2-d array of integers, dimensions length(a)+1, length(b)+1// note that d is zero-indexed, while a and b are one-indexed.for i := 0 to length(a) inclusive dod[i, 0] := ifor j := 0 to length(b) inclusive dod[0, j] := jfor i := 1 to length(a) inclusive dofor j := 1 to length(b) inclusive doif a[i] = b[j] thencost := 0elsecost := 1d[i, j] := minimum(d[i-1, j] + 1, // deletiond[i, j-1] + 1, // insertiond[i-1, j-1] + cost) // substitutionif i > 1 and j > 1 and a[i] = b[j-1] and a[i-1] = b[j] thend[i, j] := minimum(d[i, j],d[i-2, j-2] + 1) // transpositionreturn d[length(a), length(b)] The difference from the algorithm for Levenshtein distance is the addition of one recurrence:if i > 1 and j > 1 and a[i] = b[j-1] and a[i-1] = b[j] thend[i, j] := minimum(d[i, j],d[i-2, j-2] + 1) // transposition總結
以上是生活随笔為你收集整理的语音识别:时间序列Damerau–Levenshtein距离的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 低差别序列:高维序列(Halton se
 - 下一篇: Python编程:Tkinter图形界面