我有一个从项目-项目图构建的“语料库”,这意味着每个句子都是一个图行走路径,每个单词都是一个项目。我想在语料库上训练 word2vec 模型以获得项目的嵌入向量。该图每天都会更新,因此 word2vec 模型会以增加的方式(使用Word2Vec.save()
和Word2Vec.load()
)进行训练,以不断更新项目的向量。
与文字不同,我的语料库中的项目有其生命周期,并且每天都会添加新项目。为了防止模型大小不断增长,我需要删除达到其生命周期的项目,同时保持模型可训练。我想出了下面的代码,但我不确定它是否正确和正确:
from gensim.models import Word2Vec
import numpy as np
texts = [["a", "b", "c"], ["a", "h", "b"]]
m = Word2Vec(texts, size=5, window=5, min_count=1, workers=1)
print(m.wv.index2word)
print(m.wv.vectors)
# drop old words
wordsToDrop = ["b", "c"]
for w in wordsToDrop:
i = m.wv.index2word.index(w)
m.wv.index2word.pop(i)
m.wv.vectors = np.delete(m.wv.vectors, i, axis=0)
del m.wv.vocab[w]
print(m.wv.index2word)
print(m.wv.vectors)
m.save("m.model")
del m
# increased training
new = [["a", "e", "n"], ["r", "s"]]
m = Word2Vec.load("m.model")
m.build_vocab(new, update=True)
m.train(new, total_examples=m.corpus_count, epochs=2)
print(m.wv.index2word)
print(m.wv.vectors)
删除和增加训练后,m.wv.index2word和m.wv.vectors仍然元素对应吗?上面的代码有副作用吗?如果我的方法不好,有人可以给我一个例子来展示如何正确删除旧的“单词”并保持模型可训练吗?
函数式编程
相关分类