如何识别文本中的一组关键词

时间:2011-05-20 16:04:21

标签: algorithm lexical-analysis

我有一大堆关键词。给定一个文本,我希望只能识别出单词列表中出现的那些单词并忽略所有其他单词。解决这个问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:4)

Aho-Corasick algorithm是一种快速算法,用于识别较大源字符串中的一组模式字符串。它被多个搜索实用程序以及许多防病毒程序使用,因为它在时间O(m + n + z)运行,其中n是您尝试匹配的所有模式字符串的总大小,m是长度要搜索的字符串,z是匹配的总数。此外,如果您事先知道要搜索的字符串,可以离线执行O(n)工作并将搜索时间缩短为O(m + z)。

答案 1 :(得分:3)

将您的文字存储在trie

走你的文字。每次你开始说话,开始走路。如果你在特里结尾的单词末尾结束这个单词,那就是你感兴趣的单词。否则就不是。

对于单词的定义,您会遇到一些小问题。特别是非单词字符通常以单词结尾,但也有例如don't

请注意,一些正则表达式引擎(在Perl的任何最新版本中都是Perl)非常智能,可以自动构建一个trie并尝试匹配它。因此,您很有可能只需将管道连接在一起,然后将其放在正则表达式引擎上即可获得良好的性能。

如果这不起作用,您可以构造一个编码trie的正则表达式。例如,根据列表foobarbazblat,正则表达式/\b(foo|b(?:a(?:r|z)|lat))\b/应该与这些单词匹配,并且只匹配这些单词。它可能不会像手动C那样有效(例如在Perl的引擎上你会遇到性能缓慢的复杂正则表达式的检查,并且它可能会做一些它不需要做的愚蠢的回溯)但这将是一个很多减少工作量。

答案 2 :(得分:1)

  1. 将您的关键字放入允许轻松查找的数据结构中。例如,哈希表或二叉树。如果您是硬核,则可以使用关键字创建完美的哈希值。
  2. 使用DFA将输入分解为“单词”。这可以使用正则表达式库或简单的状态机来完成。
  3. 查找每个“字词”以查看它是否是您的关键字之一。