HAN_PY 2021. 5. 30. 12:44
반응형

0. 들어가면서

사실 자연어 처리에 관련 전반적인 초보자를 위한 글을 적기는 쉽지 않은 것 같다. 왜냐하면, 초보자 기준으로는 생각해 보겠다. 자연어 처리를 하기 위해선 기본적으로 머신러닝과 딥러닝에 대한 차이점부터 알아야 한다. 그 후에 관련 여러 모델들을 사용해 보면서 모델들의 장단점을 파악한 이후에 사용하고자 하는 목적에 맞게 선정을 할 수 있어야 한다. 그리고 모델에 input 값을 넣을 수 있도록 text data를 전 처리하는 방법도 알아야 한다. 뿐만 아니라 개념을 다 안다고 해도, tensorflow 사용법을 익히지 않는다면 사실 사용할 수가 없다. 사실 빠르게 기술 구현만 하면 되는 분들은 RNN, LSTM 같은 것들을 할 필요 없이 사전훈련모델인 bert만 알면 되는데, 어디서 부터 어디까지 알아야 하는지에 대한 기준을 정한다는 것도 참 어려운 일인 것 같다.

 

 필자는 이 글을 보는 사람이 자연어 처리에 대해 아무것도 모르는 초보자라고 가정을 하고, 기초 개념을 하나씩 알아갈 수 있도록 글을 작성해 보도록 노력하겠다. 그리고 완성된 글이라도 반복적인 수정을 통해 계속해서 완성도를 높여가도록 해보겠다. 자연어 처리에도 머신러닝을 통한 기초적인 분석과 딥러닝 분석으로 나눠지는데, 우리는 정확도가 상대적 높다고 할 수 있는 딥러닝 자연어 처리에 대해 살펴보고, tensorflow에 적용해 보겠다.

 

 그리고 기본적인 토크나이져부터 모델 분석과 최종적으로는 BERT까지의 흐름을 한 페이지 안에 넣어서 전체적인 큰 흐름을 이해할 수 있게 계속 추가해 나가면서 언젠가 이 페이지가 자연어 처리의 바이블이 되길 기대해 본다.

 

 

2021_04_01 현재 매주 추가 중입니다.

 

 

1. NLP(Natural Language Processing)

 NLP에 대해 알아보기 이전에 먼저 일반적인 언어에 대해 알아보자. 언어란 사람들이 자신이 가지고 있는 생각을 다른 사람들에게 전달하는 데 사용하는 방법이라고 생각할 수 있다. 이러한 관점에서 자연어(Natural Language)란 사람들이 사용하는 언어를 인공적으로 만들어진 인공어와 구분하여 부르는 개념이라고 생각하면 된다.

 

 NLP에는 연구분야는 NLU와 NLG로 나뉜다. NLU(자연어 이해)는 사람이 이해하는 자연어를 컴퓨터가 이해할 수 있는 값으로 바꾸는 과정을 의미한다. NLG(자연어 생성)은 더 나아가 컴퓨터가 이해할 수 있는 값을 사람이 이해하도록 자연어로 바꾸는 과정이다. 

 

 

 

1.1 NLP 분야

자연어 처리 분야에서는 예전부터 NLU에 대한 연구를 많이 했었다. 최근 딥러닝 시대로 넘어오면서 NLG에 대한 연구도 활발해 지도 있다고 보면 된다. NLG와 NLU의 분야는 아래와 같다.

 

NLG NLG+NLU NLU
- Language Modeling
- Article Generation
- Chatbot
- Summarization
- Question Answering
- Machine Translation
- Text Classification
- POS Tagging
- Sentiment Analysis
- Machine Reading Comprehension
- Named Entity Recognition
- Sematic Parsing

 

좀 더 구조적으로 알아보면, 자연어 처리란(NPL)란 컴퓨터에게 사람처럼 텍스트를 이해시키는 것이 아니다. 문자 언어(written language)에 대한 통계적 구조를 만들어 처리하는 것이다. 자연어 처리에서의 딥러닝은 단어, 문장, 문단에 적용한 패턴들을 인식하는 과정이라고 생각하면 된다.

 

 

