【问题标题】:What is the best way to match substring from a big string to a huge list of keywords将大字符串中的子字符串匹配到大量关键字的最佳方法是什么
【发布时间】:2013-12-11 06:14:06
【问题描述】:

假设您有数百万条记录,其中包含平均 2000 个单词(每条)的文本,并且您还有另一个包含大约 100000 个项目的列表。

例如:在关键字列表中,您有一个类似“总统奥巴马”的项目,而在其中一个文本记录中,您有类似这样的内容:“..... 奥巴马总统 ....”,所以我想在文本中找到这个关键字并将其替换为类似这样的内容:“..... {president Obama} ....”以突出显示文本中的关键字,关键字列表包含多个名词单词,如示例。

在如此庞大的包含数百万条文本记录的列表中,最快的方法是什么?

注意事项:

  1. 现在我以贪婪的方式做这项工作,逐字检查并匹配它们,但是每个文本记录大约需要 2 秒,我想要一些接近零时间的东西。

    李> 1234563我想手动操作。

【问题讨论】:

  • 我猜你说的语言是C#?你的贪婪方式现在看起来如何正确?

标签: c# regex lookup string-matching named-entity-recognition


【解决方案1】:

假设:大部分关键词是单词,但也有一些多词关键词。

我的建议。

根据第一个词散列关键字。所以“President”、“President Obama”和“President Clinton”都将哈希到相同的值。

然后通过计算哈希逐字搜索。在哈希匹配上实现逻辑以检查您是否匹配多字关键字。

计算哈希将是此解决方案中最昂贵的操作,并且应该与输入字符串的长度成线性关系。

【讨论】:

    【解决方案2】:

    至于准确的关键字匹配:

    10^6 * 2*10^3 单词 = 数十亿个可能的匹配项。将此与 10^5 可能的匹配进行比较会导致超过 10^6 * 2^3 * 10^5 = 2 * 10^14 操作(最坏情况:不匹配,概率不匹配:大 (因为 100000 与所有可能的单词相比都很小?)。

    and i want some thing near zero time

    不可能。

    对于 NER,您必须删除关键字列表并将语法分类到您想要突出显示的类别中。

    类似的东西:

    • 动词
    • 副词
    • 名词
    • 名字
    • 数量
    • 等。

    可以识别。完成后,您可以按类别定义包含特殊单词的特殊列表。例如:President 可能在这样的(名词)列表中,以使用特殊属性突出显示它。因为你最终会得到一个小得多的special list,分成几个catagories。您可以减少所需的操作次数。

    (请意识到,正如您对 NER 的了解一样,您已经知道了。)

    因此,您可以为您的目标语言提取类似 NER 的逻辑(或其他非 100% 匹配算法)。

    另一种尝试可能是:

    将所有关键字放入哈希表或其他(索引)字典中,检查目标词是否存在于该哈希表中。由于它被索引,它将比常规匹配快得多。您可以在哈希表中存储关键字的附加信息。

    【讨论】:

    • 10^14 次操作无关紧要。即使是基于直截了当的 trie 的简单搜索实现也将消除其中的大部分。
    • @Taemyr Stefan 是对的,如果没有匹配项,您将始终再次搜索完整的字符串,这将非常耗时...
    • @WiiMaxx 是的,您将始终搜索完整的字符串。但是,您不会将完整字符串与每个关键字进行比较。所以 10^14 个操作只有在极其幼稚的实现中才有可能。
    猜你喜欢
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    相关资源
    最近更新 更多