編輯距離算法應用總結

  項目中應用了編輯距離算法解決問題,做個總結。作爲業務團隊的同學,平時應用算法解決問題的機會並不多,但是還是要有這個能力 / 思維,對技術架構 / 技術選型都有幫助,遇到算法資源不足的情況,也能頂上。編輯距離算法可以用於衡量文本相似度,進而解決文本的模糊搜索 / 匹配問題。編輯距離又叫 Levenshtein 距離(萊文斯坦距離),區別於漢明距離(等長字符串對應位置的不同字符的個數),不僅可以替換字符,還可以增刪字符。算法時間複雜度是 O(m*n),如果文本數量(t)較大,遍歷文本集合,計算關鍵字和文本 Pair 的編輯距離,再做 TOP_K 遴選,時間複雜度爲 O(m*n*t + logt*t),當 t 較大時將會存在性能問題。這個性能問題的一種解法是將萊文斯坦距離降級爲漢明距離,不考慮增減字符的情況,用利用 LSH 算法的思想進行分桶匹配,快速鎖定一些桶,只匹配這些桶內的文本,也就是快速排除一些桶,減少匹配次數,從而提升速度。(LSH 算法的應用下次展開)。在我的項目中,文本數量在 1w 左右,並且我們通過邊緣計算的方式化解服務器的負載壓力,最終還是應用編輯距離算法解決我們業務的文本模糊匹配問題。

  編輯距離算法是個經典 DP (動態規劃)問題。完美契合 DP 問題的兩大特徵,一是問題可分解爲規模更小的子問題,二是子問題解之間存在推導關係。對於編輯距離求解問題,我們把 S1(長度 m ) 和 S2 (長度 n) 的編輯距離定義爲 d(m, n),用 d(m-1, n) 表示 S1 的子串(移除最後一個字符)和 S2 之間的編輯距離,同理定義 d(m, n-1) 、d(m-1, n-1),那麼問題解之間的推導關係爲,d(m, n) = d(m-1, n-1) if S1[m-1] == S2[n-1],d(m, n) = min(d(m-1, n), d(m, n-1)) + 1 if S1[m-1] != S2[n-1]。基本原理就是這樣。

  在實際應用的時候,我們一是對空間複雜度進行了優化(常規優化操作),二是微調算法滿足業務需要的特定匹配規則。一,我們的直接反應會使用一個 m*n 的二維數據存儲解空間,空間複雜度是 O(m*n),但仔細觀察一下,在推導過程中,新一行的解只依賴上一行的解,意味着我們可以只存儲上一行的解,空間複雜度可以降爲 O(n)。二,在我們的項目中,S1 是一個段落,S2 是關鍵字,我們的編輯距離並不是嚴格意義上的編輯距離,嚴格來說,我們業務需要的是 S1 的連續子串和 S2 的編輯距離,(聽起來問題複雜了好多),(業務含義是這個段落裏是不是包含了疑似 S2 的子串)。理解起來,S1 的連續子串和 S2 的編輯距離,可以轉化爲 S1 向 S2 轉化(編輯 / 匹配)的過程,S1 的前綴、後綴可以不參與匹配,或者說可以自由刪除 S1 的前綴、後綴,而不增加編輯距離,這樣的話,我們對算法的微調方法就出來了,1,初始化時,d(i, 0) = 0, 0 <= i < m,表示可以刪除 S1 的前綴而不增加編輯距離,2,求解最終解時,取 min(d(i, n)), 0 <= i < m,表示可以刪除 S1 的後綴而不增加編輯距離。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章