Prevedere una parola usando il modello Word2vec


20

Data una frase: "Quando apro il ?? porta inizia il riscaldamento automaticamente"

Vorrei ottenere l'elenco delle parole possibili in ?? con una probabilità.

Il concetto di base usato nel modello word2vec è "prevedere" una parola data il contesto circostante.

Una volta creato il modello, qual è la giusta operazione di vettori di contesto per eseguire il mio compito di previsione su nuove frasi?

È semplicemente una somma lineare?

model.most_similar(positive=['When','I','open','the','door','it','starts' ,'heating','automatically'])

Ho implementato l'algoritmo di cui sopra e ho riscontrato una domanda: perché viene utilizzato softmax? Lascia che ti mostri un esempio di due funzioni di normalizzazione: def softmax (w, t = 1.0): # Fonte: gist.github.com/stober/1946926 e = np.exp (w / t) return e / np.sum ( e) def normalization (w): return w / np.sum (w) a = np.array ([. 0002, .0001, .01, .03]) stampa normalizzazione (a) print softmax (a, t = 1 ) Confrontiamo gli output: [0.00496278 0.00248139 0.24813896 0.74441687] [0.24752496 0.24750021 0.24996263 0.25501221] Come possiamo vedere, softmax dà circa .03 circa la stessa probabilità rispetto a .0001 (che è

Risposte:


9

Word2vec funziona in due modelli CBOW e skip-gram. Prendiamo il modello CBOW, poiché la tua domanda va nello stesso modo in cui prevede la parola target, date le parole circostanti.

Fondamentalmente, il modello sviluppa matrici di peso di input e output, che dipende dalle parole del contesto di input e dalla parola target di output con l'aiuto di un livello nascosto. Pertanto, la retro-propagazione viene utilizzata per aggiornare i pesi quando la differenza di errore tra il vettore di output previsto e la matrice di output corrente.

In sostanza, la previsione della parola target da determinate parole di contesto viene utilizzata come equazione per ottenere la matrice di peso ottimale per i dati dati.

Per rispondere alla seconda parte, sembra un po 'complesso di una semplice somma lineare.

  1. Ottieni tutti i vettori di parole contestuali
  2. Mediali per scoprire il vettore hdi livello nascosto della dimensioneNx1
  3. Ottieni la matrice di output syn1( word2vec.co gensim) che è di dimensioniVxN
  4. Moltiplicare syn1per h, il vettore risultante avrà zdimensioniVx1
  5. Calcola il vettore di probabilità y = softmax(z)con la dimensione Vx1, dove la probabilità più alta indica la rappresentazione a una sola parola della parola target nel vocabolario. Vindica la dimensione del vocabolario e Nindica la dimensione del vettore di incorporamento.

Fonte: http://cs224d.stanford.edu/lecture_notes/LectureNotes1.pdf

Aggiornamento: i modelli di memoria a breve termine stanno attualmente facendo un ottimo lavoro nel predire le parole successive. I modelli seq2seq sono spiegati nel tutorial di tensorflow . C'è anche un post sul blog sulla generazione di testo.


Grazie ! Sei a conoscenza di qualche implementazione di questo? (come parte di gensim per esempio). Altrimenti, non sembra troppo complicato da calcolare.
DED

Ciao, potresti darmi maggiori dettagli su come recuperare la matrice di output (syn1 nel tuo esempio) dal modello di incorporamento w2v addestrato? Penso che il w2v abbia lasciato cadere la matrice di output al termine dell'allenamento.
Charles Chow,

in base alla mia comprensione, la tua risposta alla seconda domanda è ricostruire la matrice di output, è corretto?
Charles Chow,

1
Penso che valga la pena notare che questo non funziona come un classificatore di sequenze. L'ordinamento delle parole viene ignorato.
displayname

Si potrebbe ottenere la matrice di output syn1semplicemente salvando il modello. sì, l'ordinamento viene ignorato, poiché l'applicazione potrebbe effettivamente andare con il modello seq2seq basato su LSTM.
yazhi,

4

La previsione di parole mancanti è stata aggiunta come funzionalità nell'ultima versione di Word2Vec. Naturalmente la frase deve corrispondere alla sintassi di input del modello Word2Vec utilizzata per l'addestramento del modello (lettere minuscole, parole chiave, ecc.)

Utilizzo per prevedere le prime 3 parole per "Quando apro? Door":

print(model.predict_output_word(['When','I','open','door']), topn = 3)

Come faceva a sapere che centerera tra la terza e la quarta parola? Questo non ha senso per me. Immagino che solo le parole di contesto numerico possano essere inserite e selezionerebbe la parola tra floor(len(n)/2))efloor(len(n)/2))+1
bmc
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.