Entwicklung eines Naive-Bayes-Textklassifikators in JAVA PlatoBlockchain Data Intelligence. Vertikale Suche. Ai.

Entwicklung eines Naive Bayes Text Classifier in JAVA

In früheren Artikeln haben wir den theoretischen Hintergrund von diskutiert Naiver Bayes Textklassifizierer und die Wichtigkeit der Verwendung Techniken zur Funktionsauswahl in der Textklassifikation. In diesem Artikel werden wir alles zusammenstellen und eine einfache Implementierung des Naive Bayes-Textklassifizierungsalgorithmus in JAVA erstellen. Der Code des Klassifikators ist Open-Source (unter GPL v3-Lizenz) und kann von heruntergeladen werden Github.

Update: Das Datumbox Machine Learning Framework ist jetzt Open Source und kostenlos für herunterladen. Schauen Sie sich das Paket com.datumbox.framework.machinelearning.classification an, um die Implementierung von Naive Bayes Classifier in Java zu sehen.

Naive Bayes Java-Implementierung

Der Code ist in JAVA geschrieben und kann direkt von heruntergeladen werden Github. Es ist unter GPLv3 lizenziert. Sie können es also verwenden, ändern und frei weitergeben.

Der Text Classifier implementiert das Multinomiale Naive Bayes Modell zusammen mit dem Auswahl der Chisquare-Funktionen Algorithmus. Alle theoretischen Details zur Funktionsweise beider Techniken werden in früheren Artikeln behandelt, und detaillierte Javadoc-Kommentare finden Sie im Quellcode, der die Implementierung beschreibt. Daher werde ich mich in diesem Segment auf eine allgemeine Beschreibung der Architektur des Klassifikators konzentrieren.

1. NaiveBayes Klasse

Dies ist der Hauptteil des Textklassifikators. Es implementiert Methoden wie train () und Predict (), die dafür verantwortlich sind, einen Klassifikator zu trainieren und für Vorhersagen zu verwenden. Es ist zu beachten, dass diese Klasse auch dafür verantwortlich ist, die entsprechenden externen Methoden aufzurufen, um das Dokument vor dem Training / der Vorhersage vorzuverarbeiten und zu tokenisieren.

2. NaiveBayesKnowledgeBase-Objekt

Die Ausgabe des Trainings ist ein NaiveBayesKnowledgeBase-Objekt, in dem alle erforderlichen Informationen und Wahrscheinlichkeiten gespeichert sind, die vom Naive Bayes-Klassifikator verwendet werden.

3. Dokumentobjekt

Sowohl der Trainings- als auch der Vorhersage-Text in der Implementierung werden intern als Dokumentobjekte gespeichert. Das Dokumentobjekt speichert alle Token (Wörter) des Dokuments, ihre Statistiken und die Zielklassifizierung des Dokuments.

4. FeatureStats-Objekt

Das FeatureStats-Objekt speichert mehrere Statistiken, die während der Feature-Extraktionsphase generiert werden. Solche Statistiken sind die gemeinsame Anzahl von Merkmalen und Klassen (aus denen die gemeinsamen Wahrscheinlichkeiten und Wahrscheinlichkeiten geschätzt werden), die Klassenzahlen (aus denen die Prioritäten bewertet werden, wenn keine als Eingabe angegeben werden) und die Gesamtzahl der für das Training verwendeten Beobachtungen.

5. FeatureExtraction-Klasse

Dies ist die Klasse, die für die Merkmalsextraktion verantwortlich ist. Es sollte beachtet werden, dass, da diese Klasse intern mehrere der Statistiken berechnet, die vom Klassifizierungsalgorithmus in der späteren Phase tatsächlich benötigt werden, alle diese Statistiken zwischengespeichert und in einem FeatureStats-Objekt zurückgegeben werden, um ihre Neuberechnung zu vermeiden.

6. TextTokenizer-Klasse

Dieser Kurs ist ein einfach Text-Tokenisierungsklasse, die für die Vorverarbeitung, das Löschen und Tokenisieren der Originaltexte und deren Konvertierung in Dokumentobjekte verantwortlich ist.

Verwenden der NaiveBayes JAVA-Klasse

In der NaiveBayesExample-Klasse finden Sie Beispiele für die Verwendung der NaiveBayes-Klasse. Das Ziel des Beispielcodes ist es, ein Beispiel zu präsentieren, das einen einfachen Naive Bayes-Klassifikator trainiert, um die Sprache eines Textes zu erkennen. Um den Klassifikator zu trainieren, stellen wir zunächst die Pfade der Trainingsdatensätze in einer HashMap bereit und laden dann deren Inhalt.

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

Der NaiveBayes-Klassifikator wird trainiert, indem die Daten an ihn übergeben werden. Nach Abschluss des Trainings wird das NaiveBayesKnowledgeBase-Objekt zur späteren Verwendung gespeichert.

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

Um den Klassifizierer zu verwenden und die Klassen neuer Beispiele vorherzusagen, müssen Sie lediglich einen neuen Klassifizierer initialisieren, indem Sie das NaiveBayesKnowledgeBase-Objekt übergeben, das Sie zuvor durch Training erworben haben. Wenn Sie dann einfach die Predict () -Methode aufrufen, erhalten Sie die vorhergesagte Klasse des Dokuments.

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

Notwendige Erweiterungen

