728x90
반응형

1. 서론

딥러닝 기반 자연어처리(NLP) 기술이 발전하면서, 전처리(preprocessing) 도구 또한 언어에 종속되지 않고 재현 가능한 방식으로 진화하고 있습니다. 특히 NMT(Neural Machine Translation) 시스템에서는 다양한 언어를 동일한 구조로 다루기 위해 언어 독립적인 토크나이저가 필수입니다.

Google에서 발표한 SentencePiece 논문은 이러한 문제를 해결하기 위해 고안된 언어 비의존적인 서브워드 토크나이저입니다. 이 글에서는 해당 논문의 주요 내용을 요약하고, 간단한 실습 코드도 함께 소개합니다.


2. SentencePiece란?

SentencePiece는 입력 문장을 단순한 유니코드 시퀀스로 간주하고, 공백마저도 하나의 토큰으로 처리하는 언어 독립적인 서브워드 토크나이저입니다. 주로 NMT, T5와 같은 신경망 기반 텍스트 생성 시스템에 사용됩니다.

핵심 특징은 다음과 같습니다:

  • 언어 중립적 (언어별 규칙 없음)
  • 사전 토크나이징 불필요 (raw text로 학습 가능)
  • 손실 없는 토크나이징 가능
  • BPE 및 Unigram Language Model 지원

3. 핵심 구성 요소

SentencePiece는 4개의 주요 모둘로 구성됩니다:

  • Normalizer: 의미적으로 동일한 유니코드 문자를 정규화
    • 텍스트 입력이 서로 다르게 생겼더라도, 의미가 같으면 동일하게 처리하기 위해
    • 학습과 인코딩 과정의 재현성과 일관성을 보장하기 위해
    • 예:) 전각 문자를 반각 문자로 전환!
  • Trainer: 정규화된 텍스트로부터 서브워드 모델 학습
  • Encoder: 텍스트를 서브워드 시퀀스로 인코딩
  • Decoder: 서브워드 시퀀스를 다시 텍스트로 디코딩

Encoder/Decoder는 단순히 토큰화/디토큰화 기능만 수행하는 것이 아니라, ID 시퀀스 ↔ 텍스트 변환까지 지원합니다. 이로 인해 NMT 시스템과 바로 연결이 가능합니다.


4. 손실 없는 토크나이징 (Lossless Tokenization)

기존 토크나이저는 공백이나 구두점 정보를 완전히 복원하지 못하는 경우가 많습니다. SentencePiece는 이를 해결하기 위해 공백을 _ (U+2581)로 치환하여 토큰화합니다.

 

예시:

입력 문장: Hello world.
Tokenized: [▁Hello] [▁wor] [ld] [.]
Detokenized: Hello world.

 

Python 코드로 복원:

''.join(tokens).replace('▁', ' ')

 

이 방식은 어떤 언어든 공통으로 적용할 수 있는 가역적인 전처리 시스템을 가능하게 합니다.


5. 효율적인 서브워드 학습과 분절

기존 BPE 알고리즘은 기호 쌍을 매 반복마다 스캔하면서 O(N^2)의 시간 복잡도를 가집니다. SentencePiece는 우선순위 큐(binary heap)를 활용하여 O(NlogN) 알고리즘으로 최적화합니다.

또한 Unigram 모델은 입력 크기에 비례하는 선형 시간 복잡도를 갖습니다.

무엇보다도, 사전 토크나이징이 전혀 필요 없다는 점이 핵심 장점입니다.


6. 어휘 ID 및 문자 정규화

  • 어휘 크기는 -vocab_size로 지정
  • 특수 토큰 <unk>, <s>, </s>, <pad>에 대한 ID는 예약됨
  • 정규화는 기본적으로 NFKC 사용
  • 사용자 정의 정규화 규칙은 TSV로 제공 가능 (-normalization_rule_tsv)

이 정규화 과정은 Aho-Corasick 오토마타 기반으로 빠르게 수행됩니다.

 

여기서 Aho-Corasick(아호-코라식)이란 수십 ~ 수백 개의 문자열 패턴을 한 번에 탐색할 수 있게 해주는 알고리즘이라고 합니다. 자세한 내용은 생략하겠습니다.


7. Subword-nmt와의 비교

 

항목 subword-nmt SentencePiece
입력 형식 pre-tokenized 필요 raw text 지원
손실 없는 처리 불가능 (공백 정보 손실) 가능 (▁ 기호 사용)
정규화 외부 처리 필요 내장 정규화(NFKC 등) 지원
어휘 설정 방식 병합 횟수 기준 최종 어휘 크기 기준
언어 종속성 있음 없음 (언어 중립)

SentencePiece 실습 코드

다음은 간단한 SentencePiece 사용 예제입니다.

 

# 1. 설치
pip install sentencepiece
import sentencepiece as spm

# 2. 예제 텍스트 파일 생성
with open("example.txt", "w") as f:
    f.write("Hello world.\\nThis is SentencePiece.\\n안녕하세요 세상.\\n")

# 3. 모델 학습
spm.SentencePieceTrainer.train(
    input='example.txt', 
    model_prefix='spm', 
    vocab_size=100, 
    model_type='unigram', 
    character_coverage=1.0
)

# 4. 모델 로드 및 인코딩
sp = spm.SentencePieceProcessor()
sp.load('spm.model')

print("Original:", "Hello world.")
print("Encoded:", sp.encode("Hello world.", out_type=str))
print("IDs:", sp.encode("Hello world.", out_type=int))
print("Decoded:", sp.decode(sp.encode("Hello world.")))


마무리

SentencePiece는 단순한 토크나이징 알고리즘을 넘어서, 다양한 언어와 도메인에 적용 가능한 범용 서브워드 토크나이저로 자리 잡았습니다. 특히 정규화, 가역성, 언어 독립성 같은 강점을 바탕으로, Google의 T5, mT5, MarianMT, mBART와 같은 대표적인 신경망 기반 모델들의 토크나이징 시스템에 핵심적으로 사용되고 있습니다.

 

실제로 Hugging Face 라이브러리에서 제공하는 T5Tokenizer, MarianTokenizer 등도 내부적으로 SentencePiece 모델(.model 파일)을 불러와 처리하며, 사용자는 이를 몰라도 손쉽게 텍스트를 전처리하고 모델에 연결할 수 있습니다. 즉, Hugging Face의 Tokenizer는 SentencePiece를 랩핑(wrapping) 하여 모델에 최적화된 입출력을 제공하는 구조입니다.

 

이처럼 SentencePiece는 지금도 실전에서 널리 활용되며, 특히 다국어, 희귀어, 비공백 언어를 다루는 NLP 과제에서 강력하고 실용적인 선택지입니다. 토큰화 전처리를 직접 제어하거나 커스텀 서브워드 모델을 만들고자 한다면, SentencePiece는 지금도 가장 믿을 수 있는 도구 중 하나입니다.

정형화된 데이터를 넘어서, 진짜 '텍스트'를 다루고 싶다면 SentencePiece는 여전히 유효한 해답으로 보입니다.


 

728x90
반응형

+ Recent posts