搜索数组以查找相似/最相似的字符串Java

时间:2018-09-18 03:03:01

标签: java string arraylist binary-search similarity

我正在一个项目中,我的书名在XML文件中。然后将它们解析并转换为book对象的数组列表。现在,我想搜索它们。我已经成功实现了Collections.binarySearch()。现在的问题是,由于搜索会寻找完全匹配的内容,因此如果拼写正确,它只会翻书。例如,如果我输入“ Harry Pottr”,我将不会得到任何错误的拼写。我需要知道的几件事:

  1. 我将如何创建一个可以为输入提供足够结果的系统,该输入与数组中的内容足够接近。例如:

    ArrayList<Book> library = new ArrayList<Book>();
    为了简单起见,假设我将一些书添加到数组中:"Harry Potter", "The Lord of The Rings", "Wonder"

    现在,如果我要在数组中搜索"Wnder",我希望这本书还能翻起来。

  2. 是否可以使用Collections.binarySearch()函数使用此问题,或者我需要进行自己的二进制搜索才能使用它。

最后,我想说的是我使用Java进行此操作,因此我只能使用标准库和实际语言。我也知道那里也有类似的问题,但是没有人真正回答如何将其应用于搜索的问题。

P.S。我知道Levenshtein的距离。但是,如果我确定可以将其用于已经使用的“收藏夹”搜索功能中。

2 个答案:

答案 0 :(得分:0)

标准库只会带您走这么远。

如果字符串列表(书名)很小,那么您可能可以使用https://github.com/xdrop/fuzzywuzzy(请参阅foreach aliasList [$AdminConfig list SSLConfig] { foreach aliasName [$AdminConfig show $aliasList alias] { set strTrim "alias " set strFinal [string trimleft $aliasName $strTrim] set command "-alias $strFinal -sslProtocol TLSv1.2" $AdminTask modifySSLConfig $command puts saved } } $AdminConfig save )。

否则,如果速度太慢,则需要基于索引的算法,例如https://lucene.apache.org/core/中实现的算法。

此外,由于没有明确的方法来排序要搜索的字符串列表以使二进制搜索正常工作,因此不能将二进制搜索应用于模糊匹配。

答案 1 :(得分:0)

Levenshtein距离是查找两个单词之间相似度的最佳方法之一,但这对二进制搜索无济于事,因为二进制搜索适用于排序的集合,并且可以高效地搜索等于给定值。

对于Levenshtein距离,您不是在寻找与您的搜索字词相等的东西,而是在寻找最相似的商品(Levenshtein距离最小)。 您必须评估列表中的每个项目,以找出最接近的项目。

另一种可能性是Soundex。 Soundex算法尝试捕获单词的发音。它会丢弃所有元音,然后对辅音进行编码,为您提供一个代表单词声音的数字。使用此功能,您可以存储带有其音素值的对象列表,然后在该列表中搜索与您的搜索词相近的音素值。但是,您仍然会遇到没有确切值可搜索的问题。