Dice Tech Jobs - Le référentiel de Dice.com pour la création d'un « moteur de recherche conceptuel », par Simon Hughes (Dice Data Scientist). Ce référentiel contient du code Python pour entraîner le modèle Word2Vec de Thomas Mikolov sur un ensemble de documents. Le résultat de ce processus peut ensuite être intégré dans Solr (ou dans un autre moteur de recherche) à l'aide de fichiers de synonymes combinés à certains plug-ins Solr pour fournir une fonctionnalité de recherche conceptuelle au sein du moteur de recherche. Le résultat pourrait également être utilisé dans d’autres moteurs de recherche, à condition qu’ils prennent en charge les fichiers de synonymes. La recherche conceptuelle est également connue sous le nom de recherche sémantique et apprend à faire correspondre les concepts d'un domaine plutôt que les mots-clés pour améliorer le rappel.
Veuillez également consulter mon dépôt « Vecteurs en recherche », qui étend ce travail. Il contient également des liens vers les diapositives et les vidéos de cette conférence.
Les scripts incluent du code pour prétraiter et tokeniser les documents, extraire des termes et expressions courants en fonction de la fréquence des documents, former un modèle word2vec à l'aide de l'implémentation gensim et regrouper les vecteurs de mots résultants à l'aide des bibliothèques de clustering de sci-kit learn. Les scripts Python génèrent un certain nombre de fichiers de synonymes Solr qui peuvent être utilisés pour activer la fonctionnalité de recherche conceptuelle dans Solr lorsqu'ils sont combinés avec certains plugins Solr de dés personnalisés.
Voir https://github.com/DiceTechJobs/SolrPlugins pour les plugins Solr permettant d'utiliser les vecteurs appris et les fichiers de synonymes dans un moteur de recherche Apache Solr.
Voir https://github.com/DiceTechJobs/SolrConfigExamples pour des exemples d'entrées de configuration Solr pour configurer la recherche conceptuelle dans Solr, y compris la configuration des plugins.
Les scripts se présentent sous la forme de notebooks Jupyter python, à exécuter dans l'ordre (1,2,3 et n'importe lequel des 4), et en tant que scripts de ligne de commande séparés (voir ci-dessous) si vous ne souhaitez pas utiliser Jupyter. Les scripts Python sont plus propres et partagent des fichiers de configuration communs avec tous les paramètres requis, et sont conçus pour être exécutés à partir du shell, ils sont donc probablement plus faciles à démarrer . Ces cahiers et scripts prétraiteront les documents et entraîneront le modèle Word2Vec. Le dossier ./Settings contient des exemples de fichiers de configuration pour chaque script, avec une description de chaque paramètre dans les commentaires. Pour appeler les scripts de ligne de commande, transmettez le fichier de configuration associé comme seul paramètre, par exemple
python pre_process_documents.py ./Settings/pre_process_documents.cfg
Les scripts de ligne de commande doivent être exécutés dans l'ordre :
pre_process_documents.py - ceci est nécessaire pour supprimer certains caractères de ponctuation (virgules, traits d'union, etc.), analyser le HTML si nécessaire et séparer les phrases du document. Si vous souhaitez ignorer cette étape et passer à l'étape 2 ou 3, fournissez un ensemble de fichiers aux étapes 2 et 3 avec toute ponctuation que vous souhaitez supprimer supprimée et avec chaque nouvelle phrase sur une ligne distincte.
extract_keywords.py - (facultatif) Si vous ne disposez pas d'un ensemble complet et complet d'expressions clés de votre domaine (par exemple, vos 5 000 principaux mots-clés et expressions de recherche, les expressions étant la partie importante) ou si vous souhaitez augmenter la couverture au-delà de cette liste, exécutez ce script pour extraire tous les mots-clés et expressions au-dessus d'un seuil de fréquence de document spécifié.
train_word2vec_model.py - Entraîne et enregistre le modèle Word2Vec sur les documents prétraités de 1. Utilise un ensemble de mots-clés et d'expressions, tels que ceux générés par 2. Veuillez noter - Ce modèle est très rapide, mais nécessite un compilateur C pour être disponible et préinstallé pour utiliser la version C sous les couvertures, sinon l'implémentation python beaucoup plus lente est utilisée. Si cette option n'est pas disponible, vous recevrez un avertissement d'exécution lors de la première formation du modèle.
Cette étape contient plusieurs fichiers en fonction de la solution souhaitée (voir mon exposé) :
Sortie vectorielle - BIENTÔT ! Voir Jupyter Notebook 4.a
generate_topn_synonyms_file.py - Génère les n premiers synonymes pour chaque mot-clé ou expression cible. Cela génère 2 fichiers, un fichier avec des charges utiles et un fichier sans. Le cas d'utilisation le plus simple consiste à utiliser le fichier sans charges utiles. De meilleures performances peuvent être obtenues en utilisant le fichier de charges utiles pour pondérer les synonymes par similarité. Cela peut être fait au moment de la requête à l’aide de l’analyseur queryboost. Notez que pour ce faire, vous devez tokeniser les virgules et les espaces au moment de la requête, car nous remplaçons les espaces par des virgules pour contourner le problème des synonymes multi-mots. Alternativement (et recommandé), utilisez l'expansion des synonymes au moment de l'indexation, avec l'analyseur de requêtes PayloadEdismax, la classe PayloadAwareDefaultSimilarity (utilisez comme similarité par défaut ou utilisez la similarité de schéma pour configurer par champ), et assurez-vous que le fieldType de ces champs contient le terme « charge utile ». ou « vecteur ».
generate_cluster_synonyms_file.py - Génère k clusters à partir des vecteurs de mots générés dans les étapes précédentes. Ceux-ci peuvent être intégrés directement dans Solr via un fichier de synonymes - aucun plugin spécial n'est nécessaire. Je recommanderais de générer un certain nombre de clusters différents de synonymes de différentes tailles et de les configurer comme des champs distincts avec des poids de champ plus élevés appliqués aux petits clusters (c'est-à-dire générés avec une valeur k plus grande).
Construit avec python 2.7.10. Non testé avec python 3
L'implémentation de Word2Vec est celle de l'excellent package gensim. Contient des implémentations rapides de LSA, LDA, Word2Vec et d'autres algorithmes d'apprentissage automatique.
https://radimrehurek.com/gensim/models/word2vec.html
Il s'agit d'un excellent package pour la modélisation de sujets et l'apprentissage des représentations sémantiques de documents et de mots.
Google a publié un ensemble de vecteurs de mots pré-entraînés, formés sur 100 milliards de mots du corpus d'actualités Google. Pour ceux d'entre vous qui ne se concentrent pas sur un domaine spécialisé mais sur un ensemble très large de documents, comme les entreprises qui créent un moteur de recherche d'actualités (comme Reuters, Bloomberg, les agences gouvernementales, etc.), vous pouvez simplement utiliser ce modèle pré-entraîné. plutôt. Ensuite, vous pouvez ignorer les 3 premières étapes et passer directement à l'utilisation de l'un des scripts de l'étape 4 ci-dessus qui utilisent un modèle pré-entraîné et calculent les fichiers de synonymes de sortie, et c'est tout ce dont vous devriez avoir besoin. Cet article décrit où obtenir les vecteurs pré-entraînés : https://groups.google.com/forum/#!topic/gensim/_XLEbmoqVCg. Vous pouvez ensuite utiliser la fonctionnalité model.load de Word2Vec de gensim :
model = Word2Vec . load ( MODEL_FILE )
Si vous utilisez le cloud Solr, Zookeeper n'aime pas que les fichiers de configuration dépassent 1 Mo. Ainsi, si vos fichiers de synonymes résultants sont plus volumineux, vous devrez soit 1) modifier les paramètres par défaut de Zookeeper, 2) diviser le fichier de synonymes en plusieurs fichiers et appliquer des filtres de synonymes dans l'ordre, ou 3) charger des synonymes à partir d'une base de données en utilisant un plugin (par exemple https://github.com/shopping24/solr-jdbc-synonyms)
Les experts en PNL de Stanford ont développé un algorithme d'apprentissage de vecteurs de mots concurrent de Word2Vec avec une précision similaire. Si vous souhaitez expérimenter cela, ce package python vous permettra de le faire : https://github.com/hans/glove.py Je n'ai cependant pas essayé cela, donc je ne peux pas en garantir pour le moment.
Les scripts initiaux attendent un dossier contenant des fichiers bruts *.txt ou html. Si vous avez du contenu HTML, il y a une logique à l'intérieur des scripts pour analyser le HTML, mais une belle soupe peut être un peu feuilletée, vous feriez donc peut-être mieux de les pré-analyser avant de les faire passer dans le pipeline. Notez qu’il n’existe pas de format de fichier spécial, ce qui semble être le problème que rencontrent la plupart des gens lorsqu’ils tentent d’exécuter ce script. S'il y a une erreur lors du chargement des fichiers, je suggère d'utiliser le script Python et non le bloc-notes et d'ouvrir le débogueur pour voir ce qui se passe. Assurez-vous également de définir config.file_mask pour qu'il corresponde aux fichiers que vous souhaitez charger, dans https://github.com/DiceTechJobs/ConceptualSearch/blob/master/Settings/pre_process_documents.cfg. La valeur par défaut est .*.txt (c'est une expression régulière et non un fichier blob), vous devrez donc modifier cela si vos fichiers ne sont pas des fichiers .txt.
Veuillez publier vos questions, bugs ou demandes de fonctionnalités dans la liste des problèmes et inclure une @mention - @simonhughes22 afin que je reçoive un e-mail en temps opportun avec vos questions. Quelques personnes m'ont envoyé un e-mail directement pour me poser des questions sur ce dépôt. Même si cela ne me dérange pas de répondre aux e-mails, veuillez plutôt soumettre un problème GitHub et me @mentionner. De cette façon, tout le monde peut voir la question et ma réponse pour référence future.
J'ai récemment donné une conférence sur Vector Search, le code est ci-dessous. Il s'agit d'une extension naturelle du travail de recherche conceptuelle que j'ai effectué
Veuillez consulter nos plugins Solr :