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

Ale*_*par 6 nlp stream node.js cosine-similarity term-document-matrix

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

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

原来

我的第一个版本是当前可用的文件开始,计算一个大项-文档矩阵A,再计算S = A^T x A,这样S(i, j)是后(通过归一化后norm(doc(i))norm(doc(j)))文档之间的余弦相似性ij词频率分别为doc(i)doc(j).

对于新文件

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

麻烦

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

    一个.等待计算完成,但也
    b.等待矩阵A建立(这是一个很大的矩阵).

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

但有没有更好的方法呢?

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

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

vum*_*sha -1

如果今天必须解决这个问题,只需使用 fasttext 或 word2vec 中预先训练的词向量