Prédire un mot à l'aide du modèle Word2vec


20

Vu infliger une peine: « Quand j'ouvre la ?? porte , il commence à chauffer automatiquement »

Je voudrais obtenir la liste des mots possibles en ?? avec une probabilité.

Le concept de base utilisé dans le modèle word2vec est de «prédire» un mot en fonction du contexte environnant.

Une fois le modèle construit, quelle est l'opération de vecteurs de contexte appropriée pour effectuer ma tâche de prédiction sur de nouvelles phrases?

Est-ce simplement une somme linéaire?

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

J'ai implémenté l'algorithme ci-dessus et suis tombé sur une question: pourquoi softmax est-il utilisé? Permettez-moi de vous montrer un exemple de deux fonctions de normalisation: def softmax (w, t = 1.0): # Source: gist.github.com/stober/1946926 e = np.exp (w / t) return e / np.sum ( e) normalisation def (w): retourne w / np.sum (w) a = np.array ([. 0002, .0001, .01, .03]) normalisation d'impression (a) softmax d'impression (a, t = 1 ) Comparons les sorties: [0,00496278 0,00248139 0,24813896 0,74441687] [0,24752496 0,24750021 0,24996263 0,25501221] Comme nous pouvons le voir, softmax donne 0,03 à peu près la même probabilité que 0,0001 (qui est

Réponses:


9

Word2vec fonctionne dans deux modèles CBOW et skip-gram. Prenons le modèle CBOW, car votre question va de la même manière que prédire le mot cible, compte tenu des mots environnants.

Fondamentalement, le modèle développe des matrices de poids d'entrée et de sortie, qui dépendent des mots de contexte d'entrée et du mot cible de sortie à l'aide d'une couche cachée. Ainsi, la rétropropagation est utilisée pour mettre à jour les poids lorsque la différence d'erreur entre le vecteur de sortie prédit et la matrice de sortie actuelle.

Fondamentalement, la prédiction du mot cible à partir de mots de contexte donnés est utilisée comme une équation pour obtenir la matrice de poids optimale pour les données données.

Pour répondre à la deuxième partie, cela semble un peu complexe qu'une simple somme linéaire.

  1. Obtenir tous les vecteurs de mots des mots de contexte
  2. Faites-en la moyenne pour découvrir le vecteur hde calque caché de la tailleNx1
  3. Obtenez la matrice de sortie syn1( word2vec.cou gensim) qui est de tailleVxN
  4. Multipliez syn1par h, le vecteur résultant sera zde tailleVx1
  5. Calculez le vecteur de probabilité y = softmax(z)avec la taille Vx1, où la probabilité la plus élevée correspond à la représentation univoque du mot cible dans le vocabulaire. Vdénote la taille du vocabulaire et Ndénote la taille du vecteur d'intégration.

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

Mise à jour: les modèles de mémoire à court terme font actuellement un excellent travail pour prédire les prochains mots. Les modèles seq2seq sont expliqués dans le tutoriel tensorflow . Il existe également un article de blog sur la génération de texte.


Merci ! Êtes-vous au courant d'une mise en œuvre de cela? (dans le cadre de gensim par exemple). Sinon, cela ne semble pas trop compliqué à calculer.
DED

Salut, pourriez-vous me donner plus de détails sur la façon de récupérer la matrice de sortie (syn1 dans votre exemple) à partir d'un modèle d'intégration W2V formé? Je pense que le w2v a laissé tomber la matrice de sortie lorsque la formation est terminée.
Charles Chow

sur la base de ma compréhension, votre réponse à la deuxième question est de reconstruire la matrice de sortie, est-ce correct?
Charles Chow

1
Je pense qu'il convient de noter que cela ne fonctionne pas comme un classificateur de séquence. L'ordre des mots est ignoré.
affichage

On pourrait obtenir la matrice de sortie syn1en sauvegardant simplement le modèle. oui, l'ordre est ignoré, pour l'application, on pourrait en fait aller avec le modèle seq2seq basé sur LSTM.
yazhi

4

La prédiction de mots manquants a été ajoutée en tant que fonctionnalité dans la dernière version de Word2Vec. Bien sûr, votre phrase doit correspondre à la syntaxe d'entrée du modèle Word2Vec utilisée pour l'apprentissage du modèle (lettres minuscules, mots vides, etc.)

Utilisation pour prédire les 3 premiers mots pour "Quand j'ouvre? Porte":

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

Comment savait-il que centerc'était entre le 3e et le 4e mot? Cela n'a aucun sens pour moi. J'imagine que seuls des mots de contexte de nombre pair pourraient être floor(len(n)/2))floor(len(n)/2))+1
insérés
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.