实现一个违规词匹配的功能。
像一些名称检测,弹幕检测,都会有这么一个匹配,输入的内容与违规词库进行匹配,只要匹配出来一个就不允许通过,那具体怎么实现呢。
首先是违规词库的录入,一般开发过程违规词库肯定是要放到数据库的,这里为了方便,就放到本地的资源文件中。

然后就是项目启动自动录入

@Configuration
public class SensitiveWordsConfig {@Value("${spring.sensitive}")String sensitive;@Beanpublic void sensitiveWordsUtils(){Set<String> sensitiveMap = new HashSet<>();String[] sensitiveArr = sensitive.split("/");for(String s : sensitiveArr){sensitiveMap.add(s);}SensitiveWordsUtils.initKeyWord(sensitiveMap);System.out.println(SensitiveWordsUtils.sensitiveWordsMap);}
}

最后就是录入方法initKeyWord,我们默认把英文全部转为小写

public class SensitiveWordsUtils {public static HashMap sensitiveWordsMap = new HashMap();public static int minMatchTYpe = 1;public static Map initKeyWord(Set<String> keySets) {try {addSensitiveWordToHashMap(keySets);} catch (Exception e) {e.printStackTrace();}return sensitiveWordsMap;}public static void addSensitiveWordToHashMap(Set<String> keyWordSet) {if (sensitiveWordsMap.size() == 0) {String key = null;Map resultMap = null;Map<String, String> newWordMap = null;Iterator<String> iterator = keyWordSet.iterator();while (iterator.hasNext()) {key = iterator.next();resultMap = sensitiveWordsMap;if (StringUtils.isNotBlank(key)) {for (int i = 0; i < key.length(); i++) {char keyChar = key.charAt(i);if((keyChar+"").matches("^[a-zA-Z]*")){keyChar = toLowerCase(keyChar);}Object wordMap = resultMap.get(keyChar);if (wordMap != null) {resultMap = (Map) wordMap;} else {newWordMap = new HashMap<String, String>();newWordMap.put("isEnd", "0");resultMap.put(keyChar, newWordMap);resultMap = newWordMap;}if (i == key.length() - 1) {resultMap.put("isEnd", "1");}}}}}}
}

这里顺便讲讲录入的结构吧,就是Map<String,Map>类型,这里输出一下就清楚很多了

{p={q={isEnd=0, o={s={isEnd=1}, isEnd=0}}, isEnd=0}, a={s={d={q={w={g={h={isEnd=1}, isEnd=0}, isEnd=0}, isEnd=1}, j={i={q={isEnd=1}, isEnd=0}, isEnd=0}, isEnd=0}, u={d={q={isEnd=0, o={isEnd=1}}, isEnd=0}, isEnd=0}, h={u={isEnd=0, o={z={x={d={q={isEnd=1}, isEnd=0}, isEnd=0}, isEnd=0}, isEnd=0}}, isEnd=0}, isEnd=0}, isEnd=0}, q={a={i={a={isEnd=0, m={g={isEnd=1}, isEnd=0}}, isEnd=0}, isEnd=0}, isEnd=0}, b={isEnd=0, m={c={isEnd=0, n={i={a={isEnd=1}, isEnd=0}, isEnd=0}}, isEnd=0}}, s={d={g={j={i={isEnd=0, o={e={isEnd=1}, isEnd=0}}, isEnd=0}, isEnd=0}, isEnd=0}, h={i={t={g={isEnd=1}, isEnd=1}, isEnd=0}, isEnd=0}, isEnd=0}, c={j={v={i={p={z={q={isEnd=1}, isEnd=0}, isEnd=0}, isEnd=0}, isEnd=0}, isEnd=0}, isEnd=0, o={d={isEnd=0, n={e={q={isEnd=1}, isEnd=0}, isEnd=0}}, isEnd=0}}, g={isEnd=0, o={isEnd=0, o={d={isEnd=1}, isEnd=0}}}, h={e={l={l={isEnd=0, o={isEnd=1}}, isEnd=0}, isEnd=0}, u={i={h={s={a={isEnd=1}, isEnd=0}, isEnd=0}, isEnd=0}, isEnd=0}, x={x={i={isEnd=0, o={f={w={q={isEnd=1}, isEnd=0}, isEnd=0}, isEnd=0}}, isEnd=0}, isEnd=0}, j={a={h={q={e={r={isEnd=1}, isEnd=0}, isEnd=0}, isEnd=0}, isEnd=0}, u={i={q={isEnd=1}, isEnd=0}, isEnd=0}, i={q={p={4={5={5={isEnd=1}, isEnd=0}, isEnd=0}, isEnd=0}, isEnd=0}, isEnd=0}, isEnd=0}, isEnd=0}, x={c={b={i={q={isEnd=1}, isEnd=0}, isEnd=0}, isEnd=0}, isEnd=0}, j={i={s={h={g={u={isEnd=1}, isEnd=0}, isEnd=0}, isEnd=0}, isEnd=0}, k={isEnd=0, o={w={isEnd=1}, isEnd=0}}, isEnd=0}, z={c={q={w={isEnd=1}, isEnd=0}, isEnd=0}, isEnd=0}, n={isEnd=0, m={z={h={a={isEnd=1}, isEnd=0}, isEnd=0}, isEnd=0}}}

