6

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

我目前对每个文档中单词的归一化频率使用 cos-similarity。由于可扩展性问题,我不使用 TF-IDF(词频,逆文档频率),因为我获得了越来越多的文档。

最初

我的第一个版本是从当前可用的文档开始,计算一个大的 Term-Document 矩阵A,然后计算S = A^T x AS(i, j)在通过norm(doc(i))和归一化之后norm(doc(j)))文档之间的 cos-similarityi以及j其词频分别为doc(i)doc(j)

对于新文件

收到新文件时该怎么办doc(k)?好吧,我必须计算这个文档与之前所有文档的相似度,这不需要构建整个矩阵。我可以取doc(k) dot doc(j)所有之前的内积j,结果是S(k, j),这很好。

麻烦

  1. SNode.js 中的计算真的很长。实在是太长了!所以我决定创建一个 C++ 模块,它可以更快地完成整个事情。确实如此!但我等不及了,我应该能够使用中间结果。而我所说的“不等待”的意思是

    一个。等待计算完成,但也
    b。等待构建矩阵A(这是一个大矩阵)。

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

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

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

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

4

1 回答 1

-1

如果今天必须解决它,只需使用来自 fasttext 或 word2vec 的预训练词向量

于 2018-03-06T12:46:30.190 回答