使用映射重命名 gensim Word2Vec 单词

Rename gensim Word2Vec words with mapping

我想用映射替换我的 gensim Word2Vec 模型中的单词。

例子

我当前的模型有单词 'foo' 映射到向量:

>>> model['foo']
[1.0 0.0]

我有映射:d = {'foo': 'bar', ...}

如何使用这个新映射重建模型,使得

>>> model['bar']  # in place of 'foo'
[1.0 0.0]

一种解决方案是以基于 C 的 word2vec 格式保存模型,并使用 awk.

将原始单词替换为新单词的映射

假设我们有以下形式的文件映射:

$ cat map.txt
foo:bar
...

我们可以通过以下方式重新创建模型:

import subprocess as sp
import shlex

from gensim.models import Word2Vec

model.save_word2vec_format('embeddings.txt', binary=False)

CMD = r"""
awk -F'[ ]|:' 'FNR==NR {a[]=; next} FNR==1{print [=11=]} FNR!=1{=a[]; print [=11=]}' map.txt embeddings.txt
"""

with open('new_embeddings.txt', 'w') as f:
    p = sp.Popen(shlex.split(CMD), stdout=f)

new_model = Word2Vec.load_word2vec_format('new_embeddings.txt')

new_model.create_binary_tree()

顺便说一句,我的映射实际上是一个数组,我在其中训练某个数组中单词的索引 arr。我使用 numpy 创建了地图文件:

import numpy as np

np.savetxt('map.txt', np.c_[np.arange(arr.size), arr], '%d:%s')