[PYTHON] Aufbau eines Empfehlungssystems mit Mundpropaganda doc2vec

Ich bin Bokeneko, Rettys Craft Beer und Ingenieur. Ich habe mit doc2vec ein experimentelles Empfehlungssystem erstellt, daher werde ich die Methode vorstellen.

doc2vec

doc2vec ist eine Weiterentwicklung von word2vec. word2vec versucht, die Bedeutung eines Wortes anhand der Wörter zu erfassen, die wahrscheinlich um es herum erscheinen, aber doc2vec lernt, ihm mehr Kontext hinzuzufügen.

Zum Beispiel ist die Idee von word2vec, dass "Hund" und "Katze" ähnliche Bedeutungen haben, weil "Hund" und "Katze" in xxx des Satzes "Ich habe xxx" enthalten sind. ist. Wenn dieser Satz jedoch aus einem Roman über einen Hund stammt, ist "Hund" überwiegend leichter herauszukommen als "Katze", und wenn es sich um eine Passage aus einem SM-Roman handelt ... nun, die einfachen Wörter ändern sich. Ich hoffe, Sie verstehen. Mit anderen Worten, da die Leichtigkeit, mit der Wörter erscheinen, vom Kontext des Satzes abhängt, können Sie mit doc2vec lernen, welche Art von Satz der Satz aus welcher Art von Wort ist.

Weitere Informationen finden Sie unter Verteilte Darstellungen von Sätzen und Dokumenten. Um ehrlich zu sein, habe ich es möglicherweise falsch interpretiert, weil es diagonal gelesen wird.

Überprüfen Sie doc2vec

Sie können den verteilten Ausdruck von Bewertungen lernen, indem Sie Bewertungen auf doc2vec anwenden. Es gibt doc2vec in gensim, also lasst es uns verwenden. Ich bin wirklich dankbar, dass es abgesehen von der Theorie einfach ist, es auszuprobieren.

# -*- coding:utf-8 -*-

from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument

import MeCab
import csv

mt = MeCab.Tagger()

reports = []
with open("reports.tsv") as f:
    # reports.Mundpropaganda-ID in einer Zeile für tsv,Bewertungen werden in Tabulatortrennzeichen gespeichert
    reader = csv.reader(f, delimiter="\t")
    for report_id, report in reader:
        words = []
        node = mt.parseToNode(report)
        while node:
            if len(node.surface) > 0:
                words.append(node.surface)
            node = node.next
        #Wörter ist eine Liste von Mundpropaganda-Wörtern,Geben Sie die Mundpropaganda in Tags an
        reports.append(TaggedDocument(words=words, tags=[report_id]))

model = Doc2Vec(documents=reports, size=128, window=8, min_count=5, workers=8)
model.save("doc2vec.model")

Jetzt können Sie Mundpropaganda als 128-dimensionalen Vektor lernen. Sie können den erlernten Mundpropaganda-Vektor wie folgt überprüfen.

# -*- coding:utf-8 -*-

from gensim.models.doc2vec import Doc2Vec

model = Doc2Vec.load("doc2vec.model")
sample_report_id = .... #Mundpropaganda-ID, für die Sie den verteilten Ausdruck überprüfen möchten

report_vector = model.docvecs[sample_report_id]

Empfehlung

Nachdem wir den Mund-zu-Mund-Vektor gelernt haben, können Sie eine Empfehlung abgeben, indem Sie sich den summierten Durchschnitt aller Mund-zu-Mund-Vektoren eines Benutzers als den Vektor vorstellen, der diesen Benutzer darstellt. Betrachten Sie auf die gleiche Weise die Summe aller Mundpropaganda-Vektoren eines Geschäfts als den Vektor, der dieses Geschäft darstellt. Verwenden des auf diese Weise erstellten Benutzervektors und Speichervektors

Ich dachte, ich könnte das sagen. Es ist nur eine Hypothese, also machen wir es sofort, weil wir es versuchen müssen, um zu sehen, ob es funktioniert.

ngt

Ich habe ngt verwendet, um die Nachbarschaft des Vektors schnell zu berechnen.

Bereiten Sie zur Verwendung die folgenden Werte für jede Dimension eines Vektors in einer Zeile vor, die durch Registerkarten für Benutzer und Speicher getrennt ist.

users.tsv


-0.32609        0.0670668       -0.0722714      -0.0738026      0.0177741 ....
...

restaurants.tsv


0.0385331       0.0978981       -0.0495091      -0.182571       0.0538142 ...
...

Dies erfolgt durch Aufschreiben des obigen Ergebnisses von doc2vec.

Erstellen Sie dann eine Datenbank mit dem folgenden Befehl.

$ ngt create -d 128 users users.tsv
$ ngt create -d 128 restaurants restaurants.tsv

Dann sollten Sie das folgende Verzeichnis haben.

