【问题标题】:Doc2Vec: get text of the labelDoc2Vec:获取标签的文本
【发布时间】:2019-02-17 19:29:56
【问题描述】:

我已经训练了 Doc2Vec 模型,我正在尝试获得预测。

我用

test_data = word_tokenize("Филип Моррис Продактс С.А.".lower())
model = Doc2Vec.load(model_path)
v1 = model.infer_vector(test_data)
sims = model.docvecs.most_similar([v1])
print(sims)

返回

[('624319', 0.7534812092781067), ('566511', 0.7333904504776001), ('517382', 0.7264763116836548), ('523368', 0.7254455089569092), ('494248', 0.7212602496147156), ('382920', 0.7092794179916382), ('530910', 0.7086726427078247), ('513421', 0.6893941760063171), ('196931', 0.6776881814002991), ('196947', 0.6705600023269653)]

接下来我想知道这个号码的文字是什么

model.docvecs['624319']

但它只返回向量表示

array([ 0.36298314, -0.8048847 , -1.4890883 , -0.3737898 , -0.00292279,
   -0.6606688 , -0.12611026, -0.14547637,  0.78830665,  0.6172428 ,
   -0.04928801,  0.36754376, -0.54034036,  0.04631123,  0.24066721,
    0.22503968,  0.02870891,  0.28329515,  0.05591608,  0.00457001],
  dtype=float32)

那么,有什么方法可以从模型中获取此标签的文本? 加载火车数据集需要很长时间,所以我尝试找出另一种方法。

【问题讨论】:

    标签: python gensim doc2vec


    【解决方案1】:

    没有办法将doc向量直接转换回原始文本(在减少文本的过程中丢失了单词排序等信息-->向量)。

    但是,当您为Doc2Vec() 创建TaggedDocuments 时,您可以通过在语料库列表中使用其索引标记每个文档来检索原始文本。假设您有一个句子/文档的语料库,包含在名为texts 的列表中。像这样使用enumerate() 为每个句子生成一个唯一索引i,并将其作为tags 参数传递给TaggedDocument

    tagged_data = []
    for i, t in enumerate(texts):
        tagged_data.append(TaggedDocument(words=word_tokenize(c.lower()), tags=[str(i)]))
    
    model = Doc2Vec(vector_size=VEC_SIZE,
                    window=WINDOW_SIZE,
                    min_count=MIN_COUNT,
                    workers=NUM_WORKERS)
    
    model.build_vocab(tagged_data)
    

    然后在训练之后,当您从model.docvecs.most_similar() 获得结果时,每个元组中的第一个数字将是您原始语料库文本列表中的索引。例如,如果你运行 model.docvecs.most_similar([some_vector]) 并得到:

    [('624319', 0.7534812092781067), ('566511', 0.7333904504776001), ('517382', 0.7264763116836548), ('523368', 0.7254455089569092), ('494248', 0.7212602496147156), ('382920', 0.7092794179916382), ('530910', 0.7086726427078247), ('513421', 0.6893941760063171), ('196931', 0.6776881814002991), ('196947', 0.6705600023269653)]

    ...然后您可以通过使用texts[624319] 索引到您的初始语料库列表中来检索第一个结果('624319', 0.7534812092781067) 的原始文档。

    或者,如果您想遍历并获取所有最相似的文本,您可以执行以下操作:

    most_similar_docs = []
    for d in model.docvecs.most_similar([some_vector]):
        most_similar_docs.append(texts[d[0]])
    

    【讨论】:

    • 这种简单方法的缺点是它需要将所有文本和 Doc2Vec 模型保存在内存中。但是,如果它对于内存来说太大了,您可以将语料库存储在由相同索引键控的数据库中。然后,您可以使用查询数据库的 id2doc() 函数检索条目。
    猜你喜欢
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2015-04-07
    相关资源
    最近更新 更多