Classification de texte à grande échelle

18

Je cherche à faire une classification sur mes données texte. J'ai 300 classes200 documents de formation par classe (donc 60000 documents in total) et cela est susceptible d'entraîner des données dimensionnelles très élevées (nous pouvons rechercher plus de 1 million de dimensions ).

Je voudrais effectuer les étapes suivantes dans le pipeline (juste pour vous donner une idée de mes besoins):

  1. Conversion de chaque document en vecteur d'entité ( tf-idfou vector space model)
  2. Feature selection( Mutual Informationbasé de préférence ou tout autre standard)
  3. La formation du classificateur ( SVM, Naive Bayes, Logistic Regressionou Random Forest)
  4. Prédire les données invisibles sur la base du modèle de classificateur formé.

La question est donc de savoir quels outils / framework utiliser pour gérer de telles données de grande dimension? Je connais les suspects habituels (R, WEKA ...) mais pour autant que je sache (je peux me tromper), aucun d'entre eux ne peut gérer des données aussi importantes. Existe-t-il un autre outil standard que je pourrais consulter?

Si je dois le paralléliser, dois-je regarder Apache Mahout ? Il semble qu'il ne fournisse pas encore toutes les fonctionnalités dont j'ai besoin.

Merci à tous d'avance.


Mise à jour: J'ai parcouru ce site Web , la liste de diffusion R et Internet en général. Il me semble que les problèmes suivants pourraient apparaître dans ma situation:

(1) Le prétraitement de mes données à l'aide de R ( package tm en particulier) pourrait être impossible , car tmil sera extrêmement lent.

(2) Étant donné que je devrai utiliser un ensemble de packages R (pré-traitement, matrices clairsemées, classificateurs, etc.) l'interopérabilité entre les packages pourrait devenir un problème, et je pourrais encourir un surcoût supplémentaire lors de la conversion de données d'un format à un autre . Par exemple, si je fais mon prétraitement à l'aide tm(ou d'un outil externe comme WEKA), je devrai trouver un moyen de convertir ces données sous une forme que les bibliothèques HPC dans R peuvent lire. Et encore une fois, il n'est pas clair pour moi si les packages de classificateur prendraient directement les données fournies par les bibliothèques HPC.

Suis-je sur la bonne voie? Et plus important encore, ai-je un sens?

user721975
la source
R peut gérer des ensembles de données beaucoup plus volumineux que cela, il vous suffit de faire bon usage des outils disponibles. Il n'y a aucune différence entre ce qui peut être accompli dans n'importe quel langage ou environnement majeur, bien que Weka et Mahout soient en retard par rapport à ce qui est disponible. FWIW, il s'agit d'une taille d'échantillon assez petite, et les dimensions 1M ne sont pas un gros problème, mais elles sont également excessivement statistiquement. Mes recommandations sont R ou Python, car elles sont à la fois gratuites et faciles pour les débutants. Matlab n'est pas gratuit, mais aussi bon. Cela entraîne également une grosse taxe lorsque vous utilisez beaucoup d'ordinateurs.
Iterator
1
Un point beaucoup plus important est que vous avez plus de classes que d'exemples par classe et que vous les intégrez dans un espace dimensionnel très élevé. Je ne suis pas sûr que vous obtiendrez une très bonne séparation des classes ici. Avez-vous des relations structurelles pour vos classes? Si tel est le cas, certaines de ces méthodes risquent de mal fonctionner sans ces informations.
Iterator
1
Vous pouvez utiliser la foreachbibliothèque écrire du code parallèle en R. Cela fonctionne particulièrement bien en conjonction avec des forêts aléatoires, qui sont intrinsèquement faciles à paralléliser.
Zach
2
Quelques questions: 1) Êtes-vous intéressé à comparer tous les différents types d'approches d'apprentissage que vous mentionnez, ou en avez-vous simplement besoin pour faire un travail? 2) Chaque document appartient-il à 1, 1 ou plus, ou 0 ou plus des classes? 3) Avez - vous spécifiquement souhaitez utiliser la sélection de fonction pour une raison quelconque, ou pensez-vous que c'était nécessaire? Je suis d'accord avec les autres commentaires selon lesquels il s'agit d'un problème de taille modeste par rapport aux normes actuelles, et la réduction de la dimensionnalité n'est pas nécessaire.
DavidDLewis
1
Je travaille sur la classification de texte impliquant près de 10 000 sujets (par exemple des classes ou des catégories ou tout autre terme que vous préférez). Je travaille actuellement sur le réglage de ce système de classification de texte à cette échelle. Je ne peux pas partager mes propres techniques car elles sont propriétaires, mais j'ai un petit conseil: soyez très prudent en supposant que certaines techniques suggérées évoluent à moins qu'il n'ait déjà été prouvé qu'elles le font. D'après mon expérience, très peu le font.

