본문 바로가기
자연어처리 /텐서플로와 머신러닝으로 시작하는 자연어처리

[텐서플로와 머신러닝으로 시작하는 자연어처리] 3장. 자연어 처리 개요

by mintee
728x90

자연어처리에서의 이슈는 크게 어떤 문제를 해결할 것이냐에 따라 분류되는데, 이번 장에서는 텍스트분류, 텍스트 유사도, 텍스트 생성, 기계이해라는 4가지의 핵심 문제에 대해서 알아본다. 

 

위의 4문제를 알아보기 전에 단어표현이라는 분야에 대해서 알아야한다. 단어표현은 모든 자연어 처리 문제의 바탕이 되는 개념으로 자연어를 어떻게 표현할 지를 정하는 것이 각 문제를 해결하기 위한 출발점이 되기 때문이다. 

또한 자연어처리를 포함한 모든 데이터 과학 분야에서는 데이터를 이해하는 것이 매우 중요하다. 단순히 사용하는 것 보다 데이터가 어떤 구조이고 어떤 특성이 있는지를 파악하고 모델을 만드는 것이 훨씬 성과가 좋기 때문.

 

[01. 단어 표현]

 

자연어처리는 컴퓨터가 인간의 언어를 이해하고 분석하는 모든 분야를 말한다. 

 

- 여기서 자연어처리란 무엇일까? 

 

출처- https://www.slideshare.net/ssuser06e0c5/i-64267027

 자연어(natural language)란 우리가 일상 생활에서 사용하는 언어를 말합니다. 자연어 처리(natural language processing)란 이러한 자연어를 의미를 분석하여 컴퓨터가 처리할 수 있도록 하는 일을 말합니다.

자연어 처리는 음성 인식, 내용 요약, 번역, 사용자의 감성 분석, 텍스트 분류 작업(스팸 메일 분류, 뉴스 기사 카테고리 분류), 질의 응답 시스템, 챗봇과 같은 곳에서 사용되는 분야입니다.

최근 딥 러닝이 주목을 받으면서, 인공지능이 제 4차 산업혁명의 중요 키워드로 떠오르고 있습니다. 자연어 처리는 기계에게 인간의 언어를 이해시킨다는 점에서 인공지능에 있어서 가장 중요한 연구 분야이면서도, 아직도 정복되어야 할 산이 많은 분야입니다.

(딥 러닝을 이용한 자연어 처리 입문 중에서 ) 

 

 

자연어 처리(自然語處理) 또는 자연 언어 처리(自然言語處理)는 인간의 언어 현상을 컴퓨터와 같은 기계를 이용해서 모사 할수 있도록 연구하고 이를 구현하는 인공지능의 주요 분야 중 하나다. 자연 언어 처리는 연구 대상이 언어 이기 때문에 당연하게도 언어 자체를 연구하는 언어학과 언어 현상의 내적 기재를 탐구하는 언어 인지 과학과 연관이 깊다. 구현을 위해 수학적 통계적 도구를 많이 활용하며 특히 기계학습 도구를 많이 사용하는 대표적인 분야이다. 정보검색, QA 시스템, 문서 자동 분류, 신문기사 클러스터링, 대화형 Agent 등 다양한 응용이 이루어 지고 있다.

