【问题标题】:new features for autocomplete algorithm自动完成算法的新特性
【发布时间】:2019-04-14 00:45:29
【问题描述】:

我在一次采访中遇到了这个问题。实现一个基本的自动完成系统(https://www.futurice.com/blog/data-structures-for-fast-autocomplete/)很容易从前缀字符串中获取字符串列表。现在我们要添加一些新功能。

例如, 用户输入:lun pla 输出:午餐计划(多词自动完成)

用户输入:pla 输出:午餐计划

用户输入:unc 输出:lunch(自动完成单词的一部分)

如何实现这些功能?

【问题讨论】:

  • 向我们展示您迄今为止所做的尝试。
  • 我在链接中使用了“字母词汇”。我将所有字符串存储在一个列表中并对其进行排序。然后我使用二进制搜索来查找以给定前缀开头的第一个和最后一个字符串。该方法只能处理前缀自动完成。我不知道如何添加这些新功能。
  • StackOverflow 期待您 try to solve your own problem first,因为您的尝试有助于我们更好地了解您想要什么。请编辑问题以说明您在Minimal, Complete, and Verifiable example 中遇到的具体问题。欲了解更多信息,请参阅How to Ask 并拨打tour。

标签: algorithm autocomplete search-engine


【解决方案1】:

您可以尝试以下(基本)方法,我稍后会给出扩展建议:

  • 加载接受词的字典
  • 使用Levenshtein-Damerau distance 作为基础指标,根据这些词构建BK-Tree
  • 在空白字符上拆分输入序列以获取单词
  • 对于每个单词,检查它是否是一个接受的单词。如果在 BK-tree 中没有找到最近的(在可接受的距离内)单词

现在进行改进:

  • 正如您所指出的,有时将两个单词组合在一起时匹配会更有意义
  • 为此使用 Google word2Phrase 算法。您可以找到 C++ 版本here。
  • 使用更聪明的方法来查找单词边界。像 HMM(隐马尔可夫模型)这样的随机方法可能很有用(避免日期、时间、缩写等被拆分)
  • 使用更智能的错误度量。您可以考虑常见的拼写错误、键盘布局错误(习惯于输入 qwerty 的人突然遇到 azerty 时会出现非常具体的错误)等
  • 尝试确定单词part-of-speech type。 (形容词、名词、动词等)。通过这样做,您可以做出更好的完成。

【讨论】:

    猜你喜欢
    • 2011-02-23
    • 2017-07-26
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-17
    • 2012-07-12
    相关资源
    最近更新 更多