R中2个DTM的余弦相似度

Cosine similarity of 2 DTMs in R

我有 2 个文档术语矩阵:

  1. DTM 1 有 1000 个向量(1000 个文档)和
  2. DTM2 有 20 个向量(20 个文档)

所以基本上我想将 DTM1 的每个文档与 DTM2 进行比较,并希望使用余弦函数查看哪些 DTM1 文档最接近哪些 DTM2 文档。任何指针都会有所帮助!

我使用 "slam" 包创建了一个余弦矩阵。

Docs   –glyma –ie   –initi –stafford ‘bureaucratic’ ‘empti ‘holi ‘incontrovert
  1  0.000000   0 0.000000  0.000000       0.000000      0     0             0
  2  0.000000   0 0.000000  0.000000       0.000000      0     0             0
  3  0.000000   0 0.000000  0.000000       0.000000      0     0             0
  4  0.000000   0 0.000000  0.000000       0.000000      0     0             0
  5  0.000000   0 0.000000  0.000000       0.000000      0     0             0
  6  0.000000   0 0.000000  0.000000       4.906891      0     0             0
  7  0.000000   0 0.000000  4.906891       0.000000      0     0             0
  8  0.000000   0 0.000000  0.000000       0.000000      0     0             0
  9  0.000000   0 4.906891  0.000000       0.000000      0     0             0
  10 4.906891   0 0.000000  0.000000       0.000000      0     0             0

余弦函数结果为:

但是,此矩阵将 DTM1 的文档相互比较。我希望将这些向量与 DTM2 的向量进行比较,然后为给定的 DTM1 文档找到最接近的 DTM2 文档。

这是一种计算两个矩阵之间的余弦距离的方法。 tm 的使用仅用于数据目的...

library(slam)
library(tm)
data("acq")
data("crude")

dtm <- DocumentTermMatrix(c(acq, crude))

index <- sample(1:70, size = 10)

dtm1 <- dtm[index, ]
dtm2 <- dtm[-index, ]

cosine_sim <- tcrossprod_simple_triplet_matrix(dtm1, dtm2)/sqrt(row_sums(dtm1^2) %*% t(row_sums(dtm2^2)))

余弦函数改编自此 SO post: