java过滤敏感词替换**

设计一个敏感词过滤程序 替换敏感字 阅读详情
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;



public class WmParser {
//	private static Log log = LogFactory.getLog(WmParser.class);
	public static WmParser wmParser;
	private static String CHARSET = "ISO-8859-1"; 
	static {
		try {
//			log.debug("Instantiating WmParser....");
			wmParser = new WmParser();
			//敏感词库
			FileInputStream in = new FileInputStream("C:\\Documents and Settings\\Administrator\\桌面\\微信项目\\世界杯\\屏蔽字\\gatway\\sensitive.txt");
			BufferedReader reader = new BufferedReader(
					new InputStreamReader(in));
			String line = null;
			while ((line = reader.readLine()) != null) {
//				wmParser.addFilterKeyWord(new String(line.getBytes(), "ISO-8859-1"), 1);
				wmParser.addFilterKeyWord(line, 1);
//				String[] badWords = line.split("!");
//				if (badWords.length == 0){
//					continue;
//				}
//				if (badWords[0].equals("")){
//					continue;
//				}
//				try {
//					wmParser.addFilterKeyWord(badWords[0], Integer.valueOf(badWords[1]));
//				} catch (NumberFormatException e) {
//					log.error("NumberFormatException in Instantiating WmParser's badWords level:" + e);
//					wmParser.addFilterKeyWord(badWords[0], Integer.valueOf(1));
//				}
			}
			reader.close();
			in.close();
		} catch (Exception e) {
//			log.error("Exception in Instantiating WmParser:" + e);
			e.printStackTrace();
		}
	}
	protected WmParser(){
		
	}
	public static WmParser getInstance(){
		return wmParser;
	}
	
	private boolean initFlag = false;
	private UnionPatternSet unionPatternSet = new UnionPatternSet();
	private int maxIndex = (int) java.lang.Math.pow(2, 16);
	private int shiftTable[] = new int[maxIndex];
	public Vector<AtomicPattern> hashTable[] = new Vector[maxIndex];
	private UnionPatternSet tmpUnionPatternSet = new UnionPatternSet();

