谁有做敏感词过滤的经验

J2EE 码拜 9年前 (2015-04-21) 978次浏览 0个评论
 

现有一个txt格式文档里边存了有3000个敏感词汇(例如:sentive.txt),做一个小的java程序,输入一段文字可以实现比较(这段文字长度大概50多个汉字),如果存在就提示出 改字(词)敏感,用contains的话 太慢了!可不可以多线程比较 或者有更好的算法!

谁有做敏感词过滤的经验
这可以用AC多模匹配算法。

LookThis: https://hkn.eecs.berkeley.edu/~dyoo/java/index.html

谁有做敏感词过滤的经验
新手,求示例代码……
谁有做敏感词过滤的经验
       AhoCorasick tree = new AhoCorasick();
       tree.add("hello".getBytes(), "hello");
       tree.add("world".getBytes(), "world");
       tree.prepare();

       Iterator searcher = tree.search("hello world".getBytes());
       while (searcher.hasNext()) {
           SearchResult result = searcher.next();
           System.out.println(result.getOutputs());
           System.out.println("Found at index: " + result.getLastIndex());
       }
谁有做敏感词过滤的经验
map  reduce
谁有做敏感词过滤的经验
同意一楼,使用AC自动机
谁有做敏感词过滤的经验
25分
这个在系统中应该是经常要用到的吧。
如果是,就应该把这些词全部读出来,用个静态数组保存在内存中

我用initSensitives()方法模拟创建了一些敏感词,你可以改一下把你的文件里面的敏感词都读出来,保存在sensitives数组里面。

package com.zf.test;  



public class TestSearch {  

	String str ;  //要检验的字符串

	String[] sensitives ;  //系统设置的敏感词

	final int threadSize = 10 ;  	//总共线程数量

	Integer completeSize = 0 ;  	//已经完成的线程数量

	boolean tmp = false;   //记录字符串是否属于敏感词

	Object completeLock = new Object();  //同步锁辅助对象

	public TestSearch(String str){  
		this.str = str ;  
		initSensitives(); 
	}  

	//创建敏感词  
	public String[] initSensitives(){  
		sensitives = new String[3000];  
		for (int i = 0; i < 3000 ; i++) {  
			sensitives[i] = "敏感词" + (i + 1);  
		}  
		return sensitives;  
	}  



	//检查词是否铭感  
	public boolean checkStr() throws Exception{  
		int everyLength = sensitives.length / threadSize;   //每条线程匹配的长度  
		for (int i = 0; i < threadSize ; i++) {  
			int start = i * everyLength ;  
			int end = start + everyLength ;  
			if(end > sensitives.length)   
				end = sensitives.length ;  
			new CheckThread(start , end).start();  
		}

		synchronized (completeLock) {  
			while(completeSize < threadSize){  	//保证线程都执行完了
				completeLock.wait();  
			}  
		}  
		return tmp;  
	}  

	//线程判断字符是否属于敏感词
	class CheckThread extends Thread{  
		int startIndex ;  
		int endIndex ;  
		public CheckThread(int startIndex , int endIndex ){  
			this.startIndex = startIndex ;  
			this.endIndex = endIndex;  
		}  

		public void run() {  
			for (int i = startIndex; i < endIndex && !tmp; i++) {  
				if(str.matches(".*"+ sensitives[i] +".*")){  
					tmp = true ;  
				}  
			}  
			synchronized (completeLock) {  
				completeSize++;  
				completeLock.notifyAll();  
				System.out.println("线程" + Thread.currentThread().getName() + "执行完毕");  
			}  
		}  
	}  

    
	public static void main(String[] args) throws Exception {  
		TestSearch ts = new TestSearch("敏感词4");  
		boolean result = ts.checkStr();
		System.out.println(result);
	}  

}  
谁有做敏感词过滤的经验
http://download.csdn.net/detail/javaloverkehui/3849901   

我写的,结合楼上这逼的线程,你可以结合起来修改.修改好了记得上传,把链接发我哦,亲.

谁有做敏感词过滤的经验
10分
引用 6 楼 is_zhoufeng 的回复:

这个在系统中应该是经常要用到的吧。
如果是,就应该把这些词全部读出来,用个静态数组保存在内存中

我用initSensitives()方法模拟创建了一些敏感词,你可以改一下把你的文件里面的敏感词都读出来,保存在sensitives数组里面。

Java code123456789101112131415161718192021222324252627282930……

去哥的资源里看一下,有一个关键词过滤的, 过滤了符号然后判断关键词的.
哥在学校做的,很强大哦,结合线程写个,发给哥

谁有做敏感词过滤的经验
6楼的多线程效率可以
谁有做敏感词过滤的经验
5分
引用 7 楼 javaloverkehui 的回复:

http://download.csdn.net/detail/javaloverkehui/3849901   

我写的,结合楼上这逼的线程,你可以结合起来修改.修改好了记得上传,把链接发我哦,亲.

发现两个bug
bug1:如果是 “去去你ccc妈” 将得到 *去cc**
bug2: 如果是 “连续重复的骂人话只过滤掉第一个”

谁有做敏感词过滤的经验
引用 10 楼 yao752915708 的回复:

引用 7 楼 javaloverkehui 的回复:http://download.csdn.net/detail/javaloverkehui/3849901   

我写的,结合楼上这逼的线程,你可以结合起来修改.修改好了记得上传,把链接发我哦,亲.
发现两个bug
bug1:如果是 “去去你ccc妈” 将得到 *去cc**
bug2: 如果是 “连续重……

你不觉得已经实现了这个功能吗?你觉得过滤之后,还有脏字?

谁有做敏感词过滤的经验
引用 11 楼 javaloverkehui 的回复:

引用 10 楼 yao752915708 的回复:
引用 7 楼 javaloverkehui 的回复:http://download.csdn.net/detail/javaloverkehui/3849901   

我写的,结合楼上这逼的线程,你可以结合起来修改.修改好了记得上传,把链接发我哦,亲.
发现两个bug
bug1:如果是 “去去你ccc妈” 将得到 *去cc**
……

你不信自己试试
测试的时候输入:你大爷的!你大爷的    得到的结果是:****!你大爷的
在楼上多线程例子和你的代码基础上进行整合并修改了上面的两个bug 得到了很高效的敏感词过滤类 分享给大家  http://dl.vmall.com/c0o00zlvak
三十万个敏感词过滤时间不到一秒

谁有做敏感词过滤的经验
引用 10 楼 yao752915708 的回复:

引用 7 楼 javaloverkehui 的回复:
http://download.csdn.net/detail/javaloverkehui/3849901   

我写的,结合楼上这逼的线程,你可以结合起来修改.修改好了记得上传,把链接发我哦,亲.
发现两个bug
bug1:如果是 “去去你ccc妈” 将得到 *去cc**
bug2: 如果是 “连续重复的骂人话只过滤掉第一……

纠正一下:
bug1:如果是 “去去你^^妈” 将得到 *去^^** 正确的结果应该是:去*^^*

谁有做敏感词过滤的经验
http://www.9958.pw/post/web_badword 试试这个

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明谁有做敏感词过滤的经验
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!