델타(Delta) 계산이란 무엇인가?
프로그래밍에서 델타(delta)는 두 데이터 사이의 차이점을 의미합니다. 파일 변경 사항 비교, 버전 관리, 문서 diff 확인 등 다양한 작업에서 필수적인 개념입니다. 파이썬에서는 표준 라이브러리인 difflib 모듈을 사용하면 별도의 외부 패키지 설치 없이 손쉽게 델타를 계산할 수 있습니다.
difflib 모듈은 시퀀스를 비교하기 위한 다양한 클래스와 함수를 제공합니다. 일반 문자열이나 리스트는 물론, 파일 전체 또는 HTML 문서까지 비교할 수 있어 활용 범위가 넓습니다.
모듈을 사용하려면 먼저 파이썬 코드에서 임포트해야 합니다.
import difflib
difflib.SequenceMatcher 클래스
SequenceMatcher는 자료형에 상관없이 두 개의 시퀀스를 비교하는 클래스입니다. 유사도 측정, 일치 구간 탐색 등 유용한 메서드들을 제공하며, 주요 메서드는 다음과 같습니다.
set_seqs(a, b) — 비교할 두 시퀀스를 한 번에 설정합니다. 두 번째 시퀀스에 대한 상세 정보는 미리 계산되어 캐싱되므로, 하나의 기준 파일과 여러 파일을 반복해서 비교할 때는 첫 번째 시퀀스만 교체하는 것이 효율적입니다.
set_seq1(a) — 비교 대상 중 첫 번째 시퀀스를 설정합니다.
set_seq2(b) — 비교 대상 중 두 번째 시퀀스를 설정합니다.
find_longest_match(alo, ahi, blo, bhi) — 첫 번째 시퀀스의 [alo, ahi) 구간과 두 번째 시퀀스의 [blo, bhi) 구간 사이에서 가장 긴 일치 블록을 찾아 반환합니다.
get_matching_blocks() — 두 시퀀스에서 서로 일치하는 블록들의 목록을 내림차순으로 반환합니다.
ratio() — 두 시퀀스의 유사도를 0.0~1.0 사이의 float 값으로 반환합니다. 1에 가까울수록 두 시퀀스가 더 유사하다는 의미입니다.
예제 코드
다음은 두 문자열의 유사도와 일치 블록을 출력하는 간단한 예제입니다. 생성자의 첫 번째 인자로 lambda x: x == ' '를 전달했는데, 이는 공백 문자를 무시(junk) 처리하겠다는 의미입니다.
import difflib
myStr1 = 'Python Programming'
myStr2 = 'Python Standard Library'
seq_match = difflib.SequenceMatcher(lambda x: x == ' ', myStr1, myStr2)
print("시퀀스 매칭 비율: " + str(round(seq_match.ratio(), 3)))
for match_block in seq_match.get_matching_blocks():
print(match_block)
실행 결과
The ratio of the sequence matching is: 0.488 Match(a=0, b=0, size=7) Match(a=8, b=13, size=1) Match(a=11, b=19, size=2) Match(a=18, b=23, size=0)
결과 해석
유사도 비율은 약 0.488로, 두 문자열의 약 48.8%가 일치함을 나타냅니다. 이 값은 (일치한 문자 수 × 2) ÷ (두 문자열 길이의 합)으로 계산됩니다.
출력된 일치 블록을 하나씩 살펴보면 다음과 같습니다.
Match(a=0, b=0, size=7)— 두 문자열 모두 'Python '으로 시작하므로 앞의 7글자가 일치합니다.Match(a=8, b=13, size=1)— 첫 번째 문자열의 8번 위치 'r'과 두 번째 문자열의 13번 위치 'r'이 일치합니다.Match(a=11, b=19, size=2)— 'ra' 두 글자가 서로 일치합니다.Match(a=18, b=23, size=0)— 크기가 0인 마지막 블록은 실제 일치가 아니라 목록의 끝을 알리는 더미(dummy) 항목입니다.
이처럼 difflib 모듈을 활용하면 몇 줄의 코드만으로 두 시퀀스 간의 차이점과 유사도를 정량적으로 분석할 수 있습니다.