现在基本上所有的网站都需要设置敏感词过滤,似乎已经成了一个网站的标配,如果你的网站没有,或者你没有做相应的处理,那么小心相关部门请你喝茶哦。
最近在调研Java web网站的敏感词过滤的实现,网上找了相关资料,经过我的验证,把我的调研结果写出来,供大家参考。

一、敏感词过滤工具类

把敏感词词库内容加载到ArrayList集合中,通过双层循环,查找与敏感词列表相匹配的字符串,如果找到以*号替换,最终得到替换后的字符串。

此种方式匹配度较高,匹配速度良好。

初始化敏感词库

//初始化敏感词库
public void InitializationWork()
{  replaceAll = new StringBuilder(replceSize);  for(int x=0;x < replceSize;x++)  {  replaceAll.append(replceStr);  }  //加载词库  arrayList = new ArrayList<String>();  InputStreamReader read = null;  BufferedReader bufferedReader = null;  try {  read = new InputStreamReader(SensitiveWord.class.getClassLoader().getResourceAsStream(fileName),encoding);  bufferedReader = new BufferedReader(read);  for(String txt = null;(txt = bufferedReader.readLine()) != null;){  if(!arrayList.contains(txt))  arrayList.add(txt);  }  } catch (UnsupportedEncodingException e) {  e.printStackTrace();  } catch (IOException e) {  e.printStackTrace();  }finally{  try {  if(null != bufferedReader)  bufferedReader.close();  } catch (IOException e) {  e.printStackTrace();  }  try {  if(null != read)  read.close();  } catch (IOException e) {  e.printStackTrace();  }  }
}

过滤敏感词信息

public String filterInfo(String str)
{   sensitiveWordSet = new HashSet<String>();sensitiveWordList= new ArrayList<>();StringBuilder buffer = new StringBuilder(str);  HashMap<Integer, Integer> hash = new HashMap<Integer, Integer>(arrayList.size());  String temp;  for(int x = 0; x < arrayList.size();x++)  {  temp = arrayList.get(x);  int findIndexSize = 0;  for(int start = -1;(start=buffer.indexOf(temp,findIndexSize)) > -1;)  {  //System.out.println("###replace="+temp);findIndexSize = start+temp.length();//从已找到的后面开始找  Integer mapStart = hash.get(start);//起始位置  if(mapStart == null || (mapStart != null && findIndexSize > mapStart))//满足1个,即可更新map  {  hash.put(start, findIndexSize); //System.out.println("###敏感词:"+buffer.substring(start, findIndexSize));}  }  }  Collection<Integer> values = hash.keySet();  for(Integer startIndex : values)  {  Integer endIndex = hash.get(startIndex);  //获取敏感词,并加入列表,用来统计数量String sensitive = buffer.substring(startIndex, endIndex);//System.out.println("###敏感词:"+sensitive);if (!sensitive.contains("*")) {//添加敏感词到集合sensitiveWordSet.add(sensitive);sensitiveWordList.add(sensitive);
}buffer.replace(startIndex, endIndex, replaceAll.substring(0,endIndex-startIndex));}  hash.clear();  return buffer.toString();
}

下载地址:SensitiveWord
链接: https://pan.baidu.com/s/12RcZ8-jNHMAR__VscRUDfQ 密码: qmcw (如果失效,请使用文末地址下载)

二、Java关键词过滤

这个方式采用的是正则表达式匹配,速度上比第一种稍慢,匹配度良好。

主要代码:

