开发者

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

开发者 https://www.devze.com 2024-11-09 10:36 出处:网络 作者: xn_xy19
目录1.敏感词-过滤2.DFA实现原理3.实现步骤3.1初始化敏感词库3.3获取匹配的关键词和命中的次数3.4测试我们在完成一些文章发布的功能是,可以使用第三方工具如阿里云的内容安全来进行文章的审核,但是这个第三方接口并
目录
  • 1.敏感词-过滤
  • 2.DFA实现原理
  • 3.实现步骤
    • 3.1初始化敏感词库
    • 3.3获取匹配的关键词和命中的次数
    • 3.4测试

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

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

1.敏感词-过滤

技术选型

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

2.DFA实现原理

DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。

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

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

检索的过程

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

3.实现步骤

3.1初始化敏感词库

private static int checkwww.devze.comWord(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&l编程客栈t;>();
        list.add("星期天");
        list.add("放假");
        list.add("加班");
        initMap(list);
        String content="我是一个好人,但是我星期天又要加班";
        Map<String, Integer> map = matchWords(content);
        System.out.println(map);
    }

到此这篇关于Java利用DFA算法实现敏感词管理的文章就介绍到这了,更多相关Javwww.devze.coma敏感词管理内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号