【问题标题】:Pairwise Distance between documents文档之间的成对距离
【发布时间】:2018-02-17 19:22:08
【问题描述】:

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

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

【问题讨论】:

    标签: r quanteda


    【解决方案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
    

    请注意,您在创建dtm3 时使用ngrams=2 从二元组特征(很少见)创建一个dfm。如果你想要一元和二元,那么这应该是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
    

    【讨论】:

    • 谢谢肯。它就像魅力一样。只是一个问题-您认为标准化的 tf-idf 是否有助于文档相似性?我认为当您比较同一语料库中的文档时会有所帮助。计算相似度时如何归一化
    • tf-idf 会降低许多文档中出现的特征的权重,从而降低相似度。问题是你是否想要这个。归一化(使用相对词频)不会影响余弦相似度,因为它基于维度向量之间的角度,而不是它们的长度。 (试试看!)
    猜你喜欢
    • 2019-04-08
    • 2021-11-30
    • 2018-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    相关资源
    最近更新 更多