Data scientist/자연어처리

Preprocessing

맨사설 2021. 10. 11. 13:55
728x90

 

◎ 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 단위로 사용해도 무방
  • 일본어 : 기본적인 띄어쓰기가 없음

 

○ 형태소 분석 및 품사 태깅

  • 형태소 분석 : 형태소를 비롯하여, 어근, 접두사/접미사, 품사 등 다양한 언어적 속성의 구조를 파악하는 것
  • 품사 태깅 : 형태소의 뜻과 문맥을 고려하여 그것에 마크업을 하는 일

POS Tagger for Other Languages

 

 

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

  1. 단어 사전 생성(빈도 포함)
  2. Character 단위로 분절 후, pair 별 빈도 카운트
  3. 최빈도 pair를 골라, merge 수행
  4. Pair 별 빈도 카운트 업데이트
  5. 3번 과정 반복

 

Applying

  1. 각 단어를 character 단위로 분절
  2. 단어 내에서 '학습 과정에서 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

  1. Bi-lingual Corpus 정제 (노이즈 제거)
  2. Tokenization 수행
  3. 각 언어별 코퍼스에 대해서 word embedding 수행 (FastText 활용)
  4. MUSE를 활용하여 word translation dictionary 추출
  5. Champollion을 활용하여 align 수행

 

※ 전처리의 중요성

  • 오픈 소스 문화의 확산
  • 데이터가 더 큰 자산
  • 반복되고 지치는 업무지만, 소홀히 하면 안 됨

 

How to make a mini-batch

모델에 넣기 위한 마지막 변환 과정

○ Read text & Build Dictionary

  • 빈도 순으로 단어 사전 정력
  • 필요에 따라 min_count 보다 작은 빈도를 갖는 단어는 제외 또는 max_vocab에 따라 빈도순으로 어휘를 제외하기도 함
  • 필요에 따라 특수 토큰도 어휘 사전에 포함 (<BOS>, <EOS>, <UNK>, <PAD> 등)

 

※ 효율적인 학습이 가능한 미니배치 만들기

  1. 코퍼스의 각 문장들을 길이에 따라 정렬
  2. 각 token들을 사전을 활용하여 str -> index 맵핑
  3. 미니배치 크기대로 chunking
  4. 각 미니배치 별 텐서 구성 및 padding
  5. 학습 시 미니배치 shuffling하여 iterative하게 반환

 

 

728x90

'Data scientist > 자연어처리' 카테고리의 다른 글

Text Classification  (0) 2021.10.15
Word Embedding  (0) 2021.10.14
자연어처리  (0) 2021.10.05