大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > Java技巧 > Java实现敏感词过滤

Java实现敏感词过滤(2)

关键词:过滤敏感词Java  阅读(3367) 赞(16)

[摘要]本文是对Java实现敏感词过滤的讲解,对学习Java编程技术有所帮助,与大家分享。

运转失掉的hashMap构造如下:

{五={星={红={isEnd=0, 旗={isEnd=1}}, isEnd=0}, isEnd=0}, 中={isEnd=0, 国={isEnd=0, 人={isEnd=1}, 男={isEnd=0, 人={isEnd=1}}}}}

敏感词库我们一个复杂的办法给完成了,那么如何完成检索呢?检索进程无非就是hashMap的get完成,找到就证明该词为敏感词,否则不为敏感词。进程如下:假定我们婚配“中国人民万岁”。

1、第一个字“中”,我们在hashMap中可以找到。失掉一个新的map = hashMap.get("")。

2、假定map == null,则不是敏感词。否则跳至3

3、获取map中的isEnd,经过isEnd能否等于1来判别该词能否为最初一个。假定isEnd == 1表示该词为敏感词,否则跳至1。

经过这个步骤我们可以判别“中国人民”为敏感词,但是假定我们输出“中国女人”则不是敏感词了。

/**
     * 反省文字中能否包括敏感字符,反省规则如下:<br>
     * @author chenming 
     * @date 2014年4月20日 下午4:31:03
     * @param txt
     * @param beginIndex
     * @param matchType
     * @return,假定存在,则前往敏感词字符的长度,不存在前往0
     * @version 1.0
     */
    @SuppressWarnings({ "rawtypes"})
    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){     
            matchFlag = 0;
        }
        return matchFlag;
    }

在文章末尾我提供了运用Java完成敏感词过滤的文件下载。上面是一个测试类来证明这个算法的效率和牢靠性。

public static void main(String[] args) {
        SensitivewordFilter filter = new SensitivewordFilter();
        System.out.println("敏感词的数量:" + filter.sensitiveWordMap.size());
        String string = "太多的伤感情怀也许只局限于豢养基地 荧幕中的情节,主人公尝试着去用某种方式渐渐的很潇洒地释他杀指南怀那些本人阅历的伤感。"
                        + "然后法.轮.功 我们的扮演的角色就是跟随着主人公的喜红客联盟 怒哀乐而过于牵强的把本人的情感也附加于银幕情节中,然后打动就流泪,"
                        + "忧伤就躺在某一集团的怀里纵情的论述心扉或许手机卡复制器一集团一杯红酒一部电影在夜三.级.片 深人静的早晨,翻开电话静静的发愣着。";
        System.out.println("待检测语句字数:" + string.length());
        long beginTime = System.currentTimeMillis();
        Set<String> set = filter.getSensitiveWord(string, 1);
        long endTime = System.currentTimeMillis();
        System.out.println("语句中包括敏感词的个数为:" + set.size() + "。包括:" + set);
        System.out.println("总共耗费工夫为:" + (endTime - beginTime));
    }

运转后果:

2014052300006

从下面的后果可以看出,敏感词库有771个,检测语句长度为184个字符,查出6个敏感词。总共耗时1毫秒。可见速度还是十分可观的。

上面提供两个文档下载:

Desktop.rar(http://pan.baidu.com/s/1o66teGU)外面包括两个Java文件,一个是读取敏感词库(SensitiveWordInit),一个是敏感词工具类(SensitivewordFilter),外面包括了判别能否存在敏感词(isContaintSensitiveWord(String txt,int matchType))、获取敏感词(getSensitiveWord(String txt , int matchType))、敏感词替代(replaceSensitiveWord(String txt,int matchType,String replaceChar))三个办法。

敏感词库:http://pan.baidu.com/s/1pJoGhVP

«上一页12下一页»


相关评论