Dezvoltarea unui clasificator de text Bayes naiv în JAVA PlatoBlockchain Data Intelligence. Căutare verticală. Ai.

Dezvoltarea unui clasificator de texte Naive Bayes în JAVA

În articolele anterioare am discutat despre fundalul teoretic al Clasificator de text Naive Bayes și importanța utilizării Tehnici de selectare a caracteristicilor în Clasificarea textului. În acest articol, vom pune totul împreună și vom construi o implementare simplă a algoritmului de clasificare a textului Naive Bayes în JAVA. Codul clasificatorului este open-source (sub licență GPL v3) și îl puteți descărca de la Github.

Actualizare: Datumbox Machine Learning Framework este acum open-source și gratuit Descarca. Consultați pachetul com.datumbox.framework.machinelearning.classification pentru a vedea implementarea Naive Bayes Classifier în Java.

Implementare Java Naive Bayes

Codul este scris în JAVA și poate fi descărcat direct de la Github. Este licențiat conform GPLv3, așa că nu ezitați să îl utilizați, să îl modificați și să îl redistribuiți liber.

Clasificatorul de text implementează Bayes naiv multinomial model împreună cu Selectarea funcției Chisquare algoritm. Toate detaliile teoretice despre modul în care funcționează ambele tehnici sunt tratate în articolele anterioare și comentariile detaliate javadoc pot fi găsite în codul sursă care descrie implementarea. Astfel, în acest segment mă voi concentra pe o descriere la nivel înalt a arhitecturii clasificatorului.

1. Clasa NaiveBayes

Aceasta este partea principală a clasificatorului de text. Implementează metode precum train () și predict () care sunt responsabile pentru instruirea unui clasificator și utilizarea acestuia pentru predicții. Trebuie remarcat faptul că această clasă este, de asemenea, responsabilă pentru apelarea metodelor externe adecvate pentru preprocesare și simbolizare a documentului înainte de instruire / predicție.

2. Obiectul NaiveBayesKnowledgeBase

Rezultatul instruirii este un obiect NaiveBayesKnowledgeBase care stochează toate informațiile și probabilitățile necesare care sunt utilizate de clasificatorul Naive Bayes.

3. Obiectul documentului

Atât textele de instruire, cât și textele de predicție din implementare sunt stocate intern ca obiecte de document. Obiectul Document stochează toate jetoanele (cuvintele) documentului, statisticile acestora și clasificarea țintă a documentului.

4. Obiect FeatureStats

Obiectul FeatureStats stochează mai multe statistici care sunt generate în timpul fazei de extragere a caracteristicilor. Astfel de statistici sunt numărările comune de caracteristici și clasă (de la care sunt estimate probabilitățile și probabilitățile comune), numărul de clase (din care sunt evaluate prioritățile dacă nu sunt date ca input) și numărul total de observații utilizate pentru instruire.

5. Clasa FeatureExtraction

Aceasta este clasa care este responsabilă pentru efectuarea extragerii caracteristicilor. Trebuie remarcat faptul că, deoarece această clasă calculează intern mai multe statistici care sunt de fapt cerute de algoritmul de clasificare în etapa ulterioară, toate aceste statistici sunt stocate în cache și returnate într-un obiect FeatureStats pentru a evita recalcularea lor.

6. Clasa TextTokenizer

Aceasta este o simplu clasa de tokenizare a textului, responsabilă cu preprocesarea, ștergerea și tokenizarea textelor originale și convertirea lor în obiecte Document.

Utilizarea clasei NaiveBayes JAVA

În clasa NaiveBayesExample puteți găsi exemple de utilizare a clasei NaiveBayes. Ținta codului eșantion este de a prezenta un exemplu care antrenează un clasificator simplu Naive Bayes pentru a detecta limba unui text. Pentru a instrui clasificatorul, inițial oferim căile seturilor de date de antrenament într-un HashMap și apoi le încărcăm conținutul.

   //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()));
   }

Clasificatorul NaiveBayes este instruit prin transmiterea către acesta a datelor. Odată finalizat antrenamentul, obiectul NaiveBayesKnowledgeBase este stocat pentru utilizare ulterioară.

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

În cele din urmă, pentru a utiliza clasificatorul și a prezice clasele de noi exemple, tot ce trebuie să faceți este să inițializați un nou clasificator prin trecerea obiectului NaiveBayesKnowledgeBase pe care l-ați achiziționat mai devreme prin antrenament. Apoi, apelând pur și simplu metoda predict () veți obține clasa prezisă a documentului.

   //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);   

Extensii necesare

