1、定义

有穷自动机FA(Finite Automaton)的每一步操作都是确定的,因此可称为确定型有穷自动机。确定有穷自动机DFA(Deterministic Finite Automaton)就是说当一个状态面对一个输入符号的时候,它所转换到的是一个唯一确定的状态。

2、过程

无意中发现这个算法,发现这个DFA可以很好的解决在限定字段发送,对不规定的词语进行限定的查找,极大的提高效率。

有一段文字,

你好,我是秦始皇的后裔,我有一千多亿的资产被政府冻结了,现在需要诈骗你 100 块钱,用于解冻我们的资产,解冻完成后再骗你一百。

以前我们对一段文字中匹配不规范的词语,往往是采用将敏感词进行一个个的匹配,假设有一个敏感词-诈骗,我们以诈骗为核心,对文字进行匹配,如果存在,则返回错误。

采用DFA算法后,我们以文字为核心,对文字进行拆分,将敏感词运用DFA保存为一个有穷自动机,把拆分的文字进行匹配,极大的提升效率。

        List<String> dirtywords = new ArrayList<>();for (String s : dirty) {boolean contains = msg.contains(s);if (contains) {dirtywords.add(s);}}long end = System.currentTimeMillis();System.err.println(end - start);System.err.println(dirtywords);

运行结果:2882198个数据

花费时间为298毫秒

        //进行DFA算法查询SensitivewordFilter sensitivewordFilter = new SensitivewordFilter();sensitivewordFilter.setDirtyWordLocalCache(dirtyWordLocalCache);System.err.println("华丽的分割线------------------------------------");start = System.currentTimeMillis();Set<String> sensitiveWord = sensitivewordFilter.getSensitiveWord(msg);System.err.println(sensitiveWord);end = System.currentTimeMillis();System.err.println(end - start);

同样的数据,花费为0毫秒,相差巨大

三、下面为DFA算法代码,开箱即用

@Component
public class SensitivewordFilter {/*** 获取文字中的敏感词** @param txt       文字* @return Set*/public Set<String> getSensitiveWord(String txt) {return getSensitiveWordSets(txt);}/*** 替换敏感字字符** @param txt         文本* @param replaceChar 替换字符,默认** @return String*/public String replaceSensitiveWord(String txt, String replaceChar) {String resultTxt = txt;// 获取所有的敏感词Set<String> sets = getSensitiveWord(txt);for (String str : sets) {String replaceString = getReplaceChars(replaceChar, str.length());resultTxt = resultTxt.replaceAll(str, replaceString);}return resultTxt;}/*** 获取替换字符串** @param replaceChar 替换符* @param length      长度* @return String*/private String getReplaceChars(String replaceChar, int length) {StringBuilder resultReplace = new StringBuilder(replaceChar);for (int i = 1; i < length; i++) {resultReplace.append(replaceChar);}return resultReplace.toString();}/*** 检查文字中是否包含敏感字符,检查规则如下* @param txt        文本* @return int 如果存在,则返回敏感词字符的长度,不存在返回0*/public int checkSensitiveWord(String txt) {Set<String> sets = getSensitiveWordSets(txt);return sets.size();}private Set<String> getSensitiveWordSets(String txt) {Set<String> sensitiveWordSets = new HashSet<>();for (int n = 0; n < txt.length(); n++) {// 判断是否包含敏感字符int length = judgeSensitiveWithIndex(txt, n);if (length > 0) {// 存在,加入list中sensitiveWordSets.add(txt.substring(n, n + length));// 减1的原因,是因为for会自增n = n + length - 1;}}return sensitiveWordSets;}/*** 根据指定位置是否是敏感词的开始** @param txt        文本* @param beginIndex 开始位置* @return int*/private int judgeSensitiveWithIndex(String txt, int beginIndex) {// 匹配标识数默认为0int matchFlag = 0;char word;Map nowMap = dirtyWordLocalCache.getSensitiveWordMap();for (int i = beginIndex; i < txt.length(); i++) {word = txt.charAt(i);// 获取指定keynowMap = (Map) nowMap.get(word);// 存在,则判断是否为最后一个if (nowMap != null) {// 找到相应key,匹配标识+1matchFlag++;if ("1".equals(nowMap.get("isEnd"))) {// 如果为最后一个匹配规则,结束循环,返回匹配标识数break;}} else {// 不存在,直接返回break;}}// 长度必须大于等于1,为词if (matchFlag < 2) {matchFlag = 0;}return matchFlag;}}

下发策略,DFA算法优化---敏感词查询相关推荐

