文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/算法
项目中须要对敏感词作一个过滤,首先有几个方案能够选择:数据库
a.直接将敏感词组织成String后,利用indexOf方法来查询。微信
b.传统的敏感词入库后SQL查询。优化
c.利用Lucene创建分词索引来查询。3d
d.利用DFA算法来进行。blog
首先,项目收集到的敏感词有几千条,使用a方案确定不行。其次,为了方便之后的扩展性尽可能减小对数据库的依赖,因此放弃b方案。而后Lucene自己做为本地索引,敏感词增长后须要触发更新索引,而且这里本着轻量原则不想引入更多的库,因此放弃c方案。因而咱们选定d方案为研究目标。索引
DFA全称为:Deterministic Finite Automaton,即肯定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另外一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不一样于不肯定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。路由
简单点说就是,它是是经过event和当前的state获得下一个state,即event+state=nextstate。理解为系统中有多个节点,经过传递进入的event,来肯定走哪一个路由至另外一个节点,而节点是有限的。get
以王八蛋和王八羔子两个敏感词来进行描述,首先构建敏感词库,该词库名称为SensitiveMap,这两个词的二叉树构造为:博客
用hash表构造为:
以上面例子构造出来的SensitiveMap为敏感词库进行示意,假设这里输入的关键字为:王八很差,流程图以下:
对于“王*八&&蛋”这样的词,中间填充了无心义的字符来混淆,在咱们作敏感词搜索时,一样应该作一个无心义词的过滤,当循环到这类无心义的字符时进行跳过,避免干扰。
两种解决思路:一种是最简单是遇到这类问题,先丰富敏感词库进行快速解决。第二种是判断时将敏感词转换为拼音进行对比判断。
不过目前这两种方案均不能完全很好的解决该问题,此类问题还需进一步研究。
-----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^