gpt4 book ai didi

regex - 比较字符串向量并量化差异

转载 作者:行者123 更新时间:2023-12-03 18:22:29 25 4
gpt4 key购买 nike

想法是比较两个字符串向量,例如:

df <- data.frame(a = c("New York 001", "Orlando 002", "Boston 003", "Chicago 004", "Atlanta 005"),
b = c("NEW YORK 001", "Orlando", "Boston (003)", "Chicago 005", "005 Atlanta"))

并想出一种方法来为他们提供某种程度的精确度。基本上添加具有数值的列 c。

我的思路:

我们有这个:
> df
a b
1 New York 001 NEW YORK 001
2 Orlando 002 Orlando
3 Boston 003 Boston (003)
4 Chicago 004 Chicago 005
5 Atlanta 005 005 Atlanta

第一件事是 - 去除白色,忽略大小写并删除所有特殊字符。
df$a <- gsub("[[:space:]]|[[:punct:]]", "", toupper(df$a))
df$b <- gsub("[[:space:]]|[[:punct:]]", "", toupper(df$b))

我们得到的:
> df
a b
1 NEWYORK001 NEWYORK001
2 ORLANDO002 ORLANDO
3 BOSTON003 BOSTON003
4 CHICAGO004 CHICAGO005
5 ATLANTA005 005ATLANTA

所以现在我们处于问题的核心。

第一行将是 100% 匹配。
第二行在 col a 中最多 10 个匹配字符中有 7 个匹配字符。因此 70%。
第三个现在匹配 100%。
第四有90%的匹配。
第五个是棘手的。人类大脑告诉我它们匹配,但顺序有问题。但这不是计算机的工作方式。实际上,它可以测量为 70% 匹配,因为 7 个连续字符在两个字符串中重复。

所以问题是:

如何进行字符串比较的这种定量测量?

也许有更好的方法来做到这一点,因为我从来没有在部分匹配上比较字符串集的经验。提出这种特殊的可量化措施只是我的直觉做事方式。
如果 R 已经有一个库/函数以我根本不知道的更好的方式完成所有这些,我不会感到惊讶。

最佳答案

我已经对我自己的问题有了相当简单的答案。这是莱文斯坦距离。或 adist()在 R。

长话短说:

df$c <- 1 - diag(adist(df$a, df$b, fixed = F)) / apply(cbind(nchar(df$a), nchar(df$b)), 1, max)

这就是诀窍。
> df
a b c
1 NEWYORK001 NEWYORK001 1.0
2 ORLANDO002 ORLANDO 0.7
3 BOSTON003 BOSTON003 1.0
4 CHICAGO004 CHICAGO005 0.9
5 ATLANTA005 005ATLANTA 0.7

更新:

在我的一个数据集上运行该函数会返回可爱的结果(这让我内心的 Nerd 咯咯笑):
Error: cannot allocate vector of size 1650.7 Gb

所以,我想这是另一个 apply()循环 adist() ,取整个矩阵的对角线是......好吧,相当低效。
df$c <- 1 - apply(cbind(df$a, df$b),1, function(x) adist(x[1], x[2], fixed = F)) / apply(cbind(nchar(df$a), nchar(df$b)), 1, max)

这种修改产生了非常令人满意的结果。

关于regex - 比较字符串向量并量化差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31068491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com