<cur dir>
|--restaurants
|   |-- grp
|   |-- obj
|   |-- prf
|   |-- tre
|
|--users
    |-- grp
    |-- obj
    |-- prf
    |-- tre

Jetzt können Sie loslegen. Die Suche ist wie folgt.

#Bei der Suche nach Benutzern
$ ngt search -n 10 users search_query.tsv

#Bei der Suche nach einem Geschäft
$ ngt search -n 10 restaurants search_query.tsv

# search_query.tsv wird mit dem Zielvektor in eine Zeile geschrieben und die Werte jeder Dimension des Vektors durch Tabulatoren getrennt.
#Wenn Sie nach einem Geschäft in meiner Nähe suchen, suchen Sie_query.Schreiben Sie meinen Benutzervektor in tsv.

Speichert in der Nähe von Benutzern

Beginnen wir damit, mich als Labortisch zu verwenden und Geschäfte zu empfehlen, die ich denen empfehle, für die ich keine Bewertung geschrieben habe.

Rangfolge url
1 Shamrock von Abbott Choice
2 Bastelköpfe
3 Abbott Choice Shibuya
4 Swan Lake Pub Ed
5 Craft Beer Markt Jimbocho Store
6 Cooper Ales
7 Bashamichi Schankraum
8 8taps
9 Bungalow
10 Die Shannons

Ich nenne mich Rettys Craft Beer, aber es ist nur ein Bierladen. Es ist sicherlich mein Favorit, also denke ich, dass es funktioniert.

Besonders Craft Heads hat keine Mundpropaganda geschrieben, aber ich habe viel durchgemacht. Dann spreche ich über das Schreiben einer Mundpropaganda. Außerdem ist es nur der Schankraum für Kutschenstraßen, in dem ich noch nie gewesen bin. Entschuldigung für das Mundpropaganda-Schreiben: P.

In der Nähe des Geschäfts lagern

Die oben genannten Craft Heads sind mein Lieblingsgeschäft. Versuchen Sie also, ein Geschäft in der Nähe dieses Geschäfts zu finden.

Rangfolge url
1 The Griffon
2 Gute Bier Fausets
3 Bierkneipe Camden
4 Vivo!Bier- und Essbar
5 Wasserstelle
6 Brauhund Roppongi
7 Nakameguro Tap Room
8 TAP STAND
9 Meguro Republik
10 Burgon Dise Heimel

Ja, es ist nur ein Bierladen. Ich war übrigens bei allen. Es scheint, dass der Bierladen richtig empfohlen wird.

Benutzer in der Nähe von Benutzern

Ich werde keine anderen Benutzer als Retty-Mitarbeiter herausbringen, also überspringen Sie hier. Übrigens, als ich Benutzer in meiner Nähe herausbrachte, gab es sicherlich Bierliebhaber.

Benutzer in der Nähe des Geschäfts

Dies ist auch ein Benutzer, also werde ich es überspringen.

Zusammenfassung

Ist es möglich, einen Vektor zu erhalten, der Benutzer / Geschäfte darstellt, indem der Durchschnitt der Mundpropaganda doc2vec hinzugefügt wird? Ich habe es basierend auf der Hypothese versucht, aber es scheint ziemlich gut zu funktionieren. Ich habe dieses Mal Mecab verwendet, um das Wort abzurufen, aber Satzstück scheint ziemlich interessant zu sein, daher denke ich darüber nach, es dieses Mal zu verwenden.

P.S.

Oben habe ich geschrieben, dass der hinzugefügte Durchschnitt des Mundpropaganda-Vektors der Benutzervektor / Speichervektor ist, aber tatsächlich habe ich mir etwas mehr ausgedacht.

Anfangs war es nur ein zusätzlicher Durchschnitt, aber als ich es intern ausprobierte, wurde mir gesagt, dass meine alten Hobbys zu sehr reflektiert wurden. Wenn Sie also den jüngsten Bewertungen mehr Gewicht beimessen, wird es angeblich keine Geschäfte geben, die Ihren Hobbys entsprechen, für diejenigen, denen diesmal die Hobby-Läden ausgehen und die heutzutage viele andere Beiträge als Hobby-Läden haben ... Da es verschiedene Dinge gab, wiederhole ich Feineinstellungen. Das obige Ergebnis ist das Ergebnis nach der Feineinstellung.

Recommended Posts

Aufbau eines Empfehlungssystems mit Mundpropaganda doc2vec
Empfehlung zur Datenanalyse mit MessagePack
Implementierung eines Dialogsystems mit Chainer [seq2seq]
Empfehlung der Poesie
Beispiel für die Verwendung von Lambda
Hinweise zum Erstellen einer Linux-Umgebung mit VirtualBox + Vagrant unter Windows 10
Aufbau einer Cortex-M-Entwicklungsumgebung für TOPPERS mit Raspeye