Utvikle en naiv Bayes-tekstklassifisering i JAVA PlatoBlockchain Data Intelligence. Vertikalt søk. Ai.

Utvikle en Naive Bayes tekstklassifisering i JAVA

I tidligere artikler har vi diskutert den teoretiske bakgrunnen for Naive Bayes tekstklassifisering og viktigheten av å bruke Funksjon Valg teknikker i tekstklassifisering. I denne artikkelen skal vi sette sammen alt og bygge en enkel implementering av Naive Bayes tekstklassifiseringsalgoritme i JAVA. Koden til klassifiseringen er åpen (under GPL v3-lisensen), og du kan laste den ned fra Github.

Oppdatering: Datumbox Machine Learning Framework er nå åpen kildekode og gratis å nedlasting. Sjekk ut pakken com.datumbox.framework.machinelearning.classification for å se implementeringen av Naive Bayes Classifier i Java.

Naive Bayes Java-implementering

Koden er skrevet i JAVA og kan lastes ned direkte fra Github. Det er lisensiert under GPLv3, så bruk det gjerne, modifiser det og omfordel det fritt.

Tekstklassifiseringen implementerer Multinomiale Naive Bayes modell sammen med Valg av chisquare-funksjon algoritme. Alle teoretiske detaljer om hvordan begge teknikkene fungerer er dekket i tidligere artikler og detaljerte javadoc-kommentarer kan du finne på kildekoden som beskriver implementeringen. I dette segmentet vil jeg derfor fokusere på en beskrivelse på høyt nivå av arkitekturen til klassifiseringen.

1. NaiveBayes-klasse

Dette er hoveddelen av Text Classifier. Den implementerer metoder som tog () og forutsi () som er ansvarlige for å trene en klassifiserer og bruke den til spådommer. Det skal bemerkes at denne klassen også er ansvarlig for å kalle passende eksterne metoder for å forbehandle og tokenisere dokumentet før trening / prediksjon.

2. NaiveBayesKnowledgeBase-objekt

Utdataene fra trening er et NaiveBayesKnowledgeBase-objekt som lagrer all nødvendig informasjon og sannsynligheter som brukes av Naive Bayes Classifier.

3. Dokumentobjekt

Både trening og prediksjonstekster i implementeringen lagres internt som dokumentobjekter. Dokumentobjektet lagrer alle symboler (ord) til dokumentet, deres statistikk og målklassifisering av dokumentet.

4. FeatureStats-objekt

FeatureStats-objektet lagrer flere statistikker som blir generert under faksekstraksjonsfasen. Slik statistikk er fellestellingene for funksjoner og klasse (hvor felles sannsynlighet og sannsynlighet er estimert), klassetellingene (hvor tidligere blir evaluert hvis ingen er gitt som input) og det totale antall observasjoner som brukes til trening.

5. FunksjonExtraksjonsklasse

Dette er klassen som er ansvarlig for å utføre funksjonstrekk. Det skal bemerkes at siden denne klassen beregner internt flere av statistikken som faktisk kreves av klassifiseringsalgoritmen på et senere stadium, blir all denne statistikken hurtigbufret og returnert i et FeatureStats-objekt for å unngå deres omberegning.

6. TextTokenizer-klasse

Dette er en enkel teksttokeniseringsklasse, ansvarlig for forbehandling, tømming og tokenisering av originaltekstene og konvertering av dem til dokumentobjekter.

Bruker NaiveBayes JAVA Class

I klassen NaiveBayesExample kan du finne eksempler på bruk av klassen NaiveBayes. Målet med prøvekoden er å presentere et eksempel som trener en enkel Naive Bayes Classifier for å oppdage språket i en tekst. For å trene klassifiseringen, oppgir vi til å begynne med stiene til treningsdatasettene i en HashMap og deretter laster vi innholdet.

   //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-klassifiseringen trenes ved å overføre dataene til den. Når opplæringen er fullført, blir NaiveBayesKnowledgeBase-objektet lagret for senere bruk.

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

Til slutt å bruke klassifisereren og forutsi klassene med nye eksempler, alt du trenger å gjøre er å initialisere en ny klassifiser ved å passere NaiveBayesKnowledgeBase-objektet som du har skaffet deg tidligere ved å trene. Ved å kalle ganske enkelt predikt () -metoden får du dokumentet som er forutsagt.

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

Nødvendige utvidelser

