본문 바로가기

Programming/(Python)(Ubuntu)

구글: SentencePiece 사용법 Google: SentencePiece Tutorial

  • Python 3.6을 기반으로한 Conda env- 에서 작성하였습니다.
  • 패키지 설치 또한 Jupyter Lab 에서 진행하였습니다.

1. Sentence Piece 패키치 설치

# Conda 환경이여서 conda install
!conda install -c powerai sentencepiece -y
# python 환경이면 pip install
!pip install sentencepiece -y

 

실행 결과

 

2. vocab 모델 구현

 

Ex 2) 모델 구현 방법 2

 

실험적으로

  • 중국어, 일본어 같이 자소단위로 이루어진 언어(rich character set)에서는 0.9995
  • 다른언어(small character set)에 대해서 1로 설정
templates= '--input={} \
--pad_id={} \
--bos_id={} \
--eos_id={} \
--unk_id={} \
--model_prefix={} \
--vocab_size={} \
--character_coverage={} \
--model_type={}'


train_input_file = "파일 폴더/dialogues_train.txt"
pad_id=0  #<pad> token을 0으로 설정
vocab_size = 20000 # vocab 사이즈
prefix = 'botchan_spm' # 저장될 tokenizer 모델에 붙는 이름
bos_id=1 #<start> token을 1으로 설정
eos_id=2 #<end> token을 2으로 설정
unk_id=3 #<unknown> token을 3으로 설정
character_coverage = 1.0 # to reduce character set 
model_type ='word' # Choose from unigram (default), bpe, char, or word


cmd = templates.format(train_input_file,
                pad_id,
                bos_id,
                eos_id,
                unk_id,
                prefix,
                vocab_size,
                character_coverage,
                model_type)

 

 

3. Tokenizer 학습 및 불러오기

 

# Tokenizer 학습
import sentencepiece as spm

spm.SentencePieceTrainer.Train(cmd)

# --- output ---
#True

# 모델 불러오기
import sentencepiece as spm
sp = spm.SentencePieceProcessor()
sp.Load('m.model')

# --- output ---
#True

 

 

  • 모델 정보를 보기 위한 코드 1
# vocab 사이즈를 출력합니다.
print(sp.get_piece_size())

# 아이디는 piece로 piece는 아이디로 반환합니다.
print(sp.id_to_piece(209))
print(sp.piece_to_id('▁This'))

# 알수 없는 토큰의 겨우 0을 반환합니다.
print(sp.piece_to_id('__MUST_BE_UNKNOWN__'))

#<unk>, <pad> 등 정의에 따라 달라지 수 있습니다.
# 기본적으로 <unk>, <s>, </s> 는 (0, 1, 2) 이렇게 정의됩니다.
# <s> and </s> are defined as 'control' symbol.
for id in range(3):
  print(sp.id_to_piece(id), sp.is_control(id))
  
'''
  --- output ---
2000
▁This
209
0
<unk> False
<s> True
</s> True
'''

 

  • 모델 정보를 보기 위한 코드 2
with open('파일폴더/botchan_spm.vocab', encoding='utf-8') as f:
    Vo = [doc.strip().split("\t") for doc in f]

# w[0]: token name    
# w[1]: token score
word2idx = {w[0]: i for i, w in enumerate(Vo)}

'''
--- output ---
<pad> : 0
<s> : 1
...
'''

 

  • Tokenize하기 전에 데이터 자체에 <s>, </s>를 넣어줘도 되지만, 패키지 자체에서 알아서 해주는 옵션(sp.SetEncodeExtraOptions)이 있습니다.
# 문장 양 끝에 <s> , </s> 추가
sp.SetEncodeExtraOptions('bos:eos')

 

  • 기본적으로 입력 텍스트의 <s> </s>는 사용자가 <s>, </s> 를 넣어서 간접적으로 동작을 변경하는 경우를 방지하기 위해 BOS / EOS 로 인식되지 않습니다. 그러나 --user_defined_symbols='</s> 와 같이 설정하여 허용하게 만들 수 있습니다.
templates= '--input={} \
--pad_id={} \
--bos_id={} \
--eos_id={} \
--unk_id={} \
--model_prefix={} \
--vocab_size={} \
--character_coverage={} \
--model_type={}'
--user_defined_symbols = '</s>'

 

  • 그 다음에 tokenize를 수행하게 됩니다.
    • EncodeAsPieces : string으로 tokenize
    • EncodeAsIds : ids으로 tokenize
tokens = sp.EncodeAsPieces('This eBook is for the use of anyone anywhere at no cost')
tokens

'''
---output---
['<s>',
'▁This',
'▁eBook',
'▁is',
'▁for',
'▁the',
'▁use',
'▁of',
'▁anyone',
'▁any',
'where',
'▁at',
'▁no',
'▁cost',
'</s>']
'''

 

  • 문자열 -> 토큰화
tokensIDs = sp.EncodeAsIds('This eBook is for the use of anyone anywhere at no cost')
tokensIDs

#---output---
#[1, 209, 810, 31, 33, 5, 520, 11, 1458, 117, 1505, 40, 74, 981, 2]

 

  • 토큰 -> 문자화
    • 위에서 쪼개진 token들을 그냥 공백기준으로 붙이면 _와 띄어쓰기 모호함에 따라 어색함이 생길 수 있습니다.
    • sp내의 Decode함수를 사용하면 쉽게 변화할 수 있습니다.
### string token -> 문자열
sp.DecodePieces(tokens)

#---output---
#'This eBook is for the use of anyone anywhere at no cost'

### idx token -> 문자열
sp.DecodeIds(tokensIDs)

#---output---
#'This eBook is for the use of anyone anywhere at no cost'

 


다음을 토대로 Sentencepiece 를 이용하여 문장의 act / emotion 을 판단하는 분류기를 만들 것이다.

 

참고자료 : 

https://colab.research.google.com/github/google/sentencepiece/blob/master/python/sentencepiece_python_module_example.ipynb

https://donghwa-kim.github.io/SPM.html

https://9bow.github.io/PyTorch-tutorials-kr-0.3.1/beginner/blitz/cifar10_tutorial.html

https://github.com/google/sentencepiece

 

 

 

 

 

 

 

반응형