基于.NetCore高性能敏感词检测开源库

这篇具有很好参考价值的文章主要介绍了基于.NetCore高性能敏感词检测开源库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🏆作者:科技、互联网行业优质创作者
🏆专注领域:.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造
🏆欢迎关注我(Net数字智慧化基地),里面有很多高价值技术文章,是你刻苦努力也积累不到的经验,能助你快速成长。升职+涨薪!!

今天给大家推荐一款高性能敏感词检测开源库。

01

项目简介

这是一款基于.Net开发的、高性能敏感词工具箱,支持繁简互换、全角半角互换,拼音模糊搜索等功能。功能强大、高性能,秒级检测亿级别的文章。

02

技术架构

跨平台:采用.Net Core3.1开发,支持跨平台。可以部署在Docker, Windows, Linux, Mac。

03

项目结构

基于.NetCore高性能敏感词检测开源库,.netcore,c#,.net,visual studio,ide,开源

04

使用方法

敏感词检测

过滤敏感词,可以设置跳字长度,默认全角转半角、忽略大小写、跳词、重复词、黑名单。返回结果包含:关键字、关键字起始位置、结束位置、关键字序号等信息。


string s = "中国|国人|zg人";
string test = "我是中国人";

StringSearch iwords = new StringSearch();
iwords.SetKeywords(s.Split('|'));

var b = iwords.ContainsAny(test);
Assert.AreEqual(true, b);

var f = iwords.FindFirst(test);
Assert.AreEqual("中国", f);

var all = iwords.FindAll(test);
Assert.AreEqual("中国", all[0]);
Assert.AreEqual("国人", all[1]);
Assert.AreEqual(2, all.Count);

var str = iwords.Replace(test, '*');
Assert.AreEqual("我是***", str);

敏感词通配符检测

支持正则表达式类型:.?[]|,通过正则表达式可以进行模糊匹配,提升检测精准度。


string s = ".[中美]国|国人|zg人";
string test = "我是中国人";

WordsMatch wordsSearch = new WordsMatch();
wordsSearch.SetKeywords(s.Split('|'));

var b = wordsSearch.ContainsAny(test);
Assert.AreEqual(true, b);

var f = wordsSearch.FindFirst(test);
Assert.AreEqual("是中国", f.Keyword);

var alls = wordsSearch.FindAll(test);
Assert.AreEqual("是中国", alls[0].Keyword);
Assert.AreEqual(".[中美]国", alls[0].MatchKeyword);
Assert.AreEqual(1, alls[0].Start);
Assert.AreEqual(3, alls[0].End);
Assert.AreEqual(0, alls[0].Index);//返回索引Index,默认从0开始
Assert.AreEqual("国人", alls[1].Keyword);
Assert.AreEqual(2, alls.Count);

var t = wordsSearch.Replace(test, '*');
Assert.AreEqual("我****", t);

拼音转换、繁简转换、数字转大小写操作

此工具箱,集成了繁体简体互转、拼音转换、首字母提取、数字转大小写,使用例子如下:


// 转成简体
WordsHelper.ToSimplifiedChinese("我愛中國");
WordsHelper.ToSimplifiedChinese("我愛中國",1);// 港澳繁体 转 简体
WordsHelper.ToSimplifiedChinese("我愛中國",2);// 台湾正体 转 简体
// 转成繁体
WordsHelper.ToTraditionalChinese("我爱中国");
WordsHelper.ToTraditionalChinese("我爱中国",1);// 简体 转 港澳繁体
WordsHelper.ToTraditionalChinese("我爱中国",2);// 简体 转 台湾正体
// 转成全角
WordsHelper.ToSBC("abcABC123");
// 转成半角
WordsHelper.ToDBC("abcABC123");
// 数字转成中文大写
WordsHelper.ToChineseRMB(12345678901.12);
// 中文转成数字
WordsHelper.ToNumber("壹佰贰拾叁亿肆仟伍佰陆拾柒万捌仟玖佰零壹元壹角贰分");
// 获取全拼
WordsHelper.GetPinyin("我爱中国");//WoAiZhongGuo   
WordsHelper.GetPinyin("我爱中国",",");//Wo,Ai,Zhong,Guo   
WordsHelper.GetPinyin("我爱中国",true);//WǒÀiZhōngGuó

