본문 바로가기

Study Information Technology

텍스트 매칭 자동화 fuzzywuzzy를 이용한 데이터베이스 중복 항목 정리

728x90
반응형

텍스트 매칭 자동화: fuzzywuzzy를 이용한 데이터베이스 중복 항목 정리

Overview

데이터베이스에서 중복된 항목을 관리하는 것은 데이터 품질을 유지하고, 검색 성능을 향상시키며, 사용자의 경험을 개선하는 데 중요한 역할을 합니다. 이 글에서는 fuzzywuzzy라는 파이썬 라이브러리를 활용하여 텍스트 매칭을 수행하고, 이를 통해 중복된 데이터를 정리하는 자동화 스크립트를 만드는 방법을 자세히 설명하겠습니다.

1. fuzzywuzzy란 무엇인가?

fuzzywuzzy는 문자열 간의 유사도를 비교하기 위해 Levenshtein 거리 알고리즘을 사용하는 파이썬 라이브러리입니다. 주로 텍스트 매칭, 중복 데이터 감지, 그리고 자연어 처리(NLP) 분야에서 활용됩니다. 이 라이브러리는 문자열 간의 유사도를 백분율로 제공하므로, 유사한 문자열을 쉽게 판별할 수 있습니다.

2. fuzzywuzzy 설치하기

먼저, fuzzywuzzy를 설치해야 합니다. 아래의 명령어를 통해 설치할 수 있습니다.

pip install fuzzywuzzy
pip install python-Levenshtein

python-Levenshteinfuzzywuzzy의 성능을 향상시켜줍니다. 이 라이브러리를 사용하면 더 빠른 문자열 유사도 계산이 가능합니다.

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()

위의 코드는 다음 단계를 따릅니다:

  1. 데이터 조회: 데이터베이스에서 모든 사용자 정보를 가져옵니다.
  2. 중복 감지: 두 개의 중첩 루프를 사용하여 각 사용자 이름의 유사도를 계산합니다. fuzz.ratio() 함수는 두 문자열의 유사도를 0부터 100까지의 백분율로 반환합니다.
  3. 중복 삭제: 중복으로 감지된 항목 중 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를 이용한 텍스트 매칭은 데이터베이스 중복 항목 정리에서 매우 유용한 도구입니다. 이 라이브러리를 통해 문자열의 유사도를 효과적으로 비교할 수 있으며, 데이터의 품질을 높이는 데 기여할 수 있습니다.

참고문서

728x90
반응형