การพัฒนาตัวแยกประเภทข้อความ Naive Bayes ใน JAVA PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

การพัฒนาตัวจำแนกข้อความ Naive Bayes ในJAVA

ในบทความก่อนหน้านี้ เราได้กล่าวถึงภูมิหลังทางทฤษฎีของ ตัวแยกข้อความ Naive Bayes และความสำคัญของการใช้ เทคนิคการเลือกคุณสมบัติ ในการจำแนกข้อความ ในบทความนี้ เราจะนำทุกอย่างมารวมกันและสร้างการใช้งานอย่างง่ายของอัลกอริธึมการจัดหมวดหมู่ข้อความ Naive Bayes ใน JAVA รหัสของตัวแยกประเภทเป็นโอเพ่นซอร์ส (ภายใต้ลิขสิทธิ์ GPL v3) และคุณสามารถดาวน์โหลดได้จาก Github.

อัปเดต: ขณะนี้ Datumbox Machine Learning Framework เป็นโอเพ่นซอร์สและฟรีสำหรับ ดาวน์โหลด. ตรวจสอบแพ็คเกจ com.datumbox.framework.machinelearning.classification เพื่อดูการใช้งาน Naive Bayes Classifier ใน Java

การใช้งาน Naive Bayes Java

รหัสนี้เขียนด้วย JAVA และสามารถดาวน์โหลดได้โดยตรงจาก Github. ได้รับอนุญาตภายใต้ GPLv3 ดังนั้นอย่าลังเลที่จะใช้ แก้ไข และแจกจ่ายซ้ำได้อย่างอิสระ

ตัวแยกประเภทข้อความใช้ พหุนาม Naive Bayes รุ่นพร้อมกับ การเลือกคุณสมบัติ Chisquare อัลกอริทึม รายละเอียดทางทฤษฎีทั้งหมดเกี่ยวกับวิธีการทำงานของเทคนิคทั้งสองนั้นมีอยู่ในบทความก่อนหน้านี้และความคิดเห็นของ javadoc โดยละเอียดสามารถดูได้ที่ซอร์สโค้ดที่อธิบายการใช้งาน ดังนั้น ในส่วนนี้ ผมจะเน้นที่คำอธิบายระดับสูงของสถาปัตยกรรมของตัวแยกประเภท

1. คลาส NaiveBayes

นี่คือส่วนหลักของตัวแยกประเภทข้อความ มันใช้วิธีการเช่น train() และทำนาย () ซึ่งรับผิดชอบการฝึกอบรมตัวแยกประเภทและใช้เพื่อทำนาย ควรสังเกตว่าคลาสนี้มีหน้าที่เรียกใช้เมธอดภายนอกที่เหมาะสมเพื่อประมวลผลล่วงหน้าและแปลงเอกสารเป็นโทเค็นก่อนการฝึกอบรม/การทำนาย

2. ออบเจ็กต์ NaiveBayesKnowledgeBase

ผลลัพธ์ของการฝึกอบรมคือ NaiveBayesKnowledgeBase Object ซึ่งเก็บข้อมูลที่จำเป็นทั้งหมดและความน่าจะเป็นที่ใช้โดย Naive Bayes Classifier

3. วัตถุเอกสาร

ทั้งข้อความการฝึกอบรมและการทำนายในการใช้งานจะถูกเก็บไว้ภายในเป็นวัตถุเอกสาร Document Object เก็บโทเค็น (คำ) ทั้งหมดของเอกสาร สถิติ และการจัดประเภทเป้าหมายของเอกสาร

4. คุณสมบัติสถิติวัตถุ

ออบเจ็กต์ FeatureStats เก็บสถิติต่างๆ ที่สร้างขึ้นระหว่างเฟสการแยกคุณลักษณะ สถิติดังกล่าวเป็นการนับร่วมของคุณสมบัติและคลาส (ซึ่งเป็นการประเมินความน่าจะเป็นและความน่าจะเป็นร่วมกัน) จำนวนคลาส (จากที่นักบวชจะได้รับการประเมินหากไม่มีการระบุเป็นข้อมูลเข้า) และจำนวนการสังเกตทั้งหมดที่ใช้สำหรับการฝึกอบรม

5. คลาสการแยกคุณลักษณะ

นี่คือคลาสที่รับผิดชอบการแยกคุณลักษณะ ควรสังเกตว่าเนื่องจากคลาสนี้คำนวณสถิติภายในหลายรายการซึ่งจำเป็นจริงๆ โดยอัลกอริทึมการจัดหมวดหมู่ในระยะหลังๆ สถิติทั้งหมดเหล่านี้จะถูกแคชและส่งคืนในอ็อบเจ็กต์ FeatureStats เพื่อหลีกเลี่ยงการคำนวณใหม่

6. คลาส TextTokenizer

มันคือ ง่าย คลาส tokenization ของข้อความ รับผิดชอบในการประมวลผลล่วงหน้า เคลียร์ และแปลงข้อความต้นฉบับเป็นโทเค็น และแปลงเป็นออบเจ็กต์เอกสาร

