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

最近在调研Java web网站的敏感词过滤的实现,网上找了相关资料,经过我的验证,把我的调研结果写出来,供大家参考。

一、敏感词过滤工具类

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

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

初始化敏感词库:

//初始化敏感词库

public void InitializationWork()

{

replaceAll = new StringBuilder(replceSize);

for(int x=0;x < replceSize;x++)

{

replaceAll.append(replceStr);

}

//加载词库

arrayList = new ArrayList();

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();

sensitiveWordList= new ArrayList<>();

StringBuilder buffer = new StringBuilder(str);

HashMap hash = new HashMap(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 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();

}

二、Java关键词过滤

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

主要代码:

// 从words.properties初始化正则表达式字符串

private static void initPattern() {

StringBuffer patternBuffer = new StringBuffer();

try {

//words.properties

InputStream 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;

}

三、DFA算法进行过滤

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

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

主要代码:

public int CheckSensitiveWord(String txt,int beginIndex,int matchType){

boolean flag = false; //敏感词结束标识位:用于敏感词只有1位的情况

int matchFlag = 0; //匹配标识数默认为0

char word = 0;

Map nowMap = sensitiveWordMap;

for(int i = beginIndex; i < txt.length() ; i++){

word = txt.charAt(i);

nowMap = (Map) nowMap.get(word); //获取指定key

if(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;

}

四、多叉树查找算法

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

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

调用方式:

//敏感词过滤

FilteredResult result = WordFilterUtil.filterText(str, '*');

//获取过滤后的内容

System.out.println("替换后的字符串为:\n"+result.getFilteredContent());

//获取原始字符串

System.out.println("原始字符串为:\n"+result.getOriginalContent());

//获取替换的敏感词

System.out.println("替换的敏感词为:\n"+result.getBadWords());

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

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

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

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

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

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

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

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

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

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

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

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

  6. 敏感字检测or替换,并可以限定字符串长度

    大概测试了一下,效率还算可以的,. 用到了log4net这个包做debug,不用的删掉就行. using log4net; using System; using System.Collections ...

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

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

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

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

  9. python爬取整个网站的广告敏感词_Python实现敏感词过滤的4种方法

    在我们生活中的一些场合经常会有一些不该出现的敏感词,我们通常会使用*去屏蔽它,例如:尼玛 -> **,一些骂人的敏感词和一些政治敏感词都不应该出现在一些公共场合中,这个时候我们就需要一定的手段去 ...

最新文章

  1. 回归模型和时间序列模型中的MAPE指标是什么?MAPE指标解读、MAPE越大越好还是越小越好、使用MAPE指标的注意事项
  2. Openldap部署LDAP服务器平台
  3. Linux 用户空间和内核空间指的是什么?
  4. spring bean的生命周期和创建流程
  5. CodeForces - 387D George and Interesting Graph(二分图最大匹配+暴力)
  6. Apache并发处理模块
  7. dram sram利用 利用_使用量子力学技术的新型超低功耗存储器或将取代DRAM和Flash...
  8. cacti php zombie,Cacti1.2.x新版教程之监控本机
  9. ubuntu的两种网络连接模式
  10. react native多语言_前端福音:为什么使用 React 和 SVG 开发图形 UI 是天作之合?
  11. Hibernate与MyBatis的区别
  12. WdatePicker日历控件用法
  13. 玲珑学院 1138 - 震惊,99%+的中国人都会算错的问题
  14. PHP刷步数,微信支付宝修改步数刷步源码/带卡密功能PHP程序
  15. 牛客补题 树 dsu on tree
  16. 为选区添加描边_ps怎么给选区加上虚线描边
  17. Python 用26个英文字母生成序列
  18. 计量经济学之时间序列的平稳性、单位根检验、协整检验、时间序列数据的一般处理流程
  19. 海洋主题绘画_儿童画创意 | 三个海洋主题课例分享,超有创意的教程
  20. BLE 协议栈(Master,Slave;Standby,Advertiser,Scanner,Initiator;连接流程,连接参数)

热门文章

  1. Centos7 安装Nginx(OpenResty)、Windows安装Nginx
  2. 用户实战心得分享-轨道交通行业上云架构选型
  3. 红帽公司即将进军OpenStack网络融合工作
  4. python需要下载哪些软件-Python入门【1】Python下载安装,这几步你要了解
  5. TL494充电器原理与维修 (转)
  6. 39健康网之前世今生
  7. 【原创】彼得德鲁克《管理的实践》札记(五)
  8. k86跟mysql_FriendFeed如何用MySQL储存K-V数据
  9. Aruba携手中国电信云南公司共建 “智慧校园”
  10. 2021.7.15 jzoj题解与反思(2)