r - 字符向量列表与字符向量的模糊字符串匹配

标签 r string fuzzy-comparison

我有一个字符向量列表和一个字符向量。我想在列表的每个元素(字符向量)与字符向量(字符串)的每个元素之间执行 R 中的模糊匹配,并返回每个组合的最大相似度得分。下面是一个玩具示例:

a <- c("brown fox", "lazy dog", "white cat", "I don't know", "sunset", "never mind", "excuse me")
b <- c("very late", "do not cross", "sunrise", "long vacation")
c <- c("toy example", "green apple", "tall building", "good rating", "accommodating")
mylist <- list(a,b,c)

charvec <- c("brown dog", "lazy cat", "white dress", "I know that", "excuse me please", "tall person", "new building", "good example", "green with envy", "zebra crossing")

现在,我想将 mylist 中的每个元素与 charvec 中的第一个字符串进行模糊匹配,并返回 7 个分数中的最大相似度分数。同样,我想获得 mylistcharvec 每种组合的分数。

到目前为止我的尝试:

将 charvec 中的字符串转换为空数据框的列名

df <- setNames(data.frame(matrix(ncol = 10, nrow = 3)), c(charvec))

使用 RecordLinkage 包中的 jarowinkler 距离计算每个组合之间的最大相似度得分(或者是否有更好的匹配短语距离度量!!)

for (j in seq_along(mylist)) {
  for (i in length(ncol(df))) {
    df[[i,j]] <- max(jarowinkler(names(df)[i], mylist[[j]]))
  }
}

但不幸的是,我在第一行只得到 3 分,其余值均为 NA。

对此的任何帮助将不胜感激。

最佳答案

使用purrr

mylist <- setNames(mylist, c('a', 'b', 'c'))

library(purrr)

map_dfr(charvec,
    function(wrd, vec_list){
      setNames(map_df(vec_list, ~max(jarowinkler(wrd, .x))),
               names(vec_list)
      )

    },
    mylist)

# A tibble: 10 x 3
       a     b     c
   <dbl> <dbl> <dbl>
 1 0.911 0.580 0.603
 2 0.85  0.713 0.603
 3 0.842 0.557 0.515
 4 0.657 0.490 0.409
 5 0.912 0.489 0.659
 6 0.538 0.546 0.801
 7 0.716 0.547 0.740
 8 0.591 0.524 0.856
 9 0.675 0.509 0.821
10 0.619 0.587 0.630

如果你想要宽:

map_dfc(charvec,
         function(wrd, vec_list) {
          set_names(list(map_dbl(vec_list, ~max(jarowinkler(wrd, .x)))),
                    wrd)
         },
        mylist
)

# A tibble: 3 x 10
  `brown dog` `lazy cat` `white dress` `I know that` `excuse me plea~ `tall person` `new building` `good example`
        <dbl>      <dbl>         <dbl>         <dbl>            <dbl>         <dbl>          <dbl>          <dbl>
1       0.911      0.85          0.842         0.657            0.912         0.538          0.716          0.591
2       0.580      0.713         0.557         0.490            0.489         0.546          0.547          0.524
3       0.603      0.603         0.515         0.409            0.659         0.801          0.740          0.856
# ... with 2 more variables: `green with envy` <dbl>, `zebra crossing` <dbl>

关于r - 字符向量列表与字符向量的模糊字符串匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51308266/

相关文章:

c++ - L ""and u8"之间的区别“

elasticsearch - 带有ElasticSearch的价格比较网站

r - 查找近似重复记录的技术

r - 将向量输出与其他列一起转换为 data.table 中的列?

R grid.arrange : nrow * ncol >= n is not TRUE

algorithm - 组合学:分组字符挑战

python - 模糊匹配嵌入字符串中的字符串

r - 如何使用scales::label_percent在ggplot中实现绝对百分比比例?

r - 如果并非所有列都存在于所有文件中,如何计算列的平均值?

string - 计算最小交换次数以对字符串中的字符进行分组