كلمة وتصفية النص الحساسة هي وظيفة لا غنى عنها لموقع الويب. من الضروري جدًا تصميم خوارزمية تصفية جيدة وفعالة. منذ بعض الوقت ، طلب مني صديق لي (تخرج قريبًا ولم يمض وقت طويل بعد المشاركة في البرمجة) مساعدته في قراءة شيء تصفية نص ، وقال إن كفاءة الاسترجاع كانت بطيئة للغاية. أخذت البرنامج ورأيت أن العملية برمتها هي كما يلي: اقرأ المفردات الحساسة ، إذا كانت مجموعة hashset ، احصل على الصفحة لتحميل النص ، ثم مطابقة ذلك. لقد اعتقدت فقط أن هذه العملية يجب أن تكون بطيئة للغاية. بالنسبة لشخص لم يكن على اتصال معه ، لا يمكنني إلا أن أفكر في هذا ، ونقطة أكثر تقدماً هي التعبيرات العادية. لكن لسوء الحظ ، لا يمكن لأي طريقة ممكنة. بالطبع ، في وعي ، لم أكن أدرك أن الخوارزمية يمكن أن تحل المشكلة ، لكن Google تعرفها!
مقدمة إلى DFA
من بين الخوارزميات التي تنفذ تصفية النص ، تعتبر DFA خوارزمية التنفيذ الوحيدة الأفضل. DFA هو Automaton المحدود الحتمي ، مما يعني تحديد Automaton المحدود. يحصل على الحالة التالية من خلال الحدث والحالة الحالية ، أي الحدث+الحالة = التالي. يوضح الشكل التالي انتقال حالته. في هذا الشكل ، فإن الأحرف الكبيرة (S و U و V و Q) كلها حالات ، والأحرف الصغيرة A و B هي إجراءات. من خلال الصورة أعلاه يمكننا رؤية العلاقة التالية
ABB
S ------> US ------> VU ------> V
في خوارزمية تنفذ تصفية الكلمات الحساسة ، يجب علينا تقليل العمليات ، في حين أن DFA ليس لديه أي حسابات تقريبًا في خوارزمية DFA ، فقط تحويلات الحالة.
Java تنفذ خوارزمية DFA لتنفيذ تصفية الكلمات الحساسة
مفتاح تنفيذ تصفية الكلمات الحساسة في Java هو تنفيذ خوارزمية DFA. أولاً ، دعنا نحلل الرقم أعلاه. في هذه العملية ، نعتقد أن الهيكل التالي سيكون أكثر وضوحًا.
في الوقت نفسه ، لا يوجد انتقال أو إجراء حالة هنا ، لا يوجد سوى استعلام (العثور). يمكننا أن نعتقد أنه من خلال الاستعلام s ، v ، من خلال u query v ، p ، من خلال Query Up. من خلال هذا التحول ، يمكننا تحويل انتقال الحالة إلى بحث باستخدام مجموعات Java.
من المسلم به أن هناك العديد من الكلمات الحساسة المضافة إلى ثيسبنا الحساس: الشياطين اليابانيين اليابانيين ، ماو زي. دونغ. إذن ما نوع الهيكل الذي أحتاجه لبناء؟
أولاً: يوم الاستعلام ---> {book} ، كتاب الاستعلام ---> {people ، devil} ، Query Person ---> {null} ، Query Ghost ---> {child}. الشكل كما يلي:
دعنا نوسع هذا الرقم أدناه:
وبهذه الطريقة ، نقوم ببناء thesaurus الحساسة لدينا في شجرة تشبه واحدة تلو الأخرى ، بحيث عندما نحكم على ما إذا كانت كلمة ما هي كلمة حساسة ، فإننا نقلل بشكل كبير من نطاق مطابقة البحث. على سبيل المثال ، إذا أردنا الحكم على اليابانيين ، فيمكننا تأكيد أن الشجرة التي نحتاجها للبحث بناءً على الكلمة الأولى ، ثم البحث في هذه الشجرة.
ولكن كيف تحكم على أن كلمة حساسة قد انتهت؟ استخدم بت الهوية للحكم.
وبالتالي فإن مفتاح هذا هو كيفية بناء أشجار الكلمات الحساسة هذه. أدناه قمت بتطبيق خوارزمية DFA مع HashMap في Java كمثال. العملية المحددة هي كما يلي:
الشياطين اليابانية اليابانية كأمثلة
1. الاستعلام "يوم" في هاشماب لمعرفة ما إذا كان موجودًا في هاشماب. إذا لم يكن موجودًا ، فهذا يثبت أن الكلمة الحساسة التي تبدأ بـ "اليوم" غير موجودة بعد ، ثم نبني هذه الشجرة مباشرة. القفز إلى 3.
2. إذا وجدت ذلك في HashMap ، فإنه يشير إلى أن هناك كلمة حساسة تبدأ بـ "اليوم". قم بتعيين HashMap = hashmap.get ("Day") ، والقفز إلى 1 ، ومطابقة "هذا" و "person" بدوره.
3. تحديد ما إذا كانت الكلمة هي الكلمة الأخيرة في الكلمة. إذا كان ذلك يعني نهاية الكلمة الحساسة ، فقم بتعيين بتات العلم = 1 ، وإلا قم بتعيين بتات العلم = 0 ؛
تطبيق البرنامج كما يلي:
/** * اقرأ المعجم الحساس ، ضع الكلمات الحساسة في مجموعة التجزئة ، وقم ببناء خوارزمية DFA: <br> * middle = { * isend = 0 * country = {<br> } *} *} * خمسة = { * isend = 0 * star = { * isend = 0 * red = { * isend = 0 * flag = { * isend = 1 *} *} *} *} *} * "RawTypes" ، "Unchected"}) private void addStivitiveWordToHashMap (SET <Tring> keywordset) {حساس wordwordmap = new hashmap (keywordsetsize ()) ؛ // تهيئة حاوية الكلمات الحساسة لتقليل مفتاح تشغيل عملية التوسع = فارغ ؛ خريطة nowmap = null ؛ خريطة <string ، string> newWormap = null ؛ // التكرار كلمة ايتراتور <Tring> iterator = keywordsetIrator () ؛ بينما (iteratorhasnext ()) {key = iteratornext () ؛ // الكلمة الرئيسية nowmap = حساس WordwreMap ؛ لـ (int i = 0 ؛ i <keylength () ؛ i ++) {char keychar = keycharat (i) ؛ // تحويل إلى wordmap من نوع char-type = nowmapget (keychar) ؛ // get if (wordmap! = null) {// إذا كان هذا المفتاح موجودًا ، قم بتعيين nowmap = (map) wordMap مباشرة ؛ } آخر {// إذا لم يكن موجودًا ، فقم بإنشاء خريطة وقم بتعيينها إلى 0 في نفس الوقت لأنها ليست الأخيرة newwormap = new hashmap <string ، string> () ؛ NewWormApput ("isend" ، "0") ؛ // ليس آخر nowmapput (keychar ، newwormap) ؛ nowmap = newWormap ؛ } if (i == keylength () - 1) {nowmapput ("isend" ، "1") ؛ //آخر} } } } }هيكل hashmap الذي تم الحصول عليه عن طريق الجري كما يلي:
{five = {star = {red = {itend = 0 ، flag = {itend = 1}} ، isend = 0} ، isend = 0} ، isEnd = 0} ، invalue = {itend = 0 ، country = {ited = 0 ، people = {itend = 1} ، male = {isend = 0 ، people =
لقد قمنا بتنفيذ طريقة بسيطة للمسجور الحساسة ، فكيف ننفذ الاسترجاع؟ عملية البحث ليست أكثر من تنفيذ HashMap. إذا وجدت ذلك ، فإنه يثبت أن الكلمة هي كلمة حساسة ، وإلا فإنها ليست كلمة حساسة. هذه العملية كما يلي: إذا كنا نطابق "يعيش الشعب الصيني".
1. الكلمة الأولى "中" ، يمكننا أن نجدها في هاشماب. احصل على خريطة جديدة = hashmap.get ("").
2. إذا خريطة == فارغة ، فهي ليست كلمة حساسة. خلاف ذلك تخطي إلى 3
3.
من خلال هذه الخطوة ، يمكننا الحكم على أن "الشعب الصيني" هو كلمة حساسة ، ولكن إذا كتبنا "النساء الصينيات" ، فهي ليست كلمة حساسة.
/*** تحقق مما إذا كان النص يحتوي على أحرف حساسة. قواعد الفحص هي كما يلي: <br> * Auuthor Chenming * date 20 أبريل 2014 في 4:31:03 PM * param txt * param stalindex * param matchtype * @return ، إذا كان موجودًا ، فإنه يعيد طول كلمة الكلمات الحساسة ، وإذا كان غير موجود ، فهو يعود 0 * int public checksensitiveword (String txt ، int bathindex ، int matchtype) {boolean flag = false ؛ // البتة ذات الكلمة الحساسة: تستخدم في حالة وجود واحد فقط من كلمة حساسة int matchflag = 0 ؛ // عدد المعرفات المتطابقة هو 0 بشكل افتراضي كلمة char = 0 ؛ خريطة nowmap = حساس wordmap ؛ لـ (int i = beardindex ؛ i <txtLength () ؛ i ++) {word = txtcharat (i) ؛ nowmap = (map) nowmapget (كلمة) ؛ // احصل على المفتاح المحدد إذا (nowmap! = null) {// موجود ، حدد ما إذا كان آخر matchflag ++ ؛ // ابحث عن المفتاح المقابل ، المعرف المتطابق +1 إذا ("1" يساوي (nowmapget ("isend"))) {// إذا كانت القاعدة المطابقة الأخيرة ، فقم بإنهاء الحلقة وإرجاع علامة معرف المطابقة = true ؛ . }}} آخر {// لم يكن موجودًا ، فاكسة العودة مباشرة ؛ }}} if (matchflag <2 &&! flag) {matchflag = 0 ؛ } إرجاع matchflag ؛ }في نهاية المقالة ، أقدم تنزيل ملف باستخدام Java لتنفيذ تصفية الكلمات الحساسة. فيما يلي فئة اختبار لإثبات كفاءة وموثوقية هذه الخوارزمية.
public static void main (string [] args) {حساس wordwordfilter filter = جديد حساس wordfilter () ؛ SystemOutPrintln ("عدد الكلمات الحساسة:" + FilterSensitivitiveWordMapsize ()) ؛ String string = "قد يقتصر الكثير من المشاعر الحزينة على المؤامرات على شاشة قاعدة التغذية. يحاول بطل الرواية استخدام بعض الطرق لإطلاق دليل الانتحار تدريجياً ويهتم بحزن تجربته الخاصة." + "ثم فإن دور فالون غونغ هو اتباع غضب تحالف Xihongke من بطل الرواية وحزنه وحزنه ، وإرفاق عواطفه بمؤامرة الشاشة بعيدًا جدًا ، ثم يتم نقله ويبكي". + "إذا كنت حزينًا ، فسوف تستلقي على ذراعي شخص ما وشرحت قلبك أو جهاز بطاقة هاتفك المحمول. كوب من النبيذ الأحمر. فيلم. في ليلة عميقة وهادئة ، تغلق الهاتف وتتحدق بهدوء." ؛ SystemOutPrintln ("عدد الكلمات المراد اكتشافها:" + StringLength ()) ؛ Long Begintime = SystemCurrentTimeMillis () ؛ SET <TRING> SET = FILTERGETSENTIVEISITIOND (سلسلة ، 1) ؛ endtime الطويل = SystemCurrentTimeMillis () ؛ SystemOutPrintln ("عدد الكلمات الحساسة في العبارة هو:" + setSize () + ". SystemOutPrintln ("إجمالي وقت المستهلك هو:" + (endtime - begintime)) ؛ } نتائج التشغيل:
من النتائج المذكورة أعلاه ، يمكننا أن نرى أن هناك 771 من قواعد بيانات المفردات الحساسة ، وطول جملة الكشف هو 184 حرفًا ، و 6 كلمات حساسة. استغرق 1 مللي ثانية في المجموع. السرعة المرئية لا تزال كبيرة للغاية.
يتم توفير تنزيلات المستندين التالية:
Desktop.rar (http://xiazai.vevb.com/201611/yuanma/desktop_jb51.rar) يحتوي على ملفين Java ، واحد هو قراءة قاعدة بيانات حساسة (حساسة) ، والآخر هو فئة أدوات الكلمات الحساسة (Wordsworderfilter) ، والتي تحتوي (isContaintsensevitive Word (سلسلة txt ، int matchtype) ، والحصول على كلمات حساسة (getTivitiveword (سلسلة txt ، int matchtype)) ، واستبدال الكلمات الحساسة (استبدال الكلمات (سلسلة txt ، int matchtype ، string replacechar)).
thesaurus حساس: انقر لتنزيل
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.