감정분석이란 텍스트 내에는 사람의 감정이 표현되지 않지만 어떠한 특정 단어와 문장의 흐름을 통해 식별할 수 있다.
이를 분석하는 것이 감정분석이며, 감정 및 평가를 식별하는 자연어 처리의 한 분야이다.
이번에는 감정분석 라이브러리 중 하나인 BERT에 대해 공부해보려고 한다.
BERT의 주요 특징은
1. 양방향 인코딩이 가능한 점이 있다. 텍스트의 앞뒤 문맥을 고려해서 해당 단어가 문장에서 어떤 의미를 가지고 있는지를 구별한다. 예를 들어 동음이의어인 사과가 있다면, 너에게 사과할게 / 사과는 빨개 같은 서로 다른 의미를 해석할 수 있다.
2. 대규모 데이터셋이 이미 훈련되어 있기 때문에 사용자가 잘 조절한다면 효율적으로 사용이 가능하다.
3. NLP에는 RNN/LSTM 구조가 들어가게 되는데 여기서 추가 병렬 처리가 가능하여 빠른 학습이 가능하다.
4. Google 오픈 소스로 되어 있어 쉽게 사용 가능하다.
1. 먼저 데이터 셋을 불러온다. 넘파이도 사용하여 연습용과 검증용 데이터셋을 나누어준다.
# 데이터 로드 및 전처리
df = pd.read_csv('sentiment_data.csv')
train_texts, val_texts, train_labels, val_labels = train_test_split(
df.text.to_numpy(), df.label.to_numpy(), test_size=0.1, random_state=42)
2. 텍스트와 라벨을 토큰화하고 텐서로 변환하는 SentimentDataset 클래스를 정의한다.
# 데이터셋 클래스 정의
class SentimentDataset(Dataset):
def __init__(self, texts, labels, tokenizer, max_len):
self.texts = texts
self.labels = labels
self.tokenizer = tokenizer
self.max_len = max_len
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
text = self.texts[idx]
label = self.labels[idx]
encoding = self.tokenizer.encode_plus(
text,
add_special_tokens=True,
max_length=self.max_len,
return_token_type_ids=False,
padding='max_length',
return_attention_mask=True,
return_tensors='pt',
)
return {
'text': text,
'input_ids': encoding['input_ids'].flatten(),
'attention_mask': encoding['attention_mask'].flatten(),
'label': torch.tensor(label, dtype=torch.long)
}
3. 사전 학습된 BERT 라이브러리를 통해서 토크나이저와 모델을 로드한다.
# BERT 토크나이저 및 모델 로드
PRE_TRAINED_MODEL_NAME = 'bert-base-uncased'
tokenizer = BertTokenizer.from_pretrained(PRE_TRAINED_MODEL_NAME)
model = BertForSequenceClassification.from_pretrained(PRE_TRAINED_MODEL_NAME, num_labels=2)
4. 하이퍼 파라미터를 설정하고, 준비해둔 SentimentDataset 클래스에 데이터셋을 준비 시켜준다.
# 하이퍼파라미터 설정
BATCH_SIZE = 16
EPOCHS = 4
MAX_LEN = 128
LEARNING_RATE = 2e-5
# 데이터셋 준비
train_dataset = SentimentDataset(train_texts, train_labels, tokenizer, MAX_LEN)
val_dataset = SentimentDataset(val_texts, val_labels, tokenizer, MAX_LEN)
train_dataloader = DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True)
val_dataloader = DataLoader(val_dataset, batch_size=BATCH_SIZE)
5. 옵티마이저와 스케줄러 설정 및 GPU cuda 설정
# 옵티마이저와 학습률 스케줄러 설정
optimizer = AdamW(model.parameters(), lr=LEARNING_RATE, correct_bias=False)
total_steps = len(train_dataloader) * EPOCHS
scheduler = get_linear_schedule_with_warmup(optimizer, num_warmup_steps=0, num_training_steps=total_steps)
# GPU 사용 설정
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
6. 학습 함수를 통해 모델을 만들어서 평가 함수로 모델 평가를 진행한다. (ChatGPT)
# 학습 함수 정의
def train_epoch(model, dataloader, optimizer, device, scheduler):
model = model.train()
losses = []
correct_predictions = 0
for batch in dataloader:
input_ids = batch['input_ids'].to(device)
attention_mask = batch['attention_mask'].to(device)
labels = batch['label'].to(device)
outputs = model(input_ids=input_ids, attention_mask=attention_mask, labels=labels)
loss = outputs.loss
logits = outputs.logits
_, preds = torch.max(logits, dim=1)
correct_predictions += torch.sum(preds == labels)
losses.append(loss.item())
loss.backward()
optimizer.step()
scheduler.step()
optimizer.zero_grad()
return correct_predictions.double() / len(dataloader.dataset), np.mean(losses)
# 평가 함수 정의
def eval_model(model, dataloader, device):
model = model.eval()
losses = []
correct_predictions = 0
with torch.no_grad():
for batch in dataloader:
input_ids = batch['input_ids'].to(device)
attention_mask = batch['attention_mask'].to(device)
labels = batch['label'].to(device)
outputs = model(input_ids=input_ids, attention_mask=attention_mask, labels=labels)
loss = outputs.loss
logits = outputs.logits
_, preds = torch.max(logits, dim=1)
correct_predictions += torch.sum(preds == labels)
losses.append(loss.item())
return correct_predictions.double() / len(dataloader.dataset), np.mean(losses)
7. 에포크를 반복하거나 증가시키며 모델을 학습시키고 검증한다. (에포크는 여러번의 학습, 최적의 복습 방법 선택)
# 학습 및 평가 실행
for epoch in range(EPOCHS):
print(f'Epoch {epoch + 1}/{EPOCHS}')
train_acc, train_loss = train_epoch(model, train_dataloader, optimizer, device, scheduler)
val_acc, val_loss = eval_model(model, val_dataloader, device)
print(f'Train loss: {train_loss}, accuracy: {train_acc}')
print(f'Validation loss: {val_loss}, accuracy: {val_acc}')
출처:
https://yeong-jin-data-blog.tistory.com/entry/Transfomer-BERT
BERT 기본 개념
📚 BERT : Bidirectional Encoder Representation from Transfomer ✅ BERT 개요 📌 BERT 란? 이미지 분석에서 사전학습 모형을 사용하는 것처럼 텍스트 데이터를 미리 학습한 사전학습 모델이다. BooksCorpus (800M words)
yeong-jin-data-blog.tistory.com
https://blog.hashscraper.com/bert-text-sentiment-analysis-tutorial/
BERT를 활용한 텍스트 감정분석 간단 가이드
BERT를 사용한 텍스트 감정분석의 기본 원리와 코드 예제를 확인해보세요.
blog.hashscraper.com
'Scientist > ML.DL' 카테고리의 다른 글
[ML/DL] NLP TF-IDF / Word2Vec (0) | 2024.07.18 |
---|---|
[ML/DL] NLP 토크나이저 종류 (0) | 2024.07.17 |
[ML/DL] NLP 단어 가방 모형 (0) | 2024.07.15 |
[ML/DL] Boosting 알고리즘 - XGBoost (1) | 2024.07.12 |
[ML/DL] 선형회귀분석 변수선택법 + 다중공선성, VIF (0) | 2024.07.12 |