Un composant de détection de mots illégaux (mots sensibles) haute performance, livré avec l'échange en chinois traditionnel et simplifié, prend en charge l'échange pleine largeur et demi-largeur, obtient la première lettre du Pinyin, obtient les lettres Pinyin, la recherche floue Pinyin et d'autres fonctions.
Langage C#
, utilisant le filtrage StringSearchEx2.Replace
, la vitesse de filtrage sur le vocabulaire sensible 48k dépasse 300 millions de caractères par seconde. (processeur i7 8750h)
Description du dossier csharp :
ToolGood.Pinyin.Build: 生成词的拼音
ToolGood.Pinyin.Pretreatment: 生成拼音预处理,核对拼音,词组最小化
ToolGood.Transformation.Build: 生成简体繁体转换文档,更新时文档放在同一目录下,词库参考 https://github.com/BYVoid/OpenCC
ToolGood.Words.Contrast: 字符串搜索对比
ToolGood.Words.Test: 单元测试
ToolGood.Words: 本项目源代码
Classe de détection de mots illégaux (mots sensibles) : StringSearch
, StringSearchEx
, StringSearchEx2
, WordsSearch
, WordsSearchEx
, WordsSearchEx2
, IllegalWordsSearch
;
StringSearch
, StringSearchEx
, StringSearchEx2
, StringSearchEx3
: le résultat de la recherche renvoyé par la méthode FindFirst
est de type string
.WordsSearch
, WordsSearchEx
, WordsSearchEx2
, WordsSearchEx3
: Le résultat de recherche renvoyé par FindFirst
est du type WordsSearchResult
contient non seulement des WordsSearchResult
-clés, mais également la position de départ, la position de fin du mot-clé, le numéro de série du mot-clé, etc.IllegalWordsSearch
: Une classe spéciale pour filtrer les mots illégaux (mots sensibles). Vous pouvez définir la longueur du mot sauté. La valeur FindFirst
défaut est pleine largeur à demi-largeur, ignorer les mots, les mots répétés et la liste noire . IllegalWordsSearchResult
, qui contient des mots-clés et correspond au texte original Début, position, type de liste noire.IllegalWordsSearch
, StringSearchEx
, StringSearchEx2
, WordsSearchEx
, WordsSearchEx2
utilisent les méthodes Save
et Load
pour accélérer l'initialisation.SetKeywords
, ContainsAny
, FindFirst
, FindAll
, Replace
IllegalWordsSearch
: SetSkipWords
(définir des mots ignorés), SetBlacklist
(définir une liste noire).IllegalWordsSearch
UseIgnoreCase
: Définissez s'il faut ignorer la casse ou non. Il doit être avant la méthode SetKeywords
Remarque : ce champ n'est pas valide lors de l'utilisation de la méthode Load
.StringSearchEx3
et WordsSearchEx3
sont des versions optimisées pour les pointeurs. Lors des mesures réelles, il a été constaté que les performances fluctuaient considérablement. 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 ) ;
Catégories de détection de mots illégaux (mots sensibles) : StringMatch
, StringMatchEx
, WordsMatch
, WordsMatchEx
.
Prend en charge certains types d'expressions régulières : .
(point) ?
(point d'interrogation) []
(crochets) (|)
(crochets et barres verticales)
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 recherche une vitesse de chargement plus rapide (actuellement uniquement du code C#).
PinyinMatch
: les méthodes incluent SetKeywords
, SetIndexs
, Find
et FindIndex
.
PinyinMatch<T>
: les méthodes incluent SetKeywordsFunc
, SetPinyinFunc
, SetPinyinSplitChar
et 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 ) ;
Après avoir effectué 100 000 comparaisons de performances, les résultats sont les suivants :
Remarque : la régularisation intégrée de C# est très lente. StringSearchEx2.ContainsAny
est plus de 88 000 fois plus efficace que Regex.IsMatch
, qui est liée au nombre de mots-clés.
Regex.Matches
fonctionne de la même manière que IQueryable
, renvoyant uniquement MatchCollection
sans calcul.
Dans le test Rechercher tout (le texte détecté contient des mots sensibles et ne sera pas affiché. Vous pouvez déboguer et vérifier par vous-même).
FastFilter
ne peut en détecter que 7
StringSearch
détecté 14
Interlude : Après avoir scruté la magie Regex.Matches
pendant 3 ms, j'ai découvert que Regex.Matches
avait un petit problème,
Regex.Matches
ne peut en détecter que 11
Auteur : wenlifan Adresse : https://github.com/wenlifan/SensitiveWordFilter
"ToolGood Content Review System" est officiellement open source, avec deux plates-formes Windows et Linux, et l'utilisation de la mémoire est inférieure à 100 Mo.
Site officiel : https://toolgood.com/
Code source ouvert : https://github.com/toolgood/ToolGood.TextFilter
Association de recherche sur le filtrage des informations sensibles, groupe Q : 128994346 (complet)
Je ne suis pas enseignant, alors ne posez pas de questions simples sur l'utilisation du projet, le chargement, etc.
1. Éléments concernant le système de filtrage des mots sensibles
2. Système commun d'examen des mots sensibles de l'entreprise
3. Solution pour les débutants pour filtrer les mots sensibles
4. Méthodes de filtrage des mots sensibles couramment utilisés sur Internet
5. Algorithme ToolGood.Words filtrant le principe d'optimisation des mots sensibles (facturation de 30 yuans, un repas chez KFC)
6. Explication détaillée de l'optimisation du code open source ToolGood.TextFilter (facturation de 300 yuans) Comparez avec l'algorithme IllegalWordsSearch pour expliquer les points d'optimisation de l'algorithme de filtrage ToolGood.TextFilter et comment réduire l'utilisation de la mémoire. Il reste encore une petite partie qui n'a pas encore été écrite. Ceux qui sont impatients peuvent d'abord l'acheter. Je continuerai à la mettre à jour.
7. Algorithme Regular vers DFA (version C#, version JAVA) (facturez 30 yuans, un repas KFC) L'un des algorithmes de base de ToolGood.TextFilter utilise Regular to DFA.
8. Version C# de l'image pornographique (facturez 30 yuans, un repas chez KFC)
La machine de collision de clés privées Bitcoin utilise les performances d'inactivité de l'ordinateur (mémoire 3G) pour gagner 250 000 Bitcoins.
Machine de collision de clé privée Bitcoin (facturation de 50 yuans)
Code source de la machine de collision de clé privée Bitcoin (facturation de 500 yuans)