【问题标题】:Doc2Vec model not producing expected similarity scoresDoc2Vec 模型不产生预期的相似性分数
【发布时间】:2021-08-07 14:01:20
【问题描述】:

我正在尝试比较两个句子并获得它们之间的余弦相似度。

我有大约 50 个句子,我使用了 genism 的预训练 doc2vec,并在这 50 个句子上训练了模型,只是稍微调整了权重。然而,两个句子之间的余弦相似度并不能真正反映相似度。例如,sentence1 的英语与 sentence2 不接近,但它们的嵌入非常相似。

我的问题是,我通常如何比较两个句子的相似性(因为 doc2vec 不适合我)。这似乎是由于调整权重的训练输入量很少,但我想知道是否有另一种技术来完成这项任务。

例如到目前为止的粗略实现

s1 = "This is a sentence"
s2 = "This is also a sentence"
...
s50 ="This is the last sentence

list = [s1,s2..s50]

tagged_data = [TaggedDocument(words=word_tokenize(_d.lower()), tags=[
                                      str(i)]) for i, _d in enumerate(list)]
model = Doc2Vec(vector_size=vec_size,
                        alpha=alpha,
                        min_alpha=0.00025,
                        min_count=1,
                        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=100)
   # decrease the learning rate
   model.alpha -= 0.0002
   # fix the learning rate, no decay
   model.min_alpha = model.alpha

然后我遍历每个句子并执行model.infer_vector(sent_tokens) 以获取嵌入。但正如我所说,当使用相似性时,它们甚至都不是正确的。

如果我做错了什么,请告诉我。

【问题讨论】:

    标签: python nlp doc2vec


    【解决方案1】:

    没有“gensim 的预训练 doc2vec”,所以如果实际上您使用的是来自某个第 3 方的一些预训练模型,您需要描述源以了解这里的内容。 (但是,您的代码似乎显示了一个仅从 50 个句子训练而来的新模型。)

    50 句不足以训练 Doc2Vec(或相关算法,如 Word2VecFastText)。他们需要大量数据,其中包含每个感兴趣的单词的许多微妙变化的真实用法示例,以创建有用的向量。

    min_count=1Doc2Vec 及类似算法一起使用几乎总是一个坏主意,因为它们依赖于一个单词的多个不同上下文的影响。如果一个词只有 1 次或少数几个使用,那么为该词学习的任何向量都可能与该外观不同,并且没有普遍的用处。此外,许多这样的稀有词(在通常的自然语言语料库中)的存在可能意味着这些垃圾词在模型中充当噪音,以稀释和干扰其他词的训练,合适的例子。如果您完全丢弃这些不常用的词,模型通常会更好地工作 - 这就是为什么默认为 min_count=5

    我还没有看到有人在预训练的 Doc2Vec 模型上使用少量新数据进行微小的后续调整的任何好的文章——所以我不建议刚开始的人尝试Doc2Vec。 (如果它确实有效,则需要专家的实验和调整。)

    在循环中多次调用.train() 并在通常的默认和自动管理之外调整alpha/min_alpha 几乎总是一种误导且容易出错的想法。有关详细信息,请参阅此答案:https://stackoverflow.com/a/62801053/130288

    如果您使用大尺寸的语料库进行正确训练,然后检查训练数据所代表的文本的成对相似性,您应该会看到更合理的相似性值。

    【讨论】:

    • 谢谢!解释了很多。我确实感觉到它没有经过预先训练。你会碰巧知道预训练模型的任何位置吗?例如使用 word2vec,您可以使用 googles Word2vec。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2017-03-26
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2020-06-02
    相关资源
    最近更新 更多