当前位置: 首页 > 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.lqws.cn/news/443917.html

相关文章:

  • c++ STL---vector使用
  • 6.19_JAVA_微服务
  • Kernel K-means:让K-means在非线性空间“大显身手”
  • 煤矿井下Modbus转Profibus网关的传感器与PLC互联解决方案
  • 基于keepalived、vip实现高可用nginx (centos)
  • TensorFlow+CNN垃圾分类深度学习全流程实战教程
  • 【目标检测】IOU的概念与Python实例解析
  • Qt蓝图式技能编辑器状态机模块设计与实现
  • Datawhale 网络爬虫技术入门第2次笔记
  • CD45.【C++ Dev】STL库的list的使用
  • redis02
  • 什么是Spark
  • 【Dify 沙箱网络问题排查与解决】
  • 亚马逊云科技中国峰会召开 解码Agentic AI时代企业加速创新路径
  • Codeforces Round 1032 (Div. 3)
  • Netty实战:从核心组件到多协议实现(超详细注释,udp,tcp,websocket,http完整demo)
  • (17)-java+ selenium->自动化测试-元素定位大法之By css上
  • openKylin高校沙龙 | 走进成都高校,推动开源技术交流与人才培养
  • ollama优化小贴士
  • flex布局 项目属性
  • 5_STM32F103ZET6系统启动过程
  • windows11 + ubuntu2204双系统+ros2 humble安装
  • IT小白到高手:HCIA、HCIP、HCIE认证攻略
  • (哈希)128. 最长连续序列
  • 嵌入式Web服务实战:OpenWRT+内网穿透实现物联网设备公网访问全攻略
  • ‘conda‘ 不是内部或外部命令,也不是可运行的程序或批处理文件?
  • FPGA基础 -- Verilog 系统任务与系统函数
  • 嘉立创EDA学习笔记4
  • 集合的处理:JDK和Guava孰强孰弱?
  • C#建立与数据库连接(版本问题的解决方案)踩坑总结