Doc2vec (gensim) - Wie kann ich auf das Etikett von unsichtbaren Sätzen schließen?


13

https://radimrehurek.com/gensim/models/doc2vec.html

Zum Beispiel, wenn wir doc2vec mit trainiert haben

"aaaaaAAAAAaaaaaa" - "Label 1"

"BbbbbbBBBBbbbbb" - "label 2"

Können wir mit Doc2vec auf „aaaaAAAAaaaaAA“ als Label 1 schließen?

Ich weiß, dass Doc2vec Wortvektoren und Beschriftungsvektoren trainieren kann. Können wir unter Verwendung dieser Vektoren auf unsichtbare Sätze (Kombination von trainierten Wörtern) schließen, in denen sich die Bezeichnung befindet?

Antworten:


10

Der Titel dieser Frage ist eine separate Frage zu ihrem Text, daher werde ich beide getrennt beantworten (vorausgesetzt, dass eine in die andere führt).

  1. Wie kann ich auf unsichtbare Sätze schließen:
# ... trained model stored in var model
list_of_words = ["this", "is", "a", "new","unseen", "sentence"]
inferred_embedding = model.infer_vector(list_of_words)

Wie funktioniert das ? Gemäß der Originalarbeit ( https://cs.stanford.edu/~quocle/paragraph_vector.pdf ) haben wir zwei nach dem Zufallsprinzip initialisierte Gewichtsmatrizen, die dieselbe Matrix aus Word2Vec sind, in der jede Spalte oder Zeile enthalten ist ordnet einem Wortvektor zu und D R M × R ist die Dokumentenmatrix, in der jede Spalte oder Zeile einem Satz / Dokument zugeordnet ist. Während des Trainings bewegt sich ein Softmax-Klassifikator mit einer festen Fenstergröße von k (in einer Art eines sich bewegenden Fensters), um die folgende logarithmische Wahrscheinlichkeit (Kreuzentropie mehrerer Klassen ) zu minimieren:WRN×PDRM×Rk

1Mich=1M1|Dich|t=k|Dich-1|-klÖG(p(wtich|wt-kich,...,wt+kich,Dich))

Wobei dem Vektor entspricht, der den i t h -Satz darstellt, | D i | seine Anzahl von Wörtern in diesem Dokument und w i t ist das t t h Wort in dem i t h Dokument. Bei allen Erinnerungen an die Rückübertragung handelt es sich um das Dokument, über das wir gerade unseren fensterorientierten Softmax bewegen, und das nur diese Zeile in Matrix D zusammen mit den Wörtern in diesem Fenster aktualisiert .Dichichth|Dich|wtichtthichthD

Wenn wir außerdem auf etwas schließen wollen, das nicht im Trainingssatz enthalten ist, korrigieren wir damit es nicht aktualisiert wird, und erweitern Matrix D mit der neuen zufällig initialisierten Zeile und trainieren nur für mehrere Iterationen (wobei die neue Zeile die Einbettung für den abgeleiteten Vektor enthält). . Dies führt zu Frage 2.WD

  1. Können wir daraus schließen, dass ein möglicherweise unsichtbarer Satz genau einem Satz im Trainingssatz entspricht?

Die kurze Antwort ist nein und dafür ist Doc2Vec nicht geeignet. Aufgrund der zufälligen Initialisierung + wird die Komplexität der Konvergenz und des Trainings Ihres abgeleiteten Vektors niemals genau derselbe sein wie der entsprechende Vektor in diesem Grund hat Gensim keine Funktion eingebaut, um dies zu unterstützen, vorausgesetzt, das Modell ist gut trainiert, sollten diese beiden Vektoren beliebig nahe beieinander liegen, so dass man schließen kann, dass sie sich extrem ähnlich sind.D

Auch wenn das Korrigieren des zufälligen Ausgangs nicht funktioniert, gibt es so viele andere Variablen, die die Konvergenz beeinflussen können. Lesen Sie die erste Antwort unter https://github.com/RaRe-Technologies/gensim/issues/374 .

In jedem Fall können Sie die ähnlichste Bezeichnung in Ihrem Datensatz für einen abgeleiteten Satz finden, indem Sie einfach über Ihren Trainingssatz iterieren und die Ähnlichkeit mit dem abgeleiteten Vektor vergleichen. Aber warum solltest du eine exakte Übereinstimmung mit etwas im Trainingsset haben? Das ist, was reguläre Ausdrücke für den Zweck dieser Dokumenteinbettung sind, für überwachte oder unbeaufsichtigte Lernaufgaben (dh Klassifizierung und Clustering).


0

Ich habe heute versucht, dieses Problem zu lösen, und konnte kein Modul von gensim.Doc2Vec finden, das die Ähnlichkeit zwischen abgeleiteten Dokumentvektoren berechnet, die nicht im trainierten Modell vorhanden sind, und denen im trainierten Modell. Im Grunde habe ich das getan.

from scipy import spatial
inferred_vector=model.infer_vector(sentence.split())
for labels in labelled_documents:
    print (1-  spatial.distance.cosine(inferred_vector,model.docvecs[labels]))

0

Basierend auf dem Tutorial von Gensim Doc2Vec können Sie so etwas tun.

inferred_vector = model_dmm.infer_vector(sentence.split())
sims = model.docvecs.most_similar([inferred_vector], topn=len(model.docvecs))

Auf diese Weise erhalten Sie eine Liste von Tupeln mit allen Bezeichnungen und die Wahrscheinlichkeit, mit der Ihr neues Dokument zu jeder Bezeichnung gehört. dann können Sie einfach den größten Wert als Etikett verwenden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.