【问题标题】:Doc2Vec infer_vector not working as expectedDoc2Vec infer_vector 未按预期工作
【发布时间】:2019-11-25 13:17:46
【问题描述】:

程序应该返回列表中最相似的第二个文本,因为它是同一个词。但这里不是这样。

import gensim
from nltk.tokenize import word_tokenize
from gensim.models import Word2Vec
from gensim.models.doc2vec import Doc2Vec, TaggedDocument


data = ["I love machine learning. Its awesome.",
        "I love coding in python",
        "I love building chatbots",
        "they chat amagingly well"]


tagged_data=[TaggedDocument(word_tokenize(_d.lower()),tags=[str(i)]) for i,_d in enumerate(data)]

max_epochs = 100
vec_size = 20
alpha = 0.025

model = Doc2Vec(size=vec_size,
                alpha=alpha, 
                min_alpha=0.00025,
                min_count=1,
                negative=0,
                dm =1)

model.build_vocab(tagged_data)

for epoch in range(max_epochs):
    #print('iteration {0}'.format(epoch))
    model.train(tagged_data,
                total_examples=model.corpus_count,
                epochs=model.iter)
    # decrease the learning rate
    model.alpha -= 0.0002
    # fix the learning rate, no decay
    model.min_alpha = model.alpha

model.save("d2v.model")


loaded_model=Doc2Vec.load("d2v.model")
test_data=["I love coding in python".lower()]

v1=loaded_model.infer_vector(test_data)

similar_doc=loaded_model.docvecs.most_similar([v1])
print similar_doc

输出:

[('0', 0.17585766315460205), ('2', 0.055697083473205566), ('3', -0.02361609786748886), ('1', -0.2507985532283783)]

它将列表中的第一个文本显示为最相似,而不是第二个文本。你能帮忙吗?

【问题讨论】:

    标签: python text-classification doc2vec


    【解决方案1】:

    首先,Doc2Vec 风格的模型与玩具大小的数据集不会得到好的结果。仅仅四个文档和大约 20 个独特单词的词汇表,无法创建一个充满 20 维向量的有意义对比的“密集嵌入”向量模型。

    其次,如果您在模型初始化中设置 negative=0,您将禁用默认的模型训练校正模式 (negative=5),并且您不会启用非默认、较少推荐的替代模式 ( hs=1)。根本不会进行任何培训。代码输出中也可能显示错误 - 但是,如果您正在运行至少 INFO-level 日志记录,您可能会注意到输出中的其他问题。

    第三,infer_vector() 需要一个单词标记列表作为其参数。您提供的是纯字符串。这看起来像是代码的单字符单词列表,所以就像您要求它推断 23 个单词的句子:

    ['i', ' ', 'l', 'o', 'v', 'e', ' ', 'c', ...]
    

    infer_vector() 的参数应该被标记化,就像训练文本被标记化一样。 (如果你在训练过程中使用了word_tokenize(),那么在推理过程中也可以使用它。)

    infer_vector() 还将对等于Doc2Vec 模型内的“epochs”值的文本使用多次重复推理,除非您指定另一个值。由于您没有指定epochs,模型仍将具有其默认值(继承自Word2Vecepochs=5。大多数Doc2Vec 工作在训练期间使用 10-20 个 epoch,在推理期间至少使用同样多的 epoch 似乎是一个好习惯。

    还有:

    不要尝试在一个循环中多次调用train(),或在您自己的代码中管理alpha,除非您是专家。

    任何在线示例都建议使用像您这样的代码块...

    for epoch in range(max_epochs):
        #print('iteration {0}'.format(epoch))
        model.train(tagged_data,
                    total_examples=model.corpus_count,
                    epochs=model.iter)
        # decrease the learning rate
        model.alpha -= 0.0002
        # fix the learning rate, no decay
        model.min_alpha = model.alpha
    

    ...是一个的例子。它错误地上下发送有效的alpha 速率,如果你想更改epochs 的数量,它非常脆弱,它实际上会运行 500 个 epoch(100 * model.iter),它的代码要多得多比必要的。

    相反,不要更改默认的alpha 选项,并在创建模型时指定所需的时期数。因此,模型将缓存一个有意义的epochs 值,供以后的infer_vector() 使用。

    然后,只调用一次 train()。它将正确处理所有时期和 alpha 管理。例如:

    model = Doc2Vec(size=vec_size,
                    min_count=1,  # not good idea w/ real corpuses but OK
                    dm=1,  # not necessary to specify since it's the default but OK  
                    epochs=max_epochs)
    model.build_vocab(tagged_data)
    model.train(tagged_data, 
                total_examples=model.corpus_count, 
                epochs=model.epochs)
    

    【讨论】:

    • 我在没有循环的情况下训练了模型,并且在 infer_vector 中传递了标记化的单词而不是整个句子 ``` data_test="I love coding in python".lower() test_data=word_tokenize(data_test) v1=loaded_model .infer_vector(test_data) ``` 输出仍然显示列表中的第一个文本最相似:` [('0', 0.39219772815704346), ('2', 0.29952746629714966), ('3', 0.21126431226730347), ('1' , 0.04621686041355133)] `
    • 是的,根据上面的第一点,“你不会从具有玩具大小数据集的 Doc2Vec 样式模型中获得好的结果。”因此,除了修复代码之外,您还需要更多数据才能看到开始有意义的结果。要训​​练 20 维向量,我建议至少 400 个文本和几千个单词的独特词汇。
    • 感谢您的帮助,我正在尝试将具有相似上下文的句子分组,您还有什么建议的方法?
    • 如果您只是想学习Doc2Vec,gensim 教程可以提供帮助,例如 radimrehurek.com/gensim/auto_examples/tutorials/…> 中的教程。它使用与gensim 捆绑在一起的新闻故事的小型语料库(“lee 语料库”)用于测试目的。它仍然比实际工作中通常的要小——只有几百个文档,每个几百个单词——但具有类似缩小的训练参数,足以显示一些所需的文本相似性质量。
    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 2021-06-04
    • 2022-01-24
    • 2015-05-11
    • 2020-05-15
    • 2014-10-31
    • 2018-02-12
    • 2014-01-20
    相关资源
    最近更新 更多