2017-08-02 1 views
0

Après avoir créé des vecteurs de mots dans Gensim 2.2.0 à partir de fichiers texte anglais simple avec classement des films IMDB:Gensim: vecteurs de mots codant pour des problèmes

import gensim, logging 
import smart_open, os 
from nltk.tokenize import RegexpTokenizer 

VEC_SIZE = 300 
MIN_COUNT = 5 
WORKERS = 4 
data_path = './data/' 
vectors_path = 'vectors.bin.gz' 

class AllSentences(object): 
    def __init__(self, dirname): 
     self.dirname = dirname 
     self.read_err_cnt = 0 
     self.tokenizer = RegexpTokenizer('[\'a-zA-Z]+', discard_empty=True) 

    def __iter__(self): 
     for fname in os.listdir(self.dirname): 
      print(fname) 
      for line in open(os.path.join(self.dirname, fname)): 
       words = []  
       try: 
        for word in self.tokenizer.tokenize(line): 
         words.append(word) 
        yield words 
       except: 
        self.read_err_cnt += 1 

sentences = AllSentences(data_path) 

modèle de formation et d'économie:

model = gensim.models.Word2Vec(sentences, size=VEC_SIZE, 
           min_count=MIN_COUNT, workers=WORKERS) 
word_vectors = model.wv 
word_vectors.save(vectors_path) 

Et puis essayer pour le charger en arrière:

vectors = KeyedVectors.load_word2vec_format(vectors_path, 
                binary=True, 
                unicode_errors='ignore') 

Je reçois 'UnicodeDecodeError: le codec 'utf-8' ne peut pas décoder l'octet 0x80 en position 0 'exception (voir ci-dessous). J'ai essayé différentes combinaisons de paramètres d'encodage '' y compris 'ISO-8859-1' et 'Latin1'. Également différentes combinaisons de 'binaire = Vrai/Faux'. Rien ne aide - la même exception, quels que soient les paramètres utilisés. Qu'est-ce qui ne va pas? Comment faire fonctionner les vecteurs de chargement?

Exception:

UnicodeDecodeError      Traceback (most recent call last) 
<ipython-input-64-f353fa49685c> in <module>() 
----> 1 w2v = get_w2v_vectors() 

<ipython-input-63-cbbe0a76e837> in get_w2v_vectors() 
     3  vectors = KeyedVectors.load_word2vec_format(word_vectors_path, 
     4              binary=True, 
----> 5              unicode_errors='ignore') 
     6 
     7             #unicode_errors='ignore') 

D:\usr\anaconda\lib\site-packages\gensim\models\keyedvectors.py in load_word2vec_format(cls, fname, fvocab, binary, encoding, unicode_errors, limit, datatype) 
    204   logger.info("loading projection weights from %s", fname) 
    205   with utils.smart_open(fname) as fin: 
--> 206    header = utils.to_unicode(fin.readline(), encoding=encoding) 
    207    vocab_size, vector_size = map(int, header.split()) # throws for invalid file format 
    208    if limit: 

D:\usr\anaconda\lib\site-packages\gensim\utils.py in any2unicode(text, encoding, errors) 
    233  if isinstance(text, unicode): 
    234   return text 
--> 235  return unicode(text, encoding, errors=errors) 
    236 to_unicode = any2unicode 
    237 

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte 

Répondre

1

Si vous enregistrez des vecteurs en utilisant la méthode save() natif de gensim, vous devez les charger avec la méthode load() native. Si vous souhaitez charger des vecteurs en utilisant load_word2vec_format(), vous devez les enregistrer avec save_word2vec_format(). (Vous perdrez certaines informations de cette façon, comme le nombre d'occurrences exactes qui se trouveraient autrement dans les éléments du dictionnaire KeyedVectors.vocab.)