Développement d'un classificateur de texte Naive Bayes dans JAVA PlatoBlockchain Data Intelligence. Recherche verticale. Aï.

Développement d'un classificateur de texte Naive Bayes dans JAVA

Dans les articles précédents, nous avons discuté du contexte théorique de Classificateur de texte Naive Bayes et l'importance d'utiliser Techniques de sélection des fonctionnalités dans la classification de texte. Dans cet article, nous allons tout rassembler et construire une implémentation simple de l'algorithme de classification de texte Naive Bayes en JAVA. Le code du classifieur est open-source (sous licence GPL v3) et vous pouvez le télécharger depuis Github.

Mise à jour: le Datumbox Machine Learning Framework est désormais open-source et gratuit pour download. Consultez le package com.datumbox.framework.machinelearning.classification pour voir l'implémentation de Naive Bayes Classifier en Java.

Implémentation Java Naive Bayes

Le code est écrit en JAVA et peut être téléchargé directement depuis Github. Il est sous licence GPLv3 alors n'hésitez pas à l'utiliser, à le modifier et à le redistribuer librement.

Le classificateur de texte implémente le Bayes naïves multinomiales modèle avec le Sélection des fonctionnalités Chisquare algorithme. Tous les détails théoriques sur le fonctionnement des deux techniques sont traités dans les articles précédents et des commentaires javadoc détaillés peuvent être trouvés sur le code source décrivant l'implémentation. Ainsi, dans ce segment, je me concentrerai sur une description de haut niveau de l'architecture du classificateur.

1. Classe NaiveBayes

C'est la partie principale du classificateur de texte. Il implémente des méthodes telles que train () et predict () qui sont responsables de la formation d'un classificateur et de son utilisation pour les prédictions. Il convient de noter que cette classe est également chargée d'appeler les méthodes externes appropriées pour prétraiter et tokeniser le document avant l'entraînement / la prédiction.

2. Objet NaiveBayesKnowledgeBase

Le résultat de la formation est un objet NaiveBayesKnowledgeBase qui stocke toutes les informations et probabilités nécessaires utilisées par le classificateur Naive Bayes.

3. Objet de document

Les textes d'apprentissage et de prédiction de l'implémentation sont stockés en interne sous forme d'objets de document. L'objet Document stocke tous les jetons (mots) du document, leurs statistiques et la classification cible du document.

4. Objet FeatureStats

L'objet FeatureStats stocke plusieurs statistiques générées lors de la phase d'extraction d'entités. Ces statistiques sont les dénombrements conjoints des caractéristiques et de la classe (à partir desquels les probabilités et les probabilités conjointes sont estimées), les dénombrements de classe (à partir desquels les a priori sont évalués si aucun n'est donné en entrée) et le nombre total d'observations utilisées pour la formation.

5. Classe FeatureExtraction

C'est la classe qui est chargée d'exécuter l'extraction de caractéristiques. Il convient de noter que puisque cette classe calcule en interne plusieurs des statistiques qui sont réellement requises par l'algorithme de classification à l'étape ultérieure, toutes ces statistiques sont mises en cache et renvoyées dans un objet FeatureStats pour éviter leur recalcul.

6. Classe TextTokenizer

Il s'agit d'un simple classe de tokenisation de texte, responsable du prétraitement, de l'effacement et de la tokenisation des textes originaux et de leur conversion en objets Document.

Utilisation de la classe JAVA NaiveBayes

Dans la classe NaiveBayesExample, vous pouvez trouver des exemples d'utilisation de la classe NaiveBayes. La cible de l'exemple de code est de présenter un exemple qui entraîne un simple classificateur Naive Bayes afin de détecter la langue d'un texte. Pour entraîner le classificateur, nous fournissons d'abord les chemins des ensembles de données d'apprentissage dans un HashMap, puis nous chargeons leur contenu.

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

Le classificateur NaiveBayes est entraîné en lui passant les données. Une fois la formation terminée, l'objet NaiveBayesKnowledgeBase est stocké pour une utilisation ultérieure.

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

Enfin, pour utiliser le classificateur et prédire les classes de nouveaux exemples, tout ce que vous avez à faire est d'initialiser un nouveau classificateur en passant l'objet NaiveBayesKnowledgeBase que vous avez acquis précédemment par entraînement. Ensuite, en appelant simplement la méthode predict (), vous obtenez la classe prédite du 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);   

Expansions nécessaires

L'implémentation JAVA particulière ne doit pas être considérée comme une solution complète prête à l'emploi pour les problèmes de classification de texte sophistiqués. Voici quelques-unes des extensions importantes qui pourraient être réalisées:

