使用Python快速生成自动完成建议

时间:2014-03-24 16:32:22

标签: python algorithm autocomplete

我有一套约{650}字的all_words。如何使用Python快速生成以给定字符串开头的单词列表?

显然,我可以做类似

的事情
def completions(word_start):
    ell = len(word_start)
    return [w for w in all_words if w[: ell] == word_start]

这可行,但需要一秒钟。什么是生成完整列表的更快方法?

5 个答案:

答案 0 :(得分:2)

快速的方法是按照第一个n字符进行预索引:

words_by_first3 = {}
for word in word_set:
    first3 = word[:3]
    if first3 not in words_by_first3:
        words_by_first3[first3] = set()
    words_by_first3[first3].add(word) 

然后用它来查找完成次数:

def completions(word):
    ell = len(word)
    return set(w for w in words_by_first3[word[:3]] if w[: ell] == word)

在我的情况下,这会很快给出结果,但它会占用大量内存。

答案 1 :(得分:2)

我认为这类问题的最快和最节省空间的数据结构是使用prefix tree。在将您的单词集合解析到树中之后,查找时间应该非常快。那里甚至似乎有一个python implementation

答案 2 :(得分:1)

您可以使用Python生成器(https://wiki.python.org/moin/Generators)。

在开始使用之前,您不必生成所有单词。假设您有一个按字典顺序排序的列表,您可以获取最初的几个结果并开始使用它们。并根据需要获得更多结果'。

答案 3 :(得分:0)

您可能想签出我开源的图书馆:https://github.com/seperman/fast-autocomplete

它非常易于使用:

>>> from fast_autocomplete import AutoComplete
>>> words = {'book': {}, 'burrito': {}, 'pizza': {}, 'pasta':{}}
>>> autocomplete = AutoComplete(words=words)
>>> autocomplete.search(word='b', max_cost=3, size=3)
[['book'], ['burrito']]
>>> autocomplete.search(word='bu', max_cost=3, size=3)
[['burrito']]
>>> autocomplete.search(word='barrito', max_cost=3, size=3)  # mis-spelling
[['burrito']]

答案 4 :(得分:0)

如果数据集相对较小,则蛮力线性搜索不会太差。但是,对于大型数据集(如本例所示),您将很快遇到内存和速度限制。

正如其他答案所提到的,用于此目的的最佳数据结构是Trie,它将使您高效地进行前缀搜索。

但是,很难在纯Python中实现内存高效的特里(特别是如果您想支持更新)。如果您不介意使用通过Python客户端访问的外部进程,则可以使用Typesense:https://github.com/typesense/typesense