반응형
S Y N O P S I S #유사한 단어의 일치도(%) 산출하기
- 유사한 단어의 일치도(%)를 산출한다. 구체적으로 두 단어 사이의 최대 연속 부분의 일치도를 산출하는 매크로이다.
- 예컨대 "기계자동차공학부"와 "자동차공학과"를 비교했을 때,
- (전자를 기준으로) 전체 8개 글자 중에서 5개 글자가 일치하므로 5/8 = 62.5%가 일치하는 셈이다.
- 연속된 글자일 경우에만 산출한다. 불연속 글자의 경우는 일부 코드의 수정이 필요하다.
- 예시는 전문대학 공학계열 학과 리스트 중에서 찾는 단어(GoalText)의 일치도를 산출한다.
- 예시 영상에서 100% 일치인데 40%로 나오는 건 괄호와 숫자가 있기 때문.
VBA Code
Option Explicit
Sub max_common_text()
Dim lastRow As Long
Dim i As Long
Dim j As Long
Dim k As Long
Dim varString() As String
Dim myString As String
Dim dp(500, 500) As Long
Dim myMax As Long
With ActiveSheet.UsedRange
lastRow = .Row + .Rows.Count - 1
End With
myString = Cells(2, 3) '시트 2행 3열에 있는 단어를 변수로 활용, 필요시 변경
ReDim Preserve varString(1 To lastRow - 1) '전체 크기-1만큼 배열 초기화
For i = 1 To lastRow - 1
varString(i) = Cells(i + 1, "A") 'A열의 문자열을 배열변수에 할당
Next i
For k = 1 To UBound(varString)
dp(1, 0) = 0
dp(0, 1) = 0
myMax = 0 '최댓값을 0으로 초기화
For i = 1 To Len(myString)
For j = 1 To Len(myString) - i + 1
dp(i, j) = WorksheetFunction.Max(Len(varString(k)) - Len(Replace(varString(k), Mid(myString, i, j), "", , j)), dp(i, j - 1))
If myMax <= dp(i, j) Then 'dp가 큰 경우 최대값 갱신
myMax = dp(i, j)
End If
Next j
Next i
ActiveSheet.Cells(k + 1, "B") = Format(myMax / Len(varString(k)), "0.0%")
Next k
'dp(i, j) = i번째 글자부터 j개의 연속된 글자가 겹치는 최대 부분 개수
'dp(i, j) = max(i번째 글자부터 j개의 연속된 글자가 겹치는 개수, i번째 글자에서 j-1번째 글자까지 겹치는 개수)
End Sub
매크로 실행 동영상
Copyright (2018) Ruahneuma. All Rights Reserved.
반응형
'VBA Macro > VBA Excel' 카테고리의 다른 글
[엑셀] 병합된 셀을 풀고 같은 내용으로 채우기 (1) | 2018.01.24 |
---|---|
[엑셀] VBA로 스택 구현 (0) | 2018.01.14 |
[엑셀] 글자 수 세기 (사용자 정의 함수) (0) | 2018.01.11 |
[엑셀] DOM 방식의 웹페이지 정보 가져오기 (사이트 추천) (0) | 2017.12.22 |
[엑셀] 같은 내용인 경우에 셀 병합하는 매크로 (0) | 2017.12.19 |