import java.util.*;public class SensitiveWordUtil {/*** 敏感词匹配规则*/public static final int MinMatchTYpe = 1;      //最小匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国]人public static final int MaxMatchType = 2;      //最大匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国人]/*** 敏感词集合*/public static HashMap sensitiveWordMap;/*** 初始化敏感词库,构建DFA算法模型** @param sensitiveWordSet 敏感词库*/public static synchronized void init(Set<String> sensitiveWordSet) {initSensitiveWordMap(sensitiveWordSet);}/*** 初始化敏感词库,构建DFA算法模型** @param sensitiveWordSet 敏感词库*/private static void initSensitiveWordMap(Set<String> sensitiveWordSet) {//初始化敏感词容器,减小扩容操做sensitiveWordMap = new HashMap(sensitiveWordSet.size());String key;Map nowMap;Map<String, String> newWorMap;//迭代sensitiveWordSetIterator<String> iterator = sensitiveWordSet.iterator();while (iterator.hasNext()) {//关键字key = iterator.next();nowMap = sensitiveWordMap;for (int i = 0; i < key.length(); i++) {//转换成char型char keyChar = key.charAt(i);//库中获取关键字Object wordMap = nowMap.get(keyChar);//若是存在该key,直接赋值,用于下一个循环获取if (wordMap != null) {nowMap = (Map) wordMap;} else {//不存在则,则构建一个map,同时将isEnd设置为0,由于他不是最后一个newWorMap = new HashMap<>();//不是最后一个newWorMap.put("isEnd", "0");nowMap.put(keyChar, newWorMap);nowMap = newWorMap;}if (i == key.length() - 1) {//最后一个nowMap.put("isEnd", "1");}}}}/*** 判断文字是否包含敏感字符** @param txt       文字* @param matchType 匹配规则 1:最小匹配规则,2:最大匹配规则* @return 若包含返回true,不然返回false*/public static boolean contains(String txt, int matchType) {boolean flag = false;for (int i = 0; i < txt.length(); i++) {int matchFlag = checkSensitiveWord(txt, i, matchType); //判断是否包含敏感字符if (matchFlag > 0) {    //大于0存在,返回trueflag = true;}}return flag;}/*** 判断文字是否包含敏感字符** @param txt 文字* @return 若包含返回true,不然返回false*/public static boolean contains(String txt) {return contains(txt, MaxMatchType);}/*** 获取文字中的敏感词** @param txt       文字* @param matchType 匹配规则 1:最小匹配规则,2:最大匹配规则* @return*/public static Set<String> getSensitiveWord(String txt, int matchType) {Set<String> sensitiveWordList = new HashSet<>();for (int i = 0; i < txt.length(); i++) {//判断是否包含敏感字符int length = checkSensitiveWord(txt, i, matchType);if (length > 0) {//存在,加入list中sensitiveWordList.add(txt.substring(i, i + length));i = i + length - 1;//减1的缘由,是由于for会自增}}return sensitiveWordList;}/*** 获取文字中的敏感词** @param txt 文字* @return*/public static Set<String> getSensitiveWord(String txt) {return getSensitiveWord(txt, MaxMatchType);}/*** 替换敏感字字符** @param txt         文本* @param replaceChar 替换的字符,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符:*, 替换结果:我爱**** @param matchType   敏感词匹配规则* @return*/public static String replaceSensitiveWord(String txt, char replaceChar, int matchType) {String resultTxt = txt;//获取全部的敏感词Set<String> set = getSensitiveWord(txt, matchType);Iterator<String> iterator = set.iterator();String word;String replaceString;while (iterator.hasNext()) {word = iterator.next();replaceString = getReplaceChars(replaceChar, word.length());resultTxt = resultTxt.replaceAll(word, replaceString);}return resultTxt;}/*** 替换敏感字字符** @param txt         文本* @param replaceChar 替换的字符,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符:*, 替换结果:我爱**** @return*/public static String replaceSensitiveWord(String txt, char replaceChar) {return replaceSensitiveWord(txt, replaceChar, MaxMatchType);}/*** 替换敏感字字符** @param txt        文本* @param replaceStr 替换的字符串,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符串:[屏蔽],替换结果:我爱[屏蔽]* @param matchType  敏感词匹配规则* @return*/public static String replaceSensitiveWord(String txt, String replaceStr, int matchType) {String resultTxt = txt;//获取全部的敏感词Set<String> set = getSensitiveWord(txt, matchType);Iterator<String> iterator = set.iterator();String word;while (iterator.hasNext()) {word = iterator.next();resultTxt = resultTxt.replaceAll(word, replaceStr);}return resultTxt;}/*** 替换敏感字字符** @param txt        文本* @param replaceStr 替换的字符串,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符串:[屏蔽],替换结果:我爱[屏蔽]* @return*/public static String replaceSensitiveWord(String txt, String replaceStr) {return replaceSensitiveWord(txt, replaceStr, MaxMatchType);}/*** 获取替换字符串** @param replaceChar* @param length* @return*/private static String getReplaceChars(char replaceChar, int length) {String resultReplace = String.valueOf(replaceChar);for (int i = 1; i < length; i++) {resultReplace += replaceChar;}return resultReplace;}/*** 检查文字中是否包含敏感字符,检查规则以下:<br>** @param txt* @param beginIndex* @param matchType* @return 若是存在,则返回敏感词字符的长度,不存在返回0*/private static int checkSensitiveWord(String txt, int beginIndex, int matchType) {//敏感词结束标识位:用于敏感词只有1位的状况boolean flag = false;//匹配标识数默认为0int matchFlag = 0;char word;Map nowMap = sensitiveWordMap;for (int i = beginIndex; i < txt.length(); i++) {word = txt.charAt(i);//获取指定keynowMap = (Map) nowMap.get(word);if (nowMap != null) {//存在,则判断是否为最后一个//找到相应key,匹配标识+1matchFlag++;//若是为最后一个匹配规则,结束循环,返回匹配标识数if ("1".equals(nowMap.get("isEnd"))) {//结束标志位为trueflag = true;//最小规则,直接返回,最大规则还需继续查找if (MinMatchTYpe == matchType) {break;}}} else {//不存在,直接返回break;}}if (matchFlag < 2 || !flag) {//长度必须大于等于1,为词matchFlag = 0;}return matchFlag;}public static void main(String[] args) {Set<String> sensitiveWordSet = new HashSet<>();sensitiveWordSet.add("成人电影");sensitiveWordSet.add("爱恋");sensitiveWordSet.add("静静");sensitiveWordSet.add("哈哈");sensitiveWordSet.add("啦啦");sensitiveWordSet.add("感动");sensitiveWordSet.add("发呆");//初始化敏感词库SensitiveWordUtil.init(sensitiveWordSet);System.out.println("敏感词的数量:" + SensitiveWordUtil.sensitiveWordMap.size());String string = "成人太多的伤感情怀也许只局限于饲养基地 荧幕中的情节。"+ "而后咱们的扮演的角色就是跟随着主人公的喜红客联盟 怒哀乐而过于牵强的把本身的情感也附加于银幕情节中,而后感动就流泪,"+ "难过就躺在某一我的的怀里尽情的阐述心扉或者手机卡复制器一个贱人一杯红酒一部电影在夜 深人静的晚上,关上电话静静的发呆着。";System.out.println("待检测语句字数:" + string.length());//是否含有关键字boolean result = SensitiveWordUtil.contains(string);System.out.println(result);result = SensitiveWordUtil.contains(string, SensitiveWordUtil.MinMatchTYpe);System.out.println(result);//获取语句中的敏感词Set<String> set = SensitiveWordUtil.getSensitiveWord(string);System.out.println("语句中包含敏感词的个数为:" + set.size() + "。包含:" + set);set = SensitiveWordUtil.getSensitiveWord(string, SensitiveWordUtil.MinMatchTYpe);System.out.println("语句中包含敏感词的个数为:" + set.size() + "。包含:" + set);//替换语句中的敏感词String filterStr = SensitiveWordUtil.replaceSensitiveWord(string, '*');System.out.println(filterStr);filterStr = SensitiveWordUtil.replaceSensitiveWord(string, '*', SensitiveWordUtil.MinMatchTYpe);System.out.println(filterStr);String filterStr2 = SensitiveWordUtil.replaceSensitiveWord(string, "[*敏感词*]");System.out.println(filterStr2);filterStr2 = SensitiveWordUtil.replaceSensitiveWord(string, "[*敏感词*]", SensitiveWordUtil.MinMatchTYpe);System.out.println(filterStr2);}
}

