데이터사이언스/데이터사이언티스트4기
자연어 처리 초보
병기
2025. 5. 20. 16:00
✔️ 전체 흐름 먼저 보기
1. 텍스트 정리하기 (HTML, 특수기호 제거 등)
import re
def clean_text(text):
text = re.sub(r'<[^>]+>', ' ', text) # HTML 태그 제거
text = re.sub(r'http\S+', ' ', text) # URL 제거
text = re.sub(r'[^가-힣a-zA-Z0-9\s]', ' ', text) # 특수문자 제거
return re.sub(r'\s+', ' ', text).strip() # 여백 정리
예: <p>정말 좋은 영화예요!!</p> → 정말 좋은 영화예요
2. 단어로 나누기 (형태소 분석)
from konlpy.tag import Okt
okt = Okt()
def tokenize(text):
return okt.morphs(text, stem=True) # 어간 추출 포함
예: 정말 재미있어요 → ['정말', '재미있', '어요']
3. 불필요한 단어 제거 (은, 는, 이, 가…)
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(
tokenizer=tokenize,
ngram_range=(1, 2),
min_df=3,
max_df=0.8
)
X = vectorizer.fit_transform(df['document']) # df는 리뷰 데이터
4. 숫자로 바꾸기 (벡터화)
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(
tokenizer=tokenize,
ngram_range=(1, 2),
min_df=3,
max_df=0.8
)
X = vectorizer.fit_transform(df['document']) # df는 리뷰 데이터
5. 감정 예측 모델 만들기 (랜덤 포레스트)
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
model = RandomForestClassifier()
scores = cross_val_score(model, X, df['label'], cv=5, scoring='f1')
print("평균 F1 점수:", scores.mean())
🎁 보너스: 리뷰 길이 시각화하기
import matplotlib.pyplot as plt
df['len'] = df['document'].apply(len)
plt.hist(df['len'], bins=30, edgecolor='black')
plt.title('리뷰 길이 분포')
plt.xlabel('문자 수')
plt.ylabel('빈도')
plt.show()