前言

现在几乎所有的网站再发布带有文字信息的内容时都会要求过滤掉发动的、不健康的、影响社会安定的等敏感词汇,这里为大家提供了可以是现在这种功能的解决方案

第一种方式

  • 创建敏感词汇文件;首先需要准备一个txt格式的文件用于存放需要过滤的敏感词汇,这个文件放到resources资源文件的根目录

代码如下

package com.xxxx.service;

import lombok.Data;
import org.springframework.stereotype.Service; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set; /**
* 敏感词汇service
*
* @author
* @date
*/
@Data
@Service
public class SensitiveWordService { private StringBuilder replaceAll; /**
* 编码
* <P>
* 在读敏感词汇文件时需要用到
*/
private String encoding = "UTF-8"; /**
* 替换字符窜
* <P>
* 用于替换敏感词汇的字符窜
*/
private String replceStr = "*"; /**
*单次替换的敏感词汇的长度
*/
private int replceSize = 500; /**
* 敏感词汇文件
* <P>
* 此文件放在资源文件的根目录下
*/
private String fileName = "censorwords.txt"; private List<String> arrayList; /**
* 包含的敏感词列表,过滤掉重复项
*/
public Set<String> sensitiveWordSet; /**
* 包含的敏感词列表,包括重复项,统计次数
*/
public List<String> sensitiveWordList; /**
* 移除敏感词汇
*
* @param str 需要过滤的字符窜
*
* @return 过滤之后的字符窜
*/
public String removeSensitiveWord(String str){
SensitiveWordService sw = new SensitiveWordService("censorwords.txt");
sw.InitializationWork();
return sw.filterInfo(str);
} /**
* 拦截信息
* <P>
* 过滤掉敏感词汇的方法
*
* @param str 将要被过滤信息
*
* @return 过滤后的信息
*/
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);//起始位置
//满足1个,即可更新map
if(mapStart == null || (mapStart != null && findIndexSize > mapStart)){
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();
} /**
* 初始化敏感词库
*/
private 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(SensitiveWordService.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();
}
}
} /**
* 测试方法
*
* @param args 参数
*/
public static void main(String[] args){
long startNumer = System.currentTimeMillis();
SensitiveWordService sw = new SensitiveWordService("censorwords.txt");
sw.InitializationWork();
//System.out.println("敏感词的数量:" + arrayList.size());
String str = "你好呀,我这里有敏感词汇,来过滤我呀";
System.out.println("被检测字符串长度:"+str.length());
str = sw.filterInfo(str);
long endNumber = System.currentTimeMillis();
//System.out.println("语句中包含敏感词的个数为:" + sensitiveWordSet.size() + "。包含:" + sensitiveWordSet);
//System.out.println("语句中包含敏感词的个数为:" + sensitiveWordList.size() + "。包含:" + sensitiveWordList);
System.out.println("总共耗时:"+(endNumber-startNumer)+"ms");
System.out.println("替换后的字符串为:\n"+str);
System.out.println("替换后的字符串长度为:\n"+str.length());
} /**
* 有参构造
* <P>
* 文件要求路径在src或resource下,默认文件名为censorwords.txt
* @param fileName 词库文件名(含后缀)
*/
public SensitiveWordService(String fileName) { this.fileName = fileName;
} /**
* 有参构造
*
* @param replceStr 敏感词被转换的字符
* @param replceSize 初始转义容量
*/
public SensitiveWordService(String replceStr, int replceSize){
this.replceStr = fileName;
this.replceSize = replceSize;
} /**
* 无参构造
*/
public SensitiveWordService(){
}
}

第二种方法


package com.xxxx.filters; import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.Properties;
import java.util.regex.Matcher;
import java.util.regex.Pattern; /**
* 【匹配度可以,速度较慢】
* Java关键字过滤:http://blog.csdn.net/linfssay/article/details/7599262
* @author ShengDecheng
*
*/
public class KeyWordFilter { private static Pattern pattern = null;
private static int keywordsCount = 0; // 从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;
} public static void main(String[] args) {
long startNumer = System.currentTimeMillis();
initPattern();
//String str = "我日,艹,fuck,你妹的 干啥呢";
System.out.println("敏感词的数量:" + keywordsCount);
String str = "你好呀,我这里有敏感词汇,来过滤我呀";
System.out.println("被检测字符串长度:"+str.length());
str = doFilter(str);
//高效Java敏感词、关键词过滤工具包_过滤非法词句:http://blog.csdn.net/ranjio_z/article/details/6299834
//FilteredResult result = WordFilterUtil.filterText(str, '*');
long endNumber = System.currentTimeMillis();
System.out.println("总共耗时:"+(endNumber-startNumer)+"ms");
System.out.println("替换后的字符串为:\n"+str);
//System.out.println("替换后的字符串为:\n"+result.getFilteredContent());
//System.out.println("替换后的字符串为1:\n"+result.getOriginalContent());
//System.out.println("替换后的字符串为2:\n"+result.getBadWords());
}
}

