새로운 코퍼스에 대하여 커스터마이징된 Tokenizer를 파이썬으로 학습시키는 방법을
간략하게 정리해보도록 하겠습니다.
예시로, 제가 corpus txt 파일 여러 개를 다음과 같은 디렉토리 구조로 가지고 있다고
가정해보도록 하겠습니다.
위의 많은 코퍼스 파일들을 통하여 토크나이저를 직접 학습시켜 보겠습니다.
Step 1. 디렉토리명 가져오기
먼저, 위의 텍스트 파일들을 불러오기 위하여 디렉토리 목록을 가져와야 합니다.
이 과정을 os 모듈을 활용하여 진행한 예시 코드는 아래와 같습니다.
import os
dir_name = 'my_corpus'
paths = os.listdir(dir_name) # ['corpus_15.txt', 'corpus_02.txt', 'corpus_09.txt', 'corpus_06.txt', ...]
paths = [os.path.join(dir_name, p) for p in paths] # 폴더 이름과 concat 진행
print(paths) # ['my_corpus/corpus_15.txt', 'my_corpus/corpus_02.txt', 'my_corpus/corpus_09.txt', 'my_corpus/corpus_06.txt', ...]
Step 2. tokenizers 모듈로 토크나이저 학습하기
토크나이저 커스터마이징 과정은 tokenizers 모듈로 쉽게 진행이 가능합니다.
BERT 등에서 사용되는 wordpiece 방식으로 토크나이저를 학습시켜 보겠습니다.
위의 path list(paths 변수)를 기준으로 학습을 진행한 예시는 아래와 같습니다.
from tokenizers import BertWordPieceTokenizer # 미설치 시 !pip install tokenizers
tokenizer = BertWordPieceTokenizer()
tokenizer.train(files=paths, vocab_size=30522, min_frequency=5,
special_tokens= ['[CLS]', '[PAD]', '[UNK]', '[MASK]'])
참고로, BPE 등 다른 토크나이저 방식으로도 학습이 마찬가지로 가능합니다.
위의 예시에서 토큰의 최대 갯수는 BERT와 동일한 30522개로 지정하였으며,
최소 5번 이상 등장한 패턴을 기준으로 토큰을 병합하도록 시도한 예시입니다.
물론, special token의 종류도 마음대로 지정이 가능합니다.
학습된 토크나이저의 토큰 단어 목록과 인코딩을 진행한 토큰 번호 예시는 아래와 같습니다.
tokenizer.get_vocab() # {'가': 105, '[PAD]: 1', '##ㄱ과': 280, ...}
tokenizer.encode('가가가가가가가').ids # [401, 105, 105, 105, 105, 105, 105]
Step 3. 학습된 토크나이저 저장 / 불러오기
이제, 학습된 토크나이저를 transformers 모듈에서 활용이 가능하도록
바꾸어주어야 transformers에서 지원하는 머신러닝 모델 학습에 활용할 수 있습니다.
학습된 tokenizer를 저장하는 방법과
transformers 모듈에서 불러와 활용하는 방법에 대하여 정리해 보겠습니다.
토크나이저 저장은 save 메소드를 이용하면 간단하게 수행할 수 있습니다.
(json 파일 형태로 저장합니다.)
tokenizer.save("my_tokenizer.json")
저장된 토크나이저를 transformers 모듈에서 불러오는 방법은
아래 코드처럼 진행해주시면 됩니다.
from transformers import PreTrainedTokenizerFast
tokenizer = PreTrainedTokenizerFast(tokenizer_file='my_tokenizer.json')
tokenizer.encode('가가가가가가가') # [401, 105, 105, 105, 105, 105, 105]
'Python > NLP Code' 카테고리의 다른 글
ChatGPT, GPT-4 토큰 개수 카운팅 및 인코딩/디코딩 방법(파이썬 tiktoken 모듈 활용) (0) | 2023.09.19 |
---|---|
파이썬 개체명 태깅(NER Tagging) 방법 정리(nltk, spacy) (0) | 2022.11.09 |
파이썬 품사 태깅(POS Tagging) 방법 정리(nltk, spacy) (0) | 2022.10.29 |