Um componente de detecção de palavras ilegais (palavras sensíveis) de alto desempenho, vem com intercâmbio em chinês tradicional e simplificado, suporta intercâmbio de largura total e meia largura, obtém a primeira letra do Pinyin, obtém letras do Pinyin, pesquisa difusa do Pinyin e outras funções.
Linguagem C#
, usando a filtragem StringSearchEx2.Replace
, a velocidade de filtragem no vocabulário sensível de 48k excede 300 milhões de caracteres por segundo. (CPU i7 8750h)
descrição da pasta 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 detecção de palavras ilegais (palavras sensíveis): StringSearch
, StringSearchEx
, StringSearchEx2
, WordsSearch
, WordsSearchEx
, WordsSearchEx2
, IllegalWordsSearch
;
StringSearch
, StringSearchEx
, StringSearchEx2
, StringSearchEx3
: O resultado da pesquisa retornado pelo método FindFirst
é do tipo string
.WordsSearch
, WordsSearchEx
, WordsSearchEx2
, WordsSearchEx3
: O resultado da pesquisa retornado pelo método FindFirst
é do WordsSearchResult
WordsSearchResult
contém apenas palavras-chave, mas também a posição inicial, a posição final da palavra-chave, o número de série da palavra-chave, etc.IllegalWordsSearch
: uma classe especial para filtrar palavras ilegais (palavras sensíveis). Você pode definir o comprimento da palavra ignorada . O método FindFirst
de pesquisa retorna. IllegalWordsSearchResult
, que possui palavras-chave e corresponde ao texto original, posição, tipo de lista negra.IllegalWordsSearch
, StringSearchEx
, StringSearchEx2
, WordsSearchEx
, WordsSearchEx2
usam os métodos Save
e Load
para acelerar a inicialização.SetKeywords
, ContainsAny
, FindFirst
, FindAll
, Replace
IllegalWordsSearch
: SetSkipWords
(definir palavras ignoradas), SetBlacklist
(definir lista negra).IllegalWordsSearch
UseIgnoreCase
: Defina se deve ignorar maiúsculas ou não. Deve ser antes do método SetKeywords
Nota: Este campo é inválido ao usar o método Load
.StringSearchEx3
e WordsSearchEx3
são versões otimizadas para ponteiros. Durante a medição real, descobriu-se que o desempenho flutuou bastante. 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 ) ;
Categorias de detecção de palavras ilegais (palavras sensíveis): StringMatch
, StringMatchEx
, WordsMatch
, WordsMatchEx
.
Suporta alguns tipos de expressões regulares: .
(ponto) ?
(ponto de interrogação) []
(colchetes) (|)
(colchetes e barras verticais)
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 busca velocidade de carregamento mais rápida (atualmente apenas código C#).
PinyinMatch
: os métodos incluem SetKeywords
, SetIndexs
, Find
e FindIndex
.
PinyinMatch<T>
: os métodos incluem SetKeywordsFunc
, SetPinyinFunc
, SetPinyinSplitChar
e 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 ) ;
Depois de realizar 100.000 comparações de desempenho, os resultados são os seguintes:
Nota: a regularização integrada do C# é muito lenta. StringSearchEx2.ContainsAny
é mais de 88.000 vezes mais eficiente que Regex.IsMatch
, o que está relacionado ao número de palavras-chave.
Regex.Matches
opera de forma semelhante a IQueryable
, retornando apenas MatchCollection
sem cálculo.
No teste Localizar tudo (o texto detectado contém palavras confidenciais e não será exibido. Você pode depurar e verificar sozinho).
FastFilter
só pode detectar 7
StringSearch
detectado 14
Interlúdio: Depois de examinar a magia Regex.Matches
por 3 ms, descobri que Regex.Matches
tem um pequeno problema,
Regex.Matches
só pode detectar 11
Autor: wenlifan Endereço: https://github.com/wenlifan/SensitiveWordFilter
"ToolGood Content Review System" é oficialmente de código aberto, com plataformas duplas Windows e Linux, e o uso de memória é inferior a 100M.
Site oficial: https://toolgood.com/
Código-fonte aberto: https://github.com/toolgood/ToolGood.TextFilter
Associação de Pesquisa de Filtragem de Informações Sensíveis, grupo Q: 128994346 (completo)
Não sou professor, portanto, não faça perguntas simples sobre uso do projeto, carregamento, etc.
1. Coisas sobre o esquema de filtragem de palavras sensíveis
2. Sistema comum de revisão de palavras sensíveis da empresa
3. Solução para iniciantes filtrarem palavras sensíveis
4. Métodos de filtragem para palavras sensíveis comumente usadas na Internet
5. Algoritmo ToolGood.Words que filtra o princípio de otimização de palavras sensíveis (cobrar 30 yuans, uma refeição no KFC)
6. Explicação detalhada da otimização do código-fonte aberto ToolGood.TextFilter (cobrança de 300 yuan) Compare com o algoritmo IllegalWordsSearch para explicar os pontos de otimização do algoritmo de filtragem ToolGood.TextFilter e como reduzir o uso de memória. Ainda há uma pequena parte que ainda não foi escrita. Quem estiver impaciente pode comprá-la primeiro.
7. Algoritmo regular para DFA (versão C#, versão JAVA) (cobrança de 30 yuans, uma refeição KFC) Um dos algoritmos principais do ToolGood.TextFilter usa regular para DFA.
8. Versão C# de pornografia fotográfica (cobra 30 yuans, uma refeição no KFC)
A máquina de colisão de chaves privadas Bitcoin usa o desempenho ocioso do computador (memória 3G) para ganhar 250.000 Bitcoins.
Máquina de colisão de chave privada Bitcoin (cobrança de 50 yuans)
Código-fonte da máquina de colisão de chave privada Bitcoin (cobrança de 500 yuan)