当我将唯一的整数 id 作为标签传递时,Gensim doc2vec 产生的向量比给定的文档多

我正在尝试使用 doc2vec 制作 gensim 示例的文档向量。 我通过了包含 9 个文档和 9 个标签的 TaggedDocument。

from gensim.test.utils import common_texts
from gensim.models.doc2vec import Doc2Vec,TaggedDocument
idx = [0,1,2,3,4,5,6,7,100]
documents = [TaggedDocument(doc,[i]) for doc,i in zip(common_texts,idx)]
model = Doc2Vec(documents,vector_size=5,window=2,min_count=1,workers=4)

它会产生 101 个像这个图像一样的向量。 gensim doc2vec produced 101 vectors

我想知道的是

  1. 如何确保我传递的标签附加到正确的向量上?
  2. 带有我没有通过的标签(在我的例子中是 8~99)的向量是如何出来的?它们是作为空白计算的吗?
tangshuo4444 回答:当我将唯一的整数 id 作为标签传递时,Gensim doc2vec 产生的向量比给定的文档多

如果您使用普通整数作为文档标签,那么 Doc2Vec 模型将为每个整数分配足够的文档向量,直到您提供的最高整数 - 即使您不使用其中一些整数.

这个假设,直到最高声明的所有整数都被使用,允许代码避免创建冗余的 {tag -> slot} 字典,节省一点内存。这种特定的潜在节省是支持纯整数(而不是唯一字符串)作为标签名称的主要原因。

任何此类已分配但从未接受任何训练的文档向量将与其他文档向量一样随机初始化 - 但不会通过训练进行调整。

如果您想使用普通的 int 标记名称,您应该对这种过度分配感到满意,或者确保只使用从 0 到最大 ID 的所有连续 int ID,没有未使用的。但是除非你的训练数据非常大,否则使用唯一的字符串标签,并允许创建 {tag -> slot} 字典,这很简单,而且在内存中也不会太昂贵。

(另外:min_count=1 在这些算法中几乎总是一个坏主意,因为丢弃稀有令牌往往比让它们的瘦示例用法干扰其他训练会产生更好的结果。)

本文链接:https://www.f2er.com/4663.html

大家都在问