IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java过滤敏感词 -> 正文阅读

[Java知识库]java过滤敏感词

1、加载敏感词库的工具类:

package com.mdframework.utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.*;

/**
 *  初始化敏感词库,将敏感词加入到HashMap中,构建DFA算法模型
 *
 *  */
public class SensitiveWordInit {
     private String ENCODING = "GBK";    //字符编码
     private String UTF8 = "utf-8";
        @SuppressWarnings("rawtypes")
        public HashMap sensitiveWordMap;
        public SensitiveWordInit(){
            super();
        }
        @SuppressWarnings("rawtypes")
        public Map initKeyWord(Set<String> set){
            try {
                //读取敏感词库
                Set<String> keyWordSet = readSensitiveWordFile();

//                keyWordSet.add("红客");
//                keyWordSet.add("法轮");
//                keyWordSet.add("手机卡");
                //将敏感词库加入到HashMap中
                addSensitiveWordToHashMap(set);
                //spring获取application,然后application.setAttribute("sensitiveWordMap",sensitiveWordMap);
            } catch (Exception e) {
                e.printStackTrace();
            }
            return sensitiveWordMap;
        }



    //将得到的敏感词库用一个DFA算法模型放到map中
        @SuppressWarnings({ "rawtypes", "unchecked" })
        private void addSensitiveWordToHashMap(Set<String> keyWordSet) {
            sensitiveWordMap = new HashMap(keyWordSet.size());     //初始化敏感词容器,减少扩容操作
            String key = null;
            Map nowMap = null;
            Map<String, String> newWorMap = null;
            //迭代keyWordSet
            Iterator<String> iterator = keyWordSet.iterator();
            while(iterator.hasNext()){
                key = iterator.next();    //关键字
                nowMap = sensitiveWordMap;
                for(int i = 0 ; i < key.length() ; i++){
                    char keyChar = key.charAt(i);       //转换成char型
                    Object wordMap = nowMap.get(keyChar);       //获取

                    if(wordMap != null){        //如果存在该key,直接赋值
                        nowMap = (Map) wordMap;
                    }
                    else{     //不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个
                        newWorMap = new HashMap<String,String>();
                        newWorMap.put("isEnd", "0");     //不是最后一个
                        nowMap.put(keyChar, newWorMap);
                        nowMap = newWorMap;
                    }

                    if(i == key.length() - 1){
                        nowMap.put("isEnd", "1");    //最后一个
                    }
                }
            }
        }

//读取敏感词文件 加到set集合中
        @SuppressWarnings("resource")
        private Set<String> readSensitiveWordFile() throws Exception{
            Set<String> set = null;
             FileInputStream file = new FileInputStream("D:/SensitiveWord.txt");    //读取文件
            InputStreamReader read = new InputStreamReader(file,UTF8);
            try {
                   //文件流是否存在
                    set = new HashSet<String>();
                    BufferedReader bufferedReader = new BufferedReader(read);
                    String s = bufferedReader.readLine();
                    String txt = null;
                        while((txt = bufferedReader.readLine()) != null){    //读取文件,将文件内容放入到set中
                            set.add(txt);

                }
            } catch (Exception e) {
                throw e;
            }finally{
                read.close();     //关闭文件流
            }
            return set;
        }
}

2、对比敏感词库的工具类:

package com.mdframework.utils;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 敏感词过滤
 *
 * */

public class SensitivewordFilter {

    @SuppressWarnings("rawtypes")
    public Map sensitiveWordMap = null;
    public static int minMatchTYpe = 1;      //最小匹配规则
    public static int maxMatchType = 2;      //最大匹配规则
    /**
     * 构造函数,初始化敏感词库
     */
    public SensitivewordFilter(Set<String> set){
        sensitiveWordMap = new SensitiveWordInit().initKeyWord(set);
    }
    /**
     * 判断文字是否包含敏感字符
     * @param txt  文字
     * @param matchType  匹配规则&nbsp;1:最小匹配规则,2:最大匹配规则
     * @return 若包含返回true,否则返回false
     * @version 1.0
     */
    public boolean isContaintSensitiveWord(String txt,int matchType){
        boolean flag = false;
        for(int i = 0 ; i < txt.length() ; i++){
            int matchFlag = this.CheckSensitiveWord(txt, i, matchType); //判断是否包含敏感字符
            if(matchFlag > 0){    //大于0存在,返回true
                flag = true;
            }
        }
        return flag;
    }



    /**
     * 检查文字中是否包含敏感字符,检查规则如下:
     * @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);
//            System.out.println(nowMap);
            nowMap = (Map) nowMap.get(word);     //获取指定key
//            System.out.println(nowMap);
            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;
    }


    /**
     * 获取文字中的敏感词
     *
     * @param matchType 匹配规则&nbsp;1:最小匹配规则,2:最大匹配规则
     * @return
     * @version 1.0
     */
    public Set<String> getSensitiveWord(String txt , int matchType){
        Set<String> sensitiveWordList = new HashSet<String>();

        for(int i = 0 ; i < txt.length() ; i++){
            int length = CheckSensitiveWord(txt, i, matchType);    //判断是否包含敏感字符
            if(length > 0){    //存在,加入list中
                sensitiveWordList.add(txt.substring(i, i+length));
                i = i + length - 1;    //减1的原因,是因为for会自增
            }
        }

        return sensitiveWordList;
    }}

3、测试

package com.mdframework.module.controller.test;

import com.mdframework.utils.SensitiveWordInit;
import com.mdframework.utils.SensitivewordFilter;

import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;

/**
 * @Description TODO
 * @Created by xjx
 */
public class SensitivewordController {
    public static void main(String[] args) {
        Set<String > set = new HashSet<>();
        set.add("红客");
        set.add("手机卡");
        SensitivewordFilter filter = new SensitivewordFilter(set);
        System.out.println("敏感词的数量:" + filter.sensitiveWordMap.size());
        String string = "太多的伤感情怀也许只局限于饲养基地 荧幕中的情节,主人公尝试着去用某种方式渐渐的很潇洒地释自杀指南怀那些自己经历的伤感。"
                + "然后法.轮.功 我们的扮演的角色就是跟随着主人公的喜红客联盟 怒哀乐而过于牵强的把自己的情感也附加于银幕情节中,然后感动就流泪,"
                + "难过就躺在某一个人的怀里尽情的阐述心扉或者手机卡复制器一个人一杯红酒一部电影在夜三.级.片 深人静的晚上,关上电话静静的发呆着。";
        System.out.println("待检测语句字数:" + string.length());
        long beginTime = System.currentTimeMillis();
        Set<String> sensitiveWordSet = filter.getSensitiveWord(string, 1);
        long endTime = System.currentTimeMillis();
        System.out.println("语句中包含敏感词的个数为:" + sensitiveWordSet.size() +","+sensitiveWordSet);
        System.out.println("总共消耗时间为:" + (endTime - beginTime));
    }
}

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-30 12:25:55  更:2021-10-30 12:28:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年10日历 -2024/10/31 21:24:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码