• 请加作者QQ或者微信联系。作者QQ:524100248,微信号:sendtion。

网站敏感词过滤的实现(附敏感词库)

html+css sendtion 9个月前 (07-10) 1965次浏览 已收录 21个评论 扫描二维码

现在基本上所有的网站都需要设置敏感词过滤,z 似乎已经成了一个网站的标配,如果你的网站没有,或者你没有做相应的处理,那么小心相关部门请你喝茶哦。
最近在调研 Java web 网站的敏感词过滤的实现,网上找了相关资料,经过我的验证,把我的调研结果写出来,供大家参考。

一、敏感词过滤工具类

把敏感词词库内容加载到 ArrayList 集合中,通过双层循环,查找与敏感词列表相匹配的字符串,如果找到以*号替换,最终得到替换后的字符串。

此种方式匹配度较高,匹配速度良好。

初始化敏感词库

//初始化敏感词库
public void InitializationWork()  
{  
    replaceAll = new StringBuilder(replceSize);  
    for(int x=0;x < replceSize;x++)  
    {  
        replaceAll.append(replceStr);  
    }  
    //加载词库  
    arrayList = new ArrayList<String>();  
    InputStreamReader read = null;  
    BufferedReader bufferedReader = null;  
    try {  
        read = new InputStreamReader(SensitiveWord.class.getClassLoader().getResourceAsStream(fileName),encoding);  
        bufferedReader = new BufferedReader(read);  
        for(String txt = null;(txt = bufferedReader.readLine()) != null;){  
            if(!arrayList.contains(txt))  
                arrayList.add(txt);  
        }  
    } catch (UnsupportedEncodingException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }finally{  
        try {  
            if(null != bufferedReader)  
            bufferedReader.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        try {  
            if(null != read)  
            read.close();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
    }  
}

过滤敏感词信息

public String filterInfo(String str)  
{      
    sensitiveWordSet = new HashSet<String>();
    sensitiveWordList= new ArrayList<>();
    StringBuilder buffer = new StringBuilder(str);  
    HashMap<Integer, Integer> hash = new HashMap<Integer, Integer>(arrayList.size());  
    String temp;  
    for(int x = 0; x < arrayList.size();x++)  
    {  
        temp = arrayList.get(x);  
        int findIndexSize = 0;  
        for(int start = -1;(start=buffer.indexOf(temp,findIndexSize)) > -1;)  
        {  
            //System.out.println("###replace="+temp);
            findIndexSize = start+temp.length();//从已找到的后面开始找  
            Integer mapStart = hash.get(start);//起始位置  
            if(mapStart == null || (mapStart != null && findIndexSize > mapStart))//满足 1 个,即可更新 map  
            {  
                hash.put(start, findIndexSize); 
                //System.out.println("###敏感词:"+buffer.substring(start, findIndexSize));
            }  
        }  
    }  
    Collection<Integer> values = hash.keySet();  
    for(Integer startIndex : values)  
    {  
        Integer endIndex = hash.get(startIndex);  
        //获取敏感词,并加入列表,用来统计数量
        String sensitive = buffer.substring(startIndex, endIndex);
        //System.out.println("###敏感词:"+sensitive);
        if (!sensitive.contains("*")) {//添加敏感词到集合
            sensitiveWordSet.add(sensitive);
            sensitiveWordList.add(sensitive);
}
        buffer.replace(startIndex, endIndex, replaceAll.substring(0,endIndex-startIndex));
    }  
    hash.clear();  
    return buffer.toString();  
}

下载地址:SensitiveWord
链接: http://pan.baidu.com/s/1skMos8l 密码: szqk

二、Java 关键词过滤

这个方式采用的是正则表达式匹配,速度上比第一种稍慢,匹配度良好。

主要代码:

// 从 words.properties 初始化正则表达式字符串
private static void initPattern() {
    StringBuffer patternBuffer = new StringBuffer();
    try {
        //words.properties
        InputStream in = KeyWordFilter.class.getClassLoader().getResourceAsStream("keywords.properties");
        Properties property = new Properties();
        property.load(in);
        Enumeration<?> enu = property.propertyNames();
        patternBuffer.append("(");
        while (enu.hasMoreElements()) {
            String scontent = (String) enu.nextElement();
            patternBuffer.append(scontent + "|");
            //System.out.println(scontent);
            keywordsCount ++;
        }
        patternBuffer.deleteCharAt(patternBuffer.length() - 1);
        patternBuffer.append(")");
        //System.out.println(patternBuffer);
        // 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"));
        // 装换编码
        pattern = Pattern.compile(patternBuffer.toString());
    } catch (IOException ioEx) {
        ioEx.printStackTrace();
    }
}

private static String doFilter(String str) {
    Matcher m = pattern.matcher(str);
//        while (m.find()) {// 查找符合 pattern 的字符串
//            System.out.println("The result is here :" + m.group());
//        }
    // 选择替换方式,这里以* 号代替
    str = m.replaceAll("*");
    return str;
}

下载地址:KeyWordFilter
链接: http://pan.baidu.com/s/1kVBl803 密码: xi24

三、DFA 算法进行过滤

这种方式听起来高大上,采用 DFA 算法,这个算法个人不太懂,经测试发现,匹配度不行,速度良好。或许可以改良,还请大神进行改良。

主要有两个文件:SensitivewordFilter.java 和 SensitiveWordInit.java

主要代码:

public int CheckSensitiveWord(String txt,int beginIndex,int matchType){
    boolean  flag = false;    //敏感词结束标识位:用于敏感词只有 1 位的情况
    int matchFlag = 0;     //匹配标识数默认为 0
    char word = 0;
    Map nowMap = sensitiveWordMap;
    for(int i = beginIndex; i < txt.length() ; i++){
        word = txt.charAt(i);
        nowMap = (Map) nowMap.get(word);     //获取指定 key
        if(nowMap != null){     //存在,则判断是否为最后一个
            matchFlag++;     //找到相应 key,匹配标识+1 
            if("1".equals(nowMap.get("isEnd"))){       //如果为最后一个匹配规则,结束循环,返回匹配标识数
                flag = true;       //结束标志位为 true   
                if(SensitivewordFilter.minMatchTYpe == matchType){    //最小规则,直接返回,最大规则还需继续查找
                    break;
                }
            }
        }
        else{     //不存在,直接返回
            break;
        }
    }
    if(matchFlag < 2 || !flag){        //长度必须大于等于 1,为词 
        matchFlag = 0;
    }
    return matchFlag;
}

下载地址:SensitivewordFilter
链接: http://pan.baidu.com/s/1ccsa66 密码: mc1x

四、多叉树查找算法

这个方式采用了多叉树查找算法,至于这个算法是怎么回事,大家可以去查看数据结构相关内容。提供了 jar 包,直接调用进行过滤。

经测试,这个方法匹配度良好,速度稍慢。

调用方式:

//敏感词过滤
FilteredResult result = WordFilterUtil.filterText(str, '*');
//获取过滤后的内容
System.out.println("替换后的字符串为:\n"+result.getFilteredContent());
//获取原始字符串
System.out.println("原始字符串为:\n"+result.getOriginalContent());
//获取替换的敏感词
System.out.println("替换的敏感词为:\n"+result.getBadWords());

下载地址:WordFilterUtil
链接: http://pan.baidu.com/s/1nvftzeD 密码: 5t2h

以上就是我的调研结果,希望对大家有所帮助。

最后,附上大量敏感词库下载地址
链接: http://pan.baidu.com/s/1boWQvr5 密码: 4nyc


参考了以下文章:

其他


乐趣公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:网站敏感词过滤的实现(附敏感词库)
喜欢 (6)
[sendtion@163.com]
分享 (0)
sendtion
关于作者:
一个不断奋斗追逐梦想的少年~
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(21)个小伙伴在吐槽
  1. 鸟儿叫,花儿笑,一年一季春来到!
    趣头条2018-02-08 11:04 回复 Windows 7 | 搜狗浏览器 2.X
  2. 新春佳节到。祝好!祝好!
    屌炸天2018-02-05 16:51 回复 Windows 7 | 搜狗浏览器 2.X
  3. 不错不错!内容感觉好极了!
    xing19822018-02-04 14:42 回复 Windows 7 | 搜狗浏览器 2.X
  4. 嗨、我是K 这个是我到新站,推荐一下,可以下载百度文库哟~~~~文件库到访www.v977.com
    文件库2018-02-03 10:46 回复 Windows 7 | Internet Explorer 9.0
  5. 不错!不错!感觉好极了!
    闺房独自乐2018-01-31 15:15 回复 Windows 7 | 搜狗浏览器 2.X
  6. 博客还真是个好东西!
    11638488992018-01-28 08:41 回复 Windows 7 | 搜狗浏览器 2.X
  7. 转眼又是新一年,博主万事如意不差钱!
    民间秘术2018-01-22 06:36 回复 Windows 7 | 搜狗浏览器 2.X
  8. 我有强迫症,看到好文就想顶!
    创业网2018-01-15 11:02 回复 Windows 7 | 搜狗浏览器 2.X
  9. 毫无疑问,这个是要支持的!
    套图网2018-01-08 15:27 回复 Windows 7 | 搜狗浏览器 2.X
  10. 新年好呀,新年好呀,祝福博主新年好!
    八达网2018-01-02 19:06 回复 Windows 7 | 搜狗浏览器 2.X
  11. 博客大好,让人忘不了!
    菏泽夜生活论坛2017-12-29 09:17 回复 Windows 7 | 搜狗浏览器 2.X
  12. 这样的博客让人禁不住一天来几次!
    促美优品2017-12-18 15:44 回复 Windows 7 | 搜狗浏览器 2.X
  13. 这样精彩的博客越来越少咯!
    中青看点2017-12-15 14:21 回复 Windows 7 | 搜狗浏览器 2.X
  14. 一言不发岂能证明我来过了?!
    中医秘方2017-12-10 20:04 回复 Windows 7 | 搜狗浏览器 2.X
  15. 山高路远,好人平安!
    健康网2017-12-08 14:10 回复 Windows 7 | 搜狗浏览器 2.X
  16. 一天不来访,浑身上下痒!
    小吃技术2017-11-27 11:27 回复 Windows 7 | 搜狗浏览器 2.X
  17. 冬天虽已来临,祝您四季如春!
    创业网2017-11-21 08:45 回复 Windows 7 | 搜狗浏览器 2.X
  18. 潜心学习,认真拜读!
    三五创业网2017-11-16 16:55 回复 Windows 7 | 搜狗浏览器 2.X
  19. 学海无涯,博客有道!拜读咯!
    健康网2017-10-26 08:24 回复 Windows 7 | 搜狗浏览器 2.X
  20. 不止一次的来,不止一次的去,来来去去,这就是这个博客的魅力!
    套图网2017-10-24 07:23 回复 Windows 7 | 搜狗浏览器 2.X
  21. 阅读博客获得的进步不亚于阅读一本书。
    套图网2017-10-20 08:39 回复 Windows 7 | 搜狗浏览器 2.X