【问题标题】:How to return a list of pairs of strings from a large matrix that mutually satisfy a maximum stringdistance criterion?如何从相互满足最大字符串距离标准的大矩阵中返回字符串对列表?
【发布时间】:2021-01-18 16:29:24
【问题描述】:

我正在尝试以一种方式呈现人工输入的单词,使它们的分组更容易被识别为指的是同一事物。本质上是一个拼写检查器。我已经制作了一个大矩阵(实际的矩阵是 250 * 250 ish)。该矩阵的代码与下面给出的可重现示例相同。 (我用随机词生成器填充了它,实际值更有意义但保密)

strings <- c("domineering","curl","axiomatic","root","gratis","secretary","lopsided","cumbersome","oval","mighty","thaw","troubled","furniture","round","soak","callous","melted","wealthy","sweltering","verdant","fence","eyes","ugliest","card","quickest","harm","brake","alarm","report","glue","eyes","hollow","quince","pack","twig","knot")

matrix <- stringdistmatrix(strings, strings, useNames = TRUE)

现在我想创建一个包含两个变量的新表,第一列必须包含成对的“字符串”元素,它们满足字符串距离小于某个数字的条件,例如本示例中的某个数字(stringdist

我感觉这需要 apply 某种函数,但我不知道。

干杯。

【问题讨论】:

    标签: r stringdist


    【解决方案1】:

    以下基于 tidyverse 的解决方案应该可以解决问题。

    请注意,最后一行是为了便于查看结果。我认为这对您的目的没有必要。如果您确实想保留它,我建议您将其包含在“pair”的初始制作中。

    library(stringdist)
    library(dplyr)
    library(tibble)
    library(tidyr)
    library(purrr)
    library(stringr)
    
    matrix %>%
      as_tibble() %>%
      mutate(X = colnames(.), .before = 1) %>%
      pivot_longer(-X) %>%
      filter(value %in% 1:7) %>%
      transmute(pair = map2(X, name, ~ sort(c(.x, .y))),
                stringDist = value) %>%
      distinct(pair, stringDist) %>%
      mutate(pair = map_chr(pair, ~ str_c(., collapse = '_')))
    
    # A tibble: 451 x 2
    #   pair                   stringDist
    #   <chr>                       <dbl>
    # 1 domineering_sweltering          6
    # 2 curl_root                       4
    # 3 curl_gratis                     6
    # 4 curl_secretary                  7
    # 5 cumbersome_curl                 7
    # 6 curl_oval                       3
    # 7 curl_mighty                     6
    # 8 curl_thaw                       4
    # 9 curl_troubled                   6
    # 10 curl_furniture                 7
    

    【讨论】:

    • 谢谢,这个解决方案很棒。我做了更多的研究,发现有人在reshape2 中使用melt 函数。只需两行代码就可以非常接近,例如:X &lt;- melt(X) ; X &lt;- X[X$value &lt;= 4 &amp; X$value != 0,] 问题是这仍然包括字符串对的反射,你有什么想法如何在这个方法中解决这个问题吗?
    • 不客气@Jose_harkhan。我很高兴它解决了你的问题。我不熟悉melt() 的使用。对于它的价值:我发布的解决方案所做的很多工作都是为了消除反射。
    • 所以我可以看到!如果您能阐明消除反射的工作原理,将不胜感激。另外我想知道是否可以对矩阵进行任何处理,使其成为三角形,或者在 dyplr(等)操作之前用零填充一个三角形。
    【解决方案2】:

    这也能起到作用

    matrix[lower.tri(matrix)] <- 0
    matrix_melt <- melt(matrix)
    matrix_melt %>%
        filter(value %in% 1:7)
    

    【讨论】:

      猜你喜欢
      • 2016-05-19
      • 1970-01-01
      • 2018-11-17
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 1970-01-01
      相关资源
      最近更新 更多