Utveckla en naiv Bayes Text Classifier i JAVA PlatoBlockchain Data Intelligence. Vertikal sökning. Ai.

Utveckla en Naive Bayes textklassificerare i JAVA

I tidigare artiklar har vi diskuterat den teoretiska bakgrunden till Naive Bayes textklassificerare och vikten av att använda Funktionsvalstekniker i textklassificering. I den här artikeln kommer vi att sammansätta allt och bygga en enkel implementering av Naive Bayes textklassificeringsalgoritm i JAVA. Kod för klassificeraren är öppen källa (under GPL v3-licens) och du kan ladda ner den från Github.

Uppdatering: Datumbox Machine Learning Framework är nu öppen källkod och gratis att ladda ner. Kolla in paketet com.datumbox.framework.machinelearning.classification för att se implementeringen av Naive Bayes Classifier i Java.

Naive Bayes Java-implementering

Koden är skriven i JAVA och kan laddas ner direkt från Github. Det är licensierat enligt GPLv3 så använd gärna det, ändra det och omfördela det fritt.

Textklassificeringen implementerar Multinomiala Naive Bayes modell tillsammans med Val av chisquare-funktion algoritm. Alla teoretiska detaljer om hur båda teknikerna fungerar behandlas i tidigare artiklar och detaljerade javadoc-kommentarer finns på källkoden som beskriver implementeringen. I detta segment kommer jag därför att fokusera på en beskrivning på hög nivå av klassificeringsarkitekturen.

1. NaiveBayes-klass

Detta är huvuddelen av textklassificeringen. Den implementerar metoder som tåg () och förutsäga () som ansvarar för att utbilda en klassificerare och använda den för förutsägelser. Det bör noteras att den här klassen också ansvarar för att kalla lämpliga externa metoder för att förbereda och tokenisera dokumentet innan träning / förutsägelse.

2. NaiveBayesKnowledgeBase-objekt

Utgången från utbildning är ett NaiveBayesKnowledgeBase-objekt som lagrar all nödvändig information och sannolikheter som används av Naive Bayes Classifier.

3. Dokumentobjekt

Både utbildning och förutsägelsestekster i implementeringen lagras internt som dokumentobjekt. Dokumentobjektet lagrar alla tokens (ord) för dokumentet, deras statistik och dokumentets målklassificering.

4. FeatureStats-objekt

FeatureStats Object lagrar flera statistik som genereras under Feature Extract-fasen. Sådan statistik är de gemensamma räkenskaperna för funktioner och klass (från vilka de gemensamma sannolikheterna och sannolikheterna uppskattas), klassräkningarna (från vilka de förutgående utvärderas om ingen ges som input) och det totala antalet observationer som används för träning.

5. FeatureExtraktionsklass

Detta är klassen som ansvarar för att utföra funktionsuttag. Det bör noteras att eftersom denna klass internt beräknar flera av statistiken som faktiskt krävs av klassificeringsalgoritmen i det senare skedet, cache- ras alla dessa statistik och returneras i ett FeatureStats-objekt för att undvika deras omberäkning.

6. TextTokenizer-klass

Detta är en enkel texttokeniseringsklass, ansvarig för förbehandling, rensning och tokenisering av originaltekster och omvandling av dem till dokumentobjekt.

Använda NaiveBayes JAVA Class

I klassen NaiveBayesExample kan du hitta exempel på användning av klassen NaiveBayes. Målet för provkoden är att presentera ett exempel som tränar en enkel Naive Bayes-klassificerare för att upptäcka språket i en text. För att träna klassificeringen tillhandahåller vi inledningsvis banorna för träningsdatasätten i en HashMap och sedan laddar vi innehållet.

   //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-klassificeringen utbildas genom att överföra informationen till den. När utbildningen är klar lagras NaiveBayesKnowledgeBase-objektet för senare användning.

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

Slutligen för att använda klassificeraren och förutsäga klasserna av nya exempel allt du behöver göra är att initiera en ny klassificerare genom att passera NaiveBayesKnowledgeBase-objektet som du förvärvade tidigare genom utbildning. Genom att anropa metoden förutsäg () får du sedan dokumentets förutsedda klass.

   //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ödvändiga utvidgningar

