문장이나 문단은 일련의 시퀀스(sequence)라고 생각할 수 있는데, 이걸 의미를 가진 단위로 쪼갠 것을 토큰이라고 지칭
예를 들어 "I am a model"이라는 문장이 있고 이 문장에 단어 단위의 토큰화를 진행한다면 토큰은 ["I", "am", "a", "model"]로 나타낼 수 있음
자연어처리에서 토큰화는 전처리 단계, 즉 딥러닝 모델을 실제로 학습하기 전 진행
좋은 토큰을 만들어야 딥러닝 모델의 학습 또한 효율적이기 때문
좋은 토큰이란
충분한 의미를 내포
적절한 크기의 단어사전을 만들 수 있도록 설계
토큰이 너무 잘게 쪼개져 특정한 의미를 담을 수 없을 경우, 이를 기반으로 딥러닝 모델이 학습을 진행한다면 인간의 언어에 담겨진 특성을 충분히 파악할 수 없음
반면 토큰이 너무 클 경우에는 단어사전의 크기가 너무 커지는 문제에 봉착
단어사전이란
딥러닝 모델이 학습할 때 특정 토큰과 숫자형 데이터를 매핑시켜 놓고 참고하는 정보
기계는 인간의 언어를 이해할 수 없기 때문에 텍스트를 숫자로 바꾸는 작업이 필요
모든 토큰을 각기 다른 숫자형 데이터에 매핑하는 게 아니라 중복되는 동일 토큰은 동일한 숫자형 데이터로 변환
예를 들어 "I love you, I hate you"라는 문장을 기반으로 단어사전을 만든다면 {"I": 1, "love": 2, "you": 3, "hate": 4}로 만들 수가 있는데, 그러면 기계는 해당 문장을 "1 2 3, 1 4 3"이라는 숫자로 바꿔서 이해할 수 있음
사실 숫자형 데이터는 훨씬 복잡한 벡터로 표현해야 하는데, 이해의 편의를 위해 간단하게 작성
참고해야 할 단어사전의 크기가 커진다면 딥러닝 모델은 단어사전에 존재하는 토큰들의 유의미한 특징을 파악하기 어려워진다.
단어사전을 만들 때 모든 단어를 포함할 수 없기 때문에 일반적으로는 사전의 크기를 정해놓고 빈도수 기반으로 단어를 포함
텍스트를 숫자로 바꾸는 과정에서 단어사전에 없는 토큰을 만날 경우, 해당 토큰은 OOV(out-of-vocabulary, 단어사전에 값이 없음)라는 특별한 토큰의 숫자값으로 변환
단어 기반 토큰화 (word-based tokenization)
단어사전의 크기가 매우 커질 수 있음
예: dog, dogs, dog's를 각기 다른 단어로 인식, 3개를 모두 단어사전에 포함
OOV(out-of-vocabulary token)의 양 증가
OOV는 다른 성격의 단어도 모두 하나의 카테고리로 묶는 개념이기 때문에, OOV가 많으면 딥러닝 모델의 성능이 저하됨
유사한 단어들 사이의 의미관계 파악 불가
예: dog, dogs, dog's가 유사한 의미를 포함하고 있음에도 각기 다른 숫자형 데이터로 변환된다면, 해당 숫자들 사이의 연관관계를 파악하기 어려움
글자 기반 토큰화 (character-based tokenization)
시퀀스가 매우 길어짐
예: 단어 기반 토큰화에서는 dog를 하나의 숫자로 표현할 수 있었다면, 글자 기반에서는 3개의 숫자로 표현
개별 토큰의 유의미성이 떨어짐
예: dog와 dollar의 의미는 전혀 다름에도, d와 o를 동일하게 포함하고 있어 글자 기반 토큰화에서는 연결고리가 생길 수도 있음
서브워드 토큰화 (subword tokenization)
이러한 한계 때문에 최근에는 서브워드 토큰화가 주로 사용됨
자주 사용되는 단어는 더 작은 서브워드로 나눠져서는 안 됨
예를 들어, dog는 d, o, g로 나눠져선 안 됨
자주 사용되지 않는 단어는 의미를 갖는 서브워드로 분해되어야 함
예를 들어, dogs는 dog, s로 나눠져야 하며 tokenization은 token, ization으로 분리되어야 함
서브워드는 비슷한 통사론적, 의미론적 단위로 텍스트를 식별할 수 있기 때문에 널리 사용
서브워드를 만드는 과정과 관련해서는 BPE, Byte-level BPE, WordPiece, Unigram, SentencePiece 등 다양한 토큰화 알고리즘이 존재