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

时间:2017-05-07 03:25:32

标签: r matrix sparse-matrix tm cosine-similarity

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

中所述的一样简单
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上进行矩阵式计算。

1 个答案:

答案 0 :(得分:0)

120,000 x 120,000矩阵* 8字节(dbl float)= 115.2千兆字节。这并不一定超出R的能力,但无论使用何种语言,您都需要至少那么多的内存。实际上,您可能想要使用某些数据库(如Sql(例如RSQLite包))写入磁盘,或者如果您计划仅在分析中使用R,则最好使用&#34; FF&#34;用于在磁盘上存储/访问大型矩阵的包。

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

要查找两个文档之间的距离,您可以执行以下操作:

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