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.
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]
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.
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.
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.
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.
Dies ist auch ein Benutzer, also werde ich es überspringen.
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