Réponses:

13

Cela devrait être possible pour le faire fonctionner tant que les données sont représentées comme une structure de données clairsemée telle que scipy.sparse.csr_matrix instance en Python. J'ai écrit un tutoriel pour travailler sur les données texte . Il est en outre possible de réduire davantage l'utilisation de la mémoire en tirant parti de l'astuce de hachage: l'adapter pour utiliser le HashingVectorizerau lieu du CountingVectorizerou du TfidfVectorizer. Ceci est expliqué dans la section de documentation extraction des fonctionnalités du texte .

Les forêts aléatoires sont en général beaucoup plus chères que les modèles linéaires (tels que les machines à vecteur de support linéaire et la régression logistique) et les Bayes multinomiaux ou naïfs de Bernoulli et pour la plupart des problèmes de classification de texte qui n'apportent pas une précision prédictive nettement meilleure que les modèles plus simples.

Si scikit-learn ne parvient pas à s'adapter à votre problème, Vowpal Wabbit fera (et probablement plus vite que sklearn) bien qu'il n'implémente pas tous les modèles dont vous parlez.

Modifié en avril 2015 pour refléter l'état actuel de la bibliothèque scikit-learn et pour réparer les liens rompus.

ogrisel
la source
Eh bien, le problème avec toute technique de réduction de dimension "non standard" est que vous risquez d'avoir des problèmes lorsque vous essayez de publier votre travail. Dans le domaine de la classification du texte au moins, je sais pertinemment que les examinateurs aiment voir les techniques couramment utilisées (ce qui facilite également la comparaison avec les techniques de classification existantes).
user721975
Ne vous inquiétez pas - @ogrisel n'a rien mentionné de non standard, du moins pas en ce qui concerne la classification de texte de pointe, bien que je n'aie pas encore lu ses tutoriels.
Iterator
+1 Je pense que Python est probablement une façon agréable de faire. Il existe des packages très récents dans R pour l'exploration de texte, mais si l'on a plus d'expertise en calcul que d'intérêts statistiques, Python serait ma recommandation.
Iterator
@ogrisel: Bravo pour les contributions que vous et d'autres avez apportées à Sklearn. Je l'ai recommandé à beaucoup de ceux qui travaillent en Python - l'ensemble du design est exemplaire.
Iterator
En ce qui concerne la réduction de dimension "non standard" (en utilisant des projections aléatoires) et la fonction de hachage, vérifiez l'astuce de hachage de John Langford et cette discussion sur la métaoptimisation .
ogrisel
10

Gensim pour Python est magique. Et comme il est en Python, vous pouvez l'utiliser en conjonction avec la suggestion de @ ogrisel.

Jeff
la source
1

Pas pour tirer mon propre klaxon, mais j'ai fait une série vidéo assez populaire sur l'analyse de texte avec Rapidminer. Tu peux le voir ici:

http://vancouverdata.blogspot.com/2010/11/text-analytics-with-rapidminer-loading.html

Vous pouvez probablement éviter de sélectionner des fonctionnalités, utilisez simplement un classificateur qui ne crée pas une matrice de millions * millions en mémoire :)

La régression logistique s'étouffera sur ces nombreuses dimensions. Naive Bayes prend des dimensions indépendantes, donc tout ira bien. SVM ne dépend pas du nombre de dimensions (mais du nombre de vecteurs de support) donc ça ira aussi.

