Вес Fuzzyjoin/stringdist_join для несоответствия заглавных букв (регистр) (stringdist)

Работая с R, я ищу способы взвешивания регистра (т. е. верхний или нижний регистр) в string_dist_left_join()

Вот воспроизводимый пример:

library(tidyverse)
library(fuzzyjoin)

tibble1 <- tibble(words = c("Bedford", "Maidenhead", "New Forest", "Tier 3", "Citizenship", "Crown"))

tibble2 <- tibble(words = c("bedfords", "bedsford", "BEDFord", "Maidenshead", "Maidenhed", "News forest", "Tier 3", "Citisenships", "crowned", "crows"))

osa <- stringdist_left_join(tibble1, tibble2, distance_col = "distance", max_dist = 5, method = "osa", weight = c(d = 0.1, i = 0.1, s = 1, t = 1))

Выше приведен код для воспроизведения строки sidt_left_join с питанием от нечеткого соединения на нескольких табличках. Вывод выглядит следующим образом:

# A tibble: 55 x 3
   words.x words.y      distance
   <chr>   <chr>           <dbl>
 1 Bedford bedfords        0.3  
 2 Bedford bedsford        0.3  
 3 Bedford BEDFord         0.6  
 4 Bedford Maidenshead     1.4  
 5 Bedford Maidenhed       1.2  
 6 Bedford News forest     1.00 
 7 Bedford Tier 3          0.900
 8 Bedford Citisenships    1.7  
 9 Bedford crowned         1.00 
10 Bedford crows           1.00 
# … with 45 more rows

Я бы хотел, чтобы какой-то способ взвесить капитализацию, например, сравнить Бедфорд с БЭДфордом: я бы хотел, чтобы это было худшее совпадение, чем Бедфорд с Бедфордом, но лучше, чем Бедфорд с Бедом. сфорд. Вариант ignore_case = TRUE рассматривает БЭДфорд как идеальную пару с Бэдфордом.

Мне нравится пакет fuzzyjoin, и я только что обнаружил пользовательские веса, которые вы можете передать в stringdist для каждого удаления, вставки, замены и перемещения. Это фантастика; игрушки для игры, параметры для настройки.

Что я также хотел бы сделать, так это настроить соответствие регистра (заглавных букв?). У меня есть возможность ignore_case = TRUE в stringdist_left_join (фактически весовой регистр равен 0 или 1), но, будучи надоедливой собакой, я хотел бы поиграть с весами от 0 до 1.

Кто-нибудь знает, есть ли где-то вариант, который мне не хватает?

Или ответ: сделать это трудным путем? Я предполагаю, что может быть долгий путь, включающий сравнение расстояний до и после запуска tolower() или вычисление взвешенного расстояния, сравнивающего ignore_case = TRUE с ignore_case = FALSE, но кто-нибудь знает более элегантный метод или пакет, который я могу использовать для этого?

Спасибо


person gladys_c_hugh    schedule 31.12.2020    source источник
comment
Вы пытались изменить method т.е. method = "soundex"   -  person akrun    schedule 01.01.2021
comment
@arkrun, да, я пробовал все доступные методы, без весов на всякий случай. Soundex идеально сочетается с Bedford и BEDford (расстояние 0) с Beford.   -  person gladys_c_hugh    schedule 01.01.2021


Ответы (1)


Вы можете запустить его дважды, один раз с ignore_case = TRUE и один раз с FALSE, а затем найти подходящую линейную комбинацию двух расстояний.

Что-то вроде lambda * (distance_FALSE - distance_TRUE) + distance_TRUE, где lambda означает, насколько меньше вы заботитесь о различиях в написании заглавных букв, чем о других различиях строк.

person pseudospin    schedule 01.01.2021
comment
спасибо, да, я думаю, что вместо готовой функции это будет хорошей тактикой. - person gladys_c_hugh; 01.01.2021