2017-01-02 5 views
0

저는 파이썬에서 word2vec 모델을 사용하기 위해 첫 번째 앱을 작성하고 있습니다. 여기 내 간단한 코드w2v를 사용하는 동안 파이썬에서 인코딩 문제가 발생했습니다.

import gensim, logging 
import sys 
import warnings 
from gensim.models import Word2Vec 

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO) 

def main(): 
    ####LOAD MODEL 
    model = Word2Vec.load_word2vec_format('models/vec-cbow.txt', binary=False) 
    model.similarity('man', 'women') 

if __name__ == '__main__': 
    with warnings.catch_warnings(): 
     warnings.simplefilter("error") 
     #warnings.simplefilter("ignore") 
    main() 

나는이 다음과 같은 오류가 있습니다 :

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 96-97: invalid continuation byte 

나는이 두 줄을 추가하여 해결을 시도,하지만 난 여전히 오류를 받고 있어요.

reload(sys) # Reload does the trick! 
sys.setdefaultencoding('UTF8') #UTF8 #latin-1 

w2v 모델은 영어 문장에 대해 교육을 받았습니다.

편집 :

**%run "...\getSimilarity.py"** 
--------------------------------------------------------------------------- 
UnicodeDecodeError      Traceback (most recent call last) 
**...\getSimilarity.py in <module>()** 
    64   warnings.simplefilter("error") 
    65   #warnings.simplefilter("ignore") 
---> 66  main() 

**...\getSimilarity.py in main()** 
    30  ####LOAD MODEL 
---> 31  model = Word2Vec.load_word2vec_format('models/vec-cbow.txt', binary=False) # C binary format 
    32  model.similarity('man', 'women') 

**...\AppData\Local\Enthought\Canopy\User\lib\site-packages\gensim-0.12.4-py2.7-win-amd64.egg\gensim\models\word2vec.pyc in load_word2vec_format(cls, fname, fvocab, binary, encoding, unicode_errors)** 
    1090    else: 
    1091     for line_no, line in enumerate(fin): 
-> 1092      parts = utils.to_unicode(line.rstrip(), encoding=encoding, errors=unicode_errors).split(" ") 
    1093      if len(parts) != vector_size + 1: 
    1094       raise ValueError("invalid vector on line %s (is this really the text format?)" % (line_no)) 

**...\AppData\Local\Enthought\Canopy\User\lib\site-packages\gensim-0.12.4-py2.7-win-amd64.egg\gensim\utils.pyc in any2unicode(text, encoding, errors)** 
    215  if isinstance(text, unicode): 
    216   return text 
--> 217  return unicode(text, encoding, errors=errors) 
    218 to_unicode = any2unicode 
    219 

**...\AppData\Local\Enthought\Canopy\App\appdata\canopy-1.6.2.3262.win-x86_64\lib\encodings\utf_8.pyc in decode(input, errors)** 
    14 
    15 def decode(input, errors='strict'): 
---> 16  return codecs.utf_8_decode(input, errors, True) 
    17 
    18 class IncrementalEncoder(codecs.IncrementalEncoder): 

**UnicodeDecodeError: 'utf8' codec can't decode bytes in position 96-97: invalid continuation byte** 

어떤 힌트를 어떻게 문제를 해결하기 : 여기에 전체 스택입니까? 미리 감사드립니다.

+0

'models/vec-cbow.txt'의 크기는 어느 정도입니까? 파일 공유 웹 사이트를 통해 질문에 포함시킬 수 있습니까? 'utf-8'로 인코딩 된 것 같지 않습니다. – MYGz

+0

2.25GB입니다. 나는 당신이 "파일 공유 웹 사이트를 통해 질문에 포함시킬 수 있습니까?"라는 말을 얻지 못했습니까? – sareem

+0

아니, 너무 큽니다. 아니야. – MYGz

답변

0

간단히이 FAQ 페이지를 읽고 해결책을 찾았습니다. "모델에 저장된 문자열 (단어)은 유효하지 않습니다 utf8 기본적으로 gensim은 엄격한 인코딩 설정을 사용하여 단어를 디코딩합니다. 따라서 utf8 시퀀스가 ​​올바르지 않으면 위의 예외가 적용됩니다."

+0

다른 오류가 나타납니다 :'ValueError : 0 행의 유효하지 않은 벡터' – lenhhoxung

0

수정가 옆에 있고 그것이하려면 다음 중 하나를

A) 유니 코드 및 UTF8 (예 : gensim)을 이해하는 프로그램을 사용하여 모델을 저장합니다. 일부 C 및 Java word2vec 도구는 바이트 경계에서 문자열을 자르는 것으로 알려져 있으며, 이로 인해 다중 바이트 utf8 문자가 반으로 절단되어 utf8이 유효하지 않게되어이 오류가 발생할 수 있습니다.

b) load_word2vec_model을 실행할 때 unicode_errors 플래그를 설정하십시오. load_word2vec_model (..., unicode_errors = '무시'). 이렇게하면 오류가 사라지지만 utf8 문제는 계속 발생합니다.이 경우 utf8 문자가 무시됩니다.

이유 :

문자열 모델에 저장 (단어) 유효 UTF8하지 않습니다. 기본적으로 gensim은 엄격한 인코딩 설정을 사용하여 단어를 디코딩합니다.이 경우 잘못된 utf8 시퀀스가 ​​발견 될 때마다 위의 예외가 적용됩니다.

는 gensim 자주 묻는 질문에서 gensim's FAQ

0

로부터 --picked 할 수 있습니다 '무시'또는 어떤 경우에 전부는 아니지만 작동하는 것 같다있는 '대체'로 unicode_errors 설정에 대한 해당 옵션. 당신이 함수의 특정 도움말 보면

는 그러나이있다 :

binary is a boolean indicating whether the data is in binary word2vec format 

이것은 word2vec 모델은 바이너리로하고되지 않은 인코딩 된 문자열로 저장됩니다 beause입니다. 따라서이 모든 경우에 binary = True을 설정하면됩니다. 당신이 here에서 구글 사전 훈련 모델을 사용하려는 경우

예를 들어,이 작업을해야합니다 :

google_model = gensim.models.KeyedVectors.load_word2vec_format('./GoogleNews-vectors-negative300.bin', binary = True) 

희망이 도움이!