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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CentOS7下使用yum安装MariaDB

    CentOS7下使用yum安装MariaDBCentOS6或早期的版本中提供的是MySQL的服务器/客户端安装包,但CentOS7已使用了MariaDB替代了默认的MySQL。MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。全部删除MySQL/MariaDBMySQL已经…

    2022年6月3日
    30
  • Android开源游戏引擎

    Android开源游戏引擎很多初学Android游戏开发的朋友,往往会显得有些无所适从,他们常常不知道该从何处入手,每当遇到自己无法解决的难题时,又往往会一边羡慕于iPhone下有诸如Cocos2d-iphone之类的免费游戏引擎可供使用,一边自暴自弃的抱怨Android平台游戏开发难度太高,又连个像样的游戏引擎也没有,甚至误以为使用Java语言开发游戏是一件费力不讨好且没有出路的事情。事实上,这种想法完全是没有必要且…

    2022年9月19日
    0
  • tomcat日志设置与详解

    tomcat日志设置与详解1&nbsp;&nbsp;&nbsp;Tomcat日志概述Tomcat日志信息分为两类:一是运行中的日志,它主要记录运行的一些信息,尤其是一些异常错误日志信息。二是访问日志信息,它记录的访问的时间,IP,访问的资料等相关信息。2&nbsp;&nbsp;&nbsp;Tomcat日志配置2.1&nb…

    2022年6月20日
    114
  • Android View中OnKeyListener的onKey返回值

    Android View中OnKeyListener的onKey返回值1.前言在调试Android原生Setting开始中,遇到DialogPreference中用遥控器操作SeekBar到100%时,再按一次右键SeekBar焦点会跳至确定按钮中去。正常现象应该是停留至SeekBar尾部。2.问题分析根本原因就是焦点变化了,当SeekBar为100%时,再按一次右键让焦点停留再当前位置即可。进一步分析就是对按键进行处理,当满足条件时,使系统不再处理这个按键。3.原生代码片段在View.java中/***Interfacedefin

    2022年7月16日
    9
  • elementui树形控件的样式_elementui树形控件筛选

    elementui树形控件的样式_elementui树形控件筛选实现效果与原理我们希望实现鼠标移动至树型结构的结点上就显示按钮,移出就隐藏按钮实现原理:是通过@mouseenter和@mouseleave两个属性来控制鼠标hover的效果,再配合v-sho

    2022年7月30日
    7
  • Centos7配置MySQL读写分离[通俗易懂]

    Centos7配置MySQL读写分离[通俗易懂]背景82和83两台Mysql已经实现了主从复制。即将使用mysql-proxy进行读写分离,配置192为proxy,写82读83。mysql-proxymysql-proxy是一个处于客户端和服务器之间的中间件,它可以检测,分析或改变它们的通信。简单说就是一个中间层代理,一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过lua脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载…

    2022年5月30日
    46

发表回复

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

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