敏感词汇文件keywords.properties



java过滤敏感词汇的更多相关文章

  1. Java过滤敏感词语/词汇---DFA算法

    最近网站需要在评论.投稿等地方过滤敏感词汇,于是在网上查找了相关教程,特此整理分享. 关于DFA算法,详细的可以去http://blog.csdn.net/u013378306/article/det ...

  2. JavaWeb 过滤敏感词汇

    提交的表单数据,常常要检查有没有敏感词汇,如果有,需要给出提示,或者替换为*. 检查.替换敏感词汇有3种常用的方式 (1)在Servlet中操作. (2)在Filter中先检查.如果要替换敏感词汇,r ...

  3. Filter - 过滤敏感词汇(动态代理)

    /** * 敏感词汇过滤器 */ @WebFilter("/*") public class SensitiveWordsFilter implements Filter { pu ...

  4. PHP+Ajax判断是否有敏感词汇

    本文讲述如何使用PHP和Ajax创建一个过滤敏感词汇的方法,判断是否有敏感词汇. 敏感词汇数组sensitive.php return array ( 0 => '111111', 1 => ...

  5. JavaWeb 之 Filter 敏感词汇过滤案例

    需求: 1. 对day17_case案例录入的数据进行敏感词汇过滤 2. 敏感词汇参考 src路径下的<敏感词汇.txt> 3. 如果是敏感词汇,替换为 *** 分析: 1. 对reque ...

  6. java实现敏感词过滤(DFA算法)

    小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...

  7. Java实现敏感词过滤

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

  8. Java实现敏感词过滤(转)

    敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...

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

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

随机推荐

  1. bzoj3671 [Noi2014]随机数生成器

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3671 [题解] 贪心从1...n*m取,开两个5000*5000的数组就够了,可以重复利用, ...

  2. el-date-picker 日期格式化 yyyy-MM-dd

    <el-date-picker format="yyyy-MM-dd" v-model="dateValue" type="date" ...

  3. binlog2sql 回滚误操作

    参考过在资料: https://github.com/wuyongshenghub/mysqlbinlog2sql https://www.cnblogs.com/xuanzhi201111/p/66 ...

  4. ES的优化布局

    分词优化:IK Analyser Elastic Search 5.x官方提供的中文搜索并不友好,分词时经常将一句话分成很多单字,这时候可以使用IK Analyser插件进行优化,当然你在写java代 ...

  5. CNN中千奇百怪的卷积方式大汇总

    1.原始版本 最早的卷积方式还没有任何骚套路,那就也没什么好说的了. 见下图,原始的conv操作可以看做一个2D版本的无隐层神经网络. 附上一个卷积详细流程: [TensorFlow]tf.nn.co ...

  6. python的IDLE界面回退代码语句

    Alt+P回退到IDLE中之前输入的代码语句 Alt+N可以移至下一个代码语句

  7. Python数据处理实战

    一.运行环境 1.python版本 2.7.13 博客代码均是这个版本2.系统环境:win7 64位系统 二.需求 对杂乱文本数据进行处理 部分数据截图如下,第一个字段是原字段,后面3个是清洗出的字段 ...

  8. 使用Storm实现实时大数据分析(转)

    原文链接:http://blog.csdn.net/hguisu/article/details/8454368 简单和明了,Storm让大数据分析变得轻松加愉快. 当今世界,公司的日常运营经常会生成 ...

  9. php5和php7的异常处理机制 ----thinkphp5 异常处理的分析

    1.php异常和错误 在其他语言中,异常和错误是有区别的,但是PHP,遇见自身错误时,会触发一个错误,而不是跑出异常.并且,php大部分情况,都会触发错误,终止程序执行,在php5中,try catc ...

  10. POJ 2387 Til the Cows Come Home(dijkstra裸题)

    题目链接:http://poj.org/problem?id=2387 题目大意:给你t条边(无向图),n个顶点,让你求点1到点n的最短距离. 解题思路:裸的dijsktra,注意判重边. 代码: # ...