Ανάπτυξη ενός Naive Bayes Text Classifier στο JAVA PlatoBlockchain Data Intelligence. Κάθετη αναζήτηση. Ολα συμπεριλαμβάνονται.

Ανάπτυξη ενός ταξινομητή κειμένου 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, οπότε μη διστάσετε να το χρησιμοποιήσετε, να το τροποποιήσετε και να το αναδιανείμετε ελεύθερα.

Το Text Classifier εφαρμόζει το Πολυεθνικές Naive Bayes μοντέλο μαζί με το Επιλογή χαρακτηριστικών Chisquare αλγόριθμος. Όλες οι θεωρητικές λεπτομέρειες για το πώς λειτουργούν και οι δύο τεχνικές καλύπτονται σε προηγούμενα άρθρα και λεπτομερή σχόλια javadoc μπορείτε να βρείτε στον πηγαίο κώδικα που περιγράφει την εφαρμογή. Έτσι σε αυτό το τμήμα θα επικεντρωθώ σε μια υψηλού επιπέδου περιγραφή της αρχιτεκτονικής του ταξινομητή.

1. Κατηγορία NaiveBayes

Αυτό είναι το κύριο μέρος του Class Classifier. Υλοποιεί μεθόδους όπως το τρένο () και προβλέπει () οι οποίες είναι υπεύθυνες για την εκπαίδευση ενός ταξινομητή και τη χρήση του για προβλέψεις. Θα πρέπει να σημειωθεί ότι αυτή η τάξη είναι επίσης υπεύθυνη για την κλήση των κατάλληλων εξωτερικών μεθόδων για την προεπεξεργασία και την κωδικοποίηση του εγγράφου πριν από την εκπαίδευση / πρόβλεψη.

2. Αντικείμενο NaiveBayesKnowledgeBase

Το αποτέλεσμα της εκπαίδευσης είναι ένα αντικείμενο NaiveBayesKnowledgeBase που αποθηκεύει όλες τις απαραίτητες πληροφορίες και πιθανότητες που χρησιμοποιούνται από τον ταξινομητή Naive Bayes.

3. Αντικείμενο εγγράφου

Τόσο τα εκπαιδευτικά κείμενα όσο και τα κείμενα πρόβλεψης στην εφαρμογή αποθηκεύονται εσωτερικά ως Έγγραφα Αντικείμενα. Το αντικείμενο εγγράφου αποθηκεύει όλα τα διακριτικά (λέξεις) του εγγράφου, τα στατιστικά τους και την στοχευμένη ταξινόμηση του εγγράφου.

4. Αντικείμενο FeatureStats

Το αντικείμενο FeatureStats αποθηκεύει πολλά στατιστικά στοιχεία που δημιουργούνται κατά τη φάση εξαγωγής δυνατοτήτων. Τέτοιες στατιστικές είναι οι κοινές μετρήσεις χαρακτηριστικών και κλάσης (από τις οποίες υπολογίζονται οι πιθανότητες και οι πιθανότητες από κοινού), οι μετρήσεις κλάσης (από τις οποίες αξιολογούνται τα προηγούμενα εάν δεν παρέχονται ως είσοδος) και ο συνολικός αριθμός παρατηρήσεων που χρησιμοποιήθηκαν για εκπαίδευση.

5. Κλάση Εξαγωγής Χαρακτηριστικών

Αυτή είναι η τάξη που είναι υπεύθυνη για την εκτέλεση εξαγωγής χαρακτηριστικών. Θα πρέπει να σημειωθεί ότι δεδομένου ότι αυτή η τάξη υπολογίζει εσωτερικά πολλά από τα στατιστικά στοιχεία που πραγματικά απαιτούνται από τον αλγόριθμο ταξινόμησης στο μεταγενέστερο στάδιο, όλα αυτά τα στατιστικά στοιχεία αποθηκεύονται στην κρυφή μνήμη και επιστρέφονται σε ένα αντικείμενο FeatureStats για να αποφευχθεί ο επανυπολογισμός τους.

6. Κλάση TextTokenizer

Αυτή είναι μια απλός τάξη διαμόρφωσης κειμένου, υπεύθυνη για την προεπεξεργασία, την εκκαθάριση και την κωδικοποίηση των αρχικών κειμένων και τη μετατροπή τους σε αντικείμενα εγγράφου.

Χρήση της κλάσης 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();

Τέλος, για να χρησιμοποιήσετε τον ταξινομητή και να προβλέψετε τις τάξεις των νέων παραδειγμάτων, το μόνο που χρειάζεται να κάνετε είναι να προετοιμάσετε έναν νέο ταξινομητή περνώντας το αντικείμενο 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's API εξαγωγής λέξεων-κλειδιών λειτουργία για να λάβετε όλα τα n-γραμμάρια (συνδυασμοί λέξεων-κλειδιών) του εγγράφου.

2. Προεπεξεργασία κειμένου:

Πριν χρησιμοποιήσετε έναν ταξινομητή συνήθως είναι απαραίτητο να προεπεξεργαστείτε το έγγραφο για να αφαιρέσετε περιττούς χαρακτήρες / τμήματα. Παρόλο που η τρέχουσα υλοποίηση εκτελεί περιορισμένη προεπεξεργασία χρησιμοποιώντας τη μέθοδο TextTokenizer.preprocess (), όταν πρόκειται για ανάλυση σελίδων HTML, τα πράγματα γίνονται πιο δύσκολα. Κάποιος μπορεί απλά να κόψει τις ετικέτες HTML και να διατηρήσει μόνο το απλό κείμενο του εγγράφου ή να καταφύγει σε πιο περίπλοκες τεχνικές μηχανικής εκμάθησης που ανιχνεύουν το κύριο κείμενο της σελίδας και αφαιρούν περιεχόμενο που ανήκει σε υποσέλιδο, κεφαλίδες, μενού κ.λπ. μπορεί να χρησιμοποιήσει τα Datumbox's API εξαγωγής κειμένου λειτουργία.

