Python使用word2vec、doc2vec计算两个文档之间的相似性



我正试图计算由数千个句子组成的两个文档之间的相似性。

基线是使用BOW计算余弦相似度。

然而,我想捕捉更多文档之间的语义差异。

因此,我通过简单地平均每个文档中的所有单词向量来生成文档向量,并测量这些文档向量之间的余弦相似度,从而构建了单词嵌入并计算了文档相似度。

然而,由于每个输入文档的大小相当大,我使用上述方法得到的结果与简单的BOW余弦相似性非常相似。

,我有两个问题

Q1.我发现gensim模块提供了软余弦相似性。但我很难理解与上述方法的区别,我认为这可能不是计算一百万对文档之间相似性的机制。

Q2.我发现gensim的Doc2Vec更适合我的目的。但我意识到培训Doc2Vec需要比我更多的RAM(32GB((我的整个文档的大小约为100GB(。有没有什么方法可以让我用整个语料库的一小部分(比如20GB(来训练模型,并使用这个模型来计算整个语料库的成对相似性?如果是的话,那么理想的火车组尺寸是多少?我可以遵循什么教程吗?

Ad Q1:如果相似性矩阵包含单词嵌入的余弦相似性(或多或少是这样,请参阅SemEval-2017任务3中SimBow中的等式4(,并且单词嵌入是L2归一化的,则SCM(软余弦测量(等效于对单词嵌入(即基线(取平均值。有关证明,请参阅SCM实施说明中的引理3.3。我的SCM(1,2(的Gensim实现还稀疏了相似性矩阵,以保持较小的内存占用并正则化嵌入,因此与普通SCM相比,您将获得略有不同的结果。如果嵌入平均得到的结果与简单的BOW余弦相似性相似,我会质疑嵌入的质量。

Ad Q2:在整个数据集上训练一个时期的Doc2Vec模型相当于在整个数据集中的较小片段上训练Doc2Vec模型,每个片段一个时期。请注意,Doc2Vec在培训过程中使用文档id,因此您必须确保id在分割后仍然是唯一的(即,第一个分段的第一个文档必须具有与第二个分段的第一个文档不同的id(。

相关内容

最新更新