gensim - 我应该在 Doc2Vec 文档中拆分句子吗?
问题描述
我正在使用 Gensim 构建一个包含 1000 个文档的 Doc2Vec 模型。每个文档由几个句子组成,其中包含多个单词。
例子)
Doc1: [[word1, word2, word3], [word4, word5, word6, word7],[word8, word9, word10]]
Doc2:[[word7,word3,word1,word2],[word1,word5,word6,word10]]
最初,为了训练 Doc2Vec,我首先拆分句子并使用“TaggedDocument”使用相同的文档标签标记每个句子。结果,我得到了 Doc2Vec 的最终训练输入,如下所示:
TaggedDocument(words=[word1, word2, word3], tags=['Doc1'])
TaggedDocument(words=[word4, word5, word6, word7], tags=['Doc1'])
TaggedDocument(words=[word8, word9, word10], tags=['Doc1'])
TaggedDocument(words=[word7, word3, word1, word2], tags=['Doc2'])
TaggedDocument(words=[word1, word5, word6, word10], tags=['Doc2'])
但是,在不拆分句子的情况下将文档作为一个整体来训练模型可以吗?
TaggedDocument(words=[word1, word2, word3,word4, word5, word6, word7,word8, word9, word10], tags=['Doc1'])
TaggedDocument(words=[word4, word5, word6, word7,word1, word5, word6, word10], tags=['Doc2'])
先感谢您 :)
解决方案
这两种方法的效果将非常相似。
细微的差别在于,在 PV-DM模式dm=1
(dm=0, dbow_words=1
例如,如果您按句子拆分,您的'Doc1'
单词'word3'
和'word4'
永远不会在同一个 PV-DM 上下文窗口平均中被平均,也不会被用于 PV-DBOW skip-gram predict-each-other。如果您只是将整个文档的单词一起运行到一个TaggedDocument
示例中,它们将通过出现在共享的上下文窗口中进行更多的交互。
一个或另一个是否更适合您的目的是您必须在自己的分析中评估的东西 - 它可能在很大程度上取决于数据的性质和所需的相似性结果。
但是,我可以说你的第二个选项,所有的单词TaggedDocument
,是更常见/传统的方法。
(也就是说,只要文档的长度仍然不超过 10,000 个标记。如果更长,将文档的单词分成多个TaggedDocument
实例,每个实例都具有相同的tags
,这是内部 10,000 个标记实现限制的常见解决方法。)