将大字符串中的子字符串匹配到大量关键字的最佳方法是啥
Posted
技术标签:
【中文标题】将大字符串中的子字符串匹配到大量关键字的最佳方法是啥【英文标题】: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 ....”以突出显示文本中的关键字,关键字列表包含多个名词单词,如示例。
在如此庞大的包含数百万条文本记录的列表中,最快的方法是什么?
注意事项:
现在我以贪婪的方式做这项工作,逐字检查并匹配它们,但是每个文本记录大约需要 2 秒,我想要一些接近零时间的东西。
李> 1234563我想手动操作。【问题讨论】:
我猜你说的语言是C#?你的贪婪方式现在看起来如何正确? 【参考方案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 个操作只有在极其幼稚的实现中才有可能。以上是关于将大字符串中的子字符串匹配到大量关键字的最佳方法是啥的主要内容,如果未能解决你的问题,请参考以下文章
如何有效地将大字符串从 Python 传递到 C++ 扩展方法?
什么算法将集合 A 中的每个元素映射到集合 B 中的最佳匹配?