Link
Recent Posts
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 파이썬입출력
- 2회기출
- 작업형2
- 리스트
- set시간복잡도
- 실기
- konlpy
- 공빅데기관매칭
- 빅분기
- 파이썬튜플
- 딕셔너리
- dataq
- 백준1920
- 빅분기실기
- 빅데이터분석기사
- 파이썬AHP
- 컨테이너
- 공공빅데이터청년인턴
- 파이썬셋
- 파이썬
- 백준 2164
- 파이썬딕셔너리
- 셋
- 행별속성합계
- 튜플
- csv병합
- 태블로
- 공빅데
- 예측모델링
- 워드클라우드
- Today
- Total
Data Science
[do it! bert gpt] 2장. 문장을 작은 단위로 쪼개기 본문
2-1 토큰화란?¶
문장을 토큰 시퀀스로 나누는 과정
- 단어 단위 토큰화:
- 어휘 집합의 크기가 커져 모델 학습이 어렵다.
- 문자 단위 토큰화:
- 미등록 토큰 문제로부터 자유롭다
- 각 문자 토큰이 의미 있는 단위가 되기 어렵다.
- 서브워드 단위 토큰화:
- 단어와 문자 단위 토큰화의 장점만 취한 형태
- 어휘 집합 크기가 커지지 않으면서도 미등록 토큰 문제를 피하고, 분석된 토큰 시퀀스가 너무 길어지지 않게 한다.
2-2 바이트 페어 인코딩(BEP)이란?¶
BEP는 사전의 크기 증가를 억제하면서도 정보를 효율적으로 압축할 수 있는 알고리즘이다.
BPE 어휘 집합은 고빈도 바이그램(Bigram) 쌍을 병합하는 방식으로 구축된다.
2-3 어휘 집합 구축하기¶
In [ ]:
!pip install ratsnlp
In [ ]:
from google.colab import drive
drive.mount('/content/drive')
In [ ]:
# 네이버 영화 리뷰 NSMC
from Korpora import Korpora
nsmc = Korpora.load("nsmc", force_download=True)
NSMC에 포함된 영화 리뷰들을 순수 텍스트 형태로 코랩 환경 로컬의 지정된 디렉터리에 저장해 둡니다.
In [ ]:
import os
def write_lines(path, lines):
with open(path, 'w', encoding='utf-8') as f:
for line in lines:
f.write(f'{line}\n')
write_lines('/content/train.txt', nsmc.train.get_all_texts())
write_lines('/content/test.txt', nsmc.test.get_all_texts())
GPT 토크나이저 구축 - BPE
In [ ]:
# 디렉토리 만들기
import os
os.makedirs('/content/drive/MyDrive/Colab Notebooks/BERT와 GPT로 배우는 자연어처리/nlpbook/bbpe', exist_ok=True)
In [ ]:
# 바이트 수준 BPE 어휘 집합 구축
from tokenizers import ByteLevelBPETokenizer
bytebpe_tokenizer = ByteLevelBPETokenizer()
bytebpe_tokenizer.train(
files=['/content/train.txt', '/content/test.txt'], # 학습 말뭉치를 리스트 형태로 넣기
vocab_size = 1000, # 어휘 집합 크기 조절
special_tokens=['[PAD]'], # 특수 토큰 추가
)
bytebpe_tokenizer.save_model('/content/drive/MyDrive/Colab Notebooks/BERT와 GPT로 배우는 자연어처리/nlpbook/bbpe')
Out[ ]:
In [ ]:
import json
with open('/content/drive/MyDrive/Colab Notebooks/BERT와 GPT로 배우는 자연어처리/nlpbook/bbpe/vocab.json', 'r') as f:
json_data = json.load(f)
print(json.dumps(json_data) )
In [ ]:
with open("/content/drive/MyDrive/Colab Notebooks/BERT와 GPT로 배우는 자연어처리/nlpbook/bbpe/merges.txt", 'r') as f:
print(f.read(100))
BERT 토크나이저 구축 - WordPiece
In [ ]:
import os
os.makedirs('/content/drive/MyDrive/Colab Notebooks/BERT와 GPT로 배우는 자연어처리/nlpbook/wordpiece', exist_ok=True)
In [ ]:
# 워드피스 어휘 집합 구축
from tokenizers import BertWordPieceTokenizer
wordpiece_tokenizer = BertWordPieceTokenizer(lowercase=False)
wordpiece_tokenizer.train(
files=['/content/train.txt', '/content/test.txt'],
vocab_size=10000,
)
wordpiece_tokenizer.save_model('/content/drive/MyDrive/Colab Notebooks/BERT와 GPT로 배우는 자연어처리/nlpbook/wordpiece')
Out[ ]:
In [ ]:
with open("/content/drive/MyDrive/Colab Notebooks/BERT와 GPT로 배우는 자연어처리/nlpbook/wordpiece/vocab.txt", 'r') as f:
print(f.read(1000))
In [ ]:
MYPATH = '/content/drive/MyDrive/Colab Notebooks/BERT와 GPT로 배우는 자연어처리/'
2-4 토큰화 하기¶
문장을 토큰화하고 해당 토큰을 모델의 입력으로 만드는 과정 실습
GPT 모델 입력값 만들기¶
In [ ]:
# GPT 토크나이저 선언
from transformers import GPT2Tokenizer
tokenizer_gpt = GPT2Tokenizer.from_pretrained(MYPATH + 'nlpbook/bbpe')
tokenizer_gpt.pad_token = "[PAD]"
In [ ]:
sentences = [
"아 더빙.. 진짜 짜증나네요 목소리",
"흠...포스터보고 초딩영화줄....오버연기조차 가볍지 않구나",
"별루 였다..",
]
In [ ]:
# 토큰화 결과 볼때
tokenized_sentences = [tokenizer_gpt.tokenize(sentence) for sentence in sentences]
tokenized_sentences
Out[ ]:
In [ ]:
# gpt 모델 입력 만들기 (실제 모델 입력값)
batch_inputs = tokenizer_gpt(
sentences,
padding="max_length", # 문장의 최대 길이에 맞춰 패딩
max_length=12, # 문장의 토큰 기준 최대 길이
truncation=True, # 문장 잘림 허용 옵션
)
In [ ]:
batch_inputs.keys()
Out[ ]:
In [ ]:
# 토큰화 결과를 가지고 각 토큰을 인덱스로 바꾼 것
batch_inputs['input_ids']
Out[ ]:
In [ ]:
# 일반 토큰(1), 패딩 토큰(0)
batch_inputs['attention_mask']
Out[ ]:
BERT 모델 입력값 만들기¶
In [ ]:
# BERT 토크나이저 선언
from transformers import BertTokenizer
tokenizer_bert = BertTokenizer.from_pretrained(
MYPATH + 'nlpbook/wordpiece',
do_lower_case = False,
)
In [ ]:
sentences = [
"아 더빙.. 진짜 짜증나네요 목소리",
"흠...포스터보고 초딩영화줄....오버연기조차 가볍지 않구나",
"별루 였다..",
]
In [ ]:
# 토큰화 결과 볼때
tokenized_sentences = [tokenizer_bert.tokenize(sentence) for sentence in sentences]
tokenized_sentences
Out[ ]:
In [ ]:
# BERT 모델 입력 만들기 (실제 모델 입력값)
batch_inputs = tokenizer_bert(
sentences,
padding="max_length",
max_length=12,
truncation=True,
)
In [ ]:
batch_inputs.keys()
Out[ ]:
In [ ]:
batch_inputs['input_ids']
Out[ ]:
문장의 시작과 끝에 2개의 토큰을 덧붙이는 특징
2: [CLS]
3: [SEP]
In [ ]:
batch_inputs['attention_mask']
Out[ ]:
세그먼트(segment)
첫번째 세그먼트(문서 혹은 문장)은 0, 두번째 세그먼트는 1
여기선 한문장이니까 모두 0으로 처리됐음
In [ ]:
batch_inputs['token_type_ids']
Out[ ]:
In [ ]:
In [ ]:
'인공지능' 카테고리의 다른 글
[do it! bert gpt] 1장. 처음 만나는 자연어처리 (1) | 2023.01.26 |
---|
Comments