Razvoj naivnega Bayesovega besedilnega klasifikatorja v JAVA PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

Razvoj Naive Bayesovega klasifikatorja besedila v JAVA

V prejšnjih člankih smo razpravljali o teoretičnem ozadju Naivni Bayesov klasifikator besedila in pomen uporabe Tehnike izbire funkcij v besedilni klasifikaciji. V tem članku bomo vse združili in zgradili preprosto implementacijo Naive Bayesovega algoritma za klasifikacijo besedil v JAVI. Koda klasifikatorja je odprtokodna (pod licenco GPL v3) in jo lahko prenesete iz GitHub.

Posodobitev: Okvir za strojno učenje Datebox je zdaj odprtokoden in brez njega prenesi. Oglejte si paket com.datumbox.framework.machinelearning.classification, če si želite ogledati implementacijo Naive Bayesovega klasifikatorja v Javi.

Naivna Bayesova implementacija Jave

Koda je napisana v JAVA in jo je mogoče prenesti neposredno iz GitHub. Licenciran je pod GPLv3, zato ga lahko uporabljate, spreminjate in prosto distribuirate.

Klasifikator besedila izvaja Multinomski naivni Bayes model skupaj z Izbira funkcije Chisquare algoritem. Vse teoretične podrobnosti delovanja obeh tehnik so zajete v prejšnjih člankih, podrobne komentarje javadoc pa lahko najdete v izvorni kodi, ki opisuje izvedbo. Zato se bom v tem segmentu osredotočil na opis visoke ravni arhitekture klasifikatorja.

1. Razred NaiveBayes

To je glavni del besedilnega klasifikatorja. Izvaja metode, kot sta train() in predict(), ki sta odgovorni za usposabljanje klasifikatorja in njegovo uporabo za napovedi. Upoštevati je treba, da je ta razred odgovoren tudi za klic ustreznih zunanjih metod za predhodno obdelavo in tokenizacijo dokumenta pred usposabljanjem/predvidevanjem.

2. Objekt NaiveBayesKnowledgeBase

Rezultat usposabljanja je objekt NaiveBayesKnowledgeBase, ki hrani vse potrebne informacije in verjetnosti, ki jih uporablja Naive Bayesov klasifikator.

3. Predmet dokumenta

Besedila za usposabljanje in napovedi v izvedbi so interno shranjena kot objekti dokumenta. Dokumentni objekt shranjuje vse žetone (besede) dokumenta, njihovo statistiko in ciljno klasifikacijo dokumenta.

4. Objekt FeatureStats

Objekt FeatureStats shranjuje več statističnih podatkov, ki so ustvarjeni med fazo ekstrakcije funkcij. Takšni statistični podatki so skupna števila značilnosti in razreda (iz katerih so ocenjene skupne verjetnosti in verjetnosti), števila razredov (iz katerih se ovrednotijo ​​predhodne vrednosti, če nobena ni podana kot vnos) in skupno število opazovanj, uporabljenih za usposabljanje.

5. Razred FeatureExtraction

To je razred, ki je odgovoren za izvajanje ekstrakcije funkcij. Upoštevati je treba, da ker ta razred interno izračuna več statističnih podatkov, ki jih dejansko zahteva klasifikacijski algoritem v poznejši fazi, so vsi ti statistični podatki predpomnjeni in vrnjeni v objektu FeatureStats, da se izognemo njihovemu ponovnemu izračunu.

6. Razred TextTokenizer

To je preprost razred tokenizacije besedila, ki je odgovoren za predhodno obdelavo, čiščenje in tokenizacijo izvirnih besedil ter njihovo pretvorbo v objekte dokumenta.

Uporaba razreda JAVA NaiveBayes

V razredu NaiveBayesExample lahko najdete primere uporabe razreda NaiveBayes. Cilj vzorčne kode je predstaviti primer, ki usposablja preprost naivni Bayesov klasifikator, da zazna jezik besedila. Za usposabljanje klasifikatorja najprej zagotovimo poti naborov podatkov za usposabljanje v HashMap in nato naložimo njihovo vsebino.

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

Klasifikator NaiveBayes se uri s posredovanjem podatkov. Ko je usposabljanje končano, se objekt NaiveBayesKnowledgeBase shrani za kasnejšo uporabo.

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

Za uporabo klasifikatorja in napovedovanje razredov novih primerov morate le inicializirati nov klasifikator s posredovanjem predmeta NaiveBayesKnowledgeBase, ki ste ga prej pridobili z usposabljanjem. Nato s preprostim klicem metode predict() dobite predvideni razred dokumenta.

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

Nujne razširitve

