1. 程式人生 > >萊文斯坦距離計算字串的相似度

萊文斯坦距離計算字串的相似度

基本理論

萊文斯坦距離(LD)用於衡量兩個字串之間的相似度。 以下我們稱這兩個字串分別為 s (原字串) 和 t (目標字串)。萊文斯坦距離被定義為”將字串 s 變換為字串 t 所需的刪除、插入、替換操作的次數”

演算法原理

該演算法的解決是基於動態規劃的思想,具體如下:
設 s 的長度為 n,t 的長度為 m。如果 n = 0,則返回 m 並退出;如果 m=0,則返回 n 並退出。否則構建一個數組 d[0..m, 0..n]。
將第0行初始化為 0..n,第0列初始化為0..m。
依次檢查 s 的每個字母(i=1..n)。
依次檢查 t 的每個字母(j=1..m)。
如果 s[i]=t[j],則 cost=0;如果 s[i]!=t[j],則 cost=1。將 d[i,j] 設定為以下三個值中的最小值:
緊鄰當前格上方的格的值加一,即 d[i-1,j]+1
緊鄰當前格左方的格的值加一,即 d[i,j-1]+1
當前格左上方的格的值加cost,即 d[i-1,j-1]+cost
重複3-6步直到迴圈結束。d[n,m]即為萊茵斯坦距離。

程式碼實現

import Levenshtein
class TextAnalyse:
    def LevenshiteinSimilarity(self,string1,string2):
        return Levenshtein.ratio(string1,string2)
    def similay(self,string1,string2):
        similar = self.LevenshiteinSimilarity(string1,string2)
        return similar
if __name__ == '__main__'
: t = TextAnalyse() print t.similay('基於YYYssssssssssss的xxxxxx001專案','YYYssssssssssss')

java版:

public class MinimumEditDistance { 

    public static int minEditDistance(String dest, String src) { 
        int[][] f = new int[dest.length()+1][src.length() + 1]; 
        f[0][0] = 0; 
        for
(int i = 1; i < dest.length() + 1; i ) { f[i][0] = i; } for (int i = 1; i < src.length() + 1; i ) { f[0][i] = i; } for (int i = 1; i < dest.length() + 1; i ) { for (int j = 1; j < src.length() + 1; j ) { // 替換的開銷 int cost = 0; if (dest.charAt(i - 1) != src.charAt(j - 1)) { cost = 1; } int minCost; if (f[i - 1][j] < f[i][j - 1]) { minCost = f[i - 1][j] + 1; } else { minCost = f[i][j - 1] + 1; } if (minCost > f[i - 1][j - 1] + cost) { minCost = f[i - 1][j - 1] + cost; } f[i][j] = minCost; } } return f[dest.length()][src.length()]; } public static void main(String[] args) { System.out.println(minEditDistance("kindle", "ainelw")); } }