我已经使用Python Doc2Vec
包中的gensim
模块训练了文本文档上的Doc2Vec段落嵌入。通常,每个文档都用唯一的ID标记,产生唯一的输出表示,如下所示(有关详细信息,请参见this link)
def tag_docs(docs, col):
tagged = docs.apply(lambda r: TaggedDocument(words=simple_preprocess(r[col]), tags=[r.label]), axis=1)
return tagged
但是,您也可以使用相同的标签来标记一组文档,以训练类表示形式,这就是我在这里所做的。您可以使用以下命令查询输出表示的数量:
print(model.docvecs.count)
我的问题如下:我训练了n
类文档的模型,并在n
中产生了model.docvecs
个文档向量。现在,我想将每个文档向量映射到相应的类标记。如何确定哪个向量与哪个标签相关?
答案 0 :(得分:1)
如果classA
是您在培训期间提供的文档标签之一,则model.docvecs['classA']
将返回从培训中为该标签学习的单个文档向量。
如果您有另一个新矢量,例如,一个通过model.infer_vector(words)
推断出的新文本,则可以通过model.docvecs.most_similar(positive=[new_vector])
来获取模型中最接近的学习文档矢量的列表。
如果您的真正目的是将新文档分类为一个(或多个)此类,那么取得最高most_similar()
的结果是一种简单的方法。
但是将所有类简化为一个摘要向量(为该标记学习的一个向量),然后仅使用新文档的最近邻居,可能效果不佳。它在某种程度上迫使人们假设类在n维空间中是非常简单的形状。
对于分类,您可能希望让所有文档获得单独的向量(不基于它们的已知类,或者除它们的已知类之外),然后在该组(文档向量,标签)标签上训练单独的分类器-数据。这样可以发现类之间的粒度更细且形状奇怪的边界。