[AI/ML 스터디] 4주차 - 05. 토큰화
05 토큰화
자연어
→ 인공적으로 만들어진 프로그래밍 언어와 다르게 사람들이 쓰는 언어 활동을 위해 자연히 만들어진 언어
자연어처리
→ 컴퓨터가 인간의 언어를 이해하고 해석 및 생성하기 위한 기술
→ 컴퓨터가 인간과 유사한 방식으로 인간의 언어를 이해하고 처리하는 것이 주요 목표
→ 인간 언어의 구조, 의미, 맥락을 분석하고 이해할 수 있는 알고리즘과 모델 개발
모델 개발을 위해 다음 문제가 해결되어야 함
- 모호성
- 인간의 언어는 단어와 구가 사용되는 맥락에 따라 여러 의미를 갖게 되어 모호한 경우가 많음
- 알고리즘은 이러한 다양한 의미를 이해하고 명확하게 구분할 수 있어야 함
- 가변성
- 인간의 언어는 다양한 사투리, 강세, 신조어, 작문 스타일로 인해 매우 가변적
- 알고리즘은 이러한 가변성을 처리할 수 있어야 하고 사용 중인 언어를 이해할 수 있어야함
- 구조
- 인간의 언어는 문장이나 구의 의미를 이해할 때 구문을 파악하여 의미를 해석
- 알고리즘은 문장의 구조와 문법적 요소를 이해하여 의미를 추론하거나 분석할 수 있어야 함
→ 이러한 모델을 만들려면 말뭉치를 일정한 단위인 토큰으로 나눠야 함
- 말뭉치
- 자연어 모델을 훈련하고 평가하는 데 사용되는 대규모의 자연어
- 일련의 단어의 가능성을 예측하는 알고리즘인 언어 모델을 구축하고 평가하는 데 사용
- 토큰
- 개별 단어나 문장 부호와 같은 텍스트
- 말뭉치보다 더 작은 단위
- 텍스트의 개별 단어, 구두점 또는 기타 의미 단위일 수도 있음
- 컴퓨터가 자연어를 이해할 수 있게 나누는 과정
- → 토큰화
- 토큰화
- 컴퓨터가 텍스트를 보다 효율적으로 분석하고 처리할 수 있도록 하는 중요한 단계
- 토큰화를 위해 토크나이저 사용
- 토크나이저 : 텍스트 문자열을 토큰으로 나누는 알고리즘 또는 소프트웨어
- 토크나이저 구축 방법
- 공백 분할 : 텍스트를 공백 단위로 분리해 개별 단어로 토큰화
- 정규표현식 적용 : 정규 표현식으로 특정 패턴을 식별해 텍스트 분할
- 어휘 사전 적용 : 사전에 정의된 단어 집합을 토큰으로 사용
- 직접 어휘 사전을 구축하기 때문에 없는 단어나 토큰 존재 가능→ OOV 문제를 고려해 토큰화하는 것이 중요
- 큰 어휘 사전을 구축 → 차원의 저주에 빠질 수 있음
- 차원의 저주?
- 희소 데이터의 표현 방법은 어휘 사전에 등장하는 출현 빈도만 고려하기 때문에 문장에서 발생한 토큰들의 순서 관계를 잘 표현하지 못함
- 모든 토큰이나 단어를 벡터화하면 어휘 사전에 등장하는 토큰 개수만큼 차원이 필요하고 벡터값이 거의 모두 0의 값을 가지는 희소 데이터로 표현됨
- 학습 데이터의 차원이 증가할수록 학습에 필요한 데이터가 증가하거나 모델의 성능이 저하되는 현상
- → 이러한 토큰을 OOV라고 함
- 직접 어휘 사전을 구축하기 때문에 없는 단어나 토큰 존재 가능→ OOV 문제를 고려해 토큰화하는 것이 중요
- 머신러닝 활용 : 데이터세트를 기반으로 토큰화하는 방법을 학습한 머신러닝 적용
단어 및 글자 토큰화
단어 토큰화
→ 텍스트 데이터를 의미 있는 단위인 단어로 분리하는 작업
- 띄어쓰기, 문장 부호, 대소문자 등의 특정 구분자를 활용해 토큰화 수행
- 품사 태깅, 개체명 인식, 기계 번역 등의 작업에 주로 사용
- 문자열 데이터 형태는 split 메서드를 이용해 쉽게 토큰화
- 주어진 구분자를 통해 문자열을 리스트 데이터로 나눔
- 구분자를 입력하지 않으면 공백을 기준으로 나눔
글자 토큰화
→ 띄어쓰기뿐만 아니라 글자 단위로 문장을 나누는 방식
- 비교적 작은 단어 사전 구축 가능
- 학습 시 컴퓨터 자원 아낄 수 있음
- 전체 말뭉치를 학습할 때 각 단어를 더 자주 학습할 수 있음
- 언어 모델링과 같은 시퀀스 예측 작업에 활용
- 리스트 형태로 변환하면 쉽게 수행 가능
- 공백도 토큰으로 나뉨
- 영어의 경우 각 알파벳으로 나뉘지만 한글의 경우 자소 단위로 나눠서 토큰화 수행
- 자모 라이브러리 활용 pip install jamo컴퓨터가 한글을 인코딩하는 방식완성형 → 조합된 글자 자체에 값을 부여해 인코딩
- h2j 함수 : 완성형으로 입력된 한글을 조합형 한글로 변환
- j2hcj 함수 : 조합형 한글 문자열을 자소 단위로 나눠 반환
- 조합형 → 글자를 자모 단위로 나눠 인코딩한 뒤 이를 조합해 한글 표현
- → 한글 문자 및 자모 작업을 위한 한글 음절 분해 및 합성 라이브러리
- 자모 라이브러리 활용 pip install jamo컴퓨터가 한글을 인코딩하는 방식완성형 → 조합된 글자 자체에 값을 부여해 인코딩
- 접사와 문장 부호의 의미 학습 가능
- 작은 크기의 단어 사전으로 OOV를 획기적으로 줄일 수 있음
- But, 개별 토큰은 아무런 의미가 없음
- → 자연어 모델이 각 토큰의 의미를 조합해 결과 도출해야 함
- 토큰 조합 방식을 사용해 문장 생성이나 개체명 인식 등을 구현할 경우
- 다의어나 동음이의어가 많은 도메인에서 구별하는 것이 어려울 수 있음
- 모델 입력 시퀀스의 길이가 길어질수록 연산량 증가
형태소 토큰화
⇒ 텍스트를 형태소 단위로 나누는 토큰화 방법
언어의 문법과 구조를 고려해 단어를 분리하고 이를 의미 있는 단위로 분류
한국어와 같이 교착어인 언어에서 중요하게 수행
형태소
→ ‘그’, ‘-는’, ‘나’, ‘-에게’ 등과 같이 실제로 의미를 가지고 있는 최소의 단위
- 자립 형태소
- 스스로 의미를 가지고 있는 형태소
- 단어의 기본이 되는 형태소
- 명사, 동사, 형용사
- 의존 형태소
- 스스로 의미를 갖지 못하고 다른 형태소와 조합되어 사용되는 형태소
- 자립 형태소와 함께 조합되어 문장에서 특정한 역할 수행
- 조사, 어미, 접두사, 접미사 등
형태소 어휘 사전
⇒ 자연어 처리에서 사용되는 단어의 집합인 어휘 사전 중에서도 각 단어의 형태소 정보를 포함하는 사전
단어가 어떤 형태소들의 조합으로 이루어져 있는지에 대한 정보를 담고 있어, 형태소 분석 작업에서 매우 중요한 역할
ex. “그는 나에게 인사를 했다”, “나는 그에게 인사를 했다”
→ 띄어쓰기를 활용해 토큰화 수행
[’그는’, ‘나에게’, ‘인사를’, ‘했다’, ‘나는’, ‘그에게’]
→ 말뭉치에 “그녀는 그에게 인사를 했다” 라는 문장 추가
‘그는’, ‘나는’, ‘그녀는’과 같은 데이터를 같은 의미 단위로 인식하지 못함
→ 형태소 단위로 어휘 사전 구축하면 [’-는’, ‘-에게’, ‘그’, ‘나’]와 같은 정보에서 ‘그녀’의 토큰 정보만 새로 학습해 ‘그녀는’, ‘그녀에게’ 같은 어휘 쉽게 학습 가능
일반적으로 각 형태소가 어떤 품사에 속하는지와 해당 품사의 뜻 등의 정보도 함께 제공
→ 품사 태깅
텍스트 데이터를 형태소 분석해 각 형태소에 해당하는 품사를 태깅하는 작업
KoNLPY
⇒ 한국어 자연어 처리를 위해 개발된 라이브러리
명사 추출, 형태소 분석, 품사 태깅 등의 기능 제공
pip install konlpy
자바 언어 기반의 한국어 형태소 분석기로 자바 개발 키트 기반으로 개발
Okt, 꼬꼬마, 코모란, 한나눔, 메캅 등의 다양한 형태소 분석기 지원
- Okt→ 명사 추출, 구문 추출, 형태소 추출, 품사 태깅 지원
- 명사 추출, 구문 추출, 형태소 추출
- 입력된 문장에서 각각 명사, 어절 구 단위, 형태소만 추출해 리스트 반환
- 품사 태깅
- 입력된 문장에서 각 단어에 대한 품사 정보를 추출하여 (형태소, 품사) 형태의 튜플로 구성된 리스트 반환
- 문장을 입력받아 명사, 구, 형태소, 품사 등의 정보를 추출하는 여러 가지 메서드 제공
- 꼬꼬마구문 추출 기능은 지원하지 않지만, 명사 추출 기능 제공
- 명사, 문장, 형태소, 품사 추출 가능
- Okt & 꼬꼬마 비교Okt 꼬꼬마
명사 추출 ‘할’ ‘하’, ‘ㄹ’ 품사 태깅 19개 56개
NLTK
⇒ 자연어 처리를 위해 개발된 라이브러리
토큰화, 형태소 분석, 구문 분석, 개체명 인식, 감성 분석 등 기능 제공
주로 영어 자연어 처리를 위해 개발 But, 다양한 언어의 자연어 처리를 위한 데이터와 모델 제공
pip install nltk
Punkt 모델
- 트리뱅크라는 대규모의 영어 말뭉치를 기반으로 학습됨
- 통계 기반 모델
Averaged Perceptron Tagger 모델
- 트리뱅크라는 대규모의 영어 말뭉치를 기반으로 학습됨
- 퍼셉트론 기반으로 품사 태깅 수행
단어 토크나이저 word_tokenize
→ 문장을 입력받아 공백을 기준으로 단어를 분리하고 구두점 등을 처리해 각각의 단어를 추출해 리스트로 반환
문장 토크나이저 sent_tokenize
→ 문장을 입력받아 마침표, 느낌표, 물음표 등의 구두점을 기준으로 문장을 분리해 리스트로 반환
품사 태깅 pos_tag
→ 토큰화된 문장에서 품사 태깅 수행
spaCy
⇒ 사이썬 기반으로 개발된 오픈 소스 라이브러리
빠른 속도와 높은 정확도를 목표로 하는 머신러닝 기반의 자연어 처리 라이브러리
효율적인 처리 속도와 높은 정확도를 제공하는 것이 목표
GPU 가속을 비롯해 영어, 프랑스어, 한국어, 일본어 등을 비롯해 24개 이상의 언어로 사전학습된 모델 제공
spaCy 모델 불러오기 함수 load 를 통해 모델 설정
객체 지향적으로 구현돼 처리한 결과를 doc 객체에 저장
→ doc 객체는 다시 여러 token 객체로 이뤄짐
이 token 객체에 대한 정보를 기반으로 다양한 자연어 처리 작업 수행
nlp 인스턴스에 문장을 입력하면 doc 객체가 반환되며 token 객체의 tag_나 pos_와 같은 속성에 접근해 값 확인 가능
📢token 객체 속성
기본 품사 속성 pos_ , 세분화 품사 속성 tag_ , 원본 텍스트 데이터 text, 토큰 사이의 공백을 포함하는 텍스트 데이터 text_with_ws , 벡터 vector , 벡터 노름 vector_norm
하위 단어 토큰화
- 언어는 시간이 지남에 따라 변화하고 새로운 단어나 표현이 등장하며 더 이상 사용되지 않는 단어나 표현 생김
- 현대의 일상 언어에서는 맞춤법이나 띄어쓰기가 엄격하게 지켜지지 않는 경우가 많고 형태소 분석기의 취약점인 신조어나 고유어 등이 빈번하게 생김
- 형태소 분석기는 모르는 단어를 적절한 단위로 나누는 것에 취약
- → 어휘 사전의 크기를 크게 만들고 OOV에 대응하게 어렵게 만듦
⇒ 문제 해결을 위한 방법으로 하위 단어 토큰화
하위 단어 토큰화란?
⇒ 하나의 단어가 빈번하게 사용되는 하위 단어의 조합으로 나누어 토큰화하는 방법
단어의 길이를 줄일 수 있어서 처리 속도 빨라짐
OOV 문제, 신조어, 은어, 고유어 등으로 인한 문제 완화 가능
바이트 페어 인코딩
⇒ 연속된 글자 쌍이 더 이상 나타나지 않거나 정해진 어휘 사전 크기에 도달할 때까지 조합 탐지와 부호화를 반복
→ 이 과정에서 자주 등장하는 단어는 하나의 토큰으로 토큰화되고, 덜 등장하는 단어는 여러 토큰의 조합으로 표현됨
입력 데이터에서 가장 많이 등장한 글자의 빈도수를 측정하고 가장 빈도수가 높은 글자 쌍 탐색
BPE 알고리즘을 사용해 말뭉치에서 자주 등장하는 글자 쌍을 찾아 어휘 사전 구축
❗센텐스피스 라이브러리와 코포라 라이브러리 실습❗
워드피스
⇒ 빈도 기반이 아닌 확률 기반으로 글자 쌍 병합
학습 과정에서 확률적인 정보 사용
모델이 새로운 하위 단어를 생성할 때 이전 하위 단어와 함께 나타날 확률을 계산해 가장 높은 확률을 가진 하위 단어 선택
→ 선택된 하위 단어는 이후에 더 높은 확률로 선택될 가능성이 높음
→ 모델이 좀 더 정확한 하위 단어로 분리 가능
❗토크나이저스 라이브러리 실습❗
→ 정규화, 사전 토큰화 기능 제공