我有一个现有的 gensim Doc2Vec 模型,我正在尝试对训练集和模型进行迭代更新。
我接受新文件,并照常执行预处理:
stoplist = nltk.corpus.stopwords.words('english')
train_corpus= []
for i, document in enumerate(corpus_update['body'].values.tolist()):
train_corpus.append(gensim.models.doc2vec.TaggedDocument([word for word in gensim.utils.simple_preprocess(document) if word not in stoplist], [i]))
Run Code Online (Sandbox Code Playgroud)
然后我加载原始模型,更新词汇表,并重新训练:
#### Original model
## model = gensim.models.doc2vec.Doc2Vec(dm=0, size=300, hs=1, min_count=10, dbow_words= 1, negative=5, workers=cores)
model = Doc2Vec.load('pvdbow_model_6_06_12_17.doc2vec')
model.build_vocab(train_corpus, update=True)
model.train(train_corpus, total_examples=model.corpus_count, epochs=model.iter)
Run Code Online (Sandbox Code Playgroud)
然后我通过附加新数据来更新训练集 Pandas 数据框,并重置索引。
corpus = corpus.append(corpus_update)
corpus = corpus.reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将 infer_vector() 与更新的模型一起使用时:
inferred_vector = model1.infer_vector(tokens)
sims = model.docvecs.most_similar([inferred_vector], topn=len(model.docvecs))
Run Code Online (Sandbox Code Playgroud)
结果质量很差,表明模型和训练集数据框的索引不再匹配。
当我将它与未更新的训练集数据框(再次使用更新的模型)进行比较时,结果很好 - 但是,显然我错过了新文档。
无论如何都要更新两者,因为我希望能够在不完全重新训练模型的情况下对模型进行频繁更新?