// 从words.properties初始化正则表达式字符串
private static void initPattern() {StringBuffer patternBuffer = new StringBuffer();try {//words.propertiesInputStream in = KeyWordFilter.class.getClassLoader().getResourceAsStream("keywords.properties");Properties property = new Properties();property.load(in);Enumeration<?> enu = property.propertyNames();patternBuffer.append("(");while (enu.hasMoreElements()) {String scontent = (String) enu.nextElement();patternBuffer.append(scontent + "|");//System.out.println(scontent);keywordsCount ++;}patternBuffer.deleteCharAt(patternBuffer.length() - 1);patternBuffer.append(")");//System.out.println(patternBuffer);// unix换成UTF-8// pattern = Pattern.compile(new// String(patternBuf.toString().getBytes("ISO-8859-1"), "UTF-8"));// win下换成gb2312// pattern = Pattern.compile(new String(patternBuf.toString()// .getBytes("ISO-8859-1"), "gb2312"));// 装换编码pattern = Pattern.compile(patternBuffer.toString());} catch (IOException ioEx) {ioEx.printStackTrace();}
}private static String doFilter(String str) {Matcher m = pattern.matcher(str);
//      while (m.find()) {// 查找符合pattern的字符串
//          System.out.println("The result is here :" + m.group());
//      }// 选择替换方式,这里以* 号代替str = m.replaceAll("*");return str;
}

下载地址:KeyWordFilter
链接: http://pan.baidu.com/s/1kVBl803 密码: xi24 (如果失效,请使用文末地址下载)

三、DFA算法进行过滤

这种方式听起来高大上,采用DFA算法,这个算法个人不太懂,经测试发现,匹配度不行,速度良好。或许可以改良,还请大神进行改良。

主要有两个文件:SensitivewordFilter.java 和 SensitiveWordInit.java

主要代码:

public int CheckSensitiveWord(String txt,int beginIndex,int matchType){boolean  flag = false;    //敏感词结束标识位:用于敏感词只有1位的情况int matchFlag = 0;     //匹配标识数默认为0char word = 0;Map nowMap = sensitiveWordMap;for(int i = beginIndex; i < txt.length() ; i++){word = txt.charAt(i);nowMap = (Map) nowMap.get(word);     //获取指定keyif(nowMap != null){     //存在,则判断是否为最后一个matchFlag++;     //找到相应key,匹配标识+1 if("1".equals(nowMap.get("isEnd"))){       //如果为最后一个匹配规则,结束循环,返回匹配标识数flag = true;       //结束标志位为true   if(SensitivewordFilter.minMatchTYpe == matchType){    //最小规则,直接返回,最大规则还需继续查找break;}}}else{     //不存在,直接返回break;}}if(matchFlag < 2 || !flag){        //长度必须大于等于1,为词 matchFlag = 0;}return matchFlag;
}

下载地址:SensitivewordFilter
链接: http://pan.baidu.com/s/1ccsa66 密码: mc1x (如果失效,请使用文末地址下载)

四、多叉树查找算法

这个方式采用了多叉树查找算法,至于这个算法是怎么回事,大家可以去查看数据结构相关内容。提供了jar包,直接调用进行过滤。

经测试,这个方法匹配度良好,速度稍慢。

调用方式:

//敏感词过滤
FilteredResult result = WordFilterUtil.filterText(str, '*');
//获取过滤后的内容
System.out.println("替换后的字符串为:\n"+result.getFilteredContent());
//获取原始字符串
System.out.println("原始字符串为:\n"+result.getOriginalContent());
//获取替换的敏感词
System.out.println("替换的敏感词为:\n"+result.getBadWords());

下载地址:WordFilterUtil
链接: http://pan.baidu.com/s/1nvftzeD 密码: 5t2h (如果失效,请使用文末地址下载)

以上就是我的调研结果,希望对大家有所帮助。

最后,附上大量敏感词库下载地址
最新下载地址: https://t00y.com/file/1764647-442914556


参考了以下文章:

  • 《高效精准》敏感字&词过滤
  • Java关键字过滤
  • Java实现敏感词过滤
  • 高效Java敏感词、关键词过滤工具包_过滤非法词句

其他

  • 个人博客:http://www.sendtion.cn
  • CSDN:http://blog.csdn.net/shuyou612
  • GitHub:https://github.com/sendtion

网站敏感词过滤的实现(附敏感词库)相关推荐

  1. 敏感词过滤之——自定义构建查询词库与快速查询实现

    关于敏感词过滤的一点思考与实践 业务场景 思考与研究 逻辑分析 代码实现(php) 构建敏感词树 分割字符串 敏感词树长分支的递归实现 读取敏感词库 敏感词树的查询 查询实现 调用 测试.分析与总结 ...

  2. php敏感字符串过滤_PHP实现的敏感词过滤方法示例

    本文实例讲述了PHP实现的敏感词过滤方法.分享给大家供大家参考,具体如下: 1.敏感词过滤方法 /** * @todo 敏感词过滤,返回结果 * @param array $list 定义敏感词一维数 ...

  3. php敏感字符串过滤_PHP实现的敏感词过滤方法

    PHP实现的敏感词过滤方法,以下是一份过滤敏感词的编码.有需要可以参考参考. /** * @todo 敏感词过滤,返回结果 * @param array $list 定义敏感词一维数组 * @para ...

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

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

  5. Java实现敏感词过滤 - IKAnalyzer中文分词工具

    IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包. 官网: https://code.google.com/archive/p/ik-analyzer/ 本用例借助 I ...

  6. 网站发帖敏感字java_网站敏感词过滤的实现(附敏感词库)

    现在基本上所有的网站都需要设置敏感词过滤,z似乎已经成了一个网站的标配,如果你的网站没有,或者你没有做相应的处理,那么小心相关部门请你喝茶哦. 最近在调研Java web网站的敏感词过滤的实现,网上找 ...

  7. 网站是怎么屏蔽脏话的呢:简单学会SpringBoot项目敏感词、违规词过滤方案

    一个社区最重要的就是交流氛围与审查违规,而这两者都少不了对于敏感词进行过滤的自动维护措施.基于这样的措施,我们才能基本保证用户在使用社区的过程中,不至于被敏感违规词汇包围,才能够正常的进行发布帖子和评 ...

  8. 转:鏖战双十一-阿里直播平台面临的技术挑战(webSocket, 敏感词过滤等很不错)...

    转自:http://www.infoq.com/cn/articles/alibaba-broadcast-platform-technology-challenges 鏖战双十一-阿里直播平台面临的 ...

  9. 过滤:sql、敏感词、html、js、css

    sql 参数过滤 if (!function_exists('sql_filter')) {/*** sql 参数过滤* @param string $str* @return mixed*/func ...

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

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

最新文章

  1. 04 集成学习 - Boosting - AdaBoost算法构建
  2. xilinx axi dma 深入开发(一)
  3. 随便写点时间相关的模块
  4. LeetCode-有效的字母异位词
  5. SAP S4HANA里关于生产订单的一些重要数据库表
  6. 推荐关注这7个高质量的前端公众号
  7. c语言qt生成dll与加载dll,Qt制作界面的DLL以及调用
  8. 《Python Cookbook 3rd》笔记(4.11):同时迭代多个序列
  9. oracle10g生成awr报告,oracle 10g awr报告生成步骤及awr报告分析
  10. python 中decorator和property
  11. linux系统上安装远程软件下载,如何安装向日葵远程控制软件Linux被控端?
  12. Flex 学习笔记 ComboBox内容框宽度
  13. vue element 实现树形菜单栏n层级分类,NavMenu menu
  14. CleanMyPC中文版切换教程(专注于电脑缓存文件清理的工具)
  15. 新西兰计算机预科学费,新西兰留学预科学费
  16. Echarts显示数据被遮挡了
  17. HTML/CSS-花样边框案例
  18. 中国石油大学《机械电气安全技术(含课程设计)》
  19. 树莓派下使用USB摄像头
  20. ubuntu18.04安装roboware studio

热门文章

  1. 用Java实现邮件的发送
  2. 如何处理SQL Server中附加数据库时出现的错误
  3. idea 搜索不到gsonformat_IDEA开发工具插件之GsonFormat
  4. python110道面试题
  5. 【Tools系列】推荐一款好用的截图工具:Snipaste
  6. Eclipse中快速查找类或代码
  7. 计算机公开课打字游戏,H5公开课:古堡密卷--打字通关游戏设计及开发
  8. App Store 审核指南
  9. hcia第五天 结课
  10. java 自定义表单 动态表单 表单设计器 工作流引擎 flowable 设计方案