องค์ประกอบการตรวจจับคำที่ผิดกฎหมาย (คำที่ละเอียดอ่อน) ที่มีประสิทธิภาพสูง มาพร้อมกับการแลกเปลี่ยนภาษาจีนแบบดั้งเดิมและตัวย่อ รองรับการแลกเปลี่ยนแบบเต็มความกว้างและครึ่งความกว้าง รับอักษรตัวแรกของพินอิน รับตัวอักษรพินอิน การค้นหาแบบคลุมเครือของพินอิน และฟังก์ชันอื่น ๆ
ภาษา C#
โดยใช้ StringSearchEx2.Replace
แทนที่การกรอง ความเร็วในการกรองคำศัพท์ที่ละเอียดอ่อน 48,000 เกินกว่า 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
: คลาสพิเศษ 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
สลับฉาก: หลังจากพิจารณาความมหัศจรรย์ Regex.Matches
เป็นเวลา 3 มิลลิวินาที ฉันพบว่า Regex.Matches
มีปัญหาเล็กน้อย
Regex.Matches
สามารถตรวจพบได้เพียง 11 รายการเท่านั้น
ผู้แต่ง: wenlifan ที่อยู่: https://github.com/wenlifan/SensitiveWordFilter
"ToolGood Content Review System" เป็นโอเพนซอร์สอย่างเป็นทางการ พร้อมด้วยแพลตฟอร์มคู่ของ Windows และ Linux และการใช้หน่วยความจำน้อยกว่า 100M
เว็บไซต์อย่างเป็นทางการ: 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 หยวน ทานอาหาร 1 มื้อที่ KFC)
เครื่องชนกันของคีย์ส่วนตัว Bitcoin ใช้ประสิทธิภาพการทำงานที่ไม่ได้ใช้งานของคอมพิวเตอร์ (หน่วยความจำ 3G) เพื่อรับรางวัล 250,000 Bitcoins
เครื่องชนกันของคีย์ส่วนตัว Bitcoin (ชาร์จ 50 หยวน)
ซอร์สโค้ดเครื่องชนกันของคีย์ส่วนตัว Bitcoin (ชาร์จ 500 หยวน)