我想问的不是敏感词过滤的算法,而是以什么方式来进行敏感词过滤。我能想到的几种方式:
第一种,当用户通过前台页面添加信息(如发布评论,发布物品信息之类的),修改信息(如修改物品信息之类的)的时候,调用ajax,把所涉及到的信息传到到后台进行敏感词判断,如果是有敏感词,就禁止发表等等。 这种做法需要把前台所有涉及到增加和修改操作的地方都要加入敏感词判断代码,对每一个用户能输入信息的文本框都需要把里面的内容提取出来,传给后台,工作量有点大。第二种,在后台执行涉及到add和update等业务逻辑的时候,对内容进行过滤。这样也涉及到很多代码,因为好多业务逻辑都可能会修改数据库,工作量也很大。第三种,对数据库进行扫描,这种方式可能对性能消耗较大,而且扫描到有敏感内容时不好处理。另外实时性不强,可能会出问题。这几种方式貌似都不太好,或者是我没想到这些方式下的好办法。另外我比较困惑的是如果发现敏感词,是直接禁止信息发布,还是说先让信息发布,然后把可疑信息存入其他数据库表,由后台工作人员进行专门的人工审核。感觉都很复杂。我想知道目前主流的敏感词过滤解决方案是怎样的,谢谢。
第一种,当用户通过前台页面添加信息(如发布评论,发布物品信息之类的),修改信息(如修改物品信息之类的)的时候,调用ajax,把所涉及到的信息传到到后台进行敏感词判断,如果是有敏感词,就禁止发表等等。 这种做法需要把前台所有涉及到增加和修改操作的地方都要加入敏感词判断代码,对每一个用户能输入信息的文本框都需要把里面的内容提取出来,传给后台,工作量有点大。第二种,在后台执行涉及到add和update等业务逻辑的时候,对内容进行过滤。这样也涉及到很多代码,因为好多业务逻辑都可能会修改数据库,工作量也很大。第三种,对数据库进行扫描,这种方式可能对性能消耗较大,而且扫描到有敏感内容时不好处理。另外实时性不强,可能会出问题。这几种方式貌似都不太好,或者是我没想到这些方式下的好办法。另外我比较困惑的是如果发现敏感词,是直接禁止信息发布,还是说先让信息发布,然后把可疑信息存入其他数据库表,由后台工作人员进行专门的人工审核。感觉都很复杂。我想知道目前主流的敏感词过滤解决方案是怎样的,谢谢。
两个个文件words.properties和KeyWordFilter.java;
1、words.properties文件是个文本文件;内容如下:
敏感词一
敏感词二
敏感词三
2、KeyWordFilter.java是个java文件内容如下:
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class KeyWordFilter
{
private static Pattern pattern = null;
// 从words.properties初始化正则表达式字符串
private static void initPattern()
{
StringBuffer patternBuf = new StringBuffer("");
try
{
InputStream in = KeyWordFilter.class.getClassLoader().getResourceAsStream("words.properties");
Properties pro = new Properties();
pro.load(in);
Enumeration enu = pro.propertyNames();
patternBuf.append("(");
while(enu.hasMoreElements())
{
patternBuf.append((String)enu.nextElement()+"|");
}
patternBuf.deleteCharAt(patternBuf.length()-1);
patternBuf.append(")");
//unix换成UTF-8
//pattern = Pattern.compile(new String(patternBuf.toString().getBytes("ISO-8859-1"), "UTF-8"));
//win下换成gb2312
pattern = Pattern.compile(new String(patternBuf.toString().getBytes("ISO-8859-1"), "gb2312"));
}
catch(IOException ioEx)
{
ioEx.printStackTrace();
}
}
private static String doFilter(String str)
{
Matcher m = pattern.matcher(str);
str = m.replaceAll("");
return str;
}
public static void main(String[] args)
{
String str = "国敏感词一院学位办就敏感词三的报道表示敏感词二";
System.out.println("str:"+str);
initPattern();
Date d1 = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss:SSS Z");
System.out.println("start:"+formatter.format(d1));
System.out.println("共"+str.length()+"个字符,查到" + KeyWordFilter.doFilter(str));
Date d2 = new Date();
System.out.println("end:"+formatter.format(d2));
}
}
输出为:
__________________________________
str:国敏感词一院学位办就敏感词三的报道表示敏感词二
start:星期二, 24 三月 2009 14:50:17:171 +0800
共23个字符,查到国院学位办就的报道表示
end:星期二, 24 三月 2009 14:50:17:531 +0800