java 相似度算法

 

  1. /** 
  2.  * 文本相似度算法 
  3.  * (據說)由俄國人Vladimir Levenshtein在1965年發明 
  4.  * 原理:返回將第一個字符串轉換(刪除、插入、替換)成第二個字符串的編輯次數。 
  5.  * 次數越少,意味着字符串相似度越高 
  6.  */ 
  7. public class SimilarityRate { 
  8.  private static int min(int one, int two, int three) { 
  9.   int min = one; 
  10.   if (two < min) { 
  11.    min = two; 
  12.   } 
  13.   if (three < min) { 
  14.    min = three; 
  15.   } 
  16.   return min; 
  17.  } 
  18.  public static int ld(String str1, String str2) { 
  19.   int d[][]; //矩陣 
  20.   int n = str1.length(); 
  21.   int m = str2.length(); 
  22.   int i; //遍歷str1的 
  23.   int j;//遍歷str2的 
  24.   char ch1;//str1的 
  25.   char ch2; //str2的 
  26.   int temp; //記錄相同字符,在某個矩陣位置值的增量,不是0就是1 
  27.   if (n == 0) { 
  28.    return m; 
  29.   } 
  30.   if (m == 0) { 
  31.    return n; 
  32.   } 
  33.   d = new int[n + 1][m + 1]; 
  34.   for (i = 0; i <= n; i++) {//初始化第一列 
  35.    d[i][0] = i; 
  36.   } 
  37.   for (j = 0; j <= m; j++) { //初始化第一行 
  38.    d[0][j] = j; 
  39.   } 
  40.   int t = 1
  41.   for (i = 1; i <= n; i++) { //遍歷str1 
  42.    ch1 = str1.charAt(i - 1); 
  43.    //去匹配str2 
  44.    for (j = 1; j <= m; j++) { 
  45.     ch2 = str2.charAt(j - 1); 
  46.     if (ch1 == ch2) { 
  47.      temp = 0
  48.      System.out.println(t++); 
  49.     } else { 
  50.      temp = 1
  51.     } 
  52.     //左邊+1,上邊+1, 左上角+temp取最小 
  53.     d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1] + temp); 
  54.    } 
  55.   } 
  56.   return d[n][m]; 
  57.  } 
  58.  public static double sim(String str1, String str2) { 
  59.   int ld = ld(str1, str2); 
  60.   return 1 - (double) ld / Math.max(str1.length(), str2.length()); 
  61.  } 
  62.  public static void main(String[] args) { 
  63.   String str1 = "abcdhefga"
  64.   String str2 = "gfehdcbaa"
  65.   System.out.println("ld=" + ld(str1, str2)); 
  66.   System.out.println("sim=" + sim(str1, str2)); 
  67.  } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章