Den spesielle JAVA-implementeringen skal ikke betraktes som en komplett klar til bruk-løsning for sofistikerte tekstklassifiseringsproblemer. Her er noen av de viktige utvidelsene som kan gjøres:

1. Søkeordekstraksjon:

Selv om bruk av enkle nøkkelord kan være tilstrekkelig for enkle problemer som språkoppdagelse, krever andre mer kompliserte problemer ekstraksjon av n-gram. Dermed kan man enten implementere en mer sofistikert tekstekstraksjonsalgoritme ved å oppdatere TextTokenizer.extractKeywords () -metoden eller bruke Datumbox's API for søkeordutvinning funksjon for å få alle n-gram (nøkkelordkombinasjoner) av dokumentet.

2. Forbehandling av tekst:

Før du bruker en klassifiserer, er det vanligvis nødvendig å forbehandle dokumentet for å fjerne unødvendige tegn / deler. Selv om den nåværende implementeringen utfører begrenset forbehandling ved å bruke TextTokenizer.preprocess () -metoden, blir ting vanskeligere når det gjelder å analysere HTML-sider. Man kan ganske enkelt trimme ut HTML-kodene og beholde bare ren tekst i dokumentet eller ty til mer sofistikerte maskinlæringsteknikker som oppdager hovedteksten på siden og fjerner innhold som hører til bunntekst, overskrifter, menyer osv. For senere kan bruke Datumbox Text Extracting API funksjon.

3. Flere Naive Bayes-modeller:

Den nåværende klassifisereren implementerer Multinomial Naive Bayes-klassifiseringen, likevel som vi diskuterte i en tidligere artikkel om Sentiment Analyse, forskjellige klassifiseringsproblemer krever forskjellige modeller. I noen vil en binærisert versjon av algoritmen være mer passende, mens i andre vil Bernoulli-modellen gi mye bedre resultater. Bruk denne implementeringen som utgangspunkt og følg instruksjonene fra Naive Bayes veiledning å utvide modellen.

4. Flere metodevalgmetoder:

Denne implementeringen bruker algoritmen Chisquare-funksjonsvalg for å velge de mest passende funksjonene for klassifiseringen. Som vi så i en tidligere artikkel, Valg av chisquare-funksjon metoden er en god teknikk som bruker statistikk for å velge passende funksjoner, men den har en tendens til å gi høyere score på sjeldne funksjoner som bare vises i en av kategoriene. Forbedringer kan gjøres ved å fjerne støyende / sjeldne funksjoner før du går videre til funksjonsvalg eller ved å implementere tilleggsmetoder som gjensidig informasjon som vi diskuterte om den nevnte artikkelen.

5. Ytelsesoptimalisering:

I den bestemte implementeringen var det viktig å forbedre kodens lesbarhet i stedet for å utføre mikrooptimaliseringer på koden. Til tross for at slike optimaliseringer gjør koden styggere og vanskeligere å lese / vedlikeholde, er de ofte nødvendige siden mange løkker i denne algoritmen blir utført millioner av ganger under trening og testing. Denne implementeringen kan være et flott utgangspunkt for å utvikle din egen innstilte versjon.

Nesten der ... Avsluttnoter!

I-hørt-hes-good-at-koding-lFor å få en god forståelse av hvordan denne implementeringen fungerer, anbefales du sterkt å lese de to foregående artiklene om Naiv Bayes-klassifisering og Funksjonsvalg. Du vil få innsikt i metodens teoretiske bakgrunn, og det vil gjøre deler av algoritmen / koden tydeligere.

Vi må merke oss at Naive Bayes, til tross for at den er en enkel, rask og for de fleste ganger "ganske nøyaktig", den også er "Naive" fordi den gir en antagelse om betinget uavhengighet av funksjonene. Siden denne antagelsen nesten aldri blir oppfylt i tekstklassifiseringsproblemer, er Naive Bayes nesten aldri den best utførende klassifisereren. I Datumbox API, noen utvidelser av standard Naive Bayes-klassifiseringen brukes bare til enkle problemer, for eksempel språkdeteksjon. For mer kompliserte tekstklassifiseringsproblemer, mer avanserte teknikker som Maks Entropy klassifiserer er nødvendige.

Hvis du bruker implementeringen i et interessant prosjekt slipp oss en linje og vi vil inneholde prosjektet ditt på bloggen vår. Hvis du liker artikkelen, kan du ta et øyeblikk og dele den på Twitter eller Facebook. 🙂

Tidstempel:

Mer fra Datoboks