计算字符串相似度的简易算法

计算字符串相似度的简易算法

算法设计背景:

最近设计知识管理系统的资源导入功能,为了尽量的做到组件化,方便扩展,方便其他模块使用。简化组件提供的和需要的接口,设计并实现了基于 Mapping 机制的导入框架。其中有一功能用到了计算两个字符串相似度的算法,简单设计如下以便参考:

设计思想:

   把两个字符串变成相同的基本操作定义如下:

1.     修改一个字符(如把 a 变成 b

2.     增加一个字符 ( abed 变成 abedd)

3.     删除一个字符(如 jackbllog 变成 jackblog

针对于 jackbllogjackblog 只需要删除一个或增加一个 l 就可以把两个字符串变为相同。把这种操作需要的次数定义为两个字符串的距离L, 则相似度定义为 1/(L+1) 即距离加一的倒数。那么jackbllogjackblog的相似度为 1/1+1=1/2=0.5 也就是所两个字符串的相似度是0.5,说明两个字符串已经很接近啦。

任意两个字符串的距离都是有限的,都不会超过他们的长度之和,算法设计中我们并不在乎通过一系列的修改后,得到的两个相同字符串是什么样子。所以每次只需一步操作,并递归的进行下一计算。JAVA 的实现如下:

 1计算字符串相似度的简易算法/**
 2计算字符串相似度的简易算法 * 
 3计算字符串相似度的简易算法 */

 4计算字符串相似度的简易算法package org.blogjava.arithmetic;
 5计算字符串相似度的简易算法
 6计算字符串相似度的简易算法import java.util.HashMap;
 7计算字符串相似度的简易算法import java.util.Map;
 8计算字符串相似度的简易算法
 9计算字符串相似度的简易算法/**
10计算字符串相似度的简易算法 * @author jack.wang
11计算字符串相似度的简易算法 * 
12计算字符串相似度的简易算法 */

13计算字符串相似度的简易算法public class StringDistance {
14计算字符串相似度的简易算法
15计算字符串相似度的简易算法    public static final Map<String, String> DISTANCE_CACHE = new HashMap<String, String>();
16计算字符串相似度的简易算法
17计算字符串相似度的简易算法    private static int caculateStringDistance(byte[] firstStr, int firstBegin,
18计算字符串相似度的简易算法            int firstEnd, byte[] secondStr, int secondBegin, int secondEnd) {
19计算字符串相似度的简易算法        String key = makeKey(firstStr, firstBegin, secondStr, secondBegin);
20计算字符串相似度的简易算法        if (DISTANCE_CACHE.get(key) != null{
21计算字符串相似度的简易算法            return Integer.parseInt(DISTANCE_CACHE.get(key));
22计算字符串相似度的简易算法        }
 else {
23计算字符串相似度的简易算法            if (firstBegin >= firstEnd) {
24计算字符串相似度的简易算法                if (secondBegin >= secondEnd) {
25计算字符串相似度的简易算法                    return 0;
26计算字符串相似度的简易算法                }
 else {
27计算字符串相似度的简易算法                    return secondEnd - secondBegin + 1;
28计算字符串相似度的简易算法                }

29计算字符串相似度的简易算法            }

30计算字符串相似度的简易算法            if (secondBegin >= secondEnd) {
31计算字符串相似度的简易算法                if (firstBegin >= firstEnd) {
32计算字符串相似度的简易算法                    return 0;
33计算字符串相似度的简易算法                }
 else {
34计算字符串相似度的简易算法                    return firstEnd - firstBegin + 1;
35计算字符串相似度的简易算法                }

36计算字符串相似度的简易算法            }

37计算字符串相似度的简易算法            if (firstStr[firstBegin] == secondStr[secondBegin]) {
38计算字符串相似度的简易算法                return caculateStringDistance(firstStr, firstBegin + 1,
39计算字符串相似度的简易算法                        firstEnd, secondStr, secondBegin + 1, secondEnd);
40计算字符串相似度的简易算法            }
 else {
41计算字符串相似度的简易算法                int oneValue = caculateStringDistance(firstStr, firstBegin + 1,
42计算字符串相似度的简易算法                        firstEnd, secondStr, secondBegin + 2, secondEnd);
43计算字符串相似度的简易算法                int twoValue = caculateStringDistance(firstStr, firstBegin + 2,
44计算字符串相似度的简易算法                        firstEnd, secondStr, secondBegin + 1, secondEnd);
45计算字符串相似度的简易算法                int threeValue = caculateStringDistance(firstStr,
46计算字符串相似度的简易算法                        firstBegin + 2, firstEnd, secondStr, secondBegin + 2,
47计算字符串相似度的简易算法                        secondEnd);
48计算字符串相似度的简易算法                DISTANCE_CACHE.put(key, String.valueOf(min(oneValue, twoValue,
49计算字符串相似度的简易算法                        threeValue) + 1));
50计算字符串相似度的简易算法                return min(oneValue, twoValue, threeValue) + 1;
51计算字符串相似度的简易算法            }

52计算字符串相似度的简易算法        }

53计算字符串相似度的简易算法    }

54计算字符串相似度的简易算法
55计算字符串相似度的简易算法    public static float similarity(String stringOne, String stringTwo) {
56计算字符串相似度的简易算法        return 1f / (caculateStringDistance(stringOne.getBytes(), 0, stringOne
57计算字符串相似度的简易算法                .getBytes().length - 1, stringTwo.getBytes(), 0, stringOne
58计算字符串相似度的简易算法                .getBytes().length - 1+ 1);
59计算字符串相似度的简易算法    }

60计算字符串相似度的简易算法
61计算字符串相似度的简易算法    private static int min(int oneValue, int twoValue, int threeValue) {
62计算字符串相似度的简易算法        return oneValue > twoValue ? twoValue
63计算字符串相似度的简易算法                : oneValue > threeValue ? threeValue : oneValue;
64计算字符串相似度的简易算法    }

65计算字符串相似度的简易算法
66计算字符串相似度的简易算法    private static String makeKey(byte[] firstStr, int firstBegin,
67计算字符串相似度的简易算法            byte[] secondStr, int secondBegin) {
68计算字符串相似度的简易算法        StringBuffer sb = new StringBuffer();
69计算字符串相似度的简易算法        return sb.append(firstStr).append(firstBegin).append(secondStr).append(
70计算字符串相似度的简易算法                secondBegin).toString();
71计算字符串相似度的简易算法    }

72计算字符串相似度的简易算法
73计算字符串相似度的简易算法    /**
74计算字符串相似度的简易算法     * @param args
75计算字符串相似度的简易算法     */

76计算字符串相似度的简易算法    public static void main(String[] args) {
77计算字符串相似度的简易算法        float i = StringDistance.similarity("jacklovvedyou""jacklodveyou");
78计算字符串相似度的简易算法        System.out.println(i);
79计算字符串相似度的简易算法    }

80计算字符串相似度的简易算法}

81计算字符串相似度的简易算法
本文转自BlogJava 新浪blog的博客,原文链接:计算字符串相似度的简易算法,如需转载请自行联系原博主。
上一篇:程序员需要知道的十个操作系统的概念


下一篇:通过案例学调优之--模拟buffer busy waits事件