Cet article est l'article du 21e jour de Just a Group AdventCalendar 2019.
La veille du jour de la prise en charge, on m'a dit: "Je veux faire du Learning-to-Rank avec Elasticsearch, alors veuillez résumer la procédure de création de l'environnement et comment l'utiliser. Yoropiko!", Donc cette fois je vais vous expliquer la procédure de construction d'Elasticsearch avec Learning-to-Rank. Je vais vous montrer comment l'utiliser.
Celui créé cette fois est ici
L'apprentissage du classement dans les moteurs de recherche est une technique qui utilise l'apprentissage automatique et les données à rechercher pour améliorer l'ordre de classement des résultats de recherche. Aussi appelé apprentissage séquentiel ou apprentissage par classement.
Cette fois, j'utiliserai le [plugin d'apprentissage au classement] d'Elasticsearch (https://github.com/o19s/elasticsearch-learning-to-rank). J'aimerais faire l'expérience d'une amélioration du classement à l'aide de la démo dans le référentiel d'apprentissage au classement.
Pour essayer la démo, créez à l'avance l'environnement suivant.
Construire un Elasticsearch branché est facile avec l'image docker.
Vous trouverez ci-dessous un exemple de l'image fixe Elasticsearch avec apprentissage du classement
FROM elasticsearch:7.4.1
RUN bin/elasticsearch-plugin install -b http://es-learn-to-rank.labs.o19s.com/ltr-1.1.2-es7.4.1.zip
Après avoir créé l'environnement, clonez le référentiel Learning-to-Rank et déplacez-le vers le répertoire de démonstration.
$ git clone https://github.com/o19s/elasticsearch-learning-to-rank.git
$ cd elasticsearch-learning-to-rank/demo
Après vous être déplacé vers le répertoire de démonstration, exécutez les scripts pour faire l'expérience de l'apprentissage au rang!
Exécutez prepare.py pour télécharger la bibliothèque (Ranklib) qui crée les données de recherche et le modèle d'entraînement.
$ python prepare.py
Une fois exécutés, les données du film (tmdb.json) et la bibliothèque d'apprentissage du classement (RankLibPlus-0.1.0.jar) seront téléchargées. (Notez que tmdb.json est volumineux et prend beaucoup de temps à télécharger!) Une fois le téléchargement terminé, préparez l'environnement Elasticsearch.
Lancez Elasticsearch avec le plug-in Learning-to-Rank et remplissez-le. Après avoir démarré Elasticsearch, exécutez index_ml_tmdb.py pour définir l'index et insérer des données. Exécutez le script suivant pour insérer tmdb.json dans Elasticsearch.
$ python index_ml_tmdb.py
Après avoir défini l'index et inséré les données, l'étape suivante consiste à définir la requête de conversion de fonctionnalité à utiliser pour l'apprentissage. Exécutez le script suivant pour définir le champ utilisé pour la formation. (Voir demo / 1.json et demo / 2.json pour les champs à définir. Dans la démo, les scores de recherche du titre et de l'aperçu sont définis comme des fonctionnalités.)
$ python load_features.py
Lorsque le champ est prêt à convertir les données en entité, il est temps de le modéliser.
Exécutez train.py pour créer un modèle et le déployer sur Elasticsearch.
$ python train.py
Dans train.py, le traitement suivant est effectué.
En démo, apprenez sample_judgements.txt pour améliorer le classement des résultats de recherche. .. sample_judgements.txt représente les résultats de la recherche (# 7555 Rambo, # 1370 Rambo III, ...) pour la requête de recherche (qid), et la valeur d'évaluation (note) est définie pour chaque paire de requête de recherche et de résultat de recherche. Je vais. Dans la démo, il existe trois types de requêtes:
# qid:1: rambo
# qid:2: rocky
# qid:3: bullwinkle
Définissez une note pour les résultats de la recherche pour chaque requête. (Plus le nombre est élevé mieux c'est.)
# grade (0-4) queryid docId title
4 qid:1 # 7555 Rambo
3 qid:1 # 1370 Rambo III
3 qid:1 # 1369 Rambo: First Blood Part II
3 qid:1 # 1368 First Blood
0 qid:1 # 136278 Blood
0 qid:1 # 102947 First Daughter
0 qid:1 # 13969 First Daughter
0 qid:1 # 61645 First Love
0 qid:1 # 14423 First Sunday
0 qid:1 # 54156 First Desires
4 qid:2 # 1366 Rocky
3 qid:2 # 1246 Rocky Balboa
3 qid:2 # 60375 Rocky VI
3 qid:2 # 1371 Rocky III
3 qid:2 # 1375 Rocky V
3 qid:2 # 1374 Rocky IV
0 qid:2 # 110123 Incredible Rocky Mountain Race
0 qid:2 # 17711 The Adventures of Rocky & Bullwinkle
0 qid:2 # 36685 The Rocky Horror Picture Show
4 qid:3 # 17711 The Adventures of Rocky & Bullwinkle
0 qid:3 # 1246 Rocky Balboa
0 qid:3 # 60375 Rocky VI
0 qid:3 # 1371 Rocky III
0 qid:3 # 1375 Rocky V
0 qid:3 # 1374 Rocky IV
Si vous convertissez ces données au Format Ranklib, vous obtiendrez les données suivantes.
4 qid:1 1:12.318474 2:10.573917 # 7555 rambo
3 qid:1 1:10.357875 2:11.950391 # 1370 rambo
3 qid:1 1:7.010513 2:11.220095 # 1369 rambo
3 qid:1 1:0.0 2:11.220095 # 1368 rambo
0 qid:1 1:0.0 2:0.0 # 136278 rambo
0 qid:1 1:0.0 2:0.0 # 102947 rambo
0 qid:1 1:0.0 2:0.0 # 13969 rambo
0 qid:1 1:0.0 2:0.0 # 61645 rambo
0 qid:1 1:0.0 2:0.0 # 14423 rambo
0 qid:1 1:0.0 2:0.0 # 54156 rambo
4 qid:2 1:10.686391 2:8.814846 # 1366 rocky
3 qid:2 1:8.985554 2:9.984511 # 1246 rocky
3 qid:2 1:8.985554 2:8.067703 # 60375 rocky
3 qid:2 1:8.985554 2:5.660549 # 1371 rocky
3 qid:2 1:8.985554 2:7.300772 # 1375 rocky
3 qid:2 1:8.985554 2:8.814846 # 1374 rocky
0 qid:2 1:6.815921 2:0.0 # 110123 rocky
0 qid:2 1:6.0816855 2:8.725066 # 17711 rocky
0 qid:2 1:6.0816855 2:5.9764795 # 36685 rocky
4 qid:3 1:7.6720834 2:12.722421 # 17711 bullwinkle
0 qid:3 1:0.0 2:0.0 # 1246 bullwinkle
0 qid:3 1:0.0 2:0.0 # 60375 bullwinkle
0 qid:3 1:0.0 2:0.0 # 1371 bullwinkle
0 qid:3 1:0.0 2:0.0 # 1375 bullwinkle
0 qid:3 1:0.0 2:0.0 # 1374 bullwinkle
Nous utiliserons ces données pour créer un modèle.
Créez un modèle. La démo générera le modèle suivant:
(Les détails de chaque modèle seront omis cette fois.)
Téléchargez le modèle sur Elasticsearch. Téléchargez le modèle généré par la demande de publication. Voici un exemple.
POST _ltr/_featureset/movie_features/_createmodel
{
"model": {
"name": "test_9",
"model": {
"type": "model/ranklib",
"definition": "## Linear Regression\n## Lambda = 1.0E-10\n0:0.2943936467995844 1:0.2943936467995844 2:0.12167703031808977"
}
}
}
Lors de la recherche à l'aide du modèle téléchargé, spécifiez model.name.
Cherchons et expérimentons l'amélioration des résultats de recherche par Learning-to-Rank! Lorsque vous exécutez search.py, vous obtiendrez les résultats de recherche suivants:
$ python search.py Rambo
{"query": {"multi_match": {"query": "Rambo", "fields": ["title", "overview"]}}, "rescore": {"query": {"rescore_query": {"sltr": {"params": {"keywords": "Rambo"}, "model": "test_6"}}}}}
Rambo
Rambo III
Rambo: First Blood Part II
First Blood
In the Line of Duty: The F.B.I. Murders
Son of Rambow
Spud
$
Comme il est difficile à comprendre, j'ai préparé le résultat de la comparaison avec / sans apprentissage du classement. Les résultats suivants sont obtenus pour chacun.
## search with learning-to-rank
1 Rambo
2 Rambo III
3 Rambo: First Blood Part II
4 First Blood
5 In the Line of Duty: The F.B.I. Murders
6 Son of Rambow
7 Spud
## search without learning-to-rank
1 Rambo
2 Rambo III
3 First Blood
4 Rambo: First Blood Part II
5 In the Line of Duty: The F.B.I. Murders
6 Son of Rambow
7 Spud
Les résultats d'apprentissage sont reflétés! !!
Cette fois, j'ai présenté la procédure pour essayer l'apprentissage du classement avec Elasticsearch et reflété l'apprentissage du classement dans le moteur de recherche. Nous avons mis en place un Repository afin que vous puissiez facilement essayer la bibliothèque utilisée cette fois-ci, nous vous serions reconnaissants si vous pouviez l'utiliser. Aussi, dans cet article, j'ai présenté la procédure d'exécution, mais si j'en ai une chance, j'aimerais vous présenter chaque logique d'Apprentissage au Rang et les détails du mécanisme de la bibliothèque utilisée cette fois.
Recommended Posts