:: ai/nlp

NLP :: sentencepiece tokenizer 로 문장 토큰화하기

토람이 2021. 12. 14. 00:37

자연어처리 분야를 공부하다보면 tokenizer 를 자주 접하게 되는데,

이는 기계에 문장을 통째로 넣고 학습시키는 것보다는

의미 단위로 단어를 쪼개서 넣고 학습시키는 것이 성능에 더 좋기 때문이다.

 

그 중 Google 의 Sentencepiece tokenizer 는 사용하기도 쉽고 워낙 유명한지라 많이 쓰인다.

사용법을 알아보도록 하자!

 

 

0. install

sentencepiece 라이브러리가 없는 경우 설치해준다.

 

pip install sentencepiece

 

1. train

토크나이저도 학습이 필요하다.

학습 문장들을 토대로 문장을 쪼개는 방식을 학습하는 것이다.

 

텍스트 파일 학습 model, vocab
파일

 

문장들이 나열된 텍스트 파일을 넣고 학습시키면 model, vocab 파일을 떨구는데,

model 이 실제 토크나이징을 하고, vocab 은 토크나이징 할 때 참조하는 단어집합이다.

 

model, vocab 은 한 번 만들어두면 이후에는 계속해서 load 해서 쓸 수 있다.

 

import sentencepiece as spm

spm.SentencePieceTrainer.Train(
	'--input=input.txt \
    --model_prefix=toramko \
    --vocab_size=100000 \
    --max_sentence_length=1000
    )

 

위와 유사하게 학습을 시킨다.

현재 경로에 있는 input.txt 파일을 읽어들여서

- toramko.model

- toramko.vocab

파일을 생성하게 된다.

 

 

2. model load

토크나이징을 진행하기에 앞서, 생성한 model 을 불러온다.

 

sp = spm.SentencePieceProcessor()
sp.Load('toramko.model')


# True

 

로딩이 잘 되면 "True" 라고 뜰 것이다.

 

 

3. tokenize

이제 불러온 모델을 가지고 토큰화를 진행한다.

 

<encode>

1) EncodeAsPieces

tokens = sp.EncodeAsPieces('I want to be rich.')

# ['▁I', '▁want', '▁to', '▁be', '▁rich', '.']

 

테스트 문장 하나를 넣고 결과를 확인해보았다ㅎ_ㅎ

문장을 토큰으로 잘게 쪼갠 뒤 list 로 반환하는 걸 알 수 있다.

 

2) EncodeAsIds

sp.EncodeAsIds('I want to be rich.')

# [17, 144, 7, 22, 2761, 5]

 

EncodeAsIds 를 사용하면 이렇게 id 형식으로 토큰이 반환된다.

각각은 위에 EncodeAsPieces 의 결과 단어에 대응되는 id 값이다. ('_I': 17, '_want': 144)

그리고 이런 {단어: id} 대응값을 사전으로 저장한 것이 아까 생성된 toramko.vocab 파일이다.

 

 

<decode>

문장을 잘게 쪼개는 게 encode 였다면, 쪼개져있는 토큰을 다시 모아서 합치는 게(문장화) decode!

 

1) DecodePieces

sp.DecodePieces(['▁I', '▁want', '▁to', '▁be', '▁rich', '.'])

# 'I want to be rich.'

 

2) DecodeIds

마찬가지로 Id 를 기준으로 decode 할 수 있다.

sp.DecodeIds([17, 144, 7, 22, 2761, 5])

# 'I want to be rich.'

 

 

요렇게 하면 기본적인 sentencepiece tokenizer 사용 끝!

300x250