web-dev-qa-db-fra.com

Gensim: KeyError: "Le mot n'est pas dans le vocabulaire"

J'ai un modèle Word2vec formé utilisant la bibliothèque Gensim de Python. J'ai une liste symbolisée comme ci-dessous. La taille du vocabulaire est 34 mais je ne donne que quelques exemples sur 34:

b = ['let',
 'know',
 'buy',
 'someth',
 'featur',
 'mashabl',
 'might',
 'earn',
 'affili',
 'commiss',
 'fifti',
 'year',
 'ago',
 'graduat',
 '21yearold',
 'dustin',
 'hoffman',
 'pull',
 'asid',
 'given',
 'one',
 'piec',
 'unsolicit',
 'advic',
 'percent',
 'buy']

Modèle

model = gensim.models.Word2Vec(b,min_count=1,size=32)
print(model) 
### prints: Word2Vec(vocab=34, size=32, alpha=0.025) ####

si j’essaie d’obtenir le score de similarité en faisant model['buy'] l’un des mots de la liste, j’obtiens le 

KeyError: "Le mot" acheter "ne figure pas dans le vocabulaire"

Pouvez-vous me suggérer ce que je ne fais pas correctement et quels sont les moyens de vérifier le modèle qui peut être utilisé ultérieurement pour former PCA ou t-sne afin de visualiser des mots similaires formant un sujet? Je vous remercie. 

7
Krishnang K Dalal

Le premier paramètre passé à gensim.models.Word2Vec est un itérable de phrases. Les phrases elles-mêmes sont une liste de mots. De la docs:

Initialisez le modèle à partir d'une variable iterable de sentences. Chaque phrase est un liste de mots (chaînes unicode) qui seront utilisés pour la formation.

Pour le moment, il pense que chaque mot de votre liste b est une phrase et il utilise donc Word2Vec pour chaque caractère de chaque mot, par opposition à chaque mot de votre b. En ce moment tu peux faire:

model = gensim.models.Word2Vec(b,min_count=1,size=32)

print(model['a'])
array([  7.42487283e-03,  -5.65282721e-03,   1.28707094e-02, ... ]

Pour que cela fonctionne pour les mots, placez simplement b dans une autre liste afin qu'il soit interprété correctement:

model = gensim.models.Word2Vec([b],min_count=1,size=32)

print(model['buy'])
array([-0.01331611,  0.00496594, -0.00165093, -0.01444992,  0.01393849, ... ]
16
bunji

À partir de la documentation, vous devez passer des phrases itérables afin que tout ce que vous transmettez à la fonction traite l’entrée comme un élément éditable. Vous ne passez donc ici que des mots; le vecteur Word2vec est donc pris en compte pour chaque caractère dans le corpus entier.

Donc, pour éviter ce problème, passez la liste des mots dans une liste.

Word2vec_model = gensim.models.Word2Vec([b],min_count=1,size=32)
1
Ravi G