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

Gensim doc2vec produce more vectors than given documents, when I pass unique integer id as tags

我正在尝试使用 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)的向量是怎么出来的?它们是作为空白计算的吗?

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

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

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

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

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