使用最小编辑距离算法求字符串相似度

       编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

       下图为计算字符“beauty”与“batyu”编辑距离的二维图解:

使用最小编辑距离算法求字符串相似度_第1张图片   使用最小编辑距离算法求字符串相似度_第2张图片

步骤详解:1)先建立一张二维表(矩阵),如上图所示。矩阵中(0,0)位置不对应字母。

 2)计算矩阵(1,1)位置(即:红圈1所在的置)的值,此处为方便描述,将该位置定义为A点。

A点的值需要由A点左上方、左边和上边的值共同决定。为方便描述先将A点所需要的三个值赋给变量a,则a=(0,1,1)

A点对应的字母分别为(b,b),字母相同,则A点左上角的值加0(不同则加1),A点左边与上边的值分别加1。

此时a=(0,2,2),取a中做小值填入A点位置,见右图所示。

矩阵(1,2)位置(即:红圈2所在的位置),定义为B点。

B点赋值为b=(1,0,2)。由于B点对应的字母为(b,e),字母不同,则B点左上角的值加1,同时,B点左侧上侧分别加1。

此时b=(2,1,3),取b中最小值赋给B点。

3)按照步骤2)求出每个格子中的值。所有值求出后,右下角的值为最小编辑距离。

注意:不管上述步骤中的A点对应的字母(b,b)或B点对应的字母(b,e)是否相同,左侧和上侧都需要加1。


java版本的实现:

private static int compare(String str, String target) {

		int d[][]; // 矩阵

		int n = str.length();

		int m = target.length();

		int i; // 遍历str的

		int j; // 遍历target的

		char ch1; // str的

		char ch2; // target的

		int temp; // 记录相同字符,在某个矩阵位置值的增量,不是0就是1

		if (n == 0) {

			return m;

		}

		if (m == 0) {

			return n;

		}

		d = new int[n + 1][m + 1];

		for (i = 0; i <= n; i++) { // 初始化第一列

			d[i][0] = i;

		}

		for (j = 0; j <= m; j++) { // 初始化第一行

			d[0][j] = j;

		}

		for (i = 1; i <= n; i++) { // 遍历str

			ch1 = str.charAt(i - 1);

			// 去匹配target

			for (j = 1; j <= m; j++) {

				ch2 = target.charAt(j - 1);

				if (ch1 == ch2) {

					temp = 0;

				} else {

					temp = 1;

				}

				// 左边+1,上边+1, 左上角+temp取最小

				d[i][j] = min(d[i - 1][j] + 1, d[i][j - 1] + 1, d[i - 1][j - 1]

				+ temp);

			}

		}

		return d[n][m];

	}


你可能感兴趣的:(机器学习)