字符串近似(从字典中提取最接近的匹配字符串)

时间:2012-09-03 08:59:49

标签: java string string-matching approximation

是否有任何字符串匹配代码或算法为我们提供了来自dictionay的大致匹配的字符串(包含预定义的字符串集)?

例如:如果字典中有10个字符串(字符串集),如果用户输入了一些字符串,那么算法应该告诉你字典中接近匹配的字符串。如果我得到具有匹配值(或百分比)的匹配字符串,它会很棒。

4 个答案:

答案 0 :(得分:2)

我认为最好使用lucene库,它有一个名为org.apache.lucene.search.spell的包你可以轻松使用它。它提供3种算法 NGramDistance,LevensteinDistance,JaroWinklerDistance try this

答案 1 :(得分:1)

您可以在字典中的字符串和字符串之间计算Levenshtein distance,以找到最接近的匹配项。这可能不是拼写检查的最佳选择,因为它不会对交换的字母或语音相似的字词有利。例如问题比kwizchum更接近休息。

有关更多示例,请阅读http://en.wikipedia.org/wiki/Approximate_string_matching

答案 2 :(得分:1)

我只是想补充一点,因为版本3.0,StringUtils也有a convenient Levenshtein Distance method

public static int getLevenshteinDistance(CharSequence s,
                     CharSequence t)

之后,它就像迭代整个集合并记住最接近的匹配一样简单:

public static Object findClosestMatch(Collection<?> collection, Object target) {
    int distance = Integer.MAX_VALUE;
    Object closest = null;
    for (Object compareObject : collection) {
        int currentDistance = StringUtils.getLevenshteinDistance(compareObject.toString(), target.toString());
        if(currentDistance < distance) {
            distance = currentDistance;
            closest = compareObject;
        }
    }
    return closest;
}

请注意,上面的方法确实要求集合为空安全,并且要使toString()得到合理实现。

答案 3 :(得分:0)

您可以尝试Levenshtein Distance techinque。

简单的想法是你有四个基本操作:

  • 插入(地狱 - &gt;地狱 o
  • 更换(很好 - &gt; r 冰)
  • 删除(bowlin g - &gt; bowlin)
  • 交换(brohter - &gt; bro th er)

你算法应该计算你的单词和字典中每个单词之间的距离。最小距离意味着该单词与给定输入匹配更准确。