Dieser Artikel ist der 21. Tagesartikel von Just a Group AdventCalendar 2019.
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
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.
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!
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.
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.
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.
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.
Erstellen Sie ein Modell. Die Demo generiert das folgende Modell:
(Details zu jedem Modell werden diesmal weggelassen.)
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.
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! !!
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