딥러닝 모델은 데이터를 통해 학습을 하므로, 입력 데이터를 적절하게 준비하는 것은 매우 중요합니다. 특히 자연어 처리(NLP)와 같은 분야에서는 텍스트 데이터를 다루기 위해 전처리 및 토큰화 과정이 필수적입니다. 본 강좌에서는 파이토치(PyTorch)를 활용하여 데이터 전처리 및 토큰화의 개념과 실습을 다뤄보겠습니다.
1. 데이터 전처리의 중요성
데이터 전처리는 원시 데이터를 수집하여 모델 학습에 적합하도록 변환하는 과정입니다. 이는 다음과 같은 이유로 중요합니다:
- 노이즈 감소: 원시 데이터에는 종종 필요하지 않은 정보가 포함되어 있습니다. 전처리는 이 정보를 제거하여 모델의 성능을 개선합니다.
- 일관성 유지: 다양한 형식의 데이터를 일관된 형식으로 변환하여 모델이 데이터를 이해하기 쉽게 만듭니다.
- 속도 향상: 불필요한 데이터의 양을 줄이면 학습 속도가 빨라질 수 있습니다.
2. 전처리 과정
데이터 전처리는 보통 다음과 같은 단계를 포함합니다:
- 텍스트 정제: 대문자 변환, 구두점 제거, 불용어 처리 등
- 정규화: 동일한 의미의 단어를 통일(예: “부자”, “부유한” → “부자”)
- 토큰화: 문장을 단어 또는 서브워드 단위로 나누기
2.1 텍스트 정제
텍스트 정제는 노이즈를 줄이고 일관된 형식을 갖도록 만드는 과정입니다. Python의 정규 표현식 라이브러리를 사용하여 이러한 작업을 수행할 수 있습니다.
import re
def clean_text(text):
# 소문자로 변환
text = text.lower()
# 구두점 제거
text = re.sub(r'[^a-z0-9\s]', '', text)
return text
sample_text = "안녕하세요! 딥러닝의 세계에 오신 것을 환영합니다. #딥러닝 #파이썬"
cleaned_text = clean_text(sample_text)
print(cleaned_text) # "안녕하세요 딥러닝의 세계에 오신 것을 환영합니다 딥러닝 파이썬"
2.2 정규화
정규화는 의미적으로 유사한 단어들을 통일하는 작업입니다. 예를 들어, ‘좋다’, ‘좋아요’, ‘좋은’과 같은 단어를 ‘좋음’으로 통일할 수 있습니다. 사전 정의된 규칙을 사용하여 이러한 변환을 수행할 수 있습니다.
def normalize_text(text):
normalization_map = {
'좋다': '좋음',
'좋아요': '좋음',
'좋은': '좋음',
}
words = text.split()
normalized_words = [normalization_map.get(word, word) for word in words]
return ' '.join(normalized_words)
normalized_text = normalize_text("이 영화는 아주 좋다. 정말 좋은 일이다.")
print(normalized_text) # "이 영화는 아주 좋음. 정말 좋음 일이다."
3. 토큰화(Tokenization)
텍스트를 단어 또는 서브워드 단위로 나누는 과정입니다. 토큰화는 일반적으로 NLP의 첫 번째 단계로 사용됩니다. 단어 토큰화, 서브워드 토큰화 등 다양한 방법이 있습니다.
3.1 단어 기반 토큰화
가장 기본적인 형태의 토큰화로, 공백을 기준으로 문장을 나누는 방법입니다. Python의 내장 함수를 사용하여 쉽게 구현할 수 있습니다.
def word_tokenize(text):
return text.split()
tokens = word_tokenize(normalized_text)
print(tokens) # ['이', '영화는', '아주', '좋음.', '정말', '좋음', '일이다.']
3.2 서브워드 기반 토큰화
서브워드 토큰화는 BERT와 같은 최신 모델에서 널리 사용되는 방법입니다. 이는 단어를 더욱 작은 단위로 분해하여 희귀 단어 문제를 완화합니다. 파이썬의 SentencePiece
라이브러리를 사용할 수 있습니다.
!pip install sentencepiece
import sentencepiece as spm
# 서브워드 모델 학습
spm.SentencePieceTrainer.Train('--input=corpus.txt --model_prefix=m --vocab_size=5000')
# 모델 로드 및 토큰화
sp = spm.SentencePieceProcessor()
sp.load('m.model')
text = "안녕하세요, 딥러닝을 배우고 있습니다."
subword_tokens = sp.encode(text, out_type=str)
print(subword_tokens) # ['▁안녕', '하', '세', '요', ',', '▁딥', '러', '닝', '을', '▁배우', '고', '▁있', '습', '니다', '.']
4. 데이터셋 준비와 파이토치(DataLoader) 활용
위에서 정제 및 토큰화한 데이터를 사용하여 파이토치의 데이터셋으로 변환할 수 있습니다. 이는 딥러닝 모델 학습 시, 배치 처리를 용이하게 해줍니다.
import torch
from torch.utils.data import Dataset, DataLoader
class TextDataset(Dataset):
def __init__(self, texts, labels):
self.texts = texts
self.labels = labels
def __len__(self):
return len(self.texts)
def __getitem__(self, idx):
return self.texts[idx], self.labels[idx]
texts = ["이 영화는 좋음", "이 영화는 별로다"]
labels = [1, 0] # 긍정: 1, 부정: 0
dataset = TextDataset(texts, labels)
data_loader = DataLoader(dataset, batch_size=2, shuffle=True)
for batch in data_loader:
print(batch) # (['이 영화는 좋음', '이 영화는 별로다'], [1, 0])
5. 결론
본 강좌에서는 파이토치를 사용하여 텍스트 데이터의 전처리와 토큰화에 대해 알아보았습니다. 데이터 전처리와 토큰화는 딥러닝 모델의 성능에 직접적인 영향을 미치는 만큼, 반드시 숙지해야 할 기초 지식입니다. 이를 바탕으로 차후에는 실제 모델 구축 및 학습 과정에 대해 다루어 보겠습니다.
6. 참고 문헌
- Deep Learning, Ian Goodfellow et al.
- Natural Language Processing with PyTorch, Delip Rao and Graham Neubig
- PyTorch Data Processing Documentation