我猜想,其中一个文档文本文件(在Node.js的) i
被表示为一个单词列表。 什么是计算这些文档之间的相似性,同时考虑到新文档来作为一种文件流的有效方法是什么?
我目前使用的COS-相似性对每个文档中的单词的归一化频率。 因为我得到越来越多的文件,我不使用TF-IDF(词频,倒排文档频率),因为可扩展性问题。
原来
我的第一个版本是当前可用的文件开始,计算一个大项-文档矩阵A
,然后计算S = A^T x A
,使S(i, j)
是(双方正常化后norm(doc(i))
和norm(doc(j))
的文档之间的余弦相似性i
和j
词频率分别为doc(i)
和doc(j)
对于新文件
我该怎么办时,我得到一个新的文档doc(k)
好了,我要计算这个文件的相似性了之前所有的,它不需要建立一个整个矩阵。 我可以只取内积doc(k) dot doc(j)
的所有之前j
,而导致S(k, j)
这是伟大的。
麻烦
计算
S
在Node.js的是很长的。 太长的事实! 所以我决定创建一个C ++模块,它会做整个事情要快得多。 而且它! 但我不能等待,我应该能够使用的中间结果。 而我所说的“不等待它”的意思是既一个。 等待计算来完成,但也
湾 等待矩阵A
待建(这是一个很大的一个)。计算的新
S(k, j)
可以利用的事实,文件具有高于设定的所有给出的单词(我用它来构建整个矩阵的方式少言的优势A
)。 因此,它看起来更快地做到这一点在Node.js的,避免了很多额外的资源将要采取的访问数据。
但是,有没有更好的方式来做到这一点?
注 :我开始计算的原因S
是,我可以轻松构建A
在Node.js的,我可以访问所有数据,然后做矩阵乘法C ++和拿回来的Node.js,极大地提高了整个事情很多。 但现在,计算S
变得不可行,它看起来毫无用处。
注2:是的,我没有计算整个S
,我可以只计算右上方的元素(或左下的),但是这不是问题。 时间计算的问题是,为了不。