使用R匹配字符串

时间:2018-08-27 10:35:25

标签: r string matching string-matching

我有一个一般性的问题。我尝试在R中的数据帧之间进行字符串匹配。我的字符串具有以下格式:

"COOL FOODS LTD 222 HIGH ST LONDON ABC123"  

我想遍历其他数据帧,并希望我的代码在上面的字符串和下面的字符串之间找到匹配项:

"222 HIGH ST LONDON ABC123 COOL FOODS LTD " 
"HIGH LTD ST 222 LONDON COOL ABC123 FOODS "
"COOL FOODS LTD 222 HIGH ST LONDON UNITED KINGDOM ABC123"

我尝试过adist,但是当重新排列字符串的一部分或插入的部分很长时(根据示例),使用该方法获得的相似性分数不是很好。

我曾考虑过用空格分割字符串,但不确定如何进行匹配并与许多数据帧进行有效比较。

如果有任何建议,我将不胜感激!

干杯!

1 个答案:

答案 0 :(得分:1)

使用软件包stringdist,您可以编写一个辅助函数,将一个字符串与向量中的每个目标字符串进行比较。
strplitsort的所有字符串下面的函数。然后调用stringsim以计算相似度得分。

funSimilarity <- function(x, y, method = "osa"){
    x <- strsplit(x, " ")[[1]]
    x <- paste(sort(x), collapse = " ")
    y_list <- strsplit(y, " ")
    y_list <- lapply(y_list, function(.y) paste(sort(.y), collapse = " "))
    stringsim(x, unlist(y_list), method = method)
}

funSimilarity(x, y)
#[1] 1.0000000 1.0000000 0.7272727

met <- c("osa", "lv", "dl", "hamming", "lcs", "qgram",
  "cosine", "jaccard", "jw", "soundex")

sapply(met, function(m) funSimilarity(x, y, method = m))
#           osa        lv        dl hamming       lcs     qgram    cosine
#[1,] 1.0000000 1.0000000 1.0000000       1 1.0000000 1.0000000 1.0000000
#[2,] 1.0000000 1.0000000 1.0000000       1 1.0000000 1.0000000 1.0000000
#[3,] 0.7272727 0.7272727 0.7272727       0 0.8421053 0.8421053 0.9689541
#       jaccard        jw soundex
#[1,] 1.0000000 1.0000000       1
#[2,] 1.0000000 1.0000000       1
#[3,] 0.8095238 0.8632576       1