"어떻게 자연어를 컴퓨터에게 인식시킬 수 있을까?"에 대한 문제입니다. 즉, 컴퓨터가 인간의 언어를 이해하고 분석 가능한 모든 분야를 뜻합니다. 자연어 처리는 목적에 따라 크게 4가지로 나뉩니다.
(1) 텍스트 분류
(2) 텍스트 유사도
(3) 텍스트 생성
(4) 기계 이해
위의 모든 분야들이 수행되기 위해서는 가장 먼저 단어가 표현이 되어야 합니다. 컴퓨터가 텍스트를 인식하는 방법들 중 가장 기본적인 방법은 아스키 코드로 표현하는 것 입니다. 아스키 코드는 아래와 같이 자연어를 0과 1로 수치화한 값을 뜻합니다.
이 방법은 단순히 컴퓨터가 문자를 인식하기 위한 값이기 때문에, 언어적인 특징이 전혀 담겨있지 않습니다. 그렇다면, 컴퓨터가 언어적인 의미가 담겨있는 자연어를 인식하기 위해서는 어떻게 해야할까요?
그 방법이 바로 단어 임베딩(language embedding)입니다. 단어 임베딩은 앞서 나온 자연어 처리의 다양한 분야들에 적용할 수 있게 언어적 특성을 반영하여 수치화 하는 것을 뜻합니다. 단어 임베딩 방법에도 굉장히 여러가지 방법이 있습니다. 가장 대표적인 3가지는 다음과 같습니다.
원 핫 인코딩은 0 또는 1로 단어를 표현하는 방법입니다. 여기까지만 보면 아스키 코드와 뭐가다르냐 하실수도 있는데, 원 핫 인코딩의 크기는 단어의 수와 같으며, 해당 단어의 인덱스 값만 1입니다.
예를 들어 보겠습니다. 만약 [토끼, 거북이, 고양이, 개] 라는 단어 집합을 원 핫 인코딩으로 나타낸다고 하면, 아래와 같이 나타낼 수 있습니다.
· 토끼 = [1, 0, 0, 0]
· 거북이 = [0, 1, 0, 0]
· 고양이 = [0, 0, 1, 0]
· 개 = [0, 0, 0, 1]
위의 예를 보시면, 각 동물에 해당하는 인덱스 값만이 1인것을 확인할 수 있습니다. 이 방법은 매우 간단하기 때문에 이해하기가 쉽습니다. 하지만 이세상 단어 수는 셀 수 없이 굉장히 많습니다. 따라서 실제 단어 수만큼 표현하기가 어렵습니다. 단어가 몇억개라고 하면, 한 단어의 벡터 크기는 몇억이 되버리기 때문이죠. 그리고 단어 벡터 크기에 비해, 실제 사용하는 값은 해당 인덱스 값 1 단 하나입니다. 마지막으로, 원 핫 벡터는 단어 인덱스 값만 표현하기 때문에, 단순히 단어만을 표시할 수 있고, 의미 특성이 표현되지 않습니다.
카운트 기반의 방법은 특정 문맥의 단어들이 동시에 등장하는 횟수를 직접 세는 방법입니다. 동시에 등장하는 횟수를 co-occurrence라고 하고, 이를 하나의 행렬로 나타내고, 행렬을 수치화하여 단어 벡터로 만드는 방법을 사용하는 방식입니다. 아래와 같은 방법들이 있습니다.
· 특이값 분해(Singular Value Decomposition, SVD)
· 잠재적의미분석(Latent Semantic Analysis, LSA)
· Hyperspace analogue to Language(HAL)
· Hellinger PCA(Principal Component Analysis)
· Bag of Words(BoW)
이러한 방법들은 빠르고, 데이터가 많을 경우 잘 표현되고, 효율적입니다. 여기서는 BoW로 하나의 예를 들어보겠습니다. BoW는 단어의 순서는 고려하지 않고, 단어들의 출현 빈도에만 집중하는 텍스트 데이터의 수치화 표현 방법입니다. BoW는 각 단어에 대해 고유한 정수 인덱스를 부여해 주고, 각 인덱스의 위치에 단어 토큰의 등장 횟수를 기록한 벡터를 만듭니다.
문장 1: 작은 토끼 토끼통 옆에는 큰 토끼 토끼통이 있고 큰 토끼 토끼통 옆에는 작은 토끼 토끼통이 있다.
위와 같은 문장으로 BoW 방법을 적용해 보겠습니다. 먼저 각 단어들에 대해 고유한 정수 인덱스를 부여해 줍니다.
위와 같이 각 단어에 대해 인덱스가 부여되었다면, 이제 각 인덱스의 위치에 단어 토큰의 등장 횟수를 기록한 벡터를 생성합니다.
따라서 이 문장의 BoW결과는 [2, 4, 4, 2, 2, 2, 2, 1, 1]입니다.
예측 방법은 신경망 구조를 이용하여 특정 문맥에 어떤 단어가 나올지 예측하면서 단어 벡터로 만드는 방식입니다. 대표적인 방법으로는 아래와 같은 방법들이 있습니다.
· Word2vec
· NNLM(Neural Network Language Model)
· RNNLM(Recurrent Neural Network Language Model)
· Glove
이 방법은 학습을 통해서 단어를 벡터로 만들기 때문에, 단어의 의미를 잘 임베딩할 수 있고, 때문에 단어 간의 유사도 또한 잘 측정할 수 있습니다. 여기서는 Word2Vec로 하나의 예를 들어보겠습니다. Word2Vec에는 CBOW, Skip-gram 두 가지 방법이 있습니다. 이 두 가지 방법은 비슷하면서도 굉장히 다릅니다. 먼저 CBOW는 어떠한 단어를 문맥 안의 주변 단어를 통해 예측하는 방법으로 학습합니다. 반대로 Skip-gram은 어떠한 단어를 가지고 특정 문맥 안의 주변 단어들을 예측하는 방법입니다. 이 차이는 아래와 같습니다.
문장 2: 고양이는 엄청 귀여운 반려 동물이다.
만약 문장 2를 CBOW, Skip-Gram을 통해 학습시킨다고 하면, CBOW 같은 경우에는 하나의 단어를 없애고, 주변 단어를 통해 해당 단어를 예측하는 방법으로 학습합니다. 따라서 모델의 입력으로도 여러개의 입력 벡터를 받고, 하나의 출력 벡터를 생성합니다. 반대로 Skip-Gram은 하나의 단어를 제외한 모든 단어들을 없애고, 하나의 단어를 통해 문맥 안의 주변 단어들을 예측하는 방법으로 학습합니다. 따라서 입력으로는 하나의 벡터를 받고, 여러 개의 출력 벡터를 생성합니다.