3. Πρόσθετα μοντέλα Naive Bayes:

Ο τρέχων ταξινομητής εφαρμόζει τον ταξινομητή Multinomial Naive Bayes, ωστόσο όπως συζητήσαμε σε προηγούμενο άρθρο σχετικά με Ανάλυση συναισθημάτων, διαφορετικά προβλήματα ταξινόμησης απαιτούν διαφορετικά μοντέλα. Σε κάποιες εκδόσεις Binarized του αλγορίθμου θα ήταν πιο κατάλληλη, ενώ σε άλλες το μοντέλο Bernoulli θα προσφέρει πολύ καλύτερα αποτελέσματα. Χρησιμοποιήστε αυτήν την εφαρμογή ως σημείο εκκίνησης και ακολουθήστε τις οδηγίες του Εκπαιδευτικό Naive Bayes για να επεκτείνει το μοντέλο.

4. Πρόσθετες μέθοδοι επιλογής χαρακτηριστικών:

Αυτή η εφαρμογή χρησιμοποιεί τον αλγόριθμο επιλογής χαρακτηριστικών Chisquare για να επιλέξει τα πιο κατάλληλα χαρακτηριστικά για την ταξινόμηση. Όπως είδαμε σε ένα προηγούμενο άρθρο, το Επιλογή χαρακτηριστικών Chisquare Η μέθοδος είναι μια καλή τεχνική που βασίζεται στα στατιστικά στοιχεία για να επιλέξει τα κατάλληλα χαρακτηριστικά, ωστόσο τείνει να δίνει υψηλότερη βαθμολογία σε σπάνια χαρακτηριστικά που εμφανίζονται μόνο σε μία από τις κατηγορίες. Μπορούν να γίνουν βελτιώσεις αφαιρώντας θορυβώδεις / σπάνιες λειτουργίες πριν προχωρήσουμε στην επιλογή χαρακτηριστικών ή εφαρμόζοντας πρόσθετες μεθόδους, όπως οι Αμοιβαίες Πληροφορίες που συζητήσαμε στο προαναφερθέν άρθρο.

5. Βελτιστοποίηση απόδοσης:

Στη συγκεκριμένη εφαρμογή ήταν σημαντικό να βελτιωθεί η αναγνωσιμότητα του κώδικα αντί να εκτελεστούν μικρο-βελτιστοποιήσεις στον κώδικα. Παρά το γεγονός ότι τέτοιες βελτιστοποιήσεις καθιστούν τον κώδικα πιο άσχημο και δυσκολότερο να διαβαστεί / διατηρηθεί, είναι συχνά απαραίτητο, καθώς πολλοί βρόχοι σε αυτόν τον αλγόριθμο εκτελούνται εκατομμύρια φορές κατά τη διάρκεια της προπόνησης και των δοκιμών. Αυτή η εφαρμογή μπορεί να είναι ένα εξαιρετικό σημείο εκκίνησης για την ανάπτυξη της δικής σας συντονισμένης έκδοσης.

Σχεδόν εκεί… Τελικές σημειώσεις!

Άκουσα-hes-good-at-coding-lΓια να κατανοήσετε καλύτερα πώς λειτουργεί αυτή η εφαρμογή, συνιστάται να διαβάσετε τα δύο προηγούμενα άρθρα Naive Bayes Classifier και Επιλογή χαρακτηριστικών. Θα λάβετε πληροφορίες σχετικά με το θεωρητικό υπόβαθρο των μεθόδων και θα καταστήσει σαφέστερα τμήματα του αλγορίθμου / κώδικα.

Πρέπει να σημειώσουμε ότι το Naive Bayes παρά το γεγονός ότι είναι εύκολο, γρήγορο και τις περισσότερες φορές «αρκετά ακριβές», είναι επίσης «Naive» επειδή κάνει την υπόθεση της υπό όρους ανεξαρτησίας των χαρακτηριστικών. Δεδομένου ότι αυτή η υπόθεση δεν πληρούται σχεδόν ποτέ σε προβλήματα ταξινόμησης κειμένου, το Naive Bayes δεν είναι σχεδόν ποτέ ο ταξινομητής με την καλύτερη απόδοση. Σε API Datumbox, ορισμένες επεκτάσεις του τυπικού ταξινομητή Naive Bayes χρησιμοποιούνται μόνο για απλά προβλήματα όπως η Ανίχνευση γλώσσας. Για πιο περίπλοκα προβλήματα ταξινόμησης κειμένου πιο προηγμένες τεχνικές όπως το Μέγιστη ταξινόμηση Entropy είναι απαραίτητα.

Εάν χρησιμοποιείτε την εφαρμογή σε ένα ενδιαφέρον έργο Αφήστε μας μια γραμμή και θα παρουσιάσουμε το έργο σας στο ιστολόγιό μας. Επίσης, αν σας αρέσει το άρθρο, αφιερώστε λίγο χρόνο και μοιραστείτε το στο Twitter ή στο Facebook. 🙂

Σφραγίδα ώρας:

Περισσότερα από Databox