我对在Python中实现自动完成感兴趣。例如,当用户键入字符串时,我想在磁盘上显示名称以该字符串开头的文件子集。
查找大型语料库中某些条件(比如几十万个字符串)的字符串的有效算法是什么?类似的东西:
matches = [s for s in allfiles if s.startswith(input)]
我希望条件灵活;例如。只要输入中的所有字母以相同的顺序出现在s中,它就是匹配而不是严格的startwith。什么比我在这里展示的蛮力方法更好?
答案 0 :(得分:6)
对于精确匹配,通常实现此类内容的方法是将您的语料库存储在trie中。我们的想法是将每个字母存储为树中的节点,链接到单词中的下一个字母。找到匹配只是走在树上,并显示当前位置的所有孩子。例如。 “cat”,“cow”和“car”将存储为:
a--t
/ \
c r
\
o--w
当你得到一个c,你从c节点开始,a然后会带你到c / a节点(孩子们) “t”和“r”,将猫和车作为你的完成品。)
请注意,您还需要标记完整单词的节点来处理作为其他子串的名称(例如“car”和“cart”)
要获得所需的模糊匹配,您可能需要进行一些更改。
答案 1 :(得分:3)
我使用Lucene自动填充了超过十万种可能性的文本字段,我觉得它是即时的。
答案 2 :(得分:1)
也许readline模块正是您所寻找的。它是GNU readline库Python Documentation的接口。
也许你可以用set_completer()
提供自己的completition函数。
答案 3 :(得分:0)
您希望匹配字符串的灵活性称为模糊匹配或模糊搜索。我不知道任何python实现(但我没有仔细研究过这个主题)但是你可以重用C / C ++实现,比如支持带模糊参数的regexp的TRE packaged。
除此之外,总是存在一个问题,即你的单词总列表是否适合记忆。如果没有,将它们保存在列表中是不可行的,并且必须将某些内容缓存到磁盘或数据库中。
答案 4 :(得分:0)
(仅解决问题的字符串匹配部分)
如果你想自己快速尝试一下,为什么不创建一些词典,每个词典都将初始模式映射到字符串列表
因此,例如,当用户键入三个字符时,您可以使用长度为3的键查找字典。如果匹配,则表示您可以立即使用1到10种可能性。