gensim 4.0.0替代intersect_word2vec_format的预训练词向量处理方法
Gensim 4.0 复刻旧版 intersect_word2vec_format 功能方案
你对旧版本intersect_word2vec_format方法的作用理解完全准确,Gensim 4.0之后没有保留该独立方法,我们可以通过KeyedVectors加载预训练向量后手动匹配赋值实现完全一致的效果,最简洁的实现方式如下:
from gensim.models import Word2Vec from gensim.models import KeyedVectors # 初始化模型、构建自定义词表,逻辑和旧版代码完全一致 word_vectors = Word2Vec(vector_size=word_vector_dim, min_count=1) word_vectors.build_vocab(corpus_iterable) # 加载GoogleNews预训练词向量 pretrained_kv = KeyedVectors.load_word2vec_format( pretrained_dir + 'GoogleNews-vectors-negative300.bin.gz', binary=True ) # 匹配替换:预训练中存在的词用预训练向量,不存在的保留原有随机初始化值 for idx, word in enumerate(word_vectors.wv.index_to_key): if word in pretrained_kv: word_vectors.wv.vectors[idx] = pretrained_kv[word]
如果你的词表规模较大,想进一步提升执行效率,可以使用向量化操作替代循环,实现方式如下:
# 获取本地词表词在预训练向量中的索引,不存在的词返回-1 match_indexes = pretrained_kv.get_index(word_vectors.wv.index_to_key, default=-1) # 过滤出存在匹配的词的掩码 valid_mask = match_indexes != -1 # 批量替换匹配成功的词的向量 word_vectors.wv.vectors[valid_mask] = pretrained_kv.vectors[match_indexes[valid_mask]]
以上两种实现的效果和旧版intersect_word2vec_format完全一致:
- 仅覆盖本地词表中同时出现在预训练词表的词的向量
- 本地词表中未出现在预训练集的词,维持原有随机初始化值不变
- 预训练集里有但本地词表没有的词不会被加入当前模型,不影响原有训练逻辑
内容的提问来源于stack exchange,提问作者gammapoint
相关产品推荐
相关产品推荐