1.2 인공지능에서의 NLP

 본격적으로 NLP에 들어가기 전에 컴퓨터 비전과 같은 다른 분야와의 차이점을 이해해보자.

 

 Natural Language Processing은 기본적으로 단어와 문장을 다루기 때문에 이산적인 DIscrete value를 다룬다. 따라서 문장에서 다음에 나올 단어의 확률을 구할 수가 있고, 저장된 사전에서 단어를 뽑기 때문에 분류 문제로도 접근이 가능하다. 특히 이전 단어에 따라 다음 단어를 생성하기 때문에 과거의 값이 다음단어에 영향을 끼친다는 특징(auto-regressive)도 가지고 있다.

 

NLP와 다르게 Computer Vision을 보면 이산적인 값들이 아니라 이미지나 영상과 같은 연속적인 Continuous Value를 다룬다. 따라서 분류로 접근하는 것이 아니라 문제에 따라 접근 방식이 달라져야 한다. 그리고 NLP와 다르게 사진의 픽셀들은 연관이 있을 수 있지만, 방향성을 가진 것이 아니므로, 과어의 값에 영향을 받는 auto-regressive 속성이 없다. NLP에서는 GAN을 적용할 수 없지만, Computer Vision에서는 GAN 방식을 적용 할 수 있다. 최근 많이 연구되는 분야는 아래와 같다.

 

Natural Language Provessing Computer Vision Speech Precessing
- Text Classification
- Machine Translation
- Summarization
- Question Answering
- Image Recongnition
- Object Detection
- Image Generation
- Super Resolution
- Speech Recongnition(STT)
- Speech Synthesis(TTS)
- Speaker Identification

 

 

마지막으로 최근 추세는 데이터양과 전처리로 성능이 나온다고 할 수 있다. 왜냐하면 최신 알고리즘은 누구나 사용가능한 시대가 도래 했기 때문이다. 따라서 알고리즘 성능도 중요하지만, 데이터의 수집과 전처리에도 집중을 하는 것이 필요하다.

 

 

 

전통적인 NLP와 딥러닝 NLP 차이점 분석 

 

한국어의 어려운점

 

2. 전처리하기

사실 전처리 부분은 방법과 사용하는 프레임워크에 따라 정리되는 기준이 매우 다양하다. 그래서 서적이나 블로그에서도 특정 기준에 맞는 것들만 나오기 때문에 전반적으로 공부하는 게 쉽지 않았다. 그리고 기준에 따라 나누는 것 자체도 쉽지 않았다. 여기서 포인트는 이러한 전처리 방법이 있구나! 정도 이해를 하면 될 것 같다. 그리고 사용법에서는 tensorflow나 사이킷런에서 라이브러리로 이러한 것들을 제공하니 실습 시에는 굳이 직접 안 만들어도 되겠구나! 정도로 이해하고 넘어가면 좋을 듯하다.

 

자연어 처리를 위해 가장 먼저 해야 할 것은 바로 컴퓨터가 우리의 언어인 text를 이해할 수 있도록 수치로 변환해 줘야 한다. 그런데 각 나라마다 사용하는 언어가 다르기 때문에 각각의 나라의 텍스트를 자연어 처리를 위해 각 나라의 언어적 특성을 반영하여 토큰화(text를 특정 기준(토큰)에 맞게 나누는 것) 시켜야 한다. 이러한 과정을 토크 나이징(Tokenizing)이라고 한다. 그리고 토크나이징하여 분리된 단어들을 수치화하는 작업을 단어 임베딩(Word Embedding)이라고 한다.

 

본격적으로 시작하기 전에 전 처리하는 방식은 굉장히 많다. 전처리하는 방식에 따라서도 정확도는 굉장히 많이 바뀐다. 개인적으로 약 4일 정도 전처리 관련 정리만 해보려고 한다. 가능한 많은 부분을 담아보겠다. 그리고 tensorflow 뿐만 아니라 사이킷런 관련도 넣어보려고 한다.

 

들어가기 전에  tensorflow.keras에서 제공하는 text 전처리는 다음과 같다. 아래의 블로그를 참고하자. 

