一、问题提出
游戏中经常需要检测玩家的昵称或者聊天内容是否包含敏感词组。
一般来说,检测的算法都是直接利用正则表达式进行全字匹配。抛开正则效率差强人意来说,正则算法无法处理拆字情况。举个例子来说,假设"马克思"是一个敏感字,玩家直接输入”马克思“肯定会被检测出来,但假设玩家输入的是”马1克2思3“,这种在敏感字中间随意穿插其他文字,正则则无能为力了。除非对每一个敏感字,都建立类似”马*克*思“之类的正则表达式,这样下来效率就更加低下了。
因此,本文将设计另外一种算法,争取以较高的速度完成屏蔽字检测。
二、算法思路
1.读取敏感字词库,将每一个敏感字的第一个字母保存到hash结构的key,若遇到同一个起始文字有多个相关的敏感字,则将这类敏感字保存在一个list集合,数据结构为Map<Character,List<String>>
2.遍历待测试的文字内容,若当前字符在敏感字索引找得到,则取当前字符以及随后的若干文字组成检测单元。若检测单元包含敏感词组的全部内容,则表示发现敏感文字。
这里有一个问题,就是需要确定当前索引字符组合其后的多少文字构成检测单元。总不能一篇800字的文章,前两个字是”马克“,最后一个文字是”思“,就说这篇文字包含敏感字”马克思“吧 ==。 ==
三、代码实现
3.1.DirtyWordsReader.java
敏感词库读取器,用于读取包含敏感词组的文本
public enum DirtyWordsReade