代码之家  ›  专栏  ›  技术社区  ›  Petr Petrov

Doc2Vec:获取标签的文本

  •  0
  • Petr Petrov  · 技术社区  · 6 年前

    我受过训练 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)
    

    加载火车数据集需要很多时间,所以我尝试找到另一种方法。

    0 回复  |  直到 6 年前
        1
  •  8
  •   J. Taylor    6 年前

    无法将文档向量直接转换回原始文本(有关单词顺序等的信息在文本缩减过程中丢失-->向量)。

    然而,你 创建文档时,通过在语料库列表中为每个文档添加索引来检索原始文本 TaggedDocument 代表 Doc2Vec() texts . 使用 enumerate() 这样可以生成唯一的索引 i 对于每个句子,并将其作为 tags 论据 标记文件

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

    ('624319', 0.7534812092781067) texts[624319] .

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

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