gpt4 book ai didi

regex - 如果原始列表不匹配,如何知道列表中字符串的变体(例如缩写)是否与另一个列表匹配?

转载 作者:行者123 更新时间:2023-12-01 04:58:48 24 4
gpt4 key购买 nike

我目前在 R 中寻找一种方法,让我匹配/合并两个数据帧。 Helas 这两个数据帧都包含非最优数据。他们甚至可以有一些拼写错误的缩写。因此,我想为每个缩写定义一个列表,以及一个字符串是否包含这些元素之一。如果原始条目不匹配,R 应该检查缩写的任何其他选项是否匹配。举例说明:公司名称可以以“Limited”结尾,也可以以“Ltd”结尾。 “有限公司”等

例子

数据

原始“地址”文件包含:

Company name         Address 
Deloitte Ltd. New York
Coca-Cola New York
Tesla ltd California
Microsoft Limited Washington

必须与“EnterpriseNrList”合并
Company name         EnterpriseNumber
Deloitte Ltd. 221
Coca-Cola 334
Tesla ltd 725
Microsoft Limited 127

所以缩写应该在“两个方向”上起作用。这就是为什么我说,如果 R 识别任何缩写,R 应该尝试匹配所有缩写。
所有比赛都应作为返回报告。

因此,我会为每个可能的缩写创建一个“缩写”列表
Limited.
limited
Ltd.
ltd.
Ltd
ltd

问题

1)这是一个好方法,还是有更有效的方法?

2)如何根据可能的缩写列表(步骤 1,见下文)检查列表,类似于 excel 中的 containsx?

3) 我怎样才能组成一个列表,用所有其他缩写词替换与缩写不匹配的条目(步骤 2,见下文)?

解决方案的想法

第1步

由于我对这种工作还很陌生,所以我在想以下几点:使用正则表达式来过滤字符串是否包含任何缩写选项,并创建一个列表,如果没有匹配项,则该列表将包含 -1找到,如果找到匹配则 >0。没有模式匹配已经可以与“地址”列表匹配。对于其他条目,我继续执行第 2 步。

在这一步中,我真的不知道如何检查选项列表(“缩写”列表)。

第2步

接下来,我将使用步骤 1 中的匹配项创建一个列表,并将所有选项 rbind 一起。在这一步中,我真的不知道我可以创建一个结合 f.e. 的列表。可口可乐及其所有可能的缩写。
Coca-Cola Limited
Coca-Cola Ltd.
Coca-Cola Ltd
etc.

第 3 步

最后,我将再次将这个更完整的公司列表与原始“数据”列表进行匹配/合并。随着第 2 步的引入,我认为所需的计算能力可能会更容易一些,因为原始列表大约有 8000 行。

最佳答案

我会采用不同的方法,在合并之前先修复表格。

要修复缩写,我会使用正则表达式,不区分大小写,最后一个点是可选的,我从“普通单词”列表开始 = 缩写向量。

abbrevs <- list('Limited'=c('Limited','Ltd'),'Incorporated'=c('Incorporated','Inc'))

我构建了相应的正则表达式(末尾带有可选点的交替,该大小写将被 gsub 和 agrep 中的参数忽略):
regexes <- lapply(abbrevs,function(x) { paste0("(",paste0(x,collapse='|'),")[.]?") })

这使:
$Limited
[1] "(Limited|Ltd)[.]?"

$Incorporated
[1] "(Incorporated|Inc)[.]?"

现在我们必须将每个正则表达式应用于每个 df 的 company.name 列:
for (i in seq_along(regexes)) { 
Address$Company.name <- gsub(regexes[[i]], names(regexes[i]), Address$Company.name, ignore.case=TRUE)
Enterprise$Company.name <- gsub(regexes[[i]], names(regexes[i]), Enterprise$Company.name, ignore.case=TRUE)
}

这没有考虑错别字。在这里你需要使用 agrepadist来管理它。

地址示例数据集的结果:
> Address
Company.name Address
1 Deloitte Limited New York
2 Coca-Cola New York
3 Tesla Limited California
4 Microsoft Limited Washington

使用的输入数据:
Address <- structure(list(Company.name = c("Deloitte Ltd.", "Coca-Cola", 
"Tesla ltd", "Microsoft Limited"), Address = c("New York", "New York",
"California", "Washington")), .Names = c("Company.name", "Address"
), class = "data.frame", row.names = c(NA, -4L))

Enterprise <- structure(list(Company.name = c("Deloitte Ltd.", "Coca-Cola",
"Tesla ltd", "Microsoft Limited"), EnterpriseNumber = c(221L,
334L, 725L, 127L)), .Names = c("Company.name", "EnterpriseNumber"
), class = "data.frame", row.names = c(NA, -4L))

关于regex - 如果原始列表不匹配,如何知道列表中字符串的变体(例如缩写)是否与另一个列表匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34746641/

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