오늘은 딥러닝에 본격적으로 입문하며 진행했던 토이 프로젝트에 관해 정리해보겠습니다. 크롤링부터 BoW, Word2Vec 등등 딥러닝 중에서도 자연어 처리에 집중해서 배우게 되어 자연스레 NLP 프로젝트를 진행했습니다.
목차
1. Topic
2. Method
3. Experiment
4. Result
이 프로젝트를 진행할 당시에는 파리올림픽이 한창이었기 때문에 관련해서 주제를 탐색해보았습니다.
여러분은 일론머스크하면 떠오르는 선수가 있으신가요? 바로 김예지 선수입니다. 이처럼 키워드를 보고 파리올림픽의 선수를 떠올릴 수 있을까? 하는 생각에 간단한(?) 키워드 게임을 만들어보았습니다.
어떤 단어들의 연관성을 통해 만들어진 게임이기에, 관련한 여러 method를 적용하며 실험을 진행했습니다. 이때 사용했던 method에 관해 간단히 정리해보겠습니다.
n-gram은 n개의 연속적인 단어 나열을 말합니다. n의 개수에 따라 unigram, bigram, trigram, 4-gram으로 불립니다.
n-gram은 이전에 등장한 모든 단어를 고려하는 것이 아닌 일부 단어만 고려하는 접근 방법을 사용합니다. 이때 일부 단어를 몇 개 보느냐를 의미하는 것이 n값입니다.
n-gram을 통한 언어 모델에서는 다음에 나올 단어 예측은 오직 n-1개의 단어에만 의존합니다. 예시를 들어볼까요?

4-gram일 때, ?를 예측하기 위해 앞의 세 단어만을 고려합니다.
만약 문서에서 "boy is spreading"이 1000번 나오고 "boy is spreading insults"가 500번, "boy is spreading smiles"가 200번 나온다면, ?에 insults가 올 확률은 50%, smiles가 올 확률은 20%라고 할 수 있습니다.
reference
그렇다면, 이 프로젝트에 n-gram을 고려한 이유는 무엇일까요? 파리올림픽 선수 이름 주위에 있는 단어는 그 선수와 관련된 키워드가 될 수 있다는 아이디어에서 n-gram을 고려했습니다.
두 번째로 고려한 method는 동시등장행렬입니다.
다음은 토큰화된 단어들을 대상으로 문서 내에 단어 등장 유무를 나타낸 행렬입니다.
예를 들면, 
이 행렬과 선수 이름 컬럼을 내적해서 구한 것이 동시등장행렬입니다.
이렇게 하면, 특정 선수와 1. 함께 2. 많이 등장한 단어에 더 큰 가중치를 주어 키워드를 추출할 수 있습니다. 이러한 이유 때문에, 이 프로젝트에서 이 방법을 고려한 것입니다.
마지막으로, Word2Vec입니다. Word2Vec은 단어 벡터 간 유의미한 유사도를 반영할 수 있도록 단어의 의미를 수치화한 방법입니다. BoW(Bag of Words) 방식은 단어의 순서를 고려하지 않는 방식이기에 순서를 고려하기 위해 벡터로 표현한 것이죠.
가장 대표적인 예제를 살펴보겠습니다. king - man + woman = queen 이라는 작업을 수행할 수 있는 것이 Word2Vec입니다.
분산 표현은 저차원에 단어의 의미를 여러 차원에다가 분산하여 표현합니다. Word2Vec은 이러한 분산 표현을 사용하여 단어 벡터 간 유의미한 유사도를 계산합니다. Word2Vec의 학습 방식에는 CBOW와 Skip-gram이 있습니다.
CBOW는 주변에 있는 단어들을 입력으로 중간에 있는 단어들을 예측하는 방법입니다. Skip-gram은 중간에 있는 단어들을 입력으로 주변 단어들을 예측하는 방법입니다.
이 프로젝트에서는 전반적으로 Skip-gram이 CBOW보다 성능이 좋다고 알려져 있기 때문에, Skip-gram을 사용했습니다.
reference

그림과 같이, 특정 선수 이름을 target으로 하여 주변 단어를 예측하는 skip-gram 방식을 사용한 것이죠. 비슷한 문맥 속에서 등장하는 단어들은 비슷한 의미를 가진다는 가정 하에 주어진 단어와 유사한 단어, 즉 키워드를 찾아낸 것입니다.
지금까지 프로젝트에 쓰인 3가지 대표적인 NLP method에 관해 정리해보았습니다. 다음 글에서는 실제 게임을 구현하기 위해
과정을 어떻게 진행했는지, 그리고 결과는 어떻게 나왔는지에 관해 이야기해보겠습니다.