当前位置: 代码网 > it编程>编程语言>Java > Java利用DFA算法实现敏感词管理

Java利用DFA算法实现敏感词管理

2024年11月09日 Java 我要评论
我们在完成一些文章发布的功能是,可以使用第三方工具如阿里云的内容安全来进行文章的审核,但是这个第三方接口并不能过滤一些敏感词因此这时候我们需要自己维护一套敏感词。1.敏感词-过滤技术选型方案说明数据库

我们在完成一些文章发布的功能是,可以使用第三方工具如阿里云的内容安全来进行文章的审核,但是这个第三方接口并不能过滤一些敏感词

因此这时候我们需要自己维护一套敏感词。

1.敏感词-过滤

技术选型

方案说明
数据库模糊查询效率太低
string.indexof("")查找数据库量大的话也是比较慢
全文检索分词再匹配
dfa算法确定有穷自动机(一种数据结构)

2.dfa实现原理

dfa全称为:deterministic finite automaton,即确定有穷自动机。

存储:一次性的把所有的敏感词存储到了多个map中,就是下图表示这种结构

检索的过程

3.实现步骤

3.1初始化敏感词库

private static int checkword(string text, int beginindex) {
        if (dictionarymap == null) {
            throw new runtimeexception("字典不能为空");
        }
        boolean isend = false;
        int wordlength = 0;
        map<string, object> curmap = dictionarymap;
        int len = text.length();
        // 从文本的第beginindex开始匹配
        for (int i = beginindex; i < len; i++) {
            string key = string.valueof(text.charat(i));
            // 获取当前key的下一个节点
            curmap = (map<string, object>) curmap.get(key);
            if (curmap == null) {
                break;
            } else {
                wordlength ++;
                if ("1".equals(curmap.get("isend"))) {
                    isend = true;
                }
            }
        }
        if (!isend) {
            wordlength = 0;
        }
        return wordlength;
    }

3.3获取匹配的关键词和命中的次数

 public static map<string, integer> matchwords(string text) {
        map<string, integer> wordmap = new hashmap<>();
        int len = text.length();
        for (int i = 0; i < len; i++) {
            int wordlength = checkword(text, i);
            if (wordlength > 0) {
                string word = text.substring(i, i + wordlength);
                // 添加关键词匹配次数
                if (wordmap.containskey(word)) {
                    wordmap.put(word, wordmap.get(word) + 1);
                } else {
                    wordmap.put(word, 1);
                }
 
                i += wordlength - 1;
            }
        }
        return wordmap;
    }

3.4测试

public static void main(string[] args) {
        list<string> list = new arraylist<>();
        list.add("星期天");
        list.add("放假");
        list.add("加班");
        initmap(list);
        string content="我是一个好人,但是我星期天又要加班";
        map<string, integer> map = matchwords(content);
        system.out.println(map);
    }

到此这篇关于java利用dfa算法实现敏感词管理的文章就介绍到这了,更多相关java敏感词管理内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com