🎉 배송 리뷰 감성 분석 프로젝트
이 프로젝트는 “네이버 쇼핑 리뷰 중 배송 관련 리뷰의 감성(긍/부정)을 AI가 자동으로 분류”하는 과정이에요.
필요 파일 : 네이버 쇼핑 리뷰 txt 파일
우리는 Colab에서 가볍게 시작해서, HuggingFace의 KoBERT 모델까지 활용하는 진짜 NLP 실전 흐름을 경험하게 됩니다.
1️⃣ 구글 드라이브 연결 → 데이터 사용 준비
Colab은 실행될 때마다 초기화되기 때문에 내 파일을 사용하려면 구글 드라이브를 연결해야 해요.
from google.colab import drive
drive.mount('/content/drive')
이건 마치 Colab에게 드라이브 열쇠를 주는 과정이라고 생각하면 됩니다. 연결 후 작업 폴더로 이동:
%cd /content/drive/MyDrive/폴더파일
2️⃣ 데이터 로딩 — 네이버 쇼핑 리뷰 불러오기
data = pd.read_csv("data/naver_shopping.txt", sep="\t", header=None)
data.columns = ['평점', '리뷰']
우리는 이제 이런 데이터프레임을 갖게 됩니다:
| 평점 | 리뷰 |
|---|---|
| 5 | 너무 좋아요! |
| 1 | 별로예요… |
| 4 | 배송 빨라요 |
| ... | ... |
3️⃣ 띄어쓰기 교정 (Kiwi 사용)
한국어 리뷰는 띄어쓰기가 엉망인 경우가 많아요.
예: "배송빨라요좋아요" → "배송 빨라요 좋아요"
이를 자동으로 교정해주는 도구가 Kiwi!
from kiwipiepy import Kiwi
kiwi = Kiwi()
def space(row):
return kiwi.space(row)
4️⃣ “배송” 포함 리뷰만 추출하기
우리는 배송에 대한 감성분석을 하고 싶음 → 배송 리뷰만 골라냅니다.
배송_reviews = data[data['리뷰'].str.contains('배송')]
reivew_space = 배송_reviews['리뷰'].apply(space)
이제 "배송이 빨라요" 같은 문장만 모임!
5️⃣ 평점 → 레이블(label) 변환
AI는 1, 0 같은 숫자만 이해함. 그래서 이렇게 규칙을 만들어요:
- 1~2점 → 0 (부정)
- 4~5점 → 1 (긍정)
- 3점은 애매해서 제외
def label(row):
if row <= 2:
return 0
elif row >= 4:
return 1
6️⃣ 최종 전처리 리뷰 + 라벨 → 하나의 데이터프레임
review_df = pd.concat([reivew_space, review_label], axis=1)
review_df.to_csv("./data/preprocessed_review.csv", index=False)
이제 “띄어쓰기 교정된 리뷰 + 긍/부정 레이블”이 완성!
7️⃣ HuggingFace Dataset으로 불러오기
Transformer 모델은 pandas보다 HF Dataset을 좋아합니다.
dataset = load_dataset('csv', data_files={'train': "./data/preprocessed_review.csv"})
dataset_split = dataset['train'].train_test_split(test_size=0.2)
80% → 학습, 20% → 평가
8️⃣ Trainer의 5대 구성요소 개념 이해
Trainer는 전문 요리사, 우리는 재료만 잘 준비하면 됨.
🧩 Trainer를 구성하는 5가지 부품
| 구성 요소 | 역할 |
|---|---|
| Tokenizer | 문장 → 숫자로 토큰화 |
| DataCollator | 배치 묶고 padding 자동처리 |
| Downstream Model | 문장 분류 모델 (KoBERT 등) |
| TrainingArguments | 학습률, epoch, batch size 같은 옵션 |
| Trainer | 학습 전체 자동 수행 |
9️⃣ 토크나이저 로딩
KoBERT 기반 Tokenizer 다운로드:
tokenizer = AutoTokenizer.from_pretrained("beomi/kcbert-base")
🔟 모든 데이터 토크나이즈하기
모델이 이해할 수 있도록 → 리뷰를 input_ids, attention_mask 형태로 변환
def preprocess(document):
token_str = tokenizer(document['리뷰'])
token_str['labels'] = document['평점']
return token_str
tokenized_dataset = dataset_split.map(preprocess)
1️⃣1️⃣ 학습 효율을 위한 정리
불필요한 컬럼 제거하고, torch 텐서로 변환:
tokenized_dataset2 = tokenized_dataset.remove_columns(['리뷰','평점'])
tokenized_dataset2.set_format('torch', columns=['input_ids','token_type_ids','attention_mask','label'])
이제 데이터 준비 완료! 이 다음 단계는 Trainer 설정 → 모델 학습입니다.
Trainer 설정 + 모델 학습 + 예측 코드
🚀 STEP 12. KoBERT 모델 준비 (분류용)
우리는 배송 리뷰 긍/부정 분류를 해야 하므로 BertForSequenceClassification 모델을 불러옵니다.
from transformers import BertForSequenceClassification
model = BertForSequenceClassification.from_pretrained(
"beomi/kcbert-base",
num_labels=2 # 긍정/부정 2개 클래스
)
🚀 STEP 13. TrainingArguments 설정
Trainer가 사용할 학습 옵션들을 설정합니다.
쉽게 말하면:
- 학습률: 얼마나 빠르게 배울까?
- 에포크: 몇 바퀴 돌릴까?
- 배치 크기: 한 번에 몇 개를 처리할까?
from transformers import TrainingArguments
training_args = TrainingArguments(
output_dir="./results", # 모델 저장 폴더
evaluation_strategy="epoch", # 매 epoch마다 평가
save_strategy="epoch", # 매 epoch마다 저장
learning_rate=2e-5, # BERT 권장 학습률
per_device_train_batch_size=16,
per_device_eval_batch_size=16,
num_train_epochs=3, # 3 epoch면 충분!
weight_decay=0.01,
logging_dir='./logs',
logging_steps=50
)
🚀 STEP 14. DataCollator 준비
DataCollatorWithPadding 은 매우 중요합니다! → BERT 모델 입력의 길이를 자동으로 맞춰줌 (padding)
from transformers import DataCollatorWithPadding
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
🚀 STEP 15. Trainer 생성
이제 모든 부품을 결합합니다.
from transformers import Trainer
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_dataset2['train'],
eval_dataset=tokenized_dataset2['test'],
tokenizer=tokenizer,
data_collator=data_collator,
)
🚀 STEP 16. 훈련 시작!
이제 AI가 드디어 배송 리뷰 읽고 감정 배우기 시작합니다!
trainer.train()
🚀 STEP 17. 모델 평가
trainer.evaluate()
🚀 STEP 18. 리뷰 감성 예측 함수 만들기
학습된 모델을 사용해 아무 문자열을 넣어도 바로 긍정 / 부정 판별!
import torch
def predict_sentiment(text):
# 입력 문장을 토크나이즈
inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True)
# 모델 예측
with torch.no_grad():
outputs = model(**inputs)
logits = outputs.logits
pred = torch.argmax(logits).item()
if pred == 1:
return "😊 긍정 리뷰"
else:
return "😡 부정 리뷰"
🚀 STEP 19. 예측 테스트!
print(predict_sentiment("배송 빠르고 너무 친절하네요"))
print(predict_sentiment("배송도 느리고 물건도 구겨져 왔습니다"))
출력 예:
😊 긍정 리뷰
😡 부정 리뷰
🔥 전체 과정 요약
- 구글 드라이브에서 데이터 꺼내오기 → 냉장고에서 재료 꺼냄
- 배송 관련 리뷰만 고르기 → 특정 재료만 선택
- 띄어쓰기/정제 → 손질
- 평점 → 감성(label) 변환 → 맛 분류
- CSV 저장 → 손질된 재료 포장
- HuggingFace Dataset 로딩 → 조리 도구에 재료 옮김
- Tokenizer/Collator 설정 → 요리 도구 준비
- 토큰화 → 재료 잘게 썰기
- torch 데이터 구조로 변환 → 냄비에 옮김
- 이제 Trainer가 요리 시작! 😎
🎉 전체 흐름 요약
- 전처리된 CSV → HuggingFace Dataset 로딩
- KoBERT 토크나이즈
- Trainer 구성 5요소 조립
- 모델 학습
- 평가
- 실시간 감성 예측 가능
이제 완전히 배송 리뷰 AI 분석기가 완성된 거예요!
🔖 관련 해시태그
#KoBERT #감성분석모델 #배송리뷰분석 #HuggingFaceTrainer #BERT파인튜닝 #자연어처리실전 #텍스트분류 #딥러닝NLP #한국어NLP #Transformers라이브러리
#텍스트마이닝 #자연어처리 #NLP #KoBERT #리뷰감성분석 #네이버쇼핑데이터 #배송리뷰 #HuggingFace #Tokenizer #Kiwi띄어쓰기교정 #데이터전처리 #SentimentAnalysis #딥러닝공부 #파인튜닝 #BERT모델
'학습 > AI' 카테고리의 다른 글
| [ AI 프로젝트 ] 프론트부터 만든 민원처리 시스템 개발일지 (0) | 2025.12.10 |
|---|---|
| 한글 텍스트 전처리와 감성분류 - 2 (0) | 2025.11.19 |
| 언어지능(PLM) — 세상에서 가장 똑똑한 언어 비서가 만들어지는 과정 (0) | 2025.11.18 |
| 한국어 텍스트 감성분류 (0) | 2025.11.17 |
| 데이터 전처리 핵심 (0) | 2025.11.16 |