附敏感词库下载链接:

​​​​​​​​​​敏感词库.sql下载

Java敏感词过滤 工具类相关推荐

  1. JAVA -敏感词过滤器 工具类SensitiveFilter

    1.添加敏感词过滤工具类 类1: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStre ...

  2. 敏感词过滤工具类(DFA算法匹配字典)

    直接调用方法:wordFilter package com.util;import java.io.BufferedReader; import java.io.FileNotFoundExcepti ...

  3. Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类

    Java 敏感词过滤,Java 敏感词替换,Java 敏感词工具类 =========================== ©Copyright 蕃薯耀 2017年9月22日 http://fansh ...

  4. Java 敏感词过滤(DFA有穷自动机)

    Java 敏感词过滤 DFA有穷自动机 初始化敏感词 构建树 查询 完整代码如下 后记 初始化敏感词 使用set集合,可以查询数据库. /*** 初始化值* @return*/private stat ...

  5. 敏感词审查工具类—DFA算法

    目录 简介 检索过程 工具类 测试及运行结果 简介 DFA全称为:Deterministic Finite Automation,即确定有穷自动机.其特征为:有一个有限状态集合和一些从一个状态通向另一 ...

  6. DFA算法:简易Java敏感词过滤(含源文件和上万敏感词列表)

    敏感词过滤说白了就是简单的字符串替换,Java本身已经提供了相关函数,但是一旦遇到长文本,或者敏感词数量庞大,效率下降就会非常明显.本文将介绍利用多叉树进行敏感词存储和过滤的方法. 多叉树 多叉树是一 ...

  7. Java敏感词过滤、java关键词过滤工具包原理

    原理:基于多叉树的查找. 第一步:把敏感词读入搜索多叉树中, 树结构: 第二步,对需过滤的句子进行逐字匹配: 比如句子:解放了全中国 1.记录起始位置start=0,读到了"解", ...

  8. go敏感词过滤工具wordsfilter

    package mainimport ("fmt""github.com/syyongx/go-wordsfilter" )//屏蔽敏感词 func main( ...

  9. java敏感词过滤源代码_Java实现敏感词过滤代码

    importjava.io.BufferedReader;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStr ...

  10. 对敏感词过滤(DFA算法)的思考与理解

    对敏感词过滤的思考与理解 一.技术概述 1.这个技术是干什么用的? 2.学习这个技术的原因 3.技术的难点在哪 二.技术详述 1.流程图 2.代码 三.技术过程中遇见的问题和解决过程 四.总结 五.参 ...

