python敏感词过滤代码简单(敏感词匹配算法)

今天游戏正好用到需要过滤敏感词将出现的敏感词替换成*,在网上找了许久找了一片可用的java版本的DFA算法,最后费了一番功夫将其思路用C#实现,里面的注释甚至都没改动的,这里直接上代码,这里不借助任何第三方工具,复制粘贴就是用当然想看原博客的点击这里usingUnityEngine;usingSystem.Collections.Generic;publicclassTes…

大家好,又见面了,我是你们的朋友全栈君。

今天游戏正好用到需要过滤敏感词将出现的敏感词替换成*,在网上找了许久找了一片可用的java版本的DFA算法,最后费了一番功夫将其思路用C#实现,里面的注释甚至都没改动的,这里直接上代码,这里不借助任何第三方工具,复制粘贴就是用

当然想看原博客的点击这里


using UnityEngine;
using System.Collections.Generic;
public class Test : MonoBehaviour
{
    public TextAsset txt;
    private void Start()
    {
        
    }
    private void Update()
    {
        if (Input.GetKeyDown("x")) {
            string str = "后来的啊微信哈哈嘀嘀嘀微信qqwx呼呼呵呵";
            HashSet<string> set = ReadTxtByLine(txt);
            Dictionary<object, object> map = AddBadWordToHashMap(set);
            string set1 = GetBadWord(str, 2, map);
            print(set1);
        }
    }
    private HashSet<string> ReadTxtByLine(TextAsset file) {
        //使用换行和回车符分割敏感词
        string[] str = file.text.Split('\n','\r');
        HashSet<string> setTemp = new HashSet<string>();
        if (str != null) {
            foreach (string s in str)
            {
                setTemp.Add(s);
            }
        }
        return setTemp;
    }
    private Dictionary<object, object> AddBadWordToHashMap(HashSet<string> keyWordSet)
    {
        //初始化敏感词容器,减少扩容操作
        Dictionary<object, object> wordMap = new Dictionary<object, object>(keyWordSet.Count);
        string key = null;
        Dictionary<object,object> nowMap = null;
        Dictionary<object, object> newWorMap = null;
        //迭代keyWordSet
        foreach (var v in keyWordSet) {
            key = v;
            nowMap = wordMap;
            char[] keyChars = key.ToCharArray();
            for (int i = 0; i < keyChars.Length; i++) {
                //转换成char型
                char keyChar = keyChars[i];
                //如果存在该key,直接赋值
                if (nowMap.ContainsKey(keyChar.ToString())) {
                    nowMap = wordMap;
                }else{
                    //不存在则,则构建一个map,同时将isEnd设置为0,因为他不是最后一个
                    newWorMap = new Dictionary<object, object>();
                    //不是最后一个
                    newWorMap.Add("isEnd", "0");
                    nowMap.Add(keyChar.ToString(), newWorMap);
                    nowMap = newWorMap;
                }
                if (i == keyChars.Length - 1){
                    //最后一个
                    if (nowMap.ContainsKey("isEnd")) {
                        nowMap.Remove("isEnd");
                    }
                    nowMap.Add("isEnd", "1");
                }
            }
        }
        return wordMap;
    }
    public string GetBadWord(string txt, int matchType, Dictionary<object, object> wordMap)
    {
        char[] c = txt.ToCharArray();
        for (int i = 0; i < txt.Length; i++)
        {
            //判断是否包含敏感字符
            int length = CheckBadWord(txt, i, matchType, wordMap);
            if (length > 0)
            {
                string oldStr = txt.Substring(i, length);
                //替换敏感词
                for (int j = 0; j < length; j++) {
                    c[j + i] = '*';
                }
                //减1的原因,是因为for会自增
                i = i + length - 1;
            }
        }
        return new string(c);
    }
    private int CheckBadWord(string txt, int beginIndex, int matchType, Dictionary<object, object> wordMap)
    {
        //敏感词结束标识位:用于敏感词只有1位的情况
        bool flag = false;
        //匹配标识数默认为0
        int matchFlag = 0;
        char word = '0';
        object nowMap = wordMap;
        char[] words = txt.ToCharArray();
        for (int i = beginIndex; i < words.Length; i++)
        {
            word = words[i];
            //获取指定key
            if (((Dictionary<object, object>)nowMap).ContainsKey(word.ToString())) {
                //存在,则判断是否为最后一个
                //找到相应key,匹配标识+1
                nowMap = ((Dictionary<object, object>)nowMap)[word.ToString()];
                matchFlag++;
                if (((Dictionary<object, object>)nowMap).ContainsKey("isEnd")) {
                    string temp = (string)((Dictionary<object, object>)nowMap)["isEnd"];
                    if ("1".Equals(temp))
                    {
                        //如果为最后一个匹配规则,结束循环,返回匹配标识数
                        //结束标志位为true
                        flag = true;
                        if (1 == matchType)
                        {
                            //最小规则,直接返回,最大规则还需继续查找
                            break;
                        }
                    }
                }
            }
            else
            {     //不存在,直接返回
                break;
            }
        }
      
        if (!flag)
        {
            matchFlag = 0;
        }
        return matchFlag;
    }
 
}

