Doc2vec 仅针对单个文档而不是两个文档向量输出数据

Doc2vec output data for only a single document and not two documents vectors

我尝试构建一个简单的程序来测试我对 Doc2Vec 的理解,似乎我还有很长的路要走才能知道它。

我知道文档中的每个句子首先都被标记为自己的标签,对于 doc2vec 它将学习这些标签的向量。例如,据我所知,假设我们有一个包含 3 个句子的列表。

[["I have a pet"], ["They have a pet"], ["she has no pet"]]

然后我们把它分成 3 个句子

["I have a pet"]
["They have a pet"]
["she has no pet"]

并使用 gensim TaggedDocument 或您构建的任何方法用标签标记每个句子。

["I", "have", "a", "pet"] Tag= positive
["They", "have", "a", "pet"] Tag= positive
["she", "has", "no", "pet"] Tag= negative

然后我们使用Doc2Vec gensim库来构建模型,build_vocab并训练它。

我期望的是,每个句子的每个标签都根据另一个句子标签学习向量;然后像 Word2Vec 中那样为每个标签输出向量,但在 word2vec 中,向量是针对每个单词的。

如果我没看错的话,应该是这样的:

["I have a pet"] Vectors = [-0.13150065 -0.13182896 -0.1564866 ]
["They have a pet"] Vectors = [-0.13150065 -0.13182896 -0.1564866 ]
["she has no pet"] Vectors = [ 0.14937358 -0.06767108  0.14668389]

但是,当我训练我的模型时,我只得到一个向量,一个用于正负,一共 2 个,而不是像上面那样的 3 个。向量是否只为每个标签构建?负数和正数,这就是为什么它有 2 个稀疏向量?如果是,那么我们如何比较第一句与第二句和第三句?当我收到这样的输出时,我感到很困惑。

*** 有没有办法检查哪个正标签标记到哪个句子?比如打印tag + print sentence怎么办?

例如,

tag: positive sentence: ["They have a pet"]

我的代码:

from gensim.models.doc2vec import Doc2Vec, TaggedDocument


file = [["I have a pet"], ["They have a pet"], ["she has no pet"]]

positiveFile = file[0:2]
negativeFile = file[2]

positive = [word.split() for sentence in positiveFile for word in sentence]
negative = [word.split() for sentence in [negativeFile] for word in sentence]
total = positive + negative

taggedPositiveFiles = [TaggedDocument(sentence, ["positive"])for i, sentence in enumerate(positive)]
taggedNegativeFiles = [TaggedDocument(sentence, ["negative"])for i, sentence in enumerate(negative)]
totalTagged = taggedNegativeFiles + taggedPositiveFiles


model = Doc2Vec(totalTagged, min_count = 1, workers=1, vector_size=3)
model.build_vocab(totalTagged, update=True)
model.train(totalTagged,total_examples=1, epochs=1)
print(model.docvecs["negative"])
print(model.docvecs["positive"])  

当前输出:

[-0.13150065 -0.13182896 -0.1564866 ]
[ 0.14937358 -0.06767108  0.14668389]

预期输出:

[-0.13150065 -0.13182896 -0.1564866 ]
[-0.13150065 -0.13182896 -0.1564866 ]
[ 0.14937358 -0.06767108  0.14668389]

我哪里理解错了?请帮助我。太感谢了。

您可以选择 tag 发送短信的方式。 Doc2Vec 模型仅针对您提供的确切标签学习文档向量。

Doc2Vec 所依据的原始 Paragraph Vectors 论文中(以及此后发布的许多示例),每个文档都有自己唯一的 ID 标签,因此每个文档都有一个唯一的文档向量。您可以通过查询文档的唯一标记的模型来获取文档的文档向量。

使用分类标签,如 'positive' 和 'negative',可能会在许多示例中重复,有时甚至是有效的——但与最初的概念不同。如果你所有的 N 文本只有 2 个唯一标签(跨文本重复),那么在训练结束时只会学习 2 个文档向量。

(也可以为文本提供多个标签 - 因此它们可以同时具有唯一 ID 一些其他标签。例如:tags=['id001', 'positive']。然而,这最好被认为是一种 advanced/experimental 技术,我只会在你已经使用更简单的方法并从这些更简单的方法中了解你的设置的各种质量(如参数、语料库大小和质量等)后才推荐。影响结果。特别是,尝试从相同数量的数据中训练更多带有唯一标记的文档向量实际上意味着每个文档向量的用处都有一点 'weaker'。本质上,相同的源信息和"signal" 中的数据分布在更多已学习的向量上。因此,如果您有大量数据,您只想做一些奇特的事情,比如每个文档有多个标签——甚至可能进行更多的训练。)

关于您的设置的其他注意事项:

  • build_vocab()update=True功能只有Word2Vec官方支持,属于高级功能,需要大量实验才能使用,甚至应该只在模型上 build_vocab() 第二次或以后使用,而不是第一次。

  • 玩具大小的数据集通常不会在 Word2Vec/Doc2Vec 中给出有用或直观的结果——充其量它们可以用来理解参数 types/legality/output-sizes (如这里)。

  • 已发布结果中 Doc2Vec 模型的典型训练次数 (epochs) 为 10-20。 (如果你想从微小的数据集中榨取一些有用的东西,使用更多的数据集可能会有一点帮助,但寻求更大的数据集总是更好。)