我得到的向量比我的文档大小多 - gensim doc2vec
I get more vectors than my documents size - gensim doc2vec
我有蛋白质序列,想做 doc2vec。我的目标是每个 sentence/sequence.
都有一个向量
我有 1612 sentences/sequences 和 30 类,所以标签不是唯一的,许多文档共享相同的标签。
所以当我第一次尝试 doc2vec 时,它只给了我 30 个向量,这是唯一标签的数量。然后我决定有多个标签来为每个句子获取一个向量。
当我这样做时,我得到的向量比我的句子还多。任何解释可能出了什么问题?
Screenshot of my data
Screenshot of corpus
tagged = data.apply(lambda r: TaggedDocument(words=(r["A"]), tags=[r.label,r.id]), axis=1)
print(len(tagged))
1612
sents = tagged.values
model = Doc2Vec(sents, size=5, window=5, iter=20, min_count = 0)
sents.shape
(1612,)
model.docvecs.vectors_docs.shape
(1643,5)
Screenshot of my data
Doc2Vec
模型将学习的标签数量等于您提供的唯一标签数量。您提供了 1612 个不同的 r.id
值和 30 个不同的 r.label
值,因此标签的总数大于您的文档数。
(我怀疑你的 r.id
值是普通整数,但从 1 开始。如果你使用普通整数而不是字符串作为标签,那么 Doc2Vec
将使用这些整数作为索引直接进入其内部向量数组。因此,也将分配小于您使用的数字(如 0)的 int 索引。因此,您对 1612 + 30 + 1 个已知标签的计数,因为它还分配了 space 标记 0。)
所以,这就解释了你的标签数,而且不一定有错。但是要注意:
您的数据集非常小:大多数已发表的作品使用数万到数百万的文档。有时您仍然可以通过使用更小的向量或更多的训练时期来勉强获得有用的向量,但主要是 Doc2Vec
和类似的算法需要更多的数据才能最好地工作。 (仍然:向量 size=5
非常小!)
对于小数据,尤其是简单的 PV-DBOW 模式(dm=0
)通常是快速训练的最佳表现者。 (但请注意:它不会使用上下文 windows 训练词向量,除非您添加 dbow_words=1
选项,然后通过额外的词向量训练再次减慢它的速度。)
是否应该将标签用作文档标签完全不确定 - Doc2Vec
的经典用法只是给每个文档一个唯一的 ID - 然后让下游步骤学习与其他事物的关系。根据您的数据和最终目标,混合使用已知的其他文档级标签有时会有所帮助或有害。 (在某种程度上,更多的标签可以 "dilute" 从更大的模型中学到的任何东西。)
至少在自然语言中,保留只出现一次或几次的单词通常会对整体矢量质量有害。出现的次数太少,无法很好地为它们建模,而且根据 Zipf 定律,这样的词会很多,它们最终会干扰其他实体的训练。因此,默认值 min_count=5
(对于更大的数据集甚至更高)通常有助于提高整体质量,并且您不应该假设使用 min_count=0
简单地保留更多数据一定会有所帮助。
我有蛋白质序列,想做 doc2vec。我的目标是每个 sentence/sequence.
都有一个向量我有 1612 sentences/sequences 和 30 类,所以标签不是唯一的,许多文档共享相同的标签。
所以当我第一次尝试 doc2vec 时,它只给了我 30 个向量,这是唯一标签的数量。然后我决定有多个标签来为每个句子获取一个向量。
当我这样做时,我得到的向量比我的句子还多。任何解释可能出了什么问题?
Screenshot of my data
Screenshot of corpus
tagged = data.apply(lambda r: TaggedDocument(words=(r["A"]), tags=[r.label,r.id]), axis=1)
print(len(tagged))
1612
sents = tagged.values
model = Doc2Vec(sents, size=5, window=5, iter=20, min_count = 0)
sents.shape
(1612,)
model.docvecs.vectors_docs.shape
(1643,5)
Screenshot of my data
Doc2Vec
模型将学习的标签数量等于您提供的唯一标签数量。您提供了 1612 个不同的 r.id
值和 30 个不同的 r.label
值,因此标签的总数大于您的文档数。
(我怀疑你的 r.id
值是普通整数,但从 1 开始。如果你使用普通整数而不是字符串作为标签,那么 Doc2Vec
将使用这些整数作为索引直接进入其内部向量数组。因此,也将分配小于您使用的数字(如 0)的 int 索引。因此,您对 1612 + 30 + 1 个已知标签的计数,因为它还分配了 space 标记 0。)
所以,这就解释了你的标签数,而且不一定有错。但是要注意:
您的数据集非常小:大多数已发表的作品使用数万到数百万的文档。有时您仍然可以通过使用更小的向量或更多的训练时期来勉强获得有用的向量,但主要是
Doc2Vec
和类似的算法需要更多的数据才能最好地工作。 (仍然:向量size=5
非常小!)对于小数据,尤其是简单的 PV-DBOW 模式(
dm=0
)通常是快速训练的最佳表现者。 (但请注意:它不会使用上下文 windows 训练词向量,除非您添加dbow_words=1
选项,然后通过额外的词向量训练再次减慢它的速度。)是否应该将标签用作文档标签完全不确定 -
Doc2Vec
的经典用法只是给每个文档一个唯一的 ID - 然后让下游步骤学习与其他事物的关系。根据您的数据和最终目标,混合使用已知的其他文档级标签有时会有所帮助或有害。 (在某种程度上,更多的标签可以 "dilute" 从更大的模型中学到的任何东西。)至少在自然语言中,保留只出现一次或几次的单词通常会对整体矢量质量有害。出现的次数太少,无法很好地为它们建模,而且根据 Zipf 定律,这样的词会很多,它们最终会干扰其他实体的训练。因此,默认值
min_count=5
(对于更大的数据集甚至更高)通常有助于提高整体质量,并且您不应该假设使用min_count=0
简单地保留更多数据一定会有所帮助。