Excel에서 유사한 텍스트 문자열 비교


14

현재 두 개의 개별 데이터 소스에서 "이름"필드를 조정하려고합니다. 정확히 일치하지는 않지만 일치하는 것으로 간주 될 수있는 이름이 많이 있습니다 (아래 예). 자동 검색 횟수를 개선 할 수있는 방법에 대한 아이디어가 있습니까? 경기 기준에서 중간 이니셜을 이미 제거하고 있습니다.

여기에 이미지 설명을 입력하십시오

현재 경기 공식 :

=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")

답변:


12

Microsoft Fuzzy Lookup Addin 사용을 고려할 수 있습니다 .

MS 사이트에서 :

개요

Excel 용 퍼지 조회 추가 기능은 Microsoft Research에서 개발했으며 Microsoft Excel에서 텍스트 데이터의 퍼지 일치를 수행합니다. 단일 테이블 내에서 퍼지 중복 행을 식별하거나 두 개의 다른 테이블간에 유사한 행을 퍼지 결합하는 데 사용할 수 있습니다. 이 맞춤법은 철자 오류, 약어, 동의어 및 추가 / 결측 데이터를 포함한 다양한 오류에 강력합니다. 예를 들어 행이“Mr. 앤드류 힐”,“힐 앤드류 R.” "앤디 힐"은 모두 동일한 기본 엔티티를 나타내며 각 경기와 함께 유사성 점수를 반환합니다. 기본 구성은 제품 이름 또는 고객 주소와 같은 다양한 텍스트 데이터에 적합하지만 특정 도메인 또는 언어에 맞게 일치 항목을 사용자 지정할 수도 있습니다.


.net 프레임 워크로 인해 필요한 관리자 권한으로 인해 사무실에 애드온을 설치할 수 없습니다. :-(
jumpjack

이것은 훌륭하지만 10 개 이상의 행을 생성 할 수는 없습니다. 성공하지 않고 구성을 클릭했습니다. 팁이 있습니까?
bjornte

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

이 작업은 한 문자열에서 다른 문자열을 가져 오기 위해 얼마나 많은 삽입 및 삭제 작업을 수행해야하는지 알려줍니다. 이 숫자를 낮게 유지하려고합니다 (성과 이름은 정확해야 함).


5

사용할 수있는 (긴) 수식이 있습니다. 그것은 위의 것들만큼 잘 연마되지 않았으며 이름보다는 성에서만 작동하지만 유용 할 수 있습니다.

당신은 헤더 행을 가지고 비교 싶다면 A2함께 B2, 해당 행 (예를 들어, 다른 어떤 셀이 배치 C2)하고 끝으로 복사합니다.

= IF (A2 = B2, "EXACT", IF (SUBSTITUTE (A2, "-", "") = SUBSTITUTE (B2, "-", ""), "Hyphen", 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, "")), "Whole String", 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 °가 더 좋습니다).

내가 조금 거칠고 준비했지만, 희망적으로 당신을 대략 올바른 구장으로 데려다 줄 것입니다.


이것은 모든 수준에서 너무 저평가되어 있습니다. 아주 잘 했어요! 우연히 이것에 대한 업데이트가 있습니까?
DeerSpotter

2

비슷한 것을 찾고있었습니다. 아래 코드를 찾았습니다. 이것이이 질문에 오는 다음 사용자에게 도움이되기를 바랍니다.

Abracadabra / Abrakadabra는 91 %, Hollywood Street / Hollyhood Str은 75 %, Florence / France는 62 %, Disneyland는 0을 반환

나는 그것이 당신이 원하는 것에 충분히 가깝다고 말하고 싶습니다 :)

Public Function Similarity(ByVal String1 As String, _
    ByVal String2 As String, _
    Optional ByRef RetMatch As String, _
    Optional min_match = 1) As Single
Dim b1() As Byte, b2() As Byte
Dim lngLen1 As Long, lngLen2 As Long
Dim lngResult As Long

If UCase(String1) = UCase(String2) Then
    Similarity = 1
Else:
    lngLen1 = Len(String1)
    lngLen2 = Len(String2)
    If (lngLen1 = 0) Or (lngLen2 = 0) Then
        Similarity = 0
    Else:
        b1() = StrConv(UCase(String1), vbFromUnicode)
        b2() = StrConv(UCase(String2), vbFromUnicode)
        lngResult = Similarity_sub(0, lngLen1 - 1, _
        0, lngLen2 - 1, _
        b1, b2, _
        String1, _
        RetMatch, _
        min_match)
        Erase b1
        Erase b2
        If lngLen1 >= lngLen2 Then
            Similarity = lngResult / lngLen1
        Else
            Similarity = lngResult / lngLen2
        End If
    End If
End If

End Function

