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日

相关文章

  • ASP.net连接Excel的代码

    ASP.NET连接Excel的代码主要是利用ADO.NET技术来实现的。我们可以使用连接字符串在代码中定义Excel的文件路径。下面是连接Excel文件的完整攻略及示例代码说明: 步骤1:添加Excel连接器 在ASP.NET应用程序中连接Excel,我们需要在该应用程序中添加Excel连接器。 使用NuGet包管理器对项目引用Microsoft.ACE.O…

    C# 2023年5月31日
    00
  • .NET Core剪裁器背后的技术及工作原理介绍

    .NET Core剪裁器背后的技术及工作原理介绍 什么是.NET Core剪裁器? .NET Core剪裁器是一个用于减小应用程序大小的工具。它从.NET Core运行库和应用程序生产的DLL文件中,移除未使用的程序代码和库,以减小最终应用程序的大小。通过使用.NET Core剪裁器,可以显著减少应用程序的磁盘空间占用和部署时间,并提高应用程序的执行速度。 …

    C# 2023年6月3日
    00
  • .NET Core部署到linux(CentOS)最全解决方案,进阶篇(Supervisor+Nginx)

    在.NET Core部署到linux(CentOS)最全解决方案,常规篇一文,我们详细讲解了传统的.NET Core部署到Linux服务器的方法,学到了Linux在虚拟机下的安装、Xshell,Xftp的使用方法、git在linux下的交互使用以及.net core在linux下的发布与运行全过程。本文讲讲解通过使用Supervisor+Nginx的组合来实…

    C# 2023年5月5日
    00
  • Unity实现UI光晕效果(发光效果)

    接下来我将为您介绍如何在Unity中实现UI光晕效果(发光效果)的完整攻略。本攻略中,我将提供两个示例说明来帮助您更好地理解如何实现UI光晕效果。 一、准备工作 在开始实现UI光晕效果之前,我们需要进行一些准备工作: 1. 创建UI元素 我们需要在Unity中创建一个UI元素作为展示光晕效果的对象。您可以按下快捷键“Ctrl + Shift + N”创建一个…

    C# 2023年6月3日
    00
  • C#实现的ZPL条码打印类完整实例

    下面我将为你详细讲解“C#实现的ZPL条码打印类完整实例”的实现攻略。 一、什么是ZPL格式条码打印? ZPL是Zebra Printer Language的缩写,是指扎带打印机编程语言。ZPL格式是一种专为Zebra扎带打印机设计的打印格式,它可以指定条形码类型、字体、大小等打印参数。每个字符都是通过指令来打印的,因此程序员只需要填写打印指令,就可以打印出…

    C# 2023年6月7日
    00
  • C#正则表达式匹配与替换字符串功能示例

    C#正则表达式匹配与替换字符串功能示例 什么是正则表达式? 正则表达式是一种强大的文本匹配工具,它可以用来匹配、搜索和替换文本中符合特定模式的字符串。在C#中,可以使用System.Text.RegularExpressions命名空间下的正则表达式类来操作正则表达式。 正则表达式语法 以下是常用的正则表达式语法: 语法 说明 . 匹配任意单个字符 \d 匹…

    C# 2023年6月7日
    00
  • 在C#中新手易犯的典型缺陷

    在C#中,新手常常会犯下一些典型的编程缺陷。这些缺陷可能影响程序的性能,安全性或可维护性。本攻略将针对这些缺陷进行详细讲解,并提供相应的示例代码以帮助读者更好地理解。 1. 不恰当地使用字符串连接符 在C#中,字符串连接符有两种形式:+和StringBuilder。不恰当地使用字符串连接符可能会导致代码的性能下降。 示例 1:使用字符串连接符进行字符串拼接 …

    C# 2023年5月15日
    00
  • 如何解决Webservice第一次访问特别慢的问题

    当第一次请求Web服务时,可能会遇到响应非常慢的情况。这是由于服务器在处理第一次请求时需要加载许多资源,并且缺乏缓存,因此响应会非常缓慢。下面是一些解决Web服务第一次访问慢的方法: 1.使用缓存 缓存是减少Web服务响应时间的有效方法之一。可以使用缓存来存储服务端响应数据,使得第二次及其以后的请求响应速度会更快。例如,在Java中,可以使用EhCache或…

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