[PYTHON] J'ai essayé Learning-to-Rank avec Elasticsearch!

Cet article est l'article du 21e jour de Just a Group AdventCalendar 2019.

introduction

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

Qu'est-ce que l'apprentissage du classement?

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.

Environnement

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!

Préparation des données et de la bibliothèque

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.

Préparer l'environnement pour 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.

Déployer le modèle sur Elasticsearch

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é.

Prétraitement

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.

Génération de 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échargement de modèle

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.

Rechercher

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! !!

Résumé

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

J'ai essayé Learning-to-Rank avec Elasticsearch!
J'ai essayé de gratter avec Python
J'ai essayé le clustering avec PyCaret
J'ai essayé gRPC avec Python
J'ai essayé de gratter avec du python
J'ai essayé l'apprentissage automatique avec liblinear
J'ai essayé webScraping avec python.
J'ai essayé de déplacer de la nourriture avec SinGAN
J'ai essayé d'implémenter DeepPose avec PyTorch
J'ai essayé la détection de visage avec MTCNN
J'ai essayé d'exécuter prolog avec python 3.8.2.
J'ai essayé la communication SMTP avec Python
J'ai essayé la génération de phrases avec GPT-2
J'ai essayé d'apprendre LightGBM avec Yellowbrick
J'ai essayé la reconnaissance faciale avec OpenCV
J'ai essayé l'analyse de régression multiple avec régression polypoly
J'ai essayé d'envoyer un SMS avec Twilio
J'ai essayé d'utiliser Amazon SQS avec django-celery
J'ai essayé d'implémenter Autoencoder avec TensorFlow
J'ai essayé linebot avec flacon (anaconda) + heroku
J'ai essayé de visualiser AutoEncoder avec TensorFlow
J'ai essayé de gratter
J'ai essayé de commencer avec Hy
J'ai essayé PyQ
J'ai essayé d'utiliser du sélénium avec du chrome sans tête
J'ai essayé l'analyse factorielle avec des données Titanic!
J'ai essayé d'apprendre avec le Titanic de Kaggle (kaggle②)
J'ai essayé le rendu non réaliste avec Python + opencv
J'ai essayé AutoKeras
J'ai essayé un langage fonctionnel avec Python
J'ai essayé la récurrence avec Python ② (séquence de nombres Fibonatch)
J'ai essayé d'implémenter DeepPose avec PyTorch PartⅡ
J'ai essayé le moulin à papier
J'ai essayé d'implémenter CVAE avec PyTorch
J'ai essayé de jouer avec l'image avec Pillow
J'ai essayé de résoudre TSP avec QAOA
J'ai essayé la reconnaissance d'image simple avec Jupyter
J'ai essayé le réglage fin de CNN avec Resnet
J'ai essayé django-slack
J'ai essayé le traitement du langage naturel avec des transformateurs.
J'ai essayé Django
J'ai essayé spleeter
J'ai essayé cgo
# J'ai essayé quelque chose comme Vlookup avec Python # 2
J'ai essayé la reconnaissance manuscrite des caractères des runes avec scikit-learn
J'ai essayé de prédire l'année prochaine avec l'IA
J'ai essayé de "lisser" l'image avec Python + OpenCV
J'ai essayé des centaines de millions de SQLite avec python
J'ai essayé d'implémenter la lecture de Dataset avec PyTorch
J'ai essayé la reconnaissance d'image de CIFAR-10 avec Keras-Learning-
J'ai essayé d'apprendre le fonctionnement logique avec TF Learn
J'ai essayé de déplacer GAN (mnist) avec keras
J'ai essayé de "différencier" l'image avec Python + OpenCV
J'ai essayé la reconnaissance d'image de CIFAR-10 avec la reconnaissance d'image Keras-
J'ai essayé "License OCR" avec l'API Google Vision
J'ai essayé de sauvegarder les données avec discorde