文档之间的成对距离

时间:2018-02-17 19:22:09

标签: r quanteda

我正在尝试计算一个文档术语矩阵的行与另一个文档术语矩阵的行的相似性。

A <- data.frame(name = c(
  "X-ray right leg arteries",
  "x-ray left shoulder",
  "x-ray leg arteries",
  "x-ray leg with 20km distance"
), stringsAsFactors = F)

B <- data.frame(name = c(
  "X-ray left leg arteries",
  "X-ray leg",
  "xray right leg",
  "X-ray right leg arteries"
), stringsAsFactors = F)

corp1 <- corpus(A, text_field = "name")
corp2 <- corpus(B, text_field = "name")

docnames(corp1) <- paste("A", seq_len(ndoc(corp1)), sep = ".")
docnames(corp2) <- paste("B", seq_len(ndoc(corp2)), sep = ".")

dtm3 <- rbind(dfm(corp1, ngrams=2), dfm(corp2, ngrams=2))
d1 = textstat_simil(dtm3, method = "cosine")
d1 = as.matrix(d1)

d1 = d1[grepl("^A.",row.names(d1)),grepl("^B.",colnames(d1))]

在代码中,我计算组合矩阵的相似性,然后从矩阵中删除不相关的单元格。是否可以在textstat_simil(dtm3, method = "cosine")中一次比较A中的一个文档?在我正在寻找的桌子下面。当我使用as.matrix(d1)时,矩阵的文件大小也增加了一倍。

         B.1       B.2       B.3       B.4
A.1 0.3333333 0.0000000 0.4082483 1.0000000
A.2 0.4082483 0.0000000 0.0000000 0.0000000
A.3 0.4082483 0.7071068 0.0000000 0.4082483
A.4 0.0000000 0.5000000 0.0000000 0.0000000

1 个答案:

答案 0 :(得分:1)

这会有效,但正如您所指出的那样,它会将dist类从textstat_simil()返回到matrix,从而使余弦相似度矩阵大小加倍。

d2 <- textstat_simil(dtm3, method = "cosine", diag = TRUE)
as.matrix(d2)[docnames(corp1), docnames(corp2)]
#           B.1       B.2       B.3       B.4
# A.1 0.3333333 0.0000000 0.4082483 1.0000000
# A.2 0.4082483 0.0000000 0.0000000 0.0000000
# A.3 0.4082483 0.7071068 0.0000000 0.4082483
# A.4 0.0000000 0.5000000 0.0000000 0.0000000

请注意,在ngrams=2的创建中使用dtm3会从 bigram功能(不常见的quire)创建dfm。如果你想要unigrams以及bigrams,那么这应该是ngrams = 1:2

对于大多数问题,这应该很好。如果您担心对象的大小,可以循环选择dtm3,构建目标对象,或lapply()比较,如下所示(但效率低得多) :

cosines <- lapply(docnames(corp2), 
                  function(x) textstat_simil(dtm3[c(x, docnames(corp1)), ],
                                             method = "cosine",
                                             selection = x)[-1, , drop = FALSE])
do.call(cbind, cosines)
#           B.1       B.2       B.3       B.4
# A.1 0.3333333 0.0000000 0.4082483 1.0000000
# A.2 0.4082483 0.0000000 0.0000000 0.0000000
# A.3 0.4082483 0.7071068 0.0000000 0.4082483
# A.4 0.0000000 0.5000000 0.0000000 0.0000000