我有蛋白质序列,想做doc2vec。我的目标是每个句子/序列都有一个向量。
我有1612个句子/序列和30个类,因此标签不是唯一的,许多文档共享相同的标签。
因此,当我第一次尝试doc2vec时,它只给出了30个向量,这是唯一标签的数量。然后,我决定使用多个标签来为每个句子获取向量。
当我这样做时,我得到的向量多于我的句子。有什么解释可能出问题了吗?
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)
答案 0 :(得分:0)
Doc2Vec
模型将学习的标签数量等于您提供的唯一标签的数量。您提供了1612个不同的r.id
值和30个不同的r.label
值,因此标签总数超过了您的文档数。
(我怀疑您的r.id
值是纯整数,但从1开始。如果您使用纯整数而不是字符串作为标记,那么Doc2Vec
将使用这些int作为其整数的索引内部向量数组。因此小于您使用的数字的int索引(如0)也将被分配,因此,您的计数为1612 + 30 + 1个已知标记,因为它也为标记0分配了空间。 )
因此,这可以解释您的标签数量,并且不一定有错。但是要当心:
您的数据集非常小:大多数已发表的作品都使用成千上万的文档来记录数百万个文档。您有时仍可以通过使用较小的向量或更多的训练时期来计算出有用的向量,但主要是Doc2Vec
,类似的算法需要更多的数据才能发挥最佳效果。 (仍然:向量size=5
很小!)
尤其是在数据较少的情况下,简单的PV-DBOW模式(dm=0
)通常是训练有素的快速表现。 (但请注意:除非添加dbow_words=1
选项,否则它不会使用上下文窗口来训练单词向量,这会通过额外的单词向量训练再次降低它的速度。)
不确定是否应该将标签用作文档标签-经典的Doc2Vec
用法只是为每个文档赋予唯一的ID –然后让下游步骤学习与其他事物的关系。根据您的数据和最终目标,混入已知的其他文档级标签有时会有所帮助或受到伤害。 (更多标签可以在一定程度上“稀释”在较大模型上学习到的所有内容。)
至少使用自然语言,保留仅出现一次或几次的单词通常可能对整体矢量质量有害。很少有事件可以很好地对它们进行建模,并且由于按照齐普夫定律,会出现很多这样的词语,因此它们最终会干扰其他实体的训练。因此,默认的min_count=5
(或者更大的数据集甚至更高)通常可以提高整体质量,并且您不应该假设仅凭min_count=0
保留更多数据就一定会有所帮助。