Udvikling af en naiv Bayes-tekstklassificering i JAVA PlatoBlockchain Data Intelligence. Lodret søgning. Ai.

Udvikling af en naiv Bayes-tekstklassificering i JAVA

I tidligere artikler har vi diskuteret den teoretiske baggrund for Naiv Bayes tekstklassificering og vigtigheden af ​​at bruge Teknikker til valg af funktioner i tekstklassifikation. I denne artikel skal vi sætte alt sammen og bygge en simpel implementering af Naive Bayes tekstklassificeringsalgoritme i JAVA. Klassifikatorens kode er open source (under GPL v3-licens), og du kan downloade den fra Github.

Opdatering: Datumbox Machine Learning Framework er nu open source og gratis til downloade. Tjek pakken com.datumbox.framework.machinelearning.classification for at se implementeringen af ​​Naive Bayes Classifier i Java.

Naiv Bayes Java-implementering

Koden er skrevet i JAVA og kan downloades direkte fra Github. Det er licenseret under GPLv3, så du er velkommen til at bruge det, ændre det og omdistribuere det frit.

Tekstklassificeringen implementerer Multinomial Naive Bayes model sammen med Chisquare-funktionsvalg algoritme. Alle de teoretiske detaljer om, hvordan begge teknikker virker, er dækket i tidligere artikler og detaljerede javadoc-kommentarer kan findes på kildekoden, der beskriver implementeringen. Derfor vil jeg i dette segment fokusere på en beskrivelse på højt niveau af klassifikatorens arkitektur.

1. NaiveBayes klasse

Dette er hoveddelen af ​​tekstklassificeringen. Den implementerer metoder som train() og predict(), som er ansvarlige for at træne en klassifikator og bruge den til forudsigelser. Det skal bemærkes, at denne klasse også er ansvarlig for at kalde de relevante eksterne metoder til at forbehandle og tokenisere dokumentet før træning/forudsigelse.

2. NaiveBayesKnowledgeBase-objekt

Outputtet af træningen er et NaiveBayesKnowledgeBase-objekt, som gemmer alle de nødvendige oplysninger og sandsynligheder, der bruges af Naive Bayes-klassificeringen.

3. Dokumentobjekt

Både træningen og forudsigelsesteksterne i implementeringen gemmes internt som Dokumentobjekter. Dokumentobjektet gemmer alle tokens (ord) i dokumentet, deres statistik og dokumentets målklassifikation.

4. FeatureStats-objekt

FeatureStats-objektet gemmer adskillige statistikker, der genereres under Feature Extraction-fasen. Sådanne statistikker er de fælles optællinger af funktioner og klasse (hvorfra de fælles sandsynligheder og sandsynligheder estimeres), klasseoptællingerne (hvorfra de forudgående evalueres, hvis ingen er givet som input) og det samlede antal observationer, der bruges til træning.

5. FeatureExtraction Class

Dette er den klasse, der er ansvarlig for at udføre udtræk af funktioner. Det skal bemærkes, at da denne klasse internt beregner flere af de statistikker, der faktisk kræves af klassifikationsalgoritmen i det senere trin, cachelagres alle disse statistikker og returneres i et FeatureStats Object for at undgå genberegning.

6. TextTokenizer-klasse

Dette er et enkel teksttokeniseringsklasse, ansvarlig for at forbehandle, rydde og tokenisere de originale tekster og konvertere dem til dokumentobjekter.

Brug af NaiveBayes JAVA-klassen

I NaiveBayesExample-klassen kan du finde eksempler på brug af NaiveBayes-klassen. Målet med prøvekoden er at præsentere et eksempel, som træner en simpel Naiv Bayes Classifier for at detektere sproget i en tekst. For at træne klassificereren leverer vi først stierne til træningsdatasættene i et HashMap, og derefter indlæser vi deres indhold.

   //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-klassifikatoren trænes ved at videregive dataene til den. Når træningen er afsluttet, gemmes NaiveBayesKnowledgeBase-objektet til senere brug.

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

Til sidst for at bruge klassificeringen og forudsige klasserne af nye eksempler, skal du blot initialisere en ny klassificering ved at videregive NaiveBayesKnowledgeBase-objektet, som du har erhvervet tidligere ved at træne. Så ved blot at kalde predict() metoden får du den forudsagte klasse af dokumentet.

   //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 udvidelser

