基于DFA算法实现过滤敏感词

该篇文章主要是记录我在实现敏感词过滤的实现,
通常我们如果对于敏感词过滤的话,首先想到的肯定是,把敏感词库制成一个数组或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 = 
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值