SentencePiece
센텐스피스
언어 독립적 서브워드 토큰화 라이브러리. BPE, Unigram 알고리즘 지원. BERT, T5, LLaMA 등에서 사용.
센텐스피스
언어 독립적 서브워드 토큰화 라이브러리. BPE, Unigram 알고리즘 지원. BERT, T5, LLaMA 등에서 사용.
SentencePiece는 Google에서 개발한 언어 독립적인 서브워드 토큰화 라이브러리입니다. 텍스트를 의미 있는 작은 단위(서브워드)로 분할하여 모델이 효율적으로 처리할 수 있게 합니다. "사전 토큰화(pre-tokenization)" 없이 원시 텍스트에서 직접 학습할 수 있는 것이 핵심 특징입니다.
2018년 논문 "SentencePiece: A simple and language independent subword tokenizer"로 발표되었습니다. 기존 BPE(Byte Pair Encoding)나 WordPiece는 공백 기반 언어(영어)에 최적화되어 있었지만, SentencePiece는 공백이 없는 한국어, 일본어, 중국어도 동일하게 처리합니다.
두 가지 알고리즘을 지원합니다. BPE는 가장 빈번한 문자 쌍을 반복 병합하고, Unigram LM은 확률 기반으로 최적 분할을 찾습니다. 예를 들어 "인공지능"은 ["▁인공", "지능"] 또는 ["▁인", "공", "지", "능"]으로 분할될 수 있으며, ▁는 공백 위치를 나타냅니다.
T5, ALBERT, XLNet, LLaMA, Gemma 등 주요 LLM이 SentencePiece를 사용합니다. 32K~100K 어휘 크기가 일반적이며, 어휘 크기가 클수록 압축률이 높지만 임베딩 테이블이 커집니다. 한국어 NLP에서는 거의 필수적인 전처리 도구입니다.
# SentencePiece 토큰화 예제
import sentencepiece as spm
# 1. 모델 학습 (BPE 알고리즘, 32K 어휘)
spm.SentencePieceTrainer.train(
input='corpus.txt', # 학습 텍스트 파일
model_prefix='tokenizer', # 출력 파일명
vocab_size=32000, # 어휘 크기
model_type='bpe', # 'bpe' 또는 'unigram'
character_coverage=0.9995, # 한국어는 0.9995 권장
pad_id=0, unk_id=1, bos_id=2, eos_id=3
)
# 2. 학습된 모델 로드
sp = spm.SentencePieceProcessor()
sp.load('tokenizer.model')
# 3. 토큰화 (텍스트 → 토큰)
text = "인공지능이 세상을 바꾸고 있습니다."
tokens = sp.encode_as_pieces(text)
print(tokens) # ['▁인공', '지능', '이', '▁세상', '을', '▁바꾸', '고', '▁있습니다', '.']
# 4. 토큰 → ID 변환
ids = sp.encode_as_ids(text)
print(ids) # [1234, 5678, 23, 9012, ...]
# 5. ID → 텍스트 복원
decoded = sp.decode(ids)
print(decoded) # "인공지능이 세상을 바꾸고 있습니다."
# 6. Hugging Face Transformers와 함께 사용
from transformers import T5Tokenizer
tokenizer = T5Tokenizer.from_pretrained('t5-base')
# T5Tokenizer는 내부적으로 SentencePiece 사용
"한국어 토크나이저는 SentencePiece Unigram으로 학습하죠. character_coverage 0.9995로 설정하면 한글 자모까지 커버되고, 어휘 크기는 32K면 충분합니다. BPE보다 Unigram이 형태소 경계를 더 잘 잡아요."
"SentencePiece의 핵심은 언어 독립적이라는 점입니다. 공백 기반 pre-tokenization 없이 원시 텍스트에서 바로 학습하기 때문에 한국어, 일본어 같은 교착어도 영어와 동일하게 처리할 수 있습니다. LLaMA, T5 등 대부분의 LLM이 사용합니다."
"OpenAI는 tiktoken(BPE 기반), Google은 SentencePiece를 씁니다. 직접 학습하려면 SentencePiece가 편하고, 다국어 모델이면 Unigram 모드가 성능이 좋아요. 어휘 크기는 압축률과 모델 크기 트레이드오프를 고려해서 32K~64K 사이로 정하세요."
뉴스로 학습한 토크나이저를 코드나 의료 텍스트에 쓰면 OOV(미등록 단어)가 급증합니다. 도메인별로 토크나이저를 학습하거나 혼합 코퍼스를 사용하세요.
vocab_size가 작으면 긴 단어가 많은 토큰으로 분할되어 시퀀스 길이가 늘어납니다. 한국어는 최소 32K, 다국어는 64K 이상 권장합니다.
실제 서비스 데이터와 유사한 코퍼스로 학습하고, character_coverage는 0.9995 이상으로 설정하세요. BPE vs Unigram은 실험으로 비교하되, 다국어면 Unigram을 먼저 시도하세요.