我正在试图计算两个文档之间的相似性,这两个文档由数千个句子组成。
基线是使用弓计算余弦相似度。
但是,我想捕捉文档之间更多的语义差异。
因此,我通过简单地平均每个文档中的所有单词向量,生成文档向量,并度量这些文档向量之间的余弦相似度,从而构建了文档嵌入和计算文档相似度。
然而,由于每个输入文档的大小相当大,我使用上述方法得到的结果非常类似于简单的弓余弦相似度。
我有两个问题,
Q1。我发现gensim模块提供了软余弦相似性。但是,我很难理解与上面使用的方法的区别,我认为这可能不是计算百万对文档之间相似性的机制。
Q2。我发现基于gensim的Doc2Vec更适合我的目的。但是我认识到训练Doc2Vec比我需要更多的内存(32 my )(我的整个文档的大小大约是100 my)。我有没有办法用整个语料库的小部分(比如20 to )来训练模型,并用这个模型来计算整个语料库的两两相似点?如果是的话,那么理想的火车设置大小是什么,我是否可以遵循任何教程?
发布于 2019-01-09 01:52:52
Ad Q1:如果相似度矩阵包含单词嵌入的余弦相似性(或多或少,见SimBow在SemEval-2017任务3中的等式4),如果单词嵌入是L2归一化的,那么SCM (软余弦度量)相当于平均单词嵌入(即基线)。有关证明,请参见供应链管理的实现说明中的引理3.3。我的SCM的Gensim实现(1,2)还增加了相似矩阵的稀疏性,以保持较小的内存占用,并对嵌入进行正则化,因此您将获得与普通SCM略有不同的结果。如果嵌入平均给出的结果与简单的弓余弦相似,我会质疑嵌入的质量。
Ad Q2:在整个数据集上为一个时代训练一个Doc2Vec模型,相当于在整个数据集的较小部分上训练一个Doc2Vec模型,每个片段一个时期。请注意,Doc2Vec使用文档id作为培训过程的一部分,因此必须确保在分段后id仍然是唯一的(即第一个段的第一个文档必须具有与第二个段的第一个文档不同的id)。
https://stackoverflow.com/questions/53467414
复制相似问题