利用StringUtils計算兩個字符串相似度
1.1實現簡單介紹
實現原理可參考計算字符串相似度算法——Levenshtein
這里的算法區別在于:存差異值的數組由上文中的二維數組,變成這個實現的兩個一維數組,并通過不斷的交換數值來實現。
1.2源碼理解
//計算兩個字符串的差異值 public static int getLevenshteinDistance(CharSequence s, CharSequence t) { if (s == null || t == null) { //容錯,拋出的這個異常是表明在傳參的時候,傳遞了一個不合法或不正確的參數。 好像都這樣用,illegal:非法。Argument:參數,證據。 throw new IllegalArgumentException("Strings must not be null"); } //計算傳入的兩個字符串長度 int n = s.length(); int m = t.length(); //容錯,直接返回結果。這個處理不錯 if (n == 0) { return m; } else if (m == 0) { return n; } //這一步是根據字符串長短處理,處理后t為長字符串,s為短字符串,方便后面處理 if (n > m) { CharSequence tmp = s; s = t; t = tmp; n = m; m = t.length(); }//開辟一個字符數組,這個n是短字符串的長度 int p[] = new int[n + 1]; int d[] = new int[n + 1]; //用于交換p和d的數組 int _d[]; int i; int j; char t_j; int cost; //賦初值 for (i = 0; i <= n; i++) { p[i] = i; } for (j = 1; j <= m; j++) { //t是字符串長的那個字符 t_j = t.charAt(j - 1); d[0] = j; for (i = 1; i <= n; i++) { //計算兩個字符是否一樣,一樣返回0。 cost = s.charAt(i - 1) == t_j ? 0 : 1; //可以將d的字符數組全部賦值。 d[i] = Math.min(Math.min(d[i - 1] + 1, p[i] + 1), p[i - 1] + cost); } //交換p和d _d = p; p = d; d = _d; } //最后的一個值即為差異值 return p[n];
}</pre>差異值算出來后,除以字符串長度就能算出相似度。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!