Python 如何提高doc2vec模型中两个文档(句子)的余弦相似性?

Python 如何提高doc2vec模型中两个文档(句子)的余弦相似性?,python,nlp,gensim,word2vec,doc2vec,Python,Nlp,Gensim,Word2vec,Doc2vec,我正在用Python通过doc2vec模型使用gensim库构建一个NLP聊天应用程序。我有硬编码的文档,并给出了一组培训示例,我通过抛出一个用户问题来测试模型,然后作为第一步查找最相似的文档。在本例中,我的测试问题是来自培训示例的文档的精确副本 import gensim from gensim import models sentence = models.doc2vec.LabeledSentence(words=[u'sampling',u'what',u'is',u'tell',u'm

我正在用Python通过
doc2vec
模型使用
gensim
库构建一个NLP聊天应用程序。我有硬编码的文档,并给出了一组培训示例,我通过抛出一个用户问题来测试模型,然后作为第一步查找最相似的文档。在本例中,我的测试问题是来自培训示例的文档的精确副本

import gensim
from gensim import models
sentence = models.doc2vec.LabeledSentence(words=[u'sampling',u'what',u'is',u'tell',u'me',u'about'],tags=["SENT_0"])
sentence1 = models.doc2vec.LabeledSentence(words=[u'eligibility',u'what',u'is',u'my',u'limit',u'how',u'much',u'can',u'I',u'claim'],tags=["SENT_1"])
sentence2 = models.doc2vec.LabeledSentence(words=[u'eligibility',u'I',u'am',u'retiring',u'how',u'much',u'can',u'claim',u'have', u'resigned'],tags=["SENT_2"])
sentence3 = models.doc2vec.LabeledSentence(words=[u'what',u'is',u'my',u'eligibility',u'post',u'my',u'promotion'],tags=["SENT_3"])
sentence4 = models.doc2vec.LabeledSentence(words=[u'what',u'is', u'my',u'eligibility' u'post',u'my',u'promotion'], tags=["SENT_4"])
sentences = [sentence, sentence1, sentence2, sentence3, sentence4]
class LabeledLineSentence(object):
    def __init__(self, filename):
        self.filename = filename
    def __iter__(self):
        for uid, line in enumerate(open(filename)):
            yield LabeledSentence(words=line.split(), labels=['SENT_%s' % uid])
model = models.Doc2Vec(alpha=0.03, min_alpha=.025, min_count=2)
model.build_vocab(sentences)
for epoch in range(30):
    model.train(sentences, total_examples=model.corpus_count, epochs = model.iter)
    model.alpha -= 0.002  # decrease the learning rate`
    model.min_alpha = model.alpha  # fix the learning rate, no decay
model.save("my_model.doc2vec")
model_loaded = models.Doc2Vec.load('my_model.doc2vec')
print (model_loaded.docvecs.most_similar(["SENT_4"]))
结果:

[('SENT_1', 0.043695494532585144), ('SENT_2', 0.0017897281795740128), ('SENT_0', -0.018954679369926453), ('SENT_3', -0.08253869414329529)]

SENT_4
SENT_3
的相似性只有
-0.082538694414329529
时才应该是1,因为它们完全相同。我应该如何提高这种准确性?是否有一种特定的培训方式,但我遗漏了一些东西

Word2Vec/Doc2Vec在玩具大小的示例(如少量文本、短文本和少量总单词)上效果不佳。许多理想的属性只有通过数百万个单词或数万个文档的训练集才能可靠地实现

特别是,只有5个示例,只有十几个或两个单词,但有100个维度的建模向量,培训不必做使单词向量/文档向量有用的主要事情:将表示压缩到密集的嵌入中,类似的项需要在向量空间中以增量的方式彼此靠近,因为没有办法在一个巨大的查找表中保留所有原始的变化。与语料库变化相比,维度更多,您的相同标记
SENT_3
SENT_4
可以采用完全不同的文档向量,并且模型仍然足够大,可以在其训练任务中发挥巨大作用(基本上是“过度拟合”),而不会强制要求类似文本具有类似向量的预期结束状态

有时,您可以通过更多的训练迭代和更小的模型(就向量
size
)从小型数据集中挤出更多的意义,但实际上:这些向量需要大型、多样的数据集才能变得有意义

这是主要问题。示例代码中的其他一些低效或错误:

  • 您的代码没有使用类
    LabeledLineSession
    ,因此不需要在这里包含它——这是不相关的样板文件。(另外,
    TaggedDocument
    是最新gensim版本中
    words
    +
    tags
    文档类的首选名称,而不是
    LabeledSentence

  • 您对
    alpha
    min_alpha
    的自定义管理不太可能起到任何作用。除非您已经有了一些工作,很好地理解了算法,然后想要尝试微妙的优化,否则最好保留它们的默认值

  • train()。(这段代码写在第一个循环5
    模型中。iter
    alpha
    迭代值逐渐从0.03降到0.025,然后在固定alpha为0.028时进行5次迭代,然后在0.026时再进行5次迭代,然后在递减alpha时再进行27次迭代,在固定alpha为-0.028的第30次循环结束。这是一个无意义的结尾。)g值——学习率永远不应该是负的——在无意义的进展结束时。即使有一个大数据集,这150次迭代,大约一半发生在负的
    alpha
    值上,也可能产生奇怪的结果。)


首先,SENT_4和SENT_3并不完全相同。请看更正后的“促销”一词:[('SENT_1',0.043695494532585144),('SENT_2',0.0017897281795740128),('SENT_0',-0.018954679369926453),('SENT_3',-0.082538694914329529)]