Doc2Vec:区分句子和文档

Doc2Vec: Differentiate Sentence and Document

我只是在玩弄来自 gensim 的 Doc2Vec,分析 stackexchange 转储以分析问题的语义相似性以识别重复项。

Doc2Vec-Tutorial 上的教程似乎将输入描述为标记句子。

但原论文:Doc2Vec-Paper声称该方法可用于推断paragraphs/documents的定长向量。

谁能解释一下句子和文档在这种情况下的区别,以及我将如何推断段落向量。

由于一个问题有时会跨越多个句子, 我想,在训练过程中,我会给从同一个问题产生的句子加上相同的标签,但是我将如何对 infer_vector 未见过的问题这样做呢?

还有这个笔记本:Doc2Vec-Notebook

似乎是在 TRAIN 和 TEST 文档上训练向量,有人可以解释这背后的基本原理吗?我也应该这样做吗?

Gensim 的 Doc2Vec 希望您提供与示例 TaggedDocument class 相同 object-shape 的文本示例:同时具有 wordstags 属性.

words 是文本的字符串标记的有序序列 – 它们可能是一个句子、一个段落或一个长文档,这取决于您。

tags 是要从文本中学习的标签列表——例如纯整数或 string-tokens,它们以某种方式用于命名相应的文本。在最初的 'Paragraph Vectors' 论文中,它们只是每个文本的唯一 ID——例如从 0 开始单调递增的整数。(所以第一个 TaggedDocument 可能有一个 tags 只是 [0],下一个[1], 等等)

该算法只适用于文本块,不知道 sentence/paragraph/document 等可能是什么。 (为了 Doc2Vec 的目的,只需将它们全部 'documents' 考虑在内,由您决定语料库中 'document' 的正确类型。)标记化保留标点符号甚至很常见,例如句子之间的句点,作为独立的令牌。

推理是通过 infer_vector() 方法进行的,该方法采用强制参数 doc_words,它应该是一个 string-tokens 列表,就像那些作为文本 words 在训练期间。

您没有在推断的文本上提供任何标签:Doc2Vec 只是返回一个原始向量,在模型学习的关系中,该向量与文本很好地吻合。 (即:向量擅长预测文本的词,就像批量训练中学习的向量和内部模型权重擅长预测训练文本的词一样。)

请注意,许多人已经通过增加可选的 steps 参数(并可能减少从 alpha 开始的推理使其更像 bulk-training 起始 alpha,0.025 来从推理中找到更好的结果至 0.05)。

doc2vec-IMDB 演示笔记本试图从原始段落向量论文中重现其中一个实验,因此它遵循那里描述的内容,以及其中一位作者 (Mikolov) 曾经发布的演示脚本。由于 'test' 文档(没有它们的 target-labels/known-sentiments)在训练时可能仍然可用,以帮助改进 text-modelling,在无监督 Doc2Vec 训练期间包含它们的原始文本是合理的。 (在训练使用 doc-vectors 的 classifier 时,他们的 known-labels 是 not。)

(请注意,目前,2017 年 2 月,与当前的 gensim Doc2Vec 默认值和 best-practices 相比,doc2vec-IMDB 演示笔记本有点 out-of-date – 特别是模型不是给定正确的显式 iter=1 值,使后来的手册 loop-and-train() 进行正确数量的训练。)