Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 difflib 모듈을 활용한 델타(Delta) 계산 방법

델타(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 모듈을 활용하면 몇 줄의 코드만으로 두 시퀀스 간의 차이점과 유사도를 정량적으로 분석할 수 있습니다.