공부/밑바닥부터 시작하는 딥러닝

[밑시딥2] Chapter 2. 자연어와 단어의 분산 표현

셩잇님 2024. 7. 1. 23:19
반응형

 

 

 


 

본 포스팅은 '밑바닥부터 시작하는 딥러닝2'를 읽고 공부 및 학습 내용을 정리한 글입니다. 언제든지 다시 참고할 수 있도록, 지식 공유보단 개인적인 복습을 목적으로 포스팅하였습니다.

 


2.1 자연어 처리란?

 우리가 일상생활에서 평소에 쓰는 한국어, 영어와 같은 말을 자연어라고 한다. 따라서 자연어 처리(Natural Language Processing, NLP)란? 말 그대로 '자연어를 처리하는 분야'이며, 사람의 말을 컴퓨터에게 이해시키기 위한 기술이다.

 

2.2 시소러스

 시소러스란 사전적 정의로는 '뜻이 같은 단어(동의어)'나 '뜻이 비슷한 단어(유의어)'가 한 그룹으로 분류된 것을 뜻한다. 이러한 시소러스는 자연어 처리에서 '상위와 하위' 혹은 '전체나 부분'등 조금 더 세세한 관계까지도 정의할 수 있다. 

 

 이렇게 모든 단어에 대한 유의어 집합을 만든 다음, 이 단어들의 관계성을 그래프로 표현하면 단어 사이에 연결을 정의할 수 있다. 이 단어 네트워크를 통해 우리는 컴퓨터에게 단어 사이의 관계를 가르칠 수 있다.

 

2.2.1 WordNet

 자연어 처리 분야에서 가장 유명한 시소러스는 'WordNet'이다. WordNet을 통해 유의어를 얻거나 '단어 네트워크를 이용할 수 있다.

 

2.2.2 시소러스의 문제점

 그러나 시소러스 방식이 유명하다고 해서 단점이 없는 것이 아니다. 대표적인 문제로는 다음과 같다.

 

  • 시대적인 변화에 대응하기 어렵다.
  • 사람을 쓰는 인건비 비용이 크다.
  • 단어의 복잡미묘한 차이를 표현할 수 없다.

 

2.3 통계 기반 기법

 통계 기반 기법은 말뭉치(corpus)를 이용해 처리한다. 말뭉치는 맹목적으로 수집된 텍스트 데이터가 아닌 자연어 처리 연구나 애플리케이션을 염두에 두고 수집된 텍스트를 뜻한다. 따라서 말뭉치에는 자연어에 대한 사람의 '지식'이 충분히 담겨져 있다.

 

2.3.1 파이썬으로 말뭉치 전처리하기

 

2.3.2 단어의 분산 표현

 

2.3.3 분포 가설

 

2.3.4 동시발행 행렬

 

2.3.5 벡터 간 유사도

 esp를 이용하여 divide by zero의 문제를 해결한다.

 

2.3.6 유사 단어의 랭킹 표시

 말뭉치의 크기가 너무 작을 경우, 유사도가 높은 문제가 발생한다.

 

2.4 통계 기반 기법 개선하기

 

2.4.1 상호정보량

 the car, car는 drive와 유사하지만 the가 고빈도 단어여서 car와 더 강한 관련성을 가진다. 이러한 문제를 해결하기 위해 PMI를 쓰지만 PMI도 두 단어의 동시발생 횟수가 0이면 문제가 생기므로 PPMI를 쓴다. 하지만 이런 PPMi도 문제가 있는데 바로 어휘 수의 증가함에 따라 벡터의 차원수도 증가하는 문제 및 원소 대부분의 값이 0이므로 원소의 중요도가 낮은 문제점이 있다. 이러한 문제를 해결하기 위해 차원 감소 기법을 사용한다.

 

2.4.2 차원감소

 벡터의 차원을 줄이는 방법을 뜻한다. 다만 중요한 정보는 최대한 유지하면서 줄이는 것이 핵심이다. 줄이는 방법은 여러가지가 있지만 SVD 기법을 사용하여 줄이도록 한다.

 

2.4.3 SVD에 의한 차원감소

 

2.4.4 PTB 데이터셋

 펜 트리뱅크(PTB)를 말뭉치로 사용한다!

 

2.4.5. PTB 데이터셋 평가

 

2.5 정리

  • Wordnet 등의 시소러스를 통해 유의어를 얻거나 단어 사이의 유사도를 측정하는 등 유용한 작업을 할 수 있다.
  • 시소러스 기반 기법은 단점이 존재한다.
  • 따라서 현재는 말뭉치를 통해 단어를 벡터화하는 방식을 사용한다.
  • 단어 벡터화 기법의 분포 가설은 '단어의 의미는 주변 단어에 의해 형성된다.'에 기초한다
  • 통계 기반 기법은 말뭉치 안의 각각의 단어에 대해 그 단어의 주변 단어의 빈도를 집계한다.
  • 동시발생 행렬을 PPMI 행렬로 변환하고, 이를 다시 차원 감소시킴으로써 '희소벡터'를 작은 '밀집벡터'로 변환시킬 수 있다.
  • 단어의 벡터 공간에서는 의미가 가까운 단어는 그 거리도 가까울 것으로 기대된다.

 

2.6 소감

 비록 여유가 없어 파이썬을 통해 모든 코드를 직접 타이핑하면서 실습해보지는 못해봤지만 자연어 처리라는 막연한 목표앞에 예전 개발자들이 과연 어떻게 처리했는가?를 알 수 있어서 굉장히 흥미로웠다. 단어를 벡터로 나누고 이를 표현해보자. 라고 생각한것도 너무 신기하지만 표현 할 때마다 수도 없이 다양한 문제가 생겼음에도 불구하고 이를 또 해결하기 위해 다양한 해법들이 나온 것들 또한 너무 신기하다.

 

조용히 방구석에서 책을 읽으며 나보다 먼저 이 길을 걸어간 선배 개발자들의 노고는 박수받아 마땅하지 않을까 싶다.

 

 

반응형