◎ NLP Project Workflow
문제 정의 ▷ 데이터 수집 ▷ 데이터 전처리 및 분석 ▷ 알고리즘 적용 ▷ 평가 ▷ 배포
◎ Preprocessing Workflow
데이터 수집 ▷ 정제 ▷ 레이블링 ▷ Tokenization ▷ Subword Segmentation ▷ Batchify
◎ 말뭉치(Corpus)란?
- 자연어처리를 위한 문장들로 구성된 데이터셋
- 복수 표현 : Corpora
- Parallel Corpus : 대응되는 문장 쌍이 labeling 되어 있는 형태
◎ Service Pipeline
◎ 데이터 구입 및 외주의 한계
- 구입 : 양질의 데이터를 얻을 수 있음, 양이 매우 제한적이다.
- 외주 : 수집, 정제 및 레이블링을 외주 줄 수 있음, 가장 높은 비용 -> 양이 매우 제한적, 품질 관리를 위한 인력 추가로 필요
- 무료 공개 데이터 : 양이 매우 제한적, 한국어 코퍼스는 흔치 않음 (AI-HUB, WMT competetion, Kaggle, OPUS)
- Crawling : 무한한 양의 코퍼스 수집 가능, 원하는 도메인 별로 수집 가능, 품질이 천차만별이며, 정제 과정에 많은 노력 필요 + 아직은 회색지대, 하지만 적법한 절차에 따른 크롤링 필수
◎ 노이즈 제거
Two Steps
- 기계적인 노이즈 제거 : 전각 문자 변환, Task에 따른 노이즈 제거
- Interactive 노이즈 제거 : 코퍼스의 특성에 따른 노이즈 제거, 작업자가 상황을 확인하며 작업 수행
주의할 점
- Task에 따른 특성 : 풀고자 하는 문제의 특성에 따라 전처리 전략이 다르다.
- 언어, 도메인, 코퍼스에 따른 특성 : 각 언어, 도메인, 코퍼스 별 특성이 다르므로 다른 형태의 전처리 전략이 필요
전각 문자 제거
- 유니코드 이전의 한글, 한자, 일본어는 전각 문자로 취급
- 반각 문자로 표기 가능한 전각 문자의 경우, 반각 문자로 치환
대소문자 통일
- 코퍼스에 따라 대소문자 표기법이 다름
- 하나의 단어를 다양하게 표현하면 희소성이 높아짐
- 딥러닝의 시대에 오면서 대소문자 통일의 필요성 하락 및 생략 가능
정규식을 활용한 정제
- 정규식(regular expression)을 활용하면 복잡한 규칙의 노이즈도 제거/치환 가능
- 코딩 없이 단순히 텍스트 에디터도 가능
Interactive 노이즈 제거 과정
- 규칙에 의해 노이즈를 제거하기 때문에, 노이즈 전부를 제거하는 것은 어려움
- 따라서 반복적인 규칙 생성 및 적용 과정 필요
- 끝이 없는 과정, Sweet spot을 찾아야 함
◎ Regular Expression (정규식)
RegEx 적용 방법
1. Text Editor 활용
- 파일을 열어 적용 과정을 보면서 정제
- 바로 결과를 확인할 수 있음
- 적용 과정이 log로 남지 않음, 재활용 불가
2. 전용 모듈 작성 및 활용
- Python 등을 활용하여 모듈을 만들고 regex 리스트를 파일로 받아서 처리
- 한 번에 모든 regex를 적용, 중간 결과 확인 불가
- regex 재활용 가능
※ [ ]
- 2,3,4,5, c, d, e 중의 character
- [2345cde]
※ [-]
- 2,3,4,5와 c, d, e 중의 character
- [2-5c-e]
※ [^]
- 2,3,4,5와 c, d, e를 제외한 모든 character
- [^2-5c-e]
※ ( )
- x를 \1에 지정, yz를 \2에 지정
- (x)(yz)
※ |
- x 또는 y가 나타남. 그리고 \1에 지정
- (x|y)
※ ?
- x가 0번 또는 1번 나타남
- x?
※ +
- x가 한 번 이상 나타남
- x+
※ *
- x가 나타나지 않을 수도, 반복될 수도 있음
- 강력한 표현, 유의해서 사용해야 함
- x*
※ {n}
- n번 반복
- x{n}
※ {n,}
- n번 이상 반복
- x{n,}
※ {n, m}
- n번부터 m번까지 반복
- x{n, m}
※ .
- any character
- 매우 강력한 표현, 유의해서 사용해야 함
※ ^ $
- 문장의 시작과 끝을 표시
- ^x$
◎ Labeling
□ Text Classification
- INPUT : sentence
- OUTPUT : class
- TSV 형태의 하나의 파일 : 각 row가 문장과 대응되는 레이블, 문장 column과 레이블 column 구성
□ Token Classification
- INPUT : sentence
- OUTPUT : tag for each token -> sequence
□ Sequence-to-Sequence
- INPUT : sentence
- OUTPUT : sentence
- TSV 형태의 하나의 파일 : 각 row가 대응되는 문장 쌍, 각 문장 별로 column을 구성
- 두 개 이상의 파일로 구성 : 같은 순서의 row가 대응되는 문장 쌍, 한 문장당 여러 레이블이 존재할 경우
◎ Tokenization
Two Steps
1. Sentence Segmentation
2. Tokenization
○ Sentence Segmentation
- 우리가 수집한 corpus는 한 라인에 여러 문장이 들어있거나, 한 문장이 여러 라인에 들어있음
- Sentence Segmentation을 통해 원하는 형태로 변환 : 마침표 등을 단순히 문장의 끝으로 처리하면 안 됨
- NLTK를 활용하여 변환 가능
○ Tokenization
- Why? 두 개 이상의 다른 token들의 결합으로 이루어진 단어를 쪼개어, vocaulary 숫자를 줄이고, 희소성을 낮추기 위해 사용
○ Korean Tokenization
- Why? 교착어 : 어근에 접사가 붙어 다양한 단어가 파생됨, 띄어쓰기 통일의 필요성
- 영어 : 띄어쓰기가 이미 잘 되어 있음. NLTK를 사용하여 comma 등 후처리
- 중국어 : 기본적인 띄어쓰기가 없음, Character 단위로 사용해도 무방
- 일본어 : 기본적인 띄어쓰기가 없음
○ 형태소 분석 및 품사 태깅
- 형태소 분석 : 형태소를 비롯하여, 어근, 접두사/접미사, 품사 등 다양한 언어적 속성의 구조를 파악하는 것
- 품사 태깅 : 형태소의 뜻과 문맥을 고려하여 그것에 마크업을 하는 일
◎ Characteristic of Tokenization Style
◇ 토근 평균 길이가 짧을수록
- Vocabulary 크기 감소 -> 희소성 문제 감소
- OoV가 줄어듦 (OoV : Out of Vocabulary, <UNK>로 치환)
- Sequence의 길이가 길어짐 -> 모델의 부담 증가
- 극단적 형태 : character 단위
◇ 토근 평균 길이가 길 수록
- Vocabulary 크기 증가 -> 희소성 문제 증가
- OoV가 늘어남 (OoV : Out of Vocabulary, <UNK>로 치환)
- Sequence의 길이가 짧아짐 -> 모델의 부담 감소
◇ 정보량에 따른 이상적인 형태
- 빈도가 높을 경우 하나의 token으로 나타내고
- 빈도가 낮을 경우 더 잘게 쪼개서, 각각 빈도가 높은 token으로 구성한다.
◎ Subword Segmentation
◇ 단어보다 더 작은 의미 단위 : Subword
- 많은 언어들에서, 단어는 더 작은 의미 단위들이 모여 구성됨
- 따라서 이러한 작은 의미 단위로 분절할 수 있다면 좋을 것
- 하지만 이를 위해선 언어별 subword 사전이 존재해야 할 것
◇ Byte Pair Encoding (BPE) 알고리즘
- 압축 알고리즘을 활용하여 subword segmentation 적용
- 학습 코퍼스를 활용하여 BPE 모델을 학습 후, 학습/테스트 코퍼스에 적용
- 장점 : 희소성을 통계에 기반하여 효과적으로 낮출 수 있다, 언어별 특성에 대한 정보 없이, 더 작은 의미 단위로 분절할 수 있다, OoV를 없앨 수 있다.
- 단점 : 학습 데이터 별로 BPE 모델도 생성됨
◇ BPE Training & Applying
Training
- 단어 사전 생성(빈도 포함)
- Character 단위로 분절 후, pair 별 빈도 카운트
- 최빈도 pair를 골라, merge 수행
- Pair 별 빈도 카운트 업데이트
- 3번 과정 반복
Applying
- 각 단어를 character 단위로 분절
- 단어 내에서 '학습 과정에서 merge에 활용된 pair의 순서대로' merge 수행
◇ OoV가 미치는 영향
- 입력 데이터에 OoV가 발생할 경우, <UNK> 토큰으로 치환하여 모델에 입력
- 이전 단어들을 기반으로 다음 단어를 예측하는 task에서 치명적
- 어쨌든 모르는 단어지만, 알고 있는 subword들을 통해 의미를 유추해볼 수 있음
◎ Detokenization
◇ Tokenization
- tokenization을 수행하고, 기존 띄어쓰기와 구분을 위해 _ 삽입
- subword segmentation을 수행, 공백 구분 위한 _ 삽입
◇ Detokenization
- whitespace를 제거
- _ _을 white space로 치환
- _를 제거
◎ Parallel Corpus
- 대부분의 경우, 문서 단위의 matching은 되어 있지만, 문장 단위는 되어 있지 않음
- Champollion : 최초로 이집트 상형문자를 해독한 역사학자, 단어 번역 사전에 기반하여 사전을 최대한 만족하는 sentence align을 찾는 방식
※ Procedure to Build parallel corpus
- Bi-lingual Corpus 정제 (노이즈 제거)
- Tokenization 수행
- 각 언어별 코퍼스에 대해서 word embedding 수행 (FastText 활용)
- MUSE를 활용하여 word translation dictionary 추출
- Champollion을 활용하여 align 수행
※ 전처리의 중요성
- 오픈 소스 문화의 확산
- 데이터가 더 큰 자산
- 반복되고 지치는 업무지만, 소홀히 하면 안 됨
◎ How to make a mini-batch
○ Read text & Build Dictionary
- 빈도 순으로 단어 사전 정력
- 필요에 따라 min_count 보다 작은 빈도를 갖는 단어는 제외 또는 max_vocab에 따라 빈도순으로 어휘를 제외하기도 함
- 필요에 따라 특수 토큰도 어휘 사전에 포함 (<BOS>, <EOS>, <UNK>, <PAD> 등)
※ 효율적인 학습이 가능한 미니배치 만들기
- 코퍼스의 각 문장들을 길이에 따라 정렬
- 각 token들을 사전을 활용하여 str -> index 맵핑
- 미니배치 크기대로 chunking
- 각 미니배치 별 텐서 구성 및 padding
- 학습 시 미니배치 shuffling하여 iterative하게 반환
'Data scientist > 자연어처리' 카테고리의 다른 글
Text Classification (0) | 2021.10.15 |
---|---|
Word Embedding (0) | 2021.10.14 |
자연어처리 (0) | 2021.10.05 |