怎样衡量两个字符串的类似度(编辑距离动态规划求解)

前言

目前计算句子类似性有不少不一样的方案,好比基于语义词典的方法、基于相同词汇的方法、基于统计的方法和基于编辑距离的方法。这篇文章先介绍编辑距离的基础。java

编辑距离

编辑距离其实就是指把一个字符串转换为另一个字符串所须要的最小编辑操做的代价数。包括插入字符、替换字符和删除字符。编辑距离越小,类似度越大。git

好比咱们要将what转换成where,多是将 a -> e,接着 t -> r ,变为wher,最后添加 e,完成。由于每一步均可以插入、删除或替换,那么如何才能在最终获得一个最小的代价,这是就会用到动态规划来求解。github

假设咱们有长度分别为i、j的两个字符串,设编辑距离为edit(i,j)。接着咱们看下,若是它们最后的字符相等,则编辑距离其实等于edit(i-1,j-1)。而若是最后的字符不相等,那么咱们能够经过插入或替换来使其相等,可是不一样的操做对应的代价不相同,若是插入则为edit(i,j-1)+1eidit(i-1,j)+1,替换则为edit(i-1,j-1)+1bash

求解

用如下动态方程来表示:并发

这里写图片描述
其中
这里写图片描述

举个前面的例子,what 到 where,假设两个字符分别为空时对应的代价数以下,机器学习

编辑距离 w h a t
0 1 2 3 4
w 1
h 2
e 3
r 4
e 5

动态规划后为:分布式

编辑距离 w h a t
0 1 2 3 4
w 1 0 1 2 3
h 2 1 0 1 2
e 3 2 1 1 2
r 4 3 2 2 2
e 5 4 3 3 3

在整个动态规划过程当中一直都是选择最小的代价数,因此最终的3便是这两个字符串的最小代价数,即编辑距离。学习

github

https://github.com/sea-boat/TextAnalyzer/blob/master/src/main/java/com/seaboat/text/analyzer/distance/CharEditDistance.javaui

实现

public class EditDistance {

	public static int getEditDistance(String s, String t) {
		int d[][];
		int n;
		int m;
		int i;
		int j;
		char s_i;
		char t_j;
		int cost;

		n = s.length();
		m = t.length();
		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++) {
			s_i = s.charAt(i - 1);
			for (j = 1; j <= m; j++) {
				t_j = t.charAt(j - 1);
				cost = (s_i == t_j) ? 0 : 1;
				d[i][j] = Math.min(d[i - 1][j] + 1, d[i][j - 1] + 1);
				d[i][j] = Math.min(d[i][j], d[i - 1][j - 1] + cost);
			}
		}
		return d[n][m];
	}

	public static void main(String[] args) {
		EditDistance ed = new EditDistance();
		System.out.println(ed.getEditDistance("what", "where"));
	}
}
复制代码

-------------推荐阅读------------spa

个人2017文章汇总——机器学习篇

个人2017文章汇总——Java及中间件

个人2017文章汇总——深度学习篇

个人2017文章汇总——JDK源码篇

个人2017文章汇总——天然语言处理篇

个人2017文章汇总——Java并发篇


跟我交流,向我提问:

这里写图片描述

公众号的菜单已分为“读书总结”、“分布式”、“机器学习”、“深度学习”、“NLP”、“Java深度”、“Java并发核心”、“JDK源码”、“Tomcat内核”等,可能有一款适合你的胃口。

为何写《Tomcat内核设计剖析》

欢迎关注:

这里写图片描述
相关文章
相关标签/搜索