Высокопроизводительный компонент обнаружения незаконных слов (конфиденциальных слов), поставляется с обменом традиционным и упрощенным китайским языком, поддерживает обмен полной и половинной ширины, получает первую букву пиньинь, получает буквы пиньинь, нечеткий поиск пиньинь и другие функции.
Язык C#
с использованием фильтрации StringSearchEx2.Replace
, скорость фильтрации чувствительного словаря размером 48 тыс. превышает 300 миллионов символов в секунду. (процессор 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
: специальный класс для фильтрации недопустимых слов (критических слов). Вы можете установить длину пропускаемого слова: от полной ширины до полуширины. Игнорировать регистр, пропускать слова, повторяющиеся слова и черный список . Метод search 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 ) ;
// 转成简体
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 обеспечивает более высокую скорость загрузки (в настоящее время только код C#).
PinyinMatch
: методы включают SetKeywords
, SetIndexs
, Find
и FindIndex
.
PinyinMatch<T>
: методы включают SetKeywordsFunc
, SetPinyinFunc
, SetPinyinSplitChar
и 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 ) ;
После выполнения 100 000 сравнений производительности результаты следующие:
Примечание. Встроенная регуляризация C# очень медленная. StringSearchEx2.ContainsAny
более чем в 88 000 раз эффективнее Regex.IsMatch
, что связано с количеством ключевых слов.
Regex.Matches
работает аналогично IQueryable
, только возвращает MatchCollection
без вычислений.
В тесте «Найти все» (обнаруженный текст содержит деликатные слова и не будет отображаться. Вы можете выполнить отладку и проверку самостоятельно).
FastFilter
может обнаружить только 7
StringSearch
обнаружено 14
Интерлюдия: после тщательного изучения магии Regex.Matches
в течение 3 мс я обнаружил, что у Regex.Matches
есть небольшая проблема:
Regex.Matches
может обнаружить только 11
Автор: wenlifan Адрес: https://github.com/wenlifan/SensitiveWordFilter
«Система просмотра контента ToolGood» официально имеет открытый исходный код, работает на двух платформах Windows и Linux, а использование памяти составляет менее 100 МБ.
Официальный сайт: https://toolgood.com/
Открытый исходный код: https://github.com/toolgood/ToolGood.TextFilter.
Ассоциация исследований фильтрации конфиденциальной информации, группа Q: 128994346 (полный)
Я не преподаватель, поэтому прошу не задавать простых вопросов об использовании проекта, загрузке и т. д.
1. Что касается схемы фильтрации конфиденциальных слов
2. Общая система проверки конфиденциальных слов компании.
3. Решение для новичков по фильтрации деликатных слов.
4. Методы фильтрации часто используемых деликатных слов в Интернете.
5. Алгоритм ToolGood.Words, фильтрующий принцип оптимизации чувствительных слов (плата 30 юаней за один обед в KFC)
6. Подробное объяснение оптимизации открытого исходного кода ToolGood.TextFilter (стоимость 300 юаней). Сравните с алгоритмом IllegalWordsSearch, чтобы объяснить точки оптимизации алгоритма фильтрации ToolGood.TextFilter и способы уменьшения использования памяти. Есть еще небольшая часть, которая еще не написана. Нетерпеливые могут сначала купить ее, продолжу обновлять.
7. Алгоритм обычного перехода к DFA (версия C#, версия JAVA) (плата 30 юаней за один обед в KFC). Один из основных алгоритмов ToolGood.TextFilter использует обычный переход на DFA.
8. Версия порнографии на C# (плата 30 юаней за один обед в KFC)
Машина для коллизий закрытых ключей Биткойн использует производительность компьютера в режиме ожидания (память 3G), чтобы выиграть 250 000 биткойнов.
Машина для коллизий приватных ключей Биткойн (стоимость 50 юаней)
Исходный код машины столкновения закрытых ключей Биткойн (плата 500 юаней)