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

파이썬 FuzzyWuzzy 라이브러리 완벽 가이드: 문자열 유사도 비교하기

이 튜토리얼에서는 FuzzyWuzzy 파이썬 라이브러리에 대해 자세히 알아보겠습니다. FuzzyWuzzy는 두 문자열의 유사도를 비교하기 위해 개발된 라이브러리입니다. 문자열 비교에는 regexdifflib 같은 다른 모듈도 있지만, FuzzyWuzzy는 그 방식이 독특합니다. 이 라이브러리의 메서드는 true, false 또는 문자열을 반환하는 대신, 두 문자열이 얼마나 잘 일치하는지를 100점 만점의 점수로 알려줍니다.

FuzzyWuzzy 설치하기

FuzzyWuzzy를 사용하려면 fuzzywuzzy 패키지와, 처리 속도를 높여주는 python-Levenshtein 패키지를 설치해야 합니다. 아래 명령어를 실행해 설치하세요.

pip install fuzzywuzzy

설치가 정상적으로 완료되면 다음과 같은 메시지가 출력됩니다.

Collecting fuzzywuzzy
Downloading https://files.pythonhosted.org/packages/d8/f1/5a267addb30ab7eaa1beab2
b9323073815da4551076554ecc890a3595ec9/fuzzywuzzy-0.17.0-py2.py3-none-any.whl
Installing collected packages: fuzzywuzzy
Successfully installed fuzzywuzzy-0.17.0

Linux 환경에서는 다음 명령어로 python-Levenshtein을 설치합니다.

pip install python-Levenshtein

Windows 환경에서는 아래 명령어를 사용하세요.

easy_install python-Levenshtein

fuzz 모듈이란?

이제 fuzz 모듈에 대해 알아보겠습니다. fuzz는 한 번에 두 개의 문자열을 비교하는 데 사용되며, 각 메서드는 100점 만점의 유사도 점수를 반환합니다. fuzz 모듈의 대표적인 메서드들을 하나씩 살펴보겠습니다.

fuzz.ratio()

ratio()는 fuzz 모듈의 가장 기본적인 메서드로, 두 문자열 전체를 비교해 100점 만점의 점수를 반환합니다. 대소문자나 공백까지 엄격하게 구분한다는 점에 유의하세요. 아래 예제를 통해 동작 방식을 확인해 보겠습니다.

예제 코드

## fuzzywuzzy 라이브러리에서 모듈 가져오기
from fuzzywuzzy import fuzz
## 완전히 같은 문자열은 100점
print(f"동일한 문자열:- {fuzz.ratio('tutorialspoint', 'tutorialspoint')}")
## 약간의 차이가 있는 문자열은 비율에 따른 점수
print(f"약간 변경된 문자열:- {fuzz.ratio('tutorialspoint', 'TutorialsPoint')}")
print(f"약간 변경된 문자열:- {fuzz.ratio('tutorialspoint', 'Tutorials Point')}")
## 완전히 다른 문자열은 0점
print(f"완전히 다른 문자열:- {fuzz.ratio('abcd', 'efgh')}")

실행 결과

동일한 문자열:- 100
약간 변경된 문자열:- 86
약간 변경된 문자열:- 86
완전히 다른 문자열:- 0

ratio()는 대소문자를 구분하기 때문에 'tutorialspoint'와 'TutorialsPoint'처럼 대소문자만 달라도 100점이 아닌 86점이 나오는 것을 확인할 수 있습니다.

fuzz.partial_ratio()

partial_ratio()는 부분 일치를 검사할 때 유용한 메서드입니다. 짧은 문자열이 긴 문자열 안에 포함되어 있는지 확인하며, 가장 잘 맞는 부분 문자열을 찾아 점수를 매깁니다.

예제 코드

from fuzzywuzzy import fuzz
## 긴 문자열의 일부만 일치해도 100점
print(f"부분 일치:- {fuzz.partial_ratio('tutorialspoint', 'tutorialspoint is awesome!')}")

실행 결과

부분 일치:- 100

fuzz.WRatio()

WRatio()(Weighted Ratio)는 대소문자를 구분하지 않고, 느낌표 같은 특수문자 등 일부 요소를 유연하게 처리하는 고급 메서드입니다. 몇 가지 예제를 살펴보겠습니다.

예제 코드

## fuzzywuzzy 라이브러리에서 모듈 가져오기
from fuzzywuzzy import fuzz
## 한쪽 문자열에 추가 문자가 있어도 100점
print(f"최대 점수:- {fuzz.WRatio('tutorialspoint', 'tutorialspoint!!!')}")
## 대소문자가 달라도 100점
print(f"대소문자가 다른 문자열:- {fuzz.WRatio('tutorialspoint', 'TutorialsPoint')}")
## 완전히 다른 문자열은 0점
print(f"완전히 다른 문자열:- {fuzz.WRatio('abcd', 'efgh')}")

실행 결과

최대 점수:- 100
대소문자가 다른 문자열:- 100
완전히 다른 문자열:- 0

위 결과에서 볼 수 있듯이, WRatio()는 대소문자와 일부 불필요한 문자를 무시합니다. 단순한 ratio() 대신 WRatio()를 사용하면 더 관대하고 실용적인 문자열 매칭 결과를 얻을 수 있습니다.

마무리

지금까지 FuzzyWuzzy 라이브러리의 설치 방법과 fuzz 모듈의 핵심 메서드인 ratio(), partial_ratio(), WRatio()를 살펴보았습니다. 상황에 맞는 메서드를 선택하면 오타 교정, 데이터 정제, 중복 데이터 탐지 등 다양한 작업에서 문자열 유사도를 효과적으로 활용할 수 있습니다. 튜토리얼에 대해 궁금한 점이 있다면 댓글로 남겨주세요.