تصف هذه المقالة خوارزمية تجزئة الكلمات المطابقة ثنائية الاتجاه التي تنفذها Java. شاركه للرجوع إليه ، على النحو التالي:
العديد من خوارزميات تجزئة الكلمات الشائعة هي: طريقة تجزئة الكلمات استنادًا إلى مطابقة السلسلة ، وطريقة تجزئة الكلمات بناءً على الفهم ، وطريقة تجزئة الكلمات بناءً على الإحصاءات. تستخدم هذه المقالة طريقة مطابقة السلسلة.
إلى الأمام أقصى مطابقة للمشاركة:
يتم تنفيذ هذه الخوارزمية استنادًا إلى قاموس Word Goll ، الذي يؤدي تجزئة مطابقة من الجانب الأيسر من السلسلة. إذا كان القاموس موجودًا ، فإنه يعيد الكلمة المقسمة وقطع الكلمة من السلسلة السابقة ، وحلقات لقطع حتى يكون حجم السلسلة 0.
على سبيل المثال: STR = "نحن جميعًا طلاب من كلية هندسة المعلومات ، جامعة شمال غرب A&F." ، (لنفترض أننا نحدد الحد الأقصى لطول القطع كحد أقصى = 8 ، أي ثمانية أحرف صينية)
1. تحديد كلمة النعتلة طول len = max ، أخرج أحرف LEN من الكلمة اليسرى = "نحن جميعًا في الشمال الغربي من الزراعة والغابات" ونطابق الكلمة في القاموس ؛
2. إذا لم تكن هناك مثل هذه الكلمة في القاموس ، فقم بإزالة الحرف الأخير وقم بتعيينه إلى الكلمة ، ويتم تقليل قيمة LEN بمقدار 1 ؛
3. كرر الخطوة 2 حتى يتم العثور على الكلمة في القاموس أو len = 1 ، الخروج من الحلقة ؛
4. قطع الكلمات المقسمة من STR وكرر الخطوات 1 و 2 و 3 حتى تتحلل STR.
عكس أقصى قدر من المطابقة:
مثل خوارزمية تجزئة الكلمات الأمامية ، تبدأ ببساطة من الجانب الأيمن من السلسلة حتى يكون طول السلسلة 0. لن أخوض في التفاصيل هنا.
النعت في اتجاهين مطابقة:
هذه الطريقة هي جعل الغموض النعت لتجزئة الغموض على أساس النعت الأمامي والعكس النعت. اقترح تنفيذ "خوارزمية تناول الأفعى". السلسلة لأداء تجزئة الكلمات هي الطعام. هناك ثعابين شره ، يأكل أحدهما من اليسار إلى اليمين ؛ الآخر يأكل من اليمين إلى اليسار. طالما أن نتائج النعت اليسرى واليمين غامضة ، فإن الثعابين سوف يعضونها. السلسلة التي يأكلها الأفعى تصبح النعت. إذا كان هناك دائمًا غموض بين المشاركين الأيسر واليمين ، فستستمر الثعابين في الأكل. عندما تأكل ثعابين تتقاطع بين الأوتار ، لن يكون هناك بالتأكيد أي غموض. في هذا الوقت ، فإن النعت في بطن الأفعى الجشع على اليسار ، لا يوجد أي غموض في الوسط ، والنعت في بطن الأفعى الجشع على اليمين ، ثلاثة منها هي النعت النهائي.
هذه المقالة هي تقسيم الفقرة بأكملها إلى كلمات. أولاً ، تنقسم الفقرة إلى جمل بناءً على علامات الترقيم ، ثم يتم إخراج كل جملة لتقسيم الكلمة.
حزمة cn.nwsuaf.spilt ؛ استيراد java.io.bufferedreader ؛ استيراد java.io.filereader ؛ استيراد java.io.ioException ؛ استيراد java.Uraylist ؛ خوارزمية تجزئة الكلمات إلى الأمام والعكسي في ثنائية الاتجاه* Author liu yonglang**/public class wordpilt {/*** storage word word dictionary*/private map <string ، integer> map = new hashmap <string ، integer> () ؛ / *** الحد الأقصى لطول كلمة الكلمات هو خمسة أحرف صينية*/ private int max_length = 5 ؛ /** * اقرأ قاموس كلمة النعت في طريقة البناء وتخزينه في الخريطة * * throws ioException */public wordspilt () يلقي ioException {bufferedReader Br = new Bufferreader (New FilerEader ("src/dict.txt")) ؛ خط السلسلة = فارغ ؛ بينما ((line = br.readline ())! = null) {line = line.trim () ؛ map.put (السطر ، 0) ؛ } br.close () ؛ } / *** قم بتعيين الحد الأقصى لطول قطع الكلمات** param max* الحد الأقصى لقطعة الكلمة* / public void setMaxLength (int max) {this.max_length = max ؛ } / ** * احصل على الحد الأقصى الحالي لقطع الكلمات ، الافتراضي هو 5 (5 أحرف صينية) * * RETURN الحد الأقصى لطول قطع الكلمات * / public int getMaxLength () {return this.max_length ؛ } / ** * الحد الأقصى لخوارزمية قطع الكلمات المتطابقة * * param spiLtStr * سلسلة ليتم تقسيمها * param lefttoright * اتجاه التقطيع ، صحيح من اليسار إلى اليمين ، خطأ هو السلسلة المقسمة من اليمين إلى اليسار * @قائمة string <string> spilled (String string ، boolean lefttoright) { باطل؛ // قم بتخزين قائمة سلسلة تقسيم المطابقة الإيجابية <String> Leftwords = ArrayList New ArrayList <String> () ؛ // قم بتخزين قائمة سلسلة تقسيم المطابقة السلبية <String> Rightwords = جديد ArrayList <String> () ؛ // String لتقطيع سلسلة سلسلة = null ؛ // خذ طول الكلمة ، وتهيئة إلى الحد الأقصى لقيمة WordLength = max_length ؛ // في الموضع الحالي لموضع السلسلة int = 0 ؛ // تمت معالجة طول السلسلة طول int = 0 ؛ // قم بإزالة المساحات الإضافية في السلسلة spiLtstr = spiLtStr.trim (). replaceall ("// s+" ، "") ؛ // عندما لا يتم تقسيم السلسلة المراد شرائحها ، فإن تجزئة الحلقة (الطول <spiLtStr.Length ()) {// إذا كان طول السلسلة التي لم يتم تقطيعها أقل من القيمة القصوى ، فدع طول الكلمة مساويًا لطول الكلمة نفسها إذا (spiLtStr.Length () طول <max_length) // خلاف ذلك ، خذ القيمة الافتراضية الأخرى wordlength = max_length ؛ // إذا كان ذلك بمثابة تطابق أقصى للأمام ، فابدأ القطع من موضع spiLtSt إذا (LeftToright) {position = length ؛ word = spiLtStr.SubString (موضع ، موضع + WordLength) ؛ } // إذا كانت تطابق أقصى عكسي ، فابدأ القطع من نهاية spiLtstr آخر {position = spiLtStr.Length () - length ؛ word = spiLtStr.SubString (موضع - طول wordlength ، الموضع) ؛ } // ابدأ في قطع سلسلة الطول المحدد من الموضع الحالي // word = spiLtStr.SubString (الموضع ، الموضع + WordLength) ؛ // إذا لم يكن هناك سلسلة من القطع في القاموس النعت ، فتجاهل حرفًا أثناء (! map.containskey (كلمة)) {// إذا كانت كلمة واحدة ، فقم بالخروج من الحلقة إذا كانت (word.length () == 1) {// {a a reftion أو number ، قسّم الأحرف أو الأرقام معًا (word.matches (". حلقة مباشرة لإضافة الأحرف المستمرة اللاحقة إذا (LeftToright) {for (int i = spiLtStr.Indexof (word ، position)+1 ؛ i <spiLtStr .length () ؛ i ++) {if (((spiltstr.charat (i)> = '0' spiLtStr. Charat (i) <= z ') || (spiLtStr.charat (i) =' A '&& spiLttr .Charat (i) <=' z ')) } استراحة أخرى ؛ }} آخر {// إذا كانت مطابقة عكسية ، فأضف وأضف الأرقام المستمرة والأحرف الأبجدية قبل الموضع الحالي لـ (int i = spiLtStR.Indexof (word ، الموضع - 1) - 1 ؛ i> = 0 ؛ i--) > = 'A' && spiltstr.charat (i) <= 'z') || (spiLtStr.charat (i) = 'A' && spiLtStr.charat (i) <= 'z')) if (i == 0) {StringBuffer SB = new StringBuffer (word) ؛ word = sb.reverse (). toString () ؛ }} else {// flip operation stringBuffer sb = new StringBuffer (word) ؛ word = sb.reverse (). toString () ؛ استراحة؛ } } } } استراحة؛ } // إذا كانت تطابق أقصى للأمام ، فتجاهل الحرف الأخير إذا كان (LeftToright) word = word.substring (0 ، word.length () - 1) ؛ // خلاف ذلك تجاهل كلمة أخرى كلمة أخرى = word.substring (1) ؛ }. else lightwords.add (word) ؛ // سلاسل معالجة إضافة طول += word.length () ؛ } // إذا كانت تطابق أقصى عكسي ، فقم بضبط السلسلة في الجدول لإعادة توجيهك إذا (! leftToright) {for (int i = rightwords.size ()-1 ؛ i> = 0 ؛ i--) {leftwords.add (rightwords.get (i)) ؛ }} // إرجاع نتائج التقطيع على اليسار ؛ } / ** * تحديد ما إذا كانت المجموعتان متساويتان * * param list1 * set 1 * param list2 * set 2 * return return true إذا كان متساويًا ، وإلا فكل / public boolean isequal (list <string> list1 ، list <string> list2) {if (list1.isempty () if (list1.size ()! = list2.size ()) return false ؛ لـ (int i = 0 ؛ i <list1.size () ؛ i ++) {if (! list1.get (i) .equals (list2.get (i))) return false ؛ } إعادة صواب ؛ } / *: // "Left Snake" قائمة نتائج النعت <string> resultLeft = new ArrayList <String> () ؛ // "Medium Snake" (جزء متباعد) قائمة نتائج النعت <string> resultMiddle = جديد ArrayList <String> () ؛ // قائمة نتائج المشاركة "Right Snake" <String> ResultRight = جديد ArrayList <String> () ؛ // Forward Maximum Maximum Mainting Word Segmentation List <String> left = new ArrayList <String> () ؛ // قائمة نتائج تجزئة الكلمات القصوى العكسية <String> right = new ArrayList <String> () ؛ اليسار = متسكع (inputStr ، صحيح) ؛ /*System.out.println("forward النعت النتيجة: ") ؛ لـ (سلسلة السلسلة: يسار) {system.out.print (string + "/") ؛ } system.out.println ("/n النعت العكسي النتيجة:") ؛ */ يمين = انسكاب (inputStr ، false) ؛ /*for (سلسلة السلسلة: يمين) {system.out.print (string + "/") ؛ } system.out.println ("/ nboth-way word result:") ؛*// // تحديد ما إذا كانت كلمة النعت في كلا الطرفين قد تقاطع في منتصف سلسلة الإدخال. طالما أنه لا يوجد تقاطع ، فإنه يحافظ على حلقات بينما (left.get (0) .length () + right.get (right.size () - 1) .Length () <inputStr .Length ()) {// results of the forward word word passen متساوية ، ثم النتيجة إلى الأمام ستقفز من الحلقة (iSequal (is your ،) استراحة؛ } // إذا كانت نتائج مشاركة الكلمة الأمامية والعكسية مختلفة ، فسيتم أخذ العدد الذي يحتوي على عدد أقل من المشاركين ، وليس هناك حاجة إلى حلقة إذا (left.size ()! = right.size ()) {resultMiddle = left.size () <right.size ()؟ اليسار: اليمين ؛ استراحة؛ } // إذا لم يتم استيفاء الشروط المذكورة أعلاه ، فعليك تنفيذ خوارزمية "الأفعى" // دع "ثعبان الجشع الأيسر" تناول الكلمة الأولى من نتائج النعت النعت الأمامية. // دع "الثعبان الجشع الأيمن" يأكل الكلمة الأخيرة من كلمة عكسية النعت resultright.add (right.get (right.size () - 1)) ؛ // قم بإزالة الكلمات التي يتم تناولها بواسطة "Snake" inputStr = inputStr.SubString (Left.get (0) .Length ()) ؛ inputStr = inputStR.SubString (0 ، inputstr.length () - right.get (right.size () - 1) .Length ()) ؛ // قم بتنظيف نتائج تجزئة الكلمات الإيجابية والعكسية السابقة لمنع تداخل اليسار. clear () ؛ right.clear () ؛ // ابدأ النعت من أجل عدم تأمين السلاسل اليسار = متسكع (InputStr ، True) ؛ يمين = متسكع (inputStr ، false) ؛ }. (left.get (0) .Length () + right.get (right.size () - 1) .Length ()> inputStr .Length ()) resultMiddle = left ؛ // إذا كان التقاطع الأوسط يتقاطع ، فسيأخذ الطعام فقط وليس هناك تداخل: // النعت الأول في الاتجاه الأمامي + طول النعت الأخير في الاتجاه المعاكس = أدخل الطول الكلي للسلسلة ، ثم يمكن توضيح الاتجاه الأمامي والمعاكس إذا (left.get. resultmiddle.add (left.get (0)) ؛ resultmiddle.add (right.get (right.size () - 1)) ؛ } // إضافة نتيجة مشاركة لا لبس فيها إلى النتيجة النهائية لـ (سلسلة السلسلة: resultleft) {result.add (string) ؛ } لـ (سلسلة السلسلة: resultMiddle) {result.add (string) ؛ } // يجب تعديل النعت المخزنة في "الثعبان الجشع الأيمن" إلى الأمام (int i = resultright.size ()-1 ؛ i> = 0 ؛ i--) {result.add (resultright.get (i)) ؛ } نتيجة الإرجاع ؛ } / ** * قسّم الفقرة إلى عدة جمل وأداء تجزئة الكلمات بشكل منفصل * * param inputStr * يتم تقسيم فقرة * @REGRERN النتيجة في هذه الفقرة * / القائمة العامة <string> النتائج (String inputStr) {// المستخدمة لتخزين قائمة نتائج تجزئة الكلمات الأخيرة <string> result = new Artlistist <string> () ؛ // إذا تمت مواجهة علامات الترقيم ، فسيتم تقسيمها إلى عدة جمل regex = "[،. ؛!؟]" ؛ String [] st = inputstr.split (regex) ؛ // أضف نتيجة النعت لكل جملة إلى نتيجة النعت النهائية لـ (stri stri: st) {list <string> list = resultword (stri) ؛ النتيجة. addall (قائمة) ؛ } نتيجة الإرجاع ؛ } public static void main (string [] args) {// مثال: تعال ومعرفة ما إذا كان سعر المنزل مكلفًا؟ إدخال الماسح الضوئي للمزاد التنس TABLE = ماسح ضوئي جديد (System.in) ؛ String str = input.nextLine () ؛ Wordpilt WordsPilt = null ؛ جرب {wordspilt = new WordsPilt () ؛ } catch (ioException e) {E.PrintStackTrace () ؛ } قائمة <String> list = wordspilt.resultword (str) ؛ لـ (سلسلة السلسلة: قائمة) {system.out.print (string + "/") ؛ }}}src/dict.txt هو ملف قاموس ، والإعدادات هي كما يلي:
مرحبًا بكم في Wulin.com Script Download Trans Tutorial Material Download
نتائج التشغيل كما يلي:
لمزيد من المعلومات حول خوارزميات Java ، يمكن للقراء المهتمين بهذا الموقع عرض الموضوعات: "بنية بيانات Java وبرنامج تعليمي الخوارزمية" ، "ملخص" Tips Java ".
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.