下面是是敏感词库,其实就是一个.txt文件大家自己创建就行我这内容也不多上个截图就好

python敏感词过滤代码简单(敏感词匹配算法)

好了今天就这么多

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126878.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python open函数参数_python中open函数的使用

    python open函数参数_python中open函数的使用一、open()的函数原型open(file,mode=‘r’,buffering=-1,encoding=None,errors=None,newline=None,closefd=True)从官方文档中我们可以看到open函数有很多的参数,我们常用的是file,mode和encoding,对于其它的几个参数,平时不常用,也简单介绍一下。buffering的可取值有0,1,>1三个…

    2022年5月9日
    36
  • es7学习笔记 cpu负载不均衡、超长fullGC、大量400报错[通俗易懂]

    es7学习笔记 cpu负载不均衡、超长fullGC、大量400报错[通俗易懂]ElasticSearch负载不均衡现象:往es7集群中推数时,发生如下情况接口出现很多400 发现集群中某台机器cpu被怼爆 发生fullGC产生400报错的原因是es7做了熔断优化,当jvm内存使用超过阈值,为了避免丑陋的oom,会直接限流并抛出EsRejectedExecutionException。我们强硬的关掉了这个配置,因为我们的推数有失败重试。产生fullGC是因为一个bulk批处理的数据量太大,我们一个文档1.5M,800个文档作为一批,两个线程并行推,jvm内

    2022年5月23日
    60
  • select2 api参数的文档

    select2 api参数的文档

    2021年11月9日
    32
  • Ubuntu安装vscode步骤

    Ubuntu安装vscode步骤Ubuntu安装vscode步骤下载deb文件,网址是点击官网下载 下载好放到ubuntu系统里 然后执行命令 sudodpkg-icode_1.51.1-1605051630_amd64.deb#需要root也就是管理员方式安装#code_1.51.1-1605051630_amd64.deb为对应安装包的名称不同版本名称不同 #运行过程linuxer@ubuntu:~/Documents$lsacode_1.51.1-160505163.

    2026年1月18日
    4
  • 第七讲:HTML5中的canvas两个小球全然弹性碰撞

    第七讲:HTML5中的canvas两个小球全然弹性碰撞

    2021年11月29日
    38
  • nextline函数_nextLine()和next()的区别和使用方法

    nextline函数_nextLine()和next()的区别和使用方法最近在笔试,刷剑指Offer时,都是只需要把方法实现了就行。但是!!!笔试时候会发现,大部分会要求你把main函数也code出来,真是醉了,第一次笔试时候搞的晕乎乎的…..废话不多说,那么在写输入输出中,肯定要用到Scanner类了,其中不少都需要读取一个整数或者一个整型数组。当读入整数时(以int为例),直接就nextInt()就好,可是当读入一个整型数组时(数字之间用空格隔开),就涉及到用…

    2022年6月8日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号