한글 vocab 만들기

Jinho Jang·2023년 5월 7일
0

개요

  • BERT나 GPT에서 BPE라는 알고리즘을 사용하는데 이는 한글의 발음 체계를 고려하지 않음
    • ex) ㅎ, 하, 한 이 전부 다른 Byte로 인식되는 문제점이 발생
  • 형태소에 기반한 vocab을 만들고 이를 활용하여 한국어 모델을 만들어 성능을 비교해보는 것이 목표

예시 코드

pip install kiwipiepy
import kiwipiepy
from tokenizers import Tokenizer
from tokenizers.models import BPE ## sentencepiece의 경우 Unigram
from tokenizers.trainers import BpeTrainer
from tqdm import tqdm

kiwi = kiwipiepy.Kiwi()
kiwi.prepare()

def tokenize(text):
    result = kiwi.analyze(text)
    tokens = []
    for r in result:
        for w in r[0]:
            tokens.append(w.form)
    return tokens

tokenizer = Tokenizer(BPE())

# 학습에 사용할 텍스트 데이터
with open("data.txt", "r", encoding="utf-8") as f:
    text = f.read()

text = list(text.split('\n'))
token_lst = []

for t in tqdm(text, total=len(text)):
    tokens = tokenize(t)
    token_lst.extend(tokens)

# 분리된 형태소 토큰에 대해 bpe 모델로 vocab 학습
trainer = BpeTrainer(special_tokens=["<s>", "<pad>", "</s>", "<unk>", "<mask>"])
tokenizer.train_from_iterator(tokens, trainer)

tokenizer.save("vocab.json")

text example

'난산은 자궁이 정상 수축함에도 태아가 분만 중에 물리적인 차단으로 인해 골반을 빠져나오지 못하는 상황을 말한다. 태아의 합병증에는 사망에 이를 수 있는 출산 중 태아 질식이 포함된다. 감염, 자궁파열, 분만 후 출혈 등 산모의 위험을 증가시킨다. 산모의 장기간 합병증에는 산과 누공이 포함된다.'

tokens example

['난산', '은', '자궁', '이', '정상', '수축', '하', 'ᆷ', '에', '도', '태아', '가', '분만', '중', '에', '물리', '적', '이', 'ᆫ', '차단', '으로', '인하', '어', '골반', '을', '빠지', '어', '나오', '지', '못하', '는', '상황', '을', '말', '하', 'ᆫ다', '.', '태아', '의', '합병증', '에', '는', '사망', '에', '이르', 'ᆯ', '수', '있', '는', '출산', '중', '태아', '질식', '이', '포함', '되', 'ᆫ다', '.', '감염', ',', '자궁', '파열', ',', '분만', '후', '출혈', '등', '산모', '의', '위험', '을', '증가', '시키', 'ᆫ다', '.', '산모', '의', '장기간', '합병증', '에', '는', '산', '과', '누공', '이', '포함', '되', 'ᆫ다', '.']

Reference

0개의 댓글