我有一大堆关键词。给定一个文本,我希望只能识别出单词列表中出现的那些单词并忽略所有其他单词。解决这个问题的最佳方法是什么?
答案 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的正则表达式。例如,根据列表foo
,bar
,baz
,blat
,正则表达式/\b(foo|b(?:a(?:r|z)|lat))\b/
应该与这些单词匹配,并且只匹配这些单词。它可能不会像手动C那样有效(例如在Perl的引擎上你会遇到性能缓慢的复杂正则表达式的检查,并且它可能会做一些它不需要做的愚蠢的回溯)但这将是一个很多减少工作量。
答案 2 :(得分:1)