안녕하세요! 오늘은 파이토치(PyTorch)를 이용해 나만의 감성 분석(Sentiment Analysis) 모델을 만들어보겠습니다. 감성 분석이란 주어진 텍스트의 감정(긍정, 부정, 중립 등)을 분석하는 작업으로, 요즘은 다양한 분야에서 활용되고 있습니다. 특히 내가 좋아하는 단어나 문장을 학습하여 개인적인 감성 분석 모델을 만드는 것은 매우 흥미로운 경험이 될 것입니다.
1. 데이터 만들기
우선, 파이토치 모델을 학습시키기 위한 데이터를 생성해야 합니다. 내가 좋아하는 단어와 문장을 가지고 긍정적 또는 부정적인 라벨을 붙여 데이터셋을 만들어 보겠습니다. 예를 들어, "이 영화 정말 좋다", "별로 재미없었다"와 같은 문장을 만들어볼 수 있습니다.
import pandas as pd
# 감정 데이터를 수동으로 생성합니다.
data = {
'text': [
'이 영화 정말 좋다',
'별로 재미없었다',
'이 책은 감동적이다',
'최악의 경험이었다',
'무척 좋은 시간이었다',
'다시는 보고 싶지 않다',
'정말 최고다, 추천해요!',
'그냥 그래요.',
'영화가 너무 지루했다',
'아주 만족스러웠습니다!'
],
'label': [1, 0, 1, 0, 1, 0, 1, 0, 0, 1] # 1: 긍정, 0: 부정
}
df = pd.DataFrame(data)
df.to_csv('sentiment_data.csv', index=False)
위의 코드를 실행하면, 'sentiment_data.csv'라는 파일에 내가 만든 감정 데이터가 저장됩니다. 이 파일에는 긍정적인 문장과 부정적인 문장이 각각 라벨 1과 0으로 표시되어 있습니다.
2. 데이터 전처리
이제 수집한 데이터를 모델에 알맞게 전처리해야 합니다. 텍스트 데이터를 숫자 형태로 변환하고, 패딩을 통해 동일한 길이로 맞춰주는 작업이 필요합니다. 이를 위해 토큰화(tokenization)와 텍스트를 숫자로 인코딩하는 과정을 거칩니다.
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
# 데이터를 불러옵니다
df = pd.read_csv('sentiment_data.csv')
# Train/Test Split
X_train, X_test, y_train, y_test = train_test_split(df['text'], df['label'], test_size=0.2, random_state=42)
# 토크나이저를 이용한 텍스트 벡터화
tokenizer = Tokenizer()
tokenizer.fit_on_texts(X_train)
X_train_seq = tokenizer.texts_to_sequences(X_train)
X_test_seq = tokenizer.texts_to_sequences(X_test)
# 패딩
max_len = 5 # 최대 문장 길이 설정
X_train_pad = pad_sequences(X_train_seq, maxlen=max_len, padding='post')
X_test_pad = pad_sequences(X_test_seq, maxlen=max_len, padding='post')
여기서 우리는 문장을 수치 벡터로 변환하고, 최대 길이를 5로 설정하여 짧은 문장들도 통일된 길이로 만들어 줍니다.
3. 모델 만들기
이제 모델을 만들어 보겠습니다. 간단한 LSTM(Long Short-Term Memory) 네트워크를 사용하여 텍스트의 감성을 분석할 수 있도록 합니다.
import torch
import torch.nn as nn
import torch.optim as optim
# LSTM 모델 정의
class SentimentModel(nn.Module):
def __init__(self, vocab_size, embedding_dim, hidden_dim):
super(SentimentModel, self).__init__()
self.embedding = nn.Embedding(vocab_size, embedding_dim)
self.lstm = nn.LSTM(embedding_dim, hidden_dim)
self.fc = nn.Linear(hidden_dim, 1)
def forward(self, x):
x = self.embedding(x)
x, (hn, cn) = self.lstm(x)
x = self.fc(hn[-1])
return torch.sigmoid(x)
# 모델 인스턴스 생성
model = SentimentModel(vocab_size=len(tokenizer.word_index) + 1, embedding_dim=8, hidden_dim=10)
criterion = nn.BCELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
위 코드에서 LSTM 모델을 정의했습니다. 임베딩 층을 통해 단어를 벡터로 변환하고, LSTM을 통해 이를 분석한 후 선형층을 통해 최종 출력값을 얻습니다.
4. 모델 학습
학습 데이터를 사용해 모델을 학습시켜 보겠습니다.
# 훈련 데이터 tensor로 변환
X_train_tensor = torch.tensor(X_train_pad, dtype=torch.long)
y_train_tensor = torch.tensor(y_train.values, dtype=torch.float32)
# 모델 학습
num_epochs = 100
for epoch in range(num_epochs):
model.train()
optimizer.zero_grad()
outputs = model(X_train_tensor)
loss = criterion(outputs.squeeze(), y_train_tensor)
loss.backward()
optimizer.step()
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
모델을 훈련하는 동안 에포크(Epoch)마다 손실(Loss)을 출력하여 학습이 잘 되고 있는지를 살펴볼 수 있습니다.
5. 모델 평가
마지막으로, 학습한 모델을 평가하여 정확도를 확인해보겠습니다.
# 평가 데이터 tensor로 변환
X_test_tensor = torch.tensor(X_test_pad, dtype=torch.long)
y_test_tensor = torch.tensor(y_test.values, dtype=torch.float32)
# 모델 평가
model.eval()
with torch.no_grad():
predictions = model(X_test_tensor)
predicted_labels = (predictions.squeeze() > 0.5).float()
accuracy = (predicted_labels == y_test_tensor).float().mean()
print(f'Accuracy: {accuracy.item() * 100:.2f}%')
위 코드를 통해 테스트 데이터에 대한 모델의 정확도를 확인할 수 있습니다. 내가 좋아하는 단어들을 학습한 나만의 감성 분석 모델로, 개인적인 문장이나 단어의 감정을 판단할 수 있게 되어 매우 유용하답니다!
마무리
지금까지 파이토치를 이용해 직접 데이터를 생성하고, 감성 분석 모델을 만들고 평가하는 과정을 살펴보았습니다. 개인적인 문장이나 단어를 학습하여 나만의 감성 분석 모델을 만들어보는 것은 흥미로운 경험일 것입니다. 앞으로도 다양한 프로젝트에 도전하시길 바랍니다!
'IT > Python' 카테고리의 다른 글
클로드 AI API를 연결하는 간단한 파이썬 예제 (0) | 2025.03.02 |
---|---|
Python으로 LangChain으로 GPT와 연결하기 (0) | 2025.03.01 |
이진 분류 문제 실습: 파이토치(PyTorch) 예제 (0) | 2025.03.01 |
나만의 숫자 분류기 만들기: 파이토치(PyTorch) 예제 (0) | 2025.02.28 |
파이썬 Falcon API 예제 및 설명 (0) | 2025.02.27 |