C#敏感词过滤实现方法

C#敏感词过滤实现方法攻略

敏感词过滤在许多场景下都是必须的,比如社交平台的评论、发送短信等。在C#中,实现敏感词过滤的方法主要有以下两种:

方法一:正则表达式过滤

正则表达式是一种实现模式匹配的语言,我们可以利用正则表达式的特性来实现敏感词过滤。下面是使用正则表达式实现敏感词过滤的代码示例:

using System.Text.RegularExpressions;
...

// 传入敏感词数组,返回替换后的字符串
public string FilterSensitiveWords(string[] sensitiveWords, string text)
{
    string pattern = "(" + string.Join("|", sensitiveWords) + ")";
    Regex regex = new Regex(pattern, RegexOptions.IgnoreCase);
    return regex.Replace(text, "***");
}

这段代码使用了System.Text.RegularExpressions命名空间中的Regex类和相关方法,将传入的敏感词通过"|"连接起来组成一个正则表达式的模式,然后将字符串中匹配到的敏感词替换为"***"。

方法二:Trie树过滤

Trie树又叫字典树或前缀树,它是一种字符串查找的树型数据结构,可以利用Trie树来实现快速匹配。

下面是使用Trie树实现敏感词过滤的代码示例:

using System.Collections.Generic;
...

public class TrieNode
{
    public char Val;
    public bool IsEnd;
    public Dictionary<char, TrieNode> Children;

    public TrieNode(char val)
    {
        Val = val;
        IsEnd = false;
        Children = new Dictionary<char, TrieNode>();
    }
}

public class Trie
{
    private TrieNode root;

    public Trie()
    {
        root = new TrieNode('^');
    }

    // 插入单词
    public void Insert(string word)
    {
        var curr = root;
        foreach (var c in word)
        {
            if (!curr.Children.ContainsKey(c))
                curr.Children.Add(c, new TrieNode(c));

            curr = curr.Children[c];
        }
        curr.IsEnd = true;
    }

    // 查找是否包含敏感词
    public bool Contains(string text)
    {
        var curr = root;
        for (int i = 0; i < text.Length; i++)
        {
            var c = text[i];
            if (curr.Children.TryGetValue(c, out var next))
            {
                curr = next;
                if (curr.IsEnd)
                    return true;
            }
            else
                curr = root;
        }
        return false;
    }
}

// 使用Trie树过滤敏感词
public string FilterSensitiveWords(string[] sensitiveWords, string text)
{
    var trie = new Trie();
    foreach (var word in sensitiveWords)
    {
        trie.Insert(word);
    }

    var result = new StringBuilder();
    int i = 0, j = 0;
    while (j < text.Length)
    {
        if (trie.Contains(text[j..]))
        {
            result.Append(text[i..j]);
            result.Append("***");
            i = ++j;
        }
        else
            j++;
    }
    result.Append(text[i..]);
    return result.ToString();
}

这段代码中,我们首先定义了一个TrieNode类和一个Trie类,其中TrieNode表示Trie树节点的结构体,Trie类则表示Trie树本身。

通过循环遍历敏感词数组,将每个敏感词插入到Trie树中。对于要过滤的文本,我们使用两个指针ij来分别指向文本的起始和终止位置,然后不断移动j指针,检查从j开始的子串是否在Trie树中,如果在Trie树中,则将当前结果保存下来,并将i指针移到j所在位置的下一位,然后继续从j位置开始向后查找。如果不在Trie树中,则只移动j指针。

最终将ij之间的内容和j之后的内容拼接成最终的结果字符串。

示例说明

示例一:正则表达式过滤

假设我们要过滤的文本为"我是一名哈麻拼车司机,我喜欢打哈麻。",我们定义一个敏感词数组为["哈麻", "打哈麻"],然后调用过滤函数:

FilterSensitiveWords(new string[]{"哈麻", "打哈麻"}, "我是一名哈麻拼车司机,我喜欢打哈麻。");

则返回的结果为:

我是一名***拼车司机,我喜欢***。

示例二:Trie树过滤

假设我们要过滤的文本为"你搞甚么兔子啊!",我们定义一个敏感词数组为["兔子", "甚么"],然后调用过滤函数:

FilterSensitiveWords(new string[]{"兔子", "甚么"}, "你搞甚么兔子啊!");

