Eine Lösung besteht darin, das Modell im C-basierten Word2vec-Format zu speichern und die ursprünglichen Wörter durch eine Zuordnung der neuen Wörter zu ersetzen, indem awk
verwendet wird.
Angenommen wir eine Dateizuordnung der Form haben:
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[$1]=$2; next} FNR==1{print $0} FNR!=1{$1=a[$1]; print $0}' 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()
Als Neben meinem Mapping tatsächlich ein Array war, wo ich mit dem Training auf das war:
$ cat map.txt
foo:bar
...
wir das Modell über neu erstellen können Index des Wortes in einem Array arr
. Ich habe die Map-Datei mit numpy erstellt:
import numpy as np
np.savetxt('map.txt', np.c_[np.arange(arr.size), arr], '%d:%s')