Comment regrouper des chaînes par thèmes communs?

10

J'essaie de regrouper, par exemple, des chaînes de programmation avec d'autres chaînes de programmation, des chaînes de physique avec d'autres chaînes de physique, etc., pour un large éventail de sujets. Malgré l'aspect linguistique théorique flagrant du problème, je cherche à le faire en utilisant la programmation / le logiciel.

Le récapitulatif: étant donné un grand nombre de chaînes, comment pourrais-je procéder pour les regrouper par thème sémantique?

L'application particulière: j'ai ~ 200k questions triviales que je voudrais classer en groupes communs (voitures, ordinateurs, politique, Canada, nourriture, Barack Obama, etc.).

Ce que j'ai examiné: Wikipédia a une liste de boîtes à outils de traitement du langage naturel (en supposant que ce que j'essaie de faire s'appelle en fait NLP), j'ai donc examiné quelques-unes, mais aucune ne semble faire quelque chose de similaire à mes besoins.

Notes: Il a été souligné que cela nécessite des connaissances supplémentaires (par exemple, une Porsche étant une voiture, C ++ étant un langage de programmation). Je suppose alors que des données de formation sont nécessaires, mais si je n'ai que la liste des questions et réponses, comment puis-je générer des données de formation? Et puis comment utiliser les données d'entraînement?

Plus de notes: Si le formatage actuel de mon aide Q&R (bien qu'il ressemble à JSON, c'est essentiellement un fichier texte brut):

// row 1: is metadata
// row 2: is a very specific kind of "category"
// row 3: is the question
// row 4: is the answer
{
  15343
  A MUSICAL PASTICHE
  Of classical music's "three B's", he was the one born in Hamburg in 1833
  Johannes Brahms
}

Mais avant que quelqu'un souligne qu'il existe déjà une catégorie, notez qu'il y a environ 200 000 questions et réponses comme celle-ci, et essentiellement autant de «catégories». J'essaie de les regrouper en groupes plus larges comme ceux énumérés ci-dessus. De plus, cette mise en forme peut être modifiée très facilement pour toutes les questions, je le fais par programmation.

Et plus de notes: je ne sais pas vraiment combien de catégories j'aurai besoin (au moins 10-20), parce que je n'ai pas lu toutes les questions moi-même. Je m'attendais en partie à ce que le nombre fini soit déterminé d'une manière ou d'une autre lors de la catégorisation. Dans tous les cas, je peux toujours créer manuellement un certain nombre de catégories.

Whymarrh
la source
Comment utilisiez-vous la carotte? D'après ma brève lecture à ce sujet, il semble qu'il devrait facilement gérer les enregistrements de 200k.
Cela a juste pris beaucoup plus de temps que je ne le pensais et m'a forcé à augmenter l'allocation de mémoire initiale de la JVM à 1024 m et la mémoire maximale à 2048 m. Ce n'était pas aussi mauvais que j'aurais pu faire ce son.
Vous avez juste besoin de suffisamment de données de formation, puis vous devriez pouvoir classer les questions dans ces catégories. Une approche entièrement automatique finira probablement par les regrouper par d'autres moyens, par exemple des questions contenant le mot "voiture". Vous ne pouvez pas apprendre de synonymes en même temps que la création d'un regroupement.
A QUIT - Anony-Mousse
Eh, vous faites un traitement en vrac; donner la JVM n'est pas vraiment un problème. Combien de temps at-il fallu? D'où chargiez-vous les documents? Une source personnalisée?
J'ai pris peut-être 10 minutes, mais je suis d'accord, le traitement en masse est par définition long et gourmand en mémoire. Bien que tout ce bruit à propos de l'étouffement n'était pas le problème, plus une note secondaire.

Réponses:

4

Il s'agit d'un problème assez standard en PNL, et les mots magiques de Google que vous recherchez sont la "modélisation de sujet". Bien que vos chaînes soient assez courtes, vous pouvez avoir un certain succès avec l' allocation de Dirichlet latente ou une méthode similaire. Il y a un joli billet de blog par Edwin Chen ici , qui expose l'idée générale derrière l'algorithme. Les détails de la mise en œuvre sont couverts dans cette note par Yi Wang.

Si vous recherchez une solution topicmodelsstandard , je recommande d'essayer le package pour R, car cela fournit une interface raisonnablement agréable à la fois à LDA et à un modèle de sujet corrélé plus sophistiqué. Il y a aussi une bonne liste d'implémentations maintenues par David Mimno ici .

