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.
la source
Réponses:
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
topicmodels
standard , 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 .la source
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.
la source