1. مقدمة
أثناء التطوير ، غالبًا ما تتم معالجة التقديمات الخاصة بنصوص بعض المستخدمين ، لذلك تتضمن وظيفة تصفية الكلمات الحساسة. يتم استخدام خوارزمية آلة الحالة المحدودة DFA في المواد المرجعية لإنشاء الرسوم البيانية الموجهة. تم الانتهاء من تصفية الكلمات الحساسة وشعارات الإعلان ، والكفاءة جيدة ، لذا شاركها.
تطبيق محدد:
1. تصفية حالة المباراة
2. تطابق مرشح نصف العرض الكامل
3. مرشح مرشح الإيقاف المؤقت لتصفية كلمة.
4. كرر تصفية الكلمات للكلمات الحساسة.
على سبيل المثال:
يدعم اكتشاف تصفية النوع التالي:
اللعنة
حالة اللعنة
يمارس الجنس مع نصف العرض الكامل
و !!! u & c ### k كلمة توقف
Ffuuuuuccccckkks كلمات التكرار
هناك العديد من الطرق لتصفية الكلمات الحساسة. سأصف بإيجاز عدة أنواع أفهمها الآن:
① Quase الكلمات الحساسة في قاعدة البيانات ، وقم بحلق كل كلمة حساسة ، ثم ابحث من البداية إلى النهاية في نص الإدخال لمعرفة ما إذا كانت هذه الكلمة الحساسة موجودة.
بعبارة صريحة ، هذه الطريقة هي العثور على واحدة للتعامل مع الآخر.
المزايا: سهل جدا. لا توجد صعوبة في تنفيذها باستخدام رمز Java.
العيوب: هذه الكفاءة تجعلني أركض أكثر من 100000 خيول من الطين في قلبي ، والمطابقة مؤلمة بعض الشيء؟ إذا كانت باللغة الإنجليزية ، فستجد شيئًا عاجزًا عن الكلام ، مثل اللغة الإنجليزية.
أ كلمة حساسة. إذا كنت مستندًا إنجليزيًا ، فكم مرة يتعين عليها معالجة الكلمات الحساسة؟ هل يمكن لأحد أن يخبرني؟
② خوارزمية DFA الأسطورية (الأوتوماتا الفقيرة) هي بالضبط ما أريد مشاركته معك. بعد كل شيء ، إنه شعور أكثر عمومية. آمل أن يتمكن الجميع من التحقق من مبادئ الخوارزمية بأنفسهم.
لن يتم شرح المعلومات بالتفصيل هنا.
المزايا: على الأقل هو أكثر كفاءة من SB أعلاه.
العيوب: لا ينبغي أن يكون من الصعب على أولئك الذين تعلموا الخوارزميات ، لكن ليس من الصعب استخدامها. إنه أمر مؤلم بعض الشيء ، والكفاءة المطابقة ليست عالية ، وتستهلك الذاكرة.
الكلمات الأكثر حساسية ، ومزيد من الذاكرة التي تستهلكها.
③ تم شرح النوع الثالث على وجه التحديد هنا ، أي أنه يجب عليك كتابة خوارزمية بنفسك ، أو تحسينه استنادًا إلى الخوارزميات الموجودة. هذا هو أيضا ما يتبعه شياو آلان.
واحدة من العوالم العالية ، إذا كان لدى أي شقيق بذيء أفكاره الخاصة ، فلا تنسَ شياو آلان. يمكنك إضافة QQ: 810104041 من Xiao Alan لتعليم Xiao Alan حيلتين للعب.
2. تنفيذ الكود
هيكل الدليل الخاص به على النحو التالي:
في دليل موارد الموارد:
STOPWD.TXT: الإيقاف المؤقت كلمة ، يتم ترشيح وقت المطابقة مباشرة.
wd.txt: حساس thesaurus.
1. فئة تصفية الكلمات الحساسة WordFilter
package org.andy.seStivitySwDfilter ؛ استيراد java.io.bufferedreader ؛ استيراد java.io.ioException ؛ استيراد java.io.inputstreamreader ؛ استيراد java.util.arraylist ؛ استيراد java.util.hashmap ؛ استيراد java.util.hashset ؛ استيراد java.util.list ؛ استيراد java.util.map ؛ استيراد java.util.set ؛ استيراد org.andy.seStivitwDfilter.Util.bcConvert ؛ /** * وقت الخلق: 30 أغسطس ، 2016 في 3:01:12 PM * * الفكرة: إنشاء مرشحات ، وتعداد ما إذا كانت جميع chars من 0 ~ 65535 تبدأ في بداية كلمة حساسة * * تحديد ما إذا كانت تبدأ في كلمة حساسة | | هل من المقبول الحصول على عقدة الرأس-الكلمة التالية ثم اجتياز خطوة بخطوة ، خوارزمية DFA * * Author Andy * version 2.2 */ public class wordfilter {private static finalteret set = new filterset () ؛ // قم بتخزين الخريطة النهائية الثابتة الأولى لـ Word <Integer ، WordNode> noles = new hashmap <integer ، wordnode> (1024 ، 1) ؛ // تخزين العقدة مجموعة خاصة ثابتة ثابتة <integer> STOPWDSET = جديد HASHSET <> () ؛ // وقفة كلمة char char private static char = '*' ؛ // تصفية الكلمات الحساسة استبدال ثابت {try {long a = system.nanotime () ؛ init () ؛ a = system.nanotime () - a ؛ System.out.println ("وقت التحميل:" + a + "ns") ؛ System.out.println ("وقت التحميل:" + A / 1000000 + "MS") ؛ } catch (استثناء e) {رمي new runTimeException ("فشل تصفية التهيئة") ؛ }} private static void init () {// احصل على الكلمة الحساسة لإضافة WOLD WORD (readwordfromfile ("wd.txt")) ؛ AddStopword (readwordfromfile ("STOPWD.TXT")) ؛ } / ** * أضف كلمة حساسة * param path * @RETURN * / قائمة ثابتة خاصة <string> readwordfromfile (مسار السلسلة) {list <string> الكلمات ؛ BufferedReader BR = NULL ؛ TREE {br = new BufferedReader (new inputStreamReader (wordfilter.class.getClassLoader (). getResourCeasStream (path))) ؛ الكلمات = ArrayList جديد <string> (1200) ؛ لـ (string buf = "" ؛ (buf = br.readline ())! = null ؛) {if (buf == null || buf.trim (). Words.Add (buf) ؛ }} catch (استثناء e) {رمي new runTimeException (e) ؛ } أخيرًا {try {if (br! = null) br.close () ؛ } catch (ioException e) {}} إرجاع الكلمات ؛ } / ** * أضف كلمة مغطرة * * param words * / private static void addstopword (القائمة النهائية <string> الكلمات) {if (الكلمات! = null && words.size ()> 0) {char [] chs ؛ لـ (String Curr: Words) {chs = curr.tochararray () ؛ لـ (char c: chs) {spolutwdset.add (charconvert (c)) ؛ }}}}} / *** أضف DFA Node* param words* / private static void addsevitivitive (القائمة النهائية <string> الكلمات) {if (الكلمات! = null && words.size ()> 0) {char [] chs ؛ int fchar ؛ int lastIndex ؛ WordNode fnode ؛ // عقدة الحروف الأولى لـ (String Curr: Words) {chs = curr.tochararray () ؛ FCAR = CharConvert (CHS [0]) ؛ if (! set.contains (fCHAR)) {// لا يوجد تعريف تعريف أولي. على أي حال ، يتم الحكم عليه ، لذلك لن يتم تكرار fnode = new wordnode (fchar ، chs.length == 1) ؛ NOMES.PUT (FCHAR ، FNODE) ؛ } else {fnode = nodes.get (fchar) ؛ if (! fnode.islast () && chs.length == 1) fnode.setLast (true) ؛ } lastIndex = chs.length - 1 ؛ لـ (int i = 1 ؛ i <chs.length ؛ i ++) {fnode = fnode.addifnoexist (charconvert (chs [i]) ، i == lastIndex) ؛ }}}} / ** * تصفية الحكم يحول الكلمات الحساسة إلى كلمات مقنعة * param src * regurn * / public static string dofilter (Final String src) {char [] chs = src.tochararray () ؛ طول int = chs.length ؛ int currc ؛ int k ؛ WordNode Node ؛ لـ (int i = 0 ؛ i <length ؛ i ++) {currc = charconvert (chs [i]) ؛ إذا (! } node = nodes.get (currc) ؛ // day 2 if (node == null) // في الواقع لن يحدث ، فأنت تستخدم لكتابتها على الاستمرارية ؛ Boolean Canmark = false ؛ int marknum = -1 ؛ if (node.islast ()) {// word matching (day) canmark = true ؛ marknum = 0 ؛ } // تواصل مطابقة (اليوم/اليوم) بأولوية طويلة الأجل // you-3 sister-4 زوج-5 k = i ؛ لـ (؛ ++ k <length ؛) {int temp = charconvert (chs [k]) ؛ إذا (SOPTWDSET.CONTAINS (TEMP))) متابعة ؛ العقدة = node.querysub (temp) ؛ if (node == null) // no break ؛ if (node.islast ()) {canmark = true ؛ marknum = k - i ؛ // 3-2}} if (يمكن أن (يمكن أن يكون) {for (k = 0 ؛ k <= marknum ؛ k ++) {chs [k+i] = sign ؛ } i = i + marknum ؛ }} إرجاع سلسلة جديدة (CHS) ؛ } / ** * هل تحتوي الكلمات الحساسة على * param src * regurn * / public static boolean isContains (final string src) {char [] chs = src.toChararray () ؛ طول int = chs.length ؛ int currc ؛ int k ؛ WordNode Node ؛ لـ (int i = 0 ؛ i <length ؛ i ++) {currc = charconvert (chs [i]) ؛ إذا (! } node = nodes.get (currc) ؛ // day 2 if (node == null) // لا يحدث ذلك ، فهو مكتوب بشكل معتاد ؛ Boolean Canmark = false ؛ if (node.islast ()) {// word matching (day) canmark = true ؛ }. لـ (؛ ++ k <length ؛) {int temp = charconvert (chs [k]) ؛ إذا (SOPTWDSET.CONTAINS (TEMP))) متابعة ؛ العقدة = node.querysub (temp) ؛ if (node == null) // no break ؛ if (node.islast ()) {canmark = true ؛ }} if (canmark) {return true ؛ }} إرجاع خطأ ؛ } / ** * Quartercase to Sidrase Width Conversion إلى نصف عرض * * param src * return * / private static int charconvert (char src) {int r = bcconvert.qj2bj (src) ؛ العودة (r> = 'a' && r <= 'z')؟ R + 32: R ؛ }} في:
isContains: ما إذا كان يجب تضمين كلمات حساسة
Dofilter: تصفية الكلمات الحساسة
2.
package org.andy.seStivitySwDfilter ؛ استيراد java.util.linkedList ؛ استيراد java.util.list ؛ / ** * تم إنشاؤه: 30 أغسطس 2016 في 3:07:45 PM * * Author Andy * @Version 2.2 */ Public Class WordNode {private int value ؛ // اسم العقدة قائمة خاصة <WordNode> subnodes ؛ // Node Node private Boolean Islast ؛ // الافتراضي False Public WordNode (int value) {this.value = value ؛ } public wordNode (int value ، boolean islast) {this.value = value ؛ this.islast = islast ؛ } / ** * * param subnode * return هو subnode subnode الواردة * / private wordNode addSubNode (Final WordNode subnode) {if (subnodes == null) subnodes = new LinkedList <WordNode> () ؛ subnodes.add (subnode) ؛ إرجاع النيد الفرعي ؛ } /*** إذا كان هناك ، أعد عقدة الطفل مباشرة. إذا كان هناك لا ، قم بإنشاء وإضافة وإرجاع Node * * param value * regurn */ public wordnode addifnoexist (قيمة int النهائية ، islast النهائي) {if (subnodes == null) {return addSubNode (new wordnode (value ، islast)) ؛ } لـ (WordNode subnode: subnodes) {if (subnode.value == value) {if (! subnode.islast && islast) subnode.islast = true ؛ إرجاع النيد الفرعي ؛ }} الإرجاع addSubNode (new WordNode (value ، islast)) ؛ } public WordNode QuerySub (value int final) {if (subnodes == null) {return null ؛ } لـ (WordNode subnode: subnodes) {if (subnode.value == value) return subnode ؛ } إرجاع فارغ ؛ } boolean islast () {return islast ؛ } public void setlast (boolean islast) {this.islast = islast ؛ } Override public int hashcode () {return value ؛ }}3. نتائج الاختبار
يتضمن المشروع thesaurus الحساسة ، رمز المصدر ، توقف التوقف ، إلخ. فقط قم بتشغيل حزمة Maven و Jar لتشغيلها مباشرة.
رمز مصدر المشروع: حساس filter_jb51.rar
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.