目录

  • 简介
  • 检索过程
  • 工具类
  • 测试及运行结果

简介

DFA全称为:Deterministic Finite Automation,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。


检索过程

例如:
敏感词:东方、西边、西北方
一次性的把所有的敏感词存储到了多个map中,如下图:

实质上是HashMap的get实现

  1. 第一个字“东”,我们在hashMap中可以找到。得到一个新的map = hashMap.get(“”)。
  2. 如果map == null,则不是敏感词。否则跳至3。
  3. 获取map中的isEnd,通过isEnd是否等于1来判断该词是否为最后一个。如果isEnd == 1表示该词为敏感词,否则跳至1。

由此可以推断“东方”为敏感词,但如果我们输入“东边”则不是敏感词。


工具类

/*** 敏感词审查工具类*/
public class SensitiveWordUtil {public static Map<String, Object> dictionaryMap = new HashMap<>();/*** 生成关键词字典库* @param words* @return*/public static void initMap(Collection<String> words) {if (words == null) {System.out.println("敏感词列表不能为空");return ;}// map初始长度words.size(),整个字典库的入口字数(小于words.size(),因为不同的词可能会有相同的首字)Map<String, Object> map = new HashMap<>(words.size());// 遍历过程中当前层次的数据Map<String, Object> curMap = null;Iterator<String> iterator = words.iterator();while (iterator.hasNext()) {String word = iterator.next();curMap = map;int len = word.length();for (int i =0; i < len; i++) {// 遍历每个词的字String key = String.valueOf(word.charAt(i));// 当前字在当前层是否存在, 不存在则新建, 当前层数据指向下一个节点, 继续判断是否存在数据Map<String, Object> wordMap = (Map<String, Object>) curMap.get(key);if (wordMap == null) {// 每个节点存在两个数据: 下一个节点和isEnd(是否结束标志)wordMap = new HashMap<>(2);wordMap.put("isEnd", "0");curMap.put(key, wordMap);}curMap = wordMap;// 如果当前字是词的最后一个字,则将isEnd标志置1if (i == len -1) {curMap.put("isEnd", "1");}}}dictionaryMap = map;}/*** 搜索文本中某个文字是否匹配关键词* @param text* @param beginIndex* @return*/private static int checkWord(String text, int beginIndex) {if (dictionaryMap == null) {throw new RuntimeException("字典不能为空");}boolean isEnd = false;int wordLength = 0;Map<String, Object> curMap = dictionaryMap;int len = text.length();// 从文本的第beginIndex开始匹配for (int i = beginIndex; i < len; i++) {String key = String.valueOf(text.charAt(i));// 获取当前key的下一个节点curMap = (Map<String, Object>) curMap.get(key);if (curMap == null) {break;} else {wordLength ++;if ("1".equals(curMap.get("isEnd"))) {isEnd = true;}}}if (!isEnd) {wordLength = 0;}return wordLength;}/*** 获取匹配的关键词和命中次数* @param text* @return*/public static Map<String, Integer> matchWords(String text) {Map<String, Integer> wordMap = new HashMap<>();int len = text.length();for (int i = 0; i < len; i++) {int wordLength = checkWord(text, i);if (wordLength > 0) {String word = text.substring(i, i + wordLength);// 添加关键词匹配次数if (wordMap.containsKey(word)) {wordMap.put(word, wordMap.get(word) + 1);} else {wordMap.put(word, 1);}i += wordLength - 1;}}return wordMap;}}

测试及运行结果

测试代码:

public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("东方");list.add("西边");list.add("西北方");initMap(list); //构建敏感词词库String content="方向有很多,东方也可称为东边、西边也可称为西方、南边、北边,此外还有东南边、西北方等";//需要审查的字符串Map<String, Integer> map = matchWords(content); //返回一个map,记录了敏感的的出现次数,(敏感词:出现次数)System.out.println(map);}

运行结果:

{东方=1, 西边=1, 西北方=1}

敏感词审查工具类—DFA算法相关推荐

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

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

