Comment initialiser un nouveau modèle word2vec avec des poids de modèle pré-formés?

14

J'utilise Gensim Library en python pour utiliser et former le modèle word2vector. Récemment, je cherchais à initialiser mes poids de modèle avec un modèle word2vec pré-formé tel que (modèle pré-formé GoogleNewDataset). J'ai du mal avec ça quelques semaines. Maintenant, je viens de découvrir que dans gesim il y a une fonction qui peut m'aider à initialiser les poids de mon modèle avec des poids de modèle pré-formés. Cela est mentionné ci-dessous:

reset_from(other_model)

    Borrow shareable pre-built structures (like vocab) from the other_model. Useful if testing multiple models in parallel on the same corpus.

Je ne sais pas si cette fonction peut faire la même chose ou non. S'il vous plaît, aidez !!!

Nomiluks
la source
Le vocabulaire des modèles est-il le même?
Hima Varsha
Pourquoi ne pas lancer chacun des paramètres word2vec avec des nombres générés aléatoirement pour chaque exécution? J'ai pu le faire et avec une sélection minutieuse des nombres aléatoires pour chaque paramètre (numFeatures, contextWindow, seed), j'ai pu obtenir des tuples de similitude aléatoires que je voulais pour mon cas d'utilisation. Simuler une architecture d'ensemble. Qu'en pensent les autres? Veuillez répondre.
zorze
Merci de votre aide. Cela m'aide beaucoup
frhyme

Réponses:

18

Merci Abhishek. Je l'ai compris! Voici mes expériences.

1). nous traçons un exemple simple:

from gensim.models import Word2Vec
from sklearn.decomposition import PCA
from matplotlib import pyplot
# define training data
sentences = [['this', 'is', 'the', 'first', 'sentence', 'for', 'word2vec'],
            ['this', 'is', 'the', 'second', 'sentence'],
            ['yet', 'another', 'sentence'],
            ['one', 'more', 'sentence'],
            ['and', 'the', 'final', 'sentence']]
# train model
model_1 = Word2Vec(sentences, size=300, min_count=1)

# fit a 2d PCA model to the vectors
X = model_1[model_1.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
# create a scatter plot of the projection
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model_1.wv.vocab)
for i, word in enumerate(words):
    pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()

entrez la description de l'image ici

À partir des graphiques ci-dessus, nous pouvons voir que les phrases faciles ne peuvent pas distinguer la signification des différents mots par les distances.

2). Charger l'intégration de mots pré-formés:

from gensim.models import KeyedVectors

model_2 = Word2Vec(size=300, min_count=1)
model_2.build_vocab(sentences)
total_examples = model_2.corpus_count
model = KeyedVectors.load_word2vec_format("glove.6B.300d.txt", binary=False)
model_2.build_vocab([list(model.vocab.keys())], update=True)
model_2.intersect_word2vec_format("glove.6B.300d.txt", binary=False, lockf=1.0)
model_2.train(sentences, total_examples=total_examples, epochs=model_2.iter)

# fit a 2d PCA model to the vectors
X = model_2[model_1.wv.vocab]
pca = PCA(n_components=2)
result = pca.fit_transform(X)
# create a scatter plot of the projection
pyplot.scatter(result[:, 0], result[:, 1])
words = list(model_1.wv.vocab)
for i, word in enumerate(words):
    pyplot.annotate(word, xy=(result[i, 0], result[i, 1]))
pyplot.show()

entrez la description de l'image ici

D'après la figure ci-dessus, nous pouvons voir que les incorporations de mots sont plus significatives.
J'espère que cette réponse vous sera utile.

Shixiang Wan
la source
1
cette réponse est assez informative et utile pour incorporer le modèle dans un fichier vec.
Akash Kandpal
@ harrypotter0 Thx!
Shixiang Wan
compagnon net et clair !!!
vijay athithya
Lorsque j'ai essayé de l'utiliser, je l'ai testé avec deux ensembles de données identiques. Les résultats étaient différents pour chaque modèle. J'espérais que puisque je commencerais avec les mêmes poids initialisés, les modèles seraient les mêmes par la suite. Comment se fait-il que ce ne soit pas le cas?
Eric Wiener
1
@EricWiener Parce que même si les ensembles de données d'apprentissage sont identiques, les vecteurs de mots pour chaque apprentissage sont aléatoires. Les espaces vectoriels de mots calculés par le même ensemble de données doivent être similaires et les performances utilisées dans les tâches PNL doivent également être similaires.
Shixiang Wan
4

Voyons un exemple de code:

>>>from gensim.models import word2vec

#let us train a sample model like yours
>>>sentences = [['first', 'sentence'], ['second', 'sentence']]
>>>model1 = word2vec.Word2Vec(sentences, min_count=1)

#let this be the model from which you want to reset
>>>sentences = [['third', 'sentence'], ['fourth', 'sentence']]
>>>model2 = word2vec.Word2Vec(sentences, min_count=1)
>>>model1.reset_from(model2)
>>>model1.similarity('third','sentence')
-0.064622000988260417

Par conséquent, nous observons que model1 est réinitialisé par le model2 et donc le mot, 'troisième' et 'phrase' sont dans son vocabulaire donnant finalement sa similitude. Ceci est l'utilisation de base, vous pouvez également vérifier reset_weights () pour réinitialiser les poids à l'état non formé / initial.

Hima Varsha
la source
2

Si vous cherchez un réseau pré-formé pour l'intégration de mots, je vous suggère GloVe. Le blog suivant de Keras est très instructif sur la façon de l'implémenter. Il a également un lien vers les intégrations GloVe pré-formées. Il existe des vecteurs de mots pré-formés allant d'un vecteur de 50 dimensions à 300 vecteurs de dimensions. Ils ont été construits sur Wikipédia, Common Crawl Data ou Twitter. Vous pouvez les télécharger ici: http://nlp.stanford.edu/projects/glove/ . De plus, vous devriez examiner le blog des keras sur la façon de les implémenter. https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html

Samuel Sherman
la source