300, c'est beaucoup de cours. Je commencerais avec seulement quelques-uns et continuerais votre chemin.

Neil McGuigan
la source
Excellent pointeur et conseils. Merci. Pouvez-vous expliquer ce que vous entendez par «commencer avec quelques-uns seulement et progresser»?
user721975
eh bien, au lieu de 300 classes (comme "violon, alto, violoncelle, trompette ..."), vous pouvez les reclasser en un plus petit nombre comme "cordes, cuivres".
Neil McGuigan
OK, je comprends maintenant.
user721975
1

Tout d'abord, sur la base de vos commentaires, je traiterais cela comme 300 problèmes de classification binaires (oui / non). Il existe de nombreux apprenants de classificateurs binaires open source faciles à utiliser, ce qui vous permet d'échanger du temps contre de la mémoire.

Les SVM et la régression logistique sont probablement les approches les plus populaires pour la classification de texte. Les deux peuvent facilement gérer des dimensions de 1000000, car les implémentations modernes utilisent des structures de données clairsemées et incluent des paramètres de régularisation qui évitent le sur-ajustement.

Plusieurs suites d'apprentissage automatique open source, dont WEKA et KNIME , incluent à la fois des SVM et une régression logistique. Les implémentations autonomes des SVM incluent libSVM et SVMlight . Pour la régression logistique, je vais brancher BXRtrain et BXRclassify , que j'ai développés avec Madigan, Genkin et d'autres. BXRclassify peut créer un index en mémoire de milliers de modèles de régression logistique et les appliquer simultanément.

En ce qui concerne la conversion de texte en forme vectorielle attributaire, je finis toujours par écrire un peu de Perl pour le faire à partir de zéro. :-) Mais je pense que les suites de machine learning que j'ai mentionnées incluent la tokenisation et le code de vectorisation. Une autre voie serait d'aller avec plus d'une boîte à outils en langage naturel comme LingPipe , bien que cela puisse être exagéré pour vous.

DavidDLewis
la source
+1 Bons commentaires. Si je devais faire 300 classifications oui / non, comment choisirais-je les données d'entraînement négatives pour une classe? Les données positives sont évidemment les documents qui appartiennent à la classe.
user721975
Un autre commentaire. SVM / Logistic reg peut à coup sûr gérer un million de dimensions, mais comment pourrais-je exécuter des expériences pour choisir des paramètres pour ces classificateurs? Par exemple, sur un petit ensemble de données, vous pouvez exécuter une validation croisée 10 fois pour décider des paramètres, mais quelle approche adopter pour des données aussi volumineuses afin que l'algorithme termine son exécution dans un délai raisonnable?
user721975
@ user721975: Pour une discrimination particulière, les documents positifs sont ceux avec l'étiquette X dessus et les documents négatifs sont tous les autres documents.
DavidDLewis
@ user721975: Il est difficile de donner des conseils généraux sur le temps d'exécution, car les détails varient beaucoup selon les algorithmes et les implémentations. La validation croisée 10 fois peut ne pas être impossible pour votre ensemble de données: 60000 exemples ne sont pas importants.
DavidDLewis
1
Les ensembles d'entraînement déséquilibrés ne sont pas nécessairement un problème. Mais en fait, je me rends compte qu'il y a quelque chose qui m'embrouille: puisque les documents peuvent appartenir à 0, 1 ou plusieurs classes, que voulez-vous dire par avoir 200 documents de formation par classe? Avez-vous fait quelque chose pour supprimer des documents avec 0 classes ou 2+ classes? En général, comment avez-vous généré cet ensemble de 60000 documents?
DavidDLewis
1

Depuis Sklearn 0.13 il y a en effet une implémentation du HashingVectorizer .

EDIT: Voici un exemple à part entière d'une telle application de sklearn docs

Fondamentalement, cet exemple montre que vous pouvez classer du texte sur des données qui ne peuvent pas tenir dans la mémoire principale de l'ordinateur (mais plutôt sur disque / réseau / ...).

oDDsKooL
la source