比较 Excel 中的相似文本字符串

Lau*_*yon 15 microsoft-excel microsoft-excel-2010

我目前正在尝试协调来自两个单独数据源的“名称”字段。我有许多名称不完全匹配,但足够接近以被视为匹配(下面的示例)。您对我如何提高自动匹配的数量有什么想法吗?我已经从匹配标准中消除了中间名首字母。

在此处输入图片说明

当前匹配公式:

=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")
Run Code Online (Sandbox Code Playgroud)

tec*_*tle 13

您可以考虑使用Microsoft Fuzzy Lookup Addin

从 MS 站点:

概述

适用于 Excel 的 Fuzzy Lookup Add-In 由 Microsoft Research 开发,用于对 Microsoft Excel 中的文本数据进行模糊匹配。它可用于识别单个表中的模糊重复行或模糊连接两个不同表之间的相似行。匹配对各种各样的错误都是稳健的,包括拼写错误、缩写、同义词和添加/缺失数据。例如,它可能会检测到“Mr. 安德鲁·希尔”,“希尔,安德鲁·R。” 和“Andy Hill”都指的是同一个底层实体,每次匹配都会返回一个相似度分数。虽然默认配置适用于各种文本数据,例如产品名称或客户地址,但也可以针对特定域或语言自定义匹配。


soa*_*dos 6

我会考虑使用这个列表(仅限英文部分)来帮助清除常见的起酥油。

此外,您可能需要考虑使用一个函数,该函数会准确地告诉您两个字符串的“接近”程度。以下代码来自此处,感谢smirkingman

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
Run Code Online (Sandbox Code Playgroud)

这将告诉您必须对一个字符串执行多少次插入和删除操作才能到达另一个字符串。我会尽量保持这个数字低(姓氏应该准确)。


小智 5

我有一个你可以使用的(长)公式。它不像上述那些那样磨练 - 并且仅适用于姓氏,而不是全名 - 但您可能会发现它很有用。

所以,如果你有一个标题行,并想比较A2B2,把这个在该行上(例如,任何其他细胞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)&"°"))))

这将返回:

  • EXACT – 如果完全匹配
  • 连字符- 如果它是一对双列名称,但有一个连字符,另一个是空格
  • 整个字符串- 如果一个姓氏的所有部分都是另一个姓氏的一部分(例如,如果史密斯已成为法国史密斯)

之后,它会根据两者之间比较点的数量为您提供 0° 到 6° 的度数。(即,6° 比较好)。

正如我所说的有点粗略和准备,但希望能让你大致了解正确的球场。