2015-11-30 7 views
13

So che questa domanda è stata già posta, ma non ero ancora in grado di trovare una soluzione per questo.Python: gensim: RuntimeError: devi prima costruire il vocabolario prima di allenare il modello

Vorrei utilizzare gensim word2vec su un set di dati personalizzato, ma ora sto ancora cercando in quale formato deve essere il set di dati. Ho dato un'occhiata a this post dove l'input è fondamentalmente un elenco di liste (una grande lista contenente altre liste che sono frasi tokenizzate dal corpus di NLTK Brown). Quindi ho pensato che questo fosse il formato di input che devo usare per il comando word2vec.Word2Vec(). Tuttavia, non funzionerà con il mio piccolo test set e non capisco perché.

Quello che ho cercato:

Questo lavorato:

from gensim.models import word2vec 
from nltk.corpus import brown 
import logging 
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) 

brown_vecs = word2vec.Word2Vec(brown.sents()) 

questo non ha funzionato:

sentences = [ "the quick brown fox jumps over the lazy dogs","yoyoyo you go home now to sleep"] 
vocab = [s.encode('utf-8').split() for s in sentences] 
voc_vec = word2vec.Word2Vec(vocab) 

Non capisco il motivo per cui non è così lavora con i dati "finti", anche se ha la stessa struttura dati delle frasi del corpus Brown:

vocab:

[['the', 'quick', 'brown', 'fox', 'jumps', 'over', 'the', 'lazy', 'dogs'], ['yoyoyo', 'you', 'go', 'home', 'now', 'to', 'sleep']] 

brown.sents(): (all'inizio di esso)

[['The', 'Fulton', 'County', 'Grand', 'Jury', 'said', 'Friday', 'an', 'investigation', 'of', "Atlanta's", 'recent', 'primary', 'election', 'produced', '``', 'no', 'evidence', "''", 'that', 'any', 'irregularities', 'took', 'place', '.'], ['The', 'jury', 'further', 'said', 'in', 'term-end', 'presentments', 'that', 'the', 'City', 'Executive', 'Committee', ',', 'which', 'had', 'over-all', 'charge', 'of', 'the', 'election', ',', '``', 'deserves', 'the', 'praise', 'and', 'thanks', 'of', 'the', 'City', 'of', 'Atlanta', "''", 'for', 'the', 'manner', 'in', 'which', 'the', 'election', 'was', 'conducted', '.'], ...] 

Qualcuno può dirmi che cosa sto facendo male?

risposta

31

Il valore predefinito min_count in gensim's Word2Vec è impostato su 5. Se nel vocab non è presente una parola con frequenza maggiore di 4, il tuo vocab sarà vuoto e quindi l'errore. Prova

voc_vec = word2vec.Word2Vec(vocab, min_count=1) 
+1

Anche se i dati provengono da un iteratore, si assicura che non sia già stato consumato. – osa

0

ingresso al Word2Vec del gensim può essere un elenco di frasi o elenco di parole o elenco di elenco di frasi.

E.g.

1. sentences = ['I love ice-cream', 'he loves ice-cream', 'you love ice cream'] 
2. words = ['i','love','ice - cream', 'like', 'ice-cream'] 
3. sentences = [['i love ice-cream'], ['he loves ice-cream'], ['you love ice cream']] 

costruire il vocabolario prima dell'allenamento

model.build_vocab(sentences, update=False) 

just check out the link for detailed info

-1

Come suggerito da kampta, diminuire la min_count o, modificare il corpus di aumentare le ripetizioni di parole.