【问题标题】:Cosine similarity of Documents文档的余弦相似度
【发布时间】:2019-03-14 04:21:56
【问题描述】:

数据格式 CSV

文档总数 500。字段数 10。

查看数据

我想计算每个“文档”与所有 500 个文档的平行余弦相似度,

预期输出

【问题讨论】:

  • R 是一种免费的开源编程语言和软件环境,用于统计计算、生物信息学、可视化和通用计算。 为您的问题提供最少的、可重复的、有代表性的示例。对数据使用 dput() 并使用库调用指定所有非基础包。不要为数据或代码嵌入图片,使用缩进的代码块。对于统计问题,请使用 stats.stackexchange.com。
  • 还有谷歌:"cosine similarity r"。希望这会有所帮助。
  • help("stringdist::stringdist").
  • 查看您的“数据”和“预期输出”,它们似乎是相同的,但只有一个新列显示“余弦相似度”。我想你想要一个号码,对吧?如果是这样,您能否详细说明您想要计算的内容?余弦相似度取两个长度相同的向量。所以在第一行,我想你想要文档“u10072963”的相似性,但是与其他什么文档呢?如果您想要所有文档组合,您的预期输出应该看起来有点不同(作为相似矩阵或添加的新列)。
  • 是的,我想要一个有余弦相似度的数字。我想计算文档“u10072963”与所有其他 500 个文档的相似度,依此类推。如果预期的输出 id 不同,没关系,先生。

标签: r text-mining cosine-similarity


【解决方案1】:

这是你想要的吗?要计算所有 (500*499)/2 组合的相似度,您可以执行以下操作:

# Create some mock data
df <-replicate(10, rnorm(500))
rownames(df) <- paste0("doc", seq_len(nrow(df)))
colnames(df) <- paste0("field", seq_len(ncol(df)))


# Vector lengths
vl <- sqrt(rowSums(df*df))

# Matrix of all combinations
comb <- t(combn(1:nrow(df), 2))

# Compute cosine similarity for all combinations
csim <- apply(comb, 1, FUN = function(i) sum(apply(df[i, ], 2, prod))/prod(vl[i]))

# Create a data.frame of the results
res <- data.frame(docA = rownames(df)[comb[,1]],
                  docB = rownames(df)[comb[,2]],
                  csim = csim)
head(res)
#  docA docB       csim
#1 doc1 doc2 -0.6431972
#2 doc1 doc3 -0.2560444
#3 doc1 doc4 -0.4911942
#4 doc1 doc5 -0.2207487
#5 doc1 doc6  0.4764924
#6 doc1 doc7  0.5867607

tail(res)
#         docA   docB      csim
#124745 doc497 doc498 1.0714338
#124746 doc497 doc499 0.8439304
#124747 doc497 doc500 1.1806366
#124748 doc498 doc499 0.9326781
#124749 doc498 doc500 1.4783254
#124750 doc499 doc500 1.3626494

请注意,在此输出表中拥有字段的原始向量值并没有真正意义。每个数字都是数据中两行的比较和计算。

编辑

如果不想要矩阵形式,可以直接计算:

res_mat <- tcrossprod(df)/tcrossprod(vl)
print(res_mat[1:5, 1:5])
#           doc1       doc2       doc3       doc4       doc5
#doc1  1.0000000 -0.6431972 -0.2560444 -0.4911942 -0.2207487
#doc2 -0.6431972  1.0000000  0.3996618  0.3365490 -0.1434239
#doc3 -0.2560444  0.3996618  1.0000000  0.2856842  0.2781019
#doc4 -0.4911942  0.3365490  0.2856842  1.0000000  0.2287057
#doc5 -0.2207487 -0.1434239  0.2781019  0.2287057  1.0000000

【讨论】:

  • 这就是我想要的。请告诉我如何获得输出结果,例如(d1 d2 d3 d4 d5 d1 o d2 1 2 d3 1 2 3 d4 1 2 3 4 d5 1 2 3 4 5)请将括号中的值复制到记事本以便更好地理解我的意思
猜你喜欢
  • 2014-02-25
  • 2015-05-31
  • 2014-02-25
  • 2020-08-12
  • 2020-01-25
  • 2021-08-04
  • 2011-01-01
  • 2020-07-09
相关资源
最近更新 更多