Trouvons-le à partir de zéro. La classification (également connue sous le nom de catégorisation) est un exemple d' apprentissage supervisé . En apprentissage supervisé, vous avez:
- modèle - quelque chose qui se rapproche de la structure interne de vos données, vous permettant de raisonner à ce sujet et de faire des prédictions utiles (par exemple prédire la classe d'un objet); normalement le modèle a des paramètres que vous voulez "apprendre"
- formation et test des jeux de données - ensembles d'objets que vous utilisez pour former votre modèle (trouver de bonnes valeurs pour les paramètres) et évaluer plus en détail
- algorithmes de formation et de classification - décrit d'abord comment apprendre le modèle à partir d'un ensemble de données de formation, le second montre comment dériver la classe d'un nouvel objet à partir d'un modèle formé
Prenons maintenant un cas simple de classification des spams. Votre jeu de données de formation est un corpus d'e-mails + étiquettes correspondantes - "spam" ou "non spam". Le jeu de données de test a la même structure, mais fait à partir de quelques e-mails indépendants (normalement on divise simplement son jeu de données et en fait, disons, 9/10 pour être utilisé pour la formation et 1/10 - pour le test). Une façon de modéliser les e-mails consiste à représenter chacun d'eux comme un ensemble (sac) de mots. Si nous supposons que les mots sont indépendants les uns des autres, nous pouvons utiliser le classificateur Naive Bayes , c'est-à-dire calculer les probabilités antérieures pour chaque mot et chaque classe (algorithme d'apprentissage), puis appliquer le théorème de Bayes pour trouver la probabilité postérieure d'appartenance à un nouveau document. classe particulière.
Donc, fondamentalement, nous avons:
raw model + training set + training algorithm -> trained model
trained model + classification algorithm + new object -> object label
Notez maintenant que nous avons représenté nos objets (documents) comme un sac de mots. Mais est-ce le seul moyen? En fait, nous pouvons extraire beaucoup plus de texte brut. Par exemple, au lieu de mots tels quels , nous pouvons utiliser leurs tiges ou lemmes , jeter des mots vides , ajouter des balises POS de mots, extraire des entités nommées ou même explorer la structure HTML du document. En fait, une représentation plus générale d'un document (et, en général, de n'importe quel objet) est un vecteur caractéristique . Par exemple pour le texte:
actor, analogue, bad, burn, ..., NOUN, VERB, ADJ, ..., in_bold, ... | label
0, 0, 1, 1, ..., 5, 7, 2, ..., 2, ... | not spam
0, 1, 0, 0, ..., 3, 12, 10, ..., 0, ... | spam
Voici la première ligne est une liste des fonctionnalités possibles et les lignes suivantes montrent combien de fois cette fonctionnalité se produit dans un document. Par exemple, dans le premier document, il n'y a aucune occurrence du mot "acteur", 1 occurrence du mot "burn", 5 noms, 2 adjectifs et 2 morceaux de texte en gras. La dernière colonne correspond à une étiquette de classe résultante.
En utilisant le vecteur de fonction, vous pouvez incorporer toutes les propriétés de vos textes. Bien que trouver un bon ensemble de fonctionnalités puisse prendre un certain temps.
Et qu'en est-il du modèle et des algorithmes? Sommes-nous liés à Naive Bayes. Pas du tout. régression logistique , SVM , arbres de décision - pour ne citer que quelques classificateurs populaires. (Notez que nous disons "classificateur" dans la plupart des cas, nous entendons modèle + algorithmes correspondants pour la formation et la classification).
Quant à la mise en œuvre, vous pouvez diviser la tâche en 2 parties:
- Extraction de fonctionnalités - transformation de textes bruts en vecteurs de fonctionnalités.
- Classification d'objets - construction et application d'un modèle.
Le premier point est bien élaboré dans de nombreuses bibliothèques PNL . La seconde concerne l'apprentissage automatique, donc, selon votre jeu de données, vous pouvez utiliser Weka ou MLlib .
La modélisation de sujets serait une méthode très appropriée à votre problème. Les modèles de sujet sont une forme d'apprentissage / découverte non supervisée, où un nombre spécifié (ou découvert) de sujets est défini par une liste de mots qui ont une forte probabilité d'apparaître ensemble. Dans une étape distincte, vous pouvez étiqueter chaque sujet en utilisant des experts en la matière, mais pour vos besoins, cela n'est pas nécessaire car vous ne souhaitez accéder qu'à trois clusters.
Vous traitez chaque document comme un sac de mots, et prétraitez pour supprimer les mots vides, etc. Avec les méthodes les plus simples, vous spécifiez au préalable le nombre de sujets. Dans votre cas, vous pouvez soit spécifier "3", qui est votre limite fixe de catégories, soit choisir un plus grand nombre de sujets (entre 10 et 100), puis dans une étape distincte, former trois groupes de documents avec une emphase commune sur les sujets. K-means ou d'autres méthodes de regroupement pourraient être utilisées. (Je recommanderais cette dernière approche)
Vous n'avez pas besoin de coder le logiciel de modélisation de sujet à partir de zéro. Voici une page Web avec de nombreuses ressources, y compris des bibliothèques / packages logiciels .
Aucun n'est en Java, mais il existe des moyens d'exécuter C ++ et Python sous Java.
la source
Voici quelques très bons progiciels open source pour la classification de texte qui devraient vous aider à démarrer:
la source