该篇文章主要是记录我在实现敏感词过滤的实现,
通常我们如果对于敏感词过滤的话,首先想到的肯定是,把敏感词库制成一个数组或List,然后循环查询该list或数组,然后判断该次循环的敏感词是否在传入的字符串中,这种方法我们一看就知道很浪费时间与内存。
那么我们看看DFA算法(执行速度很快不需要我们异步判断处理):
DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。
我的实现是参照这篇文章,
实现上大致相同,但是有一些区别,主要解决在实现是出现的一些问题,下面会详细解释.
首先我们需要根据敏感词库构造一个树,敏感词库我们可以维护一个配置文件,也可以直接存储到数据库,不过我建议直接存储数据库比较好,因为这样日后的删减维护都比较方便。
那么我们构造数据的原理是什么呢,下面我用几个个词来描述
我们、我是、我们是、我们不是、测试、测试Ap
这几个词所构成的树如下图所示:
如果你拿着敏感词根据上图走一遍,我感觉你应该对于树的构成原理应该就比较清楚了。
如果是json格式,那么是这样的:
{
"我": {
"们": {
"isEnd": "1",
"不": {
"isEnd": "0",
"是": {
"isEnd": "1" }
},
"是": {
"isEnd": "1"
}
},
"是": {
"isEnd": "1"
},
"isEnd": "0"
},
"测": {
"试": {
"A": {
"p": {
"isEnd": "1" },
"isEnd": "0"
},
"isEnd": "1"
},
"isEnd": "0"
}
}
具体逻辑我就不说了,如果还不懂的话可以看示例代码:
private static void addSensitiveMap(Set<String> sensitiveSet) {
sensitiveMap =