การใช้คลาส NaiveBayes JAVA

ในคลาส NaiveBayesExample คุณจะพบตัวอย่างการใช้คลาส NaiveBayes เป้าหมายของโค้ดตัวอย่างคือการนำเสนอตัวอย่างที่ฝึก Naive Bayes Classifier อย่างง่าย เพื่อตรวจหาภาษาของข้อความ ในการฝึกลักษณนาม เราจะจัดเตรียมพาธของชุดข้อมูลการฝึกอบรมใน HashMap จากนั้นจึงโหลดเนื้อหา

   //map of dataset files
   Map<String, URL> trainingFiles = new HashMap<>();
   trainingFiles.put("English", NaiveBayesExample.class.getResource("/datasets/training.language.en.txt"));
   trainingFiles.put("French", NaiveBayesExample.class.getResource("/datasets/training.language.fr.txt"));
   trainingFiles.put("German", NaiveBayesExample.class.getResource("/datasets/training.language.de.txt"));

   //loading examples in memory
   Map<String, String[]> trainingExamples = new HashMap<>();
   for(Map.Entry<String, URL> entry : trainingFiles.entrySet()) {
      trainingExamples.put(entry.getKey(), readLines(entry.getValue()));
   }

ตัวแยกประเภท NaiveBayes ได้รับการฝึกอบรมโดยส่งข้อมูลไปให้ เมื่อการฝึกอบรมเสร็จสิ้น วัตถุ NaiveBayesKnowledgeBase จะถูกเก็บไว้เพื่อใช้ในภายหลัง

   //train classifier
   NaiveBayes nb = new NaiveBayes();
   nb.setChisquareCriticalValue(6.63); //0.01 pvalue
   nb.train(trainingExamples);
      
   //get trained classifier
   NaiveBayesKnowledgeBase knowledgeBase = nb.getKnowledgeBase();

สุดท้ายในการใช้ classifier และทำนายคลาสของตัวอย่างใหม่ สิ่งที่คุณต้องทำคือเริ่มต้น classifier ใหม่โดยส่ง NaiveBayesKnowledgeBase Object ที่คุณได้รับมาก่อนหน้านี้โดยการฝึกอบรม จากนั้นเพียงเรียกเมธอดทำนาย () คุณจะได้คลาสที่คาดการณ์ของเอกสาร

   //Test classifier
   nb = new NaiveBayes(knowledgeBase);
   String exampleEn = "I am English";
   String outputEn = nb.predict(exampleEn);
   System.out.format("The sentense "%s" was classified as "%s".%n", exampleEn, outputEn);   

การขยายที่จำเป็น

การใช้งาน JAVA โดยเฉพาะไม่ควรพิจารณาว่าเป็นโซลูชันที่พร้อมใช้งานอย่างสมบูรณ์สำหรับปัญหาการจำแนกข้อความที่ซับซ้อน นี่คือการขยายที่สำคัญบางส่วนที่สามารถทำได้:

1. การแยกคำหลัก:

แม้ว่าการใช้คำหลักคำเดียวอาจเพียงพอสำหรับปัญหาง่ายๆ เช่น การตรวจหาภาษา แต่ปัญหาที่ซับซ้อนกว่าอื่นๆ ก็ต้องการการแยก n-grams ดังนั้น เราสามารถใช้อัลกอริธึมการแยกข้อความที่ซับซ้อนยิ่งขึ้นได้โดยอัปเดตเมธอด TextTokenizer.extractKeywords() หรือใช้ Datumbox API การแยกคำหลัก ฟังก์ชันเพื่อรับ n-grams ทั้งหมด (การรวมคีย์เวิร์ด) ของเอกสาร

2. การประมวลผลข้อความล่วงหน้า:

ก่อนใช้ตัวแยกประเภทมักจะจำเป็นต้องประมวลผลเอกสารล่วงหน้าเพื่อลบอักขระ/ส่วนที่ไม่จำเป็นออก แม้ว่าการใช้งานในปัจจุบันจะทำการประมวลผลล่วงหน้าอย่างจำกัดโดยใช้เมธอด TextTokenizer.preprocess() แต่เมื่อต้องวิเคราะห์หน้า HTML สิ่งต่างๆ กลับกลายเป็นเรื่องยากขึ้น คุณสามารถตัดแท็ก HTML ออกและเก็บเฉพาะข้อความธรรมดาของเอกสารหรือหันไปใช้เทคนิคการเรียนรู้ของเครื่องที่ซับซ้อนมากขึ้น ซึ่งจะตรวจจับข้อความหลักของหน้าและลบเนื้อหาที่เป็นของส่วนท้าย ส่วนหัว เมนู ฯลฯ สำหรับภายหลัง สามารถใช้ Datumbox's . ได้ การแยกข้อความ API ฟังก์ชัน

3. โมเดล Naive Bayes เพิ่มเติม:

