当前位置: 首页 > news >正文

使用springboot实现过滤敏感词功能

一,在springboot项目的resources目录里创建sensitive-words.text(敏感词文本)

每个词独自一行
列如:
赌博
吸毒
开票

二,在util创建工具类SensitiveFilter

package com.nowcoder.community.util;@Component
public class SensitiveFilter{private static final Logger logger = LoggerFactory.getLogger(SensitiveFilter.class);// 替换符private static final String REPLACMENT = "***";// 根节点private TrieNode rootNode = new TrieNode();@PostConstructpublic void init(){try(InputStream is = this.getClass().getClassLoader().getResourceAsStream("sebsitive-words.txt");BufferedReader reader = new BufferedReader(new InputStreamReader(is));){String keyword;while((keyword = reader.readLine()) != null){// 添加到前缀树this.addkeyword(keyword);}} catch(IOException e){logger.error("加载敏感词文件失败:"+ e.getMessage())}}// 将一个敏感词添加到前缀树里private void addKeyword(String keyword) {	TrieNode tempNode = rootNode;for(int i = 0; i < keyword.length(); i++ ){char c = keyword.charAT(i);TrieNode subNode = tempNode.getSubNode(c);if(subNode == null){// 初始化子节点subNode = new TrieNode();tempNode.addSubNode(c,subNode);}// 指向子节点,进入下一轮循环tempNode = subNode;// 设置结束标识if(i == keyword.length() - 1){tempNode.setKeywordEnd(true);}}}/*** 过滤敏感词** @param text 待过滤文本* @return 过滤后的文本*/public String filter(String text){if(StringUtils.isBlank(text)){return null;}// 指针1TrieNode tempNode = rootNode;// 指针2int begin = 0;// 指针3int position = 0;// 结果StringBuilder sb = new StringBuilder();while (position < text.length()){char c = text.charAt(position);// 跳过符号if(isSymbol(c)){// 若指针1处于根节点,将此符号计入结果,让指针2向下走一步if(tempNode == rootNode){sb.appenf(c);begin++;}// 无论符号在开头或中间,指针3都向下走一步position++;continue;}// 检查下级节点tempNode = tempNode.getSubNode(c);if(tempNode == null){// 以begin开头的字符串不是敏感词sb.apped(text.charAt(begin));// 进入下一个位置position = ++begin;// 重新指向根节点tempNode = rootNode;} else if(tempNode.isKeywordEnd()){// 发现敏感词,将begin~position字符串替换掉sb.append(REPLACEMENT);// 进入下一个位置begin = ++position;}else {// 检查下一个字符position++}}// 将最后一批字符计入结果sb.append(text.substring(begin));return sb.toString();}// 判断是否为符号private boolean isSymbol(Character c){// 0x2E80 ~ 0x9FFF 是东亚文字范围return !Charutils.isAsciiAlphanumeric(c) && (c < 0x2E80 || c > 0x9FFF);}// 前缀树private class TrieNode{// 关键词结束标识privte boolean isKeywordEnd = false;// 子节点(key是下级字符,value是下级节点)private Map<Character,TrieNode> subNodes = new HashMap<>();// get和set方法public boolean isKeywordEnd(){return isKeywordEnd;}public void setKeywordEnd(boolean keywordEnd){isKeywordEnd = keywordEnd;}// 添加子节点public void addSubNode(Character c,TrieNode node){subNodes.put(c,node);}// 获取子节点public TrieNode getSubNode(Character c){return subNodes.get(c);}}
}

三,创建Sensitive,进行调用

public class Sensitive {@Autowiredprivate SensitiveFilter sensitiveFilter;@Overridepublic void SensitiverFilter(String name){filter = sensitiveFilter.filter(name);System.out.println(filter)}
}
http://www.lryc.cn/news/572310.html

相关文章:

  • Linux文件I/O系统调用深度解析
  • C++ 面向对象特性详解:继承机制
  • 【AI作画】第2章comfy ui的一般输入节点,文本框的类型和输入形式
  • F接口基础.go
  • P2066 机器分配
  • 八字排盘小游戏微信流量主小程序开源
  • 【嵌入式硬件实例】-555定时器控制舵机/伺服电机
  • 坤驰科技QTS4200战鹰(Battle Eagle)系列实时频谱分析记录回放系统
  • day09——Java基础项目(ATM系统)
  • AI免费工具:promptpilot、今天学点啥、中英文翻译
  • HarmonyOS性能优化——并发能力使用
  • ULS23 挑战:用于计算机断层扫描中 3D 通用病变分割的基准模型及基准数据集|文献速递-深度学习医疗AI最新文献
  • 国产USRP X440 PRO:超大带宽、多通道相参同步的旗舰型软件无线电设备
  • 高密度HDI板与普通pcb有什么区别?
  • Singularity 安装
  • Postman 的 Jenkins 管理 - 手动构建
  • Burp suite2024+新版本中英文等宽字体设置让其更美观显示
  • 额度互动促进金融健康,蚂蚁消金创新智能实时交互式风控系统
  • 【深度学习:进阶篇】--3.2.经典分类网络结构(CNN)
  • Stroke-based Cyclic Amplifier (SbCA方法):实现图像任意尺度超清放大
  • 端口安全配置示例
  • 安卓JetPack篇——LifeCycle原理
  • flink如何基于Pekko实现RPC调用
  • 神经网络试题
  • DL___线性神经网络
  • 数据结构 二叉树理论、递归理论与快速排序理论 6.19
  • 01.线性代数是如何将复杂的数据结构转化为可计算的数学问题,这个过程是如何进行的
  • OpenAI的Prompt工程
  • 03.自动特征提取(深度学习)核心逻辑:通过多层非线性变换,让模型自动学习从原始数据到高层特征的映射。为什么多层非线性变换可以达到这样的效果?
  • 【LINUX网络】网络socet接口的基本使用以及实现简易UDP通信