最新文章

  1. 谁的bug? 正则 拷贝和粘贴 regulator工具
  2. antd select 下拉菜单的 style 属性_如何优雅地彻底解决 antd 全局样式问题
  3. dbeaver导出表结构和数据_python中的哈希表数据结构
  4. php怎么使用插件下载,怎么使用下载的jquery插件
  5. 常见MIME类型例表
  6. C++11 显示类型转换
  7. 柱状图带立体效果_PS教程!手把手教你打造立体感欧美风人像大片效果(已打包好素材资料见文末)...
  8. 流计算精品翻译: The Dataflow Model
  9. MP3 Lame 转换 参数 设置(转)
  10. xu2w显示屏软件下载_LED显示屏控制软件
  11. 计算机技能是啥,简历中的IT技能是什么意思?
  12. java计算机毕业设计商店管理系统源码+系统+数据库+lw文档+mybatis+运行部署
  13. 因果推断与反事实预测——利用DML进行价格弹性计算(二十四)
  14. 带你一起学习工程经济学!与生活相关的一些实用的公式。研究经济学的理由就是【为了避免被经济学家欺骗】
  15. 银河麒麟v10_银河麒麟发布V10系统 其使用的是技德系统Jstack技术
  16. HEKA.FitMaster.v2.15(用来分析和测试那些通过Patchmaster或Pulse得
  17. Mac将应用程序及其数据移到外接硬盘的步骤 #替身 #软链接
  18. 微型计算机在机械设计中的应用,自动化技术在机械设计制造中的应用初探
  19. C++编程笔记:使用WinHTTP实现HTTP访问(解决接收UTF8数据乱码问题)
  20. opencv学习4——图像缩放

热门文章

  1. 通信专业顶刊_通信类权威SCI期刊(部分)
  2. 利用华为ENSP模拟器分析和配置中小型企业网络的综合实验(下)
  3. 金蝶K3案例教程成本报表
  4. 开源GIS简介.学习
  5. matlab 正20面体,如何画正二十面体
  6. 答辩复试技巧技巧1.0
  7. 天正电气lisp是什么文件_教大家如何使用天正电气软件绘制图纸
  8. struts1 和struts 2区别
  9. vue lic在element-ui中使用阿里巴巴矢量图标库iconfont图标
  10. 天正暖通2013版安装包附带注册机下载