	public static void main(String args[]) {
		try {
			WmParser filterEngine = WmParser.getInstance();
			Vector<Integer> levelSet = new Vector<Integer>();
			String str = "你好 cao你大爷毛民航局FUCK5l玩引导员";
			SimpleDateFormat sf = new SimpleDateFormat("HH:mm:ss.SSS");
			System.out.println("文本长度:" + str.length());
			System.out.println("敏感词汇总数:" + filterEngine.tmpUnionPatternSet.getSet().size());
			Date start = new Date(System.currentTimeMillis());
			System.out.println("过滤开始:" + sf.format(start));
			
			System.out.println(str);
			System.out.println(filterEngine.parse(new String(str.getBytes(), "UTF-8"), levelSet));
			
			Date end = new Date(System.currentTimeMillis());
			System.out.println("过滤完毕:" + sf.format(end));
			System.out.println("文本中出现敏感词个数:" + levelSet.size());
			System.out.println("耗时:" + (end.getTime() - start.getTime()) + "ms");
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	public boolean addFilterKeyWord(String keyWord, int level) {
		if (initFlag == true)
			return false;
		UnionPattern unionPattern = new UnionPattern();
		Pattern pattern = new Pattern(keyWord);
		AtomicPattern atomicPattern = new AtomicPattern(pattern);
		unionPattern.addNewAtomicPattrn(atomicPattern);
		unionPattern.setLevel(level);
		atomicPattern.setBelongUnionPattern(unionPattern);
		tmpUnionPatternSet.addNewUnionPattrn(unionPattern);
		return true;
	}

	public String parse(String content, Vector<Integer> levelSet){
		try {
			if (initFlag == false)
				init();
			Vector<AtomicPattern> aps = new Vector<AtomicPattern>();
			StringBuilder sb = new StringBuilder();	
			char checkChar;
			for (int i = 0; i < content.length();) {
				checkChar = content.charAt(i);
				if (shiftTable[checkChar] == 0) {
					Vector<AtomicPattern> tmpAps = new Vector<AtomicPattern>();
					Vector<AtomicPattern> destAps = hashTable[checkChar];
					int match = 0;
					for (int j = 0; j < destAps.size(); j++) {
						AtomicPattern ap = destAps.get(j);
						if (ap.findMatchInString(content.substring(0, i + 1))){
							String patternStr = ap.getPattern().str;
							if (match > 0){
								sb.setLength(sb.length() - patternStr.length());
							} else {
								sb.setLength(sb.length() - patternStr.length() + 1);
							}
							appendStar(patternStr, sb);
							tmpAps.add(ap);
							match++;
						}
					}
					aps.addAll(tmpAps);
					if (tmpAps.size() <= 0){
						sb.append(checkChar);
					}
					i++;
				} else {
					if (i + shiftTable[checkChar] <= content.length()){
						sb.append(content.substring(i, i + shiftTable[checkChar]));
					} else {
						sb.append(content.substring(i));
					}
					i = i + shiftTable[checkChar];
				}
			}
			parseAtomicPatternSet(aps, levelSet);
			return sb.toString();
		} catch (Exception e) {
//			log.error(e);
			e.printStackTrace();
		}
		return "";
	}
	
	private static void appendStar(String patternStr, StringBuilder sb){
		for (int c = 0;c < patternStr.length(); c++){
			char ch = patternStr.charAt(c);
			if ((ch >= 0x4e00 && ch <= 0x9FA5) || (ch >= 0xF900 && ch <= 0xFA2D)){
				sb.append("*");
			} else {
				sb.append("*");
			}
		}
	}


	private void parseAtomicPatternSet(Vector<AtomicPattern> aps,
			Vector<Integer> levelSet) {
		while (aps.size() > 0) {
			AtomicPattern ap = aps.get(0);
			UnionPattern up = ap.belongUnionPattern;
			if (up.isIncludeAllAp(aps)) {
				levelSet.add(new Integer(up.getLevel()));
			}
			aps.remove(0);
		}
	}

	// shift table and hash table of initialize
	private void init() {
		initFlag = true;
		for (int i = 0; i < maxIndex; i++)
			hashTable[i] = new Vector<AtomicPattern>();
		shiftTableInit();
		hashTableInit();
	}

	public void clear() {
		tmpUnionPatternSet.clear();
		initFlag = false;
	}

	private void shiftTableInit() {
		for (int i = 0; i < maxIndex; i++)
			shiftTable[i] = 2;
		Vector<UnionPattern> upSet = tmpUnionPatternSet.getSet();
		for (int i = 0; i < upSet.size(); i++) {
			Vector<AtomicPattern> apSet = upSet.get(i).getSet();
			for (int j = 0; j < apSet.size(); j++) {
				AtomicPattern ap = apSet.get(j);
				Pattern pattern = ap.getPattern();
				if (shiftTable[pattern.charAtEnd(1)] != 0)
					shiftTable[pattern.charAtEnd(1)] = 1;
				if (shiftTable[pattern.charAtEnd(0)] != 0)
					shiftTable[pattern.charAtEnd(0)] = 0;
			}
		}
	}

	private void hashTableInit() {
		Vector<UnionPattern> upSet = tmpUnionPatternSet.getSet();
		for (int i = 0; i < upSet.size(); i++) {
			Vector<AtomicPattern> apSet = upSet.get(i).getSet();
			for (int j = 0; j < apSet.size(); j++) {
				AtomicPattern ap = apSet.get(j);
				Pattern pattern = ap.getPattern();
				if (pattern.charAtEnd(0) != 0) {
					hashTable[pattern.charAtEnd(0)].add(ap);
				}
			}
		}
	}
}

class Pattern { // string
	Pattern(String str) {
		this.str = str;
	}

	public char charAtEnd(int index) {
		if (str.length() > index) {
			return str.charAt(str.length() - index - 1);
		} else
			return 0;
	}

	public String str;

	public String getStr() {
		return str;
	};
}

class AtomicPattern {
//	public boolean findMatchInString(String str) throws Exception {
//		String patStr = new String(this.pattern.str.getBytes("ISO-8859-1"), "UTF-8");
//		str = new String(str.getBytes("ISO-8859-1"), "UTF-8");
//		if (patStr.length() > str.length())
//			return false;
//		int beginIndex = str.lastIndexOf(patStr.charAt(0) + "");
//		if (beginIndex != -1){
//			String eqaulLengthStr = str.substring(beginIndex);
//			if (patStr.equalsIgnoreCase(eqaulLengthStr))
//				return true;
//		}
//		return false;
//	}
	public boolean findMatchInString(String str) {
		if (this.pattern.str.length() > str.length())
			return false;
		int beginIndex = str.lastIndexOf(this.pattern.str.charAt(0) + "");
		if (beginIndex != -1){
			String eqaulLengthStr = str.substring(beginIndex);
			if (this.pattern.str.equalsIgnoreCase(preConvert(eqaulLengthStr)))
				return true;
		}
		return false;
	}
	private String preConvert(String content) {
		String retStr = new String();
		for (int i = 0; i < content.length(); i++) {
			char ch = content.charAt(i);
			if (this.isValidChar(ch)) {
				retStr = retStr + ch;
			}
		}
		return retStr;
	}
	private boolean isValidChar(char ch) {
		if ((ch >= '0' && ch <= '9') || (ch >= 'A' && ch <= 'Z')
				|| (ch >= 'a' && ch <= 'z'))
			return true;
		if ((ch >= 0x4e00 && ch <= 0x9FA5) || (ch >= 0xF900 && ch <= 0xFA2D))
			return true;
		return false;
	}

	AtomicPattern(Pattern pattern) {
		this.pattern = pattern;
	};

	private Pattern pattern;
	public UnionPattern belongUnionPattern;

	public UnionPattern getBelongUnionPattern() {
		return belongUnionPattern;
	}

	public void setBelongUnionPattern(UnionPattern belongUnionPattern) {
		this.belongUnionPattern = belongUnionPattern;
	}

	public Pattern getPattern() {
		return pattern;
	}

	public void setPattern(Pattern pattern) {
		this.pattern = pattern;
	}
}

class SameAtomicPatternSet {
	SameAtomicPatternSet() {
		SAPS = new Vector<AtomicPattern>();
	};

	public Vector<AtomicPattern> SAPS;
}

class UnionPattern { // union string
	UnionPattern() {
		this.apSet = new Vector<AtomicPattern>();
	}

	public Vector<AtomicPattern> apSet;

	public void addNewAtomicPattrn(AtomicPattern ap) {
		this.apSet.add(ap);
	}

	public Vector<AtomicPattern> getSet() {
		return apSet;
	}

	public boolean isIncludeAllAp(Vector<AtomicPattern> inAps) {
		if (apSet.size() > inAps.size())
			return false;
		for (int i = 0; i < apSet.size(); i++) {
			AtomicPattern ap = apSet.get(i);
			if (isInAps(ap, inAps) == false)
				return false;
		}
		return true;
	}

	private boolean isInAps(AtomicPattern ap, Vector<AtomicPattern> inAps) {
		for (int i = 0; i < inAps.size(); i++) {
			AtomicPattern destAp = inAps.get(i);
			if (ap.getPattern().str.equalsIgnoreCase(destAp.getPattern().str))
				return true;
		}
		return false;
	}

	public void setLevel(int level) {
		this.level = level;
	}

	public int getLevel() {
		return this.level;
	}

	private int level;
}

class UnionPatternSet { // union string set
	UnionPatternSet() {
		this.unionPatternSet = new Vector<UnionPattern>();
	}

	public void addNewUnionPattrn(UnionPattern up) {
		this.unionPatternSet.add(up);
	}

	public Vector<UnionPattern> unionPatternSet;

	public Vector<UnionPattern> getSet() {
		return unionPatternSet;
	}

	public void clear() {
		unionPatternSet.clear();
	}
}

Java实现DFA算法敏感词过滤 Java实现DFA算法敏感词过滤。 文章目录一. 应用场景二. 实现思路三. 源码实现 一. 应用场景 模拟非法词汇自动替换成*字符,且敏感词汇支持动态调整。 效果如下,若配置了敏感词:今天,则当用户在输入:今天,天气真不错。实际应该输出:** **,天气真不错 ** 二. 实现思路 使用MySQL作为敏感词库 使用DFA算法实现文字过滤 Q:什么是DFA? DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向. 阅读详情

相关推荐

过滤脏话的filter代码

过滤脏话的filter代码,很有参考价值哦,学习javaweb的filter可以看看

Java如何将字符串中的敏感词替换为相等数量的星号*

Java如何将字符串中的敏感词替换为相等数量的星号*,这也是我工作中遇到的问题,尝试了很多种方式最后采用这一种,在这里分享一下我的解决方式,方式简单,希望对大家有用。如果大家有什么好的方式也欢迎分享! /** * 过滤字符串中的敏感词汇 * @param content 文本 * @param sensitiveWord 敏感词汇 * @ret...

程序员阿超的博客 1万+

java敏感词代码

Java敏感词源码 ,内涵大多数敏感词词库。

Java敏感词替换

Java敏感词替换

Luckywqx的博客 668

基于Java的脏字过滤器设计

本文提出了一种脏字过滤器软件的设计,对网络中不良的内容进行查找、发现,避免这些不良网络文化侵蚀青少年的心灵健康。

Cursor锁机了怎么办?实测这个开源插件帮你无限“续杯”,附详细安装与防踩坑指南

本文提供了Cursor锁机问题的详细解决方案,包括使用开源插件`cursor-fake-machine`修改机器标识、锁定配置文件权限以及优化使用规范。同时介绍了如何利用Cursor开发油猴脚本将微信公众号文章高效转换为Markdown格式,提升内容创作效率。

weixin_26805597的博客 768

Java_题目_敏感词替换

Java_题目_敏感词替换

SisinRyu的博客 625

autodl云服务器使用中的conda源报错

通过find path -name filename找到.condarc文件,在autodl服务器中,一般在/root/.condarc。为了利用jypyter打开conda虚拟环境运行,需要下载ipykenel。这个报错是源的问题,在通过源获取包元数据时出现了HTTP 429错误。通过conda换源解决。修改.condarc文件,命令: vim .condarc。但这样还不能解决问题,得把报错中有问题的源注释掉。通过以下命令添加清华镜像源。把报错的链接源注释如下。

Ty_kilig的博客 1584

java敏感词过滤

运用于内容敏感词过滤打码。

m0_59096111的博客 4561

西门子PLC作为TCP客户端通信:TSEND_C/TRCV_C指令实战与状态机设计

在工业自动化与物联网系统中,TCP/IP通信是实现设备间数据交换的基础协议,其核心在于建立可靠的点对点连接与数据流传输。其工作原理基于客户端-服务器模型,通过三次握手建立连接,确保数据包的顺序与完整性。这项技术的工程价值在于打破了传统工控设备被动响应的局限,为实时数据主动上报、边缘计算集成提供了通用且灵活的解决方案。在工业物联网、设备远程监控、生产数据实时采集等场景中,TCP客户端模式使得PLC能够主动将产线状态、报警信息等关键数据推送至服务器或数据库,实现更及时的数据交互。本文聚焦于西门子S7-1200/

weixin_29194255的博客 362

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

2024年12月中国电子学会青少年软件编程(Python)等级考试试卷(五级)答案 + 解析

伶俐角少儿编程 487

详细分析Java中的敏感词过滤(附Demo)

自定义方法过滤敏感词,重在思路

码农研究僧的博客 2754

手把手写深度学习(27):如果获得相机位姿态的plücker embedding?以RealEstate10K为例

用plücker embedding表示相机的位姿是一种非常常用的方法,这篇博客以RealEstate10K数据集为例子,详细讲解如何从相机的轨迹坐标中获得plücker embedding,用于下一步模型的学习。

沉迷单车的追风少年 2240

java敏感词过滤器组件

用java写过滤器组件,需求:这里可以☆赌☆博☆,可以☆嫖☆娼☆,可以☆吸☆毒☆,可以☆开☆票☆,哈哈哈!经过过滤器过滤后变为这里可以☆***☆,可以☆***☆,可以☆***☆,可以☆***☆,哈哈哈!

qq_43588509的博客 866

ubuntu 安装node和npm

在ubuntu中经常需要用到node ,npm,因为npm基本会和node同时安装,所以只需要安装node即可。可以使用 nvm(Node Version Manager)来管理你的 Node.js 版本。

风吹落叶的博客 2293

openbmc mctp i3c适配步骤

本文介绍了在Intel OKS平台下,BMC作为I3C从设备如何适配MCTP over I3C的实现方法。主要内容包括:1)关键术语解释,如MDB(Mandatory Data Byte)值为0xAE,DCR(Device Characteristics Register)和BCR(Bus Characteristics Register)的设置;2)适配流程说明,包括BMC作为控制器主节点分配地址后成为MCTP端点,CPU作为总线所有者的角色转换;3)测试验证步骤,展示通过mctp-client工具发送指

wit_yuan的专栏 132

java敏感词替换_Java实现敏感字过滤

import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;/*** 过滤敏感词,并把敏感词替换成***/publi...

weixin_30711615的博客 776

【国产MCU】-认识CH32V307及开发环境搭建

CH32V307是[沁恒](https://www.wch.cn/)推出的一款基于32位RISC-V设计的互联型微控制器,配备了硬件堆栈区、快速中断入口,在标准RISC-V基础上大大提高了中断响应速度。加入单精度浮点指令集,扩充堆栈区,具有更高的运算性能。扩展串口UART数量到8组,电机定时器到4组。提供USB2.0高速接口(480Mbps)并内置了PHY收发器,以太网MAC升级到千兆并集成了10M-PHY模块。

视觉与物联智能 2347

java 敏感字过滤_JAVA敏感词过滤

1 importjava.util.HashSet;2 importjava.util.Iterator;3 importjava.util.Map;4 importjava.util.Set;56 /**7 * 敏感词过滤8 */9 public classSensitivewordFilter {10 private Map sensitiveWordMap = null;11 ...

weixin_29409045的博客 555

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

dfa算法 java_java实现敏感词过滤(DFA算法)

小Alan在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和大家分享一下自己的理解。在写之前,小Alan给大家推荐一篇来自http://cmsblogs.com/?p=1031的博文,也会参考部分内容来描述博文。敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxoo相关的文字时)时要能检测出来,很多项目中都会有一个敏感词管理模块,在敏感...

weixin_30696571的博客 1022

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

敏感词过滤程序编写敏感词过滤程序

敏感词过滤程序编写敏感词过滤程序

weixin_62438655的博客 1258

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

PHP实现的敏感词过滤方法

PHP实现的敏感词过滤方法,有好的编码和好的实现方法,可以发出来一起交流一下。以下是一份过滤敏感词的编码 ????????????个人博客:Harvey的个人博客 ???????????? 一.敏感词过滤方案一 /** * @todo敏感词过滤,返回结果 * @paramarray $list 定义敏感词一维数组 * @paramstring $string 要过滤的内容 * ...

第二世界 7524

android 敏感词过滤器,Android敏感词过滤工具类

package com.tradeaider.app.utils;import com.tradeaider.app.activity.MyApplication;import java.util.ArrayList;import java.util.Arrays;import java.util.HashMap;import java.util.Iterator;import java.util...

weixin_32073537的博客 895

android 敏感词过滤器,android 过滤敏感词主要类

package com.example.demo;import java.util.HashMap;import java.util.HashSet;import java.util.Iterator;import java.util.Map;import java.util.Set;public class SensitiveWordsUtils {/*** 敏感词匹配规则*/public st...

weixin_35765226的博客 655

输入一段字符串如有指定敏感词则输出**

输出一段字符串出现指定敏感词则** 1:String[] strs={"枪","毒品","情色","赌博","海洛因"};指定敏感词不能输出!!! 2:发表你的评论System.out.println("请发表你的评论"); String pingLun=input.next(); 3:判断并替换 // for(String i:strs){//得到敏感词 // if(pingLun....

AHincsdn的博客 2177

java dfa 敏感词_java利用DFA算法实现敏感词过滤功能

前言敏感词过滤应该是不用给大家过多的解释吧?讲白了就是你在项目中输入某些字(比如输入xxoo相关的文字时)时要能检测出来,很多项目中都会有一个敏感词管理模块,在敏感词管理模块中你可以加入敏感词,然后根据加入的敏感词去过滤输入内容中的敏感词并进行相应的处理,要么提示,要么高亮显示,要么直接替换成其它的文字或者符号代替。敏感词过滤的做法有很多,我简单描述我现在理解的几种:①查询数据库当中的敏感词,循环...

weixin_31847389的博客 233
上一篇: 最全的常用正则表达式大全分享
下一篇: java序列化小汇总
三易的博客
博客等级 码龄15年 42粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值