Domanda

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

Per esempio, se abbiamo formato doc2vec con

"aaaaaaaaaaaaaaaa" - "etichetta 1"

“bbbbbbbbbbbbbbb" - "etichetta 2"

possiamo dedurre “aaaaaaaaaaaaaa” è l'etichetta 1 utilizzando Doc2vec?

Lo so Doc2vec può allenare vettori di parole e vettori di etichette. Utilizzando questo vettori, possiamo dedurre frasi invisibili (combinazione di parole addestrati), in cui l'etichetta?

È stato utile?

Soluzione

Il titolo di questa domanda è una domanda distinta per il suo testo così io risponderò sia separatamente (dato che una porta all'interno dell'altra).

  1. Come posso dedurre frasi invisibili:
# ... trained model stored in var model
list_of_words = ["this", "is", "a", "new","unseen", "sentence"]
inferred_embedding = model.infer_vector(list_of_words)

Come funziona? Come per la carta originale ( https://cs.stanford.edu/~quocle/paragraph_vector.pdf ) abbiamo due matrici dei pesi inizializzati a caso $ W \ in \ mathbb {R} ^ {N \ times P} $ che è la stessa matrice da Word2Vec in cui ogni colonna o riga mappe ad una parola vettore e $ D \ in \ mathbb {R} ^ {m \ times R} $, che è la matrice documento in cui ogni colonna o riga mappe per una frase / documento. Durante la formazione di un classificatore softmax di finestra fissa $ k $ dimensioni si muove (in una finestra mobile come la moda) riducendo al minimo la seguente probabilità log (multi-classe di cross-entropia):

$$ \ Frac {1} {M} \ sum_ {i = 1} ^ {M} \ frac {1} {| D_ {i} |} \ sum_ {t = k} ^ {| D_ {i-1} | - k} log (p (t w_ {} ^ {i} | w_ {tk} ^ {i}, ..., w_ {t + k} ^ {i}, D_ {i})) $$

Dove $ D_ {i} $ corrisponde al vettore che rappresenta il $ i ^ {°} $ frase, $ | D_ {i} | $ il suo numero di parole che documenti e $ w_ {t} ^ {i} $ è il $ t ^ {°} $ parola nel $ i ^ {°} $ del documento. Tutti i back-propagazione ricorda è il documento che stiamo muovendo la nostra finestra softmax più e aggiorna solo quella riga della matrice $ D $ insieme con le parole in quella finestra.

Inoltre quando vogliamo dedurre qualcosa che non nella formazione SET fissiamo $ W $ in modo che non è aggiornato e matrice Augment $ D $ con la nuova riga inizializzato in modo casuale e solo allenarsi per diverse iterazioni (con la nuova riga partecipazione l'incorporamento per il vettore dedotto). Questo porta in questione 2.

  1. Possiamo dedurre che una frase forse invisibile corrisponde esattamente a una frase nel set di formazione?

La risposta breve è no e questo non è ciò che è per Doc2Vec. A causa del l'inizializzazione casuale + la complessità di convergenza e di addestramento del vostro vettore dedotto non sarà mai esattamente lo stesso di suo vettore corrispondente a $ D $ è per questo Gensim non ha costruito in una funzione di sostenere questo, come mai visto che il modello ha stati ben addestrati questi due vettori dovrebbero essere arbitrariamente vicini l'uno all'altro in tal modo si può concludere che essi sono estremamente simili.

Anche fissa il seme casuale potrebbe non funzionare, ci sono così tante altre variabili che possono influenzare la sua convergenza vedere prima risposta su https://github.com/RaRe-Technologies/gensim/issues/374 .

In ogni caso è possibile trovare l'etichetta più simile nel vostro set di dati ad una sentenza dedotto semplicemente scorrendo sopra il vostro training set e confrontando la somiglianza con il vettore dedotto. Ma perché si vuole fare una corrispondenza esatta a qualcosa nel set di formazione? Questo è ciò che le espressioni regolari sono a scopo di questi documenti di embedding è per compiti di apprendimento con o senza supervisione (vale a dire la classificazione e clustering).

Altri suggerimenti

I stava cercando di risolvere questo problema oggi, e chef era estremamente trovare qualsiasi modulo data dal gensim.Doc2Vec che calcolare somiglianza tra dedotto vettore del documento non presente sul modello addestrato a quelli nel modello addestrato. Quindi, in pratica ho fatto questo.

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

In base a Gensim Doc2Vec esercitazione , si può fare qualcosa di simile.

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

Questo vi darà una lista di tuple con tutte le etichette e la probabilità associata con il nuovo documento appartenente ad ogni etichetta. allora si può semplicemente prendere il valore più grande come l'etichetta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
scroll top