자연어 처리
자연어(Natural Language)는 사람들이 일상적으로 쓰는 언어를 말한다. 자연어 처리(Natural Language Processing)는 컴퓨터가 인간의 언어를 이해하고 해석 및 생성하기 위한 기술을 의미한다.
모호성(Ambiguity): 인간 언어는 맥락에 따라 다양한 의미를 가질 수 있으며, 이를 명확히 구분
가변성(Variability): 인간 언어는 사투리, 억양, 신조어 등 다양한 스타일로 인해 가변적이며, 이를 이해하고 처리해야 언어를 올바르게 사용
구조성(Structure): 문장의 구조와 문법적 요소를 이해하고 이를 바탕으로 의미를 추론 및 분석
토큰화
문제를 이해하고 구분할 수 있는 모델을 만들려면 우선 말뭉치(Corpus)를 일정한 단위인 토큰(Token)으로 나눠야 한다. 토큰화(Tokenization)을 진행해 컴퓨터가 자연어를 이해할 수 있도록 말뭉치를 나누는 것이다.
단어 토큰화
우리말 띄어쓰기 원칙 제 2항, “문장의 각 단어는 띄어 씀을 원칙으로 한다"에 의해, 공백을 기준으로 split()
하면 단어 토큰화를 할 수 있다.
- 입력:
'단어 토큰화 예시'
- 출력:
['단어', '토큰화', '예시']
글자 토큰화
글자 토큰화는 글자 기준으로 문장을 나누는 방식이다. split('')
을 적용해 글자 토큰화를 할 수 있다.
- 입력:
'글자 토큰화이다.'
- 출력:
['글', '자', ' ', '토', '큰', '화', '이', '다', '.']
영어는 한 칸에 한 글자가 들어가지만, 한글의 경우 초성, 중성, 종성의 조합으로 한 글자가 구성된다. 이를 모두 분해할 수 있는 자모(jamo) 라이브러리도 있다.
- 입력:
'자모 토큰화'
- 출력:
['ㅈ', 'ㅏ', 'ㅁ', 'ㅗ', ' ', 'ㅌ', 'ㅗ', 'ㅋ', 'ㅡ', 'ㄴ', 'ㅎ', 'ㅘ']
형태소 토큰화
형태소 토큰화(Morpheme Tokenization)란 텍스트를 형태소 단위로 나누는 토큰화 방법이다. 형태소는 의미를 가지는 최소 단위이다.
형태소는 명사, 동사, 형용사와 같이 문장 내에서 홀로 쓰일 수 있으며 스스로 의미를 가지는 자립 형태소와, 스스로 의미를 가지지 못하고 조사, 어미, 접두사, 접미사와 같이 다른 형태소와 조합되어 사용되는 의존 형태소로 구분한다.
문장 내 단어의 위치에 따라 품사가 결정되는 영어와는 달리, 한국어는 단어와 조사의 결합으로 품사가 결정된다. “나는 밥을 먹는다” 에서 “먹는다 나는 밥을” 로 바꾸어도 어색하지만 문장의 의미는 이해할 수 있는 것과 같다.
우리말에서 동사를 보면 변화가 굉장히 많다. ‘먹다’, ‘먹는다’, ‘먹이다’, 먹었다’, ‘먹어’ 등 유사한 단어가 무수히 많다. 이는 ‘먹-‘이라는 어간에 어미 ‘-다’, 사동 접미사 ‘-이-’, 과거 시제 어미 ‘-었-’ 등이 붙어 여러 단어의 조합이 된 것이다.
이처럼 단어의 변화형을 고려하지 않고 유사한 단어를 모두 다른 단어로 간주한다면, 자칫 차원의 저주에 빠지게 되거나 모델 학습이 어려워질 수 있다. 따라서 의미를 가지는 최소 단위인 형태소로 글자를 분리(토큰화)하여 모델을 학습하는 것이 좋다.
토큰화를 할 때는 그 언어의 문법적인 특성을 고려하여 적절한 토크나이저를 사용해야 한다.
형태소 분석기
Konlpy, NLTK, spaCy와 같은 라이브러리 등이 있다. 아래는 Konlpy 라이브러리에서 꼬꼬마 형태소 분석기를 사용하는 예시이다.
|
|
|
|
형태소 어휘 사전
형태소 어휘 사전(Morpheme Vocabulary)는 자연어 처리에서 사용되는 단어 집합인 어휘 사전 중에서도 각 단어의 형태소 정보를 포함하는 사전을 말한다. “그녀”, “그녀는”, “그녀에게"를 모두 같은 의미 단위인 단어도 쉽게 학습할 수 있다.
일반적으로 형태소 어휘 사전에는 각 형태소가 어떤 품사(Part Of Speech, POS)에 속하는지와 그 품사의 뜻에 대한 정보도 같이 제공된다. 품사를 태깅하는 작업은 품사 태깅(POS Tagging)이라고 한다. 이를 통해 문맥을 고려할 수 있어 더욱 정확한 분석이 가능하다.
하위 단어 토근화
언어는 시간이 지남에 따라 변화한다. 신조어나 축약어가 등장하거나 더 이상 쓰이지 않는 표현도 생긴다. 또한 디지털 시대에는 오탈자가 많아 기존 형태소 분석기로 토큰화하기 어려울 수 있다.
형태소 분석기는 전문용어나 고유어에 취약하다. 즉, 형태소 분석기는 모르는 단어를 적절한 단어로 나누는 것에 취약하며, 이는 잠재적으로 어휘 사전의 크기를 크게 만들고 OOV(Out of Vocabulary)에 대응하기 어렵다.
이를 해결하기 위한 방법 중 하나로 하위 단어 토큰화(Subword Tokenization)가 있다. 하위 단어 토큰화란 하나의 단어가 빈번하게 사용되는 하위 단어(Subword)의 조합으로 나누어 토큰화 하는 방법이다. 예를 들어 ‘Reinforcement’라는 단어는 길이가 비교적 길어 처리가 어려울 수 있다. 하위 단어 토큰화를 적용한다면 ‘Rein’, ‘force’, ‘ment’ 등으로 나눠 처리할 수 있다.
바이트 페어 인코딩
바이트 페어 인코딩(Byte Pair Encoding, BPE)이란 다이그램 코딩(Digram Coding)이라고도 하며 하위 단어 토큰화의 한 종류다. 초기에는 데이터 압축을 위해 개발됐으나, 자연어 처리 분야에서 하위 단어 토큰화를 위한 방법으로 사용된다.
빈도 사전 내 모든 단어를 글자 단위로 나누고, 가장 많이 등장한 글자 쌍을 병합하고 어휘 사전에 추가하는 과정 반복하여 사전을 구축한다.
센텐스피스
구글에서 개발한 오픈소스 하위 단어 토크나이저 라이브러리로, 바이트 페어 인코딩과 유사한 알고리즘을 사용하였다.
|
|
|
|
워드피스
워드피스(Wordpiece) 토크나이저는 확률 기반으로 글자 쌍을 병합한다. 새로운 하위 단어를 생성할 때 이전 하위 단어와 함께 나타날 확률을 계산해 가장 높은 확률을 가진 하위 단어를 선택한다. 각 글자 쌍에 대한 점수는 아래와 같이 계산된다. 여기서 $f$는 빈도(frequency)이다.
$$ \text{score} = \frac{f(x,y)}{f(x), f(y)} $$
토크나이저스
토크나이저스 라이브러리는 정규화(Normalization)와 사전 토큰화(Pre-tokenization)를 제공한다.
정규화는 일관된 형식으로 텍스트를 표준화하고 모호한 경우를 방지하기 위해 불필요한 공백 제거, 대소문자 변환, 유니코드 정규화, 구두점 처리, 특수 문자 처리 등을 제공한다.
사전 토큰화는 입력 문장을 토큰화하기 전에 단어와 같은 작은 단위로 나누는 기능을 제공한다. 공백 혹은 구두점을 기준으로 입력 문장을 나눠 텍스트 데이터를 효율적으로 처리하고 모델의 성능을 향상시킬 수 있다.