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 小米 华为 单反 装机 图拉丁
 
   -> 开发测试 -> DFA算法简易敏感词工具和url转file文件工具 -> 正文阅读

[开发测试]DFA算法简易敏感词工具和url转file文件工具

简易敏感词工具

package com.benwunet.bks.util;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

import java.util.Map;

public class SensitiveFilterService {


        private Map sensitiveWordMap = null;

        // 最小匹配规则
        public static int minMatchType = 1;

        // 最大匹配规则
        public static int maxMatchType = 2;

        // 单例
        private static SensitiveFilterService instance = null;

        // 构造函数,初始化敏感词库
        private SensitiveFilterService() {
            sensitiveWordMap = new SensitiveWordInit().initKeyWord();
        }

        // 获取单例
        public static SensitiveFilterService getInstance() {
            if (null == instance) {
                instance = new SensitiveFilterService();
            }
            return instance;
        }

        // 获取文字中的敏感词
        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);
                // 存在,加入list中
                if (length > 0) {
                    sensitiveWordList.add(txt.substring(i, i + length));
                    // 减1的原因,是因为for会自增
                    i = i + length - 1;
                }
            }

            return sensitiveWordList;
        }

        /**
         * 替换敏感字字符
         *
         * @param txt
         * @param matchType
         * @param replaceChar
         * @return
         */
        public String replaceSensitiveWord(String txt, int matchType,
                                           String replaceChar) {
            String resultTxt = txt;
            // 获取所有的敏感词
            Set<String> set = getSensitiveWord(txt, matchType);
            Iterator<String> iterator = set.iterator();
            String word = null;
            String replaceString = null;
            while (iterator.hasNext()) {
                word = iterator.next();
                replaceString = getReplaceChars(replaceChar, word.length());
                resultTxt = resultTxt.replaceAll(word, replaceString);
            }
            return resultTxt;
        }

        /**
         * 获取替换字符串
         *
         * @param replaceChar
         * @param length
         * @return
         */
        private String getReplaceChars(String replaceChar, int length) {
            String resultReplace = replaceChar;
            for (int i = 1; i < length; i++) {
                resultReplace += replaceChar;
            }
            return resultReplace;
        }


        /**
         * 检查文字中是否包含敏感字符,检查规则如下:<br>
         * 如果存在,则返回敏感词字符的长度,不存在返回0
         *
         * @param txt
         * @param beginIndex
         * @param matchType
         * @return
         */
        public int CheckSensitiveWord(String txt, int beginIndex, int matchType) {

            // 敏感词结束标识位:用于敏感词只有1位的情况
            boolean flag = false;
            // 匹配标识数默认为0
            int matchFlag = 0;
            Map nowMap = sensitiveWordMap;
            for (int i = beginIndex; i < txt.length(); i++) {
                char word = txt.charAt(i);
                // 获取指定key
                nowMap = (Map) nowMap.get(word);

                // 存在,则判断是否为最后一个
                if (nowMap != null) {

                    // 找到相应key,匹配标识+1
                    matchFlag++;
                    // 如果为最后一个匹配规则,结束循环,返回匹配标识数
                    if ("1".equals(nowMap.get("isEnd"))) {
                        // 结束标志位为true
                        flag = true;
                        // 最小规则,直接返回,最大规则还需继续查找
                        if (SensitiveFilterService.minMatchType == matchType) {
                            break;
                        }
                    }
                } else {
                    // 不存在,直接返回
                    break;
                }
            }
            if (SensitiveFilterService.maxMatchType == matchType) {
                //长度必须大于等于1,为词
                if (matchFlag < 2 || !flag) {
                    matchFlag = 0;
                }
            }
            if (SensitiveFilterService.minMatchType == matchType) {
                //长度必须大于等于1,为词
                if (matchFlag < 2 && !flag) {
                    matchFlag = 0;
                }
            }
            return matchFlag;
        }
    }

package com.benwunet.bks.util;

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

/**
 * @description 屏蔽敏感词初始化
 **/
public class SensitiveWordInit {



