计算R中tm包的TermDocumentMatrix中两个文档之间的余弦相似度

Calculate Cosine Similarity between two documents in TermDocumentMatrix of tm Package in R

我的任务是通过余弦相似度比较语料库中的文档。我使用 tm 包并获得 TermDocumentMatrix(以 td-idf 形式)tdm。以下任务应该像

中所述的那样简单
d <- dist(tdm, method="cosine")

cosine_dist_mat <- 1 - crossprod_simple_triplet_matrix(tdm)/(sqrt(col_sums(tdm^2) %*% t(col_sums(tdm^2))))

但是,我的 tdm 中的术语数量相当大,超过 120,000 个(大约有 50,000 个文档)。 R 无法处理此类矩阵。 我的 RStudio 崩溃了好几次。

我的问题是 1) 如何处理如此大的矩阵并获得成对 (120,000*120,000) 余弦相似度? 2)如果不可能,我怎样才能一次只得到两个文档的余弦相似度?假设我想要文档 10 和 21 之间的相似性,那么类似

sim10_21<-cosine_similarity(tdm, d1=10,d2=21)

如果 tdm 是一个简单的矩阵,我可以对 tdm[c(10,21)] 进行计算。但是,将 tdm 转换为矩阵正是我无法处理的。我的问题最终归结为如何在 tdm 上进行类似矩阵的计算。

120,000 x 120,000 矩阵 * 8 字节(dbl 浮点数)= 115.2 GB。这不一定超出 R 的能力,但无论您使用何种语言,您至少需要那么多内存。实际上,您可能想要写入磁盘,要么使用某些数据库,例如 Sql(例如 RSQLite 包),要么如果您打算在分析中只使用 R,最好使用 "ff" 磁盘上 storing/accessing 大矩阵的包。

您可以迭代地执行此操作并对其进行多线程处理以提高计算速度。

要查找两个文档之间的距离,您可以这样做:

dist(t(tdm[,1]), t(tdm[,2]), method='cosine')