  2. JAVA -敏感词过滤器 工具类SensitiveFilter

    1.添加敏感词过滤工具类 类1: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStre ...

  3. 敏感词或关键词过滤,DFA算法详解及python代码实现

    一.前言 近期项目有了一个过滤敏感词的功能需求,在网上找了一些方法及解说,发现DFA算法比较好用,容易实现,但很多文章解释得不太清楚,这里将其详细描述,并用python代码实现. 二.DFA算法详解 ...

  4. 【敏感词检测】用DFA构建字典树完成敏感词检测任务

    任务概述 敏感词检测是各类平台对用户发布内容(UGC)进行审核的必做任务. 对于文本内容做敏感词检测,最简单直接的方法就是规则匹配.构建一个敏感词词表,然后与文本内容进行匹配,如发现有敏感词,则提交报 ...

  5. 【java进阶06:数组】使用一维数组模拟栈数据结构 使用二维数组模拟酒店,酒店管理系统 Arrays工具类 冒泡排序算法、选择排序算法、二分法

    目录 数组 二维数组 总结 作业 Arrays工具类 数组 数组总结 及 静态初始化一维数组 /* Array:1.java语言中的数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object ...

  6. go敏感词过滤工具wordsfilter

    package mainimport ("fmt""github.com/syyongx/go-wordsfilter" )//屏蔽敏感词 func main( ...

  7. Java工具类--雪花算法生成全局唯一ID

    import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkI ...

  8. java sha1工具类_SHA1算法工具类

    package com.sinosoft.cms.common.util; import java.security.MessageDigest; import org.apache.commons. ...

  9. 敏感词工具(sensitive word)的使用

    敏感词工具(sensitive word)的使用 开始 优点 准备 1.引入对应的包地址 2.常用api盖览 使用实例 1.是否有敏感词存在 2.返回所有敏感词 3.默认的替换策略 4.指定替换词 新 ...

最新文章

  1. 使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题
  2. 解决无法创建txt文档
  3. python使用多线程写生成器_Python学习——多线程,异步IO,生成器,协程
  4. 如何批量在文件夹中建立php,怎么批量创建文件夹_一次性创建多个文件夹方法_一聚教程网...
  5. 精益 React 学习指南 (Lean React)- 4.1 react 代码规范
  6. CODE[VS]1012 最大公约数和最小公倍数问题
  7. 你自己的3D建模软件(准备00)——作者的话
  8. uni-app 省市区选择器
  9. 2014acm亚洲区域赛陕西赛总结
  10. Java打开jnlp
  11. 数字电路硬件设计系列(八)之LED电路设计
  12. Arcgis中影像空值NoData处理及去除背景值
  13. Discuz3.4-SSRF-从触发点到构造payload
  14. 大蟒蛇python编译器_python蟒蛇绘制
  15. 网站建设之邮件发送形式
  16. fabric sdk java_Hyperledger Fabric Java SDK最新教程
  17. JavaScript 普通计算器 思路分析及代码
  18. 2023年美赛春季赛 赛题浅析
  19. 爬虫笔记之刷小怪练级:yymp3爬虫(音乐类爬虫)
  20. 制作国界线正确的世界地图 (Shapefile)

热门文章

  1. C++之erro: no matching function for call to
  2. 客户资源如何分配,怎么找客户资源
  3. 学计算机的电脑用i5还是i7好,家用电脑,选酷睿i7还是选i5,这些常识让你不纠结...
  4. 女生java_女生适合选JAVA后端吗?
  5. 揭秘网络隔离和微分段
  6. 从电信网络诈骗角度剖析,诈骗资金是如何流转的?
  7. 九章算术更相减损术的的c语言实现
  8. 小米部分手机在相册或相机拍照裁剪图片时,出现错误问题
  9. Go :生成索引和切片边界检查的测试(附完整源码)
  10. 16条你应该珍藏,没事就读读的精辟语录!