Google 工作表 - 匹配公司名称
Google Sheets - Matching Company Names
我有两个数据库,都有公司名称,但格式不同。我已经能够使用 vlookup
进行精确匹配。我想提取不同写法的公司,但它们实际上是同一家公司并提取数据。
下面是我手头的一小部分数据库
Database 1
Column A
1-800-Flowers.com Inc
Abbott Laboratories (Abbott)
21st Century Fox America Inc (formerly News America Inc)
Column B
1234(data I need to grab)
4567
8910
Database 2
Column C
1-800 CONTACTS INC
1-800-FLOWERS.COM
ABBOTT LABORATORIES
TWENTY-FIRST CENTURY FOX INC
Column D
ABCD(DataI can ignore as the company doesn't exist in database 1)
EFGH (Data I need as it matches from Database 1)
IJK
LMNO
从上面的数据库可以看出,数据库 1 与数据库 2 的匹配词类似
21 世纪福克斯美国公司 vs 21 世纪福克斯公司
在我的数据库 1 中,我有大约 4000 多个值,而在数据库 2 中,我有 10,000 个值。是否有代码可以比较两个数据库之间的相似词并从 B 列和 D 列中提取我需要的数据?
我试过查询,但它没有按照我想要的方式工作。 This is my shareable link.
目前,我所做的是使用 REGEXTRACT 提取相似的单词,以在 21st Century Fox 和 Twenty-First Century Fox 中的 Century Fox 等字符串之间找到匹配项,并尝试使用查询来匹配两个数据集.但是,当我这样写时,我的查询结果出现了 NA
=query(E:E,"Select E where E contains '"&L2&"'",0 )
L2 是包含字符串 Century Fox 的单元格
L2:
=ARRAYFORMULA(INDEX($E:$E,MATCH(MAX(ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E:$E," "),transpose(SPLIT(A2," ")),1,0))),ROW(A:A)^0),ROW(E68),7)),ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E:$E," "),transpose(SPLIT(A2," ")),1,0))),ROW(A:A)^0),ROW(E68),7),0)))
M2:
=ARRAYFORMULA(INDEX($E:$F,MATCH(MAX(ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E:$E," "),transpose(SPLIT(A2," ")),1,0))),ROW(A:A)^0),ROW(E68),7)),ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E:$E," "),transpose(SPLIT(A2," ")),1,0))),ROW(A:A)^0),ROW(E68),7),0),2))
N2:
=ARRAYFORMULA(TEXT(MAX(ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E:$E," "),transpose(SPLIT(A2," ")),1,0))),ROW(A:A)^0),ROW(E68),7))/LEN(A2),"0%"))
向下拖动填充。
备注:
公式是资源密集型的。 Apps 脚本可能是更好的选择。
对于给定的样本,此公式具有合理的精确度。
7 是在所有 E 列(或数据库 2 的 C 列)中找到的每个单元格的最大单词数。这是在上面的公式中硬编码的。这应该使用辅助列找到。 Z2:COUNTA (SPLIT(A2," ")) 向下拖动填充。和 AA2:=MAX(Z2:Z)
N 列给出了对 VLOOKUP 生成结果的置信度。最好手动重新检查任何低于 45% 的值。
工作原理:所有 E 列 (db2) 按单词拆分,每个单词在 A 列 (db1) 的每个条目中查看。如果一组单词与 E 列中的多个条目匹配,则取匹配单词长度的最大值作为可能的匹配项。字母方法而不是单词方法可能会提供更好的精度,但在给定的示例中似乎没有必要。
我有两个数据库,都有公司名称,但格式不同。我已经能够使用 vlookup
进行精确匹配。我想提取不同写法的公司,但它们实际上是同一家公司并提取数据。
下面是我手头的一小部分数据库
Database 1
Column A
1-800-Flowers.com Inc
Abbott Laboratories (Abbott)
21st Century Fox America Inc (formerly News America Inc)
Column B
1234(data I need to grab)
4567
8910
Database 2
Column C
1-800 CONTACTS INC
1-800-FLOWERS.COM
ABBOTT LABORATORIES
TWENTY-FIRST CENTURY FOX INC
Column D
ABCD(DataI can ignore as the company doesn't exist in database 1)
EFGH (Data I need as it matches from Database 1)
IJK
LMNO
从上面的数据库可以看出,数据库 1 与数据库 2 的匹配词类似 21 世纪福克斯美国公司 vs 21 世纪福克斯公司
在我的数据库 1 中,我有大约 4000 多个值,而在数据库 2 中,我有 10,000 个值。是否有代码可以比较两个数据库之间的相似词并从 B 列和 D 列中提取我需要的数据?
我试过查询,但它没有按照我想要的方式工作。 This is my shareable link.
目前,我所做的是使用 REGEXTRACT 提取相似的单词,以在 21st Century Fox 和 Twenty-First Century Fox 中的 Century Fox 等字符串之间找到匹配项,并尝试使用查询来匹配两个数据集.但是,当我这样写时,我的查询结果出现了 NA
=query(E:E,"Select E where E contains '"&L2&"'",0 )
L2 是包含字符串 Century Fox 的单元格
L2:
=ARRAYFORMULA(INDEX($E:$E,MATCH(MAX(ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E:$E," "),transpose(SPLIT(A2," ")),1,0))),ROW(A:A)^0),ROW(E68),7)),ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E:$E," "),transpose(SPLIT(A2," ")),1,0))),ROW(A:A)^0),ROW(E68),7),0)))
M2:
=ARRAYFORMULA(INDEX($E:$F,MATCH(MAX(ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E:$E," "),transpose(SPLIT(A2," ")),1,0))),ROW(A:A)^0),ROW(E68),7)),ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E:$E," "),transpose(SPLIT(A2," ")),1,0))),ROW(A:A)^0),ROW(E68),7),0),2))
N2:
=ARRAYFORMULA(TEXT(MAX(ARRAY_CONSTRAIN(MMULT(LEN(IFERROR(VLOOKUP(SPLIT($E:$E," "),transpose(SPLIT(A2," ")),1,0))),ROW(A:A)^0),ROW(E68),7))/LEN(A2),"0%"))
向下拖动填充。
备注:
公式是资源密集型的。 Apps 脚本可能是更好的选择。
对于给定的样本,此公式具有合理的精确度。
7 是在所有 E 列(或数据库 2 的 C 列)中找到的每个单元格的最大单词数。这是在上面的公式中硬编码的。这应该使用辅助列找到。 Z2:COUNTA (SPLIT(A2," ")) 向下拖动填充。和 AA2:=MAX(Z2:Z)
N 列给出了对 VLOOKUP 生成结果的置信度。最好手动重新检查任何低于 45% 的值。
工作原理:所有 E 列 (db2) 按单词拆分,每个单词在 A 列 (db1) 的每个条目中查看。如果一组单词与 E 列中的多个条目匹配,则取匹配单词长度的最大值作为可能的匹配项。字母方法而不是单词方法可能会提供更好的精度,但在给定的示例中似乎没有必要。