如何有效地计算文档之间的相似性的文件流(How to efficiently compute sim

2019-08-04 11:04发布

我猜想,其中一个文档文本文件(在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 ++模块,它会做整个事情要快得多。 而且它! 但我不能等待,我应该能够使用的中间结果。 而我所说的“不等待它”的意思是既

    一个。 等待计算来完成,但也
    湾 等待矩阵A待建(这是一个很大的一个)。

  2. 计算的新S(k, j)可以利用的事实,文件具有高于设定的所有给出的单词(我用它来构建整个矩阵的方式少言的优势A )。 因此,它看起来更快地做到这一点在Node.js的,避免了很多额外的资源将要采取的访问数据。

但是,有没有更好的方式来做到这一点?

:我开始计算的原因S是,我可以轻松构建A在Node.js的,我可以访问所有数据,然后做矩阵乘法C ++和拿回来的Node.js,极大地提高了整个事情很多。 但现在,计算S变得不可行,它看起来毫无用处。

注2:是的,我没有计算整个S ,我可以只计算右上方的元素(或左下的),但是这不是问题。 时间计算的问题是,为了不。

Answer 1:

如果一个人今天来解决这个问题,只需使用预训练的词矢量从fasttext或word2vec



文章来源: How to efficiently compute similarity between documents in a stream of documents