Соответствие строк с использованием R - PullRequest
0 голосов
/ 27 августа 2018

У меня есть общий вопрос. Я пытаюсь выполнить сопоставление строк между фреймами данных в 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 голосов
/ 27 августа 2018

Используя пакет stringdist, вы можете написать вспомогательную функцию, которая сравнивает строку с каждой целевой строкой в ​​векторе.
Функция ниже первых strplit и всех строк sort. Затем вызывает 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
...