Classification de texte non structurée

12

Je vais classer les documents texte non structurés, à savoir les sites Web de structure inconnue. Le nombre de classes auxquelles je classe est limité (à ce stade, je pense qu'il n'y en a pas plus de trois). Quelqu'un at-il une suggestion sur la façon dont je pourrais commencer?

L'approche «sac de mots» est-elle réalisable ici? Plus tard, je pourrais ajouter une autre étape de classification basée sur la structure du document (peut-être des arbres de décision).

Je connais un peu Mahout et Hadoop, je préfère donc les solutions basées sur Java. Si nécessaire, je peux passer au moteur Scala et / ou Spark (la bibliothèque ML).

Grzegorz E.
la source

Réponses:

14

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:

  1. Extraction de fonctionnalités - transformation de textes bruts en vecteurs de fonctionnalités.
  2. 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 .

ami
la source
L'affiche originale utilisait le mot «classer» mais «cluster» est une description plus précise de son problème car il n'a pas de définitions a priori des catégories. Par conséquent, ce n'est pas nécessairement un problème d'apprentissage supervisé.
MrMeritology
@MrMeritology: hmm, du contexte, je dirais que l'auteur n'est tout simplement pas sûr des classes concrètes qu'il va utiliser, mais qu'il veut toujours une classification, pas un clustering. Quoi qu'il en soit, il est la seule personne qui connaît la vérité :)
ffriend
Peut-être que je n'étais pas clair sur le point. Les catégories vont être sélectionnées dans les conseils, il s'agit donc plutôt d'un problème de classification que de regroupement. L'idée de créer un vecteur d'entités complexes semble tout à fait raisonnable - en particulier, qu'il existe des balises particulières, qui sont très probablement susceptibles de classer rapidement certains des échantillons. Je ne sais pas si SVM va s'adapter au problème, car je prédis des non-linéarités élevées, mais les arbres de décision et Bayes semblent être applicables. Je commence également à réfléchir à l'application d'un algorithme hybride (arbres de décision basés sur SVM).
Grzegorz E.
@GrzegorzE. - Si vos catégories sont définies à l'avance, veuillez énumérer ces trois catégories dans votre question. À mon avis, vous êtes trop concentré sur les algorithmes ML et pas assez sur la nature de votre problème et la nature de vos données. Par exemple, vous prédisez des «non-linéarités» dans les fonctionnalités de sites Web de structure inconnue. Pourquoi? En outre, vous mélangez des balises avec du texte de page Web avec qui-sait-quoi-d'autre, et elles ont une signification sémantique différente.
MrMeritology
@GrzegorzE. - Je suggère fortement que votre méthode de classification soit principalement motivée par la nature de vos catégories a priori et la nature des données. Il existe un nombre infini de façons de classer les sites Web arbitraires en 3 catégories. Chaque façon de catégoriser suggérera des caractéristiques saillantes dans les données ou des modèles saillants. Rien ne remplace l'analyse manuelle des éléments de données individuels (pages Web) et de leur contexte.
MrMeritology
5

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.

MrMeritology
la source
4

Voici quelques très bons progiciels open source pour la classification de texte qui devraient vous aider à démarrer:

  • MALLET est une boîte à outils d'apprentissage automatique basée sur Java sous licence CPL conçue par UMass pour travailler avec des données texte. Il comprend des implémentations de plusieurs algorithmes de classification (par exemple, Bayes naïfs, entropie maximale, arbres de décision).
  • Le classificateur Stanford du groupe Stanford NLP est une implémentation Java sous licence GPL d'un classificateur d'entropie maximale conçu pour fonctionner avec des données texte.
Charlie Greenbacker
la source