【问题标题】:How to efficiently compute similarity between documents in a stream of documents如何有效地计算文档流中文档之间的相似度
【发布时间】:2012-12-08 19:40:50
【问题描述】:

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

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

最初

我的第一个版本是从当前可用的文档开始,计算一个大的 Term-Document 矩阵 A,然后计算 S = A^T x A 使得 S(i, j) 是(经过 norm(doc(i))norm(doc(j)) 标准化后) 词频分别为doc(i)doc(j) 的文档ij 之间的 cos-similarity。

对于新文件

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

烦恼

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

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

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

但是有没有更好的方法呢?

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

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

【问题讨论】:

  • 你看过随机投影 lsh 吗?

标签: node.js stream nlp cosine-similarity term-document-matrix


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-02-12
    • 1970-01-01
    • 2019-10-23
    • 2011-03-27
    • 2022-01-08
    • 2023-03-24
    • 1970-01-01
    • 2019-04-27
    • 2020-01-25
    相关资源
    最近更新 更多