본문 바로가기
대학원/NLP

텍스트 전처리 및 토큰화:BPE, wordpiece, unigram 을 중심으로subword tokenization 비교

by thrcle 2025. 3. 16.

 

1주차 OT를 마치고, 이번주부터 자연어처리 강의의 본격적인 수업이 시작되었다! 

이번주는 텍스트 전처리 및 토큰화-BPE, wordpiece, unigram 을 중심으로subword tokenization에 대해 다루었다.


1.텍스트 전처리 과정

텍스트 전처리는 보통 텍스트정제, 토큰화, 불용어 제거, 정규화, 서브워드 토큰화 과정을 거친다.(순서는 바뀔 수 있음)

 

대표적으로 사용하는 전처리 패키지는 다음과 같다.

  • 기본전처리:re, string
  • 토큰화 및 NLP 전처리:PyKoSpacing, NLTK, spaCy, Mecab, SOYNLP
  • 서브워드 토큰화:SentencePiece, BERT Tokenizer
  • 추가 기능 : TextBlob(감성분석), fastText(단어 임베딩), word2vec

텍스트 정제

텍스트 정제 단계에서는 특수문자,html 태그, 이모지, 기타 기호 제거, 공백 처리, 오타 교정, 대소문자 통일 등을 적용하여 전처리해준다.

 

토큰화

토큰화는 텍스트를 작은 단위인 토큰단위로 나누는 작업이다.

토큰화의 단위는 형태소,단어, 글자, 문장 등 다양하다.

 

토크나이저를 구축하는 방법은 다음과 같다.

  • 공백 기준으로 나누기: 문장을 단순히 공백(띄어쓰기) 기준으로 쪼개서 단어 단위로 나누는 방법. (예: "나는 밥을 먹었다" → ["나는", "밥을", "먹었다"])
  • 정해진 규칙(정규표현식)으로 나누기: 특수문자나 숫자 같은 특정 패턴을 정해두고, 그 규칙에 맞춰 문장을 나누는 방법. (예: 문장 속에서 숫자나 기호 제거 후 단어만 남기기)
  • 사전(단어 목록) 기반으로 나누기: 미리 정의된 단어 목록을 활용해서 문장을 적절한 단어 단위로 나누는 방식. (예: "아이들이뛰어논다" → "아이들", "뛰어", "논다" 로 분리)
  • AI 모델 활용: 데이터셋에서 패턴을 학습한 모델을 이용해 문장을 적절한 단어 단위로 나누는 방법. (예: BPE, WordPiece 같은 기법 사용)

문장 분리에는 NLTK, KSS(한국어 문장 분리 모듈)를 사용할 수 있다.

형태소 토큰화는 NLTK, 한글 형태소 토큰화에는 KoNLPy가 사용되는데 이때 Okt, Mecab, 꼬꼬마(세종 말뭉치 기반 학습) 등을 사용하면 된다.

KoNLPy
- 한국어 자연어처리 라이브러리 (명사 추출, 형태소 분석, 품사 태깅 등 기능 제공)
- Okt,Mecab, Komoran, Hannaum, kkma 등 지원

SpaCy
- Cython 기반으로 개발된 자연어처리 오픈소스 라이브러리다.
- 성능은 KoNLPy와 비슷하나, 대용량 데이터를 빠르게 처리할 수 있다는 점에서 유용하지만 더 많은 리소스가 필요하다.

 

영어는 단어 토큰화를, 한국어는 교착어기에 형태소 분석기를 이용해 토큰화해주고 이때 서브토크나이저까지 수행해주는 것이 좋다.

 


2.단어 단위 토큰화의 문제점

기본적으로 NLP 모델이 단어 단위로 토큰화한다고 가정해보자.

예를 들어 "apple"이 훈련 데이터에 많이 등장했다면 모델이 잘 이해할 수 있지만 "pineapple"은 훈련 데이터에서 거의 등장하지 않았다면, 모델이 이 단어를 처음 보면 잘 이해하지 못할 것이다.

 

