허깅페이스 트렌스포머 활용강좌, 정규식 활용 전처리

최근 인공지능 및 머신러닝의 발전으로 많은 분야에서 딥러닝 기술이 활용되고 있습니다. 특히 자연어 처리(NLP) 분야에서는 허깅페이스 트랜스포머 라이브러리를 통해 다양한 모델을 쉽게 사용할 수 있게 되었습니다. 이 강좌에서는 허깅페이스 트랜스포머를 활용한 문서 분류 예제와 함께, 정규식을 사용한 데이터 전처리 기법에 대해 자세히 설명하겠습니다.

1. 허깅페이스 트랜스포머란?

허깅페이스 트랜스포머(Hugging Face Transformers)는 자연어 처리(NLP)에서 주로 사용하는 여러 딥러닝 모델을 제공하는 Python 라이브러리입니다. BERT, GPT-2, T5 등 많은 최신 모델들이 포함되어 있으며, 사용자가 손쉽게 불러와 사용할 수 있도록 설계되었습니다. 이 라이브러리는 파이썬으로 되어 있어 데이터 과학자들과 연구자들이 널리 사용하고 있습니다.

2. 정규식과 전처리의 중요성

정규식(Regular Expression)은 문자열에서 특정 패턴을 찾아내거나 변환할 때 매우 유용한 도구입니다. 데이터를 모델에 입력하기 전에 정규식을 사용하여 불필요한 문자 제거, 패턴 매칭 등을 수행함으로써 데이터의 품질을 향상시킬 수 있습니다. 전처리는 모델의 성능에 직접적인 영향을 미치므로, 충분한 주의가 필요합니다.

3. 환경 설정

먼저, 허깅페이스 트랜스포머 및 필요한 라이브러리를 설치합니다. 아래 명령어를 실행하여 라이브러리를 설치합니다:

pip install transformers pandas re

4. 데이터 준비

이번 예제에서는 감정 분석을 위해 간단한 데이터셋을 사용하겠습니다. 데이터는 긍정과 부정을 나타내는 문장으로 구성되어 있습니다.

import pandas as pd

data = {
    "text": [
        "이 제품은 정말 좋아요!",
        "별로예요. 아주 실망했습니다.",
        "나쁘지 않은 제품이에요.",
        "환불이 되었으면 좋겠습니다.",
        "정말 기대 이상이에요!",
    ],
    "label": [1, 0, 1, 0, 1]  # 1: 긍정, 0: 부정
}

df = pd.DataFrame(data)
print(df)

5. 정규식을 활용한 데이터 전처리

다음으로, 정규식을 사용하여 데이터 전처리를 수행하겠습니다. 예를 들어, 특수 문자나 숫자를 제거하고, 모든 문자를 소문자로 변환하는 작업을 진행합니다.

import re

def preprocess_text(text):
    # 소문자로 변환
    text = text.lower()
    # 특수 문자와 숫자 제거
    text = re.sub(r'[^a-z가-힣\s]', '', text)
    return text

df['cleaned_text'] = df['text'].apply(preprocess_text)
print(df[['text', 'cleaned_text']])

6. 허깅페이스 트랜스포머를 활용한 모델 학습

전처리가 완료된 후, 트랜스포머 모델을 사용하여 감정 분석을 위한 모델을 학습하겠습니다. 아래는 BERT 모델을 사용하는 예제 코드입니다.

from transformers import BertTokenizer, BertForSequenceClassification
from transformers import Trainer, TrainingArguments
import torch
from sklearn.model_selection import train_test_split

# 데이터 분할
X_train, X_test, y_train, y_test = train_test_split(df['cleaned_text'], df['label'], test_size=0.2, random_state=42)

# BERT 토크나이저와 모델 로드
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)

# 데이터 토크나이즈
train_encodings = tokenizer(X_train.tolist(), padding=True, truncation=True, return_tensors='pt')
test_encodings = tokenizer(X_test.tolist(), padding=True, truncation=True, return_tensors='pt')

# PyTorch 데이터셋 클래스 정의
class TextDataset(torch.utils.data.Dataset):
    def __init__(self, encodings, labels):
        self.encodings = encodings
        self.labels = labels

    def __getitem__(self, idx):
        item = {key: torch.tensor(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)

# 데이터셋 준비
train_dataset = TextDataset(train_encodings, y_train.tolist())
test_dataset = TextDataset(test_encodings, y_test.tolist())

# 트레이닝 인자 설정
training_args = TrainingArguments(
    output_dir='./results',
    num_train_epochs=3,
    per_device_train_batch_size=4,
    per_device_eval_batch_size=4,
    warmup_steps=500,
    weight_decay=0.01,
    logging_dir='./logs',
)

# 트레이너 정의
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=test_dataset,
)

# 모델 학습
trainer.train()

7. 모델 평가

모델 학습이 완료되면, 평가를 통해 모델의 성능을 확인할 수 있습니다. 정확도를 계산하고, 혼돈행렬을 시각화하여 모델의 성능을 분석합니다.

from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns

# 예측 수행
predictions = trainer.predict(test_dataset)
preds = predictions.predictions.argmax(-1)

# 정확도 계산
accuracy = accuracy_score(y_test, preds)
print(f'Accuracy: {accuracy:.2f}')

# 혼돈 행렬 시각화
cm = confusion_matrix(y_test, preds)
plt.figure(figsize=(8, 6))
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=['Negative', 'Positive'], yticklabels=['Negative', 'Positive'])
plt.ylabel('Actual')
plt.xlabel('Predicted')
plt.title('Confusion Matrix')
plt.show()

8. 결론

이번 강좌에서는 허깅페이스 트랜스포머 라이브러리를 활용한 기본적인 감정 분석 모델을 구축하는 방법을 설명했습니다. 정규식 전처리를 통해 데이터의 품질을 높이고, 트랜스포머 모델을 사용하여 높은 성능을 발휘할 수 있는 것을 보았습니다. 앞으로도 더욱 다양한 자연어 처리 기술을 활용한 프로젝트를 진행해보시면 좋을 것 같습니다.

감사합니다!