将大字符串中的子字符串与大量关键字列表匹配的最佳方法是什么?

时间:2013-11-26 07:55:49

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

想象一下,你有数百万条记录包含平均2000字(每个)的文字,而且你还有一个包含大约100000个项目的其他列表。

例如:在关键词列表中你有一个像“奥巴马总统”这样的项目,在其中一个文本记录中你有一些这样的东西:“......奥巴马总统......”所以我想要在文本中找到这个关键字,并用以下内容替换它:“..... {President Obama} ....”要突出显示文本中的关键字,关键字列表包含多名词单词,例如示例。

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

注意:

  1. 现在我以贪婪的方式完成这项工作,逐字检查并匹配它们,但每篇文本记录大约需要2秒钟,我希望零时间附近有一些东西。

  2. 我也知道这就像命名实体识别一样,我和许多NER框架一起工作,例如Gate和...,但是因为我想要这个框架不支持的语言我想手动。

2 个答案:

答案 0 :(得分: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%匹配算法)。

另一种尝试可能是:

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

答案 1 :(得分:2)

假设:大多数关键词都是单个词,但有多个词关键词。

我的建议。

根据第一个单词散列关键字。因此,“总统”,“奥巴马总统”和“克林顿总统”都将达到相同的价值。

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

计算散列将是此解决方案中最昂贵的操作,并且在输入字符串的长度上应该是线性的。