利用StringUtils计算两个字符串相似度
jopen
13年前
<h3>1.1实现简单介绍</h3> <p>实现原理可参考<a href="http://www.google.com.hk/url?sa=t&rct=j&q=site:www.open-open.com+%E8%AE%A1%E7%AE%97%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9B%B8%E4%BC%BC%E5%BA%A6%E7%AE%97%E6%B3%95%E2%80%94%E2%80%94Levenshtein&source=web&cd=1&ved=0CCoQFjAA&url=http%3A%2F%2Fwww.open-open.com%2Fhome%2Fspace.php%3Fuid%3D37924%26do%3Dblog%26id%3D5646&ei=4SUUT4rmG8aviQfmsthD&usg=AFQjCNFxn3uNIJOgCRhVfSIP5Q47Gf8CrQ&cad=rja">计算字符串相似度算法——Levenshtein</a> </p> <h3></h3> <p>这里的算法区别在于:存差异值的数组由上文中的二维数组,变成这个实现的两个一维数组,并通过不断的交换数值来实现。</p> <h3>1.2源码理解</h3> <pre class="brush:javascript; toolbar: true; auto-links: false;">//计算两个字符串的差异值 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>差异值算出来后,除以字符串长度就能算出相似度。