ToolGood.Words敏感詞過濾組件

類庫名字爲ToolGood.Words: 
一款高性能非法詞(敏感詞)檢測組件,附帶繁體簡體互換,支持全角半角互換,獲取拼音首字母,獲取拼音字母,拼音模糊搜索等功能。 
地址:https://github.com/toolgood/ToolGood.Words

在VisualStudio 中可以用 NuGet管理器添加類庫。 
操作如下: 
1、在引用處點擊NuGet管理器 
這裏寫圖片描述 
2、因爲NuGet使用的源默認是國外的地址,如果沒有翻牆一般連接不上,可以換中國的連接地址,方法如下,按照圖片填寫相關信息 
這裏寫圖片描述 
3、搜索並下載ToolGood,即可引用 
這裏寫圖片描述 
切記右上角需要切換到nuget.cnblogs.com。如果第一次設置,需要重啓VS後方可生效。

示例: 
ToolGood.Words

一款高性能非法詞(敏感詞)檢測組件,附帶繁體簡體互換,支持全角半角互換,獲取拼音首字母,獲取拼音字母,拼音模糊搜索等功能。

文件夾說明:

ToolGood.PinYin.Build: 生成詞的拼音 
ToolGood.PinYin.WordsBuild: 生成多音詞的拼音 
ToolGood.Words.Contrast: 字符串搜索對比 
ToolGood.Words.Test: 單元測試 
ToolGood.Words: 本項目源代碼 
繁體簡體互換、全角半角互換、數字轉成中文大寫、拼音操作

// 轉成簡體
WordsHelper.ToSimplifiedChinese("壹佰貳拾叄億肆仟伍佰陸拾柒萬捌仟玖佰零壹元壹角貳分");
// 轉成繁體
WordsHelper.ToTraditionalChinese("壹佰貳拾叄億肆仟伍佰陸拾柒萬捌仟玖佰零壹元壹角貳分");
// 轉成全角
WordsHelper.ToSBC("abcABC123");
// 轉成半角
WordsHelper.ToDBC("abcABC123");
// 數字轉成中文大寫
WordsHelper.ToChineseRMB(12345678901.12);
// 中文轉成數字
WordsHelper.ToNumber("壹佰貳拾叄億肆仟伍佰陸拾柒萬捌仟玖佰零壹元壹角貳分");
// 獲取全拼
WordsHelper.GetPinYin("我愛中國");//WoAiZhongGuo
// 獲取首字母
WordsHelper.GetFirstPinYin("我愛中國");//WAZG
// 獲取全部拼音
WordsHelper.GetAllPinYin('傳');//Chuan,Zhuan

拼音模糊搜索

var text = "阿根廷,澳大利亞,比利時,玻利維亞,巴西,白俄羅斯,加拿大,智利,中國,哥倫比亞,哥斯達黎加,古巴,捷克斯洛伐克,丹麥,多米尼加共和國,厄瓜多爾,埃及,薩爾瓦多,埃塞俄比亞,法國,希臘,危地馬拉,海地,洪都拉斯,印度,伊朗,伊拉克,黎巴嫩,利比里亞,盧森堡,墨西哥,荷蘭,新西蘭,尼加拉瓜,挪威,巴拿馬,巴拉圭,祕魯,菲律賓,波蘭,俄羅斯聯邦,沙特阿拉伯,南非,阿拉伯敘利亞共和國,土耳其,烏克蘭,大不列顛及北愛爾蘭聯合王國,美利堅合衆國,烏拉圭,委內瑞拉,南斯拉夫,阿富汗,冰島,瑞典,泰國,巴基斯坦,也門,緬甸,以色列,印度尼西亞,阿爾巴尼亞,澳地利,保加利亞,柬埔寨,芬蘭,匈牙利,愛爾蘭,意大利,約旦,老撾人民民主共和國,羅馬利亞,西班牙,斯里蘭卡,阿拉伯利比亞民衆國,尼泊爾,葡萄牙,日本,摩洛哥,蘇丹,突尼斯,加納,馬來西亞,幾內亞,貝寧,布基納法索,喀麥隆,中非共和國,乍得,剛果,科特迪瓦,塞浦路斯,加蓬,馬達加斯加,馬裏,尼日爾,尼日利亞,塞內加爾,索馬里,多哥,剛果民主共和國,毛里塔尼亞,蒙古,塞拉利昂,坦桑尼亞聯合共和國,阿爾及利亞,布隆迪,牙買加,盧旺達,特立尼達和多巴哥,烏干達,肯尼亞,科威特,馬拉維,馬耳他,贊比亞,岡比亞,馬爾代夫,新加坡,巴巴多斯,博茨瓦納,圭亞那,萊索托,民主也門,赤道幾內亞,毛里求斯,斯威士蘭,斐濟,巴林,不丹,阿曼,卡塔爾,阿拉伯聯合酋長國,巴哈馬,德意志聯邦共和國,德意志民主共和國,孟加拉國,格林納達,幾內亞比紹,佛得角,科摩羅,莫桑比克,巴布亞新幾內亞,聖多美和普林西比多米尼加,所羅門羣島,蘇里南,安哥拉,薩摩亞,塞舌爾,吉布提,越南,聖盧西亞,聖文森特和格林納丁斯,津巴布韋,安提瓜和巴布達,伯利茲,瓦努阿圖,聖基茨和尼維斯,文萊達魯薩蘭國,列支敦士登,納米比亞,朝鮮民主主義人民共和國,愛沙尼亞,密克羅尼西亞聯邦,拉脫維亞,立陶宛,馬紹爾羣島,大韓民國,亞美尼亞,阿塞拜疆,波斯尼亞和黑塞哥維那,克羅地亞,格魯吉亞,哈薩克斯坦,吉爾吉斯,摩爾多瓦,聖馬力諾,斯洛文尼亞,塔吉克斯坦,土庫曼斯坦,烏茲別克斯坦,安道爾,捷克共和國,厄立特里亞,摩納哥,斯洛伐克共和國,前南斯拉夫的馬其頓共和國,帕勞,基裏巴斯共和國,瑙魯,湯加,圖瓦盧,南斯拉夫,瑞士,東帝汶";
PinYinSearch search = new PinYinSearch(PinYinSearchType.PinYin);
search.SetKeywords(text.Split(',').ToList());

