敏感词过滤器,配置文件分行写
如:
ab
cd
ef

import lombok.Data;
import org.apache.commons.lang3.CharUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;/*** 敏感词过滤器*/
@Component
@Data
public class SensitiveFilter {private static final Logger log = LoggerFactory.getLogger(SensitiveFilter.class);//替换的常量private static final String REPLACEMENT = "***";//根节点private TrieNode rootNode = new TrieNode();//容器生成bean的时候初始化树@PostConstructpublic void init() {try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("sensitive-words.txt");BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));) {String keyword;while ((keyword = reader.readLine()) != null) {this.addKeyword(keyword);}} catch (IOException e) {log.error("加载敏感词文件失败" + e.getMessage());}}//将一个敏感词添加到前缀树上public 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 (ObjectUtils.isEmpty(subNode)) {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;}TrieNode tempNode = rootNode;//指针2int begin = 0;//指针3int position = 0;//结果StringBuilder stringBuilder = new StringBuilder();while (begin < text.length()) {char c = text.charAt(position);if (isSymbol(c)) {if (tempNode.equals(rootNode)) {stringBuilder.append(c);begin++;}//无论符号在开头还是中间,指针3都向下走position++;continue;}tempNode = tempNode.getSubNode(c);if (ObjectUtils.isEmpty(tempNode)) {//不是敏感词向后移动stringBuilder.append(text.charAt(begin));position = ++begin;tempNode = rootNode;continue;} else if (tempNode.isKeywordEnd()) {//发现敏感词,将begin-position字符串替换掉stringBuilder.append(REPLACEMENT);begin = ++position;tempNode = rootNode;continue;} else {//疑似继续检查下一个字符position++;}//position的值大于text的长度,begin强制后移动if (!(position < text.length())) {stringBuilder.append(text.charAt(begin));position = ++begin;tempNode = rootNode;}}return stringBuilder.toString();}//判断是否为干扰符(色 情)private boolean isSymbol(Character c) {//0x2E80-0x9FFF 东亚文字范围return !CharUtils.isAsciiAlphanumeric(c) && (c < 0x2E80 || c > 0x9FFF);}/*** 前缀树的节点类*/@Dataprivate class TrieNode {private boolean isKeywordEnd = false;//子节点集合,key是下级字符,value是下级节点private Map<Character, TrieNode> subNodes = new HashMap<>();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);}}}

只需要在修改配置文件信息就可以直接使用,如果发现bug可以私信一下
参考了牛客网的一位老师,修改了部分bug
如果想了解具体过程可以在评论区评论作者后续会更新图文讲解
谢谢大家

通过前缀树的敏感词过滤算法相关推荐

  1. trie树之敏感词过滤算法

    之前写过一篇关于Trie树的介绍:Trie树--在一个字符串集合中快速查找某个字符串.今天就用Trie树来实现敏感词过滤算法. 首先简单介绍一下Trie树的数据结构: 1.根节点不存储字符. 2.Tr ...

  2. 前缀树实现敏感词过滤

    前缀树的节点类 为了方便功能的实现,我们需要有一个Boolean类型的变量来标记该节点是否为叶子节点, 同样的为了方便判断是否存在某个字符在前缀树中,可以把子节点作成Map的形式,Map的key为该字 ...

  3. dfa算法c语言,DFA跟trie字典树实现敏感词过滤(python和c语言)

    DFA和trie字典树实现敏感词过滤(python和c语言) 现在做的项目都是用python开发,需要用做关键词检查,过滤关键词,之前用c语言做过这样的事情,用字典树,蛮高效的,内存小,检查快. 到了 ...

  4. SpringBoot使用前缀树实现敏感词的过滤

    记录一下使用SpringBoot中使用前缀树对敏感词的一个过滤. 首先呢在resources目录下建立一个文件用来装敏感词例如我在resources/sensitive-words.txt如下: 敏感 ...

  5. 【敏感词汇过滤算法】基于DFA-前缀树的敏感词汇过滤算法(项目实用)

    在敏感词汇过滤这块,不同的算法所造成的性能差异是非常大的,选择一个合适的算法非常重要.因为以前做算法的时候做过类似前缀树的字符串匹配之类的算法,所以一开始就打算用前缀树做的,后面了解了一下DFA的相关 ...

  6. 敏感词过滤算法 为内容保驾护航 Java/.Net/C++/c/Python等语言是如何进行敏感词打码限制的 高效防范违规内容

    有人的地方,就有江湖,有输入框的地方,就有注入风险!有输入框的地方,就有敏感词!敏感词就像一个平台杀手,可能直接导致平台被封锁! 敏感词是一个APP.一个网站.一个内容平台的"杀手" ...

  7. 【C++】实现敏感词过滤算法(含源码)

    敏感词过滤算法(聚合词树查询法) 1.构建词树 2.敏感词判断 3.遍历文本 关于敏感词过滤算法,数不胜数,在参考众多算法后,选取了比较实用的算法,进行总结与改进.大家可以参考一下链接: 敏感词过滤算 ...

  8. 浅析过滤敏感词过滤算法(C++)

    本文转自浅析敏感词过滤算法(C++),自己也在其基础上根据自己的情况做了一点修改. 为了提高查找效率,这里将敏感词用树形结构存储,每个节点有一个map成员,其映射关系为一个string对应一个Word ...

  9. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

最新文章

  1. Nature:iHMP之“微生物组与前驱糖尿病”
  2. idea 快速定位到某一行的快捷键
  3. UIBezierPath画圆弧的记录
  4. 第一章:linux管理文件和目录
  5. 20211028 Stabilizability
  6. HDU 3683 Gomoku
  7. Remixer-谷歌的UI参数动态修改框架
  8. [转载] python如何删除对象属性_Python3基础 delattr 删除对象的属性
  9. htmlh1 h6,HTML 5 h1 至 h6 标签 - HTML 参考手册
  10. win10打开计算机黑屏怎么办,win10系统开机就一直黑屏无法进入桌面的解决方法...
  11. HCNA之路由优先级及路由冗余备份
  12. CCF CSP 201903-1 小中大(C语言100分)[序列处理]
  13. adb 隐藏/删除 app
  14. 代码随想录第二天 leetcode 977、209、59
  15. cad刷新快捷键_CAD快捷键大全清单,送给每一位CAD初学者,非常实用的干货
  16. java什么是栈_java什么是栈
  17. 使用.net 操作 微信公众平台 —— 接收用户操作 —— 关注/取消关注 公众号
  18. echarts高度自适应
  19. 祝各位SAPER元旦快乐!
  20. JAVA_SE_Day14

热门文章

  1. VNC Server远程桌面配置详解
  2. 如何加强仓储货架的安全性架设?
  3. 各大芯片设计生产与架构的厂商
  4. 2017级寒假ACM集训结训赛--官方题解
  5. c语言实型常量除以整形常量,c语言中的整型常量和实型常量.docx
  6. 参考 | 洗衣机代码报错E3解决办法
  7. 将字符串中连续的相同字符仅保留1个
  8. 改进BERT的中文评论情感分类模型
  9. 创业是一种心态、信念和坚持,是一种生活方式
  10. outlook的服务器pop3协议,Outlook2010 POP3方式连接Hotmail等邮箱的错误处理