	// 字符编码
	private String ENCODING = "UTF-8";
	// 初始化敏感字库
	public Map initKeyWord() {
		// 读取敏感词库 ,存入Set中
		Set<String> wordSet = readSensitiveWordFile();
		// 将敏感词库加入到HashMap中//确定有穷自动机DFA
		return addSensitiveWordToHashMap(wordSet);
	}
	/**
	 *      * 读取敏感词库,将敏感词放入HashSet中,构建一个DFA算法模型:<br>
	 *      * 中 = {
	 *      *      isEnd = 0
	 *      *      国 = {
	 *      *           isEnd = 1
	 *      *           人 = {isEnd = 0
	 *      *                民 = {isEnd = 1}
	 *      *                }
	 *      *           男  = {
	 *      *                  isEnd = 0
	 *      *                   人 = {
	 *      *                        isEnd = 1
	 *      *                       }
	 *      *               }
	 *      *           }
	 *      *      }
	 *      *  五 = {
	 *      *      isEnd = 0
	 *      *      星 = {
	 *      *          isEnd = 0
	 *      *          红 = {
	 *      *              isEnd = 0
	 *      *              旗 = {
	 *      *                   isEnd = 1
	 *      *                  }
	 *      *              }
	 *      *          }
	 *      *      }
	 *      * @param keyWordSet  敏感词库
	 *
	 */
	/**
	 * 读取敏感词库 ,存入HashMap中
	 * @return
	 */
	private Set<String> readSensitiveWordFile() {
		Set<String> wordSet = null;
		// app为项目地址
		/*
		 * String app = System.getProperty("user.dir"); System.out.println(app);
		 * URL resource = Thread.currentThread().getContextClassLoader()
		 * .getResource("/"); String path = resource.getPath().substring(1);
		 * System.out.println(path); File file = new File(path +
		 * "censorwords.txt");
		 */
		File file = null;
		try {
			//通过url获取敏感词库
			 file = UrlToFileUtil.urlToFile("https://***********/phic.txt");
//			file = new File(
//					"D:\\JAVA\\bks_v2.2\\bks\\project\\bks-project\\bks-applet-center\\src\\main\\resources\\phic.txt");
		}catch (Exception e) {
          e.printStackTrace();
		}

		try {
			// 读取文件输入流
			InputStreamReader read = new InputStreamReader(new FileInputStream(file), ENCODING);
			// 文件是否是文件 和 是否存在
			if (file.isFile() && file.exists()) {
				wordSet = new HashSet<String>();
				// StringBuffer sb = new StringBuffer();
				// BufferedReader是包装类,先把字符读到缓存里,到缓存满了,再读入内存,提高了读的效率。
				BufferedReader br = new BufferedReader(read);
				String txt = null;
				// 读取文件,将文件内容放入到set中
				while ((txt = br.readLine()) != null) {
					wordSet.add(txt);
				}
				br.close();

				/*
				 * String str = sb.toString(); String[] ss = str.split(","); for
				 * (String s : ss) { wordSet.add(s); }
				 */
			}
			// 关闭文件流
			read.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return wordSet;
	}


	/**
	 * 将HashSet中的敏感词,存入HashMap中
	 * @param wordSet
	 * @return
	 */
	private Map addSensitiveWordToHashMap(Set<String> wordSet) {

		// 初始化敏感词容器,减少扩容操作
		Map wordMap = new HashMap(wordSet.size());
		for (String word : wordSet) {
			Map nowMap = wordMap;
			for (int i = 0; i < word.length(); i++) {
				// 转换成char型
				char keyChar = word.charAt(i);
				// 获取
				Object tempMap = nowMap.get(keyChar);
				// 如果存在该key,直接赋值
				if (tempMap != null) {
					nowMap = (Map) tempMap;
				} else {
					// 不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个
					// 设置标志位
					Map<String, String> newMap = new HashMap<String, String>();
					newMap.put("isEnd", "0");
					// 添加到集合
					nowMap.put(keyChar, newMap);
					nowMap = newMap;
				}
				// 最后一个
				if (i == word.length() - 1) {
					nowMap.put("isEnd", "1");
				}
			}
		}
		return wordMap;
	}


}

urlTofile工具类

package com.benwunet.bks.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;

public class UrlToFileUtil {

    /**
     * 将url转换成文件
     * @param url
     * @return
     * @throws Exception
     */
    public static File  urlToFile(String url)throws Exception{
        //对本地文件命名
        String fileName = url.substring(url.lastIndexOf("."),url.length());
        File file = null;

        URL urlfile;
        InputStream inStream = null;
        OutputStream os = null;
        try {
            file = File.createTempFile("net_url", fileName);
            //下载
            urlfile = new URL(url);
            inStream = urlfile.openStream();
            os = new FileOutputStream(file);

            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os) {
                    os.close();
                }
                if (null != inStream) {
                    inStream.close();
                }

            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        return file;
    }


}

测试用例

package com.benwunet.bks;

import com.benwunet.bks.util.SensitiveFilterService;

public class SensitiveWordTest {
    public static void main(String[] args) throws Exception {
        //需要屏蔽哪些字就在censorword.txt文档内添加即可
        SensitiveFilterService filter = SensitiveFilterService.getInstance();
        String txt = "xx需要进行检测的字符串_____________________狗杂种";
        //如果需要过滤则用“”替换
        //如果需要屏蔽,则用“*”替换
        String hou = filter.replaceSensitiveWord(txt, 1, "*");
        System.out.println("替换前的文字为:" + txt);
        System.out.println("替换后的文字为:" + hou);
    }

}

测试结果
在这里插入图片描述
敏感词库

  开发测试 最新文章
pytest系列——allure之生成测试报告(Wind
某大厂软件测试岗一面笔试题+二面问答题面试
iperf 学习笔记
关于Python中使用selenium八大定位方法
【软件测试】为什么提升不了?8年测试总结再
软件测试复习
PHP笔记-Smarty模板引擎的使用
C++Test使用入门
【Java】单元测试
Net core 3.x 获取客户端地址
上一篇文章      下一篇文章      查看所有文章
加:2021-08-19 12:21:43  更:2021-08-19 12:22:35 
 
开发: 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年11日历 -2024/11/17 20:33:42-

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