doc2vec中单个文档的多个标记。 TaggedDocument

时间:2017-09-06 19:52:17

标签: python nlp gensim word2vec doc2vec

是否可以训练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']

2 个答案:

答案 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])

任何想法我在这里做错了什么?