Den särskilda JAVA-implementeringen bör inte betraktas som en komplett redo att använda lösningen för sofistikerade textklassificeringsproblem. Här är några av de viktiga utvidgningarna som kan göras:

1. Sökordsutdrag:

Även om det kan vara tillräckligt att använda enskilda nyckelord för enkla problem som språkdetektering, kräver andra mer komplicerade problem extraktion av n-gram. Således kan man antingen implementera en mer sofistikerad textutdragsalgoritm genom att uppdatera TextTokenizer.extractKeywords () -metoden eller använda Datumbox's API för sökordsutvinning funktion för att få alla n-gram (nyckelkombinationer) i dokumentet.

2. Förbehandling av text:

Innan du använder en klassificering är det vanligtvis nödvändigt att förbehandla dokumentet för att ta bort onödiga tecken / delar. Även om den nuvarande implementeringen utför begränsad förbehandling med metoden TextTokenizer.preprocess (), blir det svårare när det gäller att analysera HTML-sidor. Man kan helt enkelt klippa ut HTML-taggarna och behålla bara den vanliga texten i dokumentet eller tillgripa mer sofistikerade maskininlärningstekniker som upptäcker huvudtexten på sidan och tar bort innehåll som tillhör sidfot, sidhuvud, menyer etc. För senare du kan använda Datumbox's Text Extracting API funktion.

3. Ytterligare Naive Bayes-modeller:

Den nuvarande klassificeraren implementerar Multinomial Naive Bayes klassificeringen, ändå som vi diskuterade i en tidigare artikel om Sentimentanalys, olika klassificeringsproblem kräver olika modeller. I vissa skulle en binäriserad version av algoritmen vara mer lämplig, medan i andra kommer Bernoulli-modellen att ge mycket bättre resultat. Använd denna implementering som en utgångspunkt och följ instruktionerna från Naive Bayes handledning att utöka modellen.

4. Ytterligare metoder för val av funktioner:

Denna implementering använder algoritmen för val av Chisquare-funktion för att välja de lämpligaste funktionerna för klassificeringen. Som vi såg i en tidigare artikel, Val av chisquare-funktion metoden är en bra teknik som bygger på statistik för att välja lämpliga funktioner, men det tenderar att ge högre poäng på sällsynta funktioner som endast visas i en av kategorierna. Förbättringar kan göras genom att ta bort bullriga / sällsynta funktioner innan du går vidare till val av funktioner eller genom att implementera ytterligare metoder såsom den ömsesidiga informationen som vi diskuterade om den nämnda artikeln.

5. Optimering av prestanda:

I det specifika genomförandet var det viktigt att förbättra kodens läsbarhet snarare än att utföra mikrooptimeringar på koden. Trots att sådana optimeringar gör koden fulare och svårare att läsa / underhålla, är de ofta nödvändiga eftersom många slingor i denna algoritm körs miljoner gånger under träning och testning. Denna implementering kan vara en bra utgångspunkt för att utveckla din egen inställda version.

Nästan där ... Slutanmärkningar!

I-hört-hes-bra-at-kodning-lFör att få en god förståelse för hur denna implementering fungerar rekommenderas du starkt att läsa de två tidigare artiklarna om Naiv Bayes klassificerare och Funktionsval. Du får insikter om metodernas teoretiska bakgrund och det kommer att göra delar av algoritmen / koden tydligare.

Vi bör notera att Naive Bayes trots att det är ett enkelt, snabbt och oftast "ganska exakt", det också är "Naive" eftersom det gör antagandet om villkorad oberoende av funktionerna. Eftersom detta antagande nästan aldrig uppfylls i textklassificeringsproblem, är Naive Bayes nästan aldrig den bäst resultatklassificeraren. I Datumbox API, vissa utvidgningar av Naive Bayes standardklassificerare används bara för enkla problem som språkdetektering. För mer komplicerade textklassificeringsproblem mer avancerade tekniker som Max Entropy klassificerare är nödvändiga.

Om du använder implementeringen i ett intressant projekt släpp oss en rad och vi kommer att presentera ditt projekt på vår blogg. Om du gillar artikeln kan du ta en stund och dela den på Twitter eller Facebook. 🙂

Tidsstämpel:

Mer från Datumbox