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 实现的可以对输入的String进行敏感词的过滤,返回敏感的词
在最近的开发中遇到了敏感词过滤,便去网上查阅了很多敏感词过滤的资料,在这里也和...下面这篇文章主要给大家介绍了关于java利用DFA算法实现敏感词过滤功能的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
Java实现敏感词过滤功能
高效敏感词过滤JAVA实现(DFA算法) 5000字2ms 节点 + 2进制标识(节省空间/提高查询效率) 附源码、注释,附带专业敏感词库(3396个敏感词) 看得上就拿去用,替换下一两处util方法、改个路径即可 不求什么,...
java。dfa算法实现敏感词过滤
java 敏感词过滤的设计思路和技术问题
我们在开发系统或者应用的过程中,经常需要对用户提交的评论或者文章进行审核,对其中的敏感词进行校验或者过滤,本资源可以帮助各位小伙伴以一个简单的方式实现敏感词的过滤,代码精简易懂,可以应用在实际开发过程...
java使用dfa算法实现敏感词过滤,此算法效率最高,附带了一个敏感词库,轻松搞定论坛网站的敏感词过滤问题。
论坛必不可少的敏感词过滤,java实现带敏感词库
对文本中的敏感词过滤 java实现 自定义敏感词
使用DFA状态机实现敏感词过滤。 使用Java实现
一种基于Java Web的敏感词过滤方法研究与实现.pdf
WM算法实现_敏感词过滤,java版本 敏感词库为XML格式
DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。其特征为:有一个有限状态集合和一些从一个状态通向另一个状态的边,每条边上标记有一个符号,其中一个状态是初态,某些状态是终态。...
Java敏感词过滤源码。内附三个文件,敏感词(仅测试),两个类文件(用于功能实现)
本项目是一款高效的Java敏感词过滤系统,基于AC自动机算法实现。系统支持独立部署,同时可便捷集成至注册中心,为各类项目提供敏感词过滤服务。包含文件共117个,其中主要构成如下: - Java源文件:49个 - Class...
基于单模式串和 Trie 树实现的敏感词过滤我们前面几节讲了好几种字符串匹配算法,有 BF 算法、RK 算法、BM 算法、KMP 算法,前面四种算法都是单模式串
springBoot-java敏感词语过滤类
字典树 双数组字典树的-java实现,用于敏感词过滤