À l'aide de pré-formés word2vec avec LSTM pour le mot "génération"
LSTM/RNN peut être utilisé pour la génération de texte.
Cette montre le chemin à l'utilisation de pré-formés Gant mot plongements de Keras modèle.
- Comment utiliser la pré-formation Word2Vec mot plongements avec Keras LSTM
modèle? Cette post n'aide. - Comment prédire /générer prochaine mot lorsque le modèle est fourni avec la séquence de mots en entrée?
Exemple d'approche essayé:
# Sample code to prepare word2vec word embeddings
import gensim
documents = ["Human machine interface for lab abc computer applications",
"A survey of user opinion of computer system response time",
"The EPS user interface management system",
"System and human system engineering testing of EPS",
"Relation of user perceived response time to error measurement",
"The generation of random binary unordered trees",
"The intersection graph of paths in trees",
"Graph minors IV Widths of trees and well quasi ordering",
"Graph minors A survey"]
sentences = [[word for word in document.lower().split()] for document in documents]
word_model = gensim.models.Word2Vec(sentences, size=200, min_count = 1, window = 5)
# Code tried to prepare LSTM model for word generation
from keras.layers.recurrent import LSTM
from keras.layers.embeddings import Embedding
from keras.models import Model, Sequential
from keras.layers import Dense, Activation
embedding_layer = Embedding(input_dim=word_model.syn0.shape[0], output_dim=word_model.syn0.shape[1], weights=[word_model.syn0])
model = Sequential()
model.add(embedding_layer)
model.add(LSTM(word_model.syn0.shape[1]))
model.add(Dense(word_model.syn0.shape[0]))
model.add(Activation('softmax'))
model.compile(optimizer='sgd', loss='mse')
Exemple de code /psuedocode pour former LSTM et de prédire que ce sera apprécié.
Vous devez vous connecter pour publier un commentaire.
J'ai créé un gist avec un générateur simple qui s'appuie sur le dessus de votre idée initiale: c'est un LSTM réseau câblé à la pré-formés word2vec plongements, formés pour prédire le mot suivant dans une phrase. Les données sont le liste des résumés de arXiv site web.
Je vais mettre en évidence les parties les plus importantes ici.
Gensim Word2Vec
Votre code est bien, sauf pour le nombre d'itérations pour le former. La valeur par défaut
iter=5
semble plutôt faible. En outre, il n'est certainement pas le goulot d'étranglement -- LSTM formation prend beaucoup plus de temps.iter=100
regarde mieux.Le résultat de l'incorporation de la matrice est enregistré dans
pretrained_weights
tableau qui a une forme(vocab_size, emdedding_size)
.Keras modèle
Votre code est presque correct, sauf pour la perte de fonction. Etant donné que le modèle prédit que le mot suivant, c'est une tâche de classification, d'où la perte devrait être
categorical_crossentropy
ousparse_categorical_crossentropy
. J'ai choisi cette dernière pour des raisons d'efficacité: de cette façon, il évite un chaud-encodage, ce qui est assez cher pour un grand vocabulaire.Note de passage de la pré-formation de poids à
weights
.Préparation des données
Afin de travailler avec
sparse_categorical_crossentropy
perte, les deux phrases, et les étiquettes doivent être mot indices. Des phrases courtes doivent être complétées par des zéros à la commune de la longueur.Exemple de génération
C'est assez simple: les sorties du modèle le vecteur des probabilités, dont le mot suivant est échantillonné et annexé à l'entrée. Notez que le texte serait mieux et plus diversifiée, si le mot suivant est échantillonnés, plutôt que de choisi comme
argmax
. La température de base de l'échantillonnage aléatoire que j'ai utilisé est décrit ici.Exemples de texte généré
N'a pas trop de sens, mais il est capable de produire des phrases qui ressemblent au moins sur le plan grammatical, le son (parfois).
Le lien vers le complète script exécutable.
keras.layers.Embedding
avecweights
est déconseillée si vous cochez cette (keras.io/couches/plongements) etgithub.com/tensorflow/tensorflow/issues/14392)weights
argument est soutenu par la classe de baseLayer
, ainsi automatiquement par toutes les couches (code source). C'était aussi un recommandé façon de passer le poids à compter de 2017 (source). Autant que je sache, il l'est toujours. Mais vous avez raison,embeddings_initializer
est également pris en charge. Et je vous remercie pour votre downvote!weights
paramètre est également pris en charge (mais c'est aussi laTrainable
paramètre?). Pour être honnête, je ne downvoted votre post parce que sinon vous ne pourriez pas de soins pour mon commentaire. Si je pouvais revenir maintenant, alors je voudrais le faire, mais vous devez modifier votre réponse pour StackOverflow pour me permettre de le faire.weights
paramètre fonctionne actuellement. Je viens de voir ce post de cette personne qui prétend qu'il ne fonctionne pas. À votre poste, il est utile que vous ajoutez au moins une mise à jour-note à la fin pour informer les lecteurs de ce (potentiel) de changement.