一款高性能非法词(敏感词)检测组件,附带繁体简体互换,支持全角半角互换,获取拼音首字母,获取拼音字母,拼音模糊搜索等功能。
C#
语言,使用StringSearchEx2.Replace
过滤,在48k敏感词库上的过滤速度超过3亿字符每秒。(cpu i7 8750h)
csharp 文件夹说明:
ToolGood.Pinyin.Build: 生成词的拼音
ToolGood.Pinyin.Pretreatment: 生成拼音预处理,核对拼音,词组最小化
ToolGood.Transformation.Build: 生成简体繁体转换文档,更新时文档放在同一目录下,词库参考 https://github.com/BYVoid/OpenCC
ToolGood.Words.Contrast: 字符串搜索对比
ToolGood.Words.Test: 单元测试
ToolGood.Words: 本项目源代码
非法词(敏感词)检测类:StringSearch
、StringSearchEx
、StringSearchEx2
、WordsSearch
、WordsSearchEx
、WordsSearchEx2
、IllegalWordsSearch
;
StringSearch
、StringSearchEx
、StringSearchEx2
、StringSearchEx3
: 搜索FindFirst
方法返回结果为string
类型。WordsSearch
、WordsSearchEx
、WordsSearchEx2
、WordsSearchEx3
: 搜索FindFirst
方法返回结果为WordsSearchResult
类型,WordsSearchResult
不仅仅有关键字,还有关键字的开始位置、结束位置,关键字序号等。IllegalWordsSearch
: 过滤非法词(敏感词)专用类,可设置跳字长度,默认全角转半角,忽略大小写,跳词,重复词,黑名单, 搜索FindFirst
方法返回为IllegalWordsSearchResult
,有关键字,对应原文,开始、位置,黑名单类型。IllegalWordsSearch
、StringSearchEx
、StringSearchEx2
、WordsSearchEx
、WordsSearchEx2
使用Save
、Load
方法,可以加快初始化。- 共同方法有:
SetKeywords
、ContainsAny
、FindFirst
、FindAll
、Replace
IllegalWordsSearch
独有方法:SetSkipWords
(设置跳词)、SetBlacklist
(设置黑名单)。IllegalWordsSearch
字段UseIgnoreCase
:设置是忽略否大小写,必须在SetKeywords
方法之前,注:使用Load
方法则该字段无效。StringSearchEx3
、WordsSearchEx3
为指针版优化版,实测时发现性能浮动比较大。
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);
非法词(敏感词)检测类:StringMatch
、StringMatchEx
、WordsMatch
、WordsMatchEx
。
支持部分正则表达式类型:.
(点)?
(问号) []
(方括号) (|)
(括号与竖线)
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);