han-py.tistory.com/271

 

[자연어처리] Preprocessing(전처리) 종류

[tensorflow] preprocessing(전처리) 하기 0. 들어가면서 TensorFlow로 입력값을 모델에 넣기 위해서는 딥러닝 모델이 처리 있도록 전처리라는 과정을 거쳐 숫자로 입력값을 넣어야한다. 전처리의 종류에는

han-py.tistory.com

 

 

 

2.1 Tokenizing

그렇다면 우리는 토크나이징을 하나하나 코드로 구현해야 할까? 그렇지 않다. 라이브러리를 사용한면된다. 기술의 근본이 되는 영어와 한글의 토크나징 라이브러리에 대해 알아보자. 영어 토크나이징 라이브러리는 아래와 같다.

  • NLTK : 파이썬에서 영어 텍스트 전처리 작업 시 많이 쓰이는 라이브러리
  • Spacy : 영어를 포함한 8개 국어에 대한 자연어 전처리 모듈을 제공하고 빠름

사실 한국어 토크나이징은 영어랑 다르게 조사가 존재하여 영어처럼 어절 토큰화는 힘들다. 그리고 한국어는 영어와 비교해서 띄어쓰기가 어렵고 잘 지켜지지 않기 때문에 형태소 토큰화를 하고, 각단어에 품사태깅을 한다. 한글 토크나이징 라이브러리는 KoNLPy 오픈소스 라이브러리를 많이 사용한다. KoNLPy를 import 하여 아래를 쓸 수 있다.

  • Hannanum : KAIST에서 개발
  • Kkma : 꼬꼬마라고 불리며 서울대학교에서 개발
  • Komoran : Shineware에서 개발
  • Mecab : 일본어용 형태소 분석기로 정확도가 높아 가장 많이 사용되지만, Window에서 설치가 복잡
  • Okt : 오픈 소스 한국어 분석기. 과거에 트위터라고 불림

KoNLPy에 대한 구현은 아래의 블로그를 참고하자.

han-py.tistory.com/283

 

 

2.2. Word Embedding

토크 나이징을 통해 단어를 분석하기 쉽게 쪼겠다면, 쪼갠 단어를 수치화해야 한다. 그러한 방식을 Word Embedding이라고 한다. 아래에서 간단히 배울 one-hot encoding과 가장 큰 차이점은 정수가 아닌 실수형 벡터로 비교적 저 차원이며 데이터로부터 학습이 된다. 학습이 된다는 말이 좀 어려울 수 있을 것 같다. 자연스럽게 이해될 것이니 일단은 쭉 읽어보자. 지금부터는 기초가 되는 방식의 Word Embedding 방법딥러닝을 통한 WordEmbedding 방식으로 나눠서 이야기를 풀어보겠다.

 

 

2.2.1. 기본 Word Embedding

기본 Word Embedding의 유형은 '주파수 기반 임베딩'과 '예측 기반 임베딩'으로 나뉜다.

  • 주파수 기반 임베딩(Frequency based Embedding) : CountVectorizer, TF-IDF, bag-of-words
  • 예측 기반 임베딩(Prediction based Vector) : Word2vec, CBOW, skip-gram

 

Frequency based Embedding(주파수 기반 임베딩)

 주파수 기반 임베딩이란 단어가 나오는 횟수를 기준으로 인베딩을 하는 것이다. 횟수만 따진다는 것은 문맥을 따지지 않는다는 것을 의미한다. 즉, 간단한 자연어 처리에서는 많이 사용하지만, 정확한 예측은 힘들다는 것을 인지하자.

  • BOW(bag-of-words) - 단어의 출연 빈도만 사용
  • CountVectorizer - 전체 문서에서 먼저 학습 후에 타깃 문서의 어휘 횟수를 세는 방법
  • TF-IDF - 조사나 지시대명사는 많이 등장하지만, 안 중요한 단어로 분류 가능

사실 위의 3가지 중에 TF-IDF를 가장 많이 쓴다. 왜냐하면 제일 좋기 때문이다. TF-IDF를 사이킷런으로 쉽게 구현 가능하다. 구현하는 방법은 아래의 블로그를 참고하자.

