Een naïeve Bayes-tekstclassificatie ontwikkelen in JAVA PlatoBlockchain Data Intelligence. Verticaal zoeken. Ai.

Een Naive Bayes-tekstclassificatie ontwikkelen in JAVA

In eerdere artikelen hebben we de theoretische achtergrond van besproken Naïeve Bayes-tekstclassificatie en het belang van het gebruik Feature Selectie technieken in tekstclassificatie. In dit artikel gaan we alles samenvoegen en een eenvoudige implementatie van het Naive Bayes-algoritme voor tekstclassificatie in JAVA bouwen. De code van de classifier is open source (onder GPL v3-licentie) en u kunt deze downloaden van GitHub.

Update: het Datumbox Machine Learning Framework is nu open-source en gratis voor Download. Bekijk het pakket com.datumbox.framework.machinelearning.classification om de implementatie van Naive Bayes Classifier in Java te zien.

Naïeve Bayes Java-implementatie

De code is geschreven in JAVA en kan rechtstreeks worden gedownload van GitHub. Het is gelicentieerd onder GPLv3, dus voel je vrij om het te gebruiken, aan te passen en vrij te verspreiden.

De Text Classifier implementeert de Multinomiale naïeve Bayes model samen met de Selectie van Chisquare-functies algoritme. Alle theoretische details van hoe beide technieken werken worden behandeld in eerdere artikelen en gedetailleerde javadoc-opmerkingen zijn te vinden op de broncode die de implementatie beschrijft. Dus in dit segment zal ik me concentreren op een beschrijving op hoog niveau van de architectuur van de classificator.

1. NaiveBayes-klasse

Dit is het belangrijkste onderdeel van de tekstclassificatie. Het implementeert methoden zoals train () en predict () die verantwoordelijk zijn voor het trainen van een classifier en het gebruiken voor voorspellingen. Opgemerkt moet worden dat deze klasse ook verantwoordelijk is voor het aanroepen van de juiste externe methoden om het document voor te verwerken en te tokeniseren vóór training / voorspelling.

2. NaiveBayesKnowledgeBase-object

De output van training is een NaiveBayesKnowledgeBase-object dat alle benodigde informatie en waarschijnlijkheden opslaat die door de Naive Bayes Classifier worden gebruikt.

3. Documentobject

Zowel de training als de voorspellingsteksten in de implementatie worden intern opgeslagen als Document Objects. Het documentobject slaat alle tokens (woorden) van het document op, hun statistieken en de doelclassificatie van het document.

4. FeatureStats-object

Het FeatureStats-object slaat verschillende statistieken op die zijn gegenereerd tijdens de Feature Extraction-fase. Dergelijke statistieken zijn de gezamenlijke tellingen van kenmerken en klasse (waaruit de gezamenlijke waarschijnlijkheden en waarschijnlijkheden worden geschat), de tellingen van de klasse (waaruit de priors worden geëvalueerd als er geen als input wordt gegeven) en het totale aantal observaties dat voor training wordt gebruikt.

5. FeatureExtraction-klasse

Dit is de klasse die verantwoordelijk is voor het uitvoeren van kenmerkextractie. Opgemerkt moet worden dat aangezien deze klasse intern verschillende van de statistieken berekent die in een later stadium nodig zijn voor het classificatiealgoritme, al deze statistieken in het cachegeheugen worden opgeslagen en worden geretourneerd in een FeatureStats-object om herberekening te voorkomen.

6. TextTokenizer-klasse

Dit is een simpel tekst tokenisatie klasse, verantwoordelijk voor het voorbewerken, wissen en tokeniseren van de originele teksten en deze om te zetten in documentobjecten.

De NaiveBayes JAVA-klasse gebruiken

In de klasse NaiveBayesExample vindt u voorbeelden van het gebruik van de klasse NaiveBayes. Het doel van de voorbeeldcode is om een ​​voorbeeld te presenteren dat een eenvoudige Naive Bayes Classifier traint om de taal van een tekst te detecteren. Om de classifier te trainen, bieden we in eerste instantie de paden van de trainingsdatasets in een HashMap en vervolgens laden we hun inhoud.

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

De NaiveBayes-classificator wordt getraind door er de gegevens aan door te geven. Zodra de training is voltooid, wordt het NaiveBayesKnowledgeBase-object opgeslagen voor later gebruik.

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

Tot slot, om de classifier te gebruiken en de klassen van nieuwe voorbeelden te voorspellen, volstaat het om een ​​nieuwe classifier te initialiseren door het NaiveBayesKnowledgeBase-object dat u eerder door training hebt verkregen, door te geven. Door vervolgens de methode predict () aan te roepen, krijgt u de voorspelde klasse van het document.

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

Noodzakelijke uitbreidingen

