1. 전처리 과정
1)코퍼스(Corpus, 말뭉치) 수집
- 코퍼스란 자연어 연구를 위해 특정한 목적을 가지고 언어의 표본을 추출한 집합이다.
- 코퍼스가 많고 오류가 없을 수록 자연어 처리 모델은 더욱 정교해지고 정확도가 높아진다.
2)정제 - 정규화(Normalization)
- 텍스트를 사용하기 위한 필수 과정이다.
- 원하는 업무, 문제, 응용 분야에 따라 필요한 정제의 수준, 깊이가 상이하다.
예시
음성 인식을 위한 언어 모델: 괄호, 기호, 특수문자 등 포함 금지
개인정보, 민감한 정보: 제거 또는 변조해서 모델링
전각 문자 제거
- 중국어, 일본어 문서는 대부분 전각 문자로 표기된다.
- 한국어 문서의 일부는 전각 문자로 표기된 기호, 숫자 등을 사용한다.
- 데이터 처리는 반각 문자를 기준으로 하므로 전각 문자를 반각 문자로 변형하는 작업이 요구된다.
- 전각 문자 : 문자의 폭이 영문자 고정폭의 두 배 정도의 폭을 가지는 문자
- 반각 문자 : 전각 문자 폭의 절반을 폭으로하는 문자(영어)
대소문자 통일
- 일부 영어 코퍼스에서는 약자 등에서 대소문자 표현이 통일되지 않는다.
예: New York City 약자 → NYC, nyc, N.Y.C., N.Y.C 등
- 데이터를 하나의 형태로 통일하여 희소성을 줄이는 효과를 기대할 수 있다.
- 희소 표현에 의한 메모리 사용량 감소가 가능하다.
- 하지만 다양한 단어들을 비슷한 값의 벡터로 나타낼 수 있게 되면서, 대소문자 통일과 같은 문제를 해결할 필요성이 줄어들었다.
정규 표현식을 사용한 정제
- 다량의 코퍼스는 특수문자, 기호 등의 노이즈가 많다.(특히 크롤링의 경우)
- 웹 사이트의 성격에 따라 일정한 패턴을 가지는 경우도 많다.
- 이러한 노이즈들을 효과적으로 감지하고 없애려면 정규표현식이 필요하다.
3)문장 단위 분절(Tokenizing)
- 여러 문장이 한 라인에 있거나, 한 문장이 여러 라인에 걸쳐 있는 경우에는 문장 단위의 분절이 필요하다.
- 단순히 마침표만을 기준으로 문장 단위 분절을 수행하면 소수점 등 여러가지 문제에 마주칠 수 있다.
- 따라서 분절해주는 모듈을 만들거나 NLTK 등에서 제공하는 분절 모듈을 이용한다.
- NLTK (Natural Language Toolkit)
4)단어 단위 분절(Tokenizing) : 형태소 분석
- 풀고자 하는 문제에 따라 형태소 분석 또는 단순 분절을 통한 정규화를 수행한다.
- 한국어의 경우 띄워쓰기가 이미 되어 있어도 제각각인 경우가 많기 때문에, 정규화를 해주는 의미로 다시 한 번 표준화된 띄어쓰기를 적용하는 과정이 필요하다.
- 또한, 교착어로써 접사를 어근에서 분리해주는 역할도 하므로 희소성 문제를 해소하기도 한다.
- 영어의 경우 띄어쓰기가 필수이고 대부분 규칙이 잘 지켜진다. 다만 언어 모델을 더 용이하게 구성할 수 있도록 일불 처리를 더 해주면 좋다. NLTK를 사용하여 이러한 전처리를 수행한다.
- 한국어의 경우 Mecab, KoNLPy 등을 사용한다.
5)병렬 코퍼스 정렬
- 병렬 코퍼스란 동일한 내용을 가진 복수 언어 말뭉치(코퍼스)이다.
- 예를들어, 한국어 원문과 영어 번역문을 문장 단위로 대응시켜 DB를 구축한 것.
- 대부분의 병렬 코퍼스들은 여러 문장 단위로 정렬된다.
- 예를 들어, 영자 신문에서 크롤링한 영문 뉴스 기사는 한글 뉴스 기사에 매핑되지만, 문서와 문서 단위의 매핑일 뿐 문장 대 문장에 관한 정렬을 이루어져있지 않다. 이런 경우, 각각의 문장에 대해 정렬해주어야 한다.
- 그 과정에서 불필요한 문장들을 걸러내고, 문장 간 정렬이 맞지 않는 경우 정렬을 재정비하거나 아예 걸러내야 한다.
5.1)병렬 코퍼스 제작 프로세스
AIDA Lab 자료참고
5.2)사전 생성
- 단어 사전 구축에는 많은 비용이 요구된다.
- 페이스북의 MUSE는 병렬 코퍼스가 없는 상황에서 사전을 구축하는 방법과 코드를 제공한다.
- 비지도 학습을 적용한 모델
- 구축된 사전은 CTK의 입력으로 사용된다.
5.3)CTK(Champollion Toolkit)를 활용한 정렬
- 구축된 단어사전을 이용하여 여러 라인으로 구성된 언어별 문서에 대해 문장 정렬을 수행한다.
- 정렬 결과 예시
AIDA Lab 자료참고
6)서브워드 분절
- 만약 컴퓨터가 학습하지 않은 단어가 등장하면 OOV(Out Of Vocabulary), UNK(Unknown Token)라고 표현된다.
- 컴퓨터가 아무리 많은 단어를 학습해도 세상의 모든 단어를 학습할 수는 없기 때문에 이를 해결하기 위한 하나의 방안인 서브워드가 등장했다.
- 서브워드 분리 작업은 하나의 단어를 의미있는 더 작은 단위로 분리하는 것이다.
- 예를들어, birthday = birth + day의 조합으로 구성할 수 있음.
서브워드 분절 기법
- “단어는 의미를 가진 더 작은 서브워드들의 조합으로 이루어진다”는 가정하에 적용되는 알고리즘이다.
- BPE(Byte Pair Encoding) 알고리즘을 기반으로 한다.
- 현재 시점에서 필수 전처리 방법으로 꼽힌다.
서브워드 분절 효과
- 적절하게 분절하면 어휘 수 감소 및 희소성의 효과적인 감소가 가능하다.
- UNK(Unknwon) 토큰에 대한 효과적인 대처가 가능하다.
- 서브워드 단위 분절을 통해 신조어나 오타와 같은 UNK에 대해 서브워드 단위나 문자 단위로 쪼개줌으로써 기존 훈련 데이터에서 보았던 토큰들의 조합으로 만들수 있다.
- 즉, UNK 자체를 없앰으로써 효율적으로 UNK에 대처할 수 있고, 자연어 처리 알고리즘의 결과물 품질을 향상시킬 수 있다.
- 구글의 SentencePiece 모듈이 속도가 빠르다.
2. Tokenizing
- 자연어를 컴퓨터에게 이해시키기 위해 토큰 단위로 나누는 작업
- 문장 형태의 데이터를 처리하기 위해 제일 처음 수행해야 하는 기본적인 작업
- 주로 텍스트 전처리 과정에서 사용된다.
- 토큰 : 의미가 있는 가장 작은 단어(정보 단위)
BPE (Byte Pair Encoding)
- 1994년 제안된 정보 압축 알고리즘
- 데이터에서 가장 많이 등장한 문자열을 병합하여 데이터를 압축하는 기법
- 데이터에 등장한 글자를 초기 사전으로 구성하여 연속된 두 글자를 한 글자로 병합하는 방식 적용
- 최근에는 자연어 처리 모델에 널리 쓰이는 토큰화 기법
- 대표적인 활용 모델 : GPT 모델
BPE 알고리즘의 특징
분석 대상 언어에 대한 지식이 필요하지 않음
말뭉치(코퍼스)에서 자주 나타나는 문자열(서브 워드)을 토큰으로 분석
BPE 알고리즘 적용 예시
초기 사전: (a, b, c, d) → 4개, 문자열: aaabdaaabac → 11자
aaabdaaabac → aa를 Z로 병합 → ZabdZabac
ZabdZabac → ab를 Y로 병합 → ZYdZYac
ZYdZYac → ZY를 X로 병합 → XdXac
BPE 수행 이후
사전: (a, b, c, d, Z, Y, X) → 7개
결과 문자열: XdXac → 5자
BPE 활용 토큰화 절차
1)어휘 집합 구축 : 자주 등장하는 문자열 병합 후 어휘집합 추가 반복
AIDA Lab 참고자료
2)토큰화 : 문장의 각 어절에서 어휘 집합에 있는 서브 워드를 어절에서 분리
AIDA Lab 참고자료
Tokenizing(형태소 분석)
KoNLPy
KoNLPy 내부에서 다양한 형태소 분석기를 통합하여 라이브러리 형태로 제공
- Kkma (꼬꼬마, 서울대에서 개발, GPL2 라이센스)
- Komoran (코모란, Shineware에서 자바로 개발, Apache 2.0 라이센스)
- Okt (트위터에서 개발, Apache 2.0 라이센스)
원-핫 인코딩(One-Hot Encoding)
단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여하고, 다른 인덱스에는 0을 부여하는 단어의 벡터 표현 방식이다. 두 가지 과정으로 정리 할 수 있다. 1) 정수 인코딩 2) 해당 단어 1부여, 나머지 0부여
패딩(Padding)
자연어 처리를 하다보면 문장(또는 문서)의 길이가 서로 다를 수 있다. 그런데 기계는 길이가 전부 동일한 문서들에 대해서는 하나의 행렬로 보고, 한꺼번에 묶어서 처리할 수 있다. 다시 말해 병렬 연산을 위해서 여러 문장의 길이를 임의로 동일하게 맞춰주는 작업이 필요할 때가 있다.
쉽게 말해 병렬 연산을 위해 문장(또는 문서)의 길이를 동일하게 맞춰 주는 작업이다. 길면 자르고, 짧으면 특정 값으로 채워준다.
※ 패딩을 할 때 가장 긴 길이를 가진 문서의 길이를 기준으로 패딩을 한다고 능사는 아니다. 가령, 모든 문서의 평균 길이가 20인데 문서 1개의 길이가 5,000이라고 해서 굳이 모든 문서의 길이를 5,000으로 패딩할 필요는 없을 수 있다. 반대로 너무 짧게 잡으면 잘려나가는 데이터들이 많이 존재하므로, 문서 길이의 분포를 보고 결정하는 것이 좋다.
'Deep learning > 자연어처리' 카테고리의 다른 글
BERT (0) | 2023.08.03 |
---|---|
bert 모델 공부하기 (0) | 2023.07.28 |
01. 자연어 처리 개요 (0) | 2022.08.17 |
트랜스포머 , GPT 코드 구현 (0) | 2020.10.16 |