훈련 데이터에서 등장하지 않은 희귀한 단어가 나오면 모델이 처리하지 못하는 문제현상을  OOV(Out-Of-Vocabulary)라고 한다.


3.subword tokenization 

subword tokenization은 형태소 분석 토큰화의 한계와 OOV이슈를 해결할 수 있는 방법이다.

서브워드 토큰화는 하나의 단어를 빈번하게 사용되는 서브워드의 조합으로 나누어 토큰화한다.

 서브워드(subword) 기반 토큰화 기법을 사용하면, 희귀한 단어를 더 작은 단위로 나누어 학습할 수 있다. "pineapple"을 ["pine", "apple"] 로 나눠 해석하기 때문에 모델이 "pineapple"을 처음 봐도 "apple"이 포함되어 있으니 어느 정도 유추할 수 있게 되는 것이다.

 

토크나이저 학습이란

주어진 말뭉치에 대해 어떤 하위 단어를 선택하는 것이 가장 좋은지 식별하려는 통계적 프로세스인데, 통계적 프로세스 선택 시 사용되는 규칙에 따라 토큰화 알고리즘의 특성이 달라진다.

토크나이저 학습 프로세스는 데이터 수집 및 전처리 -> 초기 토큰사전 구축 -> 토크나이저 학습 -> 평가 및 튜닝 -> 저장 및 활용 순으로 이루어진다.

이때 토크나이저를 학습할 때 BPE(Byte Pair Encoding), wordpiece, unigram 등의 알고리즘을 선택하여 적용해준다.

 

  BPE WordPiece Unigram
주요 개념 자주 등장하는 문자 또는 문자 조합을 반복적으로 병합해서 새로운 서브워드를 만들어냄. BPE와 유사하지만, 병합할 때 확률을 고려하여 가장 좋은 조합을 선택함. 처음부터 여러 개의 서브워드 후보를 가지고 있고, 점차 확률이 낮은 토큰을 삭제하며 최적의 조합을 찾는 방식.
사전 구축 방식 단순 빈도 기반 빈도 + 확률 확률적으로 가장 좋은 서브워드만 남김
병합 기준 가장 많이 등장하는 문자 또는 서브워드 쌍을 병합 확률적으로 높은 빈도의 서브워드를 병합 전체 단어 집합을 고려하여 최적의 조합을 찾음
모델 크기 비교적 크다 비교적 크다 상대적으로 작다 (불필요한 토큰 제거)
토큰 분할 방식 왼쪽에서 오른쪽으로 점진적으로 병합 왼쪽에서 오른쪽으로 점진적으로 병합 가장 가능성이 높은 토큰 조합 선택
단점 초기에 학습된 병합 규칙을 변경하기 어려움(새로운 단어가 등장했을 때, 기존 단어들의 조합으로 표현됨) 특정 언어(예: 한글)에서 병합 방식이 비효율적일 수 있음 사전 구축 시 탐색 공간이 커서 연산량이 많음
장점 직관적이고 구현이 쉬움, 비교적 빠른 학습 가능 BPE보다 조금 더 세밀한 토큰 구성이 가능 다양한 분할 가능성 고려, 희귀 단어 처리 성능 우수
대표적인 활용 사례 GPT, RoBERTa 등 BERT, DistilBERT 등 SentencePiece 기반 모델 (T5, ALBERT 등)

4. 토크나이징 과정

