Doc2Vec模型在符号中分割文档标签

时间:2017-10-24 15:31:58

标签: python-3.x gensim doc2vec

我正在使用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

如果我将数据传递给构造函数而不是构建词汇表,那就是同样的事情。

为什么会这样?感谢。

1 个答案:

答案 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个向量维度,训练可以很好地完成训练任务(内部单词预测),只需记住训练集的特性,这实际上是过度拟合的。并且不会导致其距离/排列表示可转移到其他示例的可推广知识的向量。