פיתוח סיווג טקסט נאיבי של Bayes ב-JAVA PlatoBlockchain Data Intelligence. חיפוש אנכי. איי.

פיתוח סיווג טקסטים Naive Bayes ב- JAVA

במאמרים קודמים דנו ברקע התיאורטי של סיווג טקסטים של Naive Bayes וחשיבות השימוש טכניקות בחירת תכונות בסיווג טקסט. במאמר זה, אנו הולכים להרכיב הכל ולבנות יישום פשוט של אלגוריתם סיווג הטקסט Naive Bayes ב- JAVA. קוד המסווג הוא ממקור פתוח (ברישיון GPL v3) וניתן להוריד אותו מ GitHub.

עדכון: מסגרת הלמידה על מכונה של Datumbox היא כעת קוד פתוח וחינמית ל- להורדה. עיין בחבילה com.datumbox.framework.machinelearning.classification כדי לראות את היישום של Naive Bayes Classifier ב- Java.

יישום Java Naive Bayes

הקוד כתוב ב- JAVA וניתן להוריד אותו ישירות מ- GitHub. הוא מורשה תחת GPLv3 אז אל תהסס להשתמש בו, לשנות אותו ולהפיץ אותו בחופשיות.

מסווג הטקסט מיישם את ה- בייס מולטי-נאומי דגם יחד עם בחירת תכונת Chisquare אַלגוֹרִיתְם. כל הפרטים התיאורטיים של אופן עבודת שתי הטכניקות מכוסים במאמרים קודמים והערות Javadoc מפורטות ניתן למצוא בקוד המקור המתאר את היישום. לפיכך בקטע זה אתמקד בתיאור ברמה גבוהה של הארכיטקטורה של המסווג.

1. כיתת NaiveBayes

זהו החלק העיקרי של מסווג הטקסט. זה מיישם שיטות כמו רכבת () וחיזוי () שאחראים על אימון מסווג והשימוש בו לתחזיות. יש לציין כי שיעור זה אחראי גם על קריאת השיטות החיצוניות המתאימות לעיבוד מראש ולסימון המסמך לפני אימון / חיזוי.

2. אובייקט NaiveBayesKnowledgeBase

תפוקת האימונים היא אובייקט NaiveBayesKnowledgeBase המאחסן את כל המידע וההסתברויות הדרושים המשמשים את סיווג Naive Bayes.

3. אובייקט מסמך

גם ההדרכה וגם טקסטי החיזוי ביישום מאוחסנים באופן פנימי כאובייקטים של מסמכים. אובייקט המסמך שומר את כל האסימונים (מילים) של המסמך, הנתונים הסטטיסטיים שלהם וסיווג היעד של המסמך.

4. אובייקט FeatureStats

אובייקט FeatureStats מאחסן כמה נתונים סטטיסטיים שנוצרים בשלב חילוץ תכונות. נתונים סטטיסטיים כאלה הם ספירות המשותפות של התכונות והכיתה (מהן אומדן ההסתברויות והסבירות המשותפות), ספירות הכיתות (מהן נבדקות הקודמות אם לא ניתנות כקלט) ומספר התצפיות הכולל המשמש לאימונים.

5. תכונה חילוץ תכונה

זה הכיתה שאחראית על ביצוע מיצוי תכונות. יש לציין כי מכיוון שכיתה זו מחשבת פנימית כמה מהנתונים הסטטיסטיים הנדרשים בפועל על ידי אלגוריתם הסיווג בשלב המאוחר יותר, כל הנתונים הסטטיסטיים הללו נשמרים במטמון ומחזירים אותם באובייקט FeatureStats כדי להימנע מחישובם מחדש.

6. כיתת TextTokenizer

זה פשוט מחלקת אסימון טקסטים, האחראית על עיבוד מוקדם, ניקוי וסימון הטקסטים המקוריים והמרתם לאובייקטים של מסמך.

שימוש במחלקת JAVA של NaiveBayes

בשיעור NaiveBayesExample תוכלו למצוא דוגמאות לשימוש בכיתה NaiveBayes. מטרת קוד הדגימה היא להציג דוגמא המכשירה מסווג Naive Bayes פשוט על מנת לאתר את שפת הטקסט. כדי להכשיר את המסווג, בתחילה אנו מספקים את הנתיבים של מערכי הנתונים האימוניים ב- 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();

לבסוף להשתמש בסווג ולחזות את מחלקות הדוגמאות החדשות כל שעליך לעשות הוא לאתחל מסווג חדש על ידי העברת אובייקט NaiveBayesKnowledgeBase שרכשת קודם לכן על ידי הכשרה. ואז על ידי קריאה פשוט לשיטת החיזוי () תקבל את המחלקה החזויה של המסמך.

   //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-gram. כך ניתן ליישם אלגוריתם חילוץ טקסט מתוחכם יותר על ידי עדכון שיטת TextTokenizer.extractKeywords () או שימוש בשיטת Datumbox. ממשק API לחילוץ מילות מפתח פונקציה להשיג את כל ה- n-gram (שילובי מילות מפתח) של המסמך.

