基于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.rhkb.cn/news/485533.html

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

相关文章

详解MySQL安装

目录 Ubantu 1. 使⽤apt安装MySQL 2.查看MySQL状态 3. MySQL 安装安全设置 4.设置密码 卸载MySQL Centos 1. 确认当前的系统版本 2.下载MySQL源 3.安装MySQL 4.启动mysqld 5.查看MySQL状态 6.设置开机自启动 7.查看MySQL密码&#xff0c;并登录 8.修改密码 Ubant…

Android 实现中英文切换

在开发海外项目的时候&#xff0c;需要实现app内部的中英文切换功能&#xff0c;所有的英文都是内置的&#xff0c;整体思路为&#xff1a; 创建一个sp对象&#xff0c;存储当前系统的语言类型&#xff0c;然后在BaseActivity中对语言进行判断&#xff1b; //公共Activitypubl…

使用uniapp开发小程序场景:在百度地图上调用接口返回的设备相关信息并展示

首先在百度地图开发者平台注册微信小程序开发密钥下载百度地图SDK-bmap-wx.min.js,下载地址在项目入口index.html页面进行引入页面中进行调用&#xff0c;代码示例如下<map id"map" longitude"108.95" latitude"34.34" scale"3" :m…

如何使用brew安装phpredis扩展?

如何使用brew安装phpredis扩展&#xff1f; phpredis扩展是一个用于PHP语言的Redis客户端扩展&#xff0c;它提供了一组PHP函数&#xff0c;用于与Redis服务器进行交互。 1、cd到php某一版本的bin下 /usr/local/opt/php8.1/bin 2、下载 phpredis git clone https://githu…

【Vulkan入门】01-列举物理设备

目录 先叨叨git信息主要逻辑VulkanEnvEnumeratePhysicalDevices()PrintPhysicalDevices() 编译并运行程序 先叨叨 上一篇已经创建了VkInstance&#xff0c;本篇我们问问VkInstance&#xff0c;在当前平台上有多少个支持Vulkan的物理设备。 git信息 repository: https://gite…

写NFC标签支持Android安卓Ohos纯血鸿蒙唤醒微信小程序

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.52de2c1b8bEEGz&ftt&id61539185785 Python languagecodestr "en".encode(gbk) titlestrself.lineEdit_title.text().strip().encode(gbk) uriheaderindex sel…

51c自动驾驶~合集39

我自己的原文哦~ https://blog.51cto.com/whaosoft/12707676 #DiffusionDrive 大幅超越所有SOTA&#xff01;地平线DiffusionDrive&#xff1a;生成式方案或将重塑端到端格局&#xff1f; 近年来&#xff0c;由于感知模型的性能持续进步&#xff0c;端到端自动驾驶受到了来…

沃德云商协系统微信小程序PHP+Uniapp

“多组织”的云服务平台&#xff0c;打造总商会、总协会、总校友会、工商联等多组织无障碍沟通合作平台&#xff0c;让各大分会、各大分校友会、分组织实现轻松管理&#xff0c;线上宣传展示、商机挖掘、会员管理、会员服务、跨界交流等, 借助沃德云商协平台系统&#xff0c;让…

网页设计--axios作业

根据以下mock地址中的json数据&#xff0c;使用axios异步方式获取并显示在页面中。 https://apifoxmock.com/m1/3761592-3393136-default/peotfindAll?apifoxApiId171582689 {"code": 1,"msg": "success","data": [{"id": …

【uni-app 微信小程序】新版本发布提示用户进行更新

知识准备 uni.getUpdateManager文档介绍 不支持APP与H5&#xff0c;所以在使用的时候要做好平台类型的判断&#xff0c;如何判断&#xff0c;参考条件编译处理多端差异 代码参考 export const updateApp () > {const updateManager uni.getUpdateManager()updateManag…

ip地址显示本地局域网什么意思?ip地址冲突怎么解决

