我在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**
任何提示如何解决问题? 提前谢谢。
答案 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)
希望这有帮助!