2. עיבוד טקסט מראש:

לפני השימוש בסיווג בדרך כלל יש צורך לעבד את המסמך מראש כדי להסיר תווים / חלקים מיותרים. למרות שהיישום הנוכחי מבצע עיבוד מוקדם מוגבל באמצעות שיטת TextTokenizer.preprocess (), כשמדובר בניתוח דפי HTML הדברים הופכים להיות מסובכים יותר. אפשר פשוט לקצץ את תגי ה- HTML ולשמור רק את הטקסט הפשוט של המסמך או להשתמש בטכניקות למידה מתוחכמות יותר של מכונות המאתרות את הטקסט הראשי של הדף ומסיר תוכן ששייך לכותרת עליונה, כותרות, תפריטים וכו '. יכול להשתמש ב- Datumbox ממשק API לחילוץ טקסט פונקציה.

3. דגמים נוספים של Naive Bayes:

המסווג הנוכחי מיישם את המסווג Multinomial Naive Bayes, בכל זאת כפי שדיברנו במאמר קודם בנושא ניתוח הסנטימנט, בעיות סיווג שונות דורשות דגמים שונים. בחלקם גרסה בינארית של האלגוריתם תהיה מתאימה יותר, ואילו באחרים מודל ברנולי יספק תוצאות טובות בהרבה. השתמש ביישום זה כנקודת התחלה ופעל לפי הוראות ה- הדרכה של Naive Bayes כדי להרחיב את הדגם.

4. שיטות בחירת תכונות נוספות:

יישום זה משתמש באלגוריתם בחירת התכונות של Chisquare כדי לבחור את התכונות המתאימות ביותר לסיווג. כפי שראינו במאמר קודם, הסעיף בחירת תכונות Chisquare שיטה היא טכניקה טובה אשר ממסרת נתונים סטטיסטיים לבחירת התכונות המתאימות, עם זאת היא נוטה לתת ציונים גבוהים יותר על תכונות נדירות המופיעות רק באחת מהקטגוריות. ניתן לבצע שיפורים בהסרת תכונות רועשות / נדירות לפני שממשיכים לבחירת התכונות או על ידי יישום שיטות נוספות כמו המידע ההדדי שדיברנו עליו במאמר הנ"ל.

5. מיטוב ביצועים:

ביישום המסוים היה חשוב לשפר את הקריאות של הקוד ולא לבצע מיקרו-אופטימיזציות בקוד. למרות העובדה כי אופטימיזציות כאלה הופכות את הקוד ליותר מכוער וקשה לקריאה / תחזוקה, לעיתים קרובות הן נחוצות מכיוון שלולאות רבות באלגוריתם זה מבוצעות מיליוני פעמים במהלך אימונים ובדיקות. יישום זה יכול להיות נקודת התחלה מצוינת לפיתוח גרסה מכוונת משלך.

כמעט שם ... הערות אחרונות!

שמעתי-הס-טוב-בקידוד-לכדי להבין טוב את האופן שבו יישום זה עובד מומלץ מאוד לקרוא את שני המאמרים הקודמים אודות סיווג בייבס Naive ו בחירת תכונה. תקבלו תובנות על הרקע התיאורטי של השיטות וזה יבהיר חלקים מאלגוריתם / קוד.

נציין כי Naive Bayes למרות היותה קלה, מהירה וברוב הפעמים "די מדויקת", היא גם "Naive" מכיוון שהיא מניחה את ההנחה של עצמאות מותנית של התכונות. מכיוון שהנחה זו כמעט ולא נפגשה בבעיות סיווג טקסט, Naive Bayes היא כמעט אף פעם לא המסווגת עם הביצועים הטובים ביותר. ב ממשק API של Datumbox, הרחבות מסוימות של הסיווג הרגיל של Naive Bayes משמשות רק לבעיות פשוטות כמו זיהוי שפות. לקבלת בעיות סיווג טקסט מסובכות יותר טכניקות מתקדמות יותר כגון מסווג מקסימום אנטרופי נחוצים.

אם אתה משתמש ביישום בפרויקט מעניין תפיל לנו קו ואנחנו נציג את הפרויקט שלך בבלוג שלנו. כמו כן אם אתם אוהבים את המאמר אנא קחו רגע ושתפו אותו בטוויטר או בפייסבוק. 🙂

בול זמן:

עוד מ דטומבוקס