반응형
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
반응형
댓글