1. Extraction de mots-clés:

Même si l'utilisation de mots-clés uniques peut être suffisante pour des problèmes simples tels que la détection de la langue, d'autres problèmes plus complexes nécessitent l'extraction de n-grammes. Ainsi, on peut soit implémenter un algorithme d'extraction de texte plus sophistiqué en mettant à jour la méthode TextTokenizer.extractKeywords (), soit utiliser Datumbox's API d'extraction de mots-clés fonction pour obtenir tous les n-grammes (combinaisons de mots clés) du document.

2. Prétraitement du texte:

Avant d'utiliser un classificateur, il est généralement nécessaire de prétraiter le document afin de supprimer les caractères / parties inutiles. Même si l'implémentation actuelle effectue un prétraitement limité à l'aide de la méthode TextTokenizer.preprocess (), lorsqu'il s'agit d'analyser des pages HTML, les choses deviennent plus délicates. On peut simplement rogner les balises HTML et ne garder que le texte brut du document ou recourir à des techniques d'apprentissage automatique plus sophistiquées qui détectent le texte principal de la page et supprimer le contenu qui appartient au pied de page, aux en-têtes, aux menus, etc. peut utiliser Datumbox API d'extraction de texte la fonction.

3. Modèles Naive Bayes supplémentaires:

Le classificateur actuel implémente le classificateur multinomial Naive Bayes, néanmoins comme nous l'avons vu dans un article précédent sur Analyse des sentiments, différents problèmes de classification nécessitent des modèles différents. Dans certains cas, une version binarisée de l'algorithme serait plus appropriée, tandis que dans d'autres, le modèle de Bernoulli fournira de bien meilleurs résultats. Utilisez cette implémentation comme point de départ et suivez les instructions du Tutoriel Naive Bayes pour étendre le modèle.

4. Méthodes de sélection des fonctionnalités supplémentaires:

Cette implémentation utilise l'algorithme de sélection de caractéristiques Chisquare pour sélectionner les caractéristiques les plus appropriées pour la classification. Comme nous l'avons vu dans un article précédent, le Sélection des fonctionnalités Chisquare La méthode est une bonne technique qui s'appuie sur les statistiques pour sélectionner les caractéristiques appropriées, mais elle tend à donner des scores plus élevés sur des caractéristiques rares qui n'apparaissent que dans l'une des catégories. Des améliorations peuvent être apportées en supprimant les fonctionnalités bruyantes / rares avant de procéder à la sélection des fonctionnalités ou en mettant en œuvre des méthodes supplémentaires telles que les informations mutuelles dont nous avons parlé dans l'article susmentionné.

5. Optimisation des performances:

Dans l'implémentation particulière, il était important d'améliorer la lisibilité du code plutôt que d'effectuer des micro-optimisations sur le code. Malgré le fait que de telles optimisations rendent le code plus laid et plus difficile à lire / maintenir, elles sont souvent nécessaires car de nombreuses boucles dans cet algorithme sont exécutées des millions de fois pendant la formation et les tests. Cette implémentation peut être un excellent point de départ pour développer votre propre version optimisée.

Presque là… Notes finales!

J'ai-entendu-il-bon-coder-lPour bien comprendre le fonctionnement de cette implémentation, il est fortement conseillé de lire les deux articles précédents sur Classificateur Naive Bayes et les Sélection de fonctionnalité. Vous obtiendrez des informations sur le contexte théorique des méthodes et cela rendra certaines parties de l'algorithme / du code plus claires.

Il faut noter que Naive Bayes en dépit d'être un moyen facile, rapide et la plupart du temps «assez précis», il est aussi «Naive» car il fait l'hypothèse d'une indépendance conditionnelle des fonctionnalités. Comme cette hypothèse n'est presque jamais satisfaite dans les problèmes de classification de texte, Naive Bayes n'est presque jamais le classificateur le plus performant. Dans API Datumbox, certaines extensions du classificateur standard Naive Bayes ne sont utilisées que pour des problèmes simples tels que la détection de langage. Pour des problèmes de classification de texte plus complexes, des techniques plus avancées telles que Classificateur Max Entropy sont nécessaires.

Si vous utilisez l'implémentation dans un projet intéressant Nous Écrire et nous présenterons votre projet sur notre blog. Aussi, si vous aimez l'article, veuillez prendre un moment et le partager sur Twitter ou Facebook. 🙂

Horodatage:

Plus de Boîte de données