最近幫乙個專案分析資料庫瓶頸,於是想先通過sql profiler把sql語句的執行資料抓下來,再對不同語句分類統計。這其中涉及乙個如何識別相似語句的問題,於是上網找了找,乙個叫levenshtein distance的演算法比較簡單,就寫了段**實現了一下,效果還不錯。
這個演算法是乙個**人lvenshtein提出的,用於計算兩個字串之間,由乙個轉換成另乙個所需的最少編輯操作次數。次數越少,表示兩個字串相似度越高。
用例項來講解演算法最直觀,我們假設有兩個字串:test和est,需要經過以下幾個步驟來獲取ld值。
1、初始化乙個矩陣
│ │test t e s t │
│ est│ 0 1 2 3 4 │
│ e│ 1 x │
│ s│ 2 │
│ t│ 3 │
2、計算x值
計算x的演算法為:
取x1 = 左邊的值+1 = 1+1 = 2;
取x2 = 上邊的值+1 = 1+1 = 2;
如果橫縱座標的字元不一樣,則取x3 = 左上角的值+1,否則取x3 = 左上角的值。此處由於e≠t,所以x3 = 0+1 = 1。
然後得到x = min(x1, x2, x3) = 1。
3、以此類推,填滿矩陣,最右下角的值即為ld值
┌──┬───────────┐│ │test t e s t │├──┼───────────┤│ est│ 0 1 2 3 4 ││ e│ 1 1 1 2 3 ││ s│ 2 2 2 1 2 ││ t│ 3 2 3 2 1│└──┴───────────┘
4、計算相似度
公式為:相似度 = 1 - (ld / 最大字串長度)
本例中,相似度 = 1 - (1 / 4) = 0.75,這個值介於0到1之間,值越高,表示兩字串相似度越大。
用c#**實現一下:///
/// 計算ld值
/// 第乙個字串
/// 第二個字串
/// ld
public int getlevenshteindistince(string str1, string str2)
//初始化矩陣
int[,] matrix = new int[str1.length + 1, str2.length + 1];
//賦第一行與第一列的初值
for(int i = 0; i <= str1.length; ++i)
matrix[i, 0] = i;
for(int i = 0; i <= str2.length; ++i)
matrix[0, i] = i;
//開始填充矩陣
for(int i = 1; i <= str1.length; i++)
for(int j = 1; j <= str2.length; j++)
//左上角相同加0,否則加1
int addition = str1[i - 1] == str2[j - 1] ? 0 : 1;
//取三者中的最小值
int min = math.min(matrix[i - 1, j - 1] + addition, matrix[i, j - 1] + 1);
matrix[i, j] = math.min(min, matrix[i - 1, j] + 1);
//矩陣最右下角數字即是ld
return matrix[str1.length, str2.length];
/// 計算相似度
/// 第乙個字串
/// 第二個字串
/// 相似度,0-1之間
public float computesimilarity(string str1, string str2)
return 1 - (float)getlevenshteindistince(str1, str2) / math.max(str1.length, str2.length);
ok,執行效率還是挺高的。
LD演算法獲取字串相似度
最近幫乙個專案分析資料庫瓶頸,於是想先通過sql profiler把sql語句的執行資料抓下來,再對不同語句分類統計。這其中涉及乙個如何識別相似語句的問題,於是上網找了找,乙個叫levenshtein distance的演算法比較簡單,就寫了段 實現了一下,效果還不錯。這個演算法是乙個 人lvens...
java字串相似度演算法
按順序匹配的,如下 判斷兩個字串相似度,可設定level param strsource 原字串 param strcompared 比較字串 param level 評分閥值 param morecount 比較字串比原字串多多少個限制 return public staticboolean is...
字串相似度
這個演算法 於網上,但忘記了出處,對其使使用了 issame封裝,然後用在了自己的網頁資料抓取 中。求解兩個字串的相似度int calculatestringdistance const string stra,const string strb intret c lena 1 lenb 1 for...