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

如何解决如何使用 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() 方法:

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 的某些部分可能不会按预期运行。如果您对此有疑问,可以考虑在对其 Doc2Vec 进行任何直接篡改之前将完整的 model .dv 放在一边,和/或仅扩展完全独立的文档实例-vectors,例如将它们保存在一边(例如:model.dv.save(DOC_VECS_FILENAME))并将它们重新加载到单独的 KeyedVectors(例如:growing_docvecs = KeyedVectors.load(DOC_VECS_FILENAME))中。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?