[PYTHON] Ich habe versucht, mit Elasticsearch Ranking zu lernen!

Dieser Artikel ist der 21. Tagesartikel von Just a Group AdventCalendar 2019.

Einführung

Am Tag vor dem verantwortlichen Tag wurde mir gesagt: "Ich möchte mit Elasticsearch Ranking lernen, also fassen Sie bitte das Verfahren zum Erstellen der Umgebung und deren Verwendung zusammen. Yoropiko!". Dieses Mal werde ich das Verfahren zum Erstellen von Elasticsearch mit Learning-to-Rank erläutern. Ich werde Ihnen zeigen, wie man es benutzt.

Die diesmal erstellte ist hier

Was ist Learning-to-Rank?

Das Ranking-Lernen in Suchmaschinen ist eine Technik, bei der maschinelles Lernen und die zu durchsuchenden Daten verwendet werden, um die Rangfolge der Suchergebnisse zu verbessern. Wird auch als sequentielles Lernen oder Ranking-Lernen bezeichnet.

Dieses Mal werde ich das [Learning-to-Rank-Plugin] von Elasticsearch verwenden (https://github.com/o19s/elasticsearch-learning-to-rank). Ich würde gerne eine Verbesserung des Rankings mithilfe der Demo im Learning-to-Rank-Repository erleben.

Umgebung

Erstellen Sie die folgende Umgebung im Voraus, um die Demo zu testen.

Mit dem Docker-Image ist das Erstellen einer angeschlossenen Elasticsearch ganz einfach.

Unten finden Sie ein Beispiel für Elasticsearch mit dem Docker-Bild "Learning-to-Rank"

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

Klonen Sie nach dem Erstellen der Umgebung das Learning-to-Rank-Repository und verschieben Sie es in das Demoverzeichnis.

$ git clone https://github.com/o19s/elasticsearch-learning-to-rank.git
$ cd elasticsearch-learning-to-rank/demo

Führen Sie nach dem Wechseln in das Demo-Verzeichnis die Skripte aus, um das Lernen des Ranges zu erleben!

Daten- und Bibliotheksvorbereitung

Führen Sie prepare.py aus, um die Bibliothek (Ranklib) herunterzuladen, die die Suchdaten und das Trainingsmodell erstellt.

$ python prepare.py

Bei der Ausführung werden die Filmdaten (tmdb.json) und die Ranking-Lernbibliothek (RankLibPlus-0.1.0.jar) heruntergeladen. (Beachten Sie, dass tmdb.json groß ist und das Herunterladen sehr lange dauert!) Bereiten Sie nach Abschluss des Downloads die Elasticsearch-Umgebung vor.

Bereiten Sie die Umgebung für Elasticsearch vor

Starten Sie Elasticsearch mit dem Learning-to-Rank-Plug-In und füllen Sie es aus. Führen Sie nach dem Start von Elasticsearch index_ml_tmdb.py aus, um den Index festzulegen und Daten einzufügen. Führen Sie das folgende Skript aus, um tmdb.json in Elasticsearch einzufügen.

$ python index_ml_tmdb.py

Nachdem Sie den Index festgelegt und die Daten eingefügt haben, müssen Sie im nächsten Schritt die Feature-Konvertierungsabfrage festlegen, die für das Training verwendet werden soll. Führen Sie das folgende Skript aus, um das für das Training verwendete Feld festzulegen. (Siehe Demo / 1.json und Demo / 2.json für die einzustellenden Felder. In der Demo werden die Suchergebnisse von Titel und Übersicht als Features festgelegt.)

$ python load_features.py

Wenn das Feld bereit ist, die Daten in ein Feature zu konvertieren, ist es Zeit, sie zu modellieren.

Stellen Sie das Modell in Elasticsearch bereit

Führen Sie train.py aus, um ein Modell zu erstellen und für Elasticsearch bereitzustellen.

$ python train.py

In train.py wird die folgende Verarbeitung ausgeführt.

Vorverarbeitung

Lernen Sie in der Demo sample_judgements.txt, um das Ranking der Suchergebnisse zu verbessern .. sample_judgements.txt repräsentiert die Suchergebnisse (# 7555 Rambo, # 1370 Rambo III, ...) für die Suchabfrage (qid), und der Bewertungswert (Note) wird für jedes Paar von Suchabfrage und Suchergebnis festgelegt. Ich werde. In der Demo gibt es drei Arten von Abfragen:

# qid:1: rambo
# qid:2: rocky
# qid:3: bullwinkle

Legen Sie für jede Abfrage eine Note für die Suchergebnisse fest. (Je höher die Zahl, desto besser.)

# 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

Das Konvertieren dieser Daten in das Ranklib-Format ergibt die folgenden Daten.

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

Wir werden diese Daten verwenden, um ein Modell zu erstellen.

Modellgenerierung

Erstellen Sie ein Modell. Die Demo generiert das folgende Modell:

(Details zu jedem Modell werden diesmal weggelassen.)

Modell Upload

Laden Sie das Modell in Elasticsearch hoch. Laden Sie das von der Post-Anfrage generierte Modell hoch. Unten ist ein Beispiel.

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"
        }
    }
}

