Eine leistungsstarke Komponente zur Erkennung illegaler Wörter (sensibler Wörter), die den Austausch in traditionellem und vereinfachtem Chinesisch ermöglicht, den Austausch in voller und halber Breite unterstützt, den ersten Buchstaben von Pinyin ermittelt, Pinyin-Buchstaben ermittelt, Pinyin-Fuzzy-Suche und andere Funktionen.
In C#
-Sprache beträgt die Filtergeschwindigkeit für das 48.000 sensible Vokabular mithilfe der StringSearchEx2.Replace
-Filterung mehr als 300 Millionen Zeichen pro Sekunde. (CPU i7 8750h)
Beschreibung des csharp-Ordners:
ToolGood.Pinyin.Build: 生成词的拼音
ToolGood.Pinyin.Pretreatment: 生成拼音预处理,核对拼音,词组最小化
ToolGood.Transformation.Build: 生成简体繁体转换文档,更新时文档放在同一目录下,词库参考 https://github.com/BYVoid/OpenCC
ToolGood.Words.Contrast: 字符串搜索对比
ToolGood.Words.Test: 单元测试
ToolGood.Words: 本项目源代码
Erkennungsklasse für ungültige Wörter (sensible Wörter): StringSearch
, StringSearchEx
, StringSearchEx2
, WordsSearch
, WordsSearchEx
, WordsSearchEx2
, IllegalWordsSearch
;
StringSearch
, StringSearchEx
, StringSearchEx2
, StringSearchEx3
: Das von der FindFirst
-Methode zurückgegebene Suchergebnis ist vom Typ string
.WordsSearch
, WordsSearchEx
, WordsSearchEx2
, WordsSearchEx3
: Das von FindFirst
-Methode zurückgegebene Suchergebnis ist vom Typ WordsSearchResult
und enthält nicht nur WordsSearchResult
, sondern auch die Startposition, Endposition des Schlüsselworts, die Seriennummer des Schlüsselworts usw.IllegalWordsSearch
: Eine spezielle Klasse zum Filtern illegaler Wörter (sensible Wörter). Die Standardeinstellung ist „Groß-/Kleinschreibung ignorieren“, „Wörter überspringen“, „Wörter wiederholen“ und „Blacklist“ FindFirst
IllegalWordsSearchResult
, das Schlüsselwörter enthält und dem Originaltext Start, Position, Blacklist-Typ entspricht.IllegalWordsSearch
, StringSearchEx
, StringSearchEx2
, WordsSearchEx
, WordsSearchEx2
verwenden die Methoden Save
und Load
, um die Initialisierung zu beschleunigen.SetKeywords
, ContainsAny
, FindFirst
, FindAll
, Replace
IllegalWordsSearch
: SetSkipWords
(Überspringwörter festlegen), SetBlacklist
(Blacklist festlegen).IllegalWordsSearch
Feld UseIgnoreCase
: Legen Sie fest, ob die Groß-/Kleinschreibung ignoriert werden soll. Es muss vor der SetKeywords
-Methode stehen. Hinweis: Dieses Feld ist ungültig, wenn die Load
-Methode verwendet wird.StringSearchEx3
und WordsSearchEx3
sind zeigeroptimierte Versionen. Bei der tatsächlichen Messung wurde festgestellt, dass die Leistung stark schwankte. 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 ) ;
Erkennungskategorien für ungültige Wörter (sensible Wörter): StringMatch
, StringMatchEx
, WordsMatch
, WordsMatchEx
.
Unterstützt einige reguläre Ausdruckstypen: .
(Punkt) ?
(Fragezeichen) []
(eckige Klammern) (|)
(Klammern und vertikale Balken)
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ī
ToolGood.Words.Pinyin strebt eine schnellere Ladegeschwindigkeit an (derzeit nur C#-Code).
PinyinMatch
: Zu den Methoden gehören SetKeywords
, SetIndexs
, Find
und FindIndex
.
PinyinMatch<T>
: Zu den Methoden gehören SetKeywordsFunc
, SetPinyinFunc
, SetPinyinSplitChar
und Find
.
string s = "北京|天津|河北|辽宁|吉林|黑龙江|山东|江苏|上海|浙江|安徽|福建|江西|广东|广西|海南|河南|湖南|湖北|山西|内蒙古|宁夏|青海|陕西|甘肃|新疆|四川|贵州|云南|重庆|西藏|香港|澳门|台湾" ;
PinyinMatch match = new PinyinMatch ( ) ;
match . SetKeywords ( s . Split ( '|' ) . ToList ( ) ) ;
var all = match . Find ( "BJ" ) ;
Assert . AreEqual ( "北京" , all [ 0 ] ) ;
Assert . AreEqual ( 1 , all . Count ) ;
all = match . Find ( "北J" ) ;
Assert . AreEqual ( "北京" , all [ 0 ] ) ;
Assert . AreEqual ( 1 , all . Count ) ;
all = match . Find ( "北Ji" ) ;
Assert . AreEqual ( "北京" , all [ 0 ] ) ;
Assert . AreEqual ( 1 , all . Count ) ;
all = match . Find ( "S" ) ;
Assert . AreEqual ( "山东" , all [ 0 ] ) ;
Assert . AreEqual ( "江苏" , all [ 1 ] ) ;
var all2 = match . FindIndex ( "BJ" ) ;
Assert . AreEqual ( 0 , all2 [ 0 ] ) ;
Assert . AreEqual ( 1 , all . Count ) ;
Nach der Durchführung von 100.000 Leistungsvergleichen sind die Ergebnisse wie folgt:
Hinweis: Die in C# integrierte Regularisierung ist sehr langsam. StringSearchEx2.ContainsAny
ist mehr als 88.000 Mal effizienter als Regex.IsMatch
, was mit der Anzahl der Schlüsselwörter zusammenhängt.
Regex.Matches
funktioniert ähnlich wie IQueryable
und gibt nur MatchCollection
ohne Berechnung zurück.
Im „Alle suchen“-Test (der erkannte Text enthält vertrauliche Wörter und wird nicht angezeigt. Sie können selbst debuggen und prüfen).
FastFilter
kann nur 7 erkennen
StringSearch
hat 14 erkannt
Zwischenspiel: Nachdem ich die Magie Regex.Matches
3 ms lang untersucht hatte, stellte ich fest, dass Regex.Matches
ein kleines Problem hat:
Regex.Matches
kann nur 11 erkennen
Autor: wenlifan Adresse: https://github.com/wenlifan/SensitiveWordFilter
„ToolGood Content Review System“ ist offiziell Open Source, mit Windows- und Linux-Doppelplattformen und der Speicherverbrauch beträgt weniger als 100 MB.
Offizielle Website: https://toolgood.com/
Open-Source-Code: https://github.com/toolgood/ToolGood.TextFilter
Sensitive Information Filtering Research Association, Q-Gruppe: 128994346 (vollständig)
Da ich kein Lehrer bin, stellen Sie bitte keine einfachen Fragen zur Projektnutzung, zum Laden usw.
1. Dinge über das Filterschema für sensible Wörter
2. Gemeinsames unternehmensweites System zur Überprüfung sensibler Wörter
3. Lösung für Neulinge zum Filtern sensibler Wörter
4. Filtermethoden für häufig verwendete sensible Wörter im Internet
5. Der ToolGood.Words-Algorithmus filtert das Prinzip der Optimierung sensibler Wörter (Gebühr 30 Yuan, eine Mahlzeit bei KFC)
6. Detaillierte Erläuterung der Open-Source-Code-Optimierung von ToolGood.TextFilter (Gebühr 300 Yuan). Vergleichen Sie mit dem IllegalWordsSearch-Algorithmus, um die Optimierungspunkte des ToolGood.TextFilter-Filteralgorithmus zu erläutern und die Speichernutzung zu reduzieren. Es gibt noch einen kleinen Teil, der noch nicht geschrieben ist. Wer ungeduldig ist, kann ihn zuerst kaufen.
7. Regulärer DFA-Algorithmus (C#-Version, JAVA-Version) (Gebühr 30 Yuan, eine KFC-Mahlzeit) Einer der Kernalgorithmen von ToolGood.TextFilter verwendet den regulären DFA-Algorithmus.
8. C#-Version von Bildpornografie (30 Yuan, eine Mahlzeit bei KFC)
Die Bitcoin-Private-Key-Kollisionsmaschine nutzt die Leerlaufleistung des Computers (3G-Speicher), um 250.000 Bitcoins zu gewinnen.
Bitcoin-Privatschlüssel-Kollisionsmaschine (Gebühr 50 Yuan)
Quellcode der Bitcoin Private Key Collision Machine (Gebühr 500 Yuan)