Un componente de detección de palabras ilegales (palabras sensibles) de alto rendimiento, viene con intercambio de chino tradicional y simplificado, admite intercambio de ancho completo y medio ancho, obtiene la primera letra de Pinyin, obtiene letras de Pinyin, búsqueda difusa de Pinyin y otras funciones.
Lenguaje C#
, utilizando el filtrado StringSearchEx2.Replace
, la velocidad de filtrado en el vocabulario sensible de 48k supera los 300 millones de caracteres por segundo. (procesador i7 8750h)
Descripción de la carpeta csharp:
ToolGood.Pinyin.Build: 生成词的拼音
ToolGood.Pinyin.Pretreatment: 生成拼音预处理,核对拼音,词组最小化
ToolGood.Transformation.Build: 生成简体繁体转换文档,更新时文档放在同一目录下,词库参考 https://github.com/BYVoid/OpenCC
ToolGood.Words.Contrast: 字符串搜索对比
ToolGood.Words.Test: 单元测试
ToolGood.Words: 本项目源代码
Clase de detección de palabras ilegales (palabras sensibles): StringSearch
, StringSearchEx
, StringSearchEx2
, WordsSearch
, WordsSearchEx
, WordsSearchEx2
, IllegalWordsSearch
;
StringSearch
, StringSearchEx
, StringSearchEx2
, StringSearchEx3
: el resultado de la búsqueda devuelto por el método FindFirst
es de tipo string
.WordsSearch
, WordsSearchEx
, WordsSearchEx2
, WordsSearchEx3
: el resultado de la búsqueda devuelto por FindFirst
es del tipo WordsSearchResult
. WordsSearchResult
no solo contiene palabras clave, sino también la posición inicial, la posición final de la palabra clave, el número de serie de la palabra clave, etc.IllegalWordsSearch
: una clase especial para filtrar FindFirst
ilegales (palabras confidenciales). Puede establecer la longitud de la palabra omitida de ancho completo a medio ancho, ignorar mayúsculas y minúsculas, palabras repetidas y lista negra . IllegalWordsSearchResult
, que tiene palabras clave y corresponde al texto original Inicio, posición, tipo de lista negra.IllegalWordsSearch
, StringSearchEx
, StringSearchEx2
, WordsSearchEx
, WordsSearchEx2
utilizan métodos Save
y Load
para acelerar la inicialización.SetKeywords
, ContainsAny
, FindFirst
, FindAll
, Replace
IllegalWordsSearch
: SetSkipWords
(establecer palabras omitidas), SetBlacklist
(establecer lista negra).IllegalWordsSearch
UseIgnoreCase
: establezca si se ignoran las mayúsculas o no. Debe estar antes del método SetKeywords
. Nota: este campo no es válido cuando se utiliza el método Load
.StringSearchEx3
y WordsSearchEx3
son versiones optimizadas para punteros. Durante la medición real, se descubrió que el rendimiento fluctuaba mucho. 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 ) ;
Categorías de detección de palabras ilegales (palabras sensibles): StringMatch
, StringMatchEx
, WordsMatch
, WordsMatchEx
.
Admite algunos tipos de expresiones regulares: .
(punto) ?
(signo de interrogación) []
(corchetes) (|)
(corchetes y barras 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 busca una velocidad de carga más rápida (actualmente solo código C#).
PinyinMatch
: Los métodos incluyen SetKeywords
, SetIndexs
, Find
y FindIndex
.
PinyinMatch<T>
: los métodos incluyen SetKeywordsFunc
, SetPinyinFunc
, SetPinyinSplitChar
y 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 ) ;
Después de realizar 100.000 comparaciones de rendimiento, los resultados son los siguientes:
Nota: La regularización incorporada de C# es muy lenta. StringSearchEx2.ContainsAny
es más de 88.000 veces más eficiente que Regex.IsMatch
, lo cual está relacionado con la cantidad de palabras clave.
Regex.Matches
funciona de manera similar a IQueryable
, solo devuelve MatchCollection
sin cálculo.
En la prueba Buscar todo (el texto detectado contiene palabras confidenciales y no se mostrará. Puede depurarlo y verificarlo usted mismo).
FastFilter
solo puede detectar 7
StringSearch
detectado 14
Interludio: Después de examinar la magia Regex.Matches
durante 3 ms, descubrí que Regex.Matches
tiene un pequeño problema.
Regex.Matches
solo puede detectar 11
Autor: wenlifan Dirección: https://github.com/wenlifan/SensitiveWordFilter
El "Sistema de revisión de contenido ToolGood" es oficialmente de código abierto, con plataformas duales Windows y Linux y el uso de memoria es inferior a 100 M.
Sitio web oficial: https://toolgood.com/
Código fuente abierto: https://github.com/toolgood/ToolGood.TextFilter
Asociación de Investigación de Filtrado de Información Sensible, grupo Q: 128994346 (completo)
No soy profesor, así que no haga preguntas sencillas sobre el uso, la carga, etc. del proyecto.
1. Cosas sobre el esquema de filtrado de palabras sensibles
2. Sistema común de revisión de palabras sensibles de la empresa
3. Solución para que los novatos filtren palabras sensibles
4. Métodos de filtrado de palabras confidenciales de uso común en Internet
5. Algoritmo ToolGood.Words que filtra el principio de optimización de palabras sensibles (cobra 30 yuanes, una comida en KFC)
6. Explicación detallada de la optimización del código fuente abierto ToolGood.TextFilter (cargo 300 yuanes) Compare con el algoritmo IllegalWordsSearch para explicar los puntos de optimización del algoritmo de filtrado ToolGood.TextFilter y cómo reducir el uso de memoria. Todavía hay una pequeña parte que no se ha escrito. Los que estén impacientes pueden comprarla primero. Continuaré actualizándola.
7. Algoritmo normal a DFA (versión C#, versión JAVA) (cobra 30 yuanes, una comida de KFC) Uno de los algoritmos centrales de ToolGood.TextFilter utiliza el algoritmo regular a DFA.
8. Versión C# de imágenes pornográficas (cobra 30 yuanes, una comida en KFC)
La máquina de colisión de claves privadas de Bitcoin utiliza el rendimiento inactivo de la computadora (memoria 3G) para ganar 250.000 Bitcoins.
Máquina de colisión de claves privadas de Bitcoin (cargo de 50 yuanes)
Código fuente de la máquina de colisión de clave privada de Bitcoin (cargo de 500 yuanes)