使用 gensim 4.0.0 与预训练词向量相交的过程

Process to intersect with pre-trained word vectors with gensim 4.0.0

我正在尝试从使用旧版 gensim 的示例中学习。特别是,我有一段代码如下:

word_vectors = Word2Vec(vector_size=word_vector_dim, min_count=1)
word_vectors.build_vocab(corpus_iterable)
word_vectors.intersect_word2vec_format(pretrained_dir + 'GoogleNews-vectors-negative300.bin.gz', binary=True)

我的理解是,这会在可用时使用预训练的词向量填充词向量词汇表。当我的词汇表中的单词不在预训练向量中时,它们会被初始化为随机值。然而,intersect_word2vec_format 方法在最新版本的 gensim 中不存在。在 gensim 4.0.0 中复制这个过程的最干净的方法是什么?

.intersect_word2vec_format() 方法仍然存在,但作为对一组词向量的操作,已移至 KeyedVectors。所以在某些情况下,在 Word2Vec 模型本身上调用该方法的旧代码将需要在模型的 .wv 属性 上调用它,持有一个 KeyedVectors 对象,而不是.例如:

w2v_model = Word2Vec(vector_size=word_vector_dim, min_count=1)
w2v_model.build_vocab(corpus_iterable)
# (you'll likely need another workaround here, see below)
w2v_model.wv.intersect_word2vec_format(pretrained_dir + 'GoogleNews-vectors-negative300.bin.gz', binary=True)

但是,您仍然会遇到一些问题:

  • 它一直充其量只是一种实验性的高级功能,而不是任何有据可查的流程的一部分。因此,如果您能够 review its source code,并且了解使用此类(部分)预初始化的词向量、可能进一步训练或可能冻结(取决于选择的 vectors_lockf 个值)。
  • 同样实验性的 vectors_lockf 功能现在在 Gensim 4+ 中需要知识渊博的人手动初始化 - & 因为 .intersect_word2vec_format() 假定特定的预分配,该方法将在 Gensim 4.1 中中断没有明确的解决方法。参见 this open issue for more details

最普遍的是:使用其他词向量进行预初始化充其量是一种繁琐的高级技术,因此请务必研究代码,考虑潜在的权衡,并仔细评估其对最终结果的影响,然后再拥抱它。这不是一个简单、自动或特征明确的快捷方式。