【问题标题】:autocomplete algorithms, papers, strategies, etc自动完成算法、论文、策略等
【发布时间】:2021-08-27 02:41:30
【问题描述】:

我想知道是否有人有好的资源可供阅读或编写代码来试验“自动完成”

我想知道自动补全背后的理论是什么,从哪里开始有什么常见的错误等等。

我发现 Enso、Launchy、Google chrome 甚至 tcsh 等产品执行自动补全的方式令人着迷,我只是出于好奇而开始了自己的一些示例代码,我得出的结论是,这一定是一个以前广泛探索过的领域。

如果有人分享有关如何实现此功能的任何优秀技术资源,我将不胜感激。

提前致谢。

【问题讨论】:

    标签: autocomplete


    【解决方案1】:

    【讨论】:

    • 看起来像一个有用的 URL 列表 - 谢谢。我得找个时间去探索一下——当我有时间的时候(哦,看,有一头猪在大黄树周围飞来飞去!)
    • 这是什么大黄树mumbojumbo?
    【解决方案2】:

    查看这篇关于使用 GWT 实现自动完成功能的博客:

    http://jroller.com/glongman/entry/gwt_autocompleter

    但我建议您先从一些非常简单的事情开始,自己掌握实现的方式。我会从 Trie 开始,甚至可能完全存储在客户端上,然后在您认为有必要时使用服务器查询进行优化。

    【讨论】:

    • 该链接现在重定向到一个可疑的赌场网站。
    【解决方案3】:

    自动完成通常使用以下方法之一实现:

    • 树木。通过在树结构(前缀树、后缀树、dawg 等)中对可搜索文本进行索引,可以执行非常快速的搜索,但会占用内存存储空间。树遍历可以适应近似匹配。
    • 模式分区。通过将文本划分为标记 (ngram),您可以使用简单的散列方案执行模式出现的搜索。
    • 过滤。找到一组潜在匹配项,然后应用顺序算法检查每个候选对象。

    关于该主题的几篇论文:

    • 博日沃伊梅利查尔。有限自动机的近似字符串匹配;
    • 贡萨洛·纳瓦罗。近似字符串匹配导览;
    • 列昂尼德·博伊佐夫。近似字典搜索的索引方法:比较分析;
    • Marios Hadjieleftheriou 和 Divesh Srivastava。近似字符串处理;
    • Surajit Chaudhuri 和 Raghav Kaushik。扩展自动完成功能以容忍错误;

    看看completely,一个Java自动完成库。

    【讨论】:

      【解决方案4】:

      这是一个开放的问题,根据情况有十几种策略。根据我的知识,我列出了一些著名的自动完成策略及其相应的数据结构的简短亮点。我还试图总结他们与自动完成问题相关的主要优点缺点 .

      蛮力

      • 优点:可以通过检查所有宇宙(输入)作为下一步来实现
      • 优点:超级简单
      • 优点:适用于状态有限的小型数据集
      • 缺点:没有存储连接,因此每次您必须执行搜索时
      • 缺点:时间复杂度最差。

      Prefixed Tree( Trie )

      • 优点:它是针对这类问题设计的最简单的数据结构。
      • 优点:所有可用的下一个状态的列表存储在每个状态中。
      • 缺点:数据大小应该很小(最多应该是 RAM 大小的一小部分)。

      Directed Acyclic Graph (DAG)

      Trie 存在空间问题,因此其他数据结构的主要目标是降低空间复杂度。 Directed Acyclic Graph (DAG) 是选项之一。通过使用 DAG,您可以将所有相似的子路径合并为一个。因此将保留大量空间。

      fast-autocomplete 存储库位于此区域,它使用有向词图 (DWG) 和 Levenshtein 编辑距离。


      其他一些树选项

      在每个状态(或节点)上都有一个搜索问题。线性搜索是最坏的情况,因此大多数策略通过使用排序(O(nlog(n))然后使用Binary search(O(log(n)) )或使用哈希表(O(1),速度快但空间复杂度更高)。遇到如此多的权衡困境,其他树数据结构变体,如Radix Tree、@987654329 @、Suggest TreeMerkle Tree 可能会有用。

      优先优惠Markov Chain 可用于确定下一个状态的优先级。它存储连接概率,从而产生更准确的结果。

      人工智能策略

      • 优点:好的模型体积小,运行速度快。
      • 优点:好的模型只存储判别特征。
      • 优点:巨大的数据集
      • 优点:自然语言处理 (NLP) 框架具有预定义算法(更高级别的 API)
      • 优点:长期学习能力大大提高。
      • 缺点:了解输入拓扑很重要。
      • 缺点:预处理是一个艰难的过程。
      • 缺点:训练时间长。
      • 缺点:收敛可能需要太多的重试和再训练,这是一个艰难的过程。

      Long short term memory(LSTM)

      有很多有用的机器学习和深度学习策略。一个好的策略,您可以将自动完成视为一个时间序列问题,这样您就可以使用一些模型,例如 LSTM。


      变形金刚

      最后但同样重要的是,我推荐Transformer 型号。目前他们正在改变游戏规则。一个很棒的基于 Transformer 的语言模型是 Google BERT。它在预测未来序列方面非常有前途。

      我还建议,在使用转换器开始您的自动完成项目之前,请查看python_autocomplete 存储库,它使用转换器和 LSTM 来学习 Python 源代码。


      祝你好运!

      【讨论】:

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