R中2个DTM的余弦相似度

时间:2017-01-18 14:00:46

标签: r text-mining cosine

我有2个文档术语矩阵:

  1. DTM 1说1000个向量(1000个文档)和
  2. DTM2有20个向量(20个文档)
  3. 所以基本上我想将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
    

    余弦函数结果如下:

    enter image description here

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

1 个答案:

答案 0 :(得分:2)

这是一种计算两个矩阵之间余弦距离的方法。使用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帖子:R: Calculate cosine distance from a term-document matrix with tm and proxy