자연어처리에서 토큰
정의
자연어처리에서 코퍼스corpus 혹은 말뭉치란 특정 목적을 위해 수집/정제된 자연어 텍스트 데이터의 집합을 말한다.
텍스트를 이루는 가장 작은 단위, 이를테면 한글 음절, 로마자, 숫자, 문장부호, 공백 등을 문자character라 하자. 우리가 다루는 문자 전체를 모은 유한집합을 $\Sigma$로 두고 문자 집합character set이라 하자. 즉 하나의 문자는 $a \in \Sigma$이다. 문자들을 순서대로 늘어놓은 유한수열 혹은 순서쌍을 문자열string이라 한다. 문자열 $s$는 각 $a_{i} \in \Sigma$인 문자들의 수열로 아래와 같이 적는다.
$$ s = (a_{1}, a_{2}, \dots, a_{N}), \qquad a_{i} \in \Sigma $$
이때 $N$을 문자열의 길이라 하고 $|s| = N$으로 표기한다. 문자열을 특정 기준에 따라 앞에서부터 연속된 조각들로 나누어, 문자열들의 유한수열로 보내는 함수를 토크나이저tokenizer라 한다. 토크나이저 $\tau$는 문자열 $s$를 다음과 같이 사상한다.
$$ \tau : s = (a_{1}, \dots, a_{N}) \mapsto (\mathbf{t}_{1}, \mathbf{t}_{2}, \dots, \mathbf{t}_{M}) $$
여기서 각 $\mathbf{t}_{j}$는 $s$의 연속된 부분문자열이며, 순서대로 이어붙이면 다시 $s$가 된다. 즉 자를 지점 $0 = k_{0} < k_{1} < \cdots < k_{M} = N$이 존재하여 다음을 만족한다.
$$ \mathbf{t}_{j} = (a_{k_{j-1}+1}, \dots, a_{k_{j}}), \qquad \sum_{j=1}^{M} |\mathbf{t}_{j}| = N $$
이렇게 얻은 토큰열의 각 $\mathbf{t}_{j}$를 토큰token이라 한다. 그리고 문자열에 토크나이저를 적용하여 토큰열 $(\mathbf{t}_{1}, \dots, \mathbf{t}_{M})$을 얻는 일을 토큰화tokenization라 한다.
설명1
토큰화는 자연어 처리에서 매우 중요한 데이터 전처리 과정이다. 위의 정의는 토큰화를 수식적으로 나타내기위한 형식적인 정의에 불과하며 간단히 문자열을 쪼개는 일이라 이해하면 된다.
여러가지 토큰화를 한국어 문장 "그 학생은 도서관에서 책을 빌렸다."와 영어 문장 "The student borrowed a book from the library."을 예시로 알아보자.
단어 토큰화
가장 단순하게 띄어쓰기를 기준으로 문자열을 나누는 것을 단어 토큰화word tokenization라 한다. 띄어쓰기를 기준으로 나누면 앞서의 두 예시 문장은 각각 다음과 같이 토큰화된다. 이처럼 가장 단순한 단어 토큰화에서는 문장부호를 따로 떼어 내지 않으므로 마침표가 앞 단어에 그대로 붙는다.
- 한국어:
그학생은도서관에서책을빌렸다. - 영어:
Thestudentborrowedabookfromthelibrary.
한국어는 조사가 붙어서 학생은, 학생이, 학생을 등이 서로 다른 토큰으로 인식된다. 또한 빌렸다., 빌렸다?, 빌렸다! 등도 다른 토큰으로 인식된다. 만약 도서관이 도사관으로 오타인 문장이 있다면 이 둘도 다른 토큰으로 인식된다. 그래서 단어 토큰화는 한국어 접사, 오타나 띄어쓰기 오류 등에 취약하다.
글자 토큰화
글자 단위로 토큰화하는 것을 글자 토큰화character tokenization라 한다. 글자 단위로 나누면 앞서의 두 예시 문장은 각각 다음과 같이 토큰화된다. 공백과 마침표 같은 문장부호도 하나의 토큰이다.
- 한국어:
그학생은도서관에서책을빌렸다. - 영어:
Thestudent… (이하 생략)
영어는 각 글자가 하나의 토큰이라 토큰열이 매우 길어진다. 이렇게 글자 토큰화는 문자 집합, 즉 어휘의 크기가 매우 작아 미등록 단어나 오타에도 강하지만, 토큰 하나가 단어 수준의 의미를 담지 못하고 시퀀스가 길어진다는 단점이 있다. 한국어라면 음절을 자음과 모음, 곧 자모로 더 쪼개어 한 단계 더 세분화할 수도 있다.
형태소 토큰화
의미를 가진 최소 단위인 형태소morpheme를 기준으로 나누는 것을 형태소 토큰화morpheme tokenization라 한다. 형태소를 기준으로 나누면 앞서의 두 예시 문장은 각각 다음과 같이 토큰화된다.
- 한국어:
그학생은도서관에서책을빌리었다. - 영어:
Thestudentborrowedabookfromthelibrary.
조사와 어미가 따로 떨어져 나오므로, 단어 토큰화에서 지적한 문제, 즉 학생은, 학생이, 학생을 이 모두 다른 토큰이 되던 문제가 학생 이라는 하나의 형태소와 조사로 쪼개지며 완화된다. 조사와 어미가 발달한 교착어인 한국어에는 특히 잘 맞는 방식이다. 다만 형태소 토큰화에는 언어별 형태소 분석기morphological analyzer가 필요하다. 한편 한국어의 형태소 분석은 분석기에 따라 경계가 갈릴 수 있다.
특수 토큰
자연어 처리에서 입력 토큰열의 길이는 제각각이기 때문에 데이터가 시작되는 지점과 끝나는 지점을 구분해주는 특수한 토큰을 사용한다. 이처럼 문장의 경계를 표시하거나, 미등록 단어를 대체하거나, 여러 문장의 길이를 맞추는 등 텍스트 자체가 아니라 처리를 돕기 위해 인위적으로 덧붙이는 토큰을 특수 토큰special token이라 한다. 자주 쓰이는 특수 토큰은 다음과 같다.
| 종류 | 설명 |
|---|---|
<SOS> | start of sentence의 줄임말 입력 또는 출력 토큰열의 시작을 나타냄. <BOS>(beginning of sentence)라고도 함. |
<EOS> | end of sentence의 줄임말 입력 또는 출력 토큰열의 끝을 나타냄. |
<UNK> | unknown의 줄임말 미리 정해둔 어휘에 없는 단어를 대체하는 토큰. |
<PAD> | padding의 줄임말 여러 토큰열의 길이를 동일하게 맞추기 위해 짧은 쪽 뒤에 채워 넣는 토큰. |
이름에는 문장(sentence)이 들어가지만, <SOS>와 <EOS>가 실제로 표시하는 것은 한 문장이 아니라 모델에 들어가고 나오는 입력/출력 토큰열 전체의 시작과 끝이다. 하나의 입력이나 출력이 여러 문장으로 이루어져 있어도, 예컨대 입력이 세 문장이고 출력이 네 문장이더라도 각 토큰열의 맨 앞과 맨 뒤에 한 번씩만 붙는다.
앞서의 두 예시 문장을 단어 토큰화한 뒤, 각 토큰열 앞뒤에 <SOS>와 <EOS>를 붙이고 두 토큰열의 길이를 맞추기 위해 짧은 쪽을 <PAD>로 채우면 다음과 같다.
- 한국어:
<SOS>그학생은도서관에서책을빌렸다.<EOS><PAD><PAD><PAD> - 영어:
<SOS>Thestudentborrowedabookfromthelibrary.<EOS>
윤대희·김동화·송종민·진현두. 자연어 처리와 컴퓨터비전 심층학습, p230-263. ↩︎

저희들의 저서 「줄리아 프로그래밍」이 2024 세종도서 학술부문에 선정되었습니다!

