如何一次性加载Word2Vec模型并复用内存缓存结果?
解决Word2Vec模型重复加载耗时问题
方法1:将模型转存为Gensim原生格式(推荐)
加载纯文本格式的.vec文件需要逐行解析,耗时极长。第一次加载后将模型保存为Gensim专用的序列化格式,后续加载速度会提升数倍甚至数十倍。
第一次运行(仅执行一次):
from gensim.models import KeyedVectors # 加载原始vec文件 model = KeyedVectors.load_word2vec_format('cc.en.300.vec', binary=False, encoding='utf8') # 保存为Gensim原生格式(文件后缀建议用.kv) model.save('cc.en.300.kv')
后续调用:
from gensim.models import KeyedVectors # 直接加载缓存的模型,速度大幅提升 model = KeyedVectors.load('cc.en.300.kv') # 直接获取wv对象使用 wv = model.wv
方法2:进程内全局缓存
如果是在同一个Python进程中多次调用模型,可以将模型实例全局化,仅在首次调用时加载,之后直接复用。
from gensim.models import KeyedVectors # 全局变量存储模型实例,初始为None _global_w2v_model = None def get_w2v_wv(): global _global_w2v_model if _global_w2v_model is None: # 仅第一次调用时加载原始文件 _global_w2v_model = KeyedVectors.load_word2vec_format('cc.en.300.vec', binary=False, encoding='utf8') # 返回wv对象供后续训练使用 return _global_w2v_model.wv
之后每次调用get_w2v_wv()时,只有第一次会触发加载逻辑,后续直接返回缓存好的wv对象。
方法3:使用Pickle序列化(不推荐)
虽然可以用Pickle保存wv对象,但Gensim模型有自身的序列化逻辑,Pickle可能存在版本兼容性问题,仅作为备选方案。
第一次运行(仅执行一次):
import pickle from gensim.models import KeyedVectors model = KeyedVectors.load_word2vec_format('cc.en.300.vec', binary=False, encoding='utf8') # 保存wv对象 with open('w2v_wv.pkl', 'wb') as f: pickle.dump(model.wv, f)
后续调用:
import pickle # 加载缓存的wv对象 with open('w2v_wv.pkl', 'rb') as f: wv = pickle.load(f)
注意:优先使用方法1,Gensim原生的
save/load方法针对模型做了优化,稳定性和加载速度都更有保障。
内容的提问来源于stack exchange,提问作者Milad Xandi
相关产品推荐
相关产品推荐