// 获取首字母
WordsHelper.GetFirstPinyin("我爱中国");//WAZG
// 获取全部拼音
WordsHelper.GetAllPinyin('传');//Chuan,Zhuan
// 获取姓名
WordsHelper.GetPinyinForName("单一一")//ShanYiYi
WordsHelper.GetPinyinForName("单一一",",")//Shan,Yi,Yi
WordsHelper.GetPinyinForName("单一一",true)//ShànYīYī

性能对比

下面我们用户1000字字符串,进行10万次性能对比,看看对比结果,测试代码如下:


ReadBadWord();
var text = File.ReadAllText("Talk.txt");

Console.Write("-------------------- FindFirst OR ContainsAny 100000次 --------------------

Run("TrieFilter", () => { tf1.HasBadWord(text); });
Run("FastFilter", () => { ff.HasBadWord(text); });
Run("StringSearch(ContainsAny)", () => { stringSearch.ContainsAny(text); });
Run("StringSearchEx(ContainsAny)--- WordsSearchEx(ContainsAny)代码相同", () => { stringSearchEx.ContainsAny(text); });
Run("StringSearchEx2(ContainsAny)--- WordsSearchEx2(ContainsAny)代码相同", () => { stringSearchEx2.ContainsAny(text); });
Run("StringSearchEx3(ContainsAny)--- WordsSearchEx3(ContainsAny)代码相同", () => { stringSearchEx3.ContainsAny(text); });
Run("IllegalWordsSearch(ContainsAny)", () => { illegalWordsSearch.ContainsAny(text); });


Run("StringSearch(FindFirst)", () => { stringSearch.FindFirst(text); });
Run("StringSearchEx(FindFirst)", () => { stringSearchEx.FindFirst(text); });
Run("StringSearchEx2(FindFirst)", () => { stringSearchEx2.FindFirst(text); });
Run("StringSearchEx3(FindFirst)", () => { stringSearchEx3.FindFirst(text); });
Run("WordsSearch(FindFirst)", () => { wordsSearch.FindFirst(text); });
Run("WordsSearchEx(FindFirst)", () => { wordsSearchEx.FindFirst(text); });
Run("WordsSearchEx2(FindFirst)", () => { wordsSearchEx2.FindFirst(text); });
Run("WordsSearchEx3(FindFirst)", () => { wordsSearchEx3.FindFirst(text); });
Run("IllegalWordsSearch(FindFirst)", () => { illegalWordsSearch.FindFirst(text); });




Console.Write("-------------------- Find All 100000次 --------------------

Run("TrieFilter(FindAll)", () => { tf1.FindAll(text); });
Run("FastFilter(FindAll)", () => { ff.FindAll(text); });
Run("StringSearch(FindAll)", () => { stringSearch.FindAll(text); });
Run("StringSearchEx(FindAll)", () => { stringSearchEx.FindAll(text); });
Run("StringSearchEx2(FindAll)", () => { stringSearchEx2.FindAll(text); });
Run("StringSearchEx3(FindAll)", () => { stringSearchEx3.FindAll(text); });


Run("WordsSearch(FindAll)", () => { wordsSearch.FindAll(text); });
Run("WordsSearchEx(FindAll)", () => { wordsSearchEx.FindAll(text); });
Run("WordsSearchEx2(FindAll)", () => { wordsSearchEx2.FindAll(text); });
Run("WordsSearchEx3(FindAll)", () => { wordsSearchEx3.FindAll(text); });
Run("IllegalWordsSearch(FindAll)", () => { illegalWordsSearch.FindAll(text); });


Console.Write("-------------------- Replace  100000次 --------------------

Run("TrieFilter(Replace)", () => { tf1.Replace(text); });
Run("FastFilter(Replace)", () => { ff.Replace(text); });
Run("StringSearch(Replace)", () => { stringSearch.Replace(text); });
Run("WordsSearch(Replace)", () => { wordsSearch.Replace(text); });
Run("StringSearchEx(Replace)--- WordsSearchEx(Replace)代码相同", () => { stringSearchEx.Replace(text); });
Run("StringSearchEx2(Replace)--- WordsSearchEx2(Replace)代码相同", () => { stringSearchEx2.Replace(text); });
Run("StringSearchEx3(Replace)--- WordsSearchEx3(Replace)代码相同", () => { stringSearchEx3.Replace(text); });
Run("IllegalWordsSearch(Replace)", () => { illegalWordsSearch.Replace(text); });


Console.Write("-------------------- Regex  100次 --------------------

Run(100, "Regex.IsMatch", () => { re.IsMatch(text); });
Run(100, "Regex.Match", () => { re.Match(text); });
Run(100, "Regex.Matches", () => { re.Matches(text); });


Console.Write("-------------------- Regex used Trie tree  100次 --------------------

Run(100, "Regex.IsMatch", () => { re2.IsMatch(text); });
Run(100, "Regex.Match", () => { re2.Match(text); });
Run(100, "Regex.Matches", () => { re2.Matches(text); });

执行10万次性能对比,结果如下:

基于.NetCore高性能敏感词检测开源库,.netcore,c#,.net,visual studio,ide,开源

从测试结果看,此工具比C#自带的正则效率高8.8倍,如果数量量越大性能优势越明显。

05

项目地址

https://github.com/toolgood/ToolGood.Words

🏆欢迎关注我(Net数字智慧化基地),里面有很多高价值技术文章,是你刻苦努力也积累不到的经验,能助你升职+涨薪!!
🏆点击下方卡片关注公众号,里面有很多大佬的技术文章,能助你快速成长。还可免费领取如下15个视频教程!

回复'面试',获取C#/.NET/.NET Core面试宝典

回复'C#',领取零基础学习C#编程

回复'NET',领取.NET零基础入门到实战

回复'Linux',领取Linux从入门到精通

回复'wpf',领取高薪热门【WPF上位机+工业互联网】从零手写实战

回复'Modbus',领取初识C#+上位机Modbus通信

回复'PLC',领取C#语言与西门子PLC的通信实操

回复'blazor',领取blazor从入门到实战

回复'TypeScript',领取前端热门TypeScript系统教程

回复'vue',领取vue前端从入门到精通

回复'23P',领取C#实现23种常见设计模式

回复'MongoDB',领取MongoDB实战

回复'Trans',领取分布式事务

回复'Lock',领取分布式锁实践

回复'Docker',领取微服务+Docker综合实战

回复'K8s',领取K8s部署微服务

回复'加群',进.NET技术社区交流群 文章来源地址https://www.toymoban.com/news/detail-833156.html

到了这里,关于基于.NetCore高性能敏感词检测开源库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 体验开源香山高性能开源 RISC-V 处理器

    香山处理器是乱序六发射结构设计,目前支持 RV64GCBK 扩展。香山处理器前端流水线包括分支预测单元、取指单元、指令缓冲等单元,顺序取指。后端包括译码、重命名、重定序缓冲、保留站、整型/浮点寄存器堆、整型/浮点运算单元。 https://xiangshan-doc.readthedocs.io/zh-cn/latest/

    2024年01月23日
    浏览(41)
  • 目标检测、实例分割、旋转框样样精通!详解高性能检测算法 RTMDet

    近几年来,目标检测模型,尤其是单阶段目标检测模型在工业场景中已经得到广泛应用。对于检测算法来说,模型的精度以及运行效率是实际使用时最受关注的指标。因此, 我们对目前的单阶段目标检测器进行了全面的改进:从增强模型的特征提取能力和对各个组件的计算量

    2024年02月15日
    浏览(31)
  • 开源通用高性能的分布式id序列组件

    原文地址:https://ntopic.cn/p/2023062101/ Gitee源代码仓库:https://gitee.com/obullxl/sequence-jdbc GitHub源代码仓库:https://github.com/obullxl/sequence-jdbc 业务数据的存储,少不了数据记录的id序列。 id序列(或称序列)的生成方式有很多种,比如当前时间戳、数据库的序列值(Oracle的序列,MyS

    2024年02月11日
    浏览(64)
  • 一个高性能类型安全的.NET枚举实用开源库

    从零构建.Net前后端分离项目 枚举应该是我们编程中,必不可少的了,今天推荐一个.NET枚举实用开源库,它提供许多方便的扩展方法,方便开发者使用开发。 01 项目简介 Enums.NET是一个.NET枚举实用程序库,专注于为枚举提供丰富的操作方法。它支持.NET Framework和.Net Core。它主

    2024年02月05日
    浏览(28)
  • 对话InfoQ,聊聊百度开源高性能检索引擎 Puck

    近日,百度宣布在 Apache 2.0 协议下开源自研检索引擎 Puck,这也是国内首个适用于超大规模数据集的开源向量检索引擎。向量检索算法在个性化推荐系统、多模态检索、自然语言处理等应用场景中都发挥着重要作用,特别是在处理大规模数据和高维特征数据时。 名称“Puck”取

    2024年02月06日
    浏览(38)
  • 百度自研高性能ANN检索引擎,开源了

    作者 | Puck项目组 导读 Puck是百度自研的开源ANN检索引擎。Puck开源项目包含两种百度自研的检索算法,以高召回、高准确、高吞吐为目标,适用于多种数据规模和场景。随着业务发展不断的优化和迭代,进行充分的技术开发和测试,确保了技术的可靠性和成熟度。该项目于2

    2024年02月09日
    浏览(32)
  • 可观测性革命 - 揭秘OpenObserve开源高性能云原生平台

      OpenObserve简介 OpenObserve  是一个开源的云原生可观测性平台,与 Elasticsearch 相比,存储成本降低了约 140 倍(实际结果可能因测试数据而有所不同),测试用例包括真实的日志数据,其显著降低运营成本,并提高了易用性。它可以扩展到PB级别的数据量,具有很高的性能,您

    2024年02月11日
    浏览(32)
  • 深入剖析gRPC:Google开源的高性能RPC框架

    在本篇文章中,我们将深入剖析gRPC,Google开源的高性能RPC框架。gRPC是一种基于HTTP/2的高性能、可扩展的RPC框架,它使用Protocol Buffers作为接口定义语言,可以在多种编程语言之间实现无缝通信。 gRPC的核心设计理念是:通过使用HTTP/2作为传输协议,实现高效、可扩展的RPC通信

    2024年02月19日
    浏览(38)
  • 探索Garnet:微软开源的高性能分布式缓存存储系统

    微软研究院近期宣布推出一款名为Garnet的创新开源分布式缓存存储系统,致力于解决现代应用程序在处理大规模数据时对于高吞吐量、低延迟及卓越可扩展性的严苛要求。这款基于C# .NET 8.0构建的新型系统,充分利用了现代硬件能力,为应用程序开发人员提供了加速数据访问

    2024年04月26日
    浏览(42)
  • Nginx - ​一个高性能、灵活可靠的开源Web服务器

    Nginx是什么?   Nginx是一个 高性能的HTTP和反向代理web服务器 ,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。2011年6月1日,nginx 1.0.4发布。   特点是 占有

    2024年02月07日
    浏览(61)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包