Private Function Similarity_sub(ByVal start1 As Long, ByVal end1 As Long, _
                                ByVal start2 As Long, ByVal end2 As Long, _
                                ByRef b1() As Byte, ByRef b2() As Byte, _
                                ByVal FirstString As String, _
                                ByRef RetMatch As String, _
                                ByVal min_match As Long, _
                                Optional recur_level As Integer = 0) As Long
'* CALLED BY: Similarity *(RECURSIVE)

Dim lngCurr1 As Long, lngCurr2 As Long
Dim lngMatchAt1 As Long, lngMatchAt2 As Long
Dim I As Long
Dim lngLongestMatch As Long, lngLocalLongestMatch As Long
Dim strRetMatch1 As String, strRetMatch2 As String

If (start1 > end1) Or (start1 < 0) Or (end1 - start1 + 1 < min_match) _
Or (start2 > end2) Or (start2 < 0) Or (end2 - start2 + 1 < min_match) Then
    Exit Function '(exit if start/end is out of string, or length is too short)
End If

For lngCurr1 = start1 To end1
    For lngCurr2 = start2 To end2
        I = 0
        Do Until b1(lngCurr1 + I) <> b2(lngCurr2 + I)
            I = I + 1
            If I > lngLongestMatch Then
                lngMatchAt1 = lngCurr1
                lngMatchAt2 = lngCurr2
                lngLongestMatch = I
            End If
            If (lngCurr1 + I) > end1 Or (lngCurr2 + I) > end2 Then Exit Do
        Loop
    Next lngCurr2
Next lngCurr1

If lngLongestMatch < min_match Then Exit Function

lngLocalLongestMatch = lngLongestMatch
RetMatch = ""

lngLongestMatch = lngLongestMatch _
+ Similarity_sub(start1, lngMatchAt1 - 1, _
start2, lngMatchAt2 - 1, _
b1, b2, _
FirstString, _
strRetMatch1, _
min_match, _
recur_level + 1)
If strRetMatch1 <> "" Then
    RetMatch = RetMatch & strRetMatch1 & "*"
Else
    RetMatch = RetMatch & IIf(recur_level = 0 _
    And lngLocalLongestMatch > 0 _
    And (lngMatchAt1 > 1 Or lngMatchAt2 > 1) _
    , "*", "")
End If


RetMatch = RetMatch & Mid$(FirstString, lngMatchAt1 + 1, lngLocalLongestMatch)


lngLongestMatch = lngLongestMatch _
+ Similarity_sub(lngMatchAt1 + lngLocalLongestMatch, end1, _
lngMatchAt2 + lngLocalLongestMatch, end2, _
b1, b2, _
FirstString, _
strRetMatch2, _
min_match, _
recur_level + 1)

If strRetMatch2 <> "" Then
    RetMatch = RetMatch & "*" & strRetMatch2
Else
    RetMatch = RetMatch & IIf(recur_level = 0 _
    And lngLocalLongestMatch > 0 _
    And ((lngMatchAt1 + lngLocalLongestMatch < end1) _
    Or (lngMatchAt2 + lngLocalLongestMatch < end2)) _
    , "*", "")
End If

Similarity_sub = lngLongestMatch

End Function

크레딧을주지
않고이


1

내 솔루션에서 매우 다른 문자열을 식별 할 수는 없지만 부분 일치 (하위 문자열 일치)에 유용합니다. 예를 들어 "this is a string"이고 "string"은 "matching"으로 나타납니다.

문자열 앞뒤에 "*"를 추가하여 테이블을 찾으십시오.

일반적인 공식 :

  • vlookup (A1, B1 : B10,1,0)
  • cerca.vert (A1; B1 : B10; 1; 0)

된다

  • vlookup ( "*"& A1 & "*", B1 : B10; 1,0)
  • cerca.vert ( "*"& A1 & "*"; B1 : B10; 1; 0)

"&"는 concatenate () 의 "짧은 버전"입니다.


1

이 코드는 열 a와 열 b를 스캔합니다. 두 열에서 유사성을 발견하면 노란색으로 표시됩니다. 컬러 필터를 사용하여 최종 값을 얻을 수 있습니다. 해당 부분을 코드에 추가하지 않았습니다.

Sub item_difference()

Range("A1").Select

last_row_all = Range("A65536").End(xlUp).Row
last_row_new = Range("B65536").End(xlUp).Row

Range("A1:B" & last_row_new).Select
With Selection.Interior
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
    .Color = 65535
    .TintAndShade = 0
    .PatternTintAndShade = 0
End With

For i = 1 To last_row_new
For j = 1 To last_row_all

If Range("A" & i).Value = Range("A" & j).Value Then

Range("A" & i & ":B" & i).Select
With Selection.Interior
    .Pattern = xlSolid
    .PatternColorIndex = xlAutomatic
    .ThemeColor = xlThemeColorDark1
    .TintAndShade = 0
  .PatternTintAndShade = 0
End With

End If
Next j
Next i
End Sub
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.