【问题标题】:Fastest way to search for a long list of patterns in a text在文本中搜索一长串模式的最快方法
【发布时间】:2022-01-13 02:46:14
【问题描述】:

给定一个“大”模式列表和一个“短”文本,在文本中搜索/标记这些模式的最佳/最快方法是什么,我们试图将模式作为文本的子字符串查找?如果文本中有多个匹配模式,我们希望找到所有匹配。

更具体地说,文本实际上是流式查询,要查找的模式是命名实体。我们需要一个完整的模式来完全匹配。训练 NER 模型来标记实体不是一种选择。 “大”列表是指要查找的几十万个实体。 “短”文本是指平均 10 个单词。

例如:

文字:在复仇者联盟中扮演黑寡妇的演员。

我正在考虑尝试和 FST。试图了解在这种特定情况下两者的优缺点。任何指针将不胜感激。

【问题讨论】:

    标签: search substring information-retrieval trie fst


    【解决方案1】:

    您可以查看 Aho-Corasick 算法。该算法从所有搜索模式构造一个有限状态机,基本上是一个 trie,但有一些额外的边缘。然后它使用这个 trie 同时搜索所有搜索模式的输入字符串。时间复杂度为 O(n + m + z); n = 输入文本的长度,m = 所有搜索模式中的总字符数,z 是您输入的文本中搜索模式的出现次数。

    但是,这种时间复杂度假设您为每次搜索构建 trie,因此如果您预先构建 trie(假设您的搜索模式似乎没有改变)并将其保存到内存中,我认为您可以搜索字符串在 O(n) 中针对预先计算的 trie(有限状态机)。

    【讨论】:

    • 谢谢,埃里克。关于这种方法与使用 WFST 之类的方法相比有何想法?
    • 我对 WFST 不太熟悉,但主要区别似乎在于 WFST 的能力:1)在模式搜索的同时产生输出,2)通过概率根据上下文匹配模式。 Aho Corasick 是一种基于 FSA 的算法,与 WFST(一种有限状态传感器)相比,它最适合搜索文字子串。如果这就是您所需要的,那么 FST / WFST 的上下文匹配似乎有点过头了。如果 WFST 的额外功能有用的话,该基金会似乎类似于 Aho Corasick。希望其他人可以进一步权衡。
    猜你喜欢
    • 2013-05-22
    • 2013-09-04
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    相关资源
    最近更新 更多