데이터 분석 • 챕터 3 / 4
LLM과 같은 모델을 사용하지 않는 전통적인 데이터 분석에서는 불필요한 문자와 잡음에 취약 합니다.
전처리의 중요성
분석 모델에 전달하기 전에 텍스트를 정리하고 표준화해야 정확한 분석이 가능합니다.
원본 텍스트
↓
1. 정규표현식 → 패턴 매칭
↓
2. 정제(Cleaning) → 노이즈 제거
↓
3. 토큰화(Tokenization)
↓
4. 정규화(Normalization)
↓
5. 불용어 제거(Stopwords)
↓
정제된 텍스트정규표현식은 특정 패턴의 문자열을 찾거나 치환 하는 데 사용됩니다.
import re
text = "이메일: test@example.com, 날짜: 2025-01-15"
# 이메일 추출
email = re.findall(r'[a-zA-Z0-9_$+-]+@[a-z.]+', text)
print(email) # ['test@example.com']
# 날짜 추출
date = re.findall(r'\d{4}-\d{2}-\d{2}', text)
print(date) # ['2025-01-15']| 패턴 | 설명 | 예시 |
|---|---|---|
\d+ | 숫자 (1개 이상) | 2025, 123 |
[가-힣]+ | 한글 (1개 이상) | 안녕하세요 |
[a-zA-Z]+ | 영문 (1개 이상) | Hello |
\s+ | 공백 (1개 이상) | 공백, 탭, 줄바꿈 |
.+ | 모든 문자 (1개 이상) | 아무 문자열 |
import re
# 이메일: [a-zA-Z0-9_$+-]+@[a-z.]+
# 날짜: \d{4}-\d{2}-\d{2}
# 전화번호: \d{3}-\d{4}-\d{4}
# 가격: [\d,]+원
text = "가격은 15,000원이고 연락처는 010-1234-5678입니다."
price = re.findall(r'[\d,]+원', text)
print(price) # ['15,000원']
phone = re.findall(r'\d{3}-\d{4}-\d{4}', text)
print(phone) # ['010-1234-5678']import re
def clean_text(text):
# HTML 태그 제거
text = re.sub(r'<[^>]+>', '', text)
# URL 제거
text = re.sub(r'http\S+', '', text)
# 특수문자 제거 (한글, 영문, 숫자, 공백만 유지)
text = re.sub(r'[^\가-힣a-zA-Z0-9\s]', ' ', text)
# 다중 공백을 단일 공백으로
text = re.sub(r'\s+', ' ', text)
return text.strip()
# 사용 예시
raw = "<p>Hello!</p> 방문: http://example.com 🎉"
cleaned = clean_text(raw)
print(cleaned) # "Hello 방문"| 단계 | 정규표현식 | 설명 |
|---|---|---|
| HTML 제거 | <[^>]+> | <태그> 형태 제거 |
| URL 제거 | http\S+ | http로 시작하는 문자열 제거 |
| 특수문자 | [^\가-힣a-zA-Z0-9\s] | 지정 문자 외 제거 |
| 공백 정리 | \s+ | 다중 공백 → 단일 공백 |
토큰화는 텍스트를 분석 가능한 단위로 분리 하는 과정입니다.
| 토큰화 종류 | 설명 | 예시 |
|---|---|---|
| 문장 단위 | 문장으로 분리 | "안녕. 반가워." → ["안녕.", "반가워."] |
| 단어 단위 | 공백 기준 분리 | "안녕 반가워" → ["안녕", "반가워"] |
| 형태소 단위 | 의미 최소 단위 | "먹었다" → ["먹", "었", "다"] |
# 단어 단위 토큰화
text = "딥러닝 모델을 학습시키기 위해 데이터를 전처리합니다"
words = text.split()
print(words)
# ['딥러닝', '모델을', '학습시키기', '위해', '데이터를', '전처리합니다']연속된 n개의 단어 묶음 으로 문맥을 반영합니다.
text = "딥러닝 모델을 학습시키기 위해 데이터를 전처리합니다"
words = text.split()
# Bigram (2-gram)
bigrams = [' '.join(words[i:i+2]) for i in range(len(words)-1)]
print(bigrams[:3])
# ['딥러닝 모델을', '모델을 학습시키기', '학습시키기 위해']
# Trigram (3-gram)
trigrams = [' '.join(words[i:i+3]) for i in range(len(words)-2)]
print(trigrams[:2])
# ['딥러닝 모델을 학습시키기', '모델을 학습시키기 위해']LLM의 토큰화
LLM에서는 별도의 토크나이저(Tokenizer)를 사용합니다. BPE(Byte Pair Encoding), WordPiece 등의 알고리즘으로 서브워드 단위 토큰화를 수행합니다.
import re
text = "와아아아아 대박!!!! 2025년"
# 숫자 → NUM 치환
text = re.sub(r'\d+', 'NUM', text)
# 반복 문자 축소 (3회 이상 → 2회)
text = re.sub(r'(.)\1{2,}', r'\1\1', text)
print(text) # "와아 대박!! NUM년"| 기법 | 설명 | 예시 |
|---|---|---|
| 대소문자 통일 | 소문자 변환 | "Hello" → "hello" |
| 숫자 치환 | 숫자를 토큰으로 | "2025" → "NUM" |
| 반복 축소 | 반복 문자 줄이기 | "와아아아" → "와아" |
| 공백 정리 | 다중 공백 제거 | "a b" → "a b" |
의미 없는 조사, 접속사 등을 제거합니다.
# 한국어 불용어 예시
stopwords = ["이", "있", "것", "그리고", "을", "를", "에", "의"]
text = "매우 중요한 데이터입니다 그리고 분석에 필요합니다"
words = text.split()
# 불용어 제거
filtered = [w for w in words if w not in stopwords]
print(filtered)
# ['매우', '중요한', '데이터입니다', '분석에', '필요합니다']주의
불용어 목록은 분석 목적에 따라 달라질 수 있습니다. 특정 도메인에서는 일반적인 불용어가 중요한 의미를 가질 수 있으므로 신중하게 선택해야 합니다.
import re
def preprocess_text(text, stopwords=None):
"""
텍스트 전처리 파이프라인
1. 정제 (Cleaning)
2. 토큰화 (Tokenization)
3. 정규화 (Normalization)
4. 불용어 제거 (Stopwords)
"""
if stopwords is None:
stopwords = ["이", "있", "것", "그리고", "을", "를"]
# 1. 정제
text = re.sub(r'<[^>]+>', '', text) # HTML
text = re.sub(r'http\S+', '', text) # URL
text = re.sub(r'[^\가-힣a-zA-Z0-9\s]', ' ', text) # 특수문자
# 2. 정규화
text = re.sub(r'\d+', 'NUM', text) # 숫자 치환
text = re.sub(r'(.)\1{2,}', r'\1\1', text) # 반복 축소
text = re.sub(r'\s+', ' ', text).strip() # 공백 정리
# 3. 토큰화
words = text.split()
# 4. 불용어 제거
words = [w for w in words if w not in stopwords]
return words
# 사용 예시
article = "파이썬(Python), 인기 1위 언어! AI와 데이터 분석 활용 ↑"
result = preprocess_text(article)
print(result)
# ['파이썬', 'Python', '인기', 'NUM', '위', '언어', 'AI와', '데이터', '분석', '활용']| 단계 | 결과 |
|---|---|
| 원본 | 파이썬(Python), 인기 1위 언어! AI와 데이터 분석 활용 ↑ |
| 정제 후 | 파이썬 Python 인기 1위 언어 AI와 데이터 분석 활용 |
| 토큰화 | ['파이썬', 'Python', '인기', '1', '위', '언어', ...] |
| 불용어 제거 | ['파이썬', 'Python', '인기', '언어', 'AI와', ...] |
결과
전처리 후 단어 수가 감소하고, 데이터 품질이 개선됩니다.
| 개념 | 핵심 내용 |
|---|---|
| 정규표현식 | 패턴 기반 텍스트 검색/치환 (re 모듈) |
| 정제 | HTML, URL, 특수문자, 공백 제거 |
| 토큰화 | 문장/단어/형태소 단위 분리, N-gram |
| 정규화 | 대소문자 통일, 숫자 치환, 반복 축소 |
| 불용어 | 의미 없는 단어 제거 (조사, 접속사 등) |
| 파이프라인 | 정제 → 정규화 → 토큰화 → 불용어 제거 |