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

Excel VBA를 이용한 문자열 유사도 계산

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

Excel VBA를 이용한 문자열 유사도 계산

이번 포스팅에서는 Excel VBA를 활용하여 두 문자열 간의 유사도를 계산하는 방법을 소개합니다. 이 예제는 자연어 처리나 텍스트 분석에서 유용하게 사용될 수 있습니다.

 

1. 최대값 함수:

먼저, 두 정수 사이의 최대값을 결정하는 간단한 함수 Max를 구현합니다. 이 함수는 두 문자열의 길이를 비교하는 데 사용됩니다.

Function Max(a As Long, b As Long) As Long
    ' 주어진 두 정수 a와 b 중 더 큰 값을 반환합니다.
    If a > b Then
        Max = a
    Else
        Max = b
    End If
End Function

 

2. 문자열 유사도 계산:

다음으로, 두 문자열의 유사도를 계산하는 CalculateSimilarity 함수를 정의합니다. 이 함수는 가장 긴 공통 부분 문자열(Longest Common Subsequence, LCS)의 길이를 기반으로 유사도를 측정합니다.

Function CalculateSimilarity(answer As String, input2 As String) As Double
    ' 두 문자열 answer와 input2의 유사도를 계산하여 반환합니다.
    Dim i As Long, j As Long
    Dim m As Long, n As Long
    Dim LCS() As Long

    m = Len(answer)
    n = Len(input2)
    ReDim LCS(0 To m, 0 To n)

    ' LCS 길이 계산
    For i = 1 To m
        For j = 1 To n
            If Mid(answer, i, 1) = Mid(input2, j, 1) Then
                LCS(i, j) = LCS(i - 1, j - 1) + 1
            Else
                LCS(i, j) = Max(LCS(i - 1, j), LCS(i, j - 1))
            End If
        Next j
    Next i

    ' 유사도 계산
    If Max(m, n) > 0 Then
        CalculateSimilarity = CDbl(LCS(m, n)) / Max(m, n)
    Else
        CalculateSimilarity = 0
    End If
End Function

 

3. 테스트 서브 프로시저:

마지막으로, TestSimilarity 서브 프로시저를 통해 문자열 유사도 함수를 테스트합니다. 이 예제에서는 두 개의 샘플 문자열을 사용하여 유사도를 계산하고 결과를 출력합니다.

Sub TestSimilarity()
    ' 문자열 유사도 테스트를 위한 서브 프로시저
    Dim answerString As String
    Dim inputString As String
    Dim similarity As Double

    answerString = "그건 아닌데 어떤 이상한 놈 때문에 기분 다 잡쳤어"
    inputString = "아닌데 어떤 이상한 놈 때문에 기분 다 잡쳤어"

    similarity = CalculateSimilarity(answerString, inputString)

    Debug.Print "Similarity: " & similarity
End Sub

 

결론:

Excel VBA를 사용하여 문자열 간의 유사도를 계산하는 방법은 다양한 응용 프로그램에 유용하게 활용될 수 있습니다. 이 코드를 통해 자연어 처리의 기초를 다지거나 텍스트 데이터를 분석하는 데 도움이 될 수 있습니다. 아래는 전체 VBA 코드 내용입니다.


Option Explicit

Function Max(a As Long, b As Long) As Long
    ' 주어진 두 정수 a와 b 중 더 큰 값을 반환합니다.
    If a > b Then
        Max = a
    Else
        Max = b
    End If
End Function

Function CalculateSimilarity(answer As String, input2 As String) As Double
    ' 두 문자열 answer와 input2의 유사도를 계산하여 반환합니다.
    Dim i As Long, j As Long
    Dim m As Long, n As Long
    Dim LCS() As Long

    m = Len(answer)
    n = Len(input2)
    ReDim LCS(0 To m, 0 To n)

    ' LCS(Longest Common Subsequence) 길이 계산
    For i = 1 To m
        For j = 1 To n
            If Mid(answer, i, 1) = Mid(input2, j, 1) Then
                LCS(i, j) = LCS(i - 1, j - 1) + 1
            Else
                LCS(i, j) = Max(LCS(i - 1, j), LCS(i, j - 1))
            End If
        Next j
    Next i

    ' 유사도 계산 (최대 길이 기반)
    If Max(m, n) > 0 Then
        CalculateSimilarity = CDbl(LCS(m, n)) / Max(m, n)
    Else
        CalculateSimilarity = 0
    End If
End Function

Sub TestSimilarity()
    ' 문자열 유사도 테스트를 위한 서브 프로시저
    Dim answerString As String
    Dim inputString As String
    Dim similarity As Double

    answerString = "그건 아닌데 어떤 이상한 놈 때문에 기분 다 잡쳤어"
    inputString = "아닌데 어떤 이상한 놈 때문에 기분 다 잡쳤어"

    similarity = CalculateSimilarity(answerString, inputString)

    Debug.Print "Similarity: " & similarity
End Sub
반응형

댓글