BPE

  1. 초기 상태 (각 글자를 개별 토큰으로 시작) 
  2. ['바', '나', '나', '맛', '우', '유', '에', '서', ' ', '잘', '익', '은', ' ', '바', '나', '나', ' ', '맛', '이', ' ', '난', '다']
  3. Corpus에서 가장 자주 등장하는 문자 쌍을 병합 (병합이 가능할 때까지 계속 진행) 
  • ('바' + '나') → "바나"
  • ('바나' + '나') → "바나나"
  1. ['바나나', '맛', '우', '유', '에서', ' ', '잘', '익은', ' ', '바나나', ' ', '맛이', ' ', '난다']
    
  2. 더 병합할 수 있다면 진행
  • ('맛' + '우유') → "맛우유"
  • ('잘' + '익은') → "잘익은"
  1. ['바나나맛우유', '에서', ' ', '잘익은', ' ', '바나나', ' ', '맛이', ' ', '난다']
    
  • 자주 등장하는 단어는 하나의 토큰으로 유지 → "바나나맛우유", "잘익은", "바나나"
  • 병합 과정이 Corpus에서 학습한 빈도에 따라 다름 → Corpus에 "바나나맛우유"가 자주 등장했다면 그대로 유지.

WordPiece

  1. 초기 상태 (각 글자 단위 토큰화)
    ['바', '##나', '##나', '맛', '우', '##유', '에서', ' ', '잘', '##익', '##은', ' ', '바', '##나', '##나', ' ', '맛', '##이', ' ', '난', '##다']
    
  2. Corpus에서 자주 등장하는 서브워드를 유지하면서 병합
  • "바나나"는 자주 등장 → "바나나"로 병합
  • "맛우유"는 희귀하므로 "맛" + "##우유"로 분할
  1. ['바나나', '맛', '##우유', '에서', ' ', '잘', '##익', '##은', ' ', '바나나', ' ', '맛', '##이', ' ', '난', '##다']
    
  • "바나나" 같은 단어는 병합되지만 "맛우유"는 "맛" + "##우유"처럼 쪼개질 수 있다.
  • "##"이 붙은 부분은 앞의 토큰과 이어진다는 의미이다.
  • Corpus에 있는 단어를 기준으로 병합이 결정되므로, 희귀한 조합은 작은 단위로 쪼개질 가능성이 있다.

Unigram

  1. 미리 학습된 서브워드 사전 기반으로 단어를 분할
    ['바나나', '맛우유', '에서', ' ', '잘익은', ' ', '바나나', ' ', '맛이', ' ', '난다']
    
  • 자주 등장하는 서브워드를 유지하려는 경향이 있다.
  • "바나나", "맛우유" 같은 단어가 Corpus에서 자주 등장했다면 그대로 유지될 가능성이 크다.
  • Corpus에 적게 등장한 경우 "맛우유"가 "맛" + "우유"로 나뉠 수도 있다.

알고리즘별 토크나이징 결과 비교

BPE ['바나나맛우유', '에서', '잘익은', '바나나', '맛이', '난다']
WordPiece ['바나나', '맛', '##우유', '에서', '잘', '##익', '##은', '바나나', '맛', '##이', '난', '##다']
Unigram ['바나나', '맛우유', '에서', '잘익은', '바나나', '맛이', '난다']

 


5. 토크나이징 결과에 영향을 주는 요소

- 같은 알고리즘이어도 학습데이터, vocab size, 기본 토큰화 방식, 병합횟스, 특수 토큰 포함여부, pre-tokenization 설정 등에 따라 토큰화 결과가 달라질 수 있다.

 

학습데이터 

같은 BPE알고리즘이라고 해도 학습데이터셋이 한식 위주인지, 양식 위주인지에 따라 토큰결과가 달라질 수 있다. 

예를 들어 
corpus_A=["국물맛이 얼큰하고 감칠맛이 있다". "불고기와 김치찌개가 인기 많다". "된장찌개 국물맛이 구수하다."]
corpus_B=["스테이크가 부드럽고 풍미가 깊다.", "파스타의 크림 소스가 맛있고 고소하다.","햄버거는 패티가 두툼해야 맛있다."]

Corpus A를 학습한 BPE -> ["국물맛이"]  Corpus B를 학습한 BPE -> ["국물", "맛이"] ("국물맛이"가 희귀 단어)

 

 

 

