كلمة الحساسة هي أداة كلمات حساسة عالية الأداء تعتمد على خوارزمية DFA.
تجربة عبر الإنترنت
إذا كان لديك بعض الأمراض الصعبة والمعقدة ، فيمكنك الانضمام: مجموعة التبادل الفني
الإدارة الحساسة للكلمة هي تطبيق وحدة التحكم المقابلة. تعمل الوظائف حاليًا في المراحل المبكرة من التطوير ، ويتوفر إصدار MVP.
مرحبا بالجميع ، أنا لاو ما.
لطالما أردت تنفيذ أداة كلمات حساسة بسيطة وسهلة الاستخدام ، لذلك قمت بتطبيق هذه الأداة مفتوحة المصدر.
استنادًا إلى تطبيق خوارزمية DFA ، يتضمن محتوى thesaurus الحساس حاليًا 6W+ (الملف المصدر 18W+ ، بعد حذف واحد).
في المرحلة اللاحقة ، سيتم تحسين المرادفات الحساسة باستمرار واستكمالها ، وسيتم تحسين أداء الخوارزمية.
بدأ V0.24.0 في دعم تصنيف وتحسين الكلمات الحساسة ، لكن عبء العمل كبير نسبيًا ، لذلك هناك حدوث حتمية.
مرحبًا بك في تحسينات العلاقات العامة أو طلبات GitHub أو الانضمام إلى مجموعة التبادل الفني للتواصل والتفاخر!
6w+ thesaurus ، والتحسين والتحديث المستمر
بناءً على تنفيذ Fluent-API ، والاستخدام الأنيق والموجز
استنادًا إلى خوارزمية DFA ، الأداء هو 7W+ QPs ، التطبيق غير حساس
دعم العمليات المشتركة مثل الحكم والعودة وإزالة الحساسية للكلمات الحساسة
يدعم تحويل التنسيق الشائع
تبادل نصف عرض العرض الكامل ، تبادل الحالات الإنجليزية ، أشكال شائعة من الأرقام ، الصينية التقليدية والصينية المبسطة ، الأشكال الشائعة للتبادل الإنجليزية ، وتجاهل الكلمات المكررة ، إلخ.
دعم الكشف عن الكلمات الحساسة ، الكشف عن البريد الإلكتروني ، الكشف الرقمي ، اكتشاف موقع الويب ، IPv4 ، إلخ.
يدعم سياسات الاستبدال المخصصة
يدعم الكلمات الحساسة المعرفة من قبل المستخدم والطبيب الأبيض
يدعم تحديثات البيانات الديناميكية (تخصيص المستخدم) ، فعالة في الوقت الحقيقي
يدعم واجهة العلامة + تطبيق تصنيف مدمج للكلمات الحساسة
دعم تخطي بعض الشخصيات الخاصة لجعل المطابقة أكثر مرونة
يدعم إضافة/تعديل من القوائم بالأبيض والأسود ، دون تهيئة كاملة
Change_log.md
في بعض الأحيان ، توجد وحدة تحكم للكلمات الحساسة ، مما يجعلها أكثر مرونة وملاءمة للتكوين.
كيفية تنفيذ خدمة وحدة وحدة التحكم الحساسة خارج المربع؟
تم فرز عدد كبير من ملفات علامة الكلمات الحساسة ، والتي يمكن أن تجعل كلماتنا الحساسة أكثر ملاءمة.
يمكن قراءة هاتين المادتين في المقالة أدناه:
v0.11.0-ميزات الكلمات الحساسة وملفات العلامات المقابلة
حاليًا ، يحتوي V0.24.0 على علامات كلمات مدمجة ، ويوصى بالترقية إلى أحدث إصدار إذا لزم الأمر.
المصدر المفتوح ليس بالأمر السهل. إذا كان هذا المشروع مفيدًا لك ، فيمكنك دعوة Lao Ma للحصول على كوب من شاي الحليب.

