Разница Джаро-Винклера между пакетами

Я использую нечеткое сопоставление, чтобы очистить ввод данных о лекарствах от пользователей, и я использую расстояние Джаро-Винклера. Я тестировал, какой пакет с расстоянием Jaro-Winkler был быстрее, когда я заметил, что настройки по умолчанию не дают идентичные значения. Может ли кто-нибудь помочь мне понять, откуда разница? Пример:

library(RecordLinkage)
library(stringdist)

jarowinkler("advil", c("advi", "advill", "advil", "dvil", "sdvil"))
# [1] 0.9600000 0.9666667 1.0000000 0.9333333 0.8666667
1- stringdist("advil", c("advi", "advill", "advil", "dvil", "sdvil"), method = "jw")
# [1] 0.9333333 0.9444444 1.0000000 0.9333333 0.8666667

Я предполагаю, что это связано с весами, и я знаю, что я использую значения по умолчанию на обоих. Однако, если бы кто-то с большим опытом мог пролить свет на происходящее, я был бы очень признателен. Спасибо!

Документация:

https://cran.r-project.org/web/packages/stringdist/stringdist.pdf https://cran.r-project.org/web/packages/RecordLinkage/RecordLinkage.pdf

1 ответ

Решение

Спрятан в документации для stringdist является следующим:

Расстояние Яро-Винклера (method=jw, 0<p<=0.25) добавляет поправочный термин к Jaro-расстоянию. Определяется как d − l · p · d, где d это расстояние Jaro. Вот, l получается путем подсчета, начиная с начала входных строк, после того, сколько символов произойдет несоответствие первого символа между двумя строками с максимум четырьмя. Фактор p это штрафной коэффициент, который в работе Винклера часто выбирают 0,1.

Однако в stringdist::stringdist, p = 0 по умолчанию. Следовательно:

1 - stringdist("advil", c("advi", "advill", "advil", "dvil", "sdvil"), 
               method = "jw", p = .1)
# [1] 0.9600000 0.9666667 1.0000000 0.9333333 0.8666667

На самом деле это значение жестко закодировано в источнике RecordLinkage::jarowinkler,

Другие вопросы по тегам