vocab size
- 모델이 사용할 단어 또는 서브워드의 개수를 의미한다. Vocab Size가 작으면 긴 단어 유지, 크면 작은 단위로 분할된다.
- 기본적으로 초기 문자 단위 토큰 개수 + 병합 횟수 = 최종 vocab size
- vocab size를 크게 설정하면 의미를 더 잘 유지하지만, 모델의 크기가 커지고 학습이 느려진다는 단점이 있다.
- vocab size를 작게 설정하면 모델의 크기가 작고 빠르지만 의미가 깨질 가능성이 있다
ex.
vocab_size=50,000 -> ["나는", "오늘", "떡볶이를", "먹었다"]
vocab_size=10,000 -> ["나는", "오늘", "떡볶", "이를", "먹었다"]
vocab_size=2,000 -> ["나", "는", "오", "늘", "떡", "볶", "이", "를", "먹", "었", "다"]

 


언제 어떤 방법을 선택해야 할까?

식당 리뷰의 일부를 학습시켜 각각의 알고리즘별 토큰화 결과를 비교해보았다. (vocab_size=3,000)

단짠, 새콤달콤, 맵칼, 쫠깃 등의 처리 방식 차이가 눈에 띈다.

 

BPE는 문자 병합 방식이라 서브워드 길이가 균일

WordPiece는 ## 접두사를 사용해서 기존 단어의 일부임을 표시

Unigram은 확률 기반으로 어절 단위를 최대한 유지하면서 확률적으로 최적의 토큰을 선택하여 의미 있는 단어를 유지한다.


6.활용

 희귀 단어를 효과적으로 다루고, 새로운 단어에 적응할 수 있도록 하기 위해 LLM에서 WordPiece나 BPE를 사용한다.

  • BERT: WordPiece를 사용한다. 예를 들어 "unhappiness" 같은 단어를 ["un", "##happiness"]로 나누어 학습한다.
  • GPT: BPE를 사용한다.. 예를 들어 "internationalization" 같은 긴 단어를 ["international", "##ization"]으로 나누어 학습한다.

- "요즘은 NLP 엔지니어링 기법을 잘 몰라도, GPT가 알아서 척척 해주는 시대인데, 이런 전처리 기법을 공부하는 것이 어떤 의미가 있을까?" 에 대해 생각해보았다. 이에 대한 해답은 선형대수 수업에서 찾았는데, 결국 어떻게 돌아가는지, 매커니즘에 대해 알아야 수행을 시키고 개선 포인트를 찾아낼 수 있다.  

 


수업 내용을 정리하면서 느낀 포인트는 2가지이다.

 

point 1. 한글은 교착어다. 

- "교착어"라는 것은, 단어(어근)에 문법적 요소(조사, 어미 등)를 붙여서 문장을 구성하는 언어라는 의미이다.(아주 다양한 조합이 가능하다..)
- 이 때문에 한국어는 단어 경계가 불명확하고, 다양한 변형이 가능해서 영어보다 토큰화하기 어렵다.
- 한국어 자연어 처리를 할 때는 형태소 분석기와 서브워드 토크나이징을 함께 고려해야 한다!

 

point 2. subword tokenization의 의미

- 과거부터 사용되었지만, 여전히 최신 LLM(GPT-4, Claude, Llama)에서도 필수적인 역할을 하고 있다.

- GPT-4, BERT, Llama 같은 최신 모델들도 BPE, WordPiece, Unigram을 사용 중!
- 서브워드 토크나이징을 대체할 새로운 기술이 연구되고 있지만, 아직까지 대체되지 않은 좋은 방법.

- oov문제 해결, 모델의 크기와 연산량 감소, 띄어쓰기가 명확하지 않은 언어에 효과적이라는 장점이 있다.

 

*참고)서브워드 토크나이징의 발전 과정

시기 주요 기법 사용 모델
2000년대 초반 형태소 분석 기반 토크나이징 KoNLPy, Mecab, Kkma
2013년 BPE (Byte Pair Encoding) 등장 번역 모델 (Sennrich et al., 2015)
2016년 WordPiece 도입 BERT
2018년 Unigram 사용 T5, ALBERT
2020년 이후 다양한 하이브리드 방식