如何使用后缀数组进行文本更正?

时间:2018-09-12 11:53:37

标签: algorithm data-structures

我们使用后缀数组来实现关键字搜索,例如考虑一个短语:

白色浴室瓷砖

我们插入后缀:

1)白色浴室瓷砖

2)浴室瓷砖

3)瓷砖

现在,如果用户输入单词“ white”,“ bathroom”或“ tile”,则可以找到短语“ white bathroom tile”。

但是,现在有一个问题,一个人可以输入“ tyle”,什么也找不到。

因此,我想问一下如何为此实现某种快速模糊搜索。基本上,我希望该算法可以纠正用户并仍然找到“ tile”。

我考虑过应用levenstein距离,但是我的尝试失败了。这样的想法是,我们可以找到以“ t”开头的一组单词,并为每个单词计算出莱文斯坦距离,然后返回莱文斯坦距离最小的结果。

之所以失败,是因为用户可以输入的是“ iile”而不是“ tile”,现在什么也没有了,我的算法将levenstein距离应用于“ i”组中的单词。

什么是解决此问题的好方法?

3 个答案:

答案 0 :(得分:0)

您可以使用Edit distance algorithm算法查找与搜索到的单词具有最小编辑距离的单词列表。

例如,对于单词tyleile,搜索的单词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度量