han-py.tistory.com/274

 

[자연어처리] 사이킷런(scikit-learn)

0. 들어가면서 사이킷런(scikit-learn)은 파이썬용 머신러닝 라이브러리이다. 딥러닝 모델은 텐서플로 등을 이용하여 생성할 수 있는 것과 같이 머신러닝 모델은 주로 사이킷런 라이브러리를 통해

han-py.tistory.com

 

 

 

Prediction based Vector(예측 기반 임베딩)

비교하자면, 주파수 기반 임베딩보다 예측 기반 임베딩이 더 좋다. 따라서 예측 기반 임베딩을 사용하면 된다. 예측 기반 임베딩을 다른 말로 word2vec이라고도 부른다. Word2vec은 단일 알고리즘이 아니라 CBOW(Continuous Bag of words)와 Skip-gram 모델의 두 가지 기술의 조합이다. 이 두 가지가 단어를 목표 변수에 신경망으로 매핑한다고 생각하면 된다.

 

 

 

 

Word Embedding도 최근에도 많이 쓰이고 유용한 방법이긴 하다. 그러나 Word Embedding의 치명적인 단점은, 문맥을 고려하지 않는다는 것이다. 그래서 Neural Network을 이용해 language를 다루는 것에 큰 발전이 있었고 그에 따라 나온 것이 바로 ELMo BERT이다. 관련 내용은 아래의 블로그를 참고하자.

han-py.tistory.com/199

 

[자연어처리] Word Embedding의 개념과 한계

0. 들어가면서 NLP에 대해서는 할 이야기가 상당히 많다. 그러나 상세히 설명하기엔 너무 복잡하므로 간단히 하고 추가는 다른 페이지로 하겠다. NLP는 단어 문장 문서로 이야기를 많이 한다. Word,

han-py.tistory.com

 

 

 

2.2.2. 딥러닝을 통한 Word Embedding

Word Embedding을 하는 방법에는 두 가지이다. 첫 번째는 랜덤 한 단어 벡터로 시작하여 신경망의 가중치를 학습하는 것과 같은 방식으로 단어 벡터를 학습하는 것이고, 두 번째는 미리 계산된 단어 임베딩(pretrained word embedding)을 가져와서 사용하는 것이다.

 

 

 

 

사람이 쓰는 자연어를 기계가 이해할 수 있는 숫자 형태인 vector로 바꾼 결과 혹은 그 일련의 과정 전체를 의미한다.

 

 

2.3 one-hot encoding

사실 이 부분은 넣을까 말까 고민을 했지만, 넣어보려고 한다. 위에서 토크나이저랑 임베딩을 잠시 잊어보자. 그리고 자연어 처리를 하기 위한 가장 간단한 방법에 대해 생각을 해본다면, 문장을 띄어쓰기 별로 나누고, 나눠진 단어 전체에 번호를 붙여서 구분하는 게 가장 일반적이고 기본적인 방법일 것이다. 이러반 방식을 원-핫 인코딩이라고 하는데, 정리하자면 모든 단어에 고유한 정수 인덱스를 부여하고 이진 벡터로 변환한다. 그리고 특정 단어가 있다면 특정 단어의 고유한 인덱스만 1이고 나머지는 0이 되게 만드는 것이다.

"나는 집에 간다."라는 문장이 있다면 "나는"은 0번 인덱스. "집에"는 1번 인덱스. "간다"는 2번 인덱스로 정수를 부여한다. 그리고 "집에"라는 단어를 one-hot encoding 돌려 표현하면 [0, 1, 0] 이 될 것이고 "나는"이라는 단어를 표현하면 [1, 0, 0]이 될 것이다. 여기서의 문제점은 단어가 많아지면 리스트는 단어의 개수만큼 무한정 늘어나게 되어 비효율적이다. 따라서 개념만 알면 되고 보통의 Word Embedding방법을 많이 쓴다. 

 

one-hot encoding을 구현 방법은 아래의 블로그를 들어가 보자.

