DFA敏感词过滤算法详解

功能简介

DFA算法模型是解决针对一段文本,过滤出其他文本。比如我们定义了三段文本a、b和c为“张三”、“程序员”、“开发”,而在文本d“我的名字叫张三,我是一名刚工作一年的程序员”的内容中,可以发现文本d是包含a和b文本的,这个过程就是DFA算法模型实现的功能。DFA算法的核心是构建出一个模型。

抛出疑问

  1. java中有contain方法进行判断a文本是否包含b文本,为什么不直接用contain进行比较呢?
  2. DFA算法用Java如何构建?
  3. DFA算法性能如何?

算法思想

举个例子,假如我们认为以下是敏感词。

 1. 我是张三
 2. 我是李四
 3. 大王八
 4. 大王来了

然后我们根据上面的敏感词构建出一个模型,该模型实际上是一颗树,或者说是森林。在java代码中实际上是多个map,为了方便观察,我转换成了json。(不完整版本)

    {
   
        "我": {
   
            "是": {
   
                "张": {
   
                    "三": {
   }
                },
                "李": {
   
                    "四": {
   }
                }
            }
        },
        "大": {
   
            "王": {
   
                "来": {
   
                    "了": {
   }
                },
                "八": {
   }
            }
        }
    }

我们通过上面构建的模型对目标文本“我是张三,我是大王”进行敏感词过滤,大致过程如下:

1. 遍历目标文本,获取到第一个字符‘我’,在我们构建的模型的第一层比较,发现第一层的字符串是‘我’和‘大’。
2. 字符‘我’能够在模型中匹配到,继续获取目标文本的下一个字符‘是’,发现第二层也是‘是’,也是匹配上了,依次是‘张’、‘三’。
3. 通过步骤2我们可以断定目标文本中“我是张三”是敏感词,记录下来。
4. 继续获取下一个字符,这里节省时间直接跳到‘大’的字符,发现可以和第一层的‘大’匹配上,然后获取目标文本中的下一个字符‘王’,也能够在模型中匹配上。
5. 这样整个匹配过程完成了,大家可能有疑问,那到底“大王”算不算敏感词呢?如果算,但是我们在定义敏感词的时候并没有“大王”;如果不算,但确实是匹配上了。

为了解决这个问题,我们在构建好的模型中加一个字段就可以解决这种摸棱两可的问题。

{
   
        "我": {
   
            "isEnd": false,
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值