我正在使用word2vec模型,在存储和读取模型时遇到问题。
import gensim.models.keyedvectors as w2v
from gensim.models import KeyedVectors
word_vectors = w2v.wv
word_vectors.save(filepath + "Vectors.bin")
m = word2vec.KeyedVectors.load_word2vec_format(filepath + "Vectors.bin", binary=True)
我收到以下错误:
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
通过下面的方式,工作将起作用:
vectors = KeyedVectors.load(filepath + "Vectors.bin", mmap='r')
但是如果我再打电话
vectors.similar_by_word("cat")
我收到以下错误:TypeError:**或pow()不支持的操作数类型:“列表”和“整数”
我做错了什么?如何使用save_word2vec_format()函数?
您执行import gensim.models.keyedvectors as w2v
和word_vectors = w2v.wv
的初始代码块没有多大意义。
从字面上看,这是将完整的Python代码模块gensim.models.keyedvectors
分配给变量w2v
。该模块将不会具有.wv
属性,因此我甚至不希望word_vectors = w2v.wv
能够执行。除非您没有显示很多其他训练代码,否则肯定不会导致word_vectors
成为经过训练的单词向量的实际集合。
您确定问题中的代码是否代表您的实际工作?
但是,如果您确实成功地使word_vectors
容纳了gensim
的KeyedVectors
对象之一,并填充了要保存的单词向量,那么您有两种选择:
要以与Google原始word2vec.c
版本相同的格式保存单词向量,可以使用.save_word2vec_format(path, ...)
方法。然后,要稍后重新加载这些向量,可以使用匹配的reloaded_vectors = KeyedVectors.load_word2vec_format(path, ...)
方法。
要以gensim
自己的基于Python的格式保存单词向量,可以使用.save(path)
方法。然后,要稍后重新加载这些向量,可以使用匹配的reloaded_vectors = KeyedVectors.load(path)
方法。这种方法可以节省更多信息(如果您的培训中提供的话),例如字数统计。为了提高对象的效率,它可以将大部分矢量存储到单独的文件中,如果将文件移到其他位置,则应将其保留在主path
文件旁边,并允许(但不要求)使用[ C0]选项。
您无法混合和匹配这些格式:mmap
保存的文件只能由save_word2vec_format()
读取,而load_word2vec_format()
保存的文件只能由save()
读取。
关于您的其他load()
,没有足够的信息来推测出了什么问题。您需要编辑答案以添加更多详细信息,并使演示代码自洽。
例如,您显示加载到名为TypeError
的变量,但随后加载了名为vectors
的变量。这种差异表明问题可能是您未显示的代码中存在其他一些不匹配。
类似地,如果遇到任何错误,则应在问题中精确引用错误消息并报告完整的错误堆栈,以便答复者可以准确地看到代码中的哪几行代码以及所依赖的库文件,正是您的错误。 (这通常可以帮助您准确定位期望/代码偏离库要求的位置。)