如何使用 Gensim Doc2Vec 模型获得未见过文档的相似度分数?

How to get similarity score for unseen documents using Gensim Doc2Vec model?

我已经为英语新闻推荐系统训练了一个 gensim doc2vec 模型。该模型使用 40K 新闻数据进行训练。我正在使用下面的代码来推荐前 5 个最相似的新闻,例如news_1:

inferred_vector = model.infer_vector(news_1)
sims = model.dv.most_similar([inferred_vector], topn=5)

问题是,如果我再向数据库中添加 100 条新闻数据(因此我们的数据库现在将有 40K + 100 条新闻数据)并重新 运行 相同的代码,代码将只能按照原来的40K(而不是40K+100)给我推荐新闻,换句话说,推荐的文章永远不会来自100篇文章。

如何在不需要重新训练模型的情况下解决这个问题?先谢谢你了!

Ps:由于我们的APP是做新闻的,所以每天都会有大量的新闻数据进入我们的数据库,所以我们不会考虑每天重新训练模型(这样做可能会导致我们的系统崩溃)后端服务器)。

对于初始已知的向量集,有一个最初由训练创建的批量连续向量结构。它适用于 most_similar() 核心的每个候选批量矢量计算 - 因此操作尽可能快地进行,并为您的 OS/processor.

提供正确的矢量库

但是,该结构最初设计时并未考虑增量扩展。事实上,如果你在一个密集数组中有 100 万个向量,那么想要在末尾加 1,直接的方法需要你分配一个新的 100 万和 1 长数组,批量复制超过 100 万,然后添加最后 1. 这行得通,但是看起来像“微小”的操作需要一段时间,并且随着结构的增长而变得越来越长。并且,对于批量复制,每次添加都会使临时内存使用量增加一倍以上。因此,在循环中单独添加一大堆新项目的天真模式可能非常缓慢且占用大量内存。

因此,Gensim 尚未专注于提供一组简单高效的向量,以增量 增长 新向量。但是,它仍然是间接的 可能 ,如果你理解这些注意事项。

特别是在 gensim-4.0.0 及更高版本中,.dv 文档向量集是 KeyedVectors 的一个实例,具有 class 的所有标准功能。其中包括 add_vector()add_vectors() 方法:

https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.KeyedVectors.add_vector

https://radimrehurek.com/gensim/models/keyedvectors.html#gensim.models.keyedvectors.KeyedVectors.add_vectors

您可以尝试这些方法将新的推断向量添加到 model.dv 对象 - 然后它们也将包含在后续 most_similar() 结果中。

但请记住:

  1. 以上关于性能和内存使用的注意事项 - 只要您的数据集不是太大,或者如果您偶尔进行较大批量的添加,这可能是次要问题。

  2. 包含 Doc2Vec 的模型通常不希望其内部 .dv 被其他代码任意修改或扩展。因此,一旦您开始这样做,model 的某些部分可能不会按预期运行。如果您对此有疑问,您可以考虑在直接篡改其 .dv、and/or 之前先保存完整的 Doc2Vec model,仅扩展一个完全独立的实例文档向量,例如将它们保存在一边(例如:model.dv.save(DOC_VECS_FILENAME))并将它们重新加载到单独的 KeyedVectors(例如:growing_docvecs = KeyedVectors.load(DOC_VECS_FILENAME))。