高性能の違法単語(センシティブワード)検出コンポーネント。繁体字と簡体字の切り替え、全角と半角の切り替えをサポート、ピンインの最初の文字の取得、ピンイン文字の取得、ピンインあいまい検索などの機能を備えています。
C#
言語では、 StringSearchEx2.Replace
フィルタリングを使用すると、48k 機密語彙のフィルタリング速度は 1 秒あたり 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
間奏: 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での1食)
6. ToolGood.TextFilter オープンソース コード最適化の詳細説明 (料金 300 元) IllegalWordsSearch アルゴリズムと比較して、ToolGood.TextFilter フィルタリング アルゴリズムの最適化ポイントとメモリ使用量の削減方法を説明します。 まだ書ききれていない部分もありますので、気になる方は先に購入してみてください。
7. 通常から DFA へのアルゴリズム (C# バージョン、JAVA バージョン) (料金 30 元、KFC の食事 1 食) ToolGood.TextFilter のコア アルゴリズムの 1 つで、通常から DFA へのアルゴリズムを使用します。
8. 画像ポルノの C# 版 (料金 30 元、KFC で 1 食)
ビットコイン秘密キー衝突マシンは、コンピューターのアイドル パフォーマンス (3G メモリ) を利用して 250,000 ビットコインを獲得します。
ビットコイン秘密鍵衝突機(料金50元)
ビットコイン秘密鍵衝突マシンのソースコード(料金500元)