在日常使用网络的过程中&#xff0c;我们可能会遇到IP地址显示“本地局域网”的情况&#xff0c;同时&#xff0c;局域网内IP地址冲突也是一个常见且令人头疼的问题。本文将首先解释IP地址显示本地局域网的含义&#xff0c;随后详细探讨局域网IP地址冲突的解决方法&#xff0c;…

超清4K视频素材哪里找?优质下载资源网站分享

我是你们的自媒体UP主小李。现在是高清、4K视频大行其道的时代&#xff0c;想要制作出吸引眼球的优质内容&#xff0c;超清4K视频素材必不可少。今天就为大家分享几个宝藏网站&#xff0c;让你的视频创作更轻松、更出彩&#xff01; 蛙学网 首先推荐 蛙学网&#xff0c;这是国内…

Qt Qtablewidget 标题 QHeaderView 增加可选框 QcheckBox

创建自定义QHeaderView #pragma once#include <QObject> #include <QHeaderView> #include <QPainter> #include <QMouseEvent>class SSHeaderView : public QHeaderView {Q_OBJECTprivate:bool isChecked;int m_checkColIdx; public:SSHeaderView(i…

关于Chrome自动同步书签的解决办法

前言 并不一定适用所有用户&#xff0c; 目前我在网上搜集了一些资料&#xff0c;也做了一些尝试。 就我个人总结的经验来讲&#xff0c;分享大家以下几种办法&#xff1a; 1.书签同步插件 点击如下&#x1f517;&#xff1a; Chrome书签同步https://bm.famend.cn/ …

MFC扩展库BCGControlBar Pro v36.0新版亮点:黑色主题中的自动反转图标

BCGControlBar库拥有500多个经过全面设计、测试和充分记录的MFC扩展类。 我们的组件可以轻松地集成到您的应用程序中&#xff0c;并为您节省数百个开发和调试时间。 BCGControlBar专业版 v36.0已全新发布了&#xff0c;这个版本在黑暗主题中添加自动图标反转、新增一个全新的S…

调用大模型api 批量处理图像 保存到excel

最近需要调用大模型&#xff0c;并将结果保存到excel中&#xff0c;效果如下&#xff1a; 代码&#xff1a; import base64 from zhipuai import ZhipuAI import os import pandas as pd from openpyxl import Workbook from openpyxl.drawing.image import Image from io i…

debian ubuntu armbian部署asp.net core 项目 开机自启动

我本地的环境是 rk3399机器&#xff0c;安装armbian系统。 1.安装.net core 组件 sudo apt-get update && \sudo apt-get install -y dotnet-sdk-8.0或者安装运行库&#xff0c;但无法生成编译项目 sudo apt-get update && \sudo apt-get install -y aspnet…

声音克隆GPT-SoVITS

作者&#xff1a;吴业亮 博客&#xff1a;wuyeliang.blog.csdn.net 一、原理介绍 GPT-SoVITS&#xff0c;作为一款结合了GPT&#xff08;生成预训练模型&#xff09;和SoVITS&#xff08;基于变分信息瓶颈技术的歌声转换&#xff09;的创新工具&#xff0c;正在声音克隆领域掀…

记忆泡沫垫市场:解锁舒适睡眠的黄金钥匙与增长潜力的深度剖析

在当今快节奏、高压力的生活中&#xff0c;优质睡眠已成为现代人追求健康生活的重要组成部分。记忆泡沫垫&#xff0c;作为床垫和枕头领域的一次革命性创新&#xff0c;凭借其独特的材质特性和对人体工学的完美贴合&#xff0c;正逐步成为改善睡眠质量的首选解决方案。本文将从…

R语言 | 峰峦图 / 山脊图

目的&#xff1a;为展示不同数据分布的差异。 1. ggplot2 实现 # 准备数据 datmtcars[, c("mpg", "cyl")] colnames(dat)c("value", "type") head(dat) # value type #Mazda RX4 21.0 6 #Mazda RX4 Wag …