Določena implementacija JAVA se ne sme obravnavati kot popolna rešitev, pripravljena za uporabo, za sofisticirane težave s klasifikacijo besedil. Tukaj je nekaj pomembnih razširitev, ki bi jih lahko naredili:

1. Ekstrakcija ključnih besed:

Čeprav lahko uporaba posameznih ključnih besed zadostuje za enostavne težave, kot je zaznavanje jezika, druge bolj zapletene težave zahtevajo ekstrakcijo n-gramov. Tako lahko izvajamo bolj izpopolnjen algoritem za ekstrakcijo besedila s posodobitvijo metode TextTokenizer.extractKeywords() ali uporabimo Datumbox API za pridobivanje ključnih besed funkcijo za pridobitev vseh n-gramov (kombinacije ključnih besed) dokumenta.

2. Predhodna obdelava besedila:

Pred uporabo klasifikatorja je običajno potrebno predhodno obdelati dokument, da odstranimo nepotrebne znake/dele. Čeprav trenutna izvedba izvaja omejeno predhodno obdelavo z uporabo metode TextTokenizer.preprocess(), ko gre za analizo strani HTML, postanejo stvari težje. Enostavno lahko obrežete oznake HTML in obdržite samo navadno besedilo dokumenta ali pa se zatečete k bolj sofisticiranim tehnikam strojnega učenja, ki zaznajo glavno besedilo strani in odstranijo vsebino, ki pripada nogi, glavam, menijim itd. lahko uporablja Datumbox's API za ekstrakcijo besedila Funkcija.

3. Dodatni naivni Bayesovi modeli:

Trenutni klasifikator implementira multinomski naivni Bayesov klasifikator, kljub temu, kot smo razpravljali v prejšnjem članku o Analiza občutka, različni problemi klasifikacije zahtevajo različne modele. V nekaterih bi bila primernejša binarizirana različica algoritma, v drugih pa bo Bernoullijev model zagotovil veliko boljše rezultate. Uporabite to izvedbo kot izhodišče in sledite navodilom Vadnica Naive Bayes razširiti model.

4. Dodatne metode izbire funkcij:

Ta izvedba uporablja algoritem za izbiro funkcij Chisquare za izbiro najprimernejših funkcij za klasifikacijo. Kot smo videli v prejšnjem članku, Izbira funkcije Chisquare Metoda je dobra tehnika, ki se opira na statistične podatke za izbiro ustreznih lastnosti, kljub temu pa običajno daje višje ocene za redke lastnosti, ki se pojavijo samo v eni od kategorij. Izboljšave je mogoče doseči z odstranitvijo hrupnih/redkih funkcij, preden nadaljujete z izbiro funkcij, ali z uvedbo dodatnih metod, kot je vzajemno obveščanje, o katerem smo razpravljali v prej omenjenem članku.

5. Optimizacija zmogljivosti:

Pri določeni izvedbi je bilo pomembno izboljšati berljivost kode namesto izvajanja mikrooptimizacij kode. Kljub dejstvu, da je zaradi takšnih optimizacij koda grša in težja za branje/vzdrževanje, so pogosto potrebne, saj se številne zanke v tem algoritmu med usposabljanjem in testiranjem izvedejo milijone krat. Ta izvedba je lahko odlično izhodišče za razvoj lastne prilagojene različice.

Skoraj tam ... Končne opombe!

Slišal-sem-je-dober-kodiranje-lČe želite dobro razumeti, kako ta implementacija deluje, vam toplo priporočamo, da preberete prejšnja dva članka o Naivni Bayesov klasifikator in Izbira lastnosti. Dobili boste vpogled v teoretično ozadje metod in naredili dele algoritma/kode jasnejše.

Upoštevati je treba, da je Naive Bayes kljub temu, da je preprost, hiter in večinoma »precej natančen«, tudi »Naiven«, ker predpostavlja pogojno neodvisnost funkcij. Ker ta predpostavka skoraj nikoli ni izpolnjena pri težavah s klasifikacijo besedila, naivni Bayes skoraj nikoli ni najuspešnejši klasifikator. notri Datumbox API, se nekatere razširitve standardnega naivnega Bayesovega klasifikatorja uporabljajo samo za preproste težave, kot je zaznavanje jezika. Za bolj zapletene probleme razvrščanja besedila se uporabljajo naprednejše tehnike, kot je Klasifikator največje entropije so potrebni.

Če uporabite izvedbo v zanimivem projektu spusti nas črto in vaš projekt bomo predstavili na našem blogu. Če vam je članek všeč, si vzemite trenutek in ga delite na Twitterju ali Facebooku. 🙂

Časovni žig:

Več od Datumbox