4

是否有任何字符串匹配代码或算法可以为我们提供字典中近似匹配的字符串(包含预定义的字符串集)?

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

4

4 回答 4

2

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

于 2012-09-03T10:55:53.437 回答
1

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

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

于 2012-09-03T09:05:10.890 回答
1

我只是想补充一点,从 3.0 版开始,StringUtils 也有一个方便的 Levenshtein Distance 方法

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() 需要被合理地实现。

于 2015-10-09T09:28:53.230 回答
0

你可以试试Levenshtein Distance techinque。

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

  • 插入(地狱 -> 地狱o
  • 替换(nice -> r ice)
  • 删除(保龄球- > 保龄球)
  • 交换(兄弟 ->兄弟

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

于 2012-09-03T09:10:34.780 回答