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#实现NPOI的Excel导出详解

    C#实现NPOI的Excel导出详解 简介 NPOI是专门用于处理Microsoft Office格式文件的.NET库,可以实现对Excel、Word、PowerPoint等文件的读写操作。在C#项目中,使用NPOI库可以快速实现Excel的导入导出功能。本文将详细讲解如何使用NPOI实现Excel导出功能。 步骤 1. 引入NPOI库 在项目中引入NPOI…

    C# 2023年6月7日
    00
  • c# rsa加密解密详解

    C# RSA加密解密详解 什么是RSA RSA是一种非对称加密算法,通过一个密钥对(公钥和私钥)来实现加密解密。公钥可以公开,用于加密数据;私钥用于解密加密后的数据。 RSA加密解密步骤 随机生成一对RSA密钥(公钥和私钥) 使用公钥对明文进行加密得到密文 使用私钥对密文进行解密得到明文 C#实现RSA加密解密 生成密钥对 在C#中可以使用RSACrypto…

    C# 2023年5月15日
    00
  • c# 值类型实例构造器

    C#值类型实例构造器 在C#中,值类型是一种基本数据类型,如int、double、char、bool等等。与引用类型不同,值类型的实例被存储在堆栈中,而不是在堆中。C#值类型实例构造器是一种特殊的方法,在值类型实例被创建时,它会被自动调用。本文将详细讲解C#值类型实例构造器的用法和示例。 构造器的概念和特点 构造器是一种特殊的方法,它用于初始化一个类的实例。…

    C# 2023年5月15日
    00
  • C# Linq的Single()方法 – 返回序列中的唯一元素

    C# Linq中Single()函数的完整攻略 Single()函数是C# Linq中的一个用于查询的函数,它返回一个序列中单个特定元素,如果序列包含多个元素,则会引发异常。这篇攻略会详细讲解Single()函数的用法,并提供一些示例来帮助读者理解。 语法 下面是Single()函数的语法: public static TSource Single<T…

    C# 2023年4月19日
    00
  • .Net插件框架Managed Extensibility Framework简介

    .Net插件框架Managed Extensibility Framework(MEF)是一个用于在应用程序中使用插件的框架。它利用了C#语言的特性和CLR(共同语言运行时)的能力,为应用程序提供了一种灵活的架构,使得可以追加或更改应用程序中的功能,而无需重新编译或修改代码。 什么是MEF MEF是Microsoft推出的,用于构建可扩展和高度可组合的应用程…

    C# 2023年6月3日
    00
  • 在 .NET MAUI 中加载 json 文件的方法

    以下是关于在.NET MAUI中加载JSON文件的方法的完整攻略: 1. 问题描述 在.NET MAUI应用程序中,我们需要加载JSON文件以便读取其中的数据。本攻略将介绍如何在.NET MAUI中加载JSON文件。 2. 解决方案 在.NET MAUI中,我们可以使用System.Text.Json命名空间中的JsonSerializer类来加载JSON文…

    C# 2023年5月12日
    00
  • c#程序删除自身代码示例分享

    下面是” C#程序删除自身代码示例分享”的完整攻略。 1. 实现原理 C#代码删除自身的实现原理是通过使用Process类的Start静态方法和ProcessStartInfo类来实现。Process类可以帮助你控制与其他进程交互的行为。 代码可以使用Process类的Start方法启动一个新的进程。这个新的进程可以是你自己的程序,也可以是其他的程序。可以使…

    C# 2023年5月15日
    00
  • macOS系统下Vscode的python配置教程

    下面是详细讲解“macOS系统下Vscode的python配置教程”的完整攻略: 步骤一:安装Python环境 在macOS系统中,Python环境已经默认安装,如果没有安装,可以到 Python官网 下载安装。安装完成后,打开Terminal终端,输入 python 命令,如果出现 python 的版本信息,则表示已经安装成功了。 步骤二:安装Visual…

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