敏感词过滤算法

本来做过滤的算法时想直接用目标字符串去和每一个关键词匹配,如果关键词少,还好,关键词多之后效率会很低。

所以看了一些博客写了一个算法。记录一下。

目标:
当然,最重要的是能过滤敏感词,但是如果简单的匹配,添加进一些混淆的字符就没法过滤了。所以目标有:

1、过滤敏感词。
2、处理一些简单的混淆。
3、高效

在敏感词少的情况不谈,如果敏感词多了,词语开头重复的词有很多,例如“尼玛,尼美,尼马*”等等,用一个“我“字去对比,会比较三次,这样检索会大量重复无用的匹配,其实只需要比较一次,怎么实现呢,最好的办法是用敏感词去建树,然后便利树进行匹配。

如果我们有敏感词:中央,中国,中国人,中华人民,美国人,美国,美利坚。
我们需要构建一棵树,如下图:

 树

每个节点还要有一个boolean类型变量用于标记敏感词结尾,例如中国,”国“字节点为结尾,标记true,用途在后面说。
对于完全不匹配的词,我们只需要匹配两次即可,匹配次数与词的数量无关。

 

我们先定义节点类

其中isEnd为是否敏感词结尾标记,childs是子节点集合,childs的key为一个子节点字符,value为一个子节点。
定义好节点,现在来创建树:
定义根节点:

 

构建树
流程图:

树流程图
代码

 

已创建好关键词树,可以开始检索
 检索
代码如下:

 

繁简字体转换:http://618119.com/archives/2010/12/12/186.html

参考代码(C#):http://www.cnblogs.com/passer/p/3461052.html

DFA算法实现:http://blog.csdn.net/chenssy/article/details/26961957

更新:代码中使用了HashMap存储敏感词,如果你添加了addWord和remove等写操作的方法时,在读写高并发时会出现异常,请考虑线程安全的ConcurrentHashMap和读写锁等。

放上完整代码:

 

发表评论