이번 글에서는 자연어 처리(NLP)에서 자주 사용되는 허깅페이스 트랜스포머(Hugging Face Transformers) 라이브러리를 활용하여 감성 분석을 수행하는 방법에 대해 알아보겠습니다. 감성 분석은 텍스트 데이터를 통해 감정이나 감성을 추출하는 기술로, 다양한 분야에서 유용하게 사용됩니다.
1. 허깅페이스 트랜스포머란?
허깅페이스 트랜스포머 라이브러리는 다양한 사전 학습된 자연어 처리 모델을 쉽게 사용할 수 있게 해주는 파이썬 라이브러리입니다. BERT, GPT-2, T5 등 여러 종류의 모델을 지원하며, 특히 Fine-tuning이 용이하여 다양한 작업에 맞게 모델을 조정할 수 있습니다.
2. 감성 분석의 개요
감성 분석은 주로 아래와 같은 작업을 포함합니다:
- 문서의 전반적인 감정 상태(긍정, 부정, 중립)
- 제품 리뷰의 세부 감정
- 소셜 미디어 포스트의 감정 추적
감성 분석은 머신러닝, 딥러닝의 기법을 통해 구현할 수 있으며, 학습 데이터의 품질과 양이 결과에 큰 영향을 미칩니다.
3. 환경 설정
이 강좌를 진행하기 위해 필요한 라이브러리를 설치하겠습니다. 아래의 명령어를 사용하여 허깅페이스 트랜스포머와 토큰화 라이브러리인 transformers
및 torch
를 설치하세요.
pip install transformers torch
4. 데이터셋 준비하기
감성 분석을 위한 데이터셋으로는 유명한 IMDb 영화 리뷰 데이터셋을 사용할 것입니다. 이 데이터셋은 영화에 대한 긍정적 또는 부정적인 리뷰를 포함하고 있습니다.
from sklearn.datasets import fetch_openml
data = fetch_openml('IMDb', version=1)
texts, labels = data['data'], data['target']
5. 데이터 전처리
데이터를 모델에 입력할 수 있도록 전처리하겠습니다. 텍스트를 정제하고, 레이블을 숫자로 변환하는 과정이 필요합니다.
import pandas as pd
df = pd.DataFrame({'text': texts, 'label': labels})
df['label'] = df['label'].apply(lambda x: 1 if x == 'pos' else 0)
texts = df['text'].tolist()
labels = df['label'].tolist()
6. 모델 불러오기
감성 분석을 위한 사전 학습된 BERT 모델을 불러오겠습니다. 또한, 텍스트를 토큰화하고 모델에 입력할 수 있는 형식으로 변환합니다.
from transformers import AutoTokenizer, AutoModelForSequenceClassification
model_name = 'nlptown/bert-base-multilingual-uncased-sentiment'
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
7. 텍스트 토큰화
모델에 입력할 수 있도록 텍스트를 토큰화합니다. 각 리뷰를 모델에 입력하기 위해서 적절한 형태로 변환하는 과정입니다.
encodings = tokenizer(texts, truncation=True, padding=True, max_length=128, return_tensors="pt")
8. 모델 학습
모델을 학습시키기 위해서는 주어진 데이터로 Fine-tuning을 수행해야 합니다. 이제 PyTorch의 데이터 로더를 사용하여 데이터셋을 구성하겠습니다.
import torch
from torch.utils.data import DataLoader, Dataset
class SentimentDataset(Dataset):
def __init__(self, encodings, labels):
self.encodings = encodings
self.labels = labels
def __getitem__(self, idx):
item = {key: val[idx] for key, val in self.encodings.items()}
item['labels'] = torch.tensor(self.labels[idx])
return item
def __len__(self):
return len(self.labels)
dataset = SentimentDataset(encodings, labels)
train_loader = DataLoader(dataset, batch_size=16, shuffle=True)
9. 모델 훈련
모델을 훈련하기 위해 손실 함수와 옵티마이저를 정의하고, 에포크에 걸쳐 훈련을 진행합니다.
from transformers import AdamW
optimizer = AdamW(model.parameters(), lr=5e-5)
model.train()
for epoch in range(3):
for batch in train_loader:
optimizer.zero_grad()
outputs = model(**batch)
loss = outputs.loss
loss.backward()
optimizer.step()
print(f'Epoch: {epoch}, Loss: {loss.item()}')
10. 모델 평가
모델을 평가하여 성능을 확인해보겠습니다. 검증 데이터셋을 사용하여 정확도와 손실을 측정합니다.
model.eval()
correct = 0
total = 0
with torch.no_grad():
for batch in train_loader:
outputs = model(**batch)
predictions = outputs.logits.argmax(dim=-1)
correct += (predictions == batch['labels']).sum().item()
total += batch['labels'].size(0)
accuracy = correct / total
print(f'Accuracy: {accuracy}')
11. 예측하기
모델이 학습이 완료되면 새로운 데이터에 대한 예측을 진행할 수 있습니다. 아래는 실제 예측을 하는 예제 코드입니다.
def predict_sentiment(text):
inputs = tokenizer(text, return_tensors='pt', truncation=True, padding=True, max_length=128)
with torch.no_grad():
outputs = model(**inputs)
prediction = outputs.logits.argmax(dim=-1)
return '긍정' if prediction.item() == 1 else '부정'
test_text = "이 영화는 정말 재미있었습니다!"
print(f'예측: {predict_sentiment(test_text)}')
12. 결론
이 글에서는 허깅페이스 트랜스포머 라이브러리를 활용하여 감성 분석을 수행하는 전 과정을 살펴보았습니다. 모델을 Fine-tuning하고 실제 데이터를 예측하는 과정을 통해 딥러닝 모델의 활용 가능성을 확인할 수 있었습니다. 앞으로도 다양한 자연어 처리 작업에 허깅페이스 트랜스포머를 응용할 수 있을 것입니다.
13. 참고 문헌
- Hugging Face Documentation: https://huggingface.co/docs/transformers
- IMDb 데이터셋: https://www.imdb.com/interfaces/
- PyTorch Documentation: https://pytorch.org/docs/stable/index.html