基于DFA算法实现敏感词过滤

1、什么是DFA?

      DFA(Deterministic Finite Automaton),即确定有穷自动机。其特征为:有一个有限状

     态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是

    初态,某些状态是终态。

    

2、基于DFA实现敏感词过滤代码

2.1、生成敏感词树的逻辑

     在这里将敏感词集合存储成符合DFA算法格式的敏感词树,如下图所示:

             

     即将敏感词存储在Map 中,每个敏感词的第一个字是外层Map的key,而Map 的value也是Map

     类型的,我们称之为内层Map,其存储敏感词的下一个字和标识符(用于标识到前一个字时敏

     感词是否结束,即是否是一个敏感词),这里我们用 isEnd 作为标识符,

            isEnd=0:不是敏感词

            isEnd=1:是敏感词

2.2、敏感词校验逻辑    

      其实就是将要校验的字符串内容一个一个的将字拿到。

      拿到后,先基于最外层的key进行匹配,如果匹配上了,继续向内部的key匹配,

           1)如果匹配key的isEnd是1,说明和敏感词对应上了,下次就跳到敏感词的后面继续

                匹配外层key,敏感词树中,一个外层循环key表示一个敏感词。

           2)如果匹配到最后,没有k的isEnd是0,说明没匹配上。下次就从第二个字继续匹配

2.3、代码实现如下:

