美文网首页
android 过滤敏感词主要类

android 过滤敏感词主要类

作者: Y__W | 来源:发表于2020-12-09 09:57 被阅读0次

package com.example.demo;

import java.util.HashMap;

import java.util.HashSet;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;

public class SensitiveWordsUtils {

/**

    * 敏感词匹配规则

    */

    public static final int MinMatchTYpe =1;

    public static final int MaxMatchType =2;

    /**

    * 敏感词集合

    */

    public static HashMapsensitiveWordMap;

    /**

    * 初始化敏感词库,构建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 SetgetSensitiveWord(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;//减1的原因,是因为for会自增

            }

}

return sensitiveWordList;

    }

/**

    * 获取文字中的敏感词

    *

    * @param txt 文字

    * @return

    */

    public static SetgetSensitiveWord(String txt) {

return getSensitiveWord(txt, MaxMatchType);

    }

/**

    * 替换敏感字字符

    *

    * @param txt        文本

    * @param replaceChar 替换的字符,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符:*, 替换结果:我爱***

    * @param matchType  敏感词匹配规则

    * @return

    */

    public static StringreplaceSensitiveWord(String txt, char replaceChar, int matchType) {

String resultTxt = txt;

        //获取所有的敏感词

        Set set =getSensitiveWord(txt, matchType);

        Iterator iterator = set.iterator();

        String word;

        String replaceString;

        while (iterator.hasNext()) {

word = iterator.next();

            replaceString =getReplaceChars(replaceChar, word.length());

            resultTxt = resultTxt.replaceAll(word, replaceString);

        }

return resultTxt;

    }

/**

    * 替换敏感字字符

    *

    * @param txt        文本

    * @param replaceChar 替换的字符,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符:*, 替换结果:我爱***

    * @return

    */

    public static StringreplaceSensitiveWord(String txt, char replaceChar) {

return replaceSensitiveWord(txt, replaceChar, MaxMatchType);

    }

/**

    * 替换敏感字字符

    *

    * @param txt        文本

    * @param replaceStr 替换的字符串,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符串:[屏蔽],替换结果:我爱[屏蔽]

    * @param matchType  敏感词匹配规则

    * @return

    */

    public static StringreplaceSensitiveWord(String txt, String replaceStr, int matchType) {

String resultTxt = txt;

        //获取所有的敏感词

        Set set =getSensitiveWord(txt, matchType);

        Iterator iterator = set.iterator();

        String word;

        while (iterator.hasNext()) {

word = iterator.next();

            resultTxt = resultTxt.replaceAll(word, replaceStr);

        }

return resultTxt;

    }

/**

    * 替换敏感字字符

    *

    * @param txt        文本

    * @param replaceStr 替换的字符串,匹配的敏感词以字符逐个替换,如 语句:我爱中国人 敏感词:中国人,替换字符串:[屏蔽],替换结果:我爱[屏蔽]

    * @return

    */

    public static StringreplaceSensitiveWord(String txt, String replaceStr) {

return replaceSensitiveWord(txt, replaceStr, MaxMatchType);

    }

/**

    * 获取替换字符串

    *

    * @param replaceChar

    * @param length

    * @return

    */

    private static StringgetReplaceChars(char replaceChar, int length) {

String resultReplace = String.valueOf(replaceChar);

        for (int i =1; i < length; i++) {

resultReplace += replaceChar;

        }

return resultReplace;

    }

/**

    * 检查文字中是否包含敏感字符,检查规则如下:

    *

    * @param txt

    * @param beginIndex

    * @param matchType

    * @return 如果存在,则返回敏感词字符的长度,不存在返回0

*/

    private static int checkSensitiveWord(String txt, int beginIndex, int matchType) {

//敏感词结束标识位:用于敏感词只有1位的情况

        boolean flag =false;

        //匹配标识数默认为0

        int matchFlag =0;

        char word;

        Map nowMap =sensitiveWordMap;

        for (int i = beginIndex; i < txt.length(); i++) {

word = txt.charAt(i);

            //获取指定key

            nowMap = (Map) nowMap.get(word);

            if (nowMap !=null) {//存在,则判断是否为最后一个

                //找到相应key,匹配标识+1

                matchFlag++;

                //如果为最后一个匹配规则,结束循环,返回匹配标识数

                if ("1".equals(nowMap.get("isEnd"))) {

//结束标志位为true

                    flag =true;

                    //最小规则,直接返回,最大规则还需继续查找

                    if (MinMatchTYpe == matchType) {

break;

                    }

}

}else {//不存在,直接返回

                break;

            }

}

if (matchFlag <2 && !flag) {//长度必须大于等于1,为词

            matchFlag =0;

        }

return matchFlag;

    }

}

相关文章

  • android 过滤敏感词主要类

    package com.example.demo; import java.util.HashMap; impor...

  • 敏感词过滤工具类

  • 敏感词过滤

    一、原句处理 1.去除原句中的所有空格2.去除原句子中的所有标点符号,包含全角和半角的3.将所有的繁体中文替换成简...

  • go实现敏感词过滤

    敏感词过滤,提前将敏感词设置好,然后每次有新句子都要过滤一遍,若存在敏感词,则用*号代替,代码如下

  • Java实现敏感词过滤 - DFA算法

    Java实现DFA算法进行敏感词过滤 封装工具类如下: 使用前需对敏感词库进行初始化: SensitiveWord...

  • 关于评论功能的总结

    作为前端,相对敏感词,我更应该注意对发布内容过滤,js脚本和html标签如何过滤 敏感词的过滤应当是过滤服务器➕人...

  • iOS 敏感词过滤 (OC与Swift版本都有)

    iOS 敏感词过滤:用*代替敏感词 实现效果举例: 敏感词为 : 123 “哈哈123456哈哈123呵呵” 被转...

  • python实现敏感词过滤的几种方法

    1.replace过滤 最简单也是最直接的就是直接循环敏感词,然后使用replace过滤关键词,文章和敏感词少的时...

  • java过滤敏感词!

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

  • 敏感词过滤问题

    互联网公司通常需要对手机或者社交软件发送的信息进行敏感词过滤,用户发送的信息一般是100多个字,但总量特别大,一周...

网友评论

      本文标题:android 过滤敏感词主要类

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