[NLP] 개론
Data Analyticsㅤ/ㅤDeep Learning

[NLP] 개론

2.1 자연어 처리

우리가 평소에 쓰는 말(한국어, 영어 등)을 자연어라고 한다.

자연어 처리(Natural Language Processing)란 "우리의 말을 컴퓨터에게 이해시키기 위한 기술"로, 그 목표는 사람의 말을 컴퓨터가 이해하도록 만들어서, 컴퓨터가 우리에게 도움이 되는 일을 수행하게 하는 것이다.

 

2.1.1. 단어의 의미

말은 '문자'로 구성되며, 말의 의미는 '단어'로 구성됨다. 따라서 단어가 의미의 최소단위다.

컴퓨터에게 단어의 의미를 이해시키는 대표적인 기법으로는 다음과 같은 세 가지가 있다. 

  1. 시소러스를 활용한 기법
  2. 통계 기반 기법
  3. 추론 기반 기법(word2vec)

 

2.2 시소러스

사전, 유의어 집합과 같은 형태다.

또한 상위와 하위, 전체와 부분 등 단어 사이의 관계를 정의하기도 한다.

이런 학습을 시킨다면? SUV를 구글링했는데, 유의어인 hatch-back이나 car를 노출시킬 수 있다.

 

2.2.1. WordNet

프린스턴 대학교에서 1985년부터 구축하기 시작한 시소러스로 20만 개 이상의 단어를 구축해놓았다.

워드넷을 이용하면 유의어를 얻거나 '단어 네트워크'를 이용하여 유사도를 구할 수 있다.

 

2.2.2. 시소러스의 문제점

1. 시대 변화에 대응하기 어려움

  • 무수히 많은 신조어가 생기고 있으며, 기존 언어의 다른 쓰임이 생기는 것을 일일히 업데이트하기 어렵다. 

2. 인적 자원 비용이 큼

  • 사람이 직접 분류하는 작업이므로 인적 비용이 많이 든다.

3. 단어의 미묘한 차이를 표현할 수 없음

  • 예를 들어 '레트로'와 '빈티지' 사이에는 분명한 차이가 있지만 시소러스로 이를 표현하는 데엔 한계가 있다.

 

2. 통계 기반 기법

- 말뭉치(corpus): 대량의 텍스트 데이터

- 정규표현식을 이용하여 전처리 할 것 (import re)]

- 전처리 해야 할 부분

- 간단한 전처리 예시

def preprocess(text):
	text = text.lower()
    text = text.replace('.', ' .')
    words = text.split(' ')

    word_to_id = {}
    id_to_word = {}
    for word in words:
        if word not in word_to_id:
            new_id = len(word_to_id)
            word_to_id[word] = new_id
            id_to_word[new_id] = word

  corpus = [word_to_id[w] for w in words]
  corpus = np.array(corpus)

  return corpus, word_to_id, id_to_word
text = 'You say goodbye and I say hello.'
corpus, word_to_id, id_to_word = preprocess(text)
print(corpus)
print(word_to_id)
print(id_to_word)

 

단어의 분산 표현

- RGB가 3차원 벡터를 이용하여 명확하게 색 표현을 하듯 단어를 벡터로 표현할 수 있을까?

- 목표: 단어의 의미를 정확하게 파악할 수 있는 벡터 표현을 찾는 것

  • 모든 원소가 하나를 표현하기 위해 동시적으로 관여하는 것 (one-hot encoding과 다름)
  • one-hot encoding: [0, 0, 1, 0, 0, 0]
  • 분산 표현: [0.2, -4.2, 0.8, 1.2, 2.4, 0.7]

- 자연어 처리의 연구들의 아이디어는 거의 한 아이디어에 뿌리를 두고 있음. 이는 '단어의 의미는 주변 단어에 의해 형성된다'라는 것이며, 이를 분포가설(distribution hypothesis)라고 함

  • '단어 자체에는 의미가 없고, 단어가 사용된 맥락(context)이 의미를 형성한다'

- 동시발생 행렬