Skip to main content
 首页 » 编程设计

python之Doc2Vec:获取标签的文本

2025年05月04日16jirigala

我已经训练了 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) 

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

请您参考如下方法:

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

但是,您可以在创建 TaggedDocument 时通过在语料库列表中标记每个文档及其索引来检索原始文本。 s Doc2Vec() .假设您有一个句子/文档语料库,包含在名为 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)]

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

或者,如果您想遍历并获取所有最相似的文本,您可以这样做:

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