【发布时间】:2020-09-17 03:11:39
【问题描述】:
我有一个从项目-项目图构建的“语料库”,这意味着每个句子都是一个图形步行路径,每个单词都是一个项目。我想在语料库上训练一个 word2vec 模型来获取项目的嵌入向量。该图每天都会更新,因此 word2vec 模型会以更多方式进行训练(使用 Word2Vec.save() 和 Word2Vec.load())以不断更新项目的向量。
与文字不同,我的语料库中的项目有其生命周期,并且每天都会添加新项目。为了防止模型大小的不断增长,我需要丢弃达到其生命周期的项目,同时保持模型可训练。我读过类似的问题
here,但这个问题的答案与增加训练无关,而是基于KeyedVectors。我想出了下面的代码,但我不确定它是否正确和正确:
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 是否仍然在元素方面对应?上面的代码有副作用吗?如果我的方法不好,有人可以举个例子来说明如何正确删除旧的“单词”并保持模型可训练吗?
【问题讨论】: