敏感词之 DFA 算法
敏感词之 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 算法相关推荐
- 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现
文章目录 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现 敏感词过滤 - DFA算法[确定有穷自动机]的Java 实现 代码如下 package utils;import com.goo ...
- 对敏感词过滤(DFA算法)的思考与理解
对敏感词过滤的思考与理解 一.技术概述 1.这个技术是干什么用的? 2.学习这个技术的原因 3.技术的难点在哪 二.技术详述 1.流程图 2.代码 三.技术过程中遇见的问题和解决过程 四.总结 五.参 ...
- Java 敏感词过滤(DFA有穷自动机)
Java 敏感词过滤 DFA有穷自动机 初始化敏感词 构建树 查询 完整代码如下 后记 初始化敏感词 使用set集合,可以查询数据库. /*** 初始化值* @return*/private stat ...
- 违禁词过滤器 DFA算法升级版
敏感词|屏蔽字过滤器 DFA算法 升级版增加严格模式强力去除敏感词 该算法经测试在 13993 个敏感词中过滤 26 个字符的文字耗时为:0 ms package test1;import java. ...
- java dfa 敏感词_java利用DFA算法实现敏感词过滤功能
前言 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxoo相关的文字时)时要能检 测出来,很多项目中都会有一个敏感词管理模块,在敏感词管理模块中你可以加入敏感词,然 ...
- dfa算法 java_java实现敏感词过滤(DFA算法)
小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 在写之前,小Alan给大家推荐一篇来自http://cmsblogs.com/?p=1 ...
- 敏感词过滤工具类(DFA算法匹配字典)
直接调用方法:wordFilter package com.util;import java.io.BufferedReader; import java.io.FileNotFoundExcepti ...
- Java实现敏感词过滤 - IKAnalyzer中文分词工具
IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包. 官网: https://code.google.com/archive/p/ik-analyzer/ 本用例借助 I ...
- java使用DFA算法实现敏感词过滤
Java使用DFA算法实现敏感词过滤 DFA,全称 Deterministic Finite Automaton 即确定有穷自动机. 其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每 ...
最新文章
- LabVIEW目标测量方法(基础篇—12)
- rpm升级时spec文件执行的流程
- Libra教程之:move语言的特点和例子
- HBase原理-要弄懂的sequenceId
- java 枚举学习--从小程序中学习
- tomcat.apache startup.bat闪退两种解决方法
- 【转】细说.NET 中的多线程 (一 概念)
- oracle收发邮件存储过程
- php如何从获取数据,如何从​​获取值并保存到php的数据库
- python 删除大表数据
- 使用JSP 编写九九乘法表
- 科技感html页面源码,科技感十足的403html模板动态源码
- 8700k超频测试软件,双节+双核,i7 8700k +Z370 Extreme4超频测试
- oss图片无法在网站中显示
- 【React】项目中组件化使用svg格式的图片
- 河南大学计算机学院夏令营,河南大学数学与统计学院2020年优秀大学生国际夏令营...
- Java如何dump文件
- 湖中剑 前端周刊 #13 | Web录屏、Bundleless、低代码 Deco、Bundle Scanner、RN 低功耗蓝牙
- 上海数据分析师培训哪家好,大数据分析与数据分析师有什么区别?
- 第三方支付平台--网银在线