则返回的结果为:

你搞***啊!

这里只过滤了"甚么"和"兔子"两个词,因此,"啊"没有被过滤掉。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#敏感词过滤实现方法 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • C# 指针内存控制Marshal内存数据存储原理分析

    C# 指针内存控制Marshal内存数据存储原理分析 简介 在C#中,内存分配和释放通常由CLR来处理。但在某些情况下,比如需要访问和操作非托管代码或数据结构时,需要使用指针和marshal等技术来完成内存控制和数据存储。本文将针对C#指针内存控制与Marshal内存数据存储进行深入探讨,并提供实际案例示范。 C#指针内存控制 指针是一种特殊类型的变量,用于…

    C# 2023年6月6日
    00
  • .Net Core日志记录之第三方框架Serilog

    .NET Core日志记录之第三方框架Serilog 在本攻略中,我们将深入讲解如何使用第三方框架Serilog进行.NET Core日志记录,并提供两个示例说明。 什么是Serilog? Serilog是一个.NET Core日志记录框架,它提供了一种简单、灵活、可扩展的方式来记录应用程序的日志。Serilog支持多种输出格式和目标,包括控制台、文件、数据…

    C# 2023年5月17日
    00
  • C#中使用async和await实现异步Udp通讯的示例代码

    当我们需要进行大量的网络IO操作时,使用异步编程可以大大提高程序的效率和性能。在C#中,我们可以使用async和await关键字来进行异步编程。 具体地,当我们进行UDP通讯时,可以将接收和发送操作都用异步的方法来进行,并且使用await关键字来等待异步操作完成。下面我们来看一个实现异步UDP通讯的示例代码。 步骤一:创建UdpClient对象 在C#中,我…

    C# 2023年6月6日
    00
  • 记一次 .NET某医疗器械清洗系统 卡死分析

    一:背景 1. 讲故事 前段时间协助训练营里的一位朋友分析了一个程序卡死的问题,回过头来看这个案例比较经典,这篇稍微整理一下供后来者少踩坑吧。 二:WinDbg 分析 1. 为什么会卡死 因为是窗体程序,理所当然就是看主线程此时正在做什么? 可以用 ~0s ; k 看一下便知。 0:000> k # ChildEBP RetAddr 00 00aff1…

    C# 2023年4月18日
    00
  • IIS部署ASP.NET Core项目及常见问题总结

    IIS部署ASP.NET Core项目及常见问题总结 ASP.NET Core是一个跨平台的Web应用程序框架,可以在Windows、Linux和macOS上运行。在本攻略中,我们将讨论如何在IIS上部署ASP.NET Core项目,并总结一些常见问题及其解决方案。 步骤一:安装.NET Core Runtime和.NET Core Hosting Bund…

    C# 2023年5月17日
    00
  • C#计算程序执行过程花费时间的方法

    一、通过System.Diagnostics.Stopwatch类获取程序执行过程花费时间 引用命名空间System.Diagnostics。 创建Stopwatch实例。 使用Start()方法启动计时器。 执行需要计时的代码逻辑。 使用Stop()方法停止计时器。 使用ElapsedMilliseconds属性获取程序执行的毫秒数。 示例一: using…

    C# 2023年6月1日
    00
  • C#使用is、as关键字以及显式强转实现引用类型转换

    当我们在使用C#编程时,有时需要进行不同数据类型之间的转换,而引用类型转换是很常见的一种情况,这时我们可以通过使用C#中的is、as关键字以及显式强制类型转换来实现引用类型转换。 1. 什么是is、as关键字以及显式强制类型转换 1.1 关于is、as关键字 is:它是一个二元运算符,用来判断一个引用是否指向给定的类型的一个实例。其语法格式为:variabl…

    C# 2023年5月15日
    00
  • C#实现的优酷真实视频地址解析功能(2014新算法)

    C#实现的优酷真实视频地址解析功能(2014新算法) 简介 优酷视频地址解析,指的是提取优酷视频的原始播放地址,以便用户可以直接使用其他播放器播放视频。C#实现的优酷视频地址解析功能可以实现对优酷视频的深层次解析。 实现步骤: 1. 解析视频信息 第一步是解析视频信息,也就是获取视频播放页面的html源代码。解析可通过HttpWebRequest或HttpC…

    C# 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部