敏感词审查工具类—DFA算法
目录
- 简介
- 检索过程
- 工具类
- 测试及运行结果
简介
DFA全称为:Deterministic Finite Automation,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。但不同于不确定的有限自动机,DFA中不会有从同一状态出发的两条边标志有相同的符号。
检索过程
例如:
敏感词:东方、西边、西北方
一次性的把所有的敏感词存储到了多个map中,如下图:
实质上是HashMap的get实现
- 第一个字“东”,我们在hashMap中可以找到。得到一个新的map = hashMap.get(“”)。
- 如果map == null,则不是敏感词。否则跳至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算法相关推荐
- 敏感词过滤工具类(DFA算法匹配字典)
直接调用方法:wordFilter package com.util;import java.io.BufferedReader; import java.io.FileNotFoundExcepti ...
- JAVA -敏感词过滤器 工具类SensitiveFilter
1.添加敏感词过滤工具类 类1: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStre ...
- 敏感词或关键词过滤,DFA算法详解及python代码实现
一.前言 近期项目有了一个过滤敏感词的功能需求,在网上找了一些方法及解说,发现DFA算法比较好用,容易实现,但很多文章解释得不太清楚,这里将其详细描述,并用python代码实现. 二.DFA算法详解 ...
- 【敏感词检测】用DFA构建字典树完成敏感词检测任务
任务概述 敏感词检测是各类平台对用户发布内容(UGC)进行审核的必做任务. 对于文本内容做敏感词检测,最简单直接的方法就是规则匹配.构建一个敏感词词表,然后与文本内容进行匹配,如发现有敏感词,则提交报 ...
- 【java进阶06:数组】使用一维数组模拟栈数据结构 使用二维数组模拟酒店,酒店管理系统 Arrays工具类 冒泡排序算法、选择排序算法、二分法
目录 数组 二维数组 总结 作业 Arrays工具类 数组 数组总结 及 静态初始化一维数组 /* Array:1.java语言中的数组是一种引用数据类型,不属于基本数据类型,数组的父类是Object ...
- go敏感词过滤工具wordsfilter
package mainimport ("fmt""github.com/syyongx/go-wordsfilter" )//屏蔽敏感词 func main( ...
- Java工具类--雪花算法生成全局唯一ID
import java.lang.management.ManagementFactory; import java.net.InetAddress; import java.net.NetworkI ...
- java sha1工具类_SHA1算法工具类
package com.sinosoft.cms.common.util; import java.security.MessageDigest; import org.apache.commons. ...
- 敏感词工具(sensitive word)的使用
敏感词工具(sensitive word)的使用 开始 优点 准备 1.引入对应的包地址 2.常用api盖览 使用实例 1.是否有敏感词存在 2.返回所有敏感词 3.默认的替换策略 4.指定替换词 新 ...
最新文章
- 使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题
- 解决无法创建txt文档
- python使用多线程写生成器_Python学习——多线程,异步IO,生成器,协程
- 如何批量在文件夹中建立php,怎么批量创建文件夹_一次性创建多个文件夹方法_一聚教程网...
- 精益 React 学习指南 (Lean React)- 4.1 react 代码规范
- CODE[VS]1012 最大公约数和最小公倍数问题
- 你自己的3D建模软件(准备00)——作者的话
- uni-app 省市区选择器
- 2014acm亚洲区域赛陕西赛总结
- Java打开jnlp
- 数字电路硬件设计系列(八)之LED电路设计
- Arcgis中影像空值NoData处理及去除背景值
- Discuz3.4-SSRF-从触发点到构造payload
- 大蟒蛇python编译器_python蟒蛇绘制
- 网站建设之邮件发送形式
- fabric sdk java_Hyperledger Fabric Java SDK最新教程
- JavaScript 普通计算器 思路分析及代码
- 2023年美赛春季赛 赛题浅析
- 爬虫笔记之刷小怪练级:yymp3爬虫(音乐类爬虫)
- 制作国界线正确的世界地图 (Shapefile)
热门文章
- C++之erro: no matching function for call to
- 客户资源如何分配,怎么找客户资源
- 学计算机的电脑用i5还是i7好,家用电脑,选酷睿i7还是选i5,这些常识让你不纠结...
- 女生java_女生适合选JAVA后端吗?
- 揭秘网络隔离和微分段
- 从电信网络诈骗角度剖析,诈骗资金是如何流转的?
- 九章算术更相减损术的的c语言实现
- 小米部分手机在相册或相机拍照裁剪图片时,出现错误问题
- Go :生成索引和切片边界检查的测试(附完整源码)
- 16条你应该珍藏,没事就读读的精辟语录!