如何将预训练模型加载到 gensim 中的方法之间存在歧义。 对于 .vec 文件和 fin_vec = path_to_vec_model
de_model = KeyedVectors.load_word2vec_format(fin_vec)
效果很好。在gensim文档中,它说对于.bin文件我应该添加binary = TRUE,但对于fin_bin = path_to_bin_model
de_model = KeyedVectors.load_word2vec_format(fin_bin, binary = TRUE)
抛出以下错误:
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte
gensim 文档还指出,对于 bin 模型,应该使用:
from gensim.models import FastText
de_model = gensim.models.fasttext.load_facebook_model(fin_bin)
这会加载模型,但似乎不可能运行单词类比查询
sims = de_model.most_similar(positive=["mother", "queen"], negative= "father"], topn=5)
AttributeError: 'FastText' object has no attribute 'most_similar'
我知道我可以尝试使用
model.wv.most_similar
,但我想严格比较两个模型,而不是使用不同的工具来这样做。理想情况下,我想使用类似 de_model = KeyedVectors.load_word2vec_format(fin_bin, binary = TRUE)
的东西加载 bin 模型。
不幸的是,仅仅查看扩展名为
.bin
的文件并了解其格式是不够的。
许多格式非常不同的文件倾向于使用该扩展名,因此需要有关文件来源的额外上下文才能知道应如何加载此类文件,并且选择错误的加载方法可能会导致错误。
.load_word2vec_format()
方法仅适用于具有简单的词向量列表的文件,采用面向行的格式,由Google发布的原始word2vec.c
代码(以及其他)使用。
那么,您尝试加载的文件的文件名是什么,它来自哪里,以及随文件一起提供的其创建/格式的解释是什么?
这些将有助于确定哪种方法合适。
另请注意,
binary = TRUE
不是惯用的或明智的 Python。 Python 布尔真值被命名为 True
,或者由许多非零/非空对象暗示,而变量 TRUE
的含义将取决于之前的代码,您没有显示这些代码,并且很容易出现不可能的错误如果使用标准/惯用 (& PEP8) 样式或参数规范 binary=True
。
此外,编写某些格式的某些代软件可能使用了编码,或者对令牌内容较为宽松,导致某些代读取软件可能难以读取。
因此,特别是在遇到错误时,您应该收集有关写入和无法读取相关文件的软件版本的信息。 (可以使用
.load_word2vec_format()
方法完成的另一个调试探针是使用可选的 limit
参数仅从文件前面读取一定数量的单词。
因为该格式 - 普通或“binary=True” - 以简单的逐行格式包含所有单词向量,如果通过探针您发现使用
limit=n
加载有效,但 limit=n+1
给出了与格式相关的错误,问题出在文件中的第 n+1
行左右。检查文件可能会发现该位置的一些独特之处,例如无意的截断,或给读者带来问题的编码/令牌内容的变化(来自写入例程)。
.load_facebook_model()
方法仅适用于由Facebook的FastText代码以其自己的自定义格式编写的完整模型文件。 没有特定文件路径fin_bin
可能通过任何形式的KeyedVectors.load_word2vec_format()
加载也适合使用FastText.load_facebook_model()
加载,因为格式完全不同。
不过,如果方法调用成功且没有错误,那么您应该已经加载了
FastText
模型。 Gensim 类 FastText
的完整模型对象没有 most_similar()
方法 - 解释您收到的错误 - 自 3.3.0(2018 年初)以来的所有版本的 Gensim 中。相反,与 Word2Vec
和 Doc2Vec
模型类一样,特定于词向量集的所有操作都应该通过完整模型的 .wv
(词向量)属性来完成,该属性包含一个对象,该对象是一些有点KeyedVectors
。
因此,如果
de_fasttext_model.most_similar()
给出错误,指出 most_similar
不是有效属性,de_fasttext_model.wv.most_similar()
可能会为您工作。