1. 问题原型:
给定一段UGC文本或者网页文本,其中含有很多的敏感词或者无效词,但是有一些词只有和其他词一起出现的时候才算是敏感词,我们称其为组合敏感词,需要一种算法,找到其中的组合敏感词和单个敏感词
2. 求解思路:
2.1 单敏感词求解:
2.1.1 暴力求解:
将文本内容逐个和设定的敏感词(以下称之为模式)进行比较,算法的复杂度为O(m*n*k),其中m为文本长度,n为模式的数量,k为模式的总长度,显然,这种复杂度的算法是不可取的,那么接下来我们看有哪些改进算法
2.1.2 一个模式的匹配:
对于一个模式的比较,有很多算法,比较经典的有KMP和Boyer-Moore。
他们改进的思路是,对于单个的模式而言,已经比较过的文本就不需要再回去比较了,也就是去掉了所谓的回溯过程。有些多模式匹配算法也借鉴了这种思想,可以说,有些多模式匹配算法就是泛化的单模式匹配,网上关于以上两种算法的介绍有很多,这里不再赘述。
单模式匹配对于我们2.1的问题的时间复杂度为O(m*n+k),可以想象,如果模式的个数达到10W级别,这种复杂度也是难以忍受的
2.1.3 多模式匹配:
1. 字典树(比如trie树或者其他的改进算法double-trie),建立一颗字典树来存放所有的模式,其时间复杂度为O(m*k),可以看到其时间复杂度还不是非常让人满意
2. 自动机(比如AC自动机等),通过自动机的状态之间的转移来避免回溯问题,其时间复杂度为O(m+z),其中z为模式在文本中出现的长度之和,再看这个算法的时间复杂度:随着文本的长度线性增长,木有一个乘号,完美。(自动机的建立和查找过程可以参考网上资料)
<