ตัวแยกประเภทปัจจุบันใช้ตัวแยกประเภท Multinomial Naive Bayes อย่างไรก็ตามดังที่เราได้กล่าวถึงในบทความก่อนหน้านี้เกี่ยวกับ การวิเคราะห์ความเชื่อมั่นปัญหาการจำแนกประเภทที่แตกต่างกันต้องใช้แบบจำลองที่แตกต่างกัน ในอัลกอริธึมรุ่น Binarized บางรุ่นจะเหมาะสมกว่า ในขณะที่รุ่นอื่นๆ ของ Bernoulli Model จะให้ผลลัพธ์ที่ดีกว่ามาก ใช้การดำเนินการนี้เป็นจุดเริ่มต้นและปฏิบัติตามคำแนะนำของ การสอนแบบไร้เดียงสา เพื่อขยายโมเดล

4. วิธีการเลือกคุณสมบัติเพิ่มเติม:

การใช้งานนี้ใช้อัลกอริธึมการเลือกคุณสมบัติของ Chisquare เพื่อเลือกคุณสมบัติที่เหมาะสมที่สุดสำหรับการจัดประเภท ดังที่เราเห็นในบทความที่แล้ว การเลือกคุณสมบัติของ Chisquare วิธีเป็นเทคนิคที่ดีที่ถ่ายทอดสถิติเพื่อเลือกคุณลักษณะที่เหมาะสม อย่างไรก็ตาม มีแนวโน้มที่จะให้คะแนนคุณลักษณะหายากที่ปรากฏในหมวดหมู่เดียวเท่านั้น สามารถทำการปรับปรุงเพื่อลบคุณสมบัติที่รบกวน/หายากได้ก่อนที่จะดำเนินการเลือกคุณสมบัติหรือโดยการใช้วิธีการเพิ่มเติม เช่น ข้อมูลรวมที่เรากล่าวถึงในบทความดังกล่าว

5. การเพิ่มประสิทธิภาพการทำงาน:

ในการใช้งานเฉพาะ สิ่งสำคัญคือต้องปรับปรุงความสามารถในการอ่านโค้ด แทนที่จะดำเนินการปรับให้เหมาะสมระดับไมโครในโค้ด แม้ว่าการเพิ่มประสิทธิภาพดังกล่าวจะทำให้โค้ดดูน่าเกลียดและอ่าน/บำรุงรักษายากขึ้น แต่ก็มักจะมีความจำเป็นเนื่องจากลูปจำนวนมากในอัลกอริธึมนี้ถูกดำเนินการหลายล้านครั้งในระหว่างการฝึกอบรมและการทดสอบ การใช้งานนี้สามารถเป็นจุดเริ่มต้นที่ดีสำหรับการพัฒนาเวอร์ชันที่คุณปรับแต่งเอง

ใกล้จะถึงแล้ว... Final Notes!

ฉันได้ยินมาว่าเขาเก่งในการเข้ารหัส-lเพื่อให้เข้าใจถึงวิธีการใช้งานนี้ เราขอแนะนำให้คุณอ่านบทความก่อนหน้าสองบทความเกี่ยวกับ Naive Bayes ลักษณนาม และ การเลือกคุณสมบัติ. คุณจะได้รับข้อมูลเชิงลึกเกี่ยวกับภูมิหลังทางทฤษฎีของวิธีการต่างๆ และจะทำให้ส่วนต่างๆ ของอัลกอริทึม/โค้ดมีความชัดเจนขึ้น

เราควรสังเกตว่า Naive Bayes แม้จะเป็นเรื่องง่าย รวดเร็ว และส่วนใหญ่ "ค่อนข้างแม่นยำ" แต่ก็เป็น "ไร้เดียงสา" ด้วยเช่นกัน เพราะมันทำให้สมมติฐานของความเป็นอิสระตามเงื่อนไขของคุณลักษณะต่างๆ เนื่องจากข้อสันนิษฐานนี้แทบจะไม่เคยพบในปัญหาการจัดประเภทข้อความเลย Naive Bayes แทบจะไม่เคยเป็นตัวแยกประเภทที่มีประสิทธิภาพดีที่สุดเลย ใน API กล่องข้อมูลส่วนขยายบางตัวของตัวแยกประเภท Naive Bayes มาตรฐานใช้สำหรับปัญหาง่ายๆ เช่น การตรวจหาภาษาเท่านั้น สำหรับปัญหาการจัดประเภทข้อความที่ซับซ้อนมากขึ้น เทคนิคขั้นสูงเช่น ลักษณนามเอนโทรปีสูงสุด มีความจำเป็น

หากคุณใช้การดำเนินการในโครงการที่น่าสนใจ วางสายเราไว้ และเราจะนำเสนอโครงการของคุณในบล็อกของเรา นอกจากนี้ หากคุณชอบบทความนี้ โปรดสละเวลาสักครู่แล้วแชร์บน Twitter หรือ Facebook 🙂

ประทับเวลา:

เพิ่มเติมจาก กล่องข้อมูล