美文网首页
Java敏感词检测

Java敏感词检测

作者: 千年的心 | 来源:发表于2020-08-14 09:23 被阅读0次

1.背景

敏感词过滤是一个网站必不可少的功能,特别是用户能自由发言的需求。最近刚好有这样的需求,所以参考大家的方法有下面的实现,希望对大家有帮助

2.实现

2.1定义敏感词接口

import java.util.Collection;
import java.util.Optional;
import java.util.Set;

/**
 * 敏感词接口
 *
 * @author lieber
 */
public interface ISensitiveWords {

    /**
     * 初始化敏感词库
     *
     * @param keywords 所有敏感词
     */
    void init(Collection<String> keywords);

    /**
     * 添加敏感词
     *
     * @param keyword 待添加的敏感词
     */
    void add(String keyword);

    /**
     * 检查敏感词
     *
     * @param words 待检查文本
     * @return 是否包含敏感词
     */
    boolean contain(String words);

    /**
     * 检查第一个敏感词
     *
     * @param words 待检查文本
     * @return 检查到的第一个敏感词
     */
    Optional<String> first(String words);

    /**
     * 所有包含的敏感词
     *
     * @param words 待检查文本
     * @return 敏感词集合
     */
    Set<String> all(String words);
}

2.2 基于DFA算法的实现

DFA算法参考

import com.yugioh.core.util.words.sensitive.ISensitiveWords;

import java.util.*;

/**
 * 敏感词处理 -- DFA算法
 *
 * @author lieber
 */
public class DfaSensitiveWords implements ISensitiveWords {

    private final static String END_MARK_KEY = "end";

    private final static int MIN_MATCH_FLAG = 2;

    private HashMap wordsMap;

    @Override
    public void init(Collection<String> keywords) {
        if (keywords == null || keywords.isEmpty()) {
            throw new IllegalArgumentException("The param of keywords cannot be empty");
        }
        wordsMap= new HashMap(keywords.size());
        for (String keyword : keywords) {
            if (keyword == null) {
                continue;
            }
            Map nowMap = wordsMap;
            char[] chars = keyword.toCharArray();
            for (int i = 0; i < chars.length; i++) {
                char keyChar = chars[i];
                Object wordMap = nowMap.get(keyChar);

                if (wordMap != null) {
                    //如果存在该key,直接赋值
                    nowMap = (Map) wordMap;
                } else {
                    //不存在则,则构建一个map,同时将end设置为false,因为他不是最后一个
                    Map<String, Object> newWorMap = new HashMap<>(4);
                    nowMap.put(keyChar, newWorMap);
                    nowMap = newWorMap;
                }

                if (i == chars.length - 1) {
                    //最后一个
                    nowMap.put(END_MARK_KEY, true);
                }
            }
        }
    }

    @Override
    public void add(String keyword) {
        if (wordsMap== null) {
            throw new IllegalArgumentException("Please initialize first");
        }
    }

    @Override
    public boolean contain(String words) {
        for (int i = 0; i < words.length(); i++) {
            int matchFlag = this.check(words, i);
            if (matchFlag > 0) {
                return true;
            }
        }
        return false;
    }

    @Override
    public Optional<String> first(String words) {
        for (int i = 0; i < words.length(); i++) {
            int length = this.check(words, i);
            if (length > 0) {
                return Optional.of(words.substring(i, i + length));
            }
        }
        return Optional.empty();
    }

    @Override
    public Set<String> all(String words) {
        Set<String> sensitiveWordList = new HashSet<>();

        for (int i = 0; i < words.length(); i++) {
            int length = check(words, i);
            if (length > 0) {
                sensitiveWordList.add(words.substring(i, i + length));
                i = i + length - 1;

            }
        }

        return sensitiveWordList;
    }

    /**
     * 检查文字中是否包含敏感字符
     *
     * @param words      文本
     * @param beginIndex 开始位置
     * @return 如果存在,则返回敏感词字符的长度,不存在返回0
     */
    private int check(String words, int beginIndex) {
        boolean flag = false;
        int matchFlag = 0;
        Map nowMap = wordsMap;
        for (int i = beginIndex; i < words.length(); i++) {
            char word = words.charAt(i);
            nowMap = (Map) nowMap.get(word);
            if (nowMap == null) {
                break;
            }
            matchFlag++;
            flag = Boolean.TRUE.equals(nowMap.get(END_MARK_KEY));
        }
        return matchFlag >= MIN_MATCH_FLAG && flag ? matchFlag : 0;

    }
}


相关文章

  • Java敏感词检测

    1.背景 敏感词过滤是一个网站必不可少的功能,特别是用户能自由发言的需求。最近刚好有这样的需求,所以参考大家的方法...

  • DFA敏感词检测方案

  • DFA算法以及敏感词过滤代码实现

    Java实现DFA算法实现敏感词过滤 在Java中实现敏感词过滤的关键就是DFA算法的实现。首先我们对上图进行剖析...

  • 如何规避视频含有违规敏感词而被限流

    如何检测视频是否含有违规敏感词,检测文案的合规性和避免出现敏感词,可以有效防止视频或文案违规而被减少推荐或降权的风...

  • java过滤敏感词!

    课程设计做了个博客系统,为了对评论进行敏感词过滤,所以去看了下DFA 在Java中实现敏感词过滤的关键就是DFA算...

  • Java敏感词过滤

  • php-akm 关键字快速查找匹配

    php-akm 是国人写的 用于文本快速查找关键词和检测敏感词

  • 使用阿里云对图片检黄

    阿里内容检测服务封装,包括垃圾文本、关键词文本检测以及对图片涉黄、暴恐、敏感检测 gitHub:https://g...

  • Go+PHP实现敏感词检测

    概述 广告,敏感词检测一直以来都是让人头疼的话题,仅仅通过添加敏感词列表是解决不了问题的。今天封禁了这个词,明天又...

  • java实现敏感词过滤

    这个是很实用的功能,很多时候聊天都会有敏感词过滤。有的时候发文有敏感词发都不让发,所以说用的地方还是挺多的。然后下...

网友评论

      本文标题:Java敏感词检测

      本文链接:https://www.haomeiwen.com/subject/hqspdktx.html