Il y a beaucoup de travail à faire concernant les mécanismes d’entraînement, etc. Avez-vous un aperçu des mécanismes par lesquels vous effectueriez cet entraînement ? Quels modèles exacts recommanderiez-vous d’utiliser ?
Les outils actuels utilisés par mon équipe proviennent de gensim. Il dispose d’une interface standard module Python. Il a été assez bien testé depuis de nombreuses années.
La configuration qui me vient à l’esprit serait la suivante :
- Premièrement : choisir un ensemble de documents : cela pourrait être l’ensemble des racines de sujets, ou l’ensemble des messages.
De temps en temps (par exemple, une fois par semaine ? une fois par mois ? selon le trafic du forum), construisez le modèle doc2vec :
- Scrappez les sujets Discourse dans un fichier (ou plusieurs fichiers) de texte md, titre + corps du sujet. Considérez maintenant chaque sujet comme un document, ou « document », pour les algorithmes Gensim.
- Exécutez des outils NLP standards pour traiter les documents, effectuer la mise à la racine des mots, etc.
- Utilisez
doc2vec (de l’implémentation Gensim) pour construire un modèle qui mappe chaque document dans un vecteur dans un espace de dimension d. Vous devez choisir le paramètre méta d par expérimentation ; Google utilise d=40 pour ses modèles de brevets ; je ne suis pas sûr de la valeur de d utilisée par Google Scholar. J’utilise généralement d=200. Chaque dimension de l’espace peut être considérée comme une « caractéristique » liée au contenu sémantique.
- (À titre d’information : l’algorithme doc2vec construit l’espace de caractéristiques en entraînant un réseau de neurones ciblé pour apprendre les séquences de mots ; le réseau de neurones possède une couche cachée de dimension d ; les sorties de la couche cachée forment l’espace latent de caractéristiques)
- La construction du modèle est la tâche la plus lourde, selon le nombre de documents que vous avez. 38 ans de brevets = 5 millions de documents ; le modèle doc2vec prend toute une nuit sur une vieille machine à 8 cœurs.
- Tâche supplémentaire intéressante (optionnelle) : regrouper le nuage de documents dans l’espace de caractéristiques de dimension d.
- Des outils prêts à l’emploi pour le regroupement, par exemple de la bibliothèque Python sklearn, peuvent être utilisés.
- Le regroupement fournit une classification émergente ; des questions de recherche intéressantes incluent la manière dont ces classifications se chevauchent avec les catégories de mots-clés (ou de tags Discourse).
Cela se déroulerait hors ligne. Ensuite, en ligne :
- Le modèle serait chargé.
- Une fois le modèle chargé, une tâche plutôt légère consiste à analyser un nouveau document et à interroger le modèle pour obtenir sa position dans l’espace de caractéristiques de dimension d.
- Notez que ce nouveau document ne déclenchera pas une reconstruction du modèle. Le modèle restera statique pour les requêtes en ligne. Le nouveau document sera intégré lors de la prochaine construction du modèle (par exemple, hebdomadaire).
- Enfin, la dernière tâche légère consiste à demander quels sont les documents voisins dans l’espace de caractéristiques. Il existe des outils Gensim pour obtenir une liste de documents voisins, mais vous pouvez également utiliser numpy directement pour charger tous les vecteurs de documents dans une structure comme un arbre kd qui permet une requête rapide des points voisins directement.
Que se passe-t-il lorsqu’un sujet compte 100 messages ? 1000 messages ?
La partie hors ligne évolue plus ou moins linéairement avec le nombre de documents, mais devrait être très gérable pour 10 000 à 100 000 documents. Même 1 million de documents est acceptable pour un traitement par lots hebdomadaire.
Qu’utiliseriez-vous comme signal, et quelle force donneriez-vous à chaque élément (vues/catégorie/tag, etc.) ?
Dans ce contexte, la « force du signal » pour un nouveau sujet est directement interprétée comme la distance (inverse) entre l’incrustation de l’espace vectoriel du nouveau sujet et les vecteurs de documents existants. On pourrait habiller ce signal avec d’autres considérations (likes, vues, etc.), mais ce sont des fioritures supplémentaires par rapport à l’algorithme de base que je décris.
Une fois que moi (ou quelqu’un d’autre) aura fait fonctionner le scraping, la partie hors ligne décrite ci-dessus est assez simple et mécanique.
La partie difficile (pour moi) serait la partie en ligne, qui nécessiterait une interface entre Rails Discourse et quelques appels Python (par exemple, vers les outils Gensim). Tout exemple de ce type d’interface serait utile pour que je puisse l’examiner.