Den særlige JAVA-implementering bør ikke betragtes som en komplet brugsklar løsning til sofistikerede tekstklassificeringsproblemer. Her er nogle af de vigtige udvidelser, der kunne gøres:

1. Søgeordsudtrækning:

Selvom det kan være tilstrækkeligt at bruge enkelte søgeord til simple problemer som sprogdetektion, kræver andre mere komplicerede problemer udtrækning af n-gram. Således kan man enten implementere en mere sofistikeret tekstudtræksalgoritme ved at opdatere TextTokenizer.extractKeywords() metoden eller bruge Datumbox's Keyword Extraction API funktion for at få alle n-grammerne (søgeordskombinationer) i dokumentet.

2. Tekstforbehandling:

Før du bruger en klassificering, er det normalt nødvendigt at forbehandle dokumentet for at fjerne unødvendige tegn/dele. Selvom den nuværende implementering udfører begrænset forbehandling ved at bruge TextTokenizer.preprocess()-metoden, bliver tingene sværere, når det kommer til at analysere HTML-sider. Man kan simpelthen trimme HTML-tags og kun beholde den almindelige tekst i dokumentet eller ty til mere sofistikerede Machine Learning-teknikker, der registrerer hovedteksten på siden og fjerner indhold, der hører til sidefod, sidehoveder, menuer osv. For jo senere du kan bruge Datumbox's Tekstekstraktions-API funktion.

3. Yderligere naive Bayes-modeller:

Den nuværende klassifikator implementerer Multinomial Naive Bayes-klassifikatoren, ikke desto mindre, som vi diskuterede i en tidligere artikel om Følelsesanalyse, forskellige klassifikationsproblemer kræver forskellige modeller. I nogle vil en binariseret version af algoritmen være mere passende, mens i andre vil Bernoulli-modellen give meget bedre resultater. Brug denne implementering som udgangspunkt og følg instruktionerne fra Naiv Bayes tutorial at udvide modellen.

4. Yderligere funktionsvalgsmetoder:

Denne implementering bruger Chisquare-funktionsvalgalgoritmen til at vælge de mest passende funktioner til klassificeringen. Som vi så i en tidligere artikel, er Udvalg af Chisquare-funktioner metoden er en god teknik, som formidler statistikker for at vælge de passende funktioner, ikke desto mindre har den en tendens til at give højere score på sjældne funktioner, der kun optræder i en af ​​kategorierne. Forbedringer kan foretages ved at fjerne støjende/sjældne funktioner, før du fortsætter til valg af funktioner, eller ved at implementere yderligere metoder såsom den gensidige information, som vi diskuterede i den førnævnte artikel.

5. Ydeevneoptimering:

I den konkrete implementering var det vigtigt at forbedre kodens læsbarhed frem for at udføre mikrooptimeringer på koden. På trods af at sådanne optimeringer gør koden grimmere og sværere at læse/vedligeholde, er de ofte nødvendige, da mange loops i denne algoritme udføres millioner af gange under træning og test. Denne implementering kan være et godt udgangspunkt for at udvikle din egen tunede version.

Næsten der... Sidste bemærkninger!

Jeg-hørte-han-er-god-til-kodning-lFor at få en god forståelse af, hvordan denne implementering fungerer, anbefales det kraftigt at læse de to tidligere artikler om Naiv Bayes Classifier , Funktionsvalg. Du får indsigt i metodernes teoretiske baggrund og det vil gøre dele af algoritmen/koden mere overskuelig.

Vi bør bemærke, at Naive Bayes på trods af at være en nem, hurtig og de fleste gange "temmelig nøjagtig", er den også "Naiv", fordi den gør antagelsen om betinget uafhængighed af funktionerne. Da denne antagelse næsten aldrig er opfyldt i tekstklassificeringsproblemer, er Naive Bayes næsten aldrig den bedst ydende klassificering. I Datumbox API, nogle udvidelser af standard Naive Bayes-klassifikator bruges kun til simple problemer såsom sprogdetektion. For mere komplicerede tekstklassificeringsproblemer mere avancerede teknikker som f.eks Max entropi klassifikator er nødvendige.

Hvis du bruger implementeringen i et interessant projekt Skriv til os og vi vil præsentere dit projekt på vores blog. Hvis du kan lide artiklen, så tag et øjeblik og del den på Twitter eller Facebook. 🙂

Tidsstempel:

Mere fra Datumboks