文章相似度算法-Levenshtein距离

  百度百科上解释:

  编辑距离,又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将kitten一字转成sitting:   sitten (k→s)   sittin (e→i)   sitting (→g)

  显然易见上例子需要3次才可以转换成那个单词,那么编辑距离就是最小编辑次数。

  很显然,这个东西用来做自然语言的判断作用很大,这次我拿来做的是相似度判断

public static void levenshtein(String str1, String str2) {
		int len1 = str1.length();
		int len2 = str2.length();

		int[][] dif = new int[len1 + 1][len2 + 1];
		//初始化值
		for (int a = 0; a <= len1; a++) {
			dif[a][0] = a;
		}
		for (int a = 0; a <= len2; a++) {
			dif[0][a] = a;
		}

		int temp;
		for (int i = 1; i <= len1; i++) {
			for (int j = 1; j <= len2; j++) {
				if (str1.charAt(i - 1) == str2.charAt(j - 1)) {
					temp = 0;
				} else {
					temp = 1;
				}
				//算出值最小的那个
				dif[i][j] = min(dif[i - 1][j - 1] + temp, dif[i][j - 1] + 1,
						dif[i - 1][j] + 1);
			}
		}
		System.out.println(str1 + str2);

		System.out.println("最小变化距离是" + dif[len1][len2]);
		// 计算相似度
		float similarity = 1 - (float) dif[len1][len2]
				/ Math.max(str1.length(), str2.length());
		System.out.println("两者相似度是" + similarity);
	}

	private static int min(int... is) {
		int min = Integer.MAX_VALUE;
		for (int i : is) {
			if (min > i) {
				min = i;
			}
		}
		return min;
	}
posted @ 2014-05-12 11:32  must Do  阅读(517)  评论(0)    收藏  举报