如何有效地计算文档stream中文档之间的相似度
我收集文本文档(在Node.js中),其中一个文档i
被表示为单词列表。 考虑到新文件正在成为一种文件stream,计算这些文件之间的相似性的一种有效方法是什么?
我目前在每个文档中的单词的归一化频率上使用了cos-相似性。 由于可扩展性的问题,我不使用TF-IDF(词频,逆文档频率),因为我得到越来越多的文档。
原来
我的第一个版本是从当前可用的文档开始,计算一个大的Term-DocumentmatrixA
,然后计算S = A^T x A
,使得S(i, j)
norm(doc(i))
和norm(doc(j))
)文档i
和j
之间的词频分别为doc(i)
和doc(j)
之间的相似度。
对于新文件
当我得到一个新的文档doc(k)
时,我该怎么办? 那么,我必须计算这个文件与以前所有文件的相似性,而不需要build立一个完整的matrix。 我可以把doc(k) dot doc(j)
的内积代入前面的所有j
,并且得到S(k, j)
,这很好。
麻烦
-
在Node.js中计算
S
非常长。 实际上太长了! 所以我决定创build一个C ++模块,它可以更快地完成整个任务。 它确实! 但我不能等待它,我应该能够使用中间结果。 而我的意思是“不等它”是两个一个。 等待计算完成,而且
湾 等待matrixA
build立(这是一个很大的)。 -
计算新的
S(k, j)
可以利用这样的事实:文档比所有给定单词(我用来构build整个matrixA
)的集合具有更less的单词。 因此,在Node.js中看起来更快,避免了大量的额外资源来访问数据。
但有没有更好的方法来做到这一点?
注意 :我开始计算S
的原因是,我可以在Node.js中轻松地构buildA
在那里我可以访问所有的数据,然后在C ++中进行matrix乘法,并将其返回到Node.js中,从而加快整个过程很多。 但是现在计算机不可行,看起来没用。
注2 :是的,我不必计算整个S
,我可以计算右上angular的元素(或左下angular的元素),但这不是问题。 时间计算问题不是那个顺序。