敏感词之 DFA 算法

常用算法

遍历匹配

将输入的词语,与词库中的敏感词逐个字符遍历,对比是否包含

优点:思路简单,易于实现(KMP 算法,Brute-Force 算法)

缺点:当词库数目非常大时,单纯只是匹配,其实性能依然非常的低。

正则表达式

优点:匹配能力强,抗变种敏感词

缺点:性能极弱

什么是DFA

DFA(deterministic finite automaton) 确定有限状态自动机或确定有限自动机,其由一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。

可以类比日常中使用的工作流,每个工作的流程都是确定且数目固定的(提交申请->上级审批->得到回复),当前流程的结果是下级流程触发的前提

在实现敏感词过滤的算法中,必须要减少运算,而DFA在DFA算法中几乎没有什么计算,有的只是状态的转换。

例子

诚然,加入在我们的敏感词库中存在如下几个敏感词:日本人、日本鬼子。

那么我需要构建成一个搜索树

Plain Text
query 日 ---> {本}、query 本 --->{人、鬼子}、query 人 --->{null}、query 鬼 ---> {子}

形如下结构:

这样我们就将我们的敏感词库构建成了一个类似一颗的树,这样我们判断一个词是否为敏感词时就大大减少了检索的匹配范围。比如我们要判断日本人,根据第一个字我们就可以确认需要检索的是那棵树,然后再在这棵树中进行检索。

具体流程

以Java中的HashMap为例来实现DFA算法。

具体过程如下:

日本人,日本鬼子为例

1、在hashMap中查询“日”看其是否在hashMap中存在,如果不存在,则证明已“日”开头的敏感词还不存在,则我们直接构建这样的一棵树。跳至3。

2、如果在hashMap中查找到了,表明存在以“日”开头的敏感词,设置hashMap = hashMap.get(“日”),跳至1,依次匹配“本”、“人”。

3、判断该字是否为该词中的最后一个字。若是表示敏感词结束,设置标志位 isEnd = 1,否则设置标志位 isEnd = 0;

参考

确定有限状态自动机 - 维基百科,自由的百科全书 (wikipedia.org)

java 敏感词之 DFA 算法(Tire Tree 算法)详解

使用DFA实现文字过滤 - 数据结构 - Tech - ITeye论坛

敏感词之 DFA 算法相关推荐

  1. 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现

    文章目录 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现 代码如下 package utils;import com.goo ...

  2. 对敏感词过滤(DFA算法)的思考与理解

    对敏感词过滤的思考与理解 一.技术概述 1.这个技术是干什么用的? 2.学习这个技术的原因 3.技术的难点在哪 二.技术详述 1.流程图 2.代码 三.技术过程中遇见的问题和解决过程 四.总结 五.参 ...

  3. Java 敏感词过滤(DFA有穷自动机)

    Java 敏感词过滤 DFA有穷自动机 初始化敏感词 构建树 查询 完整代码如下 后记 初始化敏感词 使用set集合,可以查询数据库. /*** 初始化值* @return*/private stat ...

  4. 违禁词过滤器 DFA算法升级版

    敏感词|屏蔽字过滤器 DFA算法 升级版增加严格模式强力去除敏感词 该算法经测试在 13993 个敏感词中过滤 26 个字符的文字耗时为:0 ms package test1;import java. ...

  5. java dfa 敏感词_java利用DFA算法实现敏感词过滤功能

    前言 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxoo相关的文字时)时要能检 测出来,很多项目中都会有一个敏感词管理模块,在敏感词管理模块中你可以加入敏感词,然 ...

  6. dfa算法 java_java实现敏感词过滤(DFA算法)

    小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 在写之前,小Alan给大家推荐一篇来自http://cmsblogs.com/?p=1 ...

  7. 敏感词过滤工具类(DFA算法匹配字典)

    直接调用方法:wordFilter package com.util;import java.io.BufferedReader; import java.io.FileNotFoundExcepti ...

  8. Java实现敏感词过滤 - IKAnalyzer中文分词工具

    IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包. 官网: https://code.google.com/archive/p/ik-analyzer/ 本用例借助 I ...

  9. java使用DFA算法实现敏感词过滤

    Java使用DFA算法实现敏感词过滤 DFA,全称 Deterministic Finite Automaton 即确定有穷自动机. 其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每 ...

最新文章

  1. LabVIEW目标测量方法(基础篇—12)
  2. rpm升级时spec文件执行的流程
  3. Libra教程之:move语言的特点和例子
  4. HBase原理-要弄懂的sequenceId
  5. java 枚举学习--从小程序中学习
  6. tomcat.apache startup.bat闪退两种解决方法
  7. 【转】细说.NET 中的多线程 (一 概念)
  8. oracle收发邮件存储过程
  9. php如何从获取数据,如何从​​获取值并保存到php的数据库
  10. python 删除大表数据
  11. 使用JSP 编写九九乘法表
  12. 科技感html页面源码,科技感十足的403html模板动态源码
  13. 8700k超频测试软件,双节+双核,i7 8700k +Z370 Extreme4超频测试
  14. oss图片无法在网站中显示
  15. 【React】项目中组件化使用svg格式的图片
  16. 河南大学计算机学院夏令营,河南大学数学与统计学院2020年优秀大学生国际夏令营...
  17. Java如何dump文件
  18. 湖中剑 前端周刊 #13 | Web录屏、Bundleless、低代码 Deco、Bundle Scanner、RN 低功耗蓝牙
  19. 上海数据分析师培训哪家好,大数据分析与数据分析师有什么区别?
  20. 第三方支付平台--网银在线

热门文章

  1. QtCreator+Arm开发和联机调试
  2. 使用 afl-fuzz 进行模糊测试
  3. linux系列:shell将字符串分割成数组
  4. AVX and SIMD
  5. java的inputstream_java中inputstream的使用
  6. box–jenkins模型_教程– EMFStore –模型库
  7. 怎么判断目标学校是强com还是弱com?
  8. CodeFile与CodeBehind的区别
  9. QML学习之QML常用的元素和属性
  10. Bystack世界观(一):资产的三个维度