difflib(Python Document)는 Python 표준 라이브러리에서 문자열이나 시퀀스 간의 차이를 비교하고, 유사성(Similarity Verify)을 분석하는 데 사용되는 라이브러리입니다.
주로 텍스트 비교, 파일 비교, 유사도 측정 등의 작업을 하는데 이 포스트는 유사도 측정을 이야기 해보겠습니다.
ndiff 같은 함수는 순차적으로 강의를 보면서 배우신 분들은 보기 힘드셨을 함수라 생각됩니다.
필요에 의해서 찾아보면 확인 할 수 있는데, 기본 함수라서 사실 저도 Document를 순서대로 읽어보다 알게 되서 사용을 하고 있죠.
Similarity Verify Code
import difflib
text1 = "Hello, world!"
text2 = "Hello, Python world!"
diff = difflib.ndiff(text1, text2)
print(''.join(diff))
# H e l l o , + P+ y+ t+ h+ o+ n+ w o r l d !
# Calculating similarity ratios with SequenceMatcher
similarity = difflib.SequenceMatcher(None, text1, text2).ratio()
print(f"Similarity: {similarity:.2f}") # Similarity: 0.84
# word close match
words = ["apple", "orange", "banana", "grape", "pineapple"]
target = "appel"
# similarity word search
close_matches = difflib.get_close_matches(target, words)
print(f"Close matches for '{target}': {close_matches}")
# Close matches for 'appel': ['apple', 'pineapple']
# Sentence lists and sentences to compare
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."
close_matches = difflib.get_close_matches(target_sentence, sentences)
print(f"Close matches for '{target_sentence}': {close_matches}")
# Close matches for 'The quick brown fox jumps over a lazy dog.':
# ['The quick brown fox jumps over the lazy dog.',
# 'The quick red fox jumps over the sleepy cat.']
# file to list
with open('file1.txt', 'r') as file1, open('file2.txt', 'r') as file2:
file1_lines = file1.readlines()
file2_lines = file2.readlines()
# HtmlDiff use list diff
diff = difflib.HtmlDiff().make_file(file1_lines, file2_lines,
fromdesc='File 1', todesc='File 2')
# Save result
with open('diff.html', 'w') as result_file:
result_file.write(diff)
Output
H e l l o , + P+ y+ t+ h+ o+ n+ w o r l d !
Similarity: 0.79
Close matches for 'appel': ['apple', 'grape']
Close matches for 'The quick brown fox jumps over a lazy dog.': ['The quick brown fox jumps over the lazy dog.', 'The quick red fox jumps over the sleepy cat.']
difflib에서 유사도를 계산하는 알고리즘은 레벤슈타인 거리(Levenshtein Distance)와 유사한 개념이라고 합니다. 자세한 알고리즘을 여기서 설명할 것 아닌 것 같고 이런 학문적인 부분은 더 잘 나와있는 포스트를 이용해주세요.
일단 예제에서 유사도는 0.79 포인트가 나왔는데요. 경험적으로 0.5만 나와도 거의 동일한 주제를 다루는 것 같습니다. 이것 때문에 긍정과 부정을 나타내는 단어를 찾아서 뉴스 유형을 나누려는 시도를 했던 기억이 나는데요. 이 함수에서는 약간 미묘한 부분도 제법 캐취하는 것으로 보입니다.
file1.txt
Hello, world!
file2.txt
Hello, Python world!
문장 유사도 측정(Similarity Verify)에 관심을 가지게 된 것은 뉴스를 수집하기 시작하면서 문제가 발생해서 입니다.
여러 뉴스사에서 수집하면서 동일한 내용이 제목만 다르게 나오는 경우가 많았습니다. 그래서 유사도를 판별해서 불필요한 정보를 거르기 위해 여러가지 기법을 사용했는데 Python 라이브러리에도 있는줄 몰랐네요.
저는 코사인 유사도나 Manhattan Distance 등을 사용해보기도 했는데요. 최근에 그냥 LLM을 이용해 요약하는게 괜찮겠다 싶어서 그렇게 하고 있습니다.
참고로 서버 명령어나 DB쿼리등을 분석할때는 LLM 보다는 이런 단어를 벡터공간에 넣어 유사도 비교하는 방식이 더 괜찮게 나오는 것 같습니다.