我们使用后缀数组来实现关键字搜索,例如考虑一个短语:
白色浴室瓷砖
我们插入后缀:
1)白色浴室瓷砖
2)浴室瓷砖
3)瓷砖
现在,如果用户输入单词“ white”,“ bathroom”或“ tile”,则可以找到短语“ white bathroom tile”。
但是,现在有一个问题,一个人可以输入“ tyle”,什么也找不到。
因此,我想问一下如何为此实现某种快速模糊搜索。基本上,我希望该算法可以纠正用户并仍然找到“ tile”。
我考虑过应用levenstein距离,但是我的尝试失败了。这样的想法是,我们可以找到以“ t”开头的一组单词,并为每个单词计算出莱文斯坦距离,然后返回莱文斯坦距离最小的结果。
之所以失败,是因为用户可以输入的是“ iile”而不是“ tile”,现在什么也没有了,我的算法将levenstein距离应用于“ i”组中的单词。
什么是解决此问题的好方法?
答案 0 :(得分:0)
您可以使用Edit distance algorithm算法查找与搜索到的单词具有最小编辑距离的单词列表。
例如,对于单词tyle
和ile
,搜索的单词tile
的编辑距离将为1。对于单词iile
,{ {1}}和tile
也将为1。
更新
如果遍历后缀数组中的所有单词并计算编辑距离很慢(时间复杂度是编辑距离为iile
),我建议使用所有后缀来构建前缀树(trie)的句子。然后在查找期间(例如,对于单词O(^2)
),尝试以这种方式遍历前缀树:
答案 1 :(得分:0)
找到this interesting article有关称为BK-tree的数据结构和相关算法。因此,我正在考虑使用BK树。
this article还讨论了更强大的方法。
答案 2 :(得分:0)
Levenshtein距离更适合于单词,另外,您可以使用Cosine_similarity来度量内积空间的两个非零向量之间的相似度,以测量它们之间的角度的余弦值。
对于相似的句子或段落,您可以使用TF-IDF度量