อัลกอริทึมของ Nagao ใช้เพื่อนับความถี่ของแต่ละ sub -string จากนั้นขึ้นอยู่กับสถิติความถี่เหล่านี้ความถี่คำ, จำนวนเพื่อนบ้านของแต่ละสตริง, เอนโทรปีซ้ายและขวาและข้อมูลเชิงโต้ตอบ (การควบแน่นภายใน) ของ แต่ละสตริง
คำนามคำอธิบาย:
อัลกอริทึม Nagao: ข้อความทางสถิติที่รวดเร็วของอัลกอริทึมความถี่ย่อยทั้งหมดในข้อความ อัลกอริทึมโดยละเอียดสามารถมองเห็นได้ http://www.doc88.com/p-664123446503.html
ความถี่คำ: จำนวนครั้งที่สตริงปรากฏในเอกสาร ยิ่งมีจำนวนครั้งมากเท่าไหร่ก็ยิ่งสำคัญมากเท่านั้น
จำนวนเพื่อนบ้านทางซ้ายและขวา: จำนวนอักขระที่แตกต่างกันทางซ้ายและขวาของสตริงในเอกสาร ยิ่งเพื่อนบ้านทางซ้ายและขวามากเท่าไหร่ความน่าจะเป็นของสตริงคำก็จะยิ่งสูงขึ้นเท่านั้น
เอนโทรปีซ้ายและขวา: จำนวนอักขระทางซ้ายและขวาของสตริงในเอกสารกระจายจำนวนอักขระในอักขระที่แตกต่างกัน คล้ายกับตัวบ่งชี้ข้างต้นมีความแตกต่างบางประการ
ข้อมูลเชิงโต้ตอบ: แต่ละครั้งที่สตริงแบ่งออกเป็นสองส่วนครึ่งซ้ายของสตริงและครึ่งขวาของสตริงคำนวณความน่าจะเป็นที่ปรากฏในเวลาเดียวกันยกเว้นความน่าจะเป็นของความเป็นอิสระที่เกี่ยวข้องและในที่สุดก็ใช้เวลา ความน่าจะเป็นขั้นต่ำในทุกแผนก ยิ่งค่านี้มีขนาดใหญ่เท่าใดการควบแน่นของสตริงก็ยิ่งมีโอกาสมากขึ้นเท่านั้น
กระบวนการเฉพาะของอัลกอริทึม:
1. อ่านไฟล์อินพุตทีละตัวตามอักขระที่ไม่ใช่จีน ([^/u4e00-/u9fa5]+) และหยุดคำว่า "และไม่พูดหลังจากที่คุณไป"
แบ่งออกเป็นสตริงรหัสมีดังนี้:
สตริง [] วลี = line.split ("[^/u4e00-/u9fa5]+| ["+stopwords+"]);
คำหยุดสามารถแก้ไขได้
2. รับเสียบไม้ซอกซ้ายและขวาของสตริงตัดทั้งหมดเพิ่ม ptables ซ้ายและขวาตามลำดับ
3. เรียงลำดับ ptable และคำนวณ ltable บันทึก ltable ที่ใน ptable ที่เรียงลำดับย่อยต่อไป -สเควร์มีจำนวนอักขระเดียวกันกับอักขระเดียวกันเท่ากันกับอักขระเดียวกัน
4. การเดินทางผ่าน ptable และ ltable คุณสามารถรับคำที่พบบ่อยของ sub -string ทั้งหมด, เพื่อนบ้าน
5. ตามความถี่ของสตริงคำเพื่อนบ้านซ้ายและขวา, ความถี่คำ, จำนวนเพื่อนบ้าน, เอนโทรปีซ้ายและขวาและข้อมูลเชิงโต้ตอบของสตริงเอาต์พุต
1. Nagaoalgorithm.java
com.algo.word; arraylist; Public Class Nagaoalgorithm {INT INT N; ดีมาก? );} // วลีย้อนกลับสตริงส่วนตัวย้อนกลับ (วลีสตริง) {stringbuilder reversephrase = new StringBuilder (); ); ความยาว (), s2.length ()); // บัญชีแยกสายไปยังสตริงอักขระจีนติดต่อกัน [] วลี = line.split ("[^/u4e00-/u9fa5]+| ["+stopwords+"" "); สำหรับ (สตริง e: วลี) {สำหรับ (int (int i = 0; ++) leftptable .add (reversephrase.substring (i)); int i = 1; .Size ()]; เรียงลำดับ ptable และนับซ้ายและขวา ltable "); t ผลทางสถิติ: TF, การกระจายเพื่อนบ้านโมฆะส่วนตัว Countfneighbor () () {// รับ tf และเพื่อนบ้านที่ถูกต้องสำหรับ (int pindex = 0; pindex <Rightptable.size () ; = วลี SubString (0, ความยาว); hbor.incrementtf (); .length; charat (ความยาว));} else break;} wordtfneighbor.put (word, tfneighbor);}} // รับเพื่อนบ้านซ้ายสำหรับ (int pindex = 0; pindex <leftptable.size (); pindex ++) leftptable.get (pindex); ความยาว); .length; ;} else break;}} system.out.println ("ข้อมูล: [อัลกอริทึม Nagao ขั้นตอนที่ 3]]: นับ tf และเพื่อนบ้าน");} // ตาม Wordtfneighbor, นับ mi ของคำส่วนตัว countmi (คำสตริง) {ถ้า (word.length () <= 1) ส่งคืน 0; สำหรับ (int pos = 1; pos <word.length (); leftpart) .gettf ()/wordnumber; บันทึก tf, (ซ้ายและขวา) หมายเลขเพื่อนบ้าน, เอนโทรปีเพื่อนบ้าน, ข้อมูลร่วมกันเป็นโมฆะส่วนตัวสตริงออก, สตริง stoplist, สตริง [] threshold) {ลอง {// อ่านชุดคำหยุดคำศัพท์ <strong> stopwords = new hashset <string> ( ); , mi bufferedWriter bw = new bufferedWriter (ใหม่ fileWriter (owriter (owriter (o ut); สำหรับ (แผนที่. ntry <string, tfneighbor> รายการ: wordtfneighbor.entryset ()) {if (entry.getKey (). ความยาว () <) < 1 || คำว่า stopprens.contains (entry.getKey ())) tfneighbor tfneighbor = รายการ ); .ParseInt (Threshold [3]) {) {) {) {) {) {) {) {) {) {StringBuilder SB = ใหม่สตริง Builder (); ",") "). ผนวก (mi) .appnd ("/n "); bw.write (sb.toString ());}}} bw.close ();} catch (ioexception e) {โยน runtimeException ใหม่ (e); } system.out.println ("ข้อมูล: [อัลกอริทึม Nagao ขั้นตอนที่ 4]: บันทึกไว้ในไฟล์"); ขั้นตอนที่ 1: เพิ่มวลีลงในสายสตริง ptable; nagao.addtoptable (บรรทัด);} br.close ();} catch (ioexception e) {โยน runtimeException ใหม่ ();}}}} tln ("ข้อมูล: [[[[[[[Nagao Algorithm ขั้นตอนที่ 1]: เพิ่มส่วนย่อยซ้ายและขวาทั้งหมดลงใน ptable "); // ขั้นตอนที่ 2: เรียงลำดับ ptable และนับ ltable nagao.countltapable (); // ขั้นตอนที่ 3: cou nt tf และเพื่อนบ้าน nagao.counttfneighbor (); // ขั้นตอนที่ 4: บันทึก tf เพื่อนบ้าน mi nagao.savetfneighborinfomi (ออก, stoplist, "20,3,3,5" .split (","); uts, uts out, string stoplist, int n, ไฟล์สตริง) {nagaoalgorithm nagao = ใหม่ nagaoalgorithm (); .setn (n); สตริง [] threshold = filter.split (",", "); h! = 4) {system.out. println (" ข้อผิดพลาด: ตัวกรองต้องมี 4 หมายเลข ; return;} // ขั้นตอนที่ 1: เพิ่มวลีไปยังสายสตริง ptable; . "); // ขั้นตอนที่ 2: เรียงลำดับ ptable และนับ ltable ao.countltable (); // ขั้นตอนที่ 3: นับ tf และเพื่อนบ้าน nagao.counttfneighbor (); // step4: บันทึก tf เพื่อนบ้านและ mi nagao.savetfneighborinfomi threshold);} e โมฆะ setn (int n) {n = n;} โมฆะคงที่สาธารณะหลัก (สตริง [] args) {string [] ins = {"e: //test/ganfen.txt"}; , "e: //test/out.txt", "e: // test /// stoplist.txt");}}
2. tfneighbor.java
com.algo.word; {leftneighbor = new hashmap <ตัวละคร, จำนวนเต็ม> (); + leftneighbor.getordefault (Word, 0)); {//rightneighbor.put (Word, 1 + Rightneighbor.getonterfault (Word, 0)); } // การเพิ่มขึ้นของโมฆะสาธารณะที่เพิ่มขึ้น tf () {tf ++;} สาธารณะ int getlefleneighbornumber () {return leftneighbor.size (); = 0; Public Double GetRightneighborentropy () {double entropy = 0; ) กลับ 0;
3. Main.java
แพ็คเกจ com.algo.word; แยกด้วย ',', เช่น belw: // word, ความถี่คำ, หมายเลขเพื่อนบ้านซ้าย, หมายเลขเพื่อนบ้านขวา, เอนโทรปีเพื่อนบ้านซ้าย, เอนโทรปีเพื่อนบ้านขวา, ormation inf mutual // อาร์กิวเมนต์ที่สามคือรายการหยุดคำถ้า (args.length == 3) Nagaoalgorithm.applynagao (args [0] .split (","), args [1], args [2]); ค่าเริ่มต้นคือ "20,3,3,5" // เอาท์พุท tf> 20 && (ซ้าย | ขวา) หมายเลขเพื่อนบ้าน> 3 && mi> 5 else ถ้า (args.length == 5) .split (","), args [1], args [2], integer.parseint (args [3]), args [4]);}}}}
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้