본문 바로가기
학습/AI

허깅페이스 활용 파인튜닝

by 황성안 2025. 11. 18.
728x90
반응형

🎉 배송 리뷰 감성 분석 프로젝트

이 프로젝트는 “네이버 쇼핑 리뷰 중 배송 관련 리뷰의 감성(긍/부정)을 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가 요리 시작! 😎
  •  

🎉 전체 흐름 요약

  1. 전처리된 CSV → HuggingFace Dataset 로딩
  2. KoBERT 토크나이즈
  3. Trainer 구성 5요소 조립
  4. 모델 학습
  5. 평가
  6. 실시간 감성 예측 가능

이제 완전히 배송 리뷰 AI 분석기가 완성된 거예요!


 

 

 

🔖 관련 해시태그

#KoBERT #감성분석모델 #배송리뷰분석 #HuggingFaceTrainer #BERT파인튜닝 #자연어처리실전 #텍스트분류 #딥러닝NLP #한국어NLP #Transformers라이브러리

#텍스트마이닝 #자연어처리 #NLP #KoBERT #리뷰감성분석 #네이버쇼핑데이터 #배송리뷰 #HuggingFace #Tokenizer #Kiwi띄어쓰기교정 #데이터전처리 #SentimentAnalysis #딥러닝공부 #파인튜닝 #BERT모델


 

728x90
반응형