搜索数组中的类似/最相似的字符串Java

问题描述 投票:0回答:2

我正在开发一个项目,我在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中这样做,所以我只能使用标准库和实际语言。我也知道有类似的问题,但没有一个真正回答如何将其应用于搜索的问题。

附:我知道Levenshtein的距离。但是,如果我认为可以将其用于已经使用的Collections搜索功能。

java string arraylist binary-search similarity
2个回答
0
投票

标准库只会带你到目前为止。

如果字符串列表(书名)是“小”,那么你可以使用https://github.com/xdrop/fuzzywuzzy(参见FuzzySearch.extractTop)。

否则,如果这个太慢,那么你需要一个基于索引的算法,比如在https://lucene.apache.org/core/中实现的。

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


0
投票

Levenshtein距离是找到两个单词之间相似性的最佳方法之一,但这不会帮助您进行二分搜索,因为二进制搜索对已排序的集合起作用,并有效地搜索等于给定值的对象。

使用Levenshtein距离,您不会寻找与搜索词相等的内容,而是在寻找最相似的项目(最小的Levenshtein距离)。您必须评估列表中的每个项目以找出最接近的项目。

另一种可能性是Soundex。 Soundex算法试图捕获单词听起来的样子。它抛弃了所有的元音,然后编码辅音,给你一个代表单词声音的数字。使用此方法,您可以存储带有soundex值的对象列表,然后搜索其中soundex值接近搜索词的值。但是,您仍然会遇到无法搜索确切值的问题。

© www.soinside.com 2019 - 2024. All rights reserved.