Implementarea specială JAVA nu trebuie considerată o soluție completă gata de utilizare pentru probleme sofisticate de clasificare a textului. Iată câteva dintre expansiunile importante care ar putea fi realizate:

1. Extragerea cuvintelor cheie:

Chiar dacă utilizarea unor cuvinte cheie unice poate fi suficientă pentru probleme simple, cum ar fi Detectarea limbii, alte probleme mai complicate necesită extragerea de n-grame. Astfel, se poate implementa un algoritm mai sofisticat de extragere a textului prin actualizarea metodei TextTokenizer.extractKeywords () sau folosind Datumbox's API pentru extragerea cuvintelor cheie funcție pentru a obține toate n-grame (combinații de cuvinte cheie) ale documentului.

2. Preprocesare text:

Înainte de a utiliza un clasificator, este de obicei necesar să preprocesați documentul pentru a elimina caracterele / părțile inutile. Chiar dacă implementarea actuală efectuează o preprocesare limitată utilizând metoda TextTokenizer.preprocess (), atunci când vine vorba de analiza paginilor HTML, lucrurile devin mai complicate. Puteți pur și simplu să tăiați etichetele HTML și să păstrați doar textul simplu al documentului sau să recurgeți la tehnici de învățare automată mai sofisticate care detectează textul principal al paginii și elimină conținutul care aparține subsolului, antetelor, meniurilor etc. pot folosi Datumbox's API pentru extragerea textului Funcția.

3. Modele suplimentare Naive Bayes:

Clasificatorul actual implementează clasificatorul Multinomial Naive Bayes, totuși așa cum am discutat într-un articol anterior despre Analiza sentimentelor, diferite probleme de clasificare necesită modele diferite. În unele, o versiune binarizată a algoritmului ar fi mai potrivită, în timp ce în altele, modelul Bernoulli va oferi rezultate mult mai bune. Utilizați această implementare ca punct de plecare și urmați instrucțiunile din Tutorial Naive Bayes pentru a extinde modelul.

4. Metode suplimentare de selectare a caracteristicilor:

Această implementare utilizează algoritmul de selectare a caracteristicilor Chisquare pentru a selecta cele mai potrivite caracteristici pentru clasificare. După cum am văzut într-un articol anterior, Selecție caracteristică Chisquare metoda este o tehnică bună care se bazează pe statistici pentru a selecta caracteristicile adecvate, totuși tinde să dea scoruri mai mari la caracteristicile rare care apar doar într-una din categorii. Îmbunătățirile pot fi făcute eliminând caracteristicile zgomotoase / rare înainte de a trece la selectarea caracteristicilor sau prin implementarea unor metode suplimentare, cum ar fi informațiile reciproce pe care le-am discutat în articolul menționat anterior.

5. Optimizarea performanței:

În implementarea specială, a fost important să se îmbunătățească lizibilitatea codului, mai degrabă decât să se efectueze micro-optimizări ale codului. În ciuda faptului că astfel de optimizări fac codul mai urât și mai greu de citit / întreținut, acestea sunt deseori necesare, deoarece multe bucle din acest algoritm sunt executate de milioane de ori în timpul antrenamentului și testării. Această implementare poate fi un punct de plecare excelent pentru dezvoltarea propriei versiuni reglate.

Aproape acolo ... Note finale!

Am auzit că e bun la codificarePentru a înțelege cum funcționează această implementare, vă recomandăm să citiți cele două articole anterioare despre Clasificator Naive Bayes și Selectarea caracteristicilor. Veți obține informații despre fundalul teoretic al metodelor și va face părți ale algoritmului / codului mai clare.

Ar trebui să menționăm că Naive Bayes, în ciuda faptului că este ușor, rapid și de cele mai multe ori „destul de precis”, este și „Naiv”, deoarece presupune independența condiționată a caracteristicilor. Deoarece această presupunere nu este aproape niciodată îndeplinită în problemele de clasificare a textelor, Naive Bayes nu este aproape niciodată cel mai performant clasificator. În API Datumbox, unele extinderi ale clasificatorului standard Naive Bayes sunt utilizate numai pentru probleme simple, cum ar fi Detectarea limbajului. Pentru probleme mai complicate de clasificare a textului, tehnici mai avansate, cum ar fi Clasificator Max Entropy sunt necesare.

Dacă utilizați implementarea într-un proiect interesant dă-ne o linie și vom prezenta proiectul dvs. pe blogul nostru. De asemenea, dacă vă place articolul, vă rugăm să luați un moment și să-l distribuiți pe Twitter sau Facebook. 🙂

Timestamp-ul:

Mai mult de la Datumbox