- 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://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
반응형
'Programming > (Python)(Ubuntu)' 카테고리의 다른 글
우분투 vi 에디터 사용법 (0) | 2020.02.15 |
---|---|
Sentence piece 를 이용한 문장 분류기 만들기 (1) | 2020.02.14 |
파이썬 편집기 패키지 관리 프로그램 종류 Python Editor&Package Management Program (0) | 2020.02.13 |
우분투 18.04 주피터 노트북/랩 실행하기 및 외부 접속 Ubuntu 18.04 Jupyter Using Notebook/Lab and outside enter (0) | 2020.02.10 |
우분투 18.04 아나콘다 설치 (Ubuntu 18.04 Anaconda Install) 우분투 18.04 가상환경 설정 (Ubuntu 18.04 virtual environments) (1) | 2020.02.07 |