java过滤敏感词汇
前言
现在几乎所有的网站再发布带有文字信息的内容时都会要求过滤掉发动的、不健康的、影响社会安定的等敏感词汇,这里为大家提供了可以是现在这种功能的解决方案
第一种方式
- 创建敏感词汇文件;首先需要准备一个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过滤敏感词汇的更多相关文章
- Java过滤敏感词语/词汇---DFA算法
最近网站需要在评论.投稿等地方过滤敏感词汇,于是在网上查找了相关教程,特此整理分享. 关于DFA算法,详细的可以去http://blog.csdn.net/u013378306/article/det ...
- JavaWeb 过滤敏感词汇
提交的表单数据,常常要检查有没有敏感词汇,如果有,需要给出提示,或者替换为*. 检查.替换敏感词汇有3种常用的方式 (1)在Servlet中操作. (2)在Filter中先检查.如果要替换敏感词汇,r ...
- Filter - 过滤敏感词汇(动态代理)
/** * 敏感词汇过滤器 */ @WebFilter("/*") public class SensitiveWordsFilter implements Filter { pu ...
- PHP+Ajax判断是否有敏感词汇
本文讲述如何使用PHP和Ajax创建一个过滤敏感词汇的方法,判断是否有敏感词汇. 敏感词汇数组sensitive.php return array ( 0 => '111111', 1 => ...
- JavaWeb 之 Filter 敏感词汇过滤案例
需求: 1. 对day17_case案例录入的数据进行敏感词汇过滤 2. 敏感词汇参考 src路径下的<敏感词汇.txt> 3. 如果是敏感词汇,替换为 *** 分析: 1. 对reque ...
- java实现敏感词过滤(DFA算法)
小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解. 敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxo ...
- Java实现敏感词过滤
敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...
- Java实现敏感词过滤(转)
敏感词.文字过滤是一个网站必不可少的功能,如何设计一个好的.高效的过滤算法是非常有必要的.前段时间我一个朋友(马上毕业,接触编程不久)要我帮他看一个文字过滤的东西,它说检索效率非常慢.我把它程序拿过来 ...
- Java实现敏感词过滤 - IKAnalyzer中文分词工具
IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包. 官网: https://code.google.com/archive/p/ik-analyzer/ 本用例借助 I ...
随机推荐
- Go语言的并发和并行
不知道你有没有注意到,这段代码如果我跑在两个goroutines里面的话: package main import ( "fmt" ) func loop(done chan bo ...
- 大聊Python----quene队列
当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. class queue.Queue(maxsize=0) # 先入先出class queue.LifoQueue(maxsize=0 ...
- 灵活使用ARM汇编的WEAK关键字
//=====================================================================//TITLE:// 灵活使用ARM汇编的WEAK关 ...
- perl发送post数据
把post数据写进一个匿名数组里就行 #!/usr/bin/env perl -w use strict; use LWP::UserAgent; my $ua = LWP::UserAgent-&g ...
- python中的ftplib模块
前言 Python中默认安装的ftplib模块定义了FTP类. ftplib模块相关参数: 加载ftp模块:from ftplib import FTP ftp = FTP()#设置变量ftp.set ...
- Eclipse中SVN更改连接用户
Eclipse中安装了SVN插件,当连接到SVN服务器后,便无法从客户端更改连接帐号 百度一下,也就知道 查看Eclipse中使用的是什么SVN Interface,位置在windows > p ...
- vmware安装ubuntu " Intel VT-x 处于禁用状态"
vmware安装ubuntu " Intel VT-x 处于禁用状态" http://jingyan.baidu.com/article/fc07f98976710e12ffe51 ...
- devinet_ioctl
Kernel: 4.12.6 deinet_ioctl:获取或者设置接口的地址,掩码,标记等信息: 注意,使用SIOCSIFFLAGS关闭设备,如果使用了别名,则删除对应ip,如果其为主ip,并且从i ...
- 【模板】BZOJ 3781: 小B的询问 莫队算法
http://www.lydsy.com/JudgeOnline/problem.php?id=3781 N个数的序列,每次询问区间中每种数字出现次数的平方和,可以离线. 丢模板: #include ...
- 2017多校第8场 HDU 6134 Battlestation Operational 莫比乌斯反演
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6134 题意: 解法: 那么g(n)怎么求,我们尝试打表发现g(n)是有规律的,g(n)=g(n-1)+ ...