【问题标题】:Python: Finding partial string matches in a large corpus of stringsPython:在大量字符串中查找部分字符串匹配
【发布时间】:2008-12-12 08:49:03
【问题描述】:

我对在 Python 中实现自动完成很感兴趣。例如,当用户键入字符串时,我想显示磁盘上名称以该字符串开头的文件子集。

在大型语料库(比如几十万个字符串)中找到匹配某些条件的字符串的有效算法是什么?比如:

matches = [s for s in allfiles if s.startswith(input)]

我希望条件灵活;例如。只要输入中的所有字母以相同的顺序出现在 s 中,它就会是匹配的,而不是严格的开头。有什么比我在这里展示的蛮力方法更好的呢?

【问题讨论】:

    标签: python search


    【解决方案1】:

    对于精确匹配,通常实现这样的方法是将您的语料库存储在trie 中。这个想法是将每个字母存储为树中的一个节点,链接到单词中的下一个字母。查找匹配项只是简单地在树上行走,并显示您当前位置的所有子项。例如。 "cat"、"cow" 和 "car" 将存储为:

      a--t
     / \ 
    c   r
     \
      o--w
    

    当你得到一个 c 时,你从 c 节点开始,然后 a 会带你到 c/a 节点(children "t" 和 "r",把 cat 和 car 作为你的完成)。

    请注意,您还需要标记作为完整单词的节点以处理作为其他子字符串的名称(例如“car”和“cart”)

    但是,要获得所需的模糊匹配,您可能需要进行一些更改。

    【讨论】:

      【解决方案2】:

      我使用Lucene 自动完成一个包含十万多种可能性的文本字段,我认为它是瞬间完成的。

      【讨论】:

        【解决方案3】:

        也许 readline 模块是您正在寻找的。它是 GNU readline 库 Python Documentation 的接口。 也许您可以使用set_completer() 提供自己的完成功能。

        【讨论】:

          【解决方案4】:

          匹配字符串所需的灵活性称为模糊匹配模糊搜索。我不知道任何 python 实现(但我没有深入研究该主题),但有一些 C/C++ 实现可以重用,例如支持带有模糊参数的正则表达式的 TRE packaged

          除此之外,总是存在一个问题,即您的单词列表是否适合记忆。如果没有,将它们保存在列表中是不可行的,并且必须将某些内容缓存到磁盘或数据库中。

          【讨论】:

            【解决方案5】:

            (仅解决与问题部分匹配的字符串)

            如果你想自己快速尝试一些东西,为什么不创建一些字典,每个字典都将初始模式映射到字符串列表

            • 每个字典都以特定长度的初始模式为键
            • 字符串列表中的所有字符串都以初始模式开头
            • 仅当列表中少于特定数量(例如 10)的字符串时,才会创建初始模式/字符串列表对

            因此,例如,当用户键入三个字符时,您在字典中查找长度为 3 的键。如果匹配,则意味着您有 1 到 10 种立即可用的可能性。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-11-14
              • 2017-07-15
              • 2013-02-25
              • 1970-01-01
              • 2019-05-01
              相关资源
              最近更新 更多