Doc2vec(gensim) – Wie kann ich auf die Bezeichnung unsichtbarer Sätze schließen?

datascience.stackexchange https://datascience.stackexchange.com/questions/10612

  •  16-10-2019
  •  | 
  •  

Frage

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

Wenn wir beispielsweise doc2vec mit trainiert haben

„aaaaaAAAAAaaaaaa“ – „Label 1“

„bbbbbbBBBBBBbbbb“ – „Label 2“

Können wir mithilfe von Doc2vec schließen, dass „aaaaAAAAaaaaAA“ Label 1 ist?

Ich weiß, dass Doc2vec Wortvektoren und Beschriftungsvektoren trainieren kann.Können wir anhand dieser Vektoren auf unsichtbare Sätze (Kombination trainierter Wörter) in welcher Bezeichnung schließen?

War es hilfreich?

Lösung

Der Titel dieser Frage ist eine separate Frage zum Text, daher werde ich beide getrennt beantworten (vorausgesetzt, dass das eine in das andere übergeht).

  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äß dem Originalpapier (https://cs.stanford.edu/~quocle/paragraph_vector.pdf) haben wir zwei zufällig initialisierte Gewichtsmatrizen $W \in \mathbb{R}^{N imes P}$, was die gleiche Matrix aus Word2Vec ist, in der jede Spalte oder Zeile einem Wortvektor zugeordnet ist und $D \in \ mathbb{R}^{M imes R}$ ist die Dokumentmatrix, 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 einem sich bewegenden Fenster) und minimiert die folgende Protokollwahrscheinlichkeit (Mehrklassen-Kreuzentropie):

$$ frac {1} {m} sum_ {i = 1}^{m} frac {1} {| d_ {i} |} sum_ {t = k}^{| d_ {i-1} | -k} log (p (w_ {t}^{i} | w_ {tk}^{i}, ..., w_ {t+k}^{i}, d_ {i}) $$

Dabei entspricht $D_{i}$ dem Vektor, der den $i^{th}$-Satz darstellt, $|D_{i}|$ der Anzahl der Wörter in diesem Dokument und $w_{t}^{i}$ der $t^{th}$ Wort im $i^{th}$ Dokument.Die Rückausbreitung erinnert sich lediglich an das Dokument, über das wir gerade unser Fenster-Softmax verschieben, und aktualisiert nur diese Zeile in der Matrix $D$ zusammen mit den Wörtern in diesem Fenster.

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

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

Die kurze Antwort lautet: Nein, und dafür ist Doc2Vec nicht gedacht.Aufgrund der zufälligen Initialisierung + der Komplexität der Konvergenz und des Trainings wird Ihr abgeleiteter Vektor nie genau derselbe sein wie sein entsprechender Vektor in $D$. Aus diesem Grund hat Gensim keine Funktion eingebaut, die dies unterstützt, wie auch immer das Modell dies getan hat Wenn diese beiden Vektoren gut trainiert wurden, sollten sie beliebig nahe beieinander liegen, sodass Sie daraus schließen können, dass sie äußerst ähnlich sind.

Selbst das Korrigieren des Zufallsstartwerts funktioniert möglicherweise nicht, da es so viele andere Variablen gibt, die sich auf die Konvergenz auswirken können. Weitere Informationen finden Sie in der ersten Antwort https://github.com/RaRe-Technologies/gensim/issues/374 .

In jedem Fall können Sie in Ihrem Datensatz die Bezeichnung finden, die einem abgeleiteten Satz am ähnlichsten ist, indem Sie einfach Ihren Trainingssatz durchlaufen und die Ähnlichkeit mit dem abgeleiteten Vektor vergleichen.Aber warum sollten Sie eine exakte Übereinstimmung mit etwas im Trainingssatz durchführen wollen?Das sind reguläre Ausdrücke für den Zweck dieser Dokumenteinbettung für überwachte oder unbeaufsichtigte Lernaufgaben (d. h.Klassifizierung und Clustering).

Andere Tipps

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

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]))

Basierend auf Gensim Doc2Vec Lernprogramm, Sie können so etwas tun.

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

Dadurch erhalten Sie eine Liste von Tupeln mit allen Beschriftungen und der Wahrscheinlichkeit, dass Ihr neues Dokument zu jeder Beschriftung gehört.Dann können Sie einfach den größten Wert als Bezeichnung verwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit datascience.stackexchange
scroll top