본문 바로가기

프로젝트

무이메이커스_딥러닝을 활용한 자연어 처리 프로젝트 (NLP Classification) (1/2)

프로젝트 진행 순서

  • 1. NLP (Natural Language Processing) 개요 (Overview)
  • 2. Text 데이터 전처리 (Preprocessing)
  • 3. 데이터에 적합한 딥러닝 모델 생성 (Modeling)
  • 4. 모델 평가 및 시각화 (Evaluation and Visualization)
  • 5. 실생활 적용

안녕하세요 헬스케어 제품 개발회사 허니컴의 무이메이커스페이스 입니다.

저희는 딥러닝을 접목시킨 제품 개발을 위해 다양한 프로젝트를 수행하고,

이를 활용하여 인공지능을 지닌 다양한 헬스케어 제품을 생산하는데 그 목적이 있습니다.

이번 시간에는 딥러닝을 활용한 자연어 처리 및 분류 프로젝트를 소개하고자 합니다.

목표는 Kaggle 의 Quora Insincere Questions Classification 프로젝트에로

Quora 에서 게시된 글이 Insincere 한 Question 인지 아닌지를 분류하는 것입니다.

(해당 Kaggle 은 Insincere 를 Non-neutral, Sexual, Not reality 등으로 정의합니다.)

 

Dataset 구성은 1,306,122 개의 질문 번호와 질문 Text, Target 으로 구성된 Training Set,

375,806 개의 질문 번화아 질문 Text 로 구성된 Test Set,

4개 종류의 Pre-trained Word Embedding 으로 되어있습니다.

https://www.kaggle.com/c/quora-insincere-questions-classification/overview

 

Quora Insincere Questions Dataset 의 구성

 

1. NLP 개요 (Overview)

 

이번주 저희의 목표는 Text 속에서 의미있는 정보를 추출하고 분석하는 NLP 와 관련된 프로젝트를 수행합니다.

NLP 는 한국어로 자연어 처리를 의미하고, 해당 자연어는 일상 생활에서 사용되는 언어들을 의미합니다.

다양한 언어들이 존재하며 해당 언어들만의 특성이 모두 다르기에 NLP는 다소 어렵고 연구가 필요한 분야였으나,

딥러닝의 발달과 더불어 상당히 높은 수준의 성과를 이뤄내며 인공지능 분야의 핵심 요소로 자리잡았습니다.

 

NLP 는 언어를 데이터로 표현하기 위해 단어를 Vector 로 변환하고자 노력하였습니다.

초기에는 Sparse Representation 을 적용하였으나, 이는 밑의 수식과 같이 하나의 벡터에 하나의 단어를

표현하므로 차원이 매우 낭비되며 단어 간의 연관성을 표현하기가 불가능하다는 한계가 있습니다.

따라서 차원을 줄이고 의미를 추가시킨 Dense Representation 을 이용한 Word Embedding 을 사용합니다.

Word Embedding 에는 Word2Vec, FastText, Glove 등의 방법론이 있습니다.

Custom Dataset 을 사용해 해당 방법론을 적용한 Custom Word Embedding 을 만들 수 있지만,

위키 백과와 같은 대용량의 정보를 학습한 Word Embedding 들이 존재하므로 이를 활용하여 적용합니다.

 

 

2. 데이터 전처리 (PreProcessing)

 

데이터 전처리를 위해 NLTK 패키지와 Torchtext 를 다운받습니다.

NLTK 패키지는 파이썬에서 제공하는 자연어 처리용 패키지이며,

Torchtext 는 Pytorch 에서 제공하는 자연어를 딥러닝에 적용하기 쉽게 만든 DataLoader 입니다.

https://www.nltk.org/

https://torchtext.readthedocs.io/en/latest/

pip install nltk
pip install torchtext
nltk.download()

NLTK 패키지에 word_tokenize 를 통해 문자열을 Word 단위로 잘라주는 Tokenizing 을 사용하고

torchtext 의 Field 를 사용하여 각 Text 데이터를 Tensor 로 처리합니다.

매개 변수들을 해당 데이터에 맞게 사용하시면 됩니다.

from nltk import word_tokenize
import torchtext

text = torchtext.data.Field(sequential = True, # 순서 여부
                            use_vocab = True, # Vocab 사용 여부
                            tokenize = word_tokenize, # nltk 패키지 토큰화
                            lower = True, # 소문자로 전환)

해당 과정을 통해 전처리된 Text 를 하나 추출하여 데이터를 확인해보면,

다음과 같이 Word 단위로 처리된 것을 확인할 수 있습니다.

 

 

3. 데이터에 적합한 딥러닝 모델 (Modeling)

 

자연어 데이터는 단순히 주어진 정보 안에서 특징을 뽑고 해결하는 것이 아닌,

앞 뒤 단어들과의 어법, 연관성 등 연계된 정보 안에서 뽑을 수 있는 특징이 많으므로,

시계열 데이터에서 주로 사용하는 RNN (Recurrent Neural Network) 구조의 모델을 사용합니다.

 

cs231n 에 소개된 RNN 의 기본 구조

RNN 의 특징은 네모 박스 친 Hidden Layer 안에 Neuron 들입니다.

단순히 Input 값에만 영향을 받는것이 아닌 이전 상태의 Neuron 도 다음 상태에 영향을 준다는 부분입니다.

수식으로 살펴볼 때 이전 상태 (t-1) 의 Hidden Neuron 과 현재 상태 (t) 의 Input 이 모두 포함되며,

이를 비선형 함수를 통해 분류하는 기존 Neural Network 를 변형시킨 구조입니다.

그러나 RNN 은 Hidden Neuron 이 길어지면, 즉 학습할 과거의 정보가 길어질수록

학습 과정에서 지나치게 곱셈이 늘어나면서 Vanishing Gradient 현상이 나타납니다.

그리하여 이런 단점들을 없애기 위해 LSTM, GRU 모델들이 개발되어 사용되고 있고,

저희는 자연어 처리의 첫 번째 프로젝트로 기본 LSTM 모델을 사용하기로 하였습니다.

 

Bidirectional LSTM (좌) 및 Deep Bidirectional LSTM (우)

또한 단순히 이전 상태의 정보만 사용하는 것이 아닌, 이후 상태의 정보도 파악하기 위해

Bidirectional LSTM 을 사용하고 이를 층을 쌓아 Deep 하게 만들면 우측과 같은 형태로 구축됩니다.

Pytorch 에서 제공되는 Neural Network 모듈 안에 LSTM 을 통해 구현하였습니다.

 

다음주에는 실제 LSTM 모델 및 다양한 딥러닝 모델에 적용하여 성능 평가를 진행하겠습니다.

 

........

시제품 제작 문의