Gensim加载.bin预训练模型的方法歧义及问题求助
Gensim预训练模型加载统一方案问题
问题场景
.vec模型加载正常:使用KeyedVectors.load_word2vec_format()可成功加载,代码如下:from gensim.models import KeyedVectors fin_vec = "path_to_vec_model" de_model = KeyedVectors.load_word2vec_format(fin_vec).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.bin模型加载成功但调用失败:改用load_facebook_model()加载后,调用most_similar()时提示属性不存在:
错误信息: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'
需求:希望用统一方式加载两种模型,保证后续调用接口一致,方便对比。
解决方案
根本原因
Facebook发布的FastText .bin模型采用专属格式,并非原始Word2Vec二进制格式,因此KeyedVectors.load_word2vec_format()无法直接解析。
统一加载实现
通过让两种模型加载后都返回KeyedVectors对象,实现接口统一:
加载
.vec模型:保持原有方式,直接得到KeyedVectors实例from gensim.models import KeyedVectors vec_model = KeyedVectors.load_word2vec_format("path_to_vec_model")加载
.bin模型:加载后提取wv属性(该属性为KeyedVectors类型)from gensim.models.fasttext import load_facebook_model bin_model = load_facebook_model("path_to_bin_model").wv
统一调用示例
现在两个模型对象类型一致,可直接使用相同接口执行操作:
# .vec模型类比查询 vec_results = vec_model.most_similar(positive=["mother", "queen"], negative=["father"], topn=5) # .bin模型类比查询 bin_results = bin_model.most_similar(positive=["mother", "queen"], negative=["father"], topn=5)
这样既满足了统一加载的需求,又能保证后续操作接口完全一致,便于对比两种模型的结果。
内容的提问来源于stack exchange,提问作者la_lo_ca
相关产品推荐
相关产品推荐

