如何解决如何使用 Gensim Doc2Vec 模型获得未见过文档的相似度分数?
我已经为英语新闻推荐系统训练了一个 gensim doc2vec 模型。该模型使用 40K 新闻数据进行训练。我正在使用下面的代码来推荐前 5 个最相似的新闻,例如新闻_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()
核心的每个候选批量向量计算 - 因此操作尽可能快地进行,并为您的操作系统/处理器提供正确的向量库。
但是,该结构最初的设计并没有考虑到增量扩展。确实,如果你在一个密集数组中有 100 万个向量,然后想在末尾加 1,直接的方法要求你分配一个新的 100 万加 1 长数组,批量复制超过 100 万,然后添加最后一个。这可行,但是看起来像“微小”的操作需要一段时间,并且随着结构的增长而持续时间更长。并且,对于批量复制,每个添加的临时内存使用量都会增加一倍以上。因此,在循环中单独添加一大堆新项目的幼稚模式可能会非常缓慢且占用大量内存。
因此,Gensim 尚未专注于提供一组矢量,该矢量集可以轻松高效地增长新矢量。但是,如果您了解警告,这仍然是间接的可能。
特别是在 gensim-4.0.0
及更高版本中,.dv
文档向量集是 KeyedVectors
的实例,具有该类的所有标准功能。这包括 add_vector()
和 add_vectors()
方法:
您可以尝试这些方法将新的推断向量添加到 model.dv
对象 - 然后它们也将包含在后续 most_similar()
结果中。
但请记住:
-
以上关于性能和内存使用的警告 - 只要您的数据集不是太大,或者如果您偶尔进行较大批量的添加,这可能是次要的问题。
-
包含
Doc2Vec
的模型通常不期望其内部.dv
被其他代码任意修改或扩展。因此,一旦您开始这样做,model
的某些部分可能不会按预期运行。如果您对此有疑问,可以考虑在对其Doc2Vec
进行任何直接篡改之前将完整的model
.dv
放在一边,和/或仅扩展完全独立的文档实例-vectors,例如将它们保存在一边(例如:model.dv.save(DOC_VECS_FILENAME)
)并将它们重新加载到单独的KeyedVectors
(例如:growing_docvecs = KeyedVectors.load(DOC_VECS_FILENAME)
)中。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。