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

时间:2018-11-25 12:25:40

标签: python similarity gensim word2vec doc2vec

我正在尝试计算包含成千上万个句子的两个文档之间的相似度。

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

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

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

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

我有两个问题,

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

Q2。我发现gensim的Doc2Vec更适合我的目的。但是我认识到培训Doc2Vec所需的RAM比我需要的RAM(32GB)更多(我的整个文档的大小约为100GB)。我有什么办法可以训练整个语料库的一小部分(例如20GB),并使用此模型计算整个语料库的成对相似度? 如果是,那么理想的火车组大小是多少,我可以遵循任何教程吗?

1 个答案:

答案 0 :(得分:1)

广告Q1:如果相似度矩阵包含单词嵌入的余弦相似度(或多或少做到这一点,请参见SimBow at SemEval-2017 Task 3中的公式4),并且如果单词嵌入经过L2归一化,则SCM(软余弦测量)等效于平均词嵌入(即您的基线)。有关证明,请参见the Implementation Notes for the SCM中的引理3.3。我的Gensim SCM实现(12)还稀疏了相似度矩阵,以保持较小的内存占用并规范化嵌入,因此与普通SCM相比,您得到的结果会略有不同。如果嵌入平均给您带来与简单BOW余弦相似度相似的结果,我会质疑嵌入的质量。

广告Q2:在整个数据集上训练Doc2Vec模型一个历时就等于在整个数据集的较小段上训练Doc2Vec模型,每个细分化一个历时。请注意,Doc2Vec在培训过程中使用了文档ID,因此您必须确保在细分之后ID仍然是唯一的(即,第一段的第一个文档必须与第二个文档的第一个文档具有不同的ID)段)。