데이터 분석/자연어처리

1. 자연어 처리(NLP, NLU, NLG) - 수집, 정제, tokenization

Jerry Jun 2021. 1. 14. 15:50
728x90

# 자연어(Natural Language)란 무엇일까.

위키피디아에 따르면 사람들이 일상생활에 쓰는 언어를 인공적으로 만들어진 언어와 구분하여 쓰는 말이라고 되어있다. 

 

# 그렇다면 NLP(Natural Language Processing) 은 무엇일까.

NLP 에는 크게 NLU 와 NLG 로 이루어져 있다.

  • NLU : 자연어를 컴퓨터가 이해할 수 있는 값으로 바꾸는 과정

  • NLG : 컴퓨터가 이해한 값을 사람이 이해할 수 있도록 바꾸는 과정


내가 공부하는 자연어 처리는 딥러닝을 기반으로 한다.

자연어 처리 과정은 다음과 같다.

 

NLP Workflow

 

자연어 처리에서 흔히 아는 것 중 하나는 "감정 분석" 이다. 문제 정의 단계에서는 무엇을 할 것인지에 대해서 정하는 단계인데 '나는 감정 분석을 구현해보겠다.' 라고 생각한다면 그것 또한 문제 정의 단계를 거치는 중 일 것이다. 데이터 수집 단계에서는 감정 분석을 할 영화 리뷰 댓글 혹은 블로그 후기글 등이 있는데 이러한 데이터들을 수집하는 단계가 된다. 이 단계에서 필요하다면 레이블링을 해야 할 수 있다. 학습을 시키기 위해 이 문장은 긍정이고 이 문장은 부정이야 라고 설정해야 하는 경우가 있기 때문이다. 데이터 전처리 및 분석 단계에서는 데이터를 원하는 모형으로 가공하고 탐색적 데이터 분석(EDA) 를 통해 구조를 알아볼 수 있다. 알고리즘 구현 단계부터는 아직 시기상조이니 나중에 알아봐야겠다.

 


# 말뭉치(Corpus)

자연어처리를 들어가기에 앞서 알아야 할 단어가 있다. 말뭉치(Corpus)는 자연어 처리를 위한 문장들로 구성된 데이터셋이다. 말뭉치들(복수형)은 Corpora 라고도 한다.

  • Monolingual Corpus : 하나의 언어로 구성된 말뭉치

  • Bi-lingual Corpus : 두 개의 언어로 구성된 말뭉치

  • Multilingual Corpus : 다수의 언어로 구성된 말뭉치

  • Parallel Corpus : 문장들이 대응되도록 라벨링 되어있는 말뭉치


processing workflow

# 데이터 처리 과정

@ 데이터 수집

자연어 처리를 위한 데이터의 처리 과정을 간략하게 그림으로 표현하였다. 데이터는 많은 경우를 통해 수집할 수 있다. 일반적으로 구입할 수도 있고 외주를 맡겨 받을 수도 있다. 하지만 비용적으로 부담이 되는 단점이 있고 데이터의 양 또한 만족스럽지 못하는 경우가 있다고 한다. 다른 경우는 Kaggle 같은 오픈된 데이터도 있지만 내가 원하는 것이 없을 수 있고 양 또한 많지 않아 힘들 것이다.

 

 그렇기 때문에 사용하는 것이 크롤링(Crawling) 이다. 내가 원하는 만큼 원하는 곳에서 데이터를 얻을 수 있다는 장점이 있지만 그 데이터 안에 필요하지 않은 쓰레기 데이터가 많이 섞여있어, 정제 과정에서 매우 힘든 단순 노동이 필요할 수도 있다는 단점이 존재한다. 자연어 처리의 경우 문자를 긁어오는 경우가 많은데 글에는 한글 이외에 이모티콘, 특수문자 등의 특이한 문자들도 많기 때문에 신경을 기울여야 할 것이다.

 

 

