敏感字过滤优化版DFA算法与python代码实现

1.背景
项目中需要对敏感词做一个过滤,首先有几个方案可以选择:
a.直接将敏感词组织成String后,利用indexOf方法来查询。
b.传统的敏感词入库后SQL查询。
c.利用Lucene建立分词索引来查询。
d.基于文本内容的敏感词决策树信息过滤算法(SWDT-IFA)。
e.利用优化版DFA算法来进行。
首先,项目收集到的敏感词有几千条,使用a方案肯定不行。其次,为了方便以后的扩展性尽量减少对数据库的依赖,所以放弃b方案。然后Lucene本身作为本地索引,敏感词增加后需要触发更新索引,并且这里本着轻量原则不想引入更多的库,所以放弃c方案。使用的d方案。目前没有任何开源代码,需要自行开发。难度极大。且需构造敏感词决策树,查准率和查全率不能达到100%。综上根据成本,效率,效果来看。选用优化版DFA算法方案较为合适。
优化版的DFA算法相比DFA算法优点是可以去除中间填充无意义的字符来混淆。达到只要敏感词库有的词。都可以匹配得到。但是这里我们需要返回2个值。一个是未经过处理的文本,另一个是处理过的文本。
2.DFA算法简介
DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。
这里写图片描述
简单点说就是,它是是通过event和当前的state得到下一个state,即event+state=nextstate。理解为系统中有多个节点,通过传递进入的event,来确定走哪个路由至另一个节点,而节点是有限的。
3.敏感词搜寻中的DFA算法
3.1敏感词库构造描述
以王八蛋和王八羔子两个敏感词来进行描述,首先构建敏感词库,该词库名称为SensitiveMap,这两个词的二叉树构造为:
这里写图片描述
用hash表构造为:
这里写图片描述
3.2基于敏感词库收索算法的描述
以上面例子构造出来的SensitiveMap为敏感词库进行示意,假设这里输入的关键字为:王八不好,流程图如下:
这里写图片描述
4.代码编写
4.1构造敏感词python代码实现
这里写图片描述
4.2 python实现敏感词查询代码
这里写图片描述
5.性能测试
5.1测试效率
实验中我整理了7000多个敏感词。测试结果显示:
输入一小段文字测试:
这里写图片描述

在中间填充特殊字符也可以被过滤掉。但是中间填充数字字母目前无法解决。但是解决思路也可以在输入文本的时候把字母或者数字先给他替换掉。但是这样操作就存在于有些敏感字数字或字母无法识别出来。例如:64运动,911事件,caonima,jiba等等
输入一个文本为8000个字测试:
这里写图片描述
结果只需要0.082秒

6.优化思路
6.1敏感词用拼音或数字代替
两种解决思路:一种是最简单是遇到这类问题,先丰富敏感词库进行快速解决。第二种是判断时将敏感词转换为拼音进行对比判断。

参考文献:DFA算法的简单说明与案例实现

猜你喜欢

转载自blog.csdn.net/weixin_40283201/article/details/82081030