2016-12-02 6 views
0

Ich möchte die Wörter meines Gensim Word2Vec Modells durch ein Mapping ersetzen.Rename gensim Word2Vec Wörter mit Zuordnung

Beispiel

hat Ihr aktuelles Modell das Wort 'foo', der mit einem Vektor-Karten:

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

Ich habe das Mapping: d = {'foo': 'bar', ...}

Wie kann ich das Modell mit diesem neuen umbauen Zuordnung so, dass

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

Antwort

0

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') 
Verwandte Themen