search.SearchTexts("ad",true);//安道爾,澳大利亞,澳地利
search.SearchTexts("ad",false);//澳大利亞,澳地利,安道爾
search.SearchTexts("白e");//白俄羅斯
search.SearchTexts("baie");//白俄羅斯
search.SearchTexts("bai俄");//白俄羅斯

PinYinSearch的方法:SetKeywords、SearchTexts、SearchIds、SearchTextWithIds、PickTexts、PickTextWithIds。

PinYinSearchEx是PinYinSearch的增強版,優化內存使用量,增加方法SaveFile、LoadFile。

注:PinYinSearchEx測試28W關鍵字,總字數147W,內存使用量32M,輸出文件38M。

非法詞(敏感詞)檢測(字符串搜索)

非法詞(敏感詞)檢測類:StringSearch、WordsSearch、IllegalWordsSearch、IllegalWordsQuickSearch;

StringSearch: 搜索FindFirst方法返回結果爲string類型。 
WordsSearch: 搜索FindFirst方法返回結果爲WordsSearchResult類型, WordsSearchResult不僅僅有關鍵字,還有關鍵字的開始位置、結束位置,關鍵字序號等。 
IllegalWordsSearch: 過濾非法詞(敏感詞)專用類,可設置跳字長度,默認繁體轉簡體,全角轉半角,忽略大小寫,轉化特殊數字, 搜索FindFirst方法返回爲IllegalWordsSearchResult,有關鍵字,開始位置、結束位置。 
IllegalWordsQuickSearch: IllegalWordsSearch簡化版本。 
IllegalWordsSearchEx支持默認繁體轉簡體,全角轉半角,忽略大小寫,轉化特殊數字,停頓詞,重複詞 
共同方法有:SetKeywords、ContainsAny、FindFirst、FindAll、Replace 
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);

性能對比

執行10萬次性能對比,結果如下:

10W次性能對比

注:C#自帶正則很慢,StringSearch.ContainsAny是Regex.IsMatch效率的1.5萬倍。

Regex.Matches的運行方式跟IQueryable的類似,只返回MatchCollection,還沒有計算。

TrieFilter,FastFilter來源: http://www.cnblogs.com/yeerh/archive/2011/10/20/2219035.html

在 Find All測試中,

FastFilter只能檢測出7個: [0]: “主席” [1]: “趙洪祝” [2]: “中國” [3]: “鐵道部” [4]: “黨” [5]: “胡錦濤” [6]: “倒臺”

StringSearch檢測出14個: [0]: “黨” [1]: “黨委” [2]: “西藏” [3]: “黨” [4]: “黨委” [5]: “主席” [6]: “趙洪祝” [7]: “中國” [8]: “鐵道部” [9]: “黨” [10]: “胡錦濤” [11]: “錦濤” [12]: “倒臺” [13]: “黑社會”

IllegalWordsSearch檢出15個: [0]: {63|黨} [1]: {63|黨委} [2]: {81|西藏} [3]: {83|黨} [4]: {83|黨委} [5]: {143|主席} [6]: {185|趙洪祝} [7]: {204|中國} [8]: {221|鐵道部} [9]: {235|黨} [10]: {244|胡錦濤} [11]: {245|錦濤} [12]: {323|倒臺} [13]: {324|臺} [14]: {364|黑社會}

IllegalWordsSearch比StringSearch多一個臺,原因:關鍵字繁體轉簡體

插曲:在細查Regex.Matches神奇3ms,我發現Regex.Matches有一個小問題,

Regex.Matches只能檢測出11個: [0]: “黨” [1]: “西藏” [2]: “黨” [3]: “主席” [4]: “趙洪祝” [5]: “中國” [6]: “鐵道部” [7]: “黨” [8]: “胡錦濤” [9]: “倒臺” [10]: “黑社會”

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章