Python/NLP Code

원하는 corpus를 기준으로 토크나이저 학습하기 파이썬 코드 예제

jimmy_AI 2023. 9. 17. 19:53
반응형

새로운 코퍼스에 대하여 커스터마이징된 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]