han-py.tistory.com/282

 

[자연어처리] one-hot encoding 구현

0. 들어가면서  기본적으로 자연어 처리에 대한 기초 기념에 대해서는 아래의 블로그를 참고하자. 지금은 one-hot encoding 구현에 중점을 주고 적어보겠다. han-py.tistory.com/281 원-핫 인코딩(one-hot encod

han-py.tistory.com

 

2.4 개념적 정리

 우리가 위에서 배운 것은 text를 숫자로 표현했기 때문에 벡터화라고도 말한다. 그리고 좀 더 개념적으로 들어가 보면 벡터화 표현 방법에는 희소 표현(Sparse Representation)과 밀집 표현(Dense Representation)이 있다.

 

 

 희소 표현은 Sparse의 뜻이 '희박한'이라는 뜻이다. 이러한 비슷한 단어가 들어간 행렬을 수학에서 희소 행렬(Sparse matrix)라고 하는데 이 행렬은 원소의 대부분이 0을 나타낸다. 즉 데이터가 공간에 밀집한 게 아니라 널리 분포된 표현 방식이라고 할 수 있다. 이러한 방식으로 구현한 것이 one-hot encoding인데, one-hot encoding의 한계는 말뭉치(Corpus)에 단어가 100,000개가 있다면 100,000차원의 벡터를 구현해야 하기 때문에 공간적 낭비가 심하다. 
 

 

 사실 위에서 배운 것들 중에 one-hot encoding을 제외하면 다 밀집 표현이라고 할 수 있다. 밀집 표현은 벡터의 차원이 단어 집합의 크기가 아닌 모든 단어의 벡터 표현을 사용자가 설정한 벡터의 차원으로 맞추고 값은 0과 1이 아니라 실수의 값을 가지게 된다.

 

밀집 표현의 대표가 Word Embedding이 있고, Word Embedding안에서 Frequency Based Embedding과 Prediction Based Embedding으로 나눠진다고 생각하면 될 것 같다.

 

 

 

2.5. 총정리

사실 개념을 본다고 구현을 바로 하기엔 부족함이 많다. 왜냐하면, 위에서 배운 내용이 임베딩 방법과 벡터화 방법이 다 다르기 때문이다. 특정 예를 통해서 처음부터 모델에 넣기 전까지의 과정을 알아보자. 주의해야 할 점은 지금 하는 방법이 수많은 방법 중에 하나일 뿐이고 앞으로 더 좋은 방법의 전처리가 나올 수 있다는 점을 꼭 인지하자.

  1. 문장을 각각의 기준에 맞는 토큰으로 쪼갠다.
  2. 토큰에 숫자를 매겨서 딕셔너리(단어 사전)로 만든다. (딕셔너리를 참고하여 수치화하기 때문에 단어 사전이라 한다)
  3. 단어 사전을 기준으로 문장을 리스트로 바꾼다. (리스트의 크기는 일정하게 해야 한다.)

colab에서 아래와 같이 불러와서 Tokenizer를 사용할 수 있다.

from tensorflow.keras.preprocessing.text import Tokenizer

전처리 구현방식을 아래의 블러그를 보고 확인하자.

 

han-py.tistory.com/284

 

전처리를 했다면 전처리를 하여 숫자로 바뀐 text 넣을 모델을 만들어보자.

 

 

 

 

 

3. 모델(Model) 만들기

모델을 만들기 위해서 가장 먼저 해야 할 것은 무엇일까? 내 생각으로는 tensorflow를 사용하는 방법을 알아야 할 것 같다. 우선은 자연어 처리를 위한 전체적인 과정을 tensorflow의 간단한 코드를 통해 알아보기 위해 아래의 블로그를 보고 오자.

han-py.tistory.com/272

 

[tensorflow] 모델 만들기_기초

모델구조 이해하기 텐서플로 2.0 버전에서 케라스를 이용해 모델을 구현하는 방법을 알아보자. 구현 순서 전처리 => 모델만들기 => 학습하기 1.단계 전처리하기 컴퓨터는 한국어를 이해할 수 없습

han-py.tistory.com

 

반응형