Die spezielle JAVA-Implementierung sollte nicht als vollständige gebrauchsfertige Lösung für anspruchsvolle Textklassifizierungsprobleme angesehen werden. Hier sind einige wichtige Erweiterungen, die durchgeführt werden könnten:

1. Keyword-Extraktion:

Obwohl die Verwendung einzelner Schlüsselwörter für einfache Probleme wie die Spracherkennung ausreichend sein kann, erfordern andere kompliziertere Probleme die Extraktion von n-Gramm. Somit kann man entweder einen komplexeren Textextraktionsalgorithmus implementieren, indem man die TextTokenizer.extractKeywords () -Methode aktualisiert, oder Datumsboxen verwenden Keyword-Extraktions-API Funktion zum Abrufen aller n-Gramm (Schlüsselwortkombinationen) des Dokuments.

2. Textvorverarbeitung:

Vor der Verwendung eines Klassifikators muss das Dokument normalerweise vorverarbeitet werden, um unnötige Zeichen / Teile zu entfernen. Obwohl die aktuelle Implementierung eine begrenzte Vorverarbeitung mithilfe der TextTokenizer.preprocess () -Methode durchführt, wird es bei der Analyse von HTML-Seiten schwieriger. Sie können einfach die HTML-Tags ausschneiden und nur den Klartext des Dokuments beibehalten oder auf ausgefeiltere Techniken des maschinellen Lernens zurückgreifen, die den Haupttext der Seite erkennen und Inhalte entfernen, die zu Fußzeile, Kopfzeilen, Menüs usw. gehören kann Datumboxs verwenden Textextraktions-API Funktion.

3. Zusätzliche Naive Bayes-Modelle:

Der aktuelle Klassifikator implementiert den Multinomial Naive Bayes-Klassifikator, wie wir bereits in einem früheren Artikel über besprochen haben StimmungsanalyseUnterschiedliche Klassifizierungsprobleme erfordern unterschiedliche Modelle. In einigen Fällen wäre eine binarisierte Version des Algorithmus besser geeignet, während in anderen Fällen das Bernoulli-Modell viel bessere Ergebnisse liefert. Verwenden Sie diese Implementierung als Ausgangspunkt und befolgen Sie die Anweisungen des Naive Bayes-Tutorial um das Modell zu erweitern.

4. Zusätzliche Methoden zur Funktionsauswahl:

Diese Implementierung verwendet den Chisquare-Merkmalsauswahlalgorithmus, um die am besten geeigneten Merkmale für die Klassifizierung auszuwählen. Wie wir in einem früheren Artikel gesehen haben, ist die Auswahl der Chisquare-Funktionen Die Methode ist eine gute Technik, bei der Statistiken zur Auswahl der geeigneten Merkmale herangezogen werden. Bei seltenen Merkmalen, die nur in einer der Kategorien vorkommen, werden jedoch tendenziell höhere Werte erzielt. Es können Verbesserungen vorgenommen werden, indem verrauschte / seltene Features entfernt werden, bevor mit der Feature-Auswahl fortgefahren wird, oder indem zusätzliche Methoden wie die gegenseitigen Informationen implementiert werden, die wir im oben genannten Artikel besprochen haben.

5. Leistungsoptimierung:

In der jeweiligen Implementierung war es wichtig, die Lesbarkeit des Codes zu verbessern, anstatt Mikrooptimierungen am Code durchzuführen. Trotz der Tatsache, dass solche Optimierungen den Code hässlicher und schwieriger zu lesen / zu warten machen, sind sie häufig erforderlich, da viele Schleifen in diesem Algorithmus während des Trainings und Testens millionenfach ausgeführt werden. Diese Implementierung kann ein guter Ausgangspunkt für die Entwicklung Ihrer eigenen optimierten Version sein.

Fast da ... Schlussbemerkungen!

Ich habe gehört, dass er gut im Codieren istUm ein gutes Verständnis für die Funktionsweise dieser Implementierung zu erhalten, wird dringend empfohlen, die beiden vorherigen Artikel zu lesen Naiver Bayes-Klassifikator und Merkmalsauswahl. Sie erhalten Einblicke in den theoretischen Hintergrund der Methoden und werden Teile des Algorithmus / Codes klarer.

Wir sollten beachten, dass Naive Bayes, obwohl es einfach, schnell und meistens „ziemlich genau“ ist, auch „naiv“ ist, weil es die Annahme einer bedingten Unabhängigkeit der Merkmale voraussetzt. Da diese Annahme bei Problemen mit der Textklassifizierung fast nie erfüllt wird, ist der Naive Bayes fast nie der Klassifizierer mit der besten Leistung. Im Datumbox-APIEinige Erweiterungen des Standard-Naive-Bayes-Klassifikators werden nur für einfache Probleme wie die Spracherkennung verwendet. Für kompliziertere Textklassifizierungsprobleme fortgeschrittenere Techniken wie die Max Entropy Klassifikator sind notwendig.

Wenn Sie die Implementierung in einem interessanten Projekt verwenden Schreiben Sie uns und wir werden Ihr Projekt in unserem Blog vorstellen. Auch wenn Ihnen der Artikel gefällt, nehmen Sie sich bitte einen Moment Zeit und teilen Sie ihn auf Twitter oder Facebook. 🙂

Zeitstempel:

Mehr von Bezugsbox