인코딩과 UTF-8
인코딩이란?
컴퓨터에서 문자를 처리 할 수 있도록 이진수로 바꾸는 것을 인코딩이라고 합니다.
이때 가장 많이 쓰이는 인코딩 방식이 바로 UTF-8입니다.
문자의 타입(type)마다 다른 길이의 바이트를 할당합니다.
1-byte:-Standard-ASCII
2-bytes:-Arabic,-Hebrew,-most-European-scripts
3-bytes:-BMP(Basic'Multilingual'Plane)'-한글을 포함한 현대 글자
4-bytes:-All-Unicode-characters-- 이모지 등
python에서 unicode 다루기
Python3부터 string 타입은 유니코드 표준을 사용합니다.
ord('A')
hex(ord('A') )
chr(65)
Unicode와 한국어
한국어는 한자 다음으로 유니코드에서 많은 코드를 차지하고 있는 문자
완성형
- 자모 조합으로 만들 수 있는 모든 완성형 한글: 11,172자 (가~힣)
- U+AC00 ~ U+D7A3
조합형
- 조합하여 글자르 만들 수 있는 초-중-종성
- U+1100 ~ U+11FF, U+A960 ~ U+A97F, U+D780 ~ U+D7F
예시
>>> chr(0x1100)
'ㄱ'
>>> chr(0x1161)
'ㅏ'
>>> chr(0x1100) + chr(0x1161)
'가'
>>> len('가')
2
>>> len('가')
1
토크나이징
텍스트를 토큰 단위로 나누는 것을 말합니다.
이때 토큰의 단위를 띄어쓰기 기준의 단어, 형태소, subword 등이 사용됩니다.
Subword Tokenizing
자주 쓰이는 글자 조합은 한 단위로 취급하고 자주 쓰이지 않는 조합은 subword로 쪼개서 다른 token으로 봅니다.
subowrd Tokenizing 시 자주 나오는 ##
은 디코딩, 즉 토크나이징된 토큰들을 다시 글자로 원상 복귀 시, 해당 토큰을 앞 토큰에 띄어쓰기 없이 붙여서 하나의 단어로 본다는 것을 의미합니다.
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained("bert-base-multilingual-cased")
tokenizer.tokenize("아버지 가방에 들어가신다")
BPE (Byte-Pair Encoding)
데이터 압축용으로 제안된 알고리즘으로 NLP에서 토크나이징 시 활발하게 사용하고 있습니다.
동작한느 순서는 다음과 같습니다.
1) 가장 자주 나오는 글자 단위 Bigram (or Byte pair)를 다른 글자로 치환합니다.
2) 치환된 글자를 저장
3) 1~2번을 반복
BPE알고리즘을 활용해 Wordpiece Tokenizer가 BERT의 토크나이저로 쓰였습니다.
생각해보기
1) Wordpiece Tokenizer에 대해서 알아보세요!
2) Tokenizer도 학습이 필요할까요? 왜 그렇게 생각하는 지 얘기를 나눠보아요!
comment