在csdn上看到一篇DFA算法替换敏感词的全文替换文章,同时也看到网上不少文章说对于这种敏感词功能替换无疑DFA是一种效率不错的实现。
下面是基本FDA实现的java代码
public class DFA { private Node rootNode = new Node('R'); private int a = 0; private StringBuilder strWord = new StringBuilder(); public void searchWord(String content) { char[] chars =content.toCharArray(); Node node = rootNode; while(a<chars.length) { node = findNode(node,chars[a]); if(node == null){ node = rootNode; strWord.append(chars[a]); }else{ strWord.append("*"); } a++; } } public void createTree() { for(String str : arr) { char[] chars = str.toCharArray(); if(chars.length > 0) insertNode(rootNode, chars, 0); } } private void insertNode(Node node, char[] cs, int index) { Node n = findNode(node, cs[index]); if(n == null) { n = new Node(cs[index]); node.nodes.add(n); } if(index == (cs.length-1)) n.flag = 1; index++; if(index<cs.length) insertNode(n, cs, index); } private Node findNode(Node node, char c) { List<Node> nodes = node.nodes; Node rn = null; for(Node n : nodes) { if(n.c==c) { rn = n; break; } } return rn; } private static class Node { public char c; public int flag; //1:表示终结,0:延续 这里只替换成*所以用不着 public List<Node> nodes = new ArrayList<Node>(); public Node(char c) { this.c = c; this.flag = 0; } public Node(char c, int flag) { this.c = c; this.flag = flag; } } }
下面是自己写的用Map实现的一段替换代码
public String replaceAllWord(String[] arr,String content){
char conCharArry[] = content.toCharArray();
//这里key为每个敏感词的第一个字符,里面放着第一个字符相同的敏感词list集合
Map<Character, List<String>> word = new HashMap<Character, List<String>>();
//遍历数组生成敏感词map对象
for(String str : arr){
char key = str.charAt(0);
List<String> list = word.get(key);
if(list == null){
list = new ArrayList<String>();
list.add(str);
word.put(key, list);
}else{
list.add(str);
}
}
//对内容每一个字符进行遍历,如果当前字符为敏感词的首字符则进行下面行为否则continue本次操作
for(int i = 0 ; i < conCharArry.length; i++){
List<String> list = word.get(conCharArry[i]);
if(list == null){
continue;
}
for(String str : list){
char words[] = str.toCharArray();
//对是否匹配一个完整的敏感词进行标志,如果匹配敏感词过程中有一个字符不符则标注为false
boolean mark = true;
for(int j = 0; j < words.length; j++){
if(j + i <= conCharArry.length && words[j] != conCharArry[j+i]){
mark = false;
break;
}
}
//把敏感词逐个替换成*
if(mark){
for(int j = 0; j < words.length; j++){
conCharArry[i++] = '*';
}
}
}
}
return new String(conCharArry);
}
当我们在main函数中测试代码
public static void main(String[] args) { String[] arr = {"tmd", "小姐", "DA"}; String content = "tmd ITeye文章版权属于作者,受法律保护 Da 小姐" long start = System.currentTimeMillis(); for(int i = 0; i < 10000 ; i++){ DFA dfa = new DFA(); dfa.createTree(arr ); dfa.searchWord(); //dfa.replaseAllword(arr,content); } long end =System.currentTimeMillis(); System.out.println(end - start); }
测试结果
DFA实现:45毫秒
Map实现:16毫秒
当把替换类型加至11220字、敏感字词数组增至十来个时
DFA实现:16903毫秒
Map实现:4758毫秒
这里DFA效率不如下面的hash实现的疑惑还请各位指点下。
ps:
加一段备用修改后的代码(properties配制)
@SuppressWarnings("unchecked") public String replaceWordStr(String content) { char conCharArry[] = content.toCharArray(); StringBuffer sb = new StringBuffer(); // 这里key为每个敏感词的第一个字符,里面放着第一个字符相同的敏感词list集合 Map<Character, List<String>> word = new HashMap<Character, List<String>>(); // 遍历数组生成敏感词map对象 for (Entry entry : properties.entrySet()) { String keyWrod = entry.getKey().toString(); char key = "".equals(keyWrod) ? ' ' : keyWrod.charAt(0); List<String> list = word.get(key); if (list == null) { list = new ArrayList<String>(); list.add(keyWrod); word.put(key, list); } else { list.add(keyWrod); } } // 对内容每一个字符进行遍历,如果当前字符为敏感词的首字符则进行下面行为否则continue本次操作 for (int i = 0; i < conCharArry.length; i++) { List<String> list = word.get(conCharArry[i]); if (list == null) { sb.append(conCharArry[i]); continue; } for (String str : list) { char words[] = str.toCharArray(); // 对是否匹配一个完整的敏感词进行标志,如果匹配敏感词过程中有一个字符不符则标注为false boolean mark = true; for (int j = 0; j < words.length; j++) { if (j + i <= conCharArry.length && words[j] != conCharArry[j + i]) { mark = false; break; } } // 把敏感词逐个替换 if (mark) { sb.append(properties.get(str)); for (int j = 1; j < words.length; j++) { i++; } } else { sb.append(conCharArry[i]); } } } return sb.toString(); }
相关推荐
通常,敏感词过滤器会使用字典树(如Trie树)或者关键词列表来存储敏感词,并提供方法来判断一个字符串是否包含敏感词,或者将敏感词替换为星号等其他字符。 `List.java`:这个文件可能是用于存储敏感词列表的数据...
五、敏感词替换策略 1. 替换为星号:将敏感字符替换为*,如“和谐”变为“****”。 2. 删除敏感词:直接从文本中移除敏感词,留下空白。 3. 加密处理:对敏感词进行加密,只在服务器端解密。 六、Java敏感词过滤库 ...
"java敏感词代码"指的是用于检测和过滤这类词汇的Java代码实现。这种实现通常会包含一个敏感词词库,包含了社会、政治、法律等方面可能引发不良影响的词汇。 敏感词过滤的核心在于设计一个高效且准确的算法,常见的...
以下是对DFA算法及其在Java敏感词过滤中的应用的详细解释。 ### 一、敏感词过滤的重要性 敏感词过滤的目标是检测和处理用户输入中可能存在的敏感词汇。这可以防止不良信息的传播,维护网络环境的和谐。常见的做法...
简单的java小程序,屏蔽敏感词
这个“java敏感词过滤”项目提供了一种简单且实用的解决方案,它仅包含两个类和一个敏感词文件,使得开发者能够快速理解和应用。下面将详细介绍这两个关键类的工作原理以及如何使用它们。 1. **敏感词过滤算法**: ...
在Java开发中,敏感词过滤是一项重要的功能,尤其在处理用户输入、评论或者社交媒体内容时,需要确保不包含任何可能引发争议或不适当的内容。本项目适用于基于SSM(Spring、SpringMVC、MyBatis)和SpringBoot框架的...
### Java敏感词过滤技术解析 #### 一、概述 在互联网时代,为了维护网络环境的健康与安全,很多平台都需要对用户输入的信息进行敏感词过滤处理。敏感词过滤技术主要应用于论坛、博客、社交媒体等场景,用以检测并...
本资源"Java敏感词过滤源码"提供了一个实现这一功能的Java解决方案,它包含了三个关键文件:一个敏感词库和两个Java类。以下是关于这些知识点的详细解释: 1. **敏感词**: 敏感词是指那些可能引起法律、道德或...
算法思路:把敏感词的第一个字符取出来,作为比较对象。遍历整个字符串,如果发现字符跟敏感词第一个字符相同,就从字符串取出跟关键词相同长度的子串比较,如果相同就替换。本算法比较适合敏感词都不长的场合。
高效敏感词过滤JAVA实现(DFA算法) 5000字2ms 节点 + 2进制标识(节省空间/提高查询效率) 附源码、注释,附带专业敏感词库(3396个敏感词) 看得上就拿去用,替换下一两处util方法、改个路径即可 不求什么,...
在Java编程环境中,敏感词过滤是一项重要的任务,特别是在处理用户输入、社交媒体监控或者内容审查时。这个主题主要涉及如何在文本中检测并移除或替换指定的敏感词汇,以确保内容的安全性和合规性。以下是对这个知识...
本篇将重点介绍如何使用Java实现基于DFA(Deterministic Finite Automaton,确定有限状态自动机)算法的敏感词过滤。 首先,DFA算法是一种图论概念,它可以被视作一种特殊的有向图,每个节点代表一个状态,每条边...
该项目是一款基于Java实现的敏感词过滤系统源码,包含60个文件,其中Java源文件41个,支持多种敏感词过滤算法,包括TTMP、DFA、DAT、hash bucket和Tire算法。系统提供文本高亮、过滤、判词、替换的接口支持,适用于...
- 如果找到匹配项,使用`Matcher.replaceAll()`函数,将每个敏感词替换为星号(*)或其他指定字符。 2. **字节流遍历**: - 对于较大或者更复杂的敏感词库,正则表达式可能会效率较低。这时,可以使用字节流遍历的...
这个"JAVA过滤敏感词"项目提供了一个自我实现的解决方案,帮助开发者实现在文本中检测并替换或移除敏感词汇。下面我们将深入探讨这个话题。 首先,我们需要了解什么是敏感词过滤。敏感词过滤是指在文本数据处理中,...
- **处理策略**:一旦找到敏感词,可以使用StringBuilder或StringBuffer类来替换字符,或将整个敏感词替换为预先设定的字符或字符串。 - **多线程优化**:对于大量文本处理,可以考虑使用多线程来并行处理,提高...
系统基于B/S结构的Java Web分层框架结构进行设计,使得系统能够在用户无感知的情况下自动阻断含有敏感词的聊天内容提交,并将敏感词替换为指定的特殊符号。系统架构设计合理,符合现代Web应用开发的趋势,能够确保...