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

Python Calculating similarity between two documents using word2vec, doc2vec

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

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

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

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

但是,由于每个输入文档的大小都比较大,我使用上述方法得到的结果与简单的 BOW 余弦相似度非常相似。

我有两个问题,

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

Q2。我发现 gensim 的 Doc2Vec 更适合我的目的。但我认识到训练 Doc2Vec 需要比我拥有的内存 (32GB) 更多的内存(我的整个文档的大小约为 100GB)。有没有什么办法可以用整个语料库的一小部分(比如 20GB)来训练模型,并使用这个模型来计算整个语料库的两两相似度? 如果是,那么理想的训练集大小是多少,有没有我可以遵循的教程?

广告问题 1:如果相似度矩阵包含词嵌入的余弦相似度(它或多或少包含,请参见 SimBow at SemEval-2017 Task 3) and if the word embeddings are L2-normalized, then the SCM (Soft Cosine Measure) is equivalent to averaging the word embeddings (i.e. your baseline). For a proof, see Lemma 3.3 in the Implementation Notes for the SCM. My Gensim implementation of the SCM (1, 2 中的等式 4),则另外稀疏相似度矩阵以保持较小的内存占用,并且对嵌入进行正则化,因此与普通 SCM 相比,您会得到略有不同的结果。如果嵌入平均给你的结果与简单的 BOW 余弦相似度相似,我会质疑嵌入的质量。

广告问题 2:在整个数据集上训练 Doc2Vec 模型一个时期相当于在整个数据集的较小部分上训练一个 Doc2Vec 模型,每个部分一个时期。请注意 Doc2Vec 使用文档 ID 作为训练过程的一部分,因此您必须确保 ID 在分割后仍然是唯一的(即第一个片段的第一个文档必须与第二个片段的第一个文档具有不同的 ID段)。