Komponen pendeteksi kata ilegal (kata sensitif) berperforma tinggi, dilengkapi dengan pertukaran bahasa Mandarin Tradisional dan Sederhana, mendukung pertukaran lebar penuh dan setengah lebar, memperoleh huruf pertama Pinyin, memperoleh huruf Pinyin, pencarian fuzzy Pinyin, dan fungsi lainnya.
Bahasa C#
, menggunakan pemfilteran StringSearchEx2.Replace
, kecepatan pemfilteran pada 48k kosakata sensitif melebihi 300 juta karakter per detik. (cpu i7 8750h)
deskripsi folder csharp:
ToolGood.Pinyin.Build: 生成词的拼音
ToolGood.Pinyin.Pretreatment: 生成拼音预处理,核对拼音,词组最小化
ToolGood.Transformation.Build: 生成简体繁体转换文档,更新时文档放在同一目录下,词库参考 https://github.com/BYVoid/OpenCC
ToolGood.Words.Contrast: 字符串搜索对比
ToolGood.Words.Test: 单元测试
ToolGood.Words: 本项目源代码
Kelas deteksi kata ilegal (kata sensitif): StringSearch
, StringSearchEx
, StringSearchEx2
, WordsSearch
, WordsSearchEx
, WordsSearchEx2
, IllegalWordsSearch
;
StringSearch
, StringSearchEx
, StringSearchEx2
, StringSearchEx3
: Hasil pencarian yang dikembalikan oleh metode FindFirst
adalah tipe string
.WordsSearch
, WordsSearchEx
, WordsSearchEx2
, WordsSearchEx3
: Hasil pencarian yang dikembalikan oleh metode FindFirst
adalah tipe WordsSearchResult
. WordsSearchResult
tidak hanya berisi kata kunci, tetapi juga posisi awal, posisi akhir kata kunci, nomor seri kata kunci, dll.IllegalWordsSearch
: Kelas khusus FindFirst
memfilter kata-kata ilegal (kata-kata sensitif). Anda dapat mengatur panjang kata yang dilewati. Defaultnya adalah lebar penuh hingga setengah lebar. Abaikan kata-kata, kata-kata berulang, dan daftar hitam IllegalWordsSearchResult
, yang memiliki kata kunci dan sesuai dengan teks asli.IllegalWordsSearch
, StringSearchEx
, StringSearchEx2
, WordsSearchEx
, WordsSearchEx2
menggunakan metode Save
dan Load
untuk mempercepat inisialisasi.SetKeywords
, ContainsAny
, FindFirst
, FindAll
, Replace
IllegalWordsSearch
: SetSkipWords
(mengatur kata-kata yang dilewati), SetBlacklist
(mengatur daftar hitam).IllegalWordsSearch
UseIgnoreCase
: Menyetel apakah akan mengabaikan huruf besar atau tidak. Ini harus sebelum metode SetKeywords
Catatan: Bidang ini tidak valid saat menggunakan metode Load
.StringSearchEx3
dan WordsSearchEx3
adalah versi yang dioptimalkan untuk penunjuk. Selama pengukuran sebenarnya, ditemukan bahwa kinerjanya sangat berfluktuasi. 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 ) ;
Kategori deteksi kata ilegal (kata sensitif): StringMatch
, StringMatchEx
, WordsMatch
, WordsMatchEx
.
Mendukung beberapa tipe ekspresi reguler: .
(titik) ?
(tanda tanya) []
(tanda kurung siku) (|)
(tanda kurung dan garis vertikal)
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 mengejar kecepatan pemuatan yang lebih cepat (saat ini hanya kode C#).
PinyinMatch
: Metodenya meliputi SetKeywords
, SetIndexs
, Find
, dan FindIndex
.
PinyinMatch<T>
: Metodenya mencakup SetKeywordsFunc
, SetPinyinFunc
, SetPinyinSplitChar
, dan 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 ) ;
Setelah melakukan 100.000 perbandingan kinerja, hasilnya adalah sebagai berikut:
Catatan: Regularisasi bawaan C# sangat lambat. StringSearchEx2.ContainsAny
lebih dari 88.000 kali lebih efisien daripada Regex.IsMatch
, yang terkait dengan jumlah kata kunci.
Regex.Matches
beroperasi mirip dengan IQueryable
, hanya mengembalikan MatchCollection
tanpa perhitungan.
Pada tes Temukan Semua, (teks yang terdeteksi mengandung kata-kata sensitif dan tidak akan ditampilkan. Anda dapat melakukan debug dan memeriksa sendiri).
FastFilter
hanya dapat mendeteksi 7
StringSearch
terdeteksi 14
Selingan: Setelah meneliti keajaiban Regex.Matches
selama 3ms, saya menemukan bahwa Regex.Matches
memiliki masalah kecil,
Regex.Matches
hanya dapat mendeteksi 11
Penulis: wenlifan Alamat: https://github.com/wenlifan/SensitiveWordFilter
"Sistem Peninjauan Konten ToolGood" secara resmi bersifat open source, dengan platform ganda Windows dan Linux, dan penggunaan memori kurang dari 100 juta.
Situs web resmi: https://toolgood.com/
Kode sumber terbuka: https://github.com/toolgood/ToolGood.TextFilter
Asosiasi Riset Penyaringan Informasi Sensitif, grup Q: 128994346 (lengkap)
Saya bukan seorang guru, jadi mohon jangan mengajukan pertanyaan sederhana tentang penggunaan proyek, pemuatan, dll.
1. Hal-hal tentang skema penyaringan kata sensitif
2. Sistem peninjauan kata sensitif perusahaan umum
3. Solusi bagi pemula untuk memfilter kata-kata sensitif
4. Metode penyaringan kata-kata sensitif yang umum digunakan di Internet
5. Algoritme ToolGood.Words memfilter prinsip pengoptimalan kata sensitif (biaya 30 yuan, satu kali makan di KFC)
6. Penjelasan mendetail tentang pengoptimalan kode sumber terbuka ToolGood.TextFilter (biaya 300 yuan) Bandingkan dengan algoritme IllegalWordsSearch untuk menjelaskan poin pengoptimalan algoritme pemfilteran ToolGood.TextFilter dan cara mengurangi penggunaan memori. Masih ada sebagian kecil yang belum ditulis. Bagi yang belum sabar bisa membelinya dulu.
7. Algoritme reguler ke DFA (versi C#, versi JAVA) (biaya 30 yuan, satu kali makan KFC) Salah satu algoritme inti ToolGood.TextFilter menggunakan DFA reguler.
8. Gambar pornografi versi C# (biaya 30 yuan, satu kali makan di KFC)
Mesin tabrakan kunci pribadi Bitcoin menggunakan kinerja idle komputer (memori 3G) untuk memenangkan 250.000 Bitcoin.
Mesin tabrakan kunci pribadi Bitcoin (biaya 50 yuan)
Kode sumber mesin tabrakan kunci pribadi Bitcoin (biaya 500 yuan)