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