  1. spring boot 使用DFA算法实现敏感词过滤

    spring boot 使用DFA算法实现敏感词过滤 敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的. DFA算法简介 DFA全称为:Deterministi ...

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

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

  3. 一种基于DFA算法的敏感词检测JAVA程序片段

    本文章提供一种基于DFA算法的敏感词检测JAVA程序片段,如下: 1.构造多叉树数据结构 import org.jetbrains.annotations.NotNull;/*** 多叉树* @aut ...

  4. 基于PHP的DFA算法(敏感词过滤)

    基于PHP的DFA算法(敏感词过滤) 看到网上很多的DFA算法,很多都有不同程度的问题,自己修改了一下,亲测没有问题,用在系统中过滤敏感词汇,比正则匹配的速度快很多. class DFA {priva ...

  5. dfa算法 java_Java实现DFA算法对敏感词、广告词过滤功能示例

    一.前言 开发中经常要处理用户一些文字的提交,所以涉及到了敏感词过滤的功能,参考资料中DFA有穷状态机算法的实现,创建有向图.完成了对敏感词.广告词的过滤,而且效率较好,所以分享一下. 具体实现: 1 ...

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

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

  7. DFA算法进行敏感词过滤

    1.新建敏感词文本new_adress.txt,进行添加敏感词 2.代码 # -*- coding:utf-8 -*- import timetime1 = time.time() "&qu ...

  8. DFA算法实现敏感词过滤

    写项目时,得到一个新的需求,即实现敏感词的过滤,上网查了下,有几种实现方法,采取了DFA算法,即确定的有穷自动机算法,当初学习编译原理的时候为啥没想到DFA还能这么做,看来眼界和意识还是不够,得锻炼. ...

  9. python实现dfa过滤算法_DFA 算法实现敏感词过滤(python 实现)

    敏感词过滤的经典算法DFA ,看完相关资料后,自己实现了一下,同时做了评估实验 先上代码 #!/usr/bin/python2.6 # -*- coding: utf-8 -*- import tim ...

最新文章

  1. memcache协议
  2. 运行sqlplus时遇到cannot restore segment prot after reloc: Permission denied
  3. rabbitmq 限制速度_技术干货分享:RabbitMQ消息积压的几种解决思路
  4. ABAP程序里设置外部断点,调试时断点怎么也触发不了,该怎么办
  5. 中科大计算机复试题目,08中科大11系(计算机)复试
  6. 开挂的人生: 本科生发Nature和 Science
  7. 超声和免疫学指标的特征能否反映RA临床缓解的表型?[EULAR2015_THU0121]
  8. MIT6.830 lab2 SimpleDB Operators 实验报告
  9. ArcGIS Pro 简明教程(3)数据编辑
  10. Python str 与 bytes 类型(Python2/3 对 str 的处理)
  11. python字典和集合对象可以进行索引_python集合和字典
  12. One Button Combat
  13. java 申明数组 默认构造函数_没有默认构造函数,如何定义对象的数组
  14. 13.文本文件和二进制文件的区别
  15. 使用 eBPF 技术跟踪 Netfilter 数据流
  16. 【JVM学习笔记】JVM内存区域定义与内存结构
  17. 聚石塔RDS数据备份与迁移
  18. SparkRDD优化(二)之SparkRDD共享变量(广播变量,累加器)
  19. “九型人格”-你的团队用了吗
  20. Jersey搭建restFul形式接口

热门文章

  1. 【经典算法】老鼠走迷宫问题
  2. 阿瑶的ajax学习笔记
  3. Web开发——文字样式
  4. mysql 语句中 sum函数求和 null 变 0
  5. 激活老电脑的第二春:内存盘为Chrome浏览器做缓存
  6. 逻辑测试之有五位小姐排成一列,所有的小姐姓不同、穿的衣服颜色不同、喝不同的饮料、养不同的宠物、吃不同的水果。
  7. java jsonobject 赋值_Java中JSONObject相关操作
  8. nsis脚本(软件安装包)语法
  9. 《工程伦理》 李正风、丛杭青、王前 等 思考与讨论(课后习题)答案
  10. css设置背景透明 兼容,每日一更之CSS背景透明内容不透明及CSS兼容性写法