为了方便演示,我们把违规词库弄简单一点,只保留Hello,Good与Goods

{g={isEnd=0, o={isEnd=0, o={d={s={isEnd=1}, isEnd=1}, isEnd=0}}}, h={e={l={l={isEnd=0, o={isEnd=1}}, isEnd=0}, isEnd=0}, isEnd=0}}

我们可以看到map.get(“g”) = { isEnd = 0 , o}, isEnd = 0 就是违规词不是最后一个,还要继续匹配,isEnd = 1 就是已经匹配结束了。好,然后在这个基础上再map.get(“g”).get(“o”) = {isEnd=0,d}, 这样大概就了解基本的结构了。

那么大概的匹配规则我们也理得差不多了,既然要匹配,那么那些什么特殊字符空格什么的,就都要去掉啦,然后再匹配

    public static Set<String> getAllSensitiveWord(@NonNull String txt, int matchType){Set<String> sensitiveWordList = new HashSet<>();txt = replaceAllSymbol(txt);if (StringUtils.isNotBlank(txt)) {for (int i = 0; i < txt.length(); i++) {int length = CheckSensitiveWord(txt, i, matchType);if (length > 0) {sensitiveWordList.add(txt.substring(i, i + length));
//                    i = i + length - 1;}}}return sensitiveWordList;}public static Set<String> getSensitiveWord(@NonNull String txt, int matchType) {Set<String> sensitiveWordList = new HashSet<>();txt = replaceAllSymbol(txt);if (StringUtils.isNotBlank(txt)) {for (int i = 0; i < txt.length(); i++) {int length = CheckSensitiveWord(txt, i, matchType);if (length > 0) {sensitiveWordList.add(txt.substring(i, i + length));
//                    i = i + length - 1;break;}}}return sensitiveWordList;}public static int CheckSensitiveWord(String txt, int beginIndex, int matchType) {boolean flag = false;int matchFlag = 0;char word = 0;Map nowMap = sensitiveWordsMap;for (int i = beginIndex; i < txt.length(); i++) {word = txt.charAt(i);if((word+"").matches("^[A-Z]*")){word = toLowerCase(word);}nowMap = (Map) nowMap.get(word);if (nowMap != null) {matchFlag++;if ("1".equals(nowMap.get("isEnd"))) {flag = true;if (minMatchTYpe == matchType) {break;}}} else {break;}}if (!flag) {matchFlag = 0;}return matchFlag;}// 去除特殊字符public static String replaceAllSymbol(String txt){return txt.replaceAll("[\\W]","");}

Java实现简单的违规词匹配功能相关推荐

  1. python jieba库分词_Python基于jieba库进行简单分词及词云功能实现方法

    本文实例讲述了Python基于jieba库进行简单分词及词云功能实现方法.分享给大家供大家参考,具体如下: 目标: 1.导入一个文本文件 2.使用jieba对文本进行分词 3.使用wordcloud包 ...

  2. Java 实现简单的签到领金币功能

    Java实现简单的签到领金币功能 简介 现在很多APP上都会有签到的功能,签到领金币或者领积分等等.最近也正好遇到了一个这样的业务,并且规则是连续签到每天的金币不一样,要是断了,再签到的话重新从第一天 ...

  3. 简单实现敏感词过滤功能

    现在基本所有的网页都存在敏感词过滤的功能,最近开发项目的时候,需要一个敏感词过滤的功能,参考了很多博客,便对此做了总结和自己的开发代码. 一.构建敏感词库 读取文件数据,并保存到HashMap中,构建 ...

  4. java之简单的增删改查功能

    目录 前言 一.查询 二.增加 三.删除 四.修改 五.界面展示: 前言 用增删改查写的简单版学生管理系统 运用了JavaScript,El表达式,c标签,mvc模式,三层架构,MySQL. 数据库辅 ...

  5. 基于java实现简单的QQ聊天通信功能

    数据存储结构 1.数据库设计 数据库是该即时通讯系统的中枢结构,进行信息处理的各个部分都是在数据库的基础上的,从而能够达成对于各类数据安全完整的存储,并进行合理的运用.有必要时可以设置数据字典,数据字 ...

  6. 很全的敏感词匹配系统的设计与实践

    作者:vivo互联网服务器团队-Liang Kangwu 一.前言 谛听系统是vivo的内容审核平台,保障了vivo各互联网产品持续健康的发展.谛听支持审核多种内容类型,但日常主要审核的内容是文本,下 ...

  7. 一个敏感词检查功能是怎么来的

    需求 敏感词检查是一个很常见的需求,在做用户输入功能时,如果不对敏感词进行检查,不仅影响平台内容的质量,可能还因此违反法律法规直接被封.敏感词是动态的,不同时机敏感不同,用户还会千方百计的使用谐音.拼 ...

  8. 如何设计一个敏感词匹配系统?

    ▲ 点击上方"分布式实验室"关注公众号 回复"1"抽取纸质技术书 谛听系统是vivo的内容审核平台,保障了vivo各互联网产品持续健康的发展.谛听支持审核多种内 ...

  9. 简单java socket_基于Java Socket实现一个简易在线聊天功能(一)

    最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到脚本之家平台,以此做个记录,方便自己和大家使用. 先给大家说下实现步骤分这样几大步: 1.使用 ...

最新文章

  1. R语言ggplot2包和lattice包可视化改变x轴和y轴的显示位置实战
  2. AI攻击AI,升级的网络安全战
  3. Python入门100题 | 第009题
  4. 【Linux】一步一步学Linux——rename命令(36)
  5. c 结构体 不允许使用不完整的类型_.NET Core 基础类型介绍
  6. 我的Go+语言初体验——(1)超详细安装教程
  7. pcl里面的3D特征
  8. 【OJ】洛谷分支结构题单题解锦集
  9. MySQL数据库应用形考_2020国开中优教育《MySQL数据库应用》形考任务题库
  10. Cesium中常用的一些地理数据文件 以及数据相关的东西
  11. struts一个action处理多个方法
  12. JavaScript技巧总结和本地存储(一)
  13. 清理linux清理垃圾文件夹,让Ubuntu系统释放空间最有效的五种方法(清除不需要的或垃圾文件)...
  14. ioc performanceTest
  15. Win10 schtasks 不稳定问题
  16. AIOC快速卸载3dsmax2014
  17. 推荐一款备忘录便签APP简约款安卓版本
  18. 线性变换到底是什么以及与矩阵之间的联系
  19. Android辅助功能(无障碍)使用---AccessibilityService
  20. 中华五千年的朝代顺序

热门文章

  1. 抓取淘宝商品信息并制作商品信息比价表(以口红为例)
  2. STM32按键消抖——入门状态机思维
  3. 教你如何将中国知网下载的caj文献转成pdf文献
  4. 绝地求生2月26服务器维护吗,绝地求生2月26日维护更新内容 绝地求生2月26日更新了什么...
  5. 【redis】redis实现队列的阻塞、延时、发布和订阅
  6. 集合中找出元素 foreach in is as
  7. HttpRuntime类
  8. iOS 13细节曝光!苹果要把音量显示方式调整为条状
  9. Cocos2d-x的骨骼动画Spine和Armature
  10. 2019百家号自媒体新人如何才能快速转正,百家号小白最快获取收益的方法