고성능 불법 단어(민감한 단어) 감지 구성 요소는 중국어 번체 및 간체 교환과 함께 제공되며 전폭 및 반자 교환을 지원하고 병음의 첫 글자를 획득하고 병음 문자 획득, 병음 퍼지 검색 및 기타 기능을 제공합니다.
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 ) ;
// 转成简体
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
키워드 수와 관련된 Regex.IsMatch
보다 88,000배 더 효율적입니다.
Regex.Matches
IQueryable
과 유사하게 작동하며 계산 없이 MatchCollection
만 반환합니다.
모두 찾기 테스트에서 (감지된 텍스트에는 민감한 단어가 포함되어 표시되지 않습니다. 직접 디버그하고 확인할 수 있습니다.)
FastFilter
7개만 감지할 수 있습니다.
StringSearch
감지됨 14
막간: 3ms 동안 Regex.Matches
마법을 면밀히 조사한 후 Regex.Matches
에 작은 문제가 있음을 발견했습니다.
Regex.Matches
11개만 감지할 수 있습니다.
저자: wenlifan 주소: https://github.com/wenlifan/SensitiveWordFilter
"ToolGood 콘텐츠 검토 시스템"은 공식 오픈 소스로 Windows 및 Linux 듀얼 플랫폼을 갖추고 있으며 메모리 사용량은 100M 미만입니다.
공식 홈페이지: https://toolgood.com/
오픈 소스 코드: https://github.com/toolgood/ToolGood.TextFilter
민감정보필터링연구회, Q그룹: 128994346(전체)
저는 선생님이 아니기 때문에 프로젝트 사용법이나 로딩 등에 관한 간단한 질문은 하지 말아주세요.
1. 민감한 단어 필터링 방식에 관한 사항
2. 공통 기업 민감 단어 리뷰 시스템
3. 초보자를 위한 민감한 단어 필터링 솔루션
4. 인터넷에서 흔히 사용되는 민감한 단어에 대한 필터링 방법
5. ToolGood.Words 알고리즘 필터링 민감한 단어 최적화 원칙 (30위안, KFC에서 1끼 식사)
6. ToolGood.TextFilter 오픈소스 코드 최적화에 대한 자세한 설명(요금 300위안) IllegalWordsSearch 알고리즘과 비교하여 ToolGood.TextFilter 필터링 알고리즘의 최적화 포인트와 메모리 사용량을 줄이는 방법을 설명합니다. 아직 작성하지 않은 작은 부분이 있습니다. 급하신 분들은 먼저 구매하시면 될 것 같습니다.
7. 일반 DFA 알고리즘(C# 버전, JAVA 버전)(요금 30위안, KFC 한 끼 식사) ToolGood.TextFilter의 핵심 알고리즘 중 하나는 일반 DFA를 사용합니다.
8. C# 버전의 음란물(요금 30위안, KFC에서 1끼)
비트코인 개인 키 충돌 기계는 컴퓨터의 유휴 성능(3G 메모리)을 사용하여 250,000 비트코인을 획득합니다.
비트코인 개인키 충돌기(요금 50위안)
비트코인 개인 키 충돌 기계 소스 코드(요금 500위안)