我收集文本文档(在 Node.js 中),其中一个文档i
表示为单词列表。
考虑到新文档以文档流的形式出现,计算这些文档之间相似性的有效方法是什么?
我目前对每个文档中单词的归一化频率使用余弦相似度。我不使用 TF-IDF(词频、逆文档频率),因为我收到的文档越来越多,导致可扩展性问题。
最初
我的第一个版本是从当前可用的文档开始,计算一个大的术语文档矩阵A
,然后计算S = A^T x A
以便S(i, j)
是(在归一化之后norm(doc(i))
and norm(doc(j))
) 文档之间的余相似度i
and j
其词频分别为doc(i)
and doc(j)
.
对于新文件
当我收到新文档时我该怎么办doc(k)
?好吧,我必须计算该文档与之前所有文档的相似度,这不需要构建整个矩阵。我可以只取内积doc(k) dot doc(j)
对于所有以前的j
,结果是S(k, j)
,这太棒了。
麻烦
-
计算S
在 Node.js 中确实很长。事实上太长了!所以我决定创建一个 C++ 模块,它可以更快地完成整个事情。确实如此!但我等不及了,我应该能够使用中间结果。我所说的“不要等待”的意思是
A。等待计算完成,但也
b.等待矩阵A
即将建成(这是一个很大的建筑)。
-
计算新S(k, j)
可以利用这样一个事实:文档的单词数比所有给定单词的集合要少(我用它来构建整个矩阵)A
)。因此,在 Node.js 中执行此操作看起来更快,避免了访问数据时占用大量额外资源。
但有没有更好的方法呢?
Note:我开始计算的原因S
是我可以轻松构建A
在 Node.js 中我可以访问所有数据,然后在 C++ 中进行矩阵乘法并将其返回到 Node.js 中,这大大加快了整个过程。但现在计算S
变得不切实际,看起来毫无用处。
Note 2:是的,我不必计算全部S
,我可以只计算右上角的元素(或左下角的元素),但这不是问题。时间计算问题不属于这个顺序。
如果今天必须解决这个问题,只需使用 fasttext 或 word2vec 中预先训练的词向量
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)