`

[Java Web]敏感词过滤算法

 
阅读更多

1.DFA算法

DFA算法的原理可以参考 这里,简单来说就是通过Map构造出一颗敏感词树,树的每一条由根节点到叶子节点的路径构成一个敏感词,例如下图:

代码简单实现如下:

 

public class TextFilterUtil {

    //日志
    private static final Logger LOG = LoggerFactory.getLogger(TextFilterUtil.class);
    //敏感词库
    private static HashMap sensitiveWordMap = null;
    //默认编码格式
    private static final String ENCODING = "gbk";
    //敏感词库的路径
    private static final InputStream in = TextFilterUtil.class.getClassLoader().getResourceAsStream("sensitive/keyWords.txt");

    /**
     * 初始化敏感词库
     */
    private static void init() {
        //读取文件
        Set<String> keyWords = readSensitiveWords();
        //创建敏感词库
        sensitiveWordMap = new HashMap<>(keyWords.size());
        for (String keyWord : keyWords) {
            createKeyWord(keyWord);
        }
    }

    /**
     * 构建敏感词库
     *
     * @param keyWord
     */
    private static void createKeyWord(String keyWord) {
        if (sensitiveWordMap == null) {
            LOG.error("sensitiveWordMap 未初始化!");
            return;
        }
        Map nowMap = sensitiveWordMap;
        for (Character c : keyWord.toCharArray()) {
            Object obj = nowMap.get(c);
            if (obj == null) {
                Map<String, Object> childMap = new HashMap<>();
                childMap.put("isEnd", "false");
                nowMap.put(c, childMap);
                nowMap = childMap;
            } else {
                nowMap = (Map) obj;
            }
        }
        nowMap.put("isEnd", "true");
    }

    /**
     * 读取敏感词文件
     *
     * @return
     */
    private static Set<String> readSensitiveWords() {
        Set<String> keyWords = new HashSet<>();
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(in, ENCODING));
            String line;
            while ((line = reader.readLine()) != null) {
                keyWords.add(line.trim());
            }
        } catch (UnsupportedEncodingException e) {
            LOG.error("敏感词库文件转码失败!");
        } catch (FileNotFoundException e) {
            LOG.error("敏感词库文件不存在!");
        } catch (IOException e) {
            LOG.error("敏感词库文件读取失败!");
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                reader = null;
            }
        }
        return keyWords;
    }

    /**
     * 检查敏感词
     *
     * @return
     */
    private static List<String> checkSensitiveWord(String text) {
        if (sensitiveWordMap == null) {
            init();
        }
        List<String> sensitiveWords = new ArrayList<>();
        Map nowMap = sensitiveWordMap;
        for (int i = 0; i < text.length(); i++) {
            Character word = text.charAt(i);
            Object obj = nowMap.get(word);
            if (obj == null) {
                continue;
            }
            int j = i + 1;
            Map childMap = (Map) obj;
            while (j < text.length()) {
                if ("true".equals(childMap.get("isEnd"))) {
                    sensitiveWords.add(text.substring(i, j));
                }
                obj = childMap.get(text.charAt(j));
                if (obj != null) {
                    childMap = (Map) obj;
                } else {
                    break;
                }
                j++;
            }
        }
        return sensitiveWords;
    }
}

 

 

2.TTMP算法

TTMP算法由网友原创,关于它的起源可以查看 这里,TTMP算法的原理是将敏感词拆分成“脏字”的序列,只有待比对字符串完全由“脏字”组成时,才去判断它是否为敏感词,减少了比对次数。这个算法的简单实现如下:

 

public class TextFilterUtil {

    //日志
    private static final Logger LOG = LoggerFactory.getLogger(TextFilterUtil.class);
    //默认编码格式
    private static final String ENCODING = "gbk";
    //敏感词库的路径
    private static final InputStream in = TextFilterUtil.class.getClassLoader().getResourceAsStream("sensitive/keyWords.txt");
    //脏字库
    private static Set<Character> sensitiveCharSet = null;
    //敏感词库
    private static Set<String> sensitiveWordSet = null;

    /**
     * 初始化敏感词库
     */
    private static void init() {
        //初始化容器
        sensitiveCharSet = new HashSet<>();
        sensitiveWordSet = new HashSet<>();
        //读取文件 创建敏感词库
        readSensitiveWords();
    }

    /**
     * 读取本地的敏感词文件
     *
     * @return
     */
    private static void readSensitiveWords() {
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(in, ENCODING));
            String line;
            while ((line = reader.readLine()) != null) {
                String word = line.trim();
                sensitiveWordSet.add(word);
                for (Character c : word.toCharArray()) {
                    sensitiveCharSet.add(c);
                }
            }
        } catch (UnsupportedEncodingException e) {
            LOG.error("敏感词库文件转码失败!");
        } catch (FileNotFoundException e) {
            LOG.error("敏感词库文件不存在!");
        } catch (IOException e) {
            LOG.error("敏感词库文件读取失败!");
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                reader = null;
            }
        }
        return;
    }

    /**
     * 检查敏感词
     *
     * @return
     */
    private static List<String> checkSensitiveWord(String text) {
        if (sensitiveWordSet == null || sensitiveCharSet == null) {
            init();
        }
        List<String> sensitiveWords = new ArrayList<>();
        for (int i = 0; i < text.length(); i++) {
            Character word = text.charAt(i);
            if (!sensitiveCharSet.contains(word)) {
                continue;
            }
            int j = i;
            while (j < text.length()) {
                if (!sensitiveCharSet.contains(word)) {
                    break;
                }
                String key = text.substring(i, j + 1);
                if (sensitiveWordSet.contains(key)) {
                    sensitiveWords.add(key);
                }
                j++;
            }
        }
        return sensitiveWords;
    }
}


注:以上代码实现仅用于展示思路,在实际使用中还有很多地方可以优化。

 

 

分享到:
评论

相关推荐

    一种基于Java Web的敏感词过滤方法研究与实现.pdf

    从提供的文件内容来看,本文是一篇关于Java Web技术研究的文章,主要介绍了一种基于Java Web的敏感词过滤系统的实现方法。该系统通过自动识别和阻断含有敏感词的聊天内容,并将敏感词替换为特定的符号或关键词,以...

    一种基于Java Web的敏感词过滤方法研究与实现.zip

    本文主要探讨了一种基于Java Web的敏感词过滤方法的研究与实现,旨在为网络平台提供安全、高效的内容过滤解决方案。 首先,我们要理解Java Web的基本概念。Java Web是Java技术在Web应用中的应用,它包括了Servlet、...

    基于springboot实现的博客系统、具备评论、留言、简历编写下载、敏感词过滤等功能.zip

    标题中的“基于SpringBoot实现的博客系统”是一个使用SpringBoot框架构建的Web应用程序,它集成了多种功能,如评论、留言、简历编写和下载以及敏感词过滤。SpringBoot是Spring框架的一个子项目,旨在简化Spring应用...

    基于AC自动机算法的敏感词过滤项目.zip

    包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。 【项目质量】: 所有源码都经过严格测试,可以直接运行。 功能在确认正常工作后才上传。 【适用人群】...

    Java DFA算法实现敏感词、广告词过滤源码(导入即可用)

    在`TestSensitiveWdFilter.java`文件中,`TestFilter()`方法应该是测试敏感词过滤功能的入口。通常,这个方法会包含创建DFA对象,加载敏感词库,然后对一段待检查的文本调用过滤方法进行检测。例如: ```java ...

    文字过滤(ajax+jquery+servlet)

    **敏感词过滤算法** 敏感词过滤通常涉及到字符串搜索和替换。一种常见的方法是使用哈希表或者字典存储敏感词,然后遍历输入文本,逐个字符或单词地与敏感词表进行比较。如果找到匹配项,就用预设的替换词替换。在这...

    java毕设课设基于SSM论坛BBS网站管理系统项目源码+数据库sql

    5. **敏感词过滤**:项目中可能包含敏感词过滤功能,用于防止不当言论的发布,这通常通过预定义的敏感词列表和字符串匹配算法实现。 6. **文件组织结构**: - `MyForum.iml`:这是IntelliJ IDEA项目配置文件,用于...

    JAVA开发的Blog系统

    为了防止恶意评论,博客系统通常会有审核机制,比如启用验证码或设置敏感词过滤。 除此之外,搜索功能也是不可或缺的,用户可以通过关键词搜索感兴趣的文章。后台需要实现全文检索或关键字匹配算法,以提高搜索效率...

    一个物联网工程专业特色网站

    “敏感词过滤”是网站为了维护社区环境和防止不良信息传播而实施的一种机制。通常,网站会建立一个敏感词库,当用户输入的文字中包含敏感词汇时,系统会自动屏蔽或替换这些词汇。这可能涉及到文本处理、字符串匹配...

    javaWeb实现的过滤器敏感字过滤

    3. 对于大量数据的处理,考虑优化过滤性能,例如使用高效的字符串匹配算法或使用正则表达式。 综上所述,"javaWeb实现的过滤器敏感字过滤"项目通过使用JavaWeb过滤器技术,有效地防止了敏感字符的传播,提高了应用...

    基于Java技术开发的BBS论坛毕业论文.doc

    尤其在敏感词过滤方面,通过算法设计和程序编码,有效地确保了论坛内容的健康性。Ajax技术的使用,提升了用户的交互体验,实现了无刷新的页面内容更新。 论文研究过程中,刘冠军同学对数据库系统理论也进行了深入...

    jsp页面中关键字过滤函数

    在开发Web应用,尤其是搭建论坛或社区类网站时,关键字过滤是一个重要的功能模块。它主要用于防止用户发布含有敏感词汇或不适宜内容的信息,确保网络环境的健康与和谐。本项目中,我们关注的是如何在JSP(Java ...

    Filter.zip

    综上所述,"Filter.zip"中的实现结合了Java的Servlet过滤器、IO流操作和敏感词处理策略,为处理网络内容的敏感词汇过滤提供了一个基础框架。这样的设计有助于提高应用程序的安全性和合规性,同时减少不适当内容的...

    ACWPS(爱博汉语分词系统)分词组件 asp分词组件

    可自行定义干扰字、无意义字、敏感词过滤列表。如:啊、唉、个、了等无意义的以及煸动、反动、黄色和侵害他人的汉字、词组及英文。 本人已经测试可用。 注意两点: 1、没有注册的版本只支持25个字以内的分词。 2、...

    Z-Blog 2.0 Doomsday Build 121221

    IP追溯、数字过滤、火星文过滤、自定义提示语、直接拦截等功能,加上利用正则制作的黑词列表和敏感词列表,帮助您更好拦截SPAM 支持智能手机管理博客 手机wap功能进一步增强,支持图片上传,支持文章管理,支持...

    Tipask问答系统源码.zip

    为了维护社区的健康环境,Tipask系统应有内容审核机制,如过滤敏感词、防止灌水等。源码中可能会包含文本处理库,用于执行这些任务。 6. **通知与消息推送** 系统需要实时通知用户有关他们的问题或答案的更新,这...

    基于字典树的大学生交流 社区的设计与实现

    1. **字典树算法**:用于实现敏感词过滤。字典树是一种高效的字符串匹配数据结构,它能快速查找字符串集合中的单词。在本系统中,当用户发表内容时,会自动检测是否包含预设的敏感词列表中的词汇。 2. **权值计算*...

Global site tag (gtag.js) - Google Analytics