使用w2v时在python中编码问题

时间:2017-01-02 16:55:15

标签: python gensim word2vec

我在python中编写我的第一个应用程序以使用word2vec模型。 这是我的简单代码

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** 

任何提示如何解决问题? 提前谢谢。

3 个答案:

答案 0 :(得分:0)

我只是通过阅读此FAQ页面找到了解决方案。 “存储在模型中的字符串(单词)无效utf8。默认情况下,gensim使用严格编码设置对单词进行解码,只要遇到无效的utf8序列,就会导致上述异常。”

答案 1 :(得分:0)

修复就在你身边,它是:

a)使用了解unicode和utf8的程序(例如gensim)存储模型。已知一些C和Java word2vec工具在字节边界处截断字符串,这可能导致将多字节utf8字符切成两半,使其无效utf8,从而导致此错误。

b)运行load_word2vec_model时设置unicode_errors标志,例如load_word2vec_model(...,unicode_errors =&#39;忽略&#39;)。请注意,这会使错误无效,但utf8问题仍然存在 - 在这种情况下,无效的utf8字符将被忽略。

<强>原因:

模型中存储的字符串(单词)无效utf8。默认情况下,gensim使用严格编码设置对单词进行解码,只要遇到无效的utf8序列,就会导致上述异常。

- 从gensim's FAQ

领取

答案 2 :(得分:0)

从gensim常见问题解答中,您可以选择将unicode_errors设置为&#39;忽略&#39;或者&#39;替换&#39;,这似乎在某些场合有效,但不是全部。

但是如果你看看函数的具体帮助,还有:

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

这是因为word2vec模型保存为二进制而不是任何编码字符串。因此,只需设置binary = True即可适用于所有这些情况。

例如,如果您尝试使用here中的谷歌预训练模型,这应该有效:

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

希望这有帮助!