最近因為在做短文本字串相似度比較的事情,重溫了一下編輯距離演算法及其應用。
編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。
許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。
例如將kitten一字轉成sitting:
kitten(k→s)
sitten(e→i)
sittin(+g)
sitting
俄羅斯科學家vladimir levenshtein在2023年提出這個概念。
演算法過程:
str1或str2的長度為0返回另乙個字串的長度。 if(str1.length==0) return str2.length; if(str2.length==0) return str1.length;
初始化(n+1)*(m+1)的矩陣d,並讓第一行和列的值從0開始增長;
掃瞄兩字串(n*m級的),如果:str1[i] == str2[j],用temp記錄它,為0。否則temp記為1。然後在矩陣d[i,j]賦於d[i-1,j]+1 、d[i,j-1]+1、d[i-1,j-1]+temp三者的最小值;
掃瞄完後,返回矩陣的最後乙個值d[n][m]即是它們的距離。
計算相似度公式:1-它們的距離/兩個字串長度的最大值。
通過演算法過程偽碼我們不難發現,演算法其實是一種動態規劃。因此理論上使用暴力演算法一遍一遍地掃瞄字串也可以解出,但邏輯過於複雜,動態規劃思想很好地解決了這個問題。
package tools;
public class editdistance
public int edit()
for (int j = 0; j <= max2; j++)
for (int i = 1; i <= max1; i++)
} return array[max2][max1];
} public int levenshtein(int i, int j, char si, char sj)
return result;
} public int min(int a, int b, int c)
// 計算相似度
public float similarity()
public static void main(string args)
}
測試結果:
3
0.7
編輯距離演算法求文字相似度
編輯距離,又稱levenshtein距離 萊文斯坦距離也叫做edit distance 是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數,如果它們的距離越大,說明它們越是不同。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。在概念中,我們可以看出一些重點那就是,編輯...
短文本相似度計算
短文本的相似度計算方法可以分為兩大類 基於深度學習的方法和基於非深度學習的方法。科研方面基本都是從深度學習方面入手,但個人覺得想把單語言的短文本相似度計算給做出花來比較難,相對而言基於深度學習的跨語言相似度計算稍微好點。工程方面多半不用深度學習的方法,主要是獲取帶標記的語比較難的 除非公司花錢找人標...
文字相似度計算 編輯距離
一 概念 編輯距離 編輯距離,又稱levenshtein距離,是指兩個字串之間,由乙個轉成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。如 將sailn一字轉成failing sailn failn s f 插入,刪除 sailn faili...