Geben Sie bei der Suche mit dem hochgeladenen Modell model.name an.

Suchen nach

Lassen Sie uns tatsächlich die Verbesserung der Suchergebnisse durch Learning-to-Rank suchen und erleben! Wenn Sie search.py ausführen, erhalten Sie die folgenden Suchergebnisse:

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

Da es schwer zu verstehen ist, habe ich das Ergebnis des Vergleichs mit / ohne Rank-Learning vorbereitet. Die folgenden Ergebnisse werden jeweils erhalten.

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

Die Lernergebnisse spiegeln sich wider! !!

Zusammenfassung

Dieses Mal habe ich das Verfahren eingeführt, um zu versuchen, mit Elasticsearch das Ranking zu lernen, und das Rankinglernen in der Suchmaschine wiedergegeben. Wir haben ein Repository zusammengestellt, damit Sie die diesmal verwendete Bibliothek problemlos ausprobieren können. Wir hoffen, dass Sie sie verwenden werden. In diesem Artikel habe ich auch die Ausführungsprozedur vorgestellt. Wenn ich jedoch die Möglichkeit habe, möchte ich jede Logik des Ranking-Lernens und die Details des Mechanismus der diesmal verwendeten Bibliothek vorstellen.

Recommended Posts

Ich habe versucht, mit Elasticsearch Ranking zu lernen!
Ich habe versucht, mit Python zu kratzen
Ich habe versucht, mit PyCaret zu clustern
Ich habe gRPC mit Python ausprobiert
Ich habe versucht, mit Python zu kratzen
Ich habe maschinelles Lernen mit liblinear versucht
Ich habe versucht, WebScraping mit Python.
Ich habe versucht, Essen mit SinGAN zu bewegen
Ich habe versucht, DeepPose mit PyTorch zu implementieren
Ich habe versucht, das Gesicht mit MTCNN zu erkennen
Ich habe versucht, Prolog mit Python 3.8.2 auszuführen.
Ich habe die SMTP-Kommunikation mit Python versucht
Ich habe versucht, Sätze mit GPT-2 zu generieren
Ich habe versucht, LightGBM mit Yellowbrick zu lernen
Ich habe versucht, das Gesicht mit OpenCV zu erkennen
Ich habe eine multiple Regressionsanalyse mit Polypoly-Regression versucht
Ich habe versucht, eine SMS mit Twilio zu senden
Ich habe versucht, Amazon SQS mit Django-Sellerie zu verwenden
Ich habe versucht, Autoencoder mit TensorFlow zu implementieren
Ich habe Linebot mit Flasche (Anaconda) + Heroku ausprobiert
Ich habe versucht, AutoEncoder mit TensorFlow zu visualisieren
Ich habe versucht zu kratzen
Ich habe versucht, mit Hy anzufangen
Ich habe PyQ ausprobiert
Ich habe versucht, Selen mit Headless-Chrom zu verwenden
Ich habe versucht, Faktoren mit Titanic-Daten zu analysieren!
Ich habe versucht, mit Kaggles Titanic (kaggle②) zu lernen.
Ich habe versucht, mit Python + opencv nicht realistisch zu rendern
Ich habe AutoKeras ausprobiert
Ich habe eine funktionale Sprache mit Python ausprobiert
Ich habe versucht, mit Python ② (Fibonacci-Zahlenfolge) aufzuklären.
Ich habe versucht, DeepPose mit PyTorch PartⅡ zu implementieren
Ich habe es mit Papiermühle versucht
Ich habe versucht, CVAE mit PyTorch zu implementieren
Ich habe versucht, mit Pillow mit dem Bild zu spielen
Ich habe versucht, TSP mit QAOA zu lösen
Ich habe mit Jupyter eine einfache Bilderkennung versucht
Ich habe versucht, CNN mit Resnet fein abzustimmen
Ich habe versucht, Django-Slack
Ich habe versucht, natürliche Sprache mit Transformatoren zu verarbeiten.
Ich habe es mit Django versucht
Ich habe es mit Spleeter versucht
Ich habe es mit cgo versucht
# Ich habe so etwas wie Vlookup mit Python # 2 ausprobiert
Ich habe versucht, Runenfiguren mit Scikit-Learn handschriftlich zu erkennen
Ich habe versucht, nächstes Jahr mit AI vorherzusagen
Ich habe versucht, das Bild mit Python + OpenCV zu "glätten"
Ich habe Hunderte Millionen SQLite mit Python ausprobiert
Ich habe versucht, das Lesen von Dataset mit PyTorch zu implementieren
Ich habe versucht, Bilder mit CIFAR-10 mit Keras-Learning- zu erkennen.
Ich habe versucht, mit TF Learn die logische Operation zu lernen
Ich habe versucht, GAN (mnist) mit Keras zu bewegen
Ich habe versucht, das Bild mit Python + OpenCV zu "differenzieren"
Ich habe versucht, Bilder von CIFAR-10 mit Keras-Bilderkennung zu erkennen.
Ich habe "License OCR" mit der Google Vision API ausprobiert
Ich habe versucht, die Daten mit Zwietracht zu speichern