问题描述
与 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
表示您比其他字符串差异更不关心大小写差异。