Java实现DFA算法进行敏感词过滤
创始人
2024-01-20 09:09:04
0

 一、敏感词过滤数据文件

    https://github.com/jkiss/sensitive-words

   代码图数据文件如下:

二、敏感词实现原理基于二叉树排序

首先:query 日 ---> {本}、query 本 --->{人、鬼子}、query 人 --->{null}、query 鬼 ---> {子}。形如下结构:

 三、敏感词过滤代码

封装工具类如下:

使用前需对敏感词库进行初始化: SensitiveWordUtil.init(sensitiveWordSet);

package cn.swfilter.util;import java.util.*;/*** 敏感词处理工具 - DFA算法实现** @author sam* @since 2017/9/4*/
public class SensitiveWordUtil { /** * 敏感词匹配规则 */ public static final int MinMatchTYpe = 1; //最小匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国]人 public static final int MaxMatchType = 2; //最大匹配规则,如:敏感词库["中国","中国人"],语句:"我是中国人",匹配结果:我是[中国人] /** * 敏感词集合 */ public static HashMap sensitiveWordMap; /** * 初始化敏感词库,构建DFA算法模型 * * @param sensitiveWordSet 敏感词库 */ public static synchronized void init(Set sensitiveWordSet) { initSensitiveWordMap(sensitiveWordSet); } /** * 初始化敏感词库,构建DFA算法模型 * * @param sensitiveWordSet 敏感词库 */ private static void initSensitiveWordMap(Set sensitiveWordSet) { //初始化敏感词容器,减少扩容操作 sensitiveWordMap = new HashMap(sensitiveWordSet.size()); String key; Map nowMap; Map newWorMap; //迭代sensitiveWordSet Iterator iterator = sensitiveWordSet.iterator(); while (iterator.hasNext()) { //关键字 key = iterator.next(); nowMap = sensitiveWordMap; for (int i = 0; i < key.length(); i++) { //转换成char型 char keyChar = key.charAt(i); //库中获取关键字 Object wordMap = nowMap.get(keyChar); //如果存在该key,直接赋值,用于下一个循环获取 if (wordMap != null) { nowMap = (Map) wordMap; } else { //不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个 newWorMap = new HashMap<>(); //不是最后一个 newWorMap.put("isEnd", "0"); nowMap.put(keyChar, newWorMap); nowMap = newWorMap; } if (i == key.length() - 1) { //最后一个 nowMap.put("isEnd", "1"); } } } } /** * 判断文字是否包含敏感字符 * * @param txt 文字 * @param matchType 匹配规则 1:最小匹配规则,2:最大匹配规则 * @return 若包含返回true,否则返回false */ public static boolean contains(String txt, int matchType) { boolean flag = false; for (int i = 0; i < txt.length(); i++) { int matchFlag = checkSensitiveWord(txt, i, matchType); //判断是否包含敏感字符 if (matchFlag > 0) { //大于0存在,返回true flag = true; } } return flag; } /** * 判断文字是否包含敏感字符 * * @param txt 文字 * @return 若包含返回true,否则返回false */ public static boolean contains(String txt) { return contains(txt, MaxMatchType); } /** * 获取文字中的敏感词 * * @param txt 文字 * @param matchType 匹配规则 1:最小匹配规则,2:最大匹配规则 * @return */ public static Set getSensitiveWord(String txt, int matchType) { Set sensitiveWordList = new HashSet<>(); 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;

相关内容

热门资讯

前端学习第三阶段-第4章 jQ... 4-1 jQuery介绍及常用API导读 01-jQuery入门导读 02-JavaScri...
Linux命令_lsof 网... 官方描述         一个打开的文件可以是一个常规文件、一个目录、一个块特殊文件、一个字符特殊...
东山再起的成语解释 东山再起的成语解释  成语是中国传统文化的一大特色,有固定的结构形式和固定的说法,表示一定的意义,以...
“探赜钩深”的意思 “探赜钩深”的意思 成语拼音: [tàn zé gōu shēn] ...
“闻风而动”的意思 “闻风而动”的意思 成语拼音: [wén fēng ér dòng] ...
“废私立公”的意思 “废私立公”的意思 成语拼音: [fèi sī lì gōng] ...
怎么将模糊的照片变清晰   怎么将模糊的照片变清晰?珍贵的照片每个人都会有,而遇到珍贵的照片变模糊了ÿ...
MySQL高级篇_第19章_数... 在任何数据库环境中,总会有 不确定的意外 情况发生,比如例外的停电、计算...
“剖肝沥胆”的意思 “剖肝沥胆”的意思 成语拼音: [pōu gān lì dǎn] ...
“母老虎”的意思 “母老虎”的意思 成语拼音: [mǔ lǎo hǔ] ...
“哽哽咽咽”的意思 “哽哽咽咽”的意思 成语拼音: [gěng gěng yè yè] ...
“一渊不两蛟”的意思 “一渊不两蛟”的意思 成语拼音: [yī yuān bù liǎng jiāo] ...
LVS负载均衡与keepali... 目录 一、LVS 负载均衡的结构 LVS三种工作模式 LVS调度算法 ipvsadm工具 二、KE...
数据结构与算法——堆的基本存储 目录 一、概念及其介绍 二、适用说明 三、结构图示 四、Java 实例代码 五.堆和栈的区别 一、...
Vue.js语法详解:从入门到... Vue.js是一个流行的JavaScript框架,用于构建用户界面。它的核心特性包括数...
“江淮河汉”的意思 “江淮河汉”的意思 成语拼音: [jiāng huái hé hàn] ...
“英雄气短”的意思 “英雄气短”的意思 成语拼音: [yīng xióng qì duǎn] ...
“神龙见首不见尾”的意思 “神龙见首不见尾”的意思 成语拼音: [shén lóng jiàn shǒu bù j...
“老生常谈”的意思 “老生常谈”的意思 成语拼音: [lǎo shēng cháng tán] ...
Application 初始化... Application 的 onCreate 和 attachBaseContextApplicat...