如何有效地计算文档流中的文档之间的相似性

时间:2012-12-21 08:17:54

标签: node.js stream nlp cosine-similarity term-document-matrix

我收集文本文档(在Node.js中),其中一个文档i被表示为单词列表。 考虑到新文档是作为一种文档流而来的,计算这些文档之间相似性的有效方法是什么?

我目前在每个文档中的单词的标准化频率上使用cos相似性。由于可扩展性问题,我没有使用TF-IDF(术语频率,反向文档频率),因为我收到的文档越来越多。

首先

我的第一个版本是从当前可用的文档开始,计算一个大的术语 - 文档矩阵A,然后计算S = A^T x A以便S(i, j)是(经过两个{标准化后) {1}}和norm(doc(i)))文字norm(doc(j))i之间的字元相似度,其字频分别为jdoc(i)

对于新文件

我收到新文件doc(j)后该怎么办?好吧,我必须计算这个文档与之前所有文档的相似性,这不需要构建一个完整的矩阵。我可以将doc(k)的内在产品用于所有之前的doc(k) dot doc(j),结果为j,这很棒。

麻烦

  1. 在Node.js中计算S(k, j)真的很长。实际上太长了!所以我决定创建一个C ++模块,它可以更快地完成整个过程。它确实如此!但我不能等待它,我应该能够使用中间结果。而我所说的“不等待它”就是

    一个。等待计算完成,但也是 湾等待构建矩阵S(这是一个很大的矩阵)。

  2. 计算新的A可以利用文档比所有给定单词的集合(我用来构建整个矩阵S(k, j))更少的单词这一事实。因此,在Node.js中看起来更快,避免了大量额外资源来访问数据。

  3. 但有没有更好的方法呢?

    注意:我开始计算A的原因是我可以在Node.js中轻松构建S,我可以访问所有数据,然后执行C ++中的矩阵乘法并将其返回到Node.js中,这会加速整个事情的发展。但是现在计算A变得不切实际,它看起来毫无用处。

    注意2 :是的,我不必计算整个S,我可以只计算右上角的元素(或左下角的元素),但那是不是问题。时间计算问题不是那个顺序。

1 个答案:

答案 0 :(得分:-1)

如果今天必须解决它,只需使用来自fasttext或word2vec的预训练单词向量