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#实现飞行棋游戏

    C#实现飞行棋游戏攻略 1. 游戏规则概述 飞行棋是一种常见的棋类游戏,又称“飞行棋”,据传说源于古印度的游戏,起源于印度古董陀罗尼。其游戏规则如下: 1.1 游戏棋盘 游戏棋盘为正方形,格数为12×12。每个玩家有4个飞机,分为红、黄、蓝、绿四色。 1.2 开始游戏 游戏开始时,每个玩家的4架飞机都在停机坪上。每次掷骰子,6点时,可以先从停机坪起飞一架飞机…

    C# 2023年6月6日
    00
  • C#如何操作Excel数据透视表

    C#操作Excel数据透视表需要使用Microsoft.Office.Interop.Excel命名空间,以下是详细攻略: 安装Microsoft Excel:在操作Excel之前,必须安装Microsoft Excel软件。如果已经安装则可以跳过该步骤。 添加引用:右击项目,选择“添加”->“引用”,在弹出的对话框中选择“COM”标签页,找到Micr…

    C# 2023年6月6日
    00
  • ASP.NET Core MVC中Required与BindRequired用法与区别介绍

    在ASP.NET Core MVC中,Required和BindRequired都是用于验证模型绑定的属性是否为必填项的特性。本攻略将深入探讨Required和BindRequired的用法和区别,并提供两个示例说明。 Required特性 Required特性用于验证模型绑定的属性是否为必填项。如果属性为空,则模型验证将失败。以下是一个示例: public…

    C# 2023年5月17日
    00
  • C#支付宝扫码支付代码完整版

    C#支付宝扫码支付代码完整版详解 作为网站作者,今天我来为大家详细讲解“C#支付宝扫码支付代码完整版”的完整攻略。我们将会探讨如何在C#语言环境下,使用支付宝扫码支付。 前置知识 在开始探讨代码之前,我们需要了解几个基本的概念和相关部件: 支付宝开放平台(Alipay Open Platform):支付宝提供的用于接入其开放API的第三方平台。 支付宝开放平…

    C# 2023年5月31日
    00
  • asp.net获取网站目录物理路径示例

    ASP.NET 是一个非常常用的 Web 应用程序框架,我们经常需要获取网站目录的物理路径来读取文件、写入文件或者其他操作。下面给出 ASP.NET 获取网站目录物理路径的完整攻略。 步骤一:引用命名空间 我们需要引用 System.IO 命名空间来使用 Path 类。 using System.IO; 步骤二:获取网站的根目录 常见的获取网站路径的方法是使…

    C# 2023年5月31日
    00
  • C# List实现行转列的通用方案

    针对 C# List 实现行转列的通用方案,我可以提供以下完整攻略。 1.背景 在实际项目开发过程中,经常需要处理行列互换的操作,即将代表行的数据转换为代表列的数据格式,反之亦然。这种操作在数据仓库中非常常见,例如从 Excel 或数据库中读取的数据通常是行格式,但分析和绘图会更容易处理交换后的列存储数据。C# 中提供了 List 类实现行列转换的方法,本篇…

    C# 2023年6月1日
    00
  • C#利用反射实现多数据库访问

    C#利用反射实现多数据库访问的完整攻略指的是使用C#编程语言,通过反射技术实现对多种不同的数据库的访问操作。在开发过程中,我们可以针对不同的数据库类型编写不同的代码。下面是整个过程的具体步骤: 添加必要的引用和命名空间:在使用反射进行数据库访问操作之前,我们需要在引用中添加 System.Reflection 和 System.Data 命名空间。添加这些命…

    C# 2023年6月1日
    00
  • C#多线程系列之线程的创建和生命周期

    C#多线程系列之线程的创建和生命周期 线程的创建 在C#中,要创建一个新线程可以有三种方法: 1. 使用Thread类 可以通过创建Thread类对象并将其启动来创建新线程。Thread类的构造函数可以传递一个无参数的方法,该方法将在新线程中执行。Thread类中的Start方法将启动线程。 using System.Threading; class Pro…

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