C#过滤敏感词DFA算法
今天游戏正好用到需要过滤敏感词将出现的敏感词替换成*,在网上找了许久找了一片可用的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;//迭代keyWordSetforeach (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;//匹配标识数默认为0int matchFlag = 0;char word = '0';object nowMap = wordMap;char[] words = txt.ToCharArray();for (int i = beginIndex; i < words.Length; i++){word = words[i];//获取指定keyif (((Dictionary<object, object>)nowMap).ContainsKey(word.ToString())) {//存在,则判断是否为最后一个//找到相应key,匹配标识+1nowMap = ((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)){//如果为最后一个匹配规则,结束循环,返回匹配标识数//结束标志位为trueflag = true;if (1 == matchType){//最小规则,直接返回,最大规则还需继续查找break;}}}}else{ //不存在,直接返回break;}}if (!flag){matchFlag = 0;}return matchFlag;}}
下面是是敏感词库,其实就是一个.txt文件大家自己创建就行我这内容也不多上个截图就好
好了今天就这么多
C#过滤敏感词DFA算法相关推荐
- 使用数据结构过滤敏感词算法
前缀树 名称:Tire.字典树.查找树 特点:查找效率高,消耗内存大 应用:字符串检索.词频统计.字符串排序等 敏感词过滤器 定义前缀树 package com.nowcoder.community. ...
- python过滤敏感词记录
简述: 关于敏感词过滤可以看成是一种文本反垃圾算法,例如 题目:敏感词文本文件 filtered_words.txt,当用户输入敏感词语,则用 星号 * 替换,例如当用户输入「北京是个好城市」,则变成 ...
- php过滤敏感词实例代码
php过滤敏感词实例代码 <?php /** * Created by JetBrains PhpStorm. * User: lsl * Date: 13-8-28 ...
- flex java 全局拦截_flex + java 过滤敏感词
过滤敏感词这个相对比较容易做到,网上也很多方法,看得比较多的一个方法就是:把所有的敏感词写入到一个properties文件中,程序启动时拼成一个正则表达式.这个也只是比较基础的敏感词过滤器,比较强大的 ...
- python过滤敏感词汇_利用Python正则表达式过滤敏感词的方法
利用Python正则表达式过滤敏感词的方法 问题描述:很多网站会对用户发帖内容进行一定的检查,并自动把敏感词修改为特定的字符. 技术要点: 1)Python正则表达式模块re的sub()函数: 2)在 ...
- ios 弹幕过滤敏感词方案对比和性能测试
在看视频的过程中, 很多用户会发弹幕, 当前用户可以设置过滤敏感词和敏感用户, 设置后, 命中敏感词和敏感用户的弹幕就不会显示. 敏感词和敏感用户的设置上限为各100. 由客户端进行过滤, 不区分大 ...
- php敏感字符串过滤_PHP的一个过滤敏感词或脏话的方法
PHP的一个过滤敏感词或脏话的方法 主要使用了 int substr_count ( string haystack, string needle [, int offset [, int leng ...
- 第三章:过滤敏感词、帖子管理
过滤敏感词 根节点没有字符,到最末节点拼起来才是敏感字符,做一个标记在最后. 过滤符号 /* * 过滤敏感词 * 参数:待过滤的文本, 返回过滤后的文本 * */ public String filt ...
- SpringBoot使用前缀树过滤敏感词
前缀树 Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种.典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计.它的优点是:利 ...
最新文章
- slicer安装_3D Slicer教程【软件安装及设置】
- Rancher--Docker容器管理工具的安装与启动
- Mybatis 拦截器报错
- 基于华为路由器实现NAT
- 晚上几点睡才叫“熬夜”?给你“答案”,很多人都想错了
- SE91 SAP消息类型
- android调用系统录制视频教程,Android开发之使用MediaRecorder录制视频,android视频录制...
- 计算机图像处理要学什么软件有哪些,电脑中常用的图像处理软件有哪些
- 阿拉伯数字转中文大写的方法
- TableLayout表格布局详解
- 微信小程序 -数字滚动动画
- java.lang.IllegalArgumentException介绍
- Unity Instantiate函数用于复制对象
- 武汉理工大学计算机考博往年试题,2017年武汉理工大学考博英语真题
- 最大流最小割定理(max flow/min cut theory)
- ChatGPT这么火,如果ChatGPT滥用或者重度依赖,会怎么样?
- 把吃出来的病吃回去 张悟本_0826分享把吃出来的病吃回去电子书txt 网盘下载
- VS 2019中利用C#语言在.Net Framework 4.5框架上开发简易倒计时器
- 什么事webshell?
- win10改win7后usb键盘鼠标都不能用
热门文章
- [毕业设计]LaTeX论文模板排版
- 【日常计算机问题记录】装系统时烧录的u盘如何恢复正常
- STM32 LCD12864 原理和实现代码
- 下载安装WindowBuilder插件教程
- Hadoop权威指南——关于Sqoop
- C#用NPOI插件对Excel数据的生成各类Chart的绑定/生成
- anylogic系统动力java工具_AnyLogic Professional 8.7 最新授权
- meteor构建app程序_在Meteor.js中构建Slack克隆:实时数据
- ERPS环网络端口角色
- django的优缺点