`
fhqibjg
  • 浏览: 55102 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

java敏感词全文替换

    博客分类:
  • java
阅读更多

     在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();

	}

 

 

分享到:
评论
3 楼 yuwushen 2013-03-19  
 DFA dfa = new DFA();   
 dfa.createTree(arr );  这个是初始化的时候做的,把他拿出来再计算效率就对了。dfa快很多。  
2 楼 fhqibjg 2013-03-04  
comet927cpu 写道
代码有错误 修改 的if (words[j] != conCharArry[j + i]) {   会出现下标溢出!


嗯嗯,考虑遗漏了写时没注意到
1 楼 comet927cpu 2013-02-25  
代码有错误 修改 的if (words[j] != conCharArry[j + i]) {   会出现下标溢出!

相关推荐

    java敏感词过滤功能

    通常,敏感词过滤器会使用字典树(如Trie树)或者关键词列表来存储敏感词,并提供方法来判断一个字符串是否包含敏感词,或者将敏感词替换为星号等其他字符。 `List.java`:这个文件可能是用于存储敏感词列表的数据...

    JAVA 敏感词过滤

    五、敏感词替换策略 1. 替换为星号:将敏感字符替换为*,如“和谐”变为“****”。 2. 删除敏感词:直接从文本中移除敏感词,留下空白。 3. 加密处理:对敏感词进行加密,只在服务器端解密。 六、Java敏感词过滤库 ...

    java敏感词代码

    "java敏感词代码"指的是用于检测和过滤这类词汇的Java代码实现。这种实现通常会包含一个敏感词词库,包含了社会、政治、法律等方面可能引发不良影响的词汇。 敏感词过滤的核心在于设计一个高效且准确的算法,常见的...

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

    以下是对DFA算法及其在Java敏感词过滤中的应用的详细解释。 ### 一、敏感词过滤的重要性 敏感词过滤的目标是检测和处理用户输入中可能存在的敏感词汇。这可以防止不良信息的传播,维护网络环境的和谐。常见的做法...

    java敏感词屏蔽

    简单的java小程序,屏蔽敏感词

    java敏感词过滤

    这个“java敏感词过滤”项目提供了一种简单且实用的解决方案,它仅包含两个类和一个敏感词文件,使得开发者能够快速理解和应用。下面将详细介绍这两个关键类的工作原理以及如何使用它们。 1. **敏感词过滤算法**: ...

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

    在Java开发中,敏感词过滤是一项重要的功能,尤其在处理用户输入、评论或者社交媒体内容时,需要确保不包含任何可能引发争议或不适当的内容。本项目适用于基于SSM(Spring、SpringMVC、MyBatis)和SpringBoot框架的...

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

    ### Java敏感词过滤技术解析 #### 一、概述 在互联网时代,为了维护网络环境的健康与安全,很多平台都需要对用户输入的信息进行敏感词过滤处理。敏感词过滤技术主要应用于论坛、博客、社交媒体等场景,用以检测并...

    Java敏感词过滤源码

    本资源"Java敏感词过滤源码"提供了一个实现这一功能的Java解决方案,它包含了三个关键文件:一个敏感词库和两个Java类。以下是关于这些知识点的详细解释: 1. **敏感词**: 敏感词是指那些可能引起法律、道德或...

    JAVA敏感词过滤的代码

    算法思路:把敏感词的第一个字符取出来,作为比较对象。遍历整个字符串,如果发现字符跟敏感词第一个字符相同,就从字符串取出跟关键词相同长度的子串比较,如果相同就替换。本算法比较适合敏感词都不长的场合。

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

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

    java 敏感词过滤

    在Java编程环境中,敏感词过滤是一项重要的任务,特别是在处理用户输入、社交媒体监控或者内容审查时。这个主题主要涉及如何在文本中检测并移除或替换指定的敏感词汇,以确保内容的安全性和合规性。以下是对这个知识...

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

    本篇将重点介绍如何使用Java实现基于DFA(Deterministic Finite Automaton,确定有限状态自动机)算法的敏感词过滤。 首先,DFA算法是一种图论概念,它可以被视作一种特殊的有向图,每个节点代表一个状态,每条边...

    基于多种敏感词过滤算法的Java敏感词过滤设计源码

    该项目是一款基于Java实现的敏感词过滤系统源码,包含60个文件,其中Java源文件41个,支持多种敏感词过滤算法,包括TTMP、DFA、DAT、hash bucket和Tire算法。系统提供文本高亮、过滤、判词、替换的接口支持,适用于...

    java实现敏感词过滤

    - 如果找到匹配项,使用`Matcher.replaceAll()`函数,将每个敏感词替换为星号(*)或其他指定字符。 2. **字节流遍历**: - 对于较大或者更复杂的敏感词库,正则表达式可能会效率较低。这时,可以使用字节流遍历的...

    JAVA过滤敏感词

    这个"JAVA过滤敏感词"项目提供了一个自我实现的解决方案,帮助开发者实现在文本中检测并替换或移除敏感词汇。下面我们将深入探讨这个话题。 首先,我们需要了解什么是敏感词过滤。敏感词过滤是指在文本数据处理中,...

    WordFilterUtil_java_敏感词_

    - **处理策略**:一旦找到敏感词,可以使用StringBuilder或StringBuffer类来替换字符,或将整个敏感词替换为预先设定的字符或字符串。 - **多线程优化**:对于大量文本处理,可以考虑使用多线程来并行处理,提高...

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

    系统基于B/S结构的Java Web分层框架结构进行设计,使得系统能够在用户无感知的情况下自动阻断含有敏感词的聊天内容提交,并将敏感词替换为指定的特殊符号。系统架构设计合理,符合现代Web应用开发的趋势,能够确保...

Global site tag (gtag.js) - Google Analytics