什麼是 萊文斯坦距離算法 (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的最小處理方式如下:
- kitten →sitten(將k改爲s)
- sitten → sittin(將e改爲i)
- sittin → sitting(最後加入g)
公式定義
動態規劃方法
通常使用動態規劃方法(Dynamic Programming Approach)去計算萊文斯坦距離
的值,步驟大致如下:
- 初始化一個
萊文斯坦距離
矩陣(m,n),n和n分別是兩個字符串的長度。 - 矩陣可以從左上角到右下角進行填充。
- 每個水平或垂直跳轉分別對應於一個插入或一個刪除。
- 通常定義每一個操作的成本爲1。
- 對角線跳轉的成本:如果兩個字符串不匹配是1, 匹配則是0。每個格子取代價的最小值。
- 按照上面的規則計算,最終最右下角的數字就是這兩個字符串的
萊文斯坦距離
比如, 計算 “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
參考文檔: