텍스트 데이터 전처리 - 머신러닝용 데이터 정제 완벽 가이드
머신러닝과 딥러닝 모델 훈련을 위한 텍스트 전처리 전 과정을 단계별로 설명합니다. 한국어 특화 전처리 방법과 주의사항을 포함합니다.
Q.머신러닝을 위한 텍스트 데이터 전처리는 어떻게 하나요?
텍스트 데이터 전처리는 6단계로 진행합니다. 1) 소문자 통일, 2) HTML 태그·특수문자 제거, 3) 토크나이징(단어 분리), 4) 불용어 제거, 5) 어간 추출 또는 표제어 추출, 6) 수치 정규화. 한국어는 형태소 분석이 필수이며 KoNLPy의 Okt 또는 Komoran 형태소 분석기를 사용합니다.
원시 텍스트 데이터를 머신러닝 모델에 직접 입력하면 성능이 급격히 낮아진다. HTML 태그, 중복 문장, 이모지, 오탈자, 의미 없는 조사와 접속어가 섞이면 모델은 핵심 신호보다 잡음을 먼저 학습한다. 텍스트 전처리는 데이터를 "예쁘게 정리"하는 작업이 아니라 모델이 일관된 패턴을 학습하도록 입력 조건을 맞추는 작업이다.
핵심 답변
머신러닝용 텍스트 전처리는 1) 원문 보존, 2) HTML·특수문자 제거, 3) 토큰화와 형태소 분석, 4) 불용어 제거, 5) 도메인 사전 정규화, 6) 학습/검증 데이터 분리 후 재현 가능한 파이프라인 저장 순서로 진행한다. 한국어 데이터는 띄어쓰기 오류와 조사가 많기 때문에 형태소 분석기 선택과 사용자 사전 관리가 특히 중요하다.
텍스트 전처리 6단계
Before → After 비교
- Before: "안녕하세요!!! 오늘 날씨가 정말... 좋네요 ^^"
- After: "날씨 좋다"
단계별 처리
1. HTML 태그 및 마크업 제거
python
import re
text = re.sub(r'<[^>]+>', '', text) # HTML 태그 제거
2. 특수문자 정규화
python
text = re.sub(r'[^ws가-힣]', ' ', text) # 한글·영문·숫자 외 제거
3. 토크나이징 (한국어)
python
from konlpy.tag import Okt
okt = Okt()
tokens = okt.morphs(text, stem=True) # 어간 추출 포함
4. 불용어 제거
한국어 불용어 목록(stopwords)은 공개된 리스트를 기준으로 서비스 도메인에 맞게 확장한다. 일반적인 불용어: 이, 가, 을, 를, 은, 는, 에, 의, 로, 도, 이다, 있다 등.
5. 길이 필터링
2자 미만 단어는 의미 전달이 어려우므로 제거한다. 단, 한국어에서 "안", "못" 같은 부정 부사는 예외 처리가 필요하다.
6. 정규화
같은 의미의 다른 표현을 통일한다. "스마트폰", "스마트 폰", "핸드폰", "휴대폰"을 하나로 통일하는 사용자 사전을 구축한다.
모델 목적별 전처리 기준
전처리는 목적에 따라 달라져야 한다. 감성 분석에서 느낌표와 이모지는 감정 신호가 될 수 있지만, 주제 분류에서는 노이즈가 될 수 있다.
| 모델 목적 | 보존할 정보 | 제거하거나 축소할 정보 |
|---|---|---|
| 감성 분석 | 이모지, 느낌표, 부정 표현 | HTML 태그, 광고 문구 |
| 주제 분류 | 명사, 도메인 키워드 | 조사, 일반 동사 |
| 검색/추천 | 상품명, 브랜드명, 동의어 | 중복 문장, 의미 없는 수식어 |
| 스팸 탐지 | 반복 문자, URL, 특수문자 | 개인정보 원문 |
한국어 전처리에서 놓치기 쉬운 부분
- "안 좋다"와 "좋다"를 같은 방향으로 처리하면 감성 분석이 크게 틀어진다.
- "아이폰15", "아이폰 15", "iPhone 15"처럼 같은 제품명이 여러 방식으로 쓰인다.
- 조사와 어미를 모두 제거하면 문장 의미가 지나치게 단순해질 수 있다.
- 리뷰 데이터에서는 "재구매", "강추", "비추", "돈값" 같은 도메인 표현을 사전에 넣어야 한다.
전처리 전후 데이터 크기 변화
원본 리뷰 텍스트 1,000건 처리 결과:
- 원본 평균 단어 수: 87개
- 전처리 후 평균 단어 수: 23개
- 데이터 크기 감소: 약 74%
이 압축이 모델 훈련 속도와 메모리 효율을 크게 높인다.
재현 가능한 파이프라인 만들기
실험할 때마다 전처리 규칙이 바뀌면 모델 성능 비교가 불가능하다. 정규식, 불용어 목록, 사용자 사전, 형태소 분석기 버전을 모두 코드와 함께 저장해야 한다.
python
def preprocess(text, stopwords, synonym_map):
raw = text
text = re.sub(r'<[^>]+>', ' ', text)
text = re.sub(r's+', ' ', text).strip()
for source, target in synonym_map.items():
text = text.replace(source, target)
tokens = okt.morphs(text, stem=True)
tokens = [t for t in tokens if t not in stopwords and len(t) >= 2]
return raw, tokens
원문을 함께 반환하는 이유는 오류 추적 때문이다. 모델 예측이 이상할 때 전처리된 토큰만 남아 있으면 어떤 정보가 사라졌는지 확인하기 어렵다.
품질 검수 체크리스트
- 학습 데이터와 테스트 데이터에 같은 전처리 함수를 적용했는가.
- 불용어 제거 후 의미 있는 부정어("안", "못", "없다")가 사라지지 않았는가.
- 숫자와 단위가 중요한 업무인지 확인했는가.
- 개인정보가 포함된 데이터라면 마스킹 후 학습했는가.
- 전처리 전후 샘플 100건을 사람이 직접 비교했는가.
마무리
좋은 전처리는 데이터를 무조건 짧게 만드는 것이 아니다. 모델 목적에 필요한 신호는 남기고, 반복 잡음과 형식 차이만 줄이는 작업이다. 한국어 데이터에서는 형태소 분석, 도메인 사전, 부정 표현 보존 세 가지를 먼저 점검하면 성능 저하를 크게 줄일 수 있다.