Martin O'Leary
la source
Merci, le billet de blog de Chen semble être à la hauteur de ce que j'essaie de faire. Y a-t-il une chance que vous ayez utilisé ce que vous avez énuméré / fait auparavant? Je suis sur un terrain complètement nouveau ici et j'apprécierais une procédure pas à pas de ce que je devrais faire (en utilisant l'une des solutions standard). Comment dois-je formater mes "documents"? Dois-je appliquer des identifiants à chaque Q&R pour me permettre d'identifier quel document se trouve dans quel groupe? Comment utiliser les données générées? Comme je l'ai dit, je ne comprends pas beaucoup de détails.
Whymarrh
J'ai beaucoup utilisé le package R topicmodels. Je le recommanderais certainement plutôt que de rouler votre propre code - il y a de la documentation avec un exemple fonctionnel sur cran.r-project.org/web/packages/topicmodels/vignettes/… . La mise en forme spécifique de chaque document n'a pas vraiment d'importance, car tout sera de toute façon réduit à une représentation "sac de mots". Jetez simplement tout le texte associé dans une seule chaîne.
Martin O'Leary
4

Vous essayez de résoudre deux problèmes ici.

Problème 1: catégorisez les chaînes de questions dans la catégorie appropriée.

Problème 2: Créez des catégories appropriées.

Le premier problème pourrait être fait par des algorithmes dits supervisés, de nombreux classificateurs peuvent donner une très bonne précision et des performances. Cependant, le problème 2, la création de catégories à partir de rien (tonnes de données), est beaucoup plus délicat. Il s'agit d'un problème non supervisé, étant donné de nombreuses données, l'ordinateur décide de manière autonome des catégories en fonction de certains critères. Idéalement, ces critères et l'algorithme devraient organiser soigneusement vos données en grappes. Ceux-ci pourraient alors être étiquetés. Cependant, comme il s'agit d'une tâche beaucoup plus difficile, je dirais qu'il n'y a pas de solution acceptable ici qui donnera un bon résultat sans beaucoup d'efforts de réglage qui nécessiteraient très probablement des experts.

Donc, je crains qu'il n'y ait pas encore de bouton magique ici. Ce que vous pouvez cependant faire, c'est aider un peu la machine. Par exemple, vous pouvez décider de l'ensemble de catégories. Lorsque vous avez décidé des catégories, vous pouvez créer des données d'entraînement. Dans cette configuration, les données d'entraînement ne sont que des questions et des paires de catégories correctes.

Plus il y a de données d'entraînement, mieux c'est. Cependant, comme la tâche consiste toujours à quelque chose automatiquement, cela n'a pas de sens au début de commencer à faire les choses manuellement. Maintenant, pourquoi voudriez-vous avoir des données d'entraînement? Évaluation de la précision. Si vous voulez de bons résultats, il est essentiel que vous puissiez effectuer une sorte d'évaluation sur la qualité d'une configuration. Et la seule façon de le faire de manière quelque peu systématique est d'étiqueter manuellement certaines questiosn vous-même. Sinon, vous êtes aveugle.

Ensuite, de nouvelles questions se posent. Premièrement: de combien de données d'entraînement ai-je besoin? "Ça dépend". Sans avoir vu vos données ou catégories, je ne suis même pas sûr que je devinerais même; mais je peux prendre une "estimation approximative" et dire environ 500 questions. Notez que je pourrais être décalé d'un ordre de grandeur.

Cela signifie-t-il vraiment que vous devez marquer 500 questions à la main? Oui et non. Il est possible d'utiliser des résultats intermédiaires et un peu d'intelligence pour les classificateurs "bootstrap". Il s'agit toujours d'un travail manuel, et quand vous y réfléchissez, 500 questions ne prendront pas autant de temps à marquer. Être intelligent ici peut rapidement donner de moins bons résultats qu'être industrieux.

Lorsque vous disposez de données d'entraînement en quantité suffisante, prenez-en 75% et créez un classificateur à l'aide de votre outil préféré (par exemple ceux mentionnés ici ou autre chose). Maintenant, laissez le classificateur essayer d'étiqueter les 25% des données retenues et de mesurer la précision résultante. Si le résultat est bon, alors pop champagne. Sinon, faites plus de données d'entraînement ou essayez un autre classificateur.

TL; DR

Pour résumer, voici comment je l'aurais fait.

0) Use a supervised learner.
1) Create a category set yourself. 
2) Label manually about 500 questions
3) Use 75% of those to train a classifier.
4) Check performance.
5) If good then cheers else goto 2.

la source
Une petite question: vous dites "environ 500 questions" pour les données de formation et pour les étiqueter manuellement, mais aussi "je pourrais être décalé d'un ordre de grandeur", donc si je devais utiliser 5 000 ou 50 000 questions à la place, serais-je encore marquer manuellement ce nombre?
La chose est; sans avoir vu vos données ni avoir une idée très claire de tous les moindres détails de votre projet, il est difficile de donner une bonne estimation. Cependant, et il est important de s'en souvenir, si le 500 est beaucoup trop bas, l'effort de marquage n'a pas été gaspillé. Vous avez toujours besoin de questions étiquetées manuellement pour l'évaluation. Plus vous avez de données d'évaluation, meilleures sont les évaluations que vous pouvez faire.
Par un ordre de grandeur, je voulais dire 50-500-5000. Je ne pense pas que vous aurez besoin de classer 50k. C'est 1/4 de votre corpus entier! Si 500 questions sont beaucoup trop basses, il est possible d'amorcer des classificateurs. L'idée ici est que vous entraînez le classifieur sur un petit corpus initial (par exemple votre 500), puis étiquetez le reste. Maintenant, vous pouvez utiliser certains des cas où le classificateur était très confiant pour recycler un nouveau classificateur plus grand.
Une autre chose importante à garder à l'esprit; la performance de nombreux classificateurs n'est pas linéaire dans la quantité de données d'apprentissage, mais sera généralement une courbe de type sigmoïde. Cela signifie que 500 autres questions balisées pourraient représenter un avantage presque aussi bon que 5 000. Mon conseil est de travailler par petites étapes.
Quels détails fourniraient un aperçu supplémentaire de mon projet? Je peux partager quelques exemples de questions pour montrer ma mise en forme, mais je suis prêt à adapter le format de mes Q & As pour s'adapter au processus de catégorisation. J'apprécie l'aide.