Я пытаюсь использовать пакет recordLinkage, чтобы связать два набора данных, где один набор данных имеет тенденцию давать несколько фамилий/отчеств, а другой просто дает одну фамилию. В настоящее время используемой функцией сравнения строк является функция Яро-Винклера, однако возвращаемая оценка зависит от того, насколько строки совпадают случайно, а не от того, содержится ли содержимое более короткой строки где-либо в более длинной строке. Это приводит к созданию многих некачественных ссылок. Воспроизводимый пример неправильного взвешивания:
library(RecordLinkage)
data1 <- as.data.frame(list("lname" = c("lolli gaggen nazeem", "lolli gaggen nazeem", "lolli gaggen nazeem"),
"bday" = c("1908-08-08", "1979-12-12", "1560-06-06") ) )
data2 <- as.data.frame(list("lname" = c("lolli", "gaggen", "nazeem"),
"bday" = c("1908-08-08", "1979-12-12", "1560-06-06") ) )
blocking_variable <- c("bday")
pass <- compare.linkage(data1, data2, blockfld = blocking_variable, strcmp = T)
pass_weights <- epiWeights(pass)
getPairs(pass_weights, single.rows = TRUE)
id1 lname.1 bday.1 id2 lname.2 bday.2 Weight
1 1 lolli gaggen nazheem 1908-08-08 1 lolli 1908-08-08 0.9162463
2 2 lolli gaggen nazheem 1979-12-12 2 gaggen 1979-12-12 0.8697165
3 3 lolli gaggen nazheem 1560-06-06 3 nazheem 1560-06-06 0.6995502
Я хочу, чтобы идентификаторы 2 и 3 получали примерно те же веса, что и идентификатор № 1, однако в настоящее время они намного ниже, поскольку их фамилии не находятся в одном и том же месте в обоих наборах данных (хотя содержание совпадает). Есть ли способ изменить используемую здесь функцию сравнения строк/структуру данных, чтобы я мог учитывать различные порядки?
Дополнительные примечания:
Оба набора данных имеют миллионы строк, поэтому эффективность использования памяти здесь определенно важна!
Иногда в другом наборе данных может быть больше, чем одна фамилия, поэтому мы будем сравнивать 3 слова с 2 словами — вероятно, лучше всего начать с решения простого случая.
- Чаще всего будут различия в написании имен между двумя наборами данных.
- В настоящее время мы используем этап качества IBM для этой связи, и они используют функцию сравнения "MULT_UNCERT" (https://www.ibm.com/support/knowledgecenter/en/SSZJPZ_11.7.0/com.ibm.swg.im.iis.ds.design.help.doc/topics/r_qresfgde_MULT_UNCERT_comparison.html). Я хочу воспроизвести это в R.