我目前正在尝试协调来自两个不同数据源的“姓名”字段。我有许多姓名不完全匹配,但足够接近,可以视为匹配(以下示例)。您有什么想法可以提高自动匹配的数量吗?我已经从匹配标准中消除了中间名首字母。
当前匹配公式:
=IFERROR(IF(LEFT(SYSTEM A,IF(ISERROR(SEARCH(" ",SYSTEM A)),LEN(SYSTEM A),SEARCH(" ",SYSTEM A)-1))=LEFT(SYSTEM B,IF(ISERROR(SEARCH(" ",SYSTEM B)),LEN(SYSTEM B),SEARCH(" ",SYSTEM B)-1)),"",IF(LEFT(SYSTEM A,FIND(",",SYSTEM A))=LEFT(SYSTEM B,FIND(",",SYSTEM B)),"Last Name Match","RESEARCH")),"RESEARCH")
答案1
您可以考虑使用微软模糊查找插件。
来自 MS 网站:
概述
Excel 模糊查找插件由 Microsoft Research 开发,可对 Microsoft Excel 中的文本数据进行模糊匹配。它可用于识别单个表中的模糊重复行或模糊连接两个不同表之间的相似行。匹配对各种错误都很可靠,包括拼写错误、缩写、同义词和添加/丢失的数据。例如,它可能检测到“Mr. Andrew Hill”、“Hill, Andrew R.”和“Andy Hill”这几行都指向同一个底层实体,并返回每个匹配的相似度分数。虽然默认配置适用于各种文本数据,例如产品名称或客户地址,但匹配也可以针对特定域或语言进行定制。
答案2
我会考虑使用这列表(仅限英文部分)以帮助剔除常见的缩写。
此外,你可能还想考虑使用一个函数,它可以准确地告诉你两个字符串有多“接近”。以下代码来自这里并感谢傻笑的人。
Option Explicit
Public Function Levenshtein(s1 As String, s2 As String)
Dim i As Integer
Dim j As Integer
Dim l1 As Integer
Dim l2 As Integer
Dim d() As Integer
Dim min1 As Integer
Dim min2 As Integer
l1 = Len(s1)
l2 = Len(s2)
ReDim d(l1, l2)
For i = 0 To l1
d(i, 0) = i
Next
For j = 0 To l2
d(0, j) = j
Next
For i = 1 To l1
For j = 1 To l2
If Mid(s1, i, 1) = Mid(s2, j, 1) Then
d(i, j) = d(i - 1, j - 1)
Else
min1 = d(i - 1, j) + 1
min2 = d(i, j - 1) + 1
If min2 < min1 Then
min1 = min2
End If
min2 = d(i - 1, j - 1) + 1
If min2 < min1 Then
min1 = min2
End If
d(i, j) = min1
End If
Next
Next
Levenshtein = d(l1, l2)
End Function
这会告诉您必须对一个字符串进行多少次插入和删除才能到达另一个字符串。我会尽量保持这个数字较低(姓氏应该准确)。
答案3
我有一个(长)公式供您使用。它不如上面的公式那么精确——并且只适用于姓氏,而不适用于全名——但您可能会发现它很有用。
因此,如果您有一个标题行并想要A2
与之进行比较B2
,请将其放在该行的任何其他单元格中(例如C2
),然后复制到末尾。
=IF(A2=B2,"EXACT",IF(SUBSTITUTE(A2,"-"," ")=SUBSTITUTE(B2,"-"," "),"连字符",IF(LEN(A2)>LEN(B2),IF(LEN(A2)>LEN(SUBSTITUTE(A2,B2,"")),"整个字符串",IF(MID(A2,1,1)=MID(B2,1,1),1,0)+IF(MID(A2,2,1)=MID(B2,2,1),1,0)+IF(MID(A2,3,1)=MID(B2,3,1),1,0)+IF(MID(A2,LEN(A2),1)=MID(B2,LEN(B2),1),1,0)+IF(MID(A2,LEN(A2)-1,1)=MID(B2,LEN(B2)-1,1),1,0)+IF(MID(A2,LEN(A2)-2,1)=MID(B2,LEN(B2)-2,1),1,0)&"°"),IF(LEN(B2)>LEN(SUBSTITUTE(B2,A2,"")),"整个字符串",IF(MID(A2,1,1)=MID(B2,1,1),1,0)+IF(MID(A2,2,1)=MID(B2,2,1),1,0)+IF(MID(A2,3,1)=MID(B2,3,1),1,0)+IF(MID(A2,LEN(A2),1)=MID(B2,LEN(B2),1),1,0)+IF(MID(A2,LEN(A2)-1,1)=MID(B2,LEN(B2)-1,1),1,0)+IF(MID(A2,LEN(A2)-2,1)=MID(B2,LEN(B2)-2,1),1,0)&"°"))))
这将返回:
- 精确的– 如果完全匹配
- 连字符– 如果是一对双引号名称,但其中一个有连字符,另一个有空格
- 整个字符串– 如果一个姓氏的全部内容都是另一个姓氏的一部分(例如,如果 Smith 变成了 French-Smith)
之后,它会根据两者之间的比较点数量,给出从 0° 到 6° 的度数。(即,6° 比较好)。
正如我所说,有点粗糙,但希望可以让你大致了解正确的范围。
答案4
您可以使用相似度函数 (pwrSIMILARITY) 来比较字符串并获取两者的匹配百分比。您可以将其设置为区分大小写或不区分大小写。您需要确定匹配的百分比是否“足够接近”以满足您的需求。
参考页面为http://officepowerups.com/help-support/excel-function-reference/excel-text-analyzer/pwrsimilarity/。
但它对于比较 A 列和 B 列中的文本非常有效。