在 gensim 中加载 .bin 模型的方法不明确

问题描述 投票:0回答:1

如何将预训练模型加载到 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 模型。

gensim
1个回答
0
投票

不幸的是,仅仅查看扩展名为

.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()
可能会为您工作。

© www.soinside.com 2019 - 2024. All rights reserved.