Java中的模糊字符串搜索库

时间:2008-11-29 13:17:12

标签: java nlp fuzzy-search

我正在寻找一个用于模糊字符串搜索的高性能Java库。

有许多算法可以找到类似的字符串,Levenshtein距离,Daitch-Mokotoff Soundex,n-gram等。

存在哪些Java实现?他们的利弊?我知道Lucene,任何其他解决方案或Lucene最好吗?

我找到了这些,有没有人有经验?

8 个答案:

答案 0 :(得分:36)

Commons Lang实施Levenshtein distance

Commons Codec实施soundexmetaphone

答案 1 :(得分:11)

你可以使用Apache Lucene,但根据用例,这可能是太重了。对于非常简单的模糊搜索,使用它可能有点复杂(如果我错了,请纠正我)它需要你建立一个索引。

如果您需要一个简单的在线(=不维护索引)算法,您可以使用模糊Bitap algorithm。我在Java here中找到了一个实现。它的代码适用于一个相对较短的方法,几乎​​可以自我解释签名:

public static List<Integer> find(String doc, String pattern, int k)

Apache Commons StringUtils具有用于模糊字符串匹配的Levenshtein算法的实现。它可以看作是String.equals的模糊版本,Bitap就像String.indexOf的模糊版本,仍然使用Levenshtein距离度量。通常使用Levenshtein将搜索模式与可能匹配的每个子字符串进行比较,这比通常更有效。

备注

  • Bitap算法似乎对相对较小的算法非常有用 字母表,例如纯ASCII。事实上,我链接到的Simon Watiau版本会在非ASCII字符(&gt; = 128)上抛出ArrayIndexOutOfBoundsException,因此您必须对其进行过滤。
  • 我尝试在应用程序中使用Bimap按名称搜索内存中的人员列表。我发现Levenhstein距离为2 让步过多的误报。 Levenhstein距离为1 更好,但它无法检测到你交换两个字母的拼写错误,例如 &#34;威廉&#34;和&#34; Willaim&#34;。我可以想办法解决这个问题, 例如

    1. 仅在精确搜索未找到匹配项时进行模糊搜索(并向用户显示有关此内容的消息)
    2. 调整Bitap以使用Damerau-Levenshtein距离,其中交换距离为1而不是2.根据wikipedia,这是可能的,但我找不到Java中的现有实现。
    3. 代替&#34;包含&#34;做一个&#34; startsWith&#34;。 fuzzy search tools包含Damerau-Levenshtein的前缀版本,但它给了我一个ArrayIndexOutOfBoundsException
    4. 调整算法以引入精确匹配得分更高的搜索结果排名
    5. 如果你打算做2或4,它可能 最好使用像Lucene这样的全文搜索库 反正。

    6. 有关模糊搜索的更多信息,请访问this blog。它的作者 还创建了一个名为BitapOnlineSearcher的{​​{3}}, 但要求您将java.io.Reader与字母一起使用 类。它的Javadoc是用俄语写的。

答案 2 :(得分:10)

如果你主要是比较短字符串并想要一些便携和轻量级的东西,你可以使用众所周知的python算法fuzzywuzzy ported to Java

您可以阅读更多相关信息here

答案 3 :(得分:8)

SimMetrics可能就是您所需要的:http://sourceforge.net/projects/simmetrics/

它有几种算法可用于计算编辑距离的各种风格。

Lucene是一个非常强大的全文搜索引擎,但FT搜索与模糊字符串匹配并不完全相同(例如,给定一个字符串列表找到我与某个候选字符串最相似的字符串)。

答案 4 :(得分:2)

答案 5 :(得分:2)

您可以尝试使用Completely库,它依赖于文本预处理来创建内存索引,以便在大型数据集中有效地回答(模糊)搜索。与Lucene和其他全功能文本搜索库不同,API很小且易于上手。

答案 6 :(得分:1)

你可以试试bitap。我正在使用ANSI C编写的bitap,而http://www.crosswire.org中的java实现速度非常快。

答案 7 :(得分:0)

我认为

Apache Lucene是唯一的方法。我不知道更好的搜索库。

  

Apache Lucene(TM)是一个完全用Java编写的高性能,功能齐全的文本搜索引擎库。它是一种适用于几乎所有需要全文搜索的应用程序的技术,尤其是跨平台搜索。