J'essaie de former le modèle Word2vec à partir de données texte Wikipedia, pour cela j'utilise le code suivant.
import logging
import os.path
import sys
import multiprocessing
from gensim.corpora import WikiCorpus
from gensim.models import Word2Vec
from gensim.models.Word2vec import LineSentence
if __name__ == '__main__':
program = os.path.basename(sys.argv[0])
logger = logging.getLogger(program)
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s')
logging.root.setLevel(level=logging.INFO)
logger.info("running %s" % ' '.join(sys.argv))
# check and process input arguments
if len(sys.argv) < 3:
print (globals()['__doc__'])
sys.exit(1)
inp, outp = sys.argv[1:3]
model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())
# trim unneeded model memory = use (much) less RAM
model.init_sims(replace=True)
model.save(outp)
Mais après 20 minutes de fonctionnement du programme, je reçois l'erreur suivante
Idéalement, vous devriez coller le texte de votre erreur dans votre question, plutôt qu'une capture d'écran. Cependant, je vois les deux lignes clés:
<TIMESTAMP> : INFO : estimated required memory for 2372206 words and 400 dimensions: 8777162200 bytes
...
MemoryError: unable to allocate array with shape (2372206, 400) and data type float32
Après avoir effectué un passage sur votre corpus, le modèle a appris combien de mots uniques survivront, ce qui indique la taille d'un modèle qui doit être allouée: un prenant environ 8777162200 bytes
(environ 8,8 Go). Mais, lorsque vous essayez d'allouer le tableau de vecteurs requis, vous obtenez un MemoryError
, ce qui indique qu'il n'y a pas assez de mémoire adressable par ordinateur (RAM) disponible.
Tu peux soit:
Vous pouvez réduire le nombre de mots en augmentant la valeur par défaut min_count=5
paramètre à quelque chose comme min_count=10
ou min_count=20
ou min_count=50
. (Vous n'avez probablement pas besoin de plus de 2 millions de vecteurs de mots - de nombreux résultats intéressants sont possibles avec juste un vocabulaire de quelques dizaines de milliers de mots.)
Vous pouvez également définir un max_final_vocab
valeur, pour spécifier un nombre exact de mots uniques à conserver. Par exemple, max_final_vocab=500000
ne conserverait que les 500 000 mots les plus fréquents, ignorant le reste.
Réduire le size
permettra également d'économiser de la mémoire. Un paramètre de size=300
est populaire pour les vecteurs Word et réduirait d'un quart les besoins en mémoire.
Ensemble, en utilisant size=300, max_final_vocab=500000
devrait réduire la mémoire requise à moins de 2 Go.