자연어 처리(NLP)에서 텍스트 데이터를 효율적으로 다루기 위해 사용하는 핵심 기술 중 하나가 서브워드 토큰화(Subword Tokenization)이다.
단어를 작은 단위로 분해하여 희귀 단어 문제를 해결하고, 모델의 일반화를 돕는다.
BPE는 가장 자주 등장하는 문자 쌍을 병합하는 방식으로 어휘를 점진적으로 확장한다.
GPT 및 RoBERTa와 같은 대규모 언어 모델에서 주로 사용된다.
초기 어휘: {"l", "o", "w", "lo", "low"}
병합 규칙 적용: "l"+"o" → "lo"
최종 어휘: {"lo", "w", "low"}
from tokenizers import Tokenizer, models, trainers
tokenizer = Tokenizer(models.BPE())
trainer = trainers.BpeTrainer(vocab_size=5000)
tokenizer.train(["data.txt"], trainer)
WordPiece는 각 서브워드의 확률을 계산하고, 이를 최대화하는 방식으로 어휘를 구성한다.
BERT와 같은 언어 모델에서 사용된다.
단어: "unbelievable"
서브워드: ["un", "##bel", "##ievable"]
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-uncased")
tokens = tokenizer.tokenize("unbelievable")
print(tokens)
# 출력: ['un', '##bel', '##ievable']
SentencePiece는 언어에 독립적인 서브워드 토큰화를 목표로 하며, 입력 텍스트의 전처리를 생략할 수 있다.
Google의 T5 및 ALBERT 모델에서 사용된다.
문장: "안녕하세요"
서브워드: ["▁안녕", "하세요"]
import sentencepiece as spm
spm.SentencePieceTrainer.train(input='data.txt', model_prefix='spm', vocab_size=5000)
sp = spm.SentencePieceProcessor(model_file='spm.model')
tokens = sp.encode("안녕하세요", out_type=str)
print(tokens)
# 출력: ['▁안녕', '하세요']
Unigram Language Model은 단어를 독립적으로 평가하며, 가장 적합한 서브워드를 선택한다.
XLNet과 같은 모델에서 사용된다.
단어: "복잡성"
서브워드: ["복", "잡", "성"]
from sentencepiece import SentencePieceProcessor
sp = SentencePieceProcessor(model_file='unigram.model')
tokens = sp.encode("복잡성", out_type=str)
print(tokens)
# 출력: ['복', '잡', '성']
서브워드 토큰화는 NLP 모델의 효율성을 극대화하는 핵심 기술이다.
BPE, WordPiece, SentencePiece 등 다양한 접근 방식이 있으며, 모델과 데이터의 특성에 따라 적절한 방법을 선택해야 한다.