我正在使用gensim 3.0.1
。
我有一个TaggedDocument
列表,其中包含"label_17"
形式的唯一标签,但是当我训练Doc2Vec模型时,它会以某种方式将标签拆分为符号,因此model.docvecs.doctags
的输出为下列:
{'0': Doctag(offset=5, word_count=378, doc_count=40),
'1': Doctag(offset=6, word_count=1330, doc_count=141),
'2': Doctag(offset=7, word_count=413, doc_count=50),
'3': Doctag(offset=8, word_count=365, doc_count=41),
'4': Doctag(offset=9, word_count=395, doc_count=41),
'5': Doctag(offset=10, word_count=420, doc_count=41),
'6': Doctag(offset=11, word_count=408, doc_count=41),
'7': Doctag(offset=12, word_count=426, doc_count=41),
'8': Doctag(offset=13, word_count=385, doc_count=41),
'9': Doctag(offset=14, word_count=376, doc_count=40),
'_': Doctag(offset=4, word_count=2009, doc_count=209),
'a': Doctag(offset=1, word_count=2009, doc_count=209),
'b': Doctag(offset=2, word_count=2009, doc_count=209),
'e': Doctag(offset=3, word_count=2009, doc_count=209),
'l': Doctag(offset=0, word_count=4018, doc_count=418)}
但在标记文档的初始列表中,每个文档都有自己唯一的标签。
模型培训的代码如下:
model = Doc2Vec(size=300, sample=1e-4, workers=2)
print('Building Vocabulary')
model.build_vocab(data)
print('Training...')
model.train(data, total_words=total_words_count, epochs=20)
因此,我无法将我的文档编入索引,例如model.docvecs['label_17']
并获取KeyError
。
如果我将数据传递给构造函数而不是构建词汇表,那就是同样的事情。
为什么会这样?感谢。
答案 0 :(得分:1)
Doc2Vec
期望文字示例(形状TaggedDocument
的对象)具有tags
属性 list-of-tags 。
如果您改为提供字符串,例如'label_17'
,那么它实际上是*list-of-characters*, so it's essentially saying that
TaggedDocument`标签:
['l', 'a', 'b', 'e', 'l', '_', '1', '7']
确保您将tags
列为一个列表标签,例如tags=['label_17']
,您应该会看到训练有素标签的结果更像您期望的结果。
另外:看起来你有大约200个文件,每个文件大约10个单词。注意Word2Vec
/ Doc2Vec
需要大量不同的数据集才能获得良好的结果。特别是只有200个文本但300个向量维度,训练可以很好地完成训练任务(内部单词预测),只需记住训练集的特性,这实际上是过度拟合的。并且不会导致其距离/排列表示可转移到其他示例的可推广知识的向量。