(위키백과 - https://ko.wikipedia.org/wiki/%EC%9E%90%EC%97%B0%EC%96%B4_%EC%B2%98%EB%A6%AC)

 

따라서 자연어 처리의 가장 기본적인 문제는 '어떻게 자연어를 컴퓨터에게 인식시킬 수 있을까?'가 된다. 

 

원래는 컴퓨터가 텍스트를 인식하는 방법은 이진법이다. 즉, 0과 1로만 구성된 값으로 받아들인다. 

예를 들어 '언어'라는 단어를 

언 : 1100010110111000

어 : 1100010110110100 

이렇게 이진화된 값으로 인식한다. 그러나 자연어처리를 하는데 이런 방식을 그대로 사용하기에는 문제가 됨. 

이분진화된 값은 언어적인 특성이 전혀 없이 그저 컴퓨터가 문자를 인식하기 위해 만들어진 값이기 때문.

 

그래서 나온 방법이 "단어표현" 이라는 분야이다. 텍스트를 자연어처리를 위한 모델에 적용할 수 있도록 언어적인 특성을 반영한 채 단어를 수치화하는 것이다. 

이때에 단어는 주로 벡터로 표현한다. 따라서 단어 표현은 "단어 임베딩(워드 임베딩)" 또는 "단어 벡터"라고도 한다. 

 

 

원-핫 인코딩

 

단어를 표현하는 가장 기본적인 방법은 '원-핫 인코딩'방식인데, 이는 단어를 하나의 벡터로 표현하는 방법으로 0과 1로만 표현하는 것이다. ( 그 단어를 의미하는 인덱스에만 1로 표시하고 나머지는 다 0으로 표시하는 것)

예를 들어, 4개의 단어(엄마,아빠,삼촌,이모)를 원핫인코딩 방식으로 표현할 때 벡터의 크기는 4가 되며 아래와 같다.

엄마 -> [1,0,0,0]

아빠 -> [0,1,0,0]

이런 식으로 표현이 된다.

출처- https://dreamgonfly.github.io/machine/learning,/natural/language/processing/2017/08/16/word2vec_explained.html

그러나 실제로 자연어처리를 하기 위해서는 수십만 수백만 단어를 처리해야하기 때문에 이 단어들을 다 원핫 인코딩 방식으로 벡터로 표현하기엔 백터의 크기가 무진장 길어지니 무리가 있음ㅠㅠ

원-핫 인코딩 방법의 단점

1. 벡터의 크기가 너무 길어져 비효율적이다.  

2. 원-핫 벡터는 단어 간 유사도를 계산할 수 없다.

 

분산 표현(distributed representation)

 

이를 위한 대안으로 단어의 '의미'를 다차원 공간에 벡터화하는 방법을 찾게되는데, 이러한 표현 방법을 분산 표현(distributed representation)이라고 합니다.

분산표현은 분산가설에서 나온 것으로, 분포가설이란 '비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가진다'는 개념이다. (어떤 글에서 비슷한 상황에서 비슷한 문장 위치에 나오는 단어들은 유사도가 높다고 판단하는 방식)

위 그림에서 ‘강아지’란 단어는 [0.16, -0.50, 0.20. -0.11, 0.15]라는 5차원 벡터로 표현된다. 이 때 각각의 차원이 어떤 의미를 갖는지는 알 수 없다. 여러 속성이 버무러져서 표현되었기 때문이다. 다만 ‘강아지’를 표현하는 벡터가 ‘멍멍이’를 표현하는 벡터와 얼마나 비슷한지, 또는 ‘의자’를 표현하는 벡터와는 얼마나 다른지는 벡터 간의 거리를 통해 알 수 있다. 즉, 이런 표현 방법을 사용하면 단어 간 유사도를 계산할 수 있다.  

위 단어 벡터의 값들은 머신 러닝을 통해 학습된다. 뒤에 나올 word2vec은 이 값들을 학습하는 방법론 중의 하나이다.

분산표현의 장점

1. 적은 차원으로 대상을 표현할 수 있다.

2. 강아지와 멍멍이가 비슷한 단어라는 것을 학습시킬 수 있다. 

 

이 분포가설을 기반으로 한 카운트 기반 방법과 예측방법이 있다.

  • 카운트 기반 방법 : 어떤 글의 문맥 안에 단어가 동시에 등장하는 횟수를 세는 방법. 
  • 예측 방법 : 신경망 등을 통해 문맥 안의 단어들을 예측하는 방법.

그리고 두 번째 방법인 예측방법에 한가지가 바로 word2vec이다!

 

word2vec

 

word2vec은 단어를 표현하는 방법을 어떻게 학습하는 것일까? word2vec의 핵심적인 아이디어는 이것이다.

친구를 보면 그 사람을 안다.

또는

단어의 주변을 보면 그 단어를 안다. You shall know a word by the company it keeps. - 언어학자 J.R. Firth (1957)

word2vec은 CBOW와 skip-Gram이라는 두가지 모델로 나뉜다. 

하나는 맥락으로 단어를 예측하는 CBOW(continuous bag of words) 모델이다. 또다른 하나는 단어로 맥락을 예측하는 skip-gram 모델이다. 

 

예를 들어 "창욱은 냉장고에서 음식을 꺼내서 먹었다." 라는 문장이 있다고 하자. 

이때 CBOW는 주변 단어들을 통해 하나의 단어를 예측하는 모델이고 skip-Gram은 하나의 단어를 가지고 주변 단어들을 예측하는 모델이다. (CBOW 모델을 반대로 뒤집으면 skip-gram 모델이 됨!)

즉, CBOW는 "창욱은 냉장고에서 _ _ _  꺼내서 먹었다." 의 빈칸을 맞추는 모델이고,

skip-Gram은 "_ _ _  _ _ _ _ _ 음식을 _ _ _  _ _ _." 의 빈칸을 맞추는 모델!

 

 CBOW(Continuous Bag of Words)

 

출처-https://wikidocs.net/22660 (딥러닝을 이용한 자연어처리 입문)

  1. 입력 벡터와 가중치 W 행렬의 곱은 사실 W행렬의 i번째 행을 그대로 읽어오는 것과(lookup) 동일
  2. 입력층과 투사층 사이의 가중치 W는 V × M 행렬, 투사층에서 출력층사이의 가중치 W'는 M × V 행렬.
  3. M = 투사층의 크기
  4. V = 단어 집합의 크기.
  5. 즉, 위의 그림처럼 원-핫 벡터의 차원이 7이고, M은 5라면 가중치 W는 7 × 5 행렬이고, W'는 5 × 7 행렬(이 둘은 서로 다른 행렬임!!)
  6. 인공 신경망의 훈련 전에 이 가중치 행렬 W와 W'는 대게 굉장히 작은 랜덤 값을 가지게 됨.
  7. CBOW는 주변 단어로 중심 단어를 더 정확히 맞추기 위해 계속해서 이 W와 W'를 학습해가는 구조

  1. 투사층 : 각 주변 단어의 원-핫 벡터에 대해서 가중치 W가 곱해서 생겨진 결과 벡터들의 평균 벡터를 구함.
  2. 입력 벡터 : 윈도우 크기가 2라면, 입력 벡터의 총 개수는 2n이므로 중간 단어를 예측하기 위해서는 총 4개가 입력 벡터

 구해진 평균 벡터는 두번째 가중치 행렬 W'와 곱해진다. 곱셈의 결과로는 원-핫 벡터들과 차원이 V로 동일한 벡터가 나옴. 이 벡터에 CBOW는 소프트맥스(softmax) 함수를 취하는데, 소프트맥스 함수로 인한 출력값은 0과 1사이의 실수로, 각 원소의 총 합은 1이 되는 상태로 바뀜. 이렇게 나온 벡터를 스코어 벡터(score vector)라고 한다.

  1.  y^ : 스코어 벡터의 j번째 인덱스가 가진 0과 1사이의 값은 j번째 단어가 중심 단어일 확률
  2.  y : 중심 단어
  3. 손실 함수(loss function) -> cross-entropy 함수

 

TF-IDF(Term Frequency - Inverse Document Frequency) 

  1. TF(단어 빈도, term frequency) :  특정한 단어가 문서 내에 얼마나 자주 등장하는지를 나타내는 값. 이 값이 높을수록 문서에서 중요.
  2. DF(문서 빈도, document frequency)라고 하며, 이 값의 역수를 IDF(역문서 빈도, inverse document frequency)라고 한다.
  3. TF-IDF는 TF와 IDF를 곱한 값으로 점수가 높은 단어일수록 다른 문서에는 많지 않고 해당 문서에서 자주 등장하는 단어를 의미한다.

IDF 값은 문서군의 성격에 따라 결정된다. 예를 들어 '원자'라는 낱말은 일반적인 문서들 사이에서는 잘 나오지 않기 때문에 IDF 값이 높아지고 문서의 핵심어가 될 수 있지만, 원자에 대한 문서를 모아놓은 문서군의 경우 이 낱말은 상투어가 되어 각 문서들을 세분화하여 구분할 수 있는 다른 낱말들이 높은 가중치를 얻게 된다.

 

수학적 설명

TF-IDF는 단어 빈도와 역문서 빈도의 곱이다. 두 값을 산출하는 방식에는 여러 가지가 있다. 단어 빈도 tf(t,d)의 경우, 이 값을 산출하는 가장 간단한 방법은 단순히 문서 내에 나타나는 해당 단어의 총 빈도수를 사용하는 것이다. 문서 d 내에서 단어 t의 총 빈도를 f(t,d)라 할 경우, 가장 단순한 tf 산출 방식은 tf(t,d) = f(t,d)로 표현된다. 그 밖에 TF값을 산출하는 방식에는 다음과 같은 것들이 있다.[1]:118

  • 불린 빈도: tf(t,d) = t d에 한 번이라도 나타나면 1, 아니면 0;
  • 로그 스케일 빈도: tf(t,d) = log (f(t,d) + 1);
  • 증가 빈도: 최빈 단어를 분모로 target 단어의 TF를 나눈 값으로, 일반적으로는 문서의 길이가 상대적으로 길 경우, 단어 빈도값을 조절하기 위해 사용한다.

역문서 빈도는 한 단어가 문서 집합 전체에서 얼마나 공통적으로 나타나는지를 나타내는 값이다. 전체 문서의 수를 해당 단어를 포함한 문서의 수로 나눈 뒤 로그를 취하여 얻을 수 있다.

  • |D|: 문서 집합 D의 크기, 또는 전체 문서의 수
  • 분모 : 단어t가 포함된 문서의 수. 단어가 전체 말뭉치 안에 존재하지 않을 경우 이는 분모가 0이 되는 결과를 가져온다. 이를 방지하기 위해 {\displaystyle 1+|\{d\in D:t\in d\}|}로 쓰는 것이 일반적이다.

--> 역문서 빈도 개념 ?

TF-IDF는 다음과 같이 표현된다.

특정 문서 내에서 단어 빈도가 높을 수록, 그리고 전체 문서들 중 그 단어를 포함한 문서가 적을 수록 TF-IDF값이 높아진다. 따라서 이 값을 이용하면 모든 문서에 흔하게 나타나는 단어를 걸러내는 효과를 얻을 수 있다. IDF의 로그 함수값은 상 1 이상이므로, IDF값과 TF-IDF값은 항상 0 이상이 된다. 특정 단어를 포함하는 문서들이 많을 수록 로그 함수 안의 값이 1에 가까워지게 되고, 이 경우 IDF값과 TF-IDF값은 0에 가까워지게 된다. [출처-https://ko.wikipedia.org/wiki/Tf-idf]

 

fasttext

: 페이스북이 텍스트의 벡터 표현과 분류를 위한 라이브러리 fastText

 

word2vec 과 fasttext의 차이점

word2vec은 각 단어를 쪼개질 수 없는 단위로 취급해서 vector 를 만듦.

fasttext 는 본질적으로 word2vec 모델을 확장한 것이지만, 단어를 문자(character)의 ngram 조합으로 취급한다. 그래서, 한 단어에 대한 벡터는 이들 ngram 의 합으로 만들어진다. 예를 들자면, "apple" 이란 단어의 벡터는 "<ap", "app", "appl", "apple>", "ppl", "ppple", "pple>", "ple", "ple>", "le>" (여기선 하이퍼패러미터인 최소 ngram 을 3, 최대 ngram 을 6으로 잡았음) 와 같은 ngram 벡터들의 합이다. 

fasttext의 특징

  1.  희귀한 단어에 대해 더 좋은 word embedding 을 만들어 낸다.
  2.  어휘사전(vocabulary words)으로부터 훈련 말뭉치에 존재하지 않았던 단어의 벡터를 만들어낼 수 있다. (word2vec / glove 에선 불가능)
  3.  임베딩을 만들어날 때의 하이퍼패러미터가 매우 중요해진다.
  4.  문자임베딩 ( ngram 이 아닌 문자(character)단위 임베딩 ) 의 사용이 성능향상을 보인다고 하는 것 같기도... (후략. 후략한 내용은 원문을 참조.)

출처: https://daewonyoon.tistory.com/250 [알락블록]

 

 

 

 

728x90

댓글