是否可以训练doc2vec模型,其中单个文档有多个标签? 例如,在电影评论中,
doc0 = doc2vec.TaggedDocument(words=review0,tags=['UID_0','horror','action'])
doc1 = doc2vec.TaggedDocument(words=review1,tags=['UID_1','drama','action','romance'])
在每个文档都有唯一标记(UID)和多个分类标记的情况下,如何在培训后访问该向量?例如,调用
的最合适的语法是什么model['UID_1']
答案 0 :(得分:3)
是的,可以为每个文档提供多个标记,这就是为什么tags
的{{1}}属性应该是一个列表,以及为什么一个键用于引用学习的doc-vectors被称为“标签”'而不是一个' id。 (虽然原始的'段落向量'文章基于gensim TaggedDocument
仅基于每个文档使用一个唯一标识符进行描述,但这是一个自然的扩展。)
要获取任何doc-vector,您必须通过模型的Doc2Vec
属性访问它,而不是模型本身。 (模型本身,继承docvecs
的功能,将包含字向量,而不是doc-vectors,并且这些字向量仅在某些Word2Vec
模式中有意义。 )
因此,经过培训,您可以通过以下操作获取示例数据的doc-vectors:
Doc2Vec
请注意,当您训练更多矢量时,您可能需要更多数据。粗略地说,无论从数据中获得什么有价值的概括,都可以将原始数据压缩成较小的表示形式。如果你训练一个更大的模型 - 更多的单词矢量文档标签向量作为内部可调参数 - 在相同数量的数据上,结果可能会更加稀释'甚至是“过度紧张”。 (也就是说,它可能反映了训练数据的记忆特性,而不是对下游目的或新文本有用的一般化见解)。
答案 1 :(得分:1)
我真的很想对接受的答复做出评论,但我似乎缺乏足够的意见,因为这是一个单独的答复而道歉,因为这是一个澄清的请求。
我现在正试图做同样的事情,但我的问题是,在这个问题中使用多值标签时我似乎无法训练模型。特别是(仅出于演示目的使用荒谬值):
MyDocs = namedtuple('MyDocs', 'words tags')
# some processing, an element of my_docs ends up looking like:
# MyDocs(words=['some', 'parsed', 'text'], tags=['tag_0_i', 'tag_1_j'])
model = Doc2Vec(dm=1, size=3, window=3, dm_concat=1, negative=5, hs=0, sample=1e-5)
model.build_vocab(my_docs)
# model.docvecs.doctag_syn0[0] is
# array([0.00338327, 0.8583702, -0.00845612])
doc_list = my_docs[:]
alpha_0, alpha_1 = 0.050, 0.001
for epoch in range(10):
shuffle(doc_list)
model.train(doc_list, total_examples=model.corpus_count, epochs=1)
# model.docvecs.doctag_syn0[0] is still:
# array([0.00338327, 0.8583702, -0.00845612])
任何想法我在这里做错了什么?