문장을 비교하거나, 뉴스 데이터를 필터링하거나, 중복된 파일을 검사하거나, 사용자 입력의 철자 오류를 보정할 때 우리는 “유사성 (Similarity)”를 판단해야 하는 상황을 자주 마주칩니다. Python에서는 이러한 작업을 위해 difflib이라는 유용한 표준 라이브러리를 제공합니다.

이 글에서는 difflib의 핵심 기능 중 하나인 문자열 유사성 측정(Sequence Matcher)근접 문자열 탐색(get_close_matches) 기능을 중심으로 설명하고, 실제 업무에서 어떻게 활용할 수 있는지도 함께 소개합니다.

Python difflib

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 함수를 활용하면 두 문장 또는 두 파일 간의 변경 내용을 줄 단위 또는 문자 단위로 확인할 수 있습니다. 이 기능은 코드 리뷰, 문서 비교, 로그 변경 추적 등에 매우 유용하게 활용됩니다.

By Mark

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다