Работая с 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
, но кто-нибудь знает более элегантный метод или пакет, который я могу использовать для этого?
Спасибо
method
т.е.method = "soundex"
- person akrun   schedule 01.01.2021