基于DFA敏感词查询的算法简析

文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/算法

1.背景

项目中须要对敏感词作一个过滤,首先有几个方案能够选择:数据库

a.直接将敏感词组织成String后,利用indexOf方法来查询。微信

b.传统的敏感词入库后SQL查询。优化

c.利用Lucene创建分词索引来查询。3d

d.利用DFA算法来进行。blog

首先,项目收集到的敏感词有几千条,使用a方案确定不行。其次,为了方便之后的扩展性尽可能减小对数据库的依赖,因此放弃b方案。而后Lucene自己做为本地索引,敏感词增长后须要触发更新索引,而且这里本着轻量原则不想引入更多的库,因此放弃c方案。因而咱们选定d方案为研究目标。索引

2.DFA算法简介

DFA全称为:Deterministic Finite Automaton,即肯定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另外一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不一样于不肯定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。路由

 

简单点说就是,它是是经过event和当前的state获得下一个state,即event+state=nextstate。理解为系统中有多个节点,经过传递进入的event,来肯定走哪一个路由至另外一个节点,而节点是有限的。get

3.敏感词搜寻中的DFA算法

3.1敏感词库构造描述

以王八蛋和王八羔子两个敏感词来进行描述,首先构建敏感词库,该词库名称为SensitiveMap,这两个词的二叉树构造为:博客

 

用hash表构造为:

 

3.2基于敏感词库收索算法的描述

以上面例子构造出来的SensitiveMap为敏感词库进行示意,假设这里输入的关键字为:王八很差,流程图以下:

  

4.代码编写

4.1构造敏感词实现代码

 

4.2实现敏感词查询代码

 

5.优化思路

5.1敏感词中间填充无心义字符问题

对于“王*八&&蛋”这样的词,中间填充了无心义的字符来混淆,在咱们作敏感词搜索时,一样应该作一个无心义词的过滤,当循环到这类无心义的字符时进行跳过,避免干扰。

5.2敏感词用拼音或部分用拼音代替

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

不过目前这两种方案均不能完全很好的解决该问题,此类问题还需进一步研究。

 

                                                                         -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                           若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                                                                                                     

相关文章
相关标签/搜索