`
kengun
  • 浏览: 15930 次
社区版块
存档分类
最新评论

Java实现敏感词过滤

    博客分类:
  • java
阅读更多

Java实现敏感词过滤

具体原理可参照:http://blog.csdn.net/chenssy/article/details/26961957

SensitiveWordFilterUtil.java

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.log4j.Logger;

/**
 * 敏感词过滤
 * 
 * @author TanJianJun
 *
 */
public class SensitiveWordFilterUtil {
	// 日志
	private static final Logger LOG = Logger.getLogger(SensitiveWordFilterUtil.class);
	// 敏感词库
	private static HashMap<Object, Object> sensitiveWordMap = null;
	// 默认编码格式
	private static final String ENCODING = "UTF-8";
	// 敏感词库的路径
	private static final InputStream in = SensitiveWordFilterUtil.class.getClassLoader().getResourceAsStream(
			"sensitive/keyWords.txt");
	// 替换敏感词字符
	private static final String REPLACE_SIGN = "**";
	// 敏感词内容
	private static String sensitiveContent = "";

	/**
	 * 初始化敏感词库
	 */
	private static void init() {
		// 读取文件
		Set<String> keyWords = readSensitiveWords();
		// 创建敏感词库
		sensitiveWordMap = new HashMap<>(keyWords.size());
		for (String keyWord : keyWords) {
			createKeyWord(keyWord);
		}
	}

	/**
	 * 构建敏感词库
	 *
	 * @param keyWord
	 */
	@SuppressWarnings("unchecked")
	private static void createKeyWord(String keyWord) {
		if (sensitiveWordMap == null) {
			LOG.error("sensitiveWordMap 未初始化!");
			return;
		}
		Map<Object, Object> nowMap = sensitiveWordMap;
		for (Character c : keyWord.toCharArray()) {
			Object obj = nowMap.get(c);
			if (obj == null) {
				Map<Object, Object> childMap = new HashMap<Object, Object>();
				childMap.put("isEnd", "false");
				nowMap.put(c, childMap);
				nowMap = childMap;
			} else {
				nowMap = (Map<Object, Object>) obj;
			}
		}
		nowMap.put("isEnd", "true");
	}

	/**
	 * 读取敏感词文件
	 *
	 * @return
	 */
	private static Set<String> readSensitiveWords() {
		Set<String> keyWords = new HashSet<String>();
		BufferedReader reader = null;
		try {
			reader = new BufferedReader(new InputStreamReader(in, ENCODING));
			String line;
			while ((line = reader.readLine()) != null) {
				sensitiveContent = sensitiveContent + line + "\n";
				if (line.startsWith("#") || "".equals(line.trim())) {
					continue;
				}
				List<String> arr = Arrays.asList(line.trim().split("、"));
				keyWords.addAll(arr);
			}
		} catch (UnsupportedEncodingException e) {
			LOG.error("敏感词库文件转码失败!");
		} catch (FileNotFoundException e) {
			LOG.error("敏感词库文件不存在!");
		} catch (IOException e) {
			LOG.error("敏感词库文件读取失败!");
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
				reader = null;
			}
		}
		return keyWords;
	}

	/**
	 * 取得敏感词
	 *
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static List<String> getSensitiveWord(String text) {
		if (sensitiveWordMap == null) {
			init();
		}
		// 加上一个空格,是为了匹配最后一个敏感词
		text = text + " ";
		List<String> sensitiveWords = new ArrayList<String>();
		Map<Object, Object> nowMap = sensitiveWordMap;
		for (int i = 0; i < text.length(); i++) {
			Character word = text.charAt(i);
			Object obj = nowMap.get(word);
			if (obj == null) {
				continue;
			}
			int j = i + 1;
			Map<Object, Object> childMap = (Map<Object, Object>) obj;
			while (j < text.length()) {
				if ("true".equals(childMap.get("isEnd"))) {
					sensitiveWords.add(text.substring(i, j));
				}
				obj = childMap.get(text.charAt(j));
				if (obj != null) {
					childMap = (Map<Object, Object>) obj;
				} else {
					break;
				}
				j++;
			}
		}
		return sensitiveWords;
	}

	/**
	 * 替换敏感词
	 *
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static String replaceSensitiveWord(String text) {
		if (sensitiveWordMap == null) {
			init();
		}
		// 替换敏感词后的文本
		String newText = text;
		// 加上一个空格,是为了匹配最后一个敏感词
		text = text + " ";
		Map<Object, Object> nowMap = sensitiveWordMap;
		for (int i = 0; i < text.length(); i++) {
			Character word = text.charAt(i);
			Object obj = nowMap.get(word);
			if (obj == null) {
				continue;
			}
			int j = i + 1;
			Map<Object, Object> childMap = (Map<Object, Object>) obj;
			while (j < text.length()) {
				if ("true".equals(childMap.get("isEnd"))) {
					newText = newText.replace(text.substring(i, j), REPLACE_SIGN);
				}
				obj = childMap.get(text.charAt(j));
				if (obj != null) {
					childMap = (Map<Object, Object>) obj;
				} else {
					break;
				}
				j++;
			}
		}
		return newText;
	}

	/**
	 * 读取敏感词文件内容
	 *
	 * @return
	 */
	public static String getSensitiveWordContent() {
		if ("".equals(sensitiveContent)) {
			init();
		}
		return sensitiveContent;
	}

}

 

   敏感词文本文件"keyWords.txt"放在工程的"src/main/resources/sensitive"

   内容为:

#以"#"字符开头的为说明,敏感词以分割"、"
#(一)政治敏感人物名称:
#国内政要人物:
敏感词1、敏感词2、敏感词3

 

 

分享到:
评论

相关推荐

    java实现敏感词过滤

    在Java中实现敏感词过滤,我们可以采用以下几种方法: 1. **字符串匹配**:最基础的方法是使用字符串的contains()方法,逐个比较敏感词。但这种方法效率较低,不适合大量敏感词的场景。 2. **正则表达式**:将敏感...

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

    在本文中,我们将探讨如何使用DFA(有穷自动机)算法在Java中实现敏感词过滤功能。敏感词过滤在许多应用程序中都是必要的,例如社交媒体、论坛或博客平台,以防止用户发布不当或有害的内容。以下是对DFA算法及其在...

    Java实现敏感词过滤功能

    Java实现敏感词过滤功能

    java敏感词过滤功能

    在Java开发中,实现敏感词过滤功能是一项常见的需求,特别是在社交媒体...以上就是基于Java实现敏感词过滤功能的一些核心知识点。在实际开发中,还需要考虑到代码的可维护性、扩展性和安全性,以及对不同场景的适应性。

    高效敏感词过滤JAVA实现(DFA算法) 5000字2ms

    高效敏感词过滤JAVA实现(DFA算法) 5000字2ms 节点 + 2进制标识(节省空间/提高查询效率) 附源码、注释,附带专业敏感词库(3396个敏感词) 看得上就拿去用,替换下一两处util方法、改个路径即可 不求什么,...

    Java语言实现的敏感词过滤器

    我们在开发系统或者应用的过程中,经常需要对用户提交的评论或者文章进行审核,对其中的敏感词进行校验或者过滤,本资源可以帮助各位小伙伴以一个简单的方式实现敏感词的过滤,代码精简易懂,可以应用在实际开发过程...

    java。dfa算法实现敏感词过滤

    `SensitivewordFilter.java` 文件很可能是实现敏感词过滤的核心类。在这个类中,可能会包含以下功能: 1. **初始化敏感词库**:首先,需要读取敏感词列表,如从配置文件、数据库或内存中加载。这些敏感词会被转换为...

    java敏感词过滤(支持指定字段过滤)

    在Java开发中,敏感词过滤是一项重要的功能,尤其在...通过以上步骤,我们可以有效地在Java项目中实现敏感词过滤,确保内容的合规性,防止不良信息的传播。同时,敏感词库应定期更新,以适应不断变化的敏感词汇环境。

    java 敏感词过滤 并显示内容所包含的敏感词

    Java作为一种广泛应用的编程语言,提供了多种实现敏感词过滤的方法。本篇将详细探讨如何在Java中进行敏感词过滤,并展示如何显示内容中包含的敏感词。 首先,我们要理解敏感词过滤的核心原理。敏感词过滤通常基于...

    JAVA 敏感词过滤

    在Java编程语言中,敏感词过滤是一项重要的任务,特别是在处理用户输入、社交媒体分析、文本审查等场景中。这个话题涉及到如何有效地检测并替换或者屏蔽文本中的特定词汇,以符合法律法规或者平台规定。以下是对...

    java敏感词过滤

    本篇文章将深入探讨Java中实现敏感词过滤的技术和方法。 首先,敏感词过滤的核心在于如何有效地匹配和替换敏感词汇。Java提供了一些强大的字符串处理和正则表达式功能,可以用来实现这一目标。正则表达式是匹配文本...

    网站敏感词过滤Java版.zip

    Java实现敏感词过滤,通常会结合上述的匹配算法,并考虑到性能优化,如使用缓存、多线程等手段。 四、应用场景 1. **社交媒体**:评论、帖子内容的审核,防止违规信息传播。 2. **在线教育平台**:作业、讨论区...

    一种基于Java Web的敏感词过滤方法研究与实现.pdf

    从提供的文件内容来看,本文是一篇关于Java Web技术研究的文章,主要介绍了一种基于Java Web的敏感词过滤系统的实现方法。该系统通过自动识别和阻断含有敏感词的聊天内容,并将敏感词替换为特定的符号或关键词,以...

    Java敏感词过滤Java敏感词过滤

    本文将详细解析一个Java实现的敏感词过滤示例,并探讨其工作原理和技术细节。 #### 二、敏感词过滤的基本原理 敏感词过滤技术通常基于两种方式:一种是基于关键字匹配的方式;另一种则是基于规则引擎的方式。本...

    JAVA敏感词过滤

    使用DFA状态机实现敏感词过滤。 使用Java实现

    java 敏感词过滤

    2. **字符串匹配算法**:在Java中,有多种方式来实现敏感词过滤。基本的字符串匹配可以使用`contains()`方法,但这种方法效率较低。更高效的方法包括: - **正则表达式**:可以使用`Pattern`和`Matcher`类来构建...

    java敏感词检索工具

    在Java编程语言中实现敏感词检索,通常涉及到以下几个关键技术点: 1. **数据结构选择**:敏感词库通常包含大量词汇,为了高效地进行查找,会选择合适的数据结构来存储。常见的选择有数组、链表、哈希表(如HashMap...

    Java敏感词过滤源码

    提供的两个Java类很可能是实现敏感词过滤的核心组件。其中一个可能是`SensitiveWordFilter`,负责调用DFA或Trie树算法来过滤文本;另一个可能是`SensitiveWordData`,用于加载和管理敏感词库,可能包括解析敏感词...

Global site tag (gtag.js) - Google Analytics