반응형
Excel VBA레벤슈타인 거리 계산
Excel VBA를 사용하여 레벤슈타인 거리를 계산하는 방법은 두 문자열 간의 차이를 측정하는 과정.
이 방법은 문자열을 추가, 삭제, 또는 교체하여 한 문자열을 다른 문자열로 변환하는 데 필요한 최소한의 편집 횟수를 측정.
이는 주로 맞춤법 검사, DNA 서열 정렬, 데이터 클렌징 등 다양한 분야에서 활용됨.
Excel VBA에서 이를 구현하기 위해 다음과 같은 과정을 진행 :
- 기준 문자열 설정: Excel 시트에서 한 개의 기준 문자열을 선택합니다.
- 비교 문자열 설정: 동일한 시트 내에서 N개의 다른 텍스트(비교 대상)를 선택합니다.
- 레벤슈타인 거리 계산: 기준 문자열과 각 비교 문자열 간의 레벤슈타인 거리를 계산합니다. 이 거리는
Levenshtein
함수를 통해 얻어지는Long
타입의 값입니다. - 최소 거리 값 찾기: 계산된 거리 중에서 가장 작은 값을 가진 문자열(최소 유사성)을 찾습니다.
- 최종 비교: 기준 문자열과 최소 유사성을 가진 문자열을 최종적으로 비교하여, 어느 부분이 다른지 분석합니다.
이 과정은 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
반응형
댓글