이제 데이터 공부 안하는 블로그

자연어처리(NLP, Natural Language Processing) 본문

딥러닝

자연어처리(NLP, Natural Language Processing)

공사노비 2021. 8. 17. 14:58

* 제가 공부하기 위해 만든 자료입니다. 혹시 틀린 부분이 있다면 댓글로 알려주시면 수정하겠습니다.

 

자연어란 ? 사람들이 일상적으로 쓰는 언어를 말한다. 자연적으로 발생한 언어로, 인공어로 만들어진 언어와 구분하기 위해서 만들어진 개념이다. 그리고 이런 자연어를 컴퓨터로 처리하는 기술을 자연어 처리(Natural Language Processing, NLP) 라고 한다.

 

 

자연어 처리로 할 수 있는 일들           

  • 자연어 이해 : 뉴스 기사, 감정 분류(기사 내용이 긍정적인지 부정적인지 분류함), 비문학 문제 풀기, 품사 태깅, 개체명 인식 등
  • 자연어 생성 : 텍스트 생성(뉴스 기사, 가사 등 생성하기)
  • NLU & NLG : 문장을 읽고 핵심 요약하는 부분을 찾아내서 요약문 생성, 식당 예약을 위한 챗봇, 상담 응대를 위한 챗봇 등 
  • 그 밖에도 텍스트를 읽거나 음성을 텍스트로 쓰거나 이미지를 설명하는 문장 생성 등 다양한 일을 할 수 있다.

 

 

 

자연어 처리가 사용된 사례

  • 챗봇 : 심리상담 챗봇, 일반대화 챗봇 (이루다)
  • 번역 : 파파고, 구글 번역기
  • TTS, STT : 인공지능 스피커, 자막생성, 클로바노트(회의록 작성)

 

컴퓨터는 자연어를 이해할 수 없다. 그래서 컴퓨터로 이해할 수 있게 바꾸어주는 작업을 해야하는데 그것을 벡터화(Vectorize)라고 한다. 벡터화 방법은 크게 두 가지가 있다.

1. 등장 횟수 기반의 단어 표현 : 단어가 문장, 문서에 등장하는 횟수를 기반으로 벡터화하는 방법

  • Bag of Words
  • TF-IDF

2. 분포 기반의 단어 표현 : 타겟 단어 주변에 있는 단어를 기반으로 벡터화하는 방법

  • Word2Vec
  • GloVe
  • fastText

 

자연어 처리에 등장하는 용어들을 먼저 짚고 가자 

  • 말뭉치(Corpus) : 특정한 목적을 가지고 수집한 텍스트 데이터
  • 문서(Document) : 문장(Sentence)들의 집합
  • 문장(Sentence) : 여러 개의 토근(단어, 형태소 등)으로 구성된 문자열. 마침표, 느낌표 등의 기호로 구분
  • 어휘집합(Vocabulary) : 말뭉치에 있는 모든 문서, 문장을 토큰화한 후 중복을 제거한 토큰의 집합
  • 토큰(Token) : 문법적으로 의미있는 최소 단위. 상황에 따라 다르지만 보통 의미있는 단위로 토큰을 정의함.
  • 토큰화(Tokenization) : 주어진 코퍼스에서 토큰이라 불리는 단위로 나누는 작업

 

 

전처리 작업이 절반 이상이라고 말할 정도로 자연어 처리를 하기 전에 텍스트 전처리 하는 것은 매우 중요한 작업이다. 코퍼스 데이터를 용도에 맞게 사용하기 위해서 아래와 같은 전처리 작업을 할 수 있다.

  • 토큰화
  • 정제와 정규화
  • 어간추출
  • 표제어추출
  • 불용어

 

토큰화 : 주어진 코퍼스에서 토큰이라고 불리는 단위(단어, 단어구, 의미를 갖는 문자열 등)로 나누는 작업. 토큰은 보통 의미있는 단위로 정의합니다. 토큰의 기준을 단어(word)로 하는 경우 단어 토큰화라고 하고, 토큰의 단위를 문장(sentese)로 하는 경우는 문장 토큰화라고합니다. 

 

  • 어간추출 Stemming : Stemming 어간 추출은 말그대로 단어의 어간만 추출하는 방법이다. 어간이란 단어의 의미가 포함된 부분으로 접사 등이 제거된 형태를 말하는데 예를 들어 argue, argued, arguing, argus의 어간은 뒷부분이 제거된 argu이다. 단어의 앞부분이나 끝부분을 자르는 알고리즘이고 표제어추출보다는 덜 정교하지만 속도가 빠르다는 장점이 있다. 

 

  • 표제어 추출Lemmatization : 표제어 추출은 어간추출보다 체계적인데, 명사의 복수형은 단수형으로 바꾸어주고 동사는 모두 타동사로 변환된다. 예를 들어 wolves라는 단어를 어간추출하면 wolv로 변형되지만 표제어추출을 하면 wolf로 변형된다.

 

  • Bag-of-Words : 가장 단순한 벡터화 방법 중 하나이다. 문장에서 문법, 단어의 순서 등을 무시하고 단순히 단어들의 빈도만 고려하여 벡터화한다. 마치 가방 안에서 물건을 하나씩 꺼내서 물건 갯수를 세는 것과 비슷하게 문장에서 어떤 단어가 몇번 나오는지를 세어서 해당 값의 문장 벡터로 사용한다.  

 

  • TF-IDF : 자주 등장하는 단어에 가중치를 두는 TF(Term Frequency) 와는 다르게 오히려 자주 등장하지 않는 단어에 가중치를 두는 방법이다. 누군가 점심메뉴를 물어봤을 매일 식단에 올라오는 흰밥, 김치 라고 말하지 않고제육볶음이라고 말하는 것과 같다. 다른 문서에 등장하지 않고 특정 문서에만 등장하는 단어에 가중치를 두는 방법이 TF-IDF 이다.

 

  • Word2Vec : 말그대로 단어를 벡터로 나타내는 방법을 말한다.(word to vector) 기존에는 원-핫인코딩을 사용하여 벡터화를 했었는데, 원-핫인코딩을 이용한 벡터화는 단어 간 유사도를 구할 수 없다는 단점이 있다. 그래서 이런 문제를 해결하기 위해서 임베딩이 등장했는데 word2vec은 가장 널리 사용되는 임베딩 방법 중 하나이다. word2vec은 특정 단어 양 옆에 있는 두 단어의 관계를 활용한다. 주변 단어를 활용하는 것은 ‘비슷한 위치에 등장하는 단어들은 비슷한 의미를 가진다.’ 라는 분포가설을 기반으로 하기 때문이다. word2vec은 주변 단어에 대한 정보를 기반으로 중심 단어의 정보를 예측하는 모델은 CBoW와 중심 단어의 정보를 기반으로 주변 단어의 정보를 예측하는 skip-gram 방법이 있다.

 

  • fastText : word2vec방식에 철자 기반의 임베딩 방식을 더해준 것이다. word2vec 말뭉치에 없는 단어를 벡터화 없다는 문제점을 가지고 있는데, fastText 철자 단위의 임베딩 방식을 사용하여 단어를 쪼개서 단어를 유추하는 방식으로 말뭉치에 없는 단어도 벡터화 해준다.