如何有效地计算文档stream中文档之间的相似度

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

我目前在每个文档中的单词的归一化频率上使用了cos-相似性。 由于可扩展性的问题,我不使用TF-IDF(词频,逆文档频率),因为我得到越来越多的文档。

原来

我的第一个版本是从当前可用的文档开始,计算一个大的Term-DocumentmatrixA ,然后计算S = A^T x A ,使得S(i, j) norm(doc(i))norm(doc(j)) )文档ij之间的词频分别为doc(i)doc(j)之间的相似度。

对于新文件

当我得到一个新的文档doc(k)时,我该怎么办? 那么,我必须计算这个文件与以前所有文件的相似性,而不需要build立一个完整的matrix。 我可以把doc(k) dot doc(j)的内积代入前面的所有j ,并且得到S(k, j) ,这很好。

麻烦

  1. 在Node.js中计算S非常长。 实际上太长了! 所以我决定创build一个C ++模块,它可以更快地完成整个任务。 它确实! 但我不能等待它,我应该能够使用中间结果。 而我的意思是“不等它”是两个

    一个。 等待计算完成,而且
    湾 等待matrixAbuild立(这是一个很大的)。

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

但有没有更好的方法来做到这一点?

注意 :我开始计算S的原因是,我可以在Node.js中轻松地构buildA在那里我可以访问所有的数据,然后在C ++中进行matrix乘法,并将其返回到Node.js中,从而加快整个过程很多。 但是现在计算机不可行,看起来没用。

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

Interesting Posts