Python 3.x 使用Doc2Vec,哪种方法dm或dbow对文档相似性有效?

Python 3.x 使用Doc2Vec,哪种方法dm或dbow对文档相似性有效?,python-3.x,gensim,similarity,doc2vec,Python 3.x,Gensim,Similarity,Doc2vec,我想找出两个文件之间的相似之处。我正在使用Doc2vec Gensim来训练大约10k个文档。大约有10个字符串类型的标记。每个标记由一个唯一的单词组成,并包含某种文档。模型训练采用分布式存储方法 我也试过dm和dbow。与dbow相比,dm的结果相似性得分更好。我理解了dm和dbow的概念。但不知道哪种方法适合于两个文档之间的相似性度量 第一个问题:哪种方法最适合处理相似性 model.wv.n_相似度,使用词向量给出相似度得分 model.docvecs.similarity_unseen_

我想找出两个文件之间的相似之处。我正在使用Doc2vec Gensim来训练大约10k个文档。大约有10个字符串类型的标记。每个标记由一个唯一的单词组成,并包含某种文档。模型训练采用分布式存储方法

我也试过dm和dbow。与dbow相比,dm的结果相似性得分更好。我理解了dm和dbow的概念。但不知道哪种方法适合于两个文档之间的相似性度量

第一个问题:哪种方法最适合处理相似性

model.wv.n_相似度,使用词向量给出相似度得分

model.docvecs.similarity_unseen_docsmodel,doc1,doc2使用doc向量给出相似性分数,其中doc1和doc2不是doctags的标记/或索引。每个doc1和doc2包含10-20个单词的句子

wv.n_similarity和docvecs.similarity_unseen_文档在相同类型的文档上提供不同的相似性分数

docvecs.similarity\u unseen\u与wv.n\u similarity相比,docs给出的结果稍微好一点,但是wv.n\u similarity有时也会给出好的结果

问题:docvecs.similarity\u unseen\u docs和wv.n\u similarity之间有什么区别?我可以使用docvecs.similarity\u unseen\u docs查找未查看数据之间的相似性分数吗?这可能是一个愚蠢的问题

为什么我这么问是因为docvecs.similarity\u unseen\u docs提供了标签的相似性评分,而不是属于标签的实际单词的相似性评分。我不确定,如果我错了,请在这里纠正我

如何将余弦相似性分数转换为概率

谢谢

模型=Doc2Vecalpha=0.025,最小值=0.0001,最小值=2,窗口=10,dm=1,dm=1,平均值=1,年代=50,种子=25,向量大小=100,工人=4 模型的训练 taged_data=[TaggedDocumentwords=\u d,tags=[stri]表示i,枚举中的[u d] model.build\u vocabtagged\u数据 model.train标记的数据,总示例数=model.corpus\u计数,epochs=model.epochs 查找相似性分数 model.wv.n_相似性, model.random.seed25 model.docvecs.similarity\u unseen\u docsmodel, PV-DM模式DM=1、默认模式和PV-DBOW模式DM=0都可以正常工作。哪个更好取决于你的数据和目标。一旦您有了一种可靠的方法来定量评估模型结果的质量,对于您的项目目标——您希望能够调整模型的所有元参数,包括DM/DBOW模式——您可以而且应该尝试这两种方法

PV-DBOW训练速度很快,通常在几十个单词的简短文档上表现得很好。但是请注意,除非您还添加了dbow_words=1选项,否则此模式不会训练可用的字向量,这将减慢训练速度

使用model.wv.n_相似性仅依赖于词向量。它对每组f字向量进行平均,然后报告这两个平均值之间的余弦相似性。因此,只有在PV-DM模式下,或在DBOW_words=1激活的情况下,PV-DBOW才有意义

使用模型。docvecs.similarity\u unseen\u docs使用推断向量将每个提供的文档视为新文本,为其计算真正的Doc2Vec doc向量,而不仅仅是单词向量的平均值。此方法对单词列表而不是标记列表进行操作

哪一个更好是你应该为你的目标而测试的东西。单词向量的平均值是制作文本向量的一种更简单、更快的技术,但在很多方面仍然适用。推断出的文档向量需要更长的计算时间,但如果模型好,可能更适合某些任务

有关设置的其他注意事项:

通常,将min_count设置为2是一个坏主意:这些罕见的单词没有足够的示例来说明什么,实际上会干扰周围单词的质量

对于训练语料库而言,10k文档的规模较小,而已发布的Doc2Vec结果通常使用数万到数百万个文档

公布的结果通常使用10-20个训练周期,尽管更多的训练周期,比如你选择的50个,可能会有帮助,尤其是对于较小的红细胞

在典型的多核机器上,worker=1将比默认worker=3慢得多;在具有8个或更多内核的机器上,最多工人=8通常是一个好主意。尽管如此,除非使用更新的corpus_文件输入选项,否则更多的工作人员达到16、32等核心的完整计数是没有帮助的

经典的Doc2Vec用法不会像10字符串类型的标记那样为文档分配已知的标签,而是为每个文档分配唯一的ID。在某些情况下,使用或添加称为标记的标签可能会有所帮助,但请注意,如果您只提供10个标记,那么从模型视图的角度来看,您实际上已经将10000个文档转换为10个文档,该视图可以看到具有相同标记的所有文本,就像它们是具有该标记的一个较大文档的片段一样。在普通的PV-DBOW中,仅从10个不同的示例中训练10个文档向量(每个向量有100个维度),不会产生太大的影响 恩斯:很容易出现严重的过度装配。在带有DBOW_词的PV-DM或PV-DBOW中,模型同时训练10个文档向量和成百上千个其他词汇词向量这一事实将有助于抵消过度拟合的风险


我也尝试过给workers=3,但结果是相似度很差。工人是否重视对模型的影响?工人数量基本上不应对模型质量产生影响。如果看起来是这样,那么在这些运行中,您的比较/培训可能存在其他问题,这些问题被错误地归因于不同的工作人员。我已将代码添加到模型的培训中,并找到相似性分数。我试过用蟒蛇2和蟒蛇3。当我为两个版本的python更改worker的值时,相似度得分会发生变化。我觉得,每次在不更改参数的情况下训练model时,会得到不同的结果。甚至,传递种子参数。为什么会这样?这些算法在许多步骤中使用随机抽样——初始化、训练词的二次抽样、负面示例的抽样。而且,使用多个线程会使每次跑步的训练顺序稍微混乱。因此,运行与运行之间的细微差异是可以预料的。但下游结果的总体质量在每次运行时应该大致相同——只是在相似性/排名等方面有一点抖动。如果你没有看到,你应该举一个例子,说明两次运行产生的结果非常不同。
Doc2Vec(alpha=0.025, min_alpha=0.0001, min_count=2, window=10, dm=1, dm_mean=1, epochs=50, seed=25, vector_size=100, workers=1)