JDK1.8+
Maven 3.x+
< dependency >
< groupId >com.github.houbb</ groupId >
< artifactId >sensitive-word</ artifactId >
< version >0.24.0</ version >
</ dependency > SensitiveWordHelper هو فئة الأدوات للكلمات الحساسة. الطرق الأساسية هي كما يلي:
ملاحظة: يوفر SensitiveWordHelper تكوينات افتراضية. إذا كنت ترغب في عمل تكوينات مخصصة مرنة ، يرجى الرجوع إلى تكوين ميزة فئة التمهيد
| طريقة | المعلمة | قيمة الإرجاع | يوضح |
|---|---|---|---|
| يحتوي على (سلسلة) | السلسلة المراد التحقق منها | قيمة منطقية | تحقق من أن السلسلة تحتوي على كلمات حساسة |
| استبدال (سلسلة ، isensitywordreplace) | استبدال الكلمات الحساسة باستراتيجية استبدال محددة | خيط | إرجاع السلسلة الحساسية |
| استبدال (سلسلة ، شار) | استخدم char المحدد لاستبدال الكلمة الحساسة | خيط | إرجاع السلسلة الحساسية |
| استبدال (سلسلة) | استخدم * لاستبدال الكلمات الحساسة | خيط | إرجاع السلسلة الحساسية |
| Findall (سلسلة) | السلسلة المراد التحقق منها | قائمة السلاسل | إرجاع جميع الكلمات الحساسة في السلسلة |
| FindFirst (سلسلة) | السلسلة المراد التحقق منها | خيط | إرجاع الكلمة الحساسة الأولى في السلسلة |
| Findall (String ، iWordresulthandler) | iWORDRESULTHANDLELLER REVERSION فئة معالجة | قائمة السلاسل | إرجاع جميع الكلمات الحساسة في السلسلة |
| FindFirst (String ، iWordresulthandler) | iWORDRESULTHANDLELLER REVERSION فئة معالجة | خيط | إرجاع الكلمة الحساسة الأولى في السلسلة |
| العلامات (سلسلة) | احصل على علامات للكلمات الحساسة | سلسلة كلمة حساسة | العودة إلى قائمة العلامات للكلمات الحساسة |
final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。" ;
Assert . assertTrue ( SensitiveWordHelper . contains ( text )); final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。" ;
String word = SensitiveWordHelper . findFirst ( text );
Assert . assertEquals ( "五星红旗" , word );حساس wordhelper.findfirst (النص) يعادل:
String word = SensitiveWordHelper . findFirst ( text , WordResultHandlers . word ()); final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。" ;
List < String > wordList = SensitiveWordHelper . findAll ( text );
Assert . assertEquals ( "[五星红旗, 毛主席, 天安门]" , wordList . toString ());إرجاع جميع استخدامات الكلمات الحساسة يشبه حساس wordwordhelper.findfirst () ، ويدعم أيضًا تحديد فئات معالجة النتائج.
حساس wordhelper.findall (النص) يعادل:
List < String > wordList = SensitiveWordHelper . findAll ( text , WordResultHandlers . word ());يمكن لـ Wordresulthandlers.Raw () الاحتفاظ بمعلومات التراجع المقابلة ومعلومات الفئة:
final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。" ;
// 默认敏感词标签为空
List < WordTagsDto > wordList1 = SensitiveWordHelper . findAll ( text , WordResultHandlers . wordTags ());
Assert . assertEquals ( "[WordTagsDto{word='五星红旗', tags=[]}, WordTagsDto{word='毛主席', tags=[]}, WordTagsDto{word='天安门', tags=[]}]" , wordList1 . toString ()); final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。" ;
String result = SensitiveWordHelper . replace ( text );
Assert . assertEquals ( "****迎风飘扬,***的画像屹立在***前。" , result ); final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。" ;
String result = SensitiveWordHelper . replace ( text , '0' );
Assert . assertEquals ( "0000迎风飘扬,000的画像屹立在000前。" , result );v0.2.0 يدعم هذه الميزة.
وصف المشهد: في بعض الأحيان نريد أن يكون للكلمات الحساسة المختلفة نتائج استبدال مختلفة. على سبيل المثال ، يتم استبدال [اللعبة] بـ [E-sports] ، ويتم استبدال [البطالة] بـ [عمل مرن].
من المسلم به ، أنه من الجيد استخدام استبدال الأوتار المنتظمة مقدمًا ، لكن الأداء متوسط.
مثال على الاستخدام:
/**
* 自定替换策略
* @since 0.2.0
*/
@ Test
public void defineReplaceTest () {
final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。" ;
ISensitiveWordReplace replace = new MySensitiveWordReplace ();
String result = SensitiveWordHelper . replace ( text , replace );
Assert . assertEquals ( "国家旗帜迎风飘扬,教员的画像屹立在***前。" , result );
} من بينها ، MySensitiveWordReplace هي سياسة الاستبدال المخصصة لدينا ، والتي يتم تنفيذها على النحو التالي:
public class MyWordReplace implements IWordReplace {
@ Override
public void replace ( StringBuilder stringBuilder , final char [] rawChars , IWordResult wordResult , IWordContext wordContext ) {
String sensitiveWord = InnerWordCharUtils . getString ( rawChars , wordResult );
// 自定义不同的敏感词替换策略,可以从数据库等地方读取
if ( "五星红旗" . equals ( sensitiveWord )) {
stringBuilder . append ( "国家旗帜" );
} else if ( "毛主席" . equals ( sensitiveWord )) {
stringBuilder . append ( "教员" );
} else {
// 其他默认使用 * 代替
int wordLength = wordResult . endIndex () - wordResult . startIndex ();
for ( int i = 0 ; i < wordLength ; i ++) {
stringBuilder . append ( '*' );
}
}
}
} نقوم بتخطيط ثابت لبعض الكلمات ، ويتم تحويل الآخرين إلى * افتراضيًا.
يمكن لـ iWordResulthandler معالجة نتائج الكلمات الحساسة والسماح للمستخدمين بتخصيصها.
انظر فئة أدوات WordResultHandlers للتنفيذ المدمج:
يتم الحفاظ على الكلمات الحساسة فقط.
احتفظ بالمعلومات المتعلقة بالكلمات الحساسة ، بما في ذلك المشتركين في البداية والنهاية للكلمات الحساسة.
في الوقت نفسه ، يتم الاحتفاظ بالكلمات ومعلومات تسمية الكلمات المقابلة.
انظر حساس Wordhelpertest لجميع حالات الاختبار
1) الأمثلة الأساسية
final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。" ;
List < String > wordList = SensitiveWordHelper . findAll ( text );
Assert . assertEquals ( "[五星红旗, 毛主席, 天安门]" , wordList . toString ());
List < String > wordList2 = SensitiveWordHelper . findAll ( text , WordResultHandlers . word ());
Assert . assertEquals ( "[五星红旗, 毛主席, 天安门]" , wordList2 . toString ());
List < IWordResult > wordList3 = SensitiveWordHelper . findAll ( text , WordResultHandlers . raw ());
Assert . assertEquals ( "[WordResult{startIndex=0, endIndex=4}, WordResult{startIndex=9, endIndex=12}, WordResult{startIndex=18, endIndex=21}]" , wordList3 . toString ()); نحدد معلومات العلامة للكلمة المقابلة في ملف dict_tag_test.txt .
final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。" ;
// 默认敏感词标签为空
List < WordTagsDto > wordList1 = SensitiveWordHelper . findAll ( text , WordResultHandlers . wordTags ());
Assert . assertEquals ( "[WordTagsDto{word='五星红旗', tags=[]}, WordTagsDto{word='毛主席', tags=[]}, WordTagsDto{word='天安门', tags=[]}]" , wordList1 . toString ());
List < WordTagsDto > wordList2 = SensitiveWordBs . newInstance ()
. wordTag ( WordTags . file ( "dict_tag_test.txt" ))
. init ()
. findAll ( text , WordResultHandlers . wordTags ());
Assert . assertEquals ( "[WordTagsDto{word='五星红旗', tags=[政治, 国家]}, WordTagsDto{word='毛主席', tags=[政治, 伟人, 国家]}, WordTagsDto{word='天安门', tags=[政治, 国家, 地址]}]" , wordList2 . toString ());تهدف الميزات اللاحقة بشكل أساسي إلى العديد من المعالجة التي تستهدف المواقف المختلفة ، وذلك لتحسين معدل ضرب الكلمات الحساسة قدر الإمكان.
هذه معركة طويلة من الهجوم والدفاع.
final String text = "fuCK the bad words." ;
String word = SensitiveWordHelper . findFirst ( text );
Assert . assertEquals ( "fuCK" , word ); final String text = "fuck the bad words." ;
String word = SensitiveWordHelper . findFirst ( text );
Assert . assertEquals ( "fuck" , word );هنا ، يتم تنفيذ تحويل الأشكال الشائعة من الرقمية.
final String text = "这个是我的微信:9⓿二肆⁹₈③⑸⒋➃㈤㊄" ;
List < String > wordList = SensitiveWordBs . newInstance (). enableNumCheck ( true ). init (). findAll ( text );
Assert . assertEquals ( "[9⓿二肆⁹₈③⑸⒋➃㈤㊄]" , wordList . toString ()); final String text = "我爱我的祖国和五星紅旗。" ;
List < String > wordList = SensitiveWordHelper . findAll ( text );
Assert . assertEquals ( "[五星紅旗]" , wordList . toString ()); final String text = "Ⓕⓤc⒦ the bad words" ;
List < String > wordList = SensitiveWordHelper . findAll ( text );
Assert . assertEquals ( "[Ⓕⓤc⒦]" , wordList . toString ()); final String text = "ⒻⒻⒻfⓤuⓤ⒰cⓒ⒦ the bad words" ;
List < String > wordList = SensitiveWordBs . newInstance ()
. ignoreRepeat ( true )
. init ()
. findAll ( text );
Assert . assertEquals ( "[ⒻⒻⒻfⓤuⓤ⒰cⓒ⒦]" , wordList . toString ());لا يتم تمكين المعلومات الشخصية مثل عنوان البريد الإلكتروني افتراضيًا.
final String text = "楼主好人,邮箱 [email protected]" ;
List < String > wordList = SensitiveWordBs . newInstance (). enableEmailCheck ( true ). init (). findAll ( text );
Assert . assertEquals ( "[[email protected]]" , wordList . toString ());يتم استخدامه بشكل عام لتصفية معلومات الإعلان مثل رقم الهاتف المحمول/QQ ، ولا يتم تمكينه افتراضيًا.
بعد V0.2.1 ، يتم دعم الأطوال التي اكتشفها numCheckLen(长度) .
final String text = "你懂得:12345678" ;
// 默认检测 8 位
List < String > wordList = SensitiveWordBs . newInstance ()
. enableNumCheck ( true )
. init (). findAll ( text );
Assert . assertEquals ( "[12345678]" , wordList . toString ());
// 指定数字的长度,避免误杀
List < String > wordList2 = SensitiveWordBs . newInstance ()
. enableNumCheck ( true )
. numCheckLen ( 9 )
. init ()
. findAll ( text );
Assert . assertEquals ( "[]" , wordList2 . toString ());تستخدم لتصفية معلومات عنوان URL الشائع ، وليس تمكينها افتراضيًا.
V0.18.0 يعمل على تحسين اكتشاف URL ، وهو أكثر صرامة ويقلل من معدل سوء الحكم
final String text = "点击链接 https://www.baidu.com 查看答案" ;
final SensitiveWordBs sensitiveWordBs = SensitiveWordBs . newInstance (). enableUrlCheck ( true ). init ();
List < String > wordList = sensitiveWordBs . findAll ( text );
Assert . assertEquals ( "[https://www.baidu.com]" , wordList . toString ());
Assert . assertEquals ( "点击链接 ********************* 查看答案" , sensitiveWordBs . replace ( text ));v0.17.0 الدعم
تجنب المستخدمين تجاوز الكشف عن عنوان URL من خلال IP ، وما إلى ذلك ، والذي لم يتم تمكينه افتراضيًا.
final String text = "个人网站,如果网址打不开可以访问 127.0.0.1。" ;
final SensitiveWordBs sensitiveWordBs = SensitiveWordBs . newInstance (). enableIpv4Check ( true ). init ();
List < String > wordList = sensitiveWordBs . findAll ( text );
Assert . assertEquals ( "[127.0.0.1]" , wordList . toString ());يتم تمكين جميع الميزات أعلاه افتراضيًا ، وأحيانًا تحتاج الأعمال إلى تحديد ميزات التكوين ذات الصلة بمرونة.
لذلك V0.0.14 يفتح تكوين الخاصية.
لاستخدام أكثر أناقة ، يستخدم التعريف بشكل موحد من قبل Fluent-API.
يمكن للمستخدمين استخدام SensitiveWordBs لتعريفه على النحو التالي:
ملاحظة: بعد التكوين ، استخدم كائن SensitiveWordBs المعرّف حديثًا بدلاً من طريقة الأداة السابقة. تكوين طريقة الأداة هو كل شيء افتراضي.
SensitiveWordBs wordBs = SensitiveWordBs . newInstance ()
. ignoreCase ( true )
. ignoreWidth ( true )
. ignoreNumStyle ( true )
. ignoreChineseStyle ( true )
. ignoreEnglishStyle ( true )
. ignoreRepeat ( false )
. enableNumCheck ( false )
. enableEmailCheck ( false )
. enableUrlCheck ( false )
. enableIpv4Check ( false )
. enableWordCheck ( true )
. numCheckLen ( 8 )
. wordTag ( WordTags . none ())
. charIgnore ( SensitiveWordCharIgnores . defaults ())
. wordResultCondition ( WordResultConditions . alwaysTrue ())
. init ();
final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。" ;
Assert . assertTrue ( wordBs . contains ( text ));وصف كل تكوين هو كما يلي:
| رقم سري | طريقة | يوضح | القيمة الافتراضية |
|---|---|---|---|
| 1 | جينوريكاس | تجاهل القضية | حقيقي |
| 2 | تجاهل العرض | تجاهل الزوايا المستديرة نصف القلاع | حقيقي |
| 3 | الجهل | تجاهل كتابة الأرقام | حقيقي |
| 4 | تجاهل chinesestyle | تجاهل تنسيق الكتابة الصينية | حقيقي |
| 5 | تجاهل stynglishstyle | تجاهل تنسيق الكتابة الإنجليزية | حقيقي |
| 6 | الجهل | تجاهل الكلمات المكررة | خطأ شنيع |
| 7 | enablenumcheck | سواء لتمكين الكشف الرقمي. | خطأ شنيع |
| 8 | EnableMailcheck | تم تمكين اكتشاف البريد الإلكتروني | خطأ شنيع |
| 9 | EnableUrlcheck | سواء لتمكين الكشف عن الارتباط | خطأ شنيع |
| 10 | enableipv4check | ما إذا كان لتمكين اكتشاف IPv4 | خطأ شنيع |
| 11 | Enablewordcheck | سواء لتمكين الكشف عن الكلمات الحساسة | حقيقي |
| 12 | numChecklen | الكشف الرقمي ، تخصيص الطول المحدد. | 8 |
| 13 | Wordtag | العلامات المقابلة للكلمات | لا أحد |
| 14 | تشارينور | الشخصيات التي تم تجاهلها | لا أحد |
| 15 | wordresultcondition | معالجة إضافية لمطابقة الكلمات الحساسة ، مثل الحد من الحاجة إلى المباريات الكاملة للكلمات الإنجليزية | دائما صحيح |
v0.16.1 مدعوم. في بعض الأحيان نحتاج إلى تحرير الذاكرة ، والتي يمكن أن تكون على النحو التالي:
حول مشكلات إعادة تدوير الذاكرة
SensitiveWordBs wordBs = SensitiveWordBs . newInstance ()
. init ();
// 后续因为一些原因移除了对应信息,希望释放内存。
wordBs . destroy ();سيناريو الاستخدام: بعد التهيئة ، نريد إضافة/حذف كلمة واحدة بدلاً من إعادة توحيدها تمامًا. تم إعداد هذه الميزة لهذا الغرض.
الإصدار المدعوم: v0.19.0
addWord(word) يضيف كلمات حساسة ، ودعم الكلمات/المجموعات المفردة
removeWord(word) يزيل الكلمات الحساسة ، ويدعم الكلمات/المجموعات المفردة
final String text = "测试一下新增敏感词,验证一下删除和新增对不对" ;
SensitiveWordBs sensitiveWordBs =
SensitiveWordBs . newInstance ()
. wordAllow ( WordAllows . empty ())
. wordDeny ( WordDenys . empty ())
. init ();
// 当前
Assert . assertEquals ( "[]" , sensitiveWordBs . findAll ( text ). toString ());
// 新增单个
sensitiveWordBs . addWord ( "测试" );
sensitiveWordBs . addWord ( "新增" );
Assert . assertEquals ( "[测试, 新增, 新增]" , sensitiveWordBs . findAll ( text ). toString ());
// 删除单个
sensitiveWordBs . removeWord ( "新增" );
Assert . assertEquals ( "[测试]" , sensitiveWordBs . findAll ( text ). toString ());
sensitiveWordBs . removeWord ( "测试" );
Assert . assertEquals ( "[]" , sensitiveWordBs . findAll ( text ). toString ());
// 新增集合
sensitiveWordBs . addWord ( Arrays . asList ( "新增" , "测试" ));
Assert . assertEquals ( "[测试, 新增, 新增]" , sensitiveWordBs . findAll ( text ). toString ());
// 删除集合
sensitiveWordBs . removeWord ( Arrays . asList ( "新增" , "测试" ));
Assert . assertEquals ( "[]" , sensitiveWordBs . findAll ( text ). toString ());
// 新增数组
sensitiveWordBs . addWord ( "新增" , "测试" );
Assert . assertEquals ( "[测试, 新增, 新增]" , sensitiveWordBs . findAll ( text ). toString ());
// 删除集合
sensitiveWordBs . removeWord ( "新增" , "测试" );
Assert . assertEquals ( "[]" , sensitiveWordBs . findAll ( text ). toString ());سيناريو الاستخدام: بعد التهيئة ، نريد إضافة/حذف كلمة واحدة بدلاً من إعادة توحيدها تمامًا. تم إعداد هذه الميزة لهذا الغرض.
الإصدار المدعوم: v0.21.0
يضيف addWordAllow(word) قائمة بيضاء جديدة ، ويدعم الكلمات/المجموعات المفردة
removeWordAllow(word) يزيل العازفات البيضاء ، ويدعم الكلمات/المجموعات المفردة
final String text = "测试一下新增敏感词白名单,验证一下删除和新增对不对" ;
SensitiveWordBs sensitiveWordBs =
SensitiveWordBs . newInstance ()
. wordAllow ( WordAllows . empty ())
. wordDeny ( new IWordDeny () {
@ Override
public List < String > deny () {
return Arrays . asList ( "测试" , "新增" );
}
})
. init ();
// 当前
Assert . assertEquals ( "[测试, 新增, 新增]" , sensitiveWordBs . findAll ( text ). toString ());
// 新增单个
sensitiveWordBs . addWordAllow ( "测试" );
sensitiveWordBs . addWordAllow ( "新增" );
Assert . assertEquals ( "[]" , sensitiveWordBs . findAll ( text ). toString ());
// 删除单个
sensitiveWordBs . removeWordAllow ( "测试" );
Assert . assertEquals ( "[测试]" , sensitiveWordBs . findAll ( text ). toString ());
sensitiveWordBs . removeWordAllow ( "新增" );
Assert . assertEquals ( "[测试, 新增, 新增]" , sensitiveWordBs . findAll ( text ). toString ());
// 新增集合
sensitiveWordBs . addWordAllow ( Arrays . asList ( "新增" , "测试" ));
Assert . assertEquals ( "[]" , sensitiveWordBs . findAll ( text ). toString ());
// 删除集合
sensitiveWordBs . removeWordAllow ( Arrays . asList ( "新增" , "测试" ));
Assert . assertEquals ( "[测试, 新增, 新增]" , sensitiveWordBs . findAll ( text ). toString ());
// 新增数组
sensitiveWordBs . addWordAllow ( "新增" , "测试" );
Assert . assertEquals ( "[]" , sensitiveWordBs . findAll ( text ). toString ());
// 删除集合
sensitiveWordBs . removeWordAllow ( "新增" , "测试" );
Assert . assertEquals ( "[测试, 新增, 新增]" , sensitiveWordBs . findAll ( text ). toString ());تم التخلي عن هذه الطريقة. يوصى باستخدام طريقة الإضافة الإضافية أعلاه لتجنب التحميل الكامل. للتوافق ، تظل هذه الطريقة.
كيفية الاستخدام: عند استدعاء sensitiveWordBs.init() ، أعد بناء المفردات الحساسة على أساس iWorddeny+iWordallow. نظرًا لأن التهيئة قد تستغرق وقتًا طويلاً (المستوى الثاني) ، فلن تؤثر جميع التحسينات إلى init على وظيفة المفردات القديمة عند عدم اكتمالها ، ويسود التحسين الجديد بعد الانتهاء .
@ Component
public class SensitiveWordService {
@ Autowired
private SensitiveWordBs sensitiveWordBs ;
/**
* 更新词库
*
* 每次数据库的信息发生变化之后,首先调用更新数据库敏感词库的方法。
* 如果需要生效,则调用这个方法。
*
* 说明:重新初始化不影响旧的方法使用。初始化完成后,会以新的为准。
*/
public void refresh () {
// 每次数据库的信息发生变化之后,首先调用更新数据库敏感词库的方法,然后调用这个方法。
sensitiveWordBs . init ();
}
} كما هو مذكور أعلاه ، يمكنك تشغيل تهيئة sensitiveWordBs.init(); عندما يتغير معجم قاعدة البيانات ، وتحتاج قاعدة البيانات إلى سريانها.
تظل استخدامات أخرى كما هي دون إعادة تشغيل التطبيق.
الإصدار المدعوم: v0.13.0
في بعض الأحيان ، قد نرغب في الحد من الحد من الكلمات الحساسة المطابقة ، على سبيل المثال ، على الرغم من أننا نحدد [AV] ككلمة حساسة ، لا نريد أن نطابق [.
يمكنك تخصيص واجهة WordresultCondition وتنفيذ سياساتك الخاصة.
السياسة المدمجة في WordResultConditions#alwaysTrue() صحيحة دائمًا ، في حين تتطلب WordResultConditions#englishWordMatch() أن تتطابق اللغة الإنجليزية مع الكلمة الكاملة.
يمكن أن تحصل فئة أدوات WordresultCondCondcitions على سياسات مطابقة
| ينجز | يوضح | نسخة مدعومة |
|---|---|---|
| دائما | دائما صحيح | |
| EnglishwordMatch | الكلمة الإنجليزية كلمة كاملة مطابقة | v0.13.0 |
| Englishwordnummatch | الكلمة الإنجليزية/الرقم مطابقة الكلمة الكاملة | v0.20.0 |
| WordTags | تلك التي تلبي علامات محددة ، مثل التركيز فقط على علامات [الإعلان] | v0.23.0 |
| سلاسل (IwordResultCondition ... شروط) | يدعم تحديد شروط متعددة وإرضائها في نفس الوقت | v0.23.0 |
الوضع الافتراضي الأصلي:
final String text = "I have a nice day。" ;
List < String > wordList = SensitiveWordBs . newInstance ()
. wordDeny ( new IWordDeny () {
@ Override
public List < String > deny () {
return Collections . singletonList ( "av" );
}
})
. wordResultCondition ( WordResultConditions . alwaysTrue ())
. init ()
. findAll ( text );
Assert . assertEquals ( "[av]" , wordList . toString ());يمكننا تحديد أن اللغة الإنجليزية يجب أن تتطابق مع الكلمة الكاملة.
final String text = "I have a nice day。" ;
List < String > wordList = SensitiveWordBs . newInstance ()
. wordDeny ( new IWordDeny () {
@ Override
public List < String > deny () {
return Collections . singletonList ( "av" );
}
})
. wordResultCondition ( WordResultConditions . englishWordMatch ())
. init ()
. findAll ( text );
Assert . assertEquals ( "[]" , wordList . toString ());بالطبع ، يمكن تنفيذ استراتيجيات أكثر تعقيدًا حسب الحاجة.
الإصدار المدعوم: v0.23.0
يمكننا فقط إرجاع كلمات حساسة تابعة لتسمية معينة.
لقد حددنا كلمتين حساسين: المنتج ، AV
MyWordtag هو تطبيق علامة كلمة حساس نحدده:
/**
* 自定义单词标签
* @since 0.23.0
*/
public class MyWordTag extends AbstractWordTag {
private static Map < String , Set < String >> dataMap ;
static {
dataMap = new HashMap <>();
dataMap . put ( "商品" , buildSet ( "广告" , "中文" ));
dataMap . put ( "AV" , buildSet ( "色情" , "单词" , "英文" ));
}
private static Set < String > buildSet ( String ... tags ) {
Set < String > set = new HashSet <>();
for ( String tag : tags ) {
set . add ( tag );
}
return set ;
}
@ Override
protected Set < String > doGetTag ( String word ) {
return dataMap . get ( word );
}
}على سبيل المثال ، نقوم بمحاكاة فئتين مختلفتين للتنفيذ ، كل منهما يركز على علامة كلمة مختلفة.
// 只关心SE情
SensitiveWordBs sensitiveWordBsYellow = SensitiveWordBs . newInstance ()
. wordDeny ( new IWordDeny () {
@ Override
public List < String > deny () {
return Arrays . asList ( "商品" , "AV" );
}
})
. wordAllow ( WordAllows . empty ())
. wordTag ( new MyWordTag ())
. wordResultCondition ( WordResultConditions . wordTags ( Arrays . asList ( "色情" )))
. init ();
// 只关心广告
SensitiveWordBs sensitiveWordBsAd = SensitiveWordBs . newInstance ()
. wordDeny ( new IWordDeny () {
@ Override
public List < String > deny () {
return Arrays . asList ( "商品" , "AV" );
}
})
. wordAllow ( WordAllows . empty ())
. wordTag ( new MyWordTag ())
. wordResultCondition ( WordResultConditions . wordTags ( Arrays . asList ( "广告" )))
. init ();
final String text = "这些 AV 商品什么价格?" ;
Assert . assertEquals ( "[AV]" , sensitiveWordBsYellow . findAll ( text ). toString ());
Assert . assertEquals ( "[商品]" , sensitiveWordBsAd . findAll ( text ). toString ());كلماتنا الحساسة بشكل عام أكثر استمرارًا ، مثل [قبعة سخيفة]
ثم هناك اكتشاف ذكي أنه يمكنك إضافة بعض الشخصيات في الوسط ، مثل [Silly! @#$ HAT] لتخطي الكشف ، ولكن يتم تقليل قوة الهجوم من اليمين.
لذلك ، كيف تتعامل مع هذه السيناريوهات المماثلة؟
يمكننا تحديد مجموعات تخطي من الأحرف الخاصة وتجاهل هذه الشخصيات التي لا معنى لها.
V0.11.0 يبدأ الدعم
يمكن تعريف استراتيجية الأحرف المقابلة لـ Charignore بمرونة من قبل المستخدمين.
final String text = "傻@冒,狗+东西" ;
//默认因为有特殊字符分割,无法识别
List < String > wordList = SensitiveWordBs . newInstance (). init (). findAll ( text );
Assert . assertEquals ( "[]" , wordList . toString ());
// 指定忽略的字符策略,可自行实现。
List < String > wordList2 = SensitiveWordBs . newInstance ()
. charIgnore ( SensitiveWordCharIgnores . specialChars ())
. init ()
. findAll ( text );
Assert . assertEquals ( "[傻@冒, 狗+东西]" , wordList2 . toString ());في بعض الأحيان نريد إضافة ملصق مصنّف إلى كلمات حساسة: مثل الوضع الاجتماعي ، والعنف ، إلخ.
وبهذه الطريقة ، يمكن تنفيذ المزيد من الخصائص وفقًا للعلامات ، وما إلى ذلك ، مثل معالجة نوع معين من الملصقات فقط.
الإصدار المدعوم: v0.10.0
نسخة دعم الميزات الرئيسية: v0.24.0
هذه مجرد واجهة مجردة ، ويمكن للمستخدمين تحديد التنفيذ بأنفسهم. على سبيل المثال ، من استعلام قاعدة البيانات ، قراءة الملفات ، مكالمات API ، إلخ.
public interface IWordTag {
/**
* 查询标签列表
* @param word 脏词
* @return 结果
*/
Set < String > getTag ( String word );
} من أجل تسهيل الاستخدام في معظم الحالات ، يتم تنفيذ بعض استراتيجيات المشهد في فئة WordTags
| طريقة التنفيذ | يوضح | ملاحظة |
|---|---|---|
| لا أحد() | التنفيذ الفارغ | V0.10.0 الدعم |
| ملف (سلسلة FilePath) | حدد مسار الملف | V0.10.0 الدعم |
| ملف (سلسلة FilePath ، سلسلة الكلمات ، TagSplit) | حدد مسارات الملف ، وكذلك فواصل الكلمات وفواصل العلامات | V0.10.0 الدعم |
| الخريطة (الخريطة النهائية <String ، Set> WordTagMap) | التهيئة وفقا للخريطة | V0.24.0 الدعم |
| خطوط (خطوط التجميع) | قائمة السلاسل | V0.24.0 الدعم |
| خطوط (خطوط التجميع ، سلسلة الكلمات ، العلامات التجارية) | قائمة الأوتار ، وكذلك فواصل الكلمات وفواصل التسمية | V0.24.0 الدعم |
| نظام() | تنفيذ مدمج لملفات النظام ، ودمج تصنيف الشبكة | V0.24.0 الدعم |
| الافتراضات () | السياسة الافتراضية هي نظام حاليا | V0.24.0 الدعم |
| سلاسل (iWordtag ... آخرون) | طريقة السلسلة ، تدعم تكامل المستخدم لتنفيذ سياسات متعددة | V0.24.0 الدعم |
تنسيق علامات الكلمات الحساسة التي نقوم بها الافتراضي إلى敏感词tag1,tag2 ، مما يعني أن علامات敏感词هي TAG1 و TAG2.
على سبيل المثال
五星红旗 政治,国家
ينصح هذا أيضًا لجميع محتويات سطر الملف ومحتويات السلسلة المحددة. إذا لم يكن راضياً ، فما عليك سوى تنفيذها بطريقة مخصصة.
بدءًا من V0.24.0 ، فإن علامة الكلمات الافتراضية هي WordTags.system() .
ملاحظة: حاليًا ، إحصائيات البيانات من الإنترنت ، وهناك العديد من الإغفالات. الجميع مرحب بهم أيضًا لتصحيح المشكلة والاستمرار في التحسن ...
SensitiveWordBs sensitiveWordBs = SensitiveWordBs . newInstance ()
. wordTag ( WordTags . system ())
. init ();
Set < String > tagSet = sensitiveWordBs . tags ( "博彩" );
Assert . assertEquals ( "[3]" , tagSet . toString ());هنا ، من أجل تحسين حجم الضغط ، يتم تمثيل الفئات المقابلة بالأرقام.
قائمة المعنى للأرقام هي كما يلي:
0 政治
1 毒品
2 色情
3 赌博
4 违法
هنا نأخذ الملف كمثال لإظهار كيفية استخدامه.
final String path = "~ \ test \ resources \ dict_tag_test.txt" ;
// 演示默认方法
IWordTag wordTag = WordTags . file ( path );
SensitiveWordBs sensitiveWordBs = SensitiveWordBs . newInstance ()
. wordTag ( wordTag )
. init ();
Set < String > tagSet = sensitiveWordBs . tags ( "零售" );
Assert . assertEquals ( "[广告, 网络]" , tagSet . toString ());
// 演示指定分隔符
IWordTag wordTag2 = WordTags . file ( path , " " , "," );
SensitiveWordBs sensitiveWordBs2 = SensitiveWordBs . newInstance ()
. wordTag ( wordTag2 )
. init ();
Set < String > tagSet2 = sensitiveWordBs2 . tags ( "零售" );
Assert . assertEquals ( "[广告, 网络]" , tagSet2 . toString ()); حيث dict_tag_test.txt محتوى المخصص لدينا هو كما يلي:
零售 广告,网络
عندما نحصل على كلمات حساسة ، يمكننا تعيين استراتيجية معالجة النتائج المقابلة للحصول على معلومات علامة الكلمات الحساسة المقابلة
// 自定义测试标签类
IWordTag wordTag = WordTags . lines ( Arrays . asList ( "天安门 政治,国家,地址" ));
// 指定初始化
SensitiveWordBs sensitiveWordBs = SensitiveWordBs . newInstance ()
. wordTag ( wordTag )
. init ()
;
List < WordTagsDto > wordTagsDtoList1 = sensitiveWordBs . findAll ( "天安门" , WordResultHandlers . wordTags ());
Assert . assertEquals ( "[WordTagsDto{word='天安门', tags=[政治, 国家, 地址]}]" , wordTagsDtoList1 . toString ()); نقوم بتخصيص علامات الكلمات الرئيسية天安门، ثم نحدد أن استراتيجية معالجة النتائج لـ Findall هي WordResultHandlers.wordTags() ، ويمكننا الحصول على قائمة العلامات المقابلة أثناء الحصول على كلمات حساسة.
في بعض الأحيان نريد تصميم تحميل الكلمات الحساسة في ديناميكية ، مثل تعديل وحدة التحكم ، والتي يمكن أن تصبح مفعلة في الوقت الفعلي.
v0.0.13 يدعم هذه الميزة.
لتنفيذ هذه الميزة وتتوافق مع الوظائف السابقة ، حددنا واجهتان.
الواجهة كما يلي ، يمكنك تخصيص تطبيقك الخاص.
القائمة التي تم إرجاعها تعني أن الكلمة هي كلمة حساسة.
/**
* 拒绝出现的数据-返回的内容被当做是敏感词
* @author binbin.hou
* @since 0.0.13
*/
public interface IWordDeny {
/**
* 获取结果
* @return 结果
* @since 0.0.13
*/
List < String > deny ();
}على سبيل المثال:
public class MyWordDeny implements IWordDeny {
@ Override
public List < String > deny () {
return Arrays . asList ( "我的自定义敏感词" );
}
}الواجهة كما يلي ، يمكنك تخصيص تطبيقك الخاص.
القائمة التي تم إرجاعها تعني أن الكلمة ليست كلمة حساسة.
/**
* 允许的内容-返回的内容不被当做敏感词
* @author binbin.hou
* @since 0.0.13
*/
public interface IWordAllow {
/**
* 获取结果
* @return 结果
* @since 0.0.13
*/
List < String > allow ();
}يحب:
public class MyWordAllow implements IWordAllow {
@ Override
public List < String > allow () {
return Arrays . asList ( "五星红旗" );
}
}بعد تخصيص الواجهة ، بطبيعة الحال ، يجب تحديد مفعولها.
لاستخدام أكثر أناقة ، قمنا بتصميم Woot Class SensitiveWordBs .
يمكنك تحديد الكلمات الحساسة من خلال Worddeny () ، Wordallow () يحدد الكلمات غير الحساسة ، وتهيئة قاموس الكلمات الحساسة من خلال init ().
SensitiveWordBs wordBs = SensitiveWordBs . newInstance ()
. wordDeny ( WordDenys . defaults ())
. wordAllow ( WordAllows . defaults ())
. init ();
final String text = "五星红旗迎风飘扬,毛主席的画像屹立在天安门前。" ;
Assert . assertTrue ( wordBs . contains ( text ));ملاحظة: init () تستغرق وقتًا طويلاً لبناء الكلمة الحساسة DFA. يوصى عمومًا بأن يتم تهيئته مرة واحدة فقط عند تطبيق التهيئة. بدلا من تكرار التهيئة!
يمكننا اختبار التنفيذ المخصص ، على النحو التالي:
String text = "这是一个测试,我的自定义敏感词。" ;
SensitiveWordBs wordBs = SensitiveWordBs . newInstance ()
. wordDeny ( new MyWordDeny ())
. wordAllow ( new MyWordAllow ())
. init ();
Assert . assertEquals ( "[我的自定义敏感词]" , wordBs . findAll ( text ). toString ()); فيما يلي الكلام الوحيد الذي تكون فيه我的自定义敏感词كلمات حساسة ،测试ليست كلمات حساسة.
بالطبع ، إليك جميع تطبيقاتنا المخصصة. يوصى بشكل عام باستخدام التكوين الافتراضي + التكوين المخصص للنظام.
يمكن استخدام الطريقة التالية.
WordDenys.chains() طريقة دمج تطبيقات متعددة في نفس iWorddeny.
WordAllows.chains() تدمج تطبيقات متعددة في نفس iWordallow.
مثال:
String text = "这是一个测试。我的自定义敏感词。" ;
IWordDeny wordDeny = WordDenys . chains ( WordDenys . defaults (), new MyWordDeny ());
IWordAllow wordAllow = WordAllows . chains ( WordAllows . defaults (), new MyWordAllow ());
SensitiveWordBs wordBs = SensitiveWordBs . newInstance ()
. wordDeny ( wordDeny )
. wordAllow ( wordAllow )
. init ();
Assert . assertEquals ( "[我的自定义敏感词]" , wordBs . findAll ( text ). toString ());كلهم يستخدمون التكوين الافتراضي للنظام والتكوين المخصص في نفس الوقت.
ملاحظة: نهيئة WordBs الجديدة ، لذلك استخدم WordBs جديدة للحكم. بدلاً من استخدام طريقة أداة SensitiveWordHelper السابقة ، فإن تكوين طريقة الأداة هو الافتراضي!
في الاستخدام الفعلي ، على سبيل المثال ، يمكنك تعديل تكوين الصفحة ثم يسري في الوقت الحقيقي.
يتم تخزين البيانات في قاعدة البيانات. فيما يلي مثال على الكود الزائف. يمكنك الرجوع إلى springsivitistwordconfig.java
مطلوب ، الإصدار v0.0.15 وما فوق.
الكود الزائف المبسط كما يلي ، ومصدر البيانات هو قاعدة بيانات.
MYDDWORDALLOW و MYDDWORDDENY هما فئات تنفيذ مخصصة تستند إلى قواعد البيانات كمصدر.
@ Configuration
public class SpringSensitiveWordConfig {
@ Autowired
private MyDdWordAllow myDdWordAllow ;
@ Autowired
private MyDdWordDeny myDdWordDeny ;
/**
* 初始化引导类
* @return 初始化引导类
* @since 1.0.0
*/
@ Bean
public SensitiveWordBs sensitiveWordBs () {
SensitiveWordBs sensitiveWordBs = SensitiveWordBs . newInstance ()
. wordAllow ( WordAllows . chains ( WordAllows . defaults (), myDdWordAllow ))
. wordDeny ( myDdWordDeny )
// 各种其他配置
. init ();
return sensitiveWordBs ;
}
}إن تهيئة المفردات الحساسة تستغرق وقتًا طويلاً ، لذلك يوصى بإجراء التهيئة في البداية مرة واحدة عند بدء تشغيل البرنامج.
بعد V0.6.0 ، أضف اختبار القياس المقابل.
Benchmarktimest
بيئة الاختبار دفتر ملاحظات عادي:
处理器 12th Gen Intel(R) Core(TM) i7-1260P 2.10 GHz
机带 RAM 16.0 GB (15.7 GB 可用)
系统类型 64 位操作系统, 基于 x64 的处理器
ملاحظة: تختلف بيئات مختلفة ، لكن النسبة مستقرة بشكل أساسي.
بيانات الاختبار: 100+ سلسلة ، حلقة 10W مرات.
| رقم سري | مشهد | يستغرق وقتا طويلا | ملاحظة |
|---|---|---|---|
| 1 | فقط قم بعمل كلمات حساسة دون أي تحويل تنسيق | 1470ms ، حوالي 7.2W QPs | متابعة الأداء الشديد ، يمكنك تكوينه مثل هذا |
| 2 | فقط جعل الكلمات الحساسة ، ودعم جميع تحويل التنسيق | 2744ms ، حوالي 3.7W QPS | تلبية معظم السيناريوهات |
إزالة الكلمات الحساسة من الأحرف الصينية الفردية. في الصين ، ينبغي اعتبار العبارات كلمة واحدة لتقليل معدل سوء الحكم.
يدعم تغييرات الكلمات الحساسة الفردية؟
إزالة ، إضافة ، تحرير؟
دعم واجهة علامة الكلمات الحساسة
وضع علامة على الدعم عند معالجة الكلمات الحساسة
مقارنة استخدام الذاكرة + تحسين WordData
يحدد المستخدمون عبارات مخصصة ، ويسمحون للحصول على مزيج من العبارات المحددة ، مما يجعلها أكثر مرونة
FormatCombine/CheckCombine/Leferdenycombine سياسة مجموعة ، مما يسمح بتخصيص المستخدم.
تحسين استراتيجية فحص الكلمات ، التحويل الموحد +
أضف threadlocal وغيرها من تحسينات الأداء
حساسة الكلمة-الإدارة الكلمة الحساسة وحدة التحكم v1.2.0 المصدر المفتوح
كيفية دعم النشر الموزعة في إصدار V1.3.0 الحساسة؟
01-beginner من أداة الكلمات الحساسة مفتوحة المصدر
02- كيف لتنفيذ أداة كلمات حساسة؟ توضيح فكرة تنفيذ الكلمات المحظورة
03 دعم كلمة إيقاف الكلمات الأمثل والرموز الخاصة
04 قرص من الكلمات الحساسة للتخسيس
شرح 05 مفصل لخوارزمية DFA للكلمات الحساسة (خوارزمية شجرة تري)
06 كلمات حساسة (الكلمات القذرة) كيف تتجاهل الشخصيات التي لا معنى لها؟ تحقيق تأثير تصفية أفضل
v0.10.0 الدعم الأولي لعلامة تصنيف الكلمات القذرة
v0.11.0 - ميزات جديدة للكلمات الحساسة: تجاهل أحرف لا معنى لها ، قاموس علامة الكلمات
v0.12.0 كلمة حساسة/قدرة وضع العلامات على الكلمات القذرة يتم تعزيزها
v0.13.0 إصدار إصدار ميزة Word Ensister يدعم مطابقة الكلمات الكاملة بالكلمات الإنجليزية
v0.16.1 إصدار موارد الذاكرة من خلال ميزات جديدة من الكلمات الحساسة
v0.19.0 - كلمات حساسة مع ميزات جديدة من الكلمات الحساسة التي تم تحريرها بشكل فردي دون تهيئة متكررة
v0.20.0 الخصائص الجديدة للكلمات الحساسة تتطابق مع جميع الأرقام ، وليس المباريات الجزئية
v0.21.0 - الأطباء البيضاء مع ميزات جديدة من الكلمات الحساسة تدعم التحرير الفردي ، وتصحيح المشكلة عندما تحتوي القوائم البيضاء على قوائم سوداء
بينين إلى بينين
pinyin2hanzi pinyin للشخصيات الصينية
قطاع تجزئة الكلمات الصينية عالية الأداء
opencc4j الصينية الصينية التقليدية التبسيط الصينية التحويل الصيني
NLP-Hanzi-تشابه الشخصية الصينية المشابه
الكشف الكشف عن الكلمة الإملائية
كلمات حساسة للكلمة