本文作者:L_Leisure,行者AI工作室;转载请注明来源;
背景
在工作中需要对一些 违禁词进行拦截,实际应用场景中,需保证匹配过程在数百毫秒内给出结果。因此,如何快速,准确的识别文本中是否包含了这些关键词就变得尤为重要。
对于上述问题我们描述为以下形式。
给定关键词集合P={p1,p2,……,pk},在目标串T[1…m]中找到出现了哪些关键词。
最容易想到的方法就是针对每个单词去匹配一遍,最后总结出都哪些单词匹配成功。
考虑KMP算法,单个关键词匹配的时间复杂度是O(|pk|+m),所以,所有关键词都匹配一遍的时间复杂度为O(|p1|+m+|p2|+m+…+|pk|+m)。令n=|p1|+…+|pk|,上式化简为O(n+km),因此,当关键词的数量变得非常多时,这种算法就变得无法忍受了。
Alfred V.Aho和Margaret J.Corasick在1974年提出了一个经典的多模式匹配算法-AC算法,这个算法可以保证对于给定的长度为n的文本,和模式集合P{p1,p2,…pm},在O(n)的时间复杂度内找到文本中的所有目标模式,而