/***************************************************** 基于 DFA实现敏感词校验* 将一个存储敏感词的集合生成一个敏感词树** @author lbf* @date 2024/12/2 9:40****************************************************/
public class DFAUtil {/*** 敏感词树*/private static Map dfaMap = new HashMap<>();private static final String IS_END = "isEnd";//静态代码块static {BeaconCacheFeign cacheFeign = SpringUtil.getBean(BeaconCacheFeign.class);//远程调用获取Redis中存储的敏感词库Set<String> dirtyWords = cacheFeign.smember(CacheConstant.DIRTY_WORD);//根据敏感词库,初始化敏感词树create(dirtyWords);}/*** 根据敏感词库生成敏感词树** @param dirtyWords 敏感词库(或敏感词数组)*/public static void create(Set<String> dirtyWords){Map nowMap;//遍历敏感词库for(String dirtyWord:dirtyWords){nowMap = dfaMap;//获取敏感词的每个字for(int i=0;i<dirtyWord.length();i++){String word =  String.valueOf(dirtyWord.charAt(i));//判断敏感词中的字在敏感词树中是否存在Map map  = (Map) nowMap.get(word);if(map == null){//表示敏感词库中没有这个字,则把这个字添加到敏感词树中map = new HashMap();//将当前字添加到敏感词库nowMap.put(word,map);}nowMap = map;//如果当前字已经存在 IS_END,且值为1,则表示当前敏感词已经遍历到最后一个字了,直接不管if(nowMap.containsKey(IS_END) && nowMap.get(IS_END).equals("1")){continue;}//当前敏感词已经遍历到最后一个字了,则将 IS_END 修改为1if(i == dirtyWord.length()-1){nowMap.put(IS_END,"1");}else {//没有遍历到最后一个字,则将 IS_END 设置为0nowMap.putIfAbsent(IS_END,"0");}}}}/*** 基于敏感词树,获取短信内容中的敏感词** @param text 短信内容* @return*/public static Set<String> getDirtyWords(String text){//1、定义Set集合,作为返回结果,保存短信内容中的敏感词Set<String> dirtyWords = new HashSet<>();//2、遍历text 中的每个字,然后for(int i=0;i<text.length();i++){//临时存储索引的位置,当nextLength>0,表示匹配到了敏感词int nextLength = 0;//记录敏感词长度int dirtyLength = 0;Map nowMap = dfaMap;//敏感词树//外层的key是往后移动//内层的key,是用来遍历外部key匹配成功后,继续向内部匹配内部的keyfor(int j=i;j<text.length();j++){String word = String.valueOf(text.charAt(j));nowMap = (Map) nowMap.get(word);//没有这个字word开头的敏感词,直接跳到外层key继续下一匹配if(nowMap == null){break;}else {//敏感词长度dirtyLength++;//当前的map的isEnd是1,表示已经找到完整的敏感词if(nowMap.get(IS_END).equals("1")){nextLength = dirtyLength;break;}}}if(nextLength > 0){//执行到这里表示匹配到了敏感词,则把敏感词 添加到 dirtyWords 集合中String dirtWord = text.substring(i,i+nextLength);dirtyWords.add(dirtWord);}}return dirtyWords;}public static void main(String[] args) {// 敏感词库Set<String> dirtyWords = new HashSet<>();dirtyWords.add("三胖");dirtyWords.add("山炮");dirtyWords.add("三胖啊啊");dirtyWords.add("三胖啊啊");// 测试敏感词树的生成create(dirtyWords);// 输出结果for (Object o : dfaMap.entrySet()) {System.out.println(o);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63239.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

隐私安全大考,Facebook 如何应对?

随着数字时代的到来和全球互联网用户的快速增长&#xff0c;隐私安全问题已上升为网络世界的重要议题。社交媒体巨头Facebook因其庞大的用户群体和大量的数据处理活动&#xff0c;成为隐私问题的聚焦点。面对隐私安全的大考&#xff0c;Facebook采取了一系列策略来应对这些挑战…

基于深度学习的甲状腺结节影像自动化诊断系统(PyQt5界面+数据集+训练代码)

随着医学影像技术的发展&#xff0c;计算机辅助诊断在甲状腺结节的早期筛查中发挥着重要作用。甲状腺结节的良恶性鉴别对临床治疗具有重要意义&#xff0c;但传统的诊断方法依赖于医生的经验和影像学特征&#xff0c;存在一定的主观性和局限性。为了解决这一问题&#xff0c;本…

秒懂:使用js验证hash, content hash , chunk hash的区别

一、使用js验证hash, content hash , chunk hash的区别 1、计算一般的 Hash&#xff08;以简单字符串为例&#xff09; 使用crypto-js库来进行哈希计算&#xff0c;需提前引入npm install crypto-js库。 crypto-js&#xff1a; 是一个JavaScript加密算法库&#xff0c;用于实…

Telnet不安全?如何配置使用更安全的STelnet远程登录华为AR1000V路由器?

在上一篇文章中&#xff0c;我们介绍了如何配置一台全新的AR1000V&#xff0c;来实现通过Telnet远程登录设备&#xff08;如何配置使用Telnet远程登录华为AR1000V路由器&#xff1f;&#xff09;。其实&#xff0c;在之前的文章中&#xff0c;我们已经介绍过Telnet是一种不安全…

CV(2)-插值和卷积

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 看看年前可以学到哪。 频率&#xff1a; 灰度值变化程度的指标&#xff0c;是灰度再平面上的梯度幅值: 幅值&#xff1a; 是在一个周期内&#xff0c;交流电瞬时出现的最大绝对值&#xff0c;也是一个正弦波&#xff0c;波…

python数据分析之爬虫基础:解析

目录 1、xpath 1.1、xpath的安装以及lxml的安装 1.2、xpath的基本使用 1.3、xpath基本语法 2、JsonPath 2.1、jsonpath的安装 2.2、jsonpath的使用 2.3、jsonpath的基础语法 3、BeautifulSoup 3.1、bs4安装及创建 3.2、beautifulsoup的使用 3.3、beautifulsoup基本语…

1000 道最新高频 Java 面试题

金九银十已过&#xff0c;之前面试的也差不多了&#xff0c;小编在这里给大家整理了一套阿里面试官最喜欢问的问题或者出场率较高的面试题&#xff0c;助校招或者社招路上的你一臂之力&#xff01; 首先我们需要明白一个事实&#xff0c;招聘的一个很关键的因素是在给自己找未…

记录vite关于tailwindcss4.0-bate4出现margin[m-*]、padding[p-*]无法生效的问题。

环境如下&#xff1a; vite:5.4.10 tailwindcss: 4.0.0-beta.4 tailwindcss/vite: 4.0.0-beta.4 4.0默认的样式优先级比较低 如果使用了一些reset的css文件 那么很多样式会失效 例如&#xff1a;reset.css中 html, body, ul, li, h1, h2, h3, h4, h5, h6, dl, dt, dd, ol, i…

亚马逊云(AWS)使用root用户登录

最近在AWS新开了服务器&#xff08;EC2&#xff09;&#xff0c;用于学习&#xff0c;遇到一个问题就是默认是用ec2-user用户登录&#xff0c;也需要密钥对。 既然是学习用的服务器&#xff0c;还是想直接用root登录&#xff0c;下面开始修改&#xff1a; 操作系统是&#xff1…

Matlab 绘制雷达图像完全案例和官方教程(亲测)

首先上官方教程链接 polarplothttps://ww2.mathworks.cn/help/matlab/ref/polarplot.html 上实例 % 定义角度向量和径向向量 theta linspace(0, 2*pi, 5); r1 [1, 2, 1.5, 2.5, 1]; r2 [2, 1, 2.5, 1.5, 2];% 绘制两个雷达图 polarplot(theta, r1, r-, LineWidth, 2); hold …

bash命令缓存导致命令执行失败的问题

1、问题背景 为了修复老版本 vsftpd 的安全漏洞&#xff0c;需要把生产环境上 vsftpd 版本升级到 vsftpd-3.0.5&#xff0c;因为直接使用 rpm 包的方式进行升级还涉及到下层依赖包的升级(生产环境上的依赖包版本不能随意变更&#xff0c;可能会影响其他上层应用)&#xff0c;所…

【Point-LIO】基于Ubuntu20.04的ROS1平台的Point-LIO部署Mid-360激光雷达

0、前言 Mid360参数 1、代码拉取 2、代码编译运行 文件结构 编译流程&#xff1a; 1、先编译livox_ros_driver2 2、编译整个工程文件 3、运行launch文件&#xff08;livox_ros_driver2&#xff09; 成功启动&#xff1a; 3、实物运行 看得出来&#xff0c;在rviz…

mac终端自定义命令打开vscode

1.打开终端配置文件 open -e ~/.bash_profile终端安装了zsh&#xff0c;那么配置文件是.zshrc&#xff08;打开zsh配置&#xff0c;这里举&#x1f330;使用zsh&#xff09; sudo open -e ~/.zshrc 2.在zshrc配置文件中添加新的脚本&#xff08;这里的code就是快捷命令可以进…

SAP导出表结构并保存到Excel 源码程序

SAP导出表结构并保存到Excel,方便写代码时复制粘贴 经常做接口,需要copy表结构,找到了这样一个程程,特别有用。 01. 先看结果

python学习——格式化字符串

在Python中&#xff0c;格式化字符串是一种将变量插入到字符串中的方法&#xff0c;使得字符串的构建更为灵活和方便。以下是一些常见的格式化字符串的方法&#xff1a; 文章目录 1. 使用百分号 % 格式化2. 使用 str.format() 方法3. 使用 f-string (格式化字符串字面量)格式说…

记录一下,解决js内存溢出npm ERR! code ELIFECYCLEnpm ERR! errno 134 以及 errno 9009

项目是个老项目&#xff0c;依赖包也比较大&#xff0c;咱就按正常流程走一遍来详细解决这个问题&#xff0c;先看一下node版本&#xff0c;我用的是nvm管理的&#xff0c;详细可以看我的其他文章 友情提醒&#xff1a;如果项目比较老&#xff0c;包又大&#xff0c;又有一些需…

【Linux】gdb / cgdb 调试 + 进度条

&#x1f33b;个人主页&#xff1a;路飞雪吖~ &#x1f320;专栏&#xff1a;Linux 目录 一、Linux调试器-gdb &#x1f31f;开始使用 &#x1f320;小贴士&#xff1a; &#x1f31f;gdb指令 &#x1f320;小贴士&#xff1a; ✨watch 监视 ✨打条件断点 二、小程序----进…

【人工智能】大数据平台技术及应用

文章目录 前言一、大数据平台基本概念及发展趋势1、数据量爆发式增长&#xff0c;发数据蓬勃发展2、大数据到底是什么&#xff1f;3、大数据处理与传统数据处理的差异4、为什么要建立大数据平台&#xff1f;5、大数据平台开源架构-Hadoop6、华为云大数据平台架构 二、大数据技术…

ABAP - 系统集成之SAP的数据同步到OA(泛微E9)服务器数据库

需求背景 项目经理说每次OA下单都需要调用一次SAP的接口获取数据&#xff0c;导致效率太慢了&#xff0c;能否把SAP的数据保存到OA的数据库表里&#xff0c;这样OA可以直接从数据库表里获取数据效率快很多。思来想去&#xff0c;提供了两个方案。 在集群SAP节点下增加一个SQL S…

PHP语法学习(第三天)

老规矩&#xff0c;先回顾一下昨天学习的内容 PHP语法学习(第二天) 主要学习了PHP变量、变量的作用域、以及参数作用域。 今天由Tom来打开新的篇章 文章目录 echo 和 print 区别PHP echo 语句实例 PHP print 语句实例 PHP 数组创建数组利用array() 函数 数组的类型索引数组关联…