BERT를 이용한 문장 분류 모델 만들기
1. 서론
자연어 처리(NLP)에서 문장 분류(Sentence Classification)는 감성 분석(Sentiment Analysis), 주제 분류(Topic Classification), 스팸 탐지(Spam Detection) 등 다양한 응용 분야에서 활용됩니다. 최근에는 사전 훈련된 모델을 활용한 전이 학습(Transfer Learning)이 일반적인 방법으로 자리 잡았으며, 그중에서도 BERT(Bidirectional Encoder Representations from Transformers)는 뛰어난 성능을 보여주고 있습니다.
이번 포스팅에서는 BERT를 이용한 문장 분류 모델을 구현하는 방법을 단계별로 설명하겠습니다. transformers 라이브러리를 활용하여 Hugging Face의 사전 훈련된 BERT 모델을 불러오고, 문장 분류 태스크에 맞게 미세 조정(Fine-tuning)하는 과정을 진행합니다.
2. BERT란?
BERT는 구글에서 개발한 사전 훈련된 언어 모델로, 문맥을 양방향으로 이해하는 Transformer 기반 모델입니다. 다음과 같은 특징을 가지고 있습니다.
- 양방향 학습(Bidirectional Learning): 문장의 양쪽 방향에서 문맥을 이해할 수 있도록 설계되었습니다.
- 사전 훈련(Pre-training) 및 미세 조정(Fine-tuning): 다양한 자연어 처리 태스크에 쉽게 적용할 수 있도록 설계되었습니다.
- MLM(Masked Language Model)과 NSP(Next Sentence Prediction) 기법 사용: 훈련 과정에서 단어 마스킹 및 문장 연결 예측을 통해 문맥을 더 깊이 이해합니다.
3. 환경 설정
BERT 모델을 활용하기 위해 transformers와 datasets 라이브러리를 설치해야 합니다.
pip install transformers datasets torch
추가적으로 데이터 처리를 위해 pandas와 scikit-learn도 설치해줍니다.
pip install pandas scikit-learn
4. 데이터 준비
Hugging Face의 datasets 라이브러리를 이용하여 감성 분석을 위한 IMDb 데이터셋을 로드하겠습니다.
from datasets import load_dataset
dataset = load_dataset("imdb")
print(dataset)
데이터셋은 train, test, unsupervised 세 개의 서브셋으로 구성됩니다. 우리는 train과 test 데이터를 사용하여 문장 분류 모델을 학습하겠습니다.
5. 데이터 전처리
BERT는 토큰화(Tokenization)가 필수적이며, Hugging Face의 AutoTokenizer를 활용하여 토큰화 작업을 수행합니다.
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
def preprocess_function(examples):
return tokenizer(examples["text"], padding="max_length", truncation=True)
tokenized_datasets = dataset.map(preprocess_function, batched=True)
위 코드에서 AutoTokenizer.from_pretrained("bert-base-uncased")를 사용하여 BERT 토크나이저를 불러오고, 문장을 토큰화한 후 패딩과 길이 조정을 수행합니다.
6. 데이터셋 분리 및 변환
PyTorch의 Dataset 형식으로 변환하여 학습에 사용할 수 있도록 합니다.
from transformers import DataCollatorWithPadding
from torch.utils.data import DataLoader
train_dataset = tokenized_datasets["train"].shuffle(seed=42).select(range(20000))
test_dataset = tokenized_datasets["test"].shuffle(seed=42).select(range(5000))
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
train_dataloader = DataLoader(train_dataset, batch_size=8, shuffle=True, collate_fn=data_collator)
test_dataloader = DataLoader(test_dataset, batch_size=8, shuffle=False, collate_fn=data_collator)
7. BERT 모델 불러오기 및 학습 설정
Hugging Face의 AutoModelForSequenceClassification을 사용하여 문장 분류용 BERT 모델을 로드합니다.
from transformers import AutoModelForSequenceClassification
model = AutoModelForSequenceClassification.from_pretrained("bert-base-uncased", num_labels=2)
이제 옵티마이저와 학습 루프를 설정합니다.
from transformers import TrainingArguments, Trainer
import numpy as np
from datasets import load_metric
training_args = TrainingArguments(
output_dir="./results",
evaluation_strategy="epoch",
save_strategy="epoch",
learning_rate=2e-5,
per_device_train_batch_size=8,
per_device_eval_batch_size=8,
num_train_epochs=3,
weight_decay=0.01,
)
metric = load_metric("accuracy")
def compute_metrics(eval_pred):
logits, labels = eval_pred
predictions = np.argmax(logits, axis=-1)
return metric.compute(predictions=predictions, references=labels)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=train_dataset,
eval_dataset=test_dataset,
tokenizer=tokenizer,
compute_metrics=compute_metrics,
)
8. 모델 학습 및 평가
이제 학습을 실행하고 평가를 진행합니다.
trainer.train()
trainer.evaluate()
학습이 완료되면 모델을 저장할 수 있습니다.
model.save_pretrained("./bert-sentiment")
tokenizer.save_pretrained("./bert-sentiment")
9. 새로운 문장 예측하기
학습이 완료된 모델을 활용하여 새로운 문장의 감성을 예측할 수 있습니다.
def predict_sentiment(text):
inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True)
outputs = model(**inputs)
logits = outputs.logits
prediction = np.argmax(logits.detach().numpy(), axis=-1)
return "긍정" if prediction[0] == 1 else "부정"
text = "This movie was fantastic!"
print(predict_sentiment(text))
10. 결론
이번 포스팅에서는 BERT를 활용한 문장 분류 모델을 구축하는 방법을 단계별로 설명하였습니다. Hugging Face의 transformers 라이브러리를 활용하여 BERT 모델을 불러오고, IMDb 데이터셋을 사용하여 감성 분석을 수행하는 방법을 다루었습니다.
이 모델은 문장 분류 외에도 다양한 NLP 태스크(예: 뉴스 카테고리 분류, 이메일 스팸 필터링)에도 확장하여 사용할 수 있습니다.
'Python > Deep Learning' 카테고리의 다른 글
| Transformer 모델의 원리 및 NLP에서의 활용 (0) | 2026.03.03 |
|---|---|
| LSTM을 활용한 문장 생성 모델 만들기 (0) | 2026.03.02 |
| Word2Vec 및 GloVe 임베딩을 이용한 단어 벡터화 (0) | 2026.02.27 |
| 텍스트 전처리 방법 (NLTK, spaCy 활용) (0) | 2026.02.26 |
| NLP의 개념 및 주요 응용 분야 (0) | 2026.02.25 |