본문 바로가기
카테고리 없음

Excel VBA 레벤슈타인 거리 계산

by 퍼포먼스마케팅코더 2024. 1. 31.
반응형

Excel VBA레벤슈타인 거리 계산

Excel VBA를 사용하여 레벤슈타인 거리를 계산하는 방법은 두 문자열 간의 차이를 측정하는 과정.
이 방법은 문자열을 추가, 삭제, 또는 교체하여 한 문자열을 다른 문자열로 변환하는 데 필요한 최소한의 편집 횟수를 측정.
이는 주로 맞춤법 검사, DNA 서열 정렬, 데이터 클렌징 등 다양한 분야에서 활용됨.

Excel VBA에서 이를 구현하기 위해 다음과 같은 과정을 진행 :

  1. 기준 문자열 설정: Excel 시트에서 한 개의 기준 문자열을 선택합니다.
  2. 비교 문자열 설정: 동일한 시트 내에서 N개의 다른 텍스트(비교 대상)를 선택합니다.
  3. 레벤슈타인 거리 계산: 기준 문자열과 각 비교 문자열 간의 레벤슈타인 거리를 계산합니다. 이 거리는 Levenshtein 함수를 통해 얻어지는 Long 타입의 값입니다.
  4. 최소 거리 값 찾기: 계산된 거리 중에서 가장 작은 값을 가진 문자열(최소 유사성)을 찾습니다.
  5. 최종 비교: 기준 문자열과 최소 유사성을 가진 문자열을 최종적으로 비교하여, 어느 부분이 다른지 분석합니다.

이 과정은 VBA 코드로 구현되어, Excel 내에서 자동화된 방식으로 두 문자열 간의 차이를 효과적으로 분석할 수 있음. 이러한 기능은 텍스트 데이터를 처리하거나, 유사한 내용을 찾아내는 데 매우 유용하게 사용됨.

 

 

A1 : "과과과과과과과" 

B1 : "과과과과과궈"

 

"Levenshtein Distance between '과과과과과과과' and '과과과과과궈' is: 2" 로 디버깅 출력, 다만 문제점은 문자열을 바이트 배열로 변환으로 처리는 안됨. 이유는 한글과 같은 유니코드 문자는 2바이트를 사용하여 인코딩되므로, 바이트 배열로의 변환 과정에서 문제가 발생할 수 있음. 이에 문자열 비교 로직을 직접 유니코드 문자에 기반하여 처리하는 방식으로 변경해야함.


' 이 모듈은 두 문자열 간의 레벤슈타인 거리를 계산하는 함수를 포함합니다.
Option Explicit

' 두 문자열 간의 레벤슈타인 거리를 계산하는 함수입니다.
' @param string1 첫 번째 문자열입니다.
' @param string2 두 번째 문자열입니다.
' @return 두 문자열 간의 레벤슈타인 거리를 반환합니다.
Function Levenshtein(ByVal string1 As String, ByVal string2 As String) As Long
    Dim i As Long, j As Long
    Dim string1_length As Long
    Dim string2_length As Long
    Dim distance() As Long
    Dim min1 As Long, min2 As Long, min3 As Long

    On Error GoTo ErrorHandler

    string1_length = Len(string1)
    string2_length = Len(string2)
    ReDim distance(string1_length, string2_length)

    For i = 0 To string1_length
        distance(i, 0) = i
    Next i

    For j = 0 To string2_length
        distance(0, j) = j
    Next j

    For i = 1 To string1_length
        For j = 1 To string2_length
            If Mid$(string1, i, 1) = Mid$(string2, j, 1) Then
                distance(i, j) = distance(i - 1, j - 1)
            Else
                min1 = distance(i - 1, j) + 1
                min2 = distance(i, j - 1) + 1
                min3 = distance(i - 1, j - 1) + 1
                distance(i, j) = Application.WorksheetFunction.Min(min1, min2, min3)
            End If
        Next j
    Next i

    Levenshtein = distance(string1_length, string2_length)
    Exit Function

ErrorHandler:
    Debug.Print "Error in Levenshtein function: " & Err.Description
    Levenshtein = -1
End Function

' 레벤슈타인 거리 함수를 테스트하는 서브 프로시저
Sub TestLevenshteinDistance()
    Dim testString1 As String
    Dim testString2 As String
    Dim result As Long

    On Error GoTo ErrorHandler

    testString1 = activeSheet.Range("A1").value
    testString2 = activeSheet.Range("B1").value

    result = Levenshtein(testString1, testString2)

    Debug.Print "Levenshtein Distance between '" & testString1 & "' and '" & testString2 & "' is: " & result
    Exit Sub

ErrorHandler:
    Debug.Print "Error in TestLevenshteinDistance: " & Err.Description
End Sub

반응형

댓글