我想知道是否有人有很好的资源来阅读或编写代码来试验“自动完成”
我想知道自动完成背后的理论是什么,从哪里开始常见的错误是什么等。
我发现 Enso、Launchy、Google chrome 甚至 tcsh 等产品执行自动补全的方式令人着迷,我只是出于好奇而开始了自己的一些示例代码,我得出的结论是,这一定是一个之前被广泛探索的领域。
如果有人分享任何关于如何实现这一点的良好技术资源,我将不胜感激。
提前致谢。
我想知道是否有人有很好的资源来阅读或编写代码来试验“自动完成”
我想知道自动完成背后的理论是什么,从哪里开始常见的错误是什么等。
我发现 Enso、Launchy、Google chrome 甚至 tcsh 等产品执行自动补全的方式令人着迷,我只是出于好奇而开始了自己的一些示例代码,我得出的结论是,这一定是一个之前被广泛探索的领域。
如果有人分享任何关于如何实现这一点的良好技术资源,我将不胜感激。
提前致谢。
查看这篇关于使用 GWT 实现自动完成的博客:
http://jroller.com/glongman/entry/gwt_autocompleter
但我建议你先从一些非常简单的东西开始,自己掌握实现是如何完成的。我会从 Trie 开始,甚至可能完全存储在客户端上,然后如果您认为有必要,可以使用服务器查询进行优化。
自动完成通常使用以下方法之一实现:
关于这个主题的几篇论文:
完全看一下,一个 Java 自动完成库。
这是一个开放的问题,根据情况有十几种策略。根据我的知识,我列出了一些著名的自动完成策略及其相应的数据结构的简短亮点。我还试图总结他们与自动完成问题相关的主要优点和缺点。
蛮力:
Trie 存在空间问题,因此其他数据结构的主要目标是降低空间复杂度。有向无环图(DAG)是其中一种选择。通过使用 DAG,您可以将所有相似的子路径合并为一个。因此将保留大量空间。
快速自动完成存储库位于此区域,它使用有向词图 (DWG) 和 Levenshtein 编辑距离。
其他一些树选项:
在每个状态(或节点)上都有一个搜索问题。线性搜索是最坏的情况选择,因此大多数策略通过使用排序(O(nlog(n))然后使用二进制搜索(O(log(n) ) )或使用哈希表(O(1) )来改进搜索时间,速度快,但空间复杂度更高)。遇到如此多的权衡困境,其他树数据结构变体,如Radix Tree、Suffix Tree、Suggest Tree和Merkle Tree可能会派上用场。
Prioritizig Offers: 马尔可夫链可用于优先考虑下一个状态。它存储连接概率,从而产生更准确的结果。
人工智能策略:
长期短期记忆(LSTM):
有很多有用的机器学习和深度学习策略。一个好的策略,您可以将自动完成视为时间序列问题,因此您可以使用一些模型,例如 LSTM。
变形金刚:
最后但并非最不重要的一点是,我推荐Transformer模型。目前他们正在改变游戏规则。一个很棒的基于 Transformer 的语言模型是Google BERT。它在预测未来序列方面非常有前途。
我还建议,在使用转换器开始您的自动完成项目之前,请查看使用转换器和 LSTM 来学习 Python 源代码的python_autocomplete存储库。
祝你好运!