텍스트 매칭 자동화: fuzzywuzzy
를 이용한 데이터베이스 중복 항목 정리
Overview
데이터베이스에서 중복된 항목을 관리하는 것은 데이터 품질을 유지하고, 검색 성능을 향상시키며, 사용자의 경험을 개선하는 데 중요한 역할을 합니다. 이 글에서는 fuzzywuzzy
라는 파이썬 라이브러리를 활용하여 텍스트 매칭을 수행하고, 이를 통해 중복된 데이터를 정리하는 자동화 스크립트를 만드는 방법을 자세히 설명하겠습니다.
1. fuzzywuzzy
란 무엇인가?
fuzzywuzzy
는 문자열 간의 유사도를 비교하기 위해 Levenshtein 거리 알고리즘을 사용하는 파이썬 라이브러리입니다. 주로 텍스트 매칭, 중복 데이터 감지, 그리고 자연어 처리(NLP) 분야에서 활용됩니다. 이 라이브러리는 문자열 간의 유사도를 백분율로 제공하므로, 유사한 문자열을 쉽게 판별할 수 있습니다.
2. fuzzywuzzy
설치하기
먼저, fuzzywuzzy
를 설치해야 합니다. 아래의 명령어를 통해 설치할 수 있습니다.
pip install fuzzywuzzy
pip install python-Levenshtein
python-Levenshtein
은 fuzzywuzzy
의 성능을 향상시켜줍니다. 이 라이브러리를 사용하면 더 빠른 문자열 유사도 계산이 가능합니다.
3. 데이터베이스 설정
이번 예제에서는 SQLite를 사용하여 간단한 데이터베이스를 설정해 보겠습니다. 데이터베이스에는 이름과 이메일 주소를 가진 사용자 정보가 포함되어 있습니다.
import sqlite3
# 데이터베이스 연결 및 테이블 생성
conn = sqlite3.connect('users.db')
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
email TEXT
)
''')
# 데이터 삽입
users = [
('홍길동', 'hong@example.com'),
('홍길동 ', 'hong123@example.com'),
('김철수', 'kim@example.com'),
('이영희', 'lee@example.com'),
('이영희', 'yeonghee@example.com')
]
cursor.executemany('INSERT INTO users (name, email) VALUES (?, ?)', users)
conn.commit()
위의 코드는 users.db
라는 SQLite 데이터베이스를 만들고, 사용자 정보를 담은 users
테이블을 생성합니다.
4. 중복 항목 감지 및 정리
이제 fuzzywuzzy
를 사용하여 중복된 이름을 찾아내고, 이를 정리하는 스크립트를 작성해 보겠습니다. 주요 목표는 이름이 비슷한 항목을 감지하고, 중복된 항목 중 하나만 남기고 나머지를 삭제하는 것입니다.
from fuzzywuzzy import fuzz
# 데이터베이스에서 사용자 정보 조회
cursor.execute('SELECT * FROM users')
user_data = cursor.fetchall()
# 중복 감지를 위한 리스트
duplicates = []
# 유사도 기준 설정
threshold = 90
# 중복 항목 감지
for i in range(len(user_data)):
for j in range(i + 1, len(user_data)):
name1 = user_data[i][1].strip() # 공백 제거
name2 = user_data[j][1].strip() # 공백 제거
if fuzz.ratio(name1, name2) > threshold:
duplicates.append((user_data[i][0], user_data[j][0]))
# 중복 항목 삭제 및 유지할 항목 선택
for dup in duplicates:
keep_id = min(dup) # 가장 작은 ID 유지
for id_to_remove in dup:
if id_to_remove != keep_id:
cursor.execute('DELETE FROM users WHERE id = ?', (id_to_remove,))
conn.commit()
위의 코드는 다음 단계를 따릅니다:
- 데이터 조회: 데이터베이스에서 모든 사용자 정보를 가져옵니다.
- 중복 감지: 두 개의 중첩 루프를 사용하여 각 사용자 이름의 유사도를 계산합니다.
fuzz.ratio()
함수는 두 문자열의 유사도를 0부터 100까지의 백분율로 반환합니다. - 중복 삭제: 중복으로 감지된 항목 중 ID가 작은 항목만 남기고 나머지를 삭제합니다.
5. 에러 처리
자동화 스크립트를 작성할 때는 에러 처리도 중요합니다. 예를 들어, 데이터베이스 연결에 실패하거나, 쿼리 실행 중 오류가 발생할 수 있습니다. 이를 처리하기 위해 try-except
블록을 사용할 수 있습니다.
try:
# 데이터베이스 연결 및 쿼리 실행 코드
except sqlite3.Error as e:
print(f"Database error: {e}")
except Exception as e:
print(f"Unexpected error: {e}")
이러한 방식으로 예기치 못한 에러에 대비할 수 있습니다.
6. 스크립트 실행 및 결과 확인
이제 작성한 스크립트를 실행하여 데이터베이스의 중복 항목을 정리합니다. 실행 후, 남아 있는 사용자 정보를 확인하여 중복이 잘 정리되었는지 확인합니다.
# 정리된 데이터 확인
cursor.execute('SELECT * FROM users')
cleaned_data = cursor.fetchall()
for user in cleaned_data:
print(user)
conn.close()
7. 결론
fuzzywuzzy
를 이용한 텍스트 매칭은 데이터베이스 중복 항목 정리에서 매우 유용한 도구입니다. 이 라이브러리를 통해 문자열의 유사도를 효과적으로 비교할 수 있으며, 데이터의 품질을 높이는 데 기여할 수 있습니다.
참고문서
'Study Information Technology' 카테고리의 다른 글
Twitter API를 활용한 자동 업데이트 및 트렌드 수집 스크립트 개발 (0) | 2024.10.22 |
---|---|
Redis를 활용한 자동화된 작업 큐 구축하기 (0) | 2024.10.22 |
자동 대화 로그 분석기 구현하기 (0) | 2024.10.22 |
네트워크 모니터링 도구 구축 scapy를 활용한 비정상 네트워크 활동 감지 및 경고 (0) | 2024.10.22 |
Apache Airflow로 데이터 파이프라인 구축하기 ETL 프로세스 자동화 (0) | 2024.10.22 |