萊文斯坦距離(編輯距離)算法 (Levenshtein Distance Algorithm)

什麼是 萊文斯坦距離算法 (Levenshtein Distance Algorithm) ?

Levenshtein Distance,萊文斯坦距離,通常被稱爲編輯距離(Edit Distance)。該算法的概念是俄羅斯科學家弗拉基米爾·萊文斯坦(Levenshtein · Vladimir)於1965年提出。

它是用來計算兩個字串之間,通過替換、插入、刪除等操作將字符串str1轉換成str2所需要操作的最少次數。

也存在其他編輯距離的定義方式:例如 Damerau-Levenshtein 距離就是一種萊文斯坦距離的變種,但允許以單一操作交換相鄰的兩個字符(稱爲字符轉置),如 AB→BA 的距離是 1(交換)而非 2(先刪除再插入、或者兩次替換); LCS(最長公共子序列)距離只允許刪除、加入字元; Jaro 距離只允許字符轉置; 漢明距離只允許取代字元。

例子:

kitten和sitting的萊文斯坦距離是3。將kitten變爲sitting的最小處理方式如下:

  1. kitten →sitten(將k改爲s)
  2. sitten → sittin(將e改爲i)
  3. sittin → sitting(最後加入g)

公式定義

動態規劃方法

通常使用動態規劃方法(Dynamic Programming Approach)去計算萊文斯坦距離的值,步驟大致如下:

  1. 初始化一個萊文斯坦距離矩陣(m,n),n和n分別是兩個字符串的長度。
  2. 矩陣可以從左上角到右下角進行填充。
  3. 每個水平或垂直跳轉分別對應於一個插入或一個刪除。
  4. 通常定義每一個操作的成本爲1。
  5. 對角線跳轉的成本:如果兩個字符串不匹配是1, 匹配則是0。每個格子取代價的最小值。
  6. 按照上面的規則計算,最終最右下角的數字就是這兩個字符串的萊文斯坦距離

比如, 計算 “HONDA” 和 “HYUNDAI” 的萊文斯坦距離:

使用場景

  • 字符串模糊匹配/按相似度排序
  • 單詞修正,拼寫檢查, OCR文字識別後的修正
  • 基於翻譯記憶的自然語言翻譯輔助軟件
  • 文章內容查重, 抄襲檢測
  • DNA分析

在PHP中的實現

php從4.0.1開始提供了levenshtein函數:

levenshtein( string $str1, string $str2) : int

該算法的複雜度是 O(m*n),其中 n 和 m 分別是str1 和str2的長度 (當和算法複雜度爲O(max(n,m)**3) 的similar_text()相比時,此函數還是相當不錯的,儘管仍然很耗時)。

此函數返回兩個字符串參數之間的編輯距離,如果其中一個字符串參數長度大於限制的255個字符時,返回-1。

但是如果我想用此函數來實現計算兩個字符串之間的相似度, 還是需要做很多額外的工作

未完待續..... To Be Continued

參考文檔:

https://www.cnblogs.com/throwable/p/12445082.html

https://www.cuelogic.com/blog/the-levenshtein-algorithm

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