我收集文本文档(在Node.js中),其中一个文档i
被表示为单词列表。
考虑到新文档是作为一种文档流而来的,计算这些文档之间相似性的有效方法是什么?
我目前在每个文档中的单词的标准化频率上使用cos相似性。由于可扩展性问题,我没有使用TF-IDF(术语频率,反向文档频率),因为我收到的文档越来越多。
我的第一个版本是从当前可用的文档开始,计算一个大的术语 - 文档矩阵A
,然后计算S = A^T x A
以便S(i, j)
是(经过两个{标准化后) {1}}和norm(doc(i))
)文字norm(doc(j))
和i
之间的字元相似度,其字频分别为j
和doc(i)
。
我收到新文件doc(j)
后该怎么办?好吧,我必须计算这个文档与之前所有文档的相似性,这不需要构建一个完整的矩阵。我可以将doc(k)
的内在产品用于所有之前的doc(k) dot doc(j)
,结果为j
,这很棒。
在Node.js中计算S(k, j)
真的很长。实际上太长了!所以我决定创建一个C ++模块,它可以更快地完成整个过程。它确实如此!但我不能等待它,我应该能够使用中间结果。而我所说的“不等待它”就是
一个。等待计算完成,但也是
湾等待构建矩阵S
(这是一个很大的矩阵)。
计算新的A
可以利用文档比所有给定单词的集合(我用来构建整个矩阵S(k, j)
)更少的单词这一事实。因此,在Node.js中看起来更快,避免了大量额外资源来访问数据。
但有没有更好的方法呢?
注意:我开始计算A
的原因是我可以在Node.js中轻松构建S
,我可以访问所有数据,然后执行C ++中的矩阵乘法并将其返回到Node.js中,这会加速整个事情的发展。但是现在计算A
变得不切实际,它看起来毫无用处。
注意2 :是的,我不必计算整个S
,我可以只计算右上角的元素(或左下角的元素),但那是不是问题。时间计算问题不是那个顺序。
答案 0 :(得分:-1)
如果今天必须解决它,只需使用来自fasttext或word2vec的预训练单词向量