@ 데이터 정제

자연어 처리에서 정제할 경우는 어떠한 것이 있을까. 데이터 수집에서 가져온 글 가운데 특수문자, 이모티콘 같은 경우가 있는데 이러한 것을 제외시켜야 한다. 하지만 무조건적으로 제외하는게 맞을까? 만약 우리가 긍부정을 선택해야 할 때 ♡ 같은 경우는 대부분 "긍정" 으로 생각할 수 있을 것이다. 물론 사람들 가운데 "이 영화 정말 별로♥" 라는 댓글도 있을 수 있다. 이러한 것도 생각해봐야 할 것이다. 문자의 정제는 대부분 정규 표현식을 사용하는 경우가 많다.

 

데이터 정제 Step 1 : 전각문자와 반각문자

 또 하나 알아두어야 하는 것은 [전각문자] 와 [반각문자] 이다.

  • 전각문자 : 일반적인 영문자의 고정 폭의 두 배 정도의 폭을 가지는 문자를 말함

  • 반각문자 : 전각문자 폭의 반을 폭으로 하는 문자를 말함

만약 문자 표기 형식이 전각문자라면 일반적으로 사용하는 반각문자로 변환해주는 것이 좋다. 

 

데이터 정제 Step 2 : 대소문자 통일하기

데이터를 수집하면서 영어의 경우 대소문자가 뒤죽박죽으로 되어있는 경우가 있는데 필수는 아니지만 대소문자로 통일하면 좋다는 정보를 들었다. 하지만 통일 안해도 큰 문제는 생기지 않는다고 한다.

 

 

 

@ 데이터 라벨링

데이터 라벨링의 경우 크게 3가지로 나눌 수 있다.

  • Text Classification
    • 입력 : 문장 / 출력 : 클래스
  • Token Classification
    • 입력 : 문장 / 출력 : 형태소 등
  • Sequence to Sequence
    • 입력 : 문장 / 출력 : 문장

라벨링은 TSV 파일을 선호한다. Tab 을 이용하여 분리하는 것이 편리하기 때문이다. 각 컬럼은 2개가 존재하여 한 컬럼은 클래스 다른 컬럼은 문장이 될 것이고 그 둘을 Tab 으로 분리한다. 각 행마다 대응된다. 라벨링은 사람이 직접하는 것이 제일 성능이 좋다. 엑셀을 이용해서 하나하나 매우 힘들고 고된 반복 작업이지만 성능을 높이기 위해서는 어쩔 수 없는 것 같다. 

 

 

 

@ Tokenization

토큰화는 크게 Sentence Segmentation 과 일반적인 tokenization 으로 구성된다.

Sentence Segmentation 은 우리가 수집한 문장에 대해 원하는 형태로 변환하는 것을 말한다. 예를 들어 우리가 훈련시켜야 할 때 행 단위로 한 문장씩 하는 것이 이상적이다. 한 행 내에 여러 문장이 있는 등의 경우가 있을 수 있다. 이럴 때 Sentence Segmentation 을 통해 문장의 끝을 알아내고 한 줄에 한 문장씩 형태를 바꿀 수 있다. 물론 문장의 맺음은 .(마침표)로 해석할 수 있지만 무조건적으로 한 문장이 끝났다고 보면 안 될 것이다. 

 

 

tokenization

Tokenization 을 하는 이유는 두 개 이상의 다른 토큰들로 이루어진 단어를 쪼개어 단어의 개수를 줄이고, 희소성(sparseness) 을 낮추기 위해서이다. 위의 그림은 토큰화 예시를 한 것이지만 결과가 저렇게 나오지 않을 수 있다는 점도 고려해야 한다. 한글은 특히나 파생되는 단어가 많아 토큰화에 신경써야 한다. 분절을 하기 위해서 우리는 형태소 분석을 해야 한다. 한글은 Mecab, KoNLPy 라이브러리가 주로 사용된다. 

300x250