Fuzzyjoin / stringdist_join 权重用于大写案例不匹配stringdist

问题描述

与 R 合作,我正在寻找在 if (message.channel.id !== '794303555975643136') return; 中加权大小写(即大写与小写)的方法

这是一个可重现的例子:

string_dist_left_join()

以上是在几个小标题上重现由模糊连接驱动的 stringsidt_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","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))

我想要的是某种方式来加权大写,例如,将贝德福德与 BED福特进行比较:我希望这比贝德福德与贝德福德更糟糕,但比贝德福德到贝德s福特。选项 # 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 bedford 视为与 bedford 的完美匹配。

我喜欢fuzzyjoin 包,我刚刚发现了自定义权重,您可以将这些权重传递给stringdist 以针对每个删除、插入、替换和易位。这太棒了;可玩的玩具,可调整的参数。

我还希望能够调整大小写(大写?)匹配。我可以在 stringdist_left_join 中选择 ignore_case = TRUE,(实际上,权重大小写为 0 或 1),但作为我这个讨厌的人,我想在 0 和 1 之间调整权重。

有人知道我遗漏的地方是否有选项吗?

或者答案是:难吗?我想可能有很长的路要走,涉及比较运行 ignore_case = TRUE 之前和之后的距离或计算比较 tolower()ignore_case = TRUE 的加权距离,但是有人知道更优雅的方法吗?或者我可以用来做这件事的包?

谢谢

解决方法

您可以运行两次,一次使用 ignore_case = TRUE,一次使用 FALSE,然后找到两个距离的合适线性组合。

类似于 lambda * (distance_FALSE - distance_TRUE) + distance_TRUE 的内容,其中 lambda 表示您比其他字符串差异更不关心大小写差异。