Doc2vec (gensim) - Come posso dedurre l'etichetta delle frasi invisibili?


14

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

Ad esempio, se abbiamo addestrato doc2vec con

"aaaaaAAAAAaaaaaa" - "etichetta 1"

“BbbbbbBBBBBbbbb" - "etichetta 2"

possiamo dedurre che "aaaaAAAAaaaaAA" ​​è l'etichetta 1 usando Doc2vec?

So che Doc2vec può addestrare vettori di parole e vettori di etichette. Usando questo vettore, possiamo dedurre frasi invisibili (combinazione di parole addestrate) in quale etichetta?

Risposte:


11

Il titolo di questa domanda è una domanda separata al suo testo, quindi risponderò ad entrambi separatamente (dato che l'uno conduce nell'altro).

  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 nel documento originale ( https://cs.stanford.edu/~quocle/paragraph_vector.pdf ) abbiamo due matrici ponderali inizializzate a caso che è lo stesso matrice da Word2Vec in cui ogni colonna o riga viene mappata a un vettore parola e che è la matrice del documento in cui ogni colonna o riga viene mappata a una frase / documento. Durante l'allenamento, un classificatore softmax di dimensioni fisse della finestra sposta (in una finestra mobile come la moda) minimizzando la seguente probabilità di log (cross-entropia multi-classe):WRN×PDRM×RK

1MΣio=1M1|Dio|Σt=K|Dio-1|-Klog(p(wtio|wt-Kio,...,wt+Kio,Dio))

Dove corrisponde al vettore che rappresenta la frase ,il suo numero di parole in quel documento e è la parola nel documento . Tutto ciò che ricorda la retro-propagazione è il documento su cui stiamo attualmente spostando il nostro softmax con finestre e aggiorna solo quella riga nella matrice insieme alle parole in quella finestra.Dioioth|Dio|wtiotthiothD

Inoltre, quando vogliamo dedurre qualcosa che non è nel set di addestramento, ripariamo modo che non venga aggiornato e aumentiamo la matrice con la nuova riga inizializzata casualmente e ci alleniamo solo per diverse iterazioni (con la nuova riga che tiene l'incorporamento per il vettore inferito) . Questo porta alla domanda 2.WD

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

La risposta breve è no e non è per questo che Doc2Vec serve. A causa dell'inizializzazione casuale + della complessità della convergenza e dell'addestramento il tuo vettore inferito non sarà mai esattamente lo stesso del suo vettore corrispondente in questo è il motivo per cui Gensim non ha incorporato una funzione per supportare questo, come mai dato che il modello è stato bene addestrato questi due vettori dovrebbero essere arbitrariamente vicini l'uno all'altro in modo da poter concludere che sono estremamente simili.D

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

In ogni caso puoi trovare l'etichetta più simile nel tuo set di dati con una frase inferita semplicemente ripetendo il tuo set di allenamento e confrontando la somiglianza con il vettore inferito. Ma perché dovresti voler fare una corrispondenza esatta con qualcosa nel set di allenamento? questo è ciò che sono le espressioni regolari ai fini dell'incorporamento di questi documenti per attività di apprendimento supervisionate o non supervisionate (ovvero classificazione e raggruppamento).


0

Oggi stavo cercando di risolvere questo problema e non riuscivo a trovare alcun modulo fornito da gensim.Doc2Vec che calcolasse la somiglianza tra il vettore di documento dedotto non nel modello addestrato con quelli nel modello addestrato. Quindi sostanzialmente l'ho fatto.

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

Basato sul tutorial di Gensim Doc2Vec , puoi fare qualcosa del genere.

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

Questo ti darà un elenco di tuple con tutte le etichette e la probabilità associata al tuo nuovo documento appartenente a ciascuna etichetta. allora puoi semplicemente prendere il valore più grande come etichetta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.