정리필요/NLP

Wordpiece

kstar2 2021. 3. 15. 10:14

Wordpiece 워드피스

wordpiece tokenizer는 subword tokenizer의 종류 중 하나이다. subword tokenizer에서 대표적으로 사용되는 방법으로 BPE(Byte Pair Encoding) 방법이 있다.

일반적으로 많이 사용하는 Sentencepiece의 경우 빈도수를 기반으로 BPE를 수행하며, Wordpiece의 경우 likelihood를 기반으로 BPE를 수행한 알고리즘이다.

BERT의 경우 Wordpiece를 이용한 tokenizer를 사용하였고, sentencepiece를 사용한 모델 또한 많다. 선택에 따라 필요한 tokenizer를 활용할 수 있다.

Wordpiece Tokenizer 만들기

huggingface tokenizers 설치

pip install tokenizers

말뭉치 파일로 Wordpiece vocab 만들기

import argparse

from tokenizers import BertWordPieceTokenizer

 

parser = argparse.ArgumentParser()

 

parser.add_argument("--corpus_file", type=str)

parser.add_argument("--vocab_size", type=int, default=22000) # 만들 Vocab의 숫자

parser.add_argument("--limit_alphabet", type=int, default=6000)

 

args = parser.parse_args()

 

tokenizer = BertWordPieceTokenizer(

         vocab_file=None,

         clean_text=True,

         handle_chinese_chars=True,

         strip_accents=False, # Must be False if cased model

         lowercase=False,

         wordpieces_prefix="##"

)

 

tokenizer.train(

         files=[args.corpus_file],

         limit_alphabet=args.limit_alphabet,

         vocab_size=args.vocab_size

)

 

tokenizer.save("./ch-{}-wpm-{}-pretty".format(args.limit_alphabet, args.vocab_size),True)

생성된 vocab 파일 전처리

import json # import json module

vocab_path = "../vocab/ch-6000-wpm-22000-pretty"

 

vocab_file = '../data/wpm-vocab-all.txt'

f = open(vocab_file,'w',encoding='utf-8')

with open(vocab_path) as json_file:

         json_data = json.load(json_file)

         for item in json_data["model"]["vocab"].keys():

                  f.write(item+'\n')

 

         f.close()

Tokenizer 테스트

huggingface transformers 패키지 필요

from transformers.tokenization_bert import BertTokenizer

 

vocab_path = "../data/wpm-vocab-all.txt"

 

tokenizer = BertTokenizer(vocab_file=vocab_path, do_lower_case=False)

 

test_str = ' [CLS] 나는 워드피스 토크나이저를 써요. 성능이 좋은지 테스트 해보려 합니다. [SEP]'

print('테스트 문장: ',test_str)

 

encoded_str = tokenizer.encode(test_str,add_special_tokens=False)

print('문장 인코딩: ',encoded_str)

 

decoded_str = tokenizer.decode(encoded_str)

print('문장 디코딩: ',decoded_str)

 

"""

테스트 문장: [CLS] 나는 워드피스 토크나이저를 써요. 성능이 좋은지 테스트 해보려 합니다. [SEP]

문장 인코딩: [2, 9310, 4868, 6071, 12467, 21732, 12200, 6126, 6014, 4689, 6100, 18, 11612, 6037, 9389, 6073, 16784, 17316, 6070, 10316, 18, 3]

문장 디코딩: [CLS] 나는 워드피스 토크나이저를 써요. 성능이 좋은지 테스트 해보려 합니다. [SEP]

"""

 

-----------------------------------------------------------

subword tokenizer

subword tokenizer의 경우 단어를 나누어 단어 안에 단어들로 토큰화를 하는것을 말한다. 예를들어 경찰차, 경찰관, 경찰복과 같은 단어들이 있는 경우, 아래와 같이 단어의 분절들로 나누어질 수 있다.

 

경찰

##차

##관

##복

 

subword tokenizer은 vocab에 없는 단어들에 대해서도 좋은 성능을 보인다는 장점을 가진다.

'정리필요 > NLP' 카테고리의 다른 글

[개념] 정제와 정규화  (0) 2021.03.31
[개념] 토큰화  (0) 2021.03.29
[개념] Markov란  (0) 2021.03.18
[개념] NLP란?  (0) 2021.03.18
임베딩  (0) 2021.03.15