De specifieke JAVA-implementatie mag niet worden beschouwd als een complete gebruiksklare oplossing voor geavanceerde tekstclassificatieproblemen. Hier zijn enkele van de belangrijke uitbreidingen die kunnen worden gedaan:

1. Zoekwoordextractie:

Hoewel het gebruik van enkele zoekwoorden voldoende kan zijn voor eenvoudige problemen zoals taaldetectie, vereisen andere, meer gecompliceerde problemen de extractie van n-gram. U kunt dus een geavanceerder algoritme voor tekstextractie implementeren door de TextTokenizer.extractKeywords () -methode bij te werken of Datumbox's te gebruiken API voor trefwoordextractie functie om alle n-gram (trefwoordcombinaties) van het document te krijgen.

2. Tekstverwerking:

Voordat u een classifier gebruikt, is het meestal nodig om het document voor te bewerken om onnodige tekens / delen te verwijderen. Hoewel de huidige implementatie een beperkte voorverwerking uitvoert met behulp van de TextTokenizer.preprocess () -methode, wordt het lastiger als het gaat om het analyseren van HTML-pagina's. U kunt eenvoudig de HTML-tags wegknippen en alleen de platte tekst van het document behouden of gebruik maken van meer geavanceerde Machine Learning-technieken die de hoofdtekst van de pagina detecteren en inhoud verwijderen die hoort bij voetteksten, kopteksten, menu's enz. Voor de latere u kan Datumbox gebruiken Tekstextractie-API functie.

3. Extra Naive Bayes-modellen:

De huidige classificator implementeert de multinomiale Naive Bayes-classificator, niettemin zoals we in een vorig artikel bespraken Sentiment analyse, verschillende classificatieproblemen vereisen verschillende modellen. In sommige gevallen zou een Binarized-versie van het algoritme geschikter zijn, terwijl in andere het Bernoulli-model veel betere resultaten zal opleveren. Gebruik deze implementatie als uitgangspunt en volg de instructies van de Naive Bayes-zelfstudie om het model uit te breiden.

4. Extra methoden voor het selecteren van functies:

Deze implementatie gebruikt het Chisquare-algoritme voor het selecteren van functies om de meest geschikte functies voor de classificatie te selecteren. Zoals we in een vorig artikel zagen, de Selectie van chisquare-functies methode is een goede techniek die berust op statistieken om de juiste kenmerken te selecteren, maar geeft doorgaans hogere scores op zeldzame kenmerken die alleen in een van de categorieën voorkomen. Verbeteringen kunnen worden aangebracht door het verwijderen van lawaaierige / zeldzame functies voordat u doorgaat met het selecteren van functies of door aanvullende methoden te implementeren, zoals de wederzijdse informatie die we in het bovengenoemde artikel hebben besproken.

5. Prestatieoptimalisatie:

Bij de specifieke implementatie was het belangrijk om de leesbaarheid van de code te verbeteren in plaats van het uitvoeren van micro-optimalisaties op de code. Ondanks het feit dat dergelijke optimalisaties de code lelijker en moeilijker te lezen / onderhouden maken, zijn ze vaak nodig omdat veel lussen in dit algoritme miljoenen keren worden uitgevoerd tijdens training en testen. Deze implementatie kan een goed startpunt zijn voor het ontwikkelen van uw eigen afgestemde versie.

We zijn er bijna ... Laatste opmerkingen!

Ik-hoorde-hij-goed-bij-codering-lOm een ​​goed beeld te krijgen van hoe deze implementatie werkt, wordt u sterk aangeraden om de twee voorgaande artikelen te lezen Naïeve Bayes-classificatie en Functieselectie. Je krijgt inzicht in de theoretische achtergrond van de methodes en het zal delen van het algoritme / code duidelijker maken.

We moeten opmerken dat Naive Bayes, ondanks dat het een gemakkelijke, snelle en meestal "vrij nauwkeurige" methode is, ook "Naïef" is, omdat het de aanname van voorwaardelijke onafhankelijkheid van de functies veronderstelt. Aangezien aan deze veronderstelling bijna nooit wordt voldaan bij problemen met tekstclassificatie, is de Naive Bayes bijna nooit de best presterende classificator. In Datumbox-APIworden sommige uitbreidingen van de standaard Naive Bayes-classificatie alleen gebruikt voor eenvoudige problemen zoals taaldetectie. Voor meer gecompliceerde tekstclassificatieproblemen meer geavanceerde technieken zoals de Max Entropy-classificatie zijn noodzakelijk.

Als je de implementatie gebruikt in een interessant project ons een seintje en we zullen uw project op onze blog plaatsen. Als je het artikel ook leuk vindt, neem dan even de tijd en deel het op Twitter of Facebook. 🙂

Tijdstempel:

Meer van Datumbox