목차
문장을 비교하거나, 뉴스 데이터를 필터링하거나, 중복된 파일을 검사하거나, 사용자 입력의 철자 오류를 보정할 때 우리는 “유사성 (Similarity)”를 판단해야 하는 상황을 자주 마주칩니다. Python에서는 이러한 작업을 위해 difflib
이라는 유용한 표준 라이브러리를 제공합니다.
이 글에서는 difflib
의 핵심 기능 중 하나인 문자열 유사성 측정(Sequence Matcher)와 근접 문자열 탐색(get_close_matches) 기능을 중심으로 설명하고, 실제 업무에서 어떻게 활용할 수 있는지도 함께 소개합니다.
Python difflib 란?
Python difflib 의 표준 라이브러리로, 다음과 같은 기능을 제공합니다:
- 두 문자열 간 차이 시각화
- 유사도(0~1) 점수 계산
- 철자 유사 단어 추천
- 파일 간 차이점 비교 (HTML 출력 포함)
텍스트 기반의 작업에서 상당히 유용하며, 복잡한 자연어처리 도구를 쓰지 않더라도 간단한 문자열 비교 작업을 쉽게 수행할 수 있습니다.
예제 1: 기본 문자열 유사도 비교
import difflib
text1 = "Hello, world!"
text2 = "Hello, Python world!"
# 문자열 차이 시각화
diff = difflib.ndiff(text1, text2)
print(''.join(diff))
# 유사도 점수 계산
similarity = difflib.SequenceMatcher(None, text1, text2).ratio()
print(f"Similarity: {similarity:.2f}")
출력 결과:
Similarity: 0.79
.ratio()
는 두 문자열이 얼마나 유사한지를 0 ~ 1 사이의 실수로 반환합니다.
- 1.0: 완전 동일
- 0.5 이상: 유사한 내용
- 0.3 이하: 거의 다른 내용
예제 2: 철자 유사 단어 추천
words = ["apple", "orange", "banana", "grape", "pineapple"]
target = "appel"
close_matches = difflib.get_close_matches(target, words)
print(close_matches)
결과:
['apple', 'pineapple']
자동완성, 오타 교정 기능 구현에 활용할 수 있습니다.
예제 3: 문장 유사도 탐지
sentences = [
"The quick brown fox jumps over the lazy dog.",
"A slow white dog runs the cat.",
"The quick red fox jumps over the sleepy cat."
]
target_sentence = "The quick brown fox jumps over a lazy dog."
matches = difflib.get_close_matches(target_sentence, sentences)
print(matches)
결과:
['The quick brown fox jumps over the lazy dog.',
'The quick red fox jumps over the sleepy cat.']
비슷한 문장 두 개를 식별할 수 있으며, 뉴스 기사, 문서 요약, 리뷰 필터링 등에도 유용합니다.
예제 4: 파일 간 차이 비교 (HTML 파일로 출력)
from difflib import HtmlDiff
with open('file1.txt') as file1, open('file2.txt') as file2:
lines1 = file1.readlines()
lines2 = file2.readlines()
html_diff = HtmlDiff().make_file(lines1, lines2, fromdesc='File 1', todesc='File 2')
with open('diff.html', 'w') as result:
result.write(html_diff)
브라우저에서 열면 HTML 형식으로 두 파일의 차이를 한눈에 볼 수 있습니다.
버전 관리 시스템 없이 문서 비교를 해야 할 때 유용
알고리즘 개요
difflib.SequenceMatcher
는 내부적으로 **레벤슈타인 거리(Levenshtein Distance)**와 유사한 원리를 사용합니다. 두 문자열의 공통 부분과 차이점을 찾아내고, 그 비율을 기반으로 유사도를 계산합니다.
복잡한 NLP 알고리즘보다는 빠르고 가벼운 비교를 원할 때 적합합니다.
실무 활용 경험
제가 유사도 측정에 관심을 가지게 된 계기는 뉴스 데이터를 수집하면서 동일한 내용의 기사가 제목만 다르게 나오는 문제 때문이었습니다. 그때 여러가지 방법을 시도해 봤습니다.
- 코사인 유사도
- Jaccard 유사도
- Manhattan Distance
이후에는 그냥 LLM 기반으로 요약하고 정리하는 방식으로 넘어갔지만, 서버 명령어나 쿼리 로그 같이 비교가 명확한 문자열에서는 오히려 Python difflib
이나 벡터 기반 유사도 분석이 더 효과적이었습니다.
Python difflib 의 한계와 대안
상황 | difflib 적합도 |
---|---|
문장 구조가 유사할 때 | ✅ 매우 적합 |
동의어, 문맥 유사성 판단 | ❌ 부적합 |
대용량 비교, 고속 처리 | ❌ 부적합 |
빠른 중복 필터링 | ✅ 적합 |
복잡한 문맥 이해나 AI 기반 유사도 비교가 필요할 경우에는 spaCy
, BERT
, SentenceTransformers
같은 벡터 기반 NLP 도구를 사용하는 것이 적합합니다.
마무리
difflib
은 Python 표준 라이브러리에 포함되어 있는 작지만 강력한 도구입니다. 가볍고 빠르게 문자열 간 유사도를 측정하고 싶을 때, 오타 교정이나 문장 비교를 구현하고 싶을 때 별도 설치 없이 바로 사용할 수 있는 장점이 있습니다.
중복 기사 필터링, 사용자 입력 보정, 명령어 유사도 분석, 파일 변경 추적 등 다양한 실전 사례에서 충분한 성능을 보여줍니다.또한 difflib은 텍스트 간의 차이를 시각적으로 보여주는 기능도 제공합니다. 예를 들어, ndiff
, unified_diff
함수를 활용하면 두 문장 또는 두 파일 간의 변경 내용을 줄 단위 또는 문자 단위로 확인할 수 있습니다. 이 기능은 코드 리뷰, 문서 비교, 로그 변경 추적 등에 매우 유용하게 활용됩니다.