카운트 기반 단어표현이란?
지난시간에 우리는 컴퓨터가 인간의 언어를 배우는 벡터화(vectorization)에 대해 배웠습니다. 그중 언어를 0과 1의 이진수의 행렬로 표현하는 기법을 '원핫 인코딩(one-hot encoding)이라고 한다는 것도 배웠지요.
원핫 인코딩을 통해 단어와 문장을 0과 1의 이진수로 표현했다면 이제 카운트 기반 단어표현을 통해 다양한 태스크를 수행할 수 있습니다. 이처럼 컴퓨터가 언어를 배우는 방식만 알아도 우리는 문서의 특성을 파악하고, 비교하고, 단어를 빈도순으로 추출하는 등 많은 일을 할 수 있습니다.
이번시간에 배울 카운트 기반 단어표현(count-based word representation) 이란 글의 문맥 안에 특정 단어가 동시에 등장하는 빈도수를 세어 수치화하는 방법입니다. 이를 위해서 단어의 등장 횟수를 하나의 행렬로 나타낸 뒤 그 행렬을 수치화하여 단어 벡터로 만드는 방식을 사용합니다. 카운트 기반 단어표현을 활용한 자연어처리 기법들에는 크게 DTM(Document-Term Matrix)과 TF-IDF(Term Frequency-Inverse Document Frequency)가 있는데, 그 개념은 다음과 같습니다.
위에서 원핫인코딩을 통해 텍스트 데이터를 어떻게 0과1의 이진수 데이터로 수치화 하여 표현하는지 살펴보았습니다. 이제 한 발 나아가 문서(document) 단위로 단어의 빈도수(frequency)를 파악하는 DTM에 대해 소개하겠습니다. 다수의 문서에서 등장하는 각 단어의 빈도를 행렬로 표현한 것이 바로 문서 단어 행렬(Document-Term Matrix, DTM)입니다.
위의 예시와 같이 ‘About the bird, the bird, bird, bird, bird’ , ‘You heard about the bird’, ‘The bird is the word’라는 서로 다른 세 가지 문서(document)가 있다고 가정해 봅시다. 우리는 각각의 문서에 등장하는 단어들을 column(열)에, 그리고 각 문서를 row(행)에 배치하여 about(110), bird(511), heard(010)과 같은 형식으로 하나의 DTM 행렬(matrix)을 만들어낼 수 있습니다.
이런 식으로 문서 간의 단어 행렬을 만들면 문맥뿐 아니라 서로 다른 문서 간에도 단어의 빈도를 비교하는 통계학적 접근을 통해. 이처럼 DTM 방식을 활용하면 우리는 문서 내 키워드 추출, 문서 간 유사도 계산, 검색 결과 추천 등의 NLP 태스크(task)를 수행할 수 있습니다.
DTM은 분명 매우 간단하고 직관적으로 이해하기 쉬운 단어 표현방식이긴 하지만, 모든 단어의 중요도를 단순히 등장 횟수(frequency)만으로 판단한다는 치명적인 문제가 있습니다. 예를 들어 ‘The’, ‘It’, ’They’[비비58] 와 같은 영어단어들은 모든 문서에 매우 높은 빈도로 등장하지만, 문서의 의미나 유사도 파악에 있어서는 거의 의미가 없지요. 반면 NLP 관련 논문에 등장하는 ‘Token’, ‘Corpus’와 같은 단어들은 일반적인 문서에는 거의 등장하지 않지만, 관련 문서에서는 매우 중요한 단어일 가능성이 높습니다.
TF-IDF(Term Frequency-Inverse Document Frequency)는 이처럼 해당 단어가 등장하는 총 문서의 개수(term frequency)뿐만 아니라, 현재 문서에서 해당 단어의 중요도(document frequency)까지 고려한 단어 표현 방식입니다. 수학적으로 TF-IDF는 단어 빈도와 역문서 빈도의 곱으로 표현할 수 있는데, 아래의 식과 같이 표현될 수 있습니다.
예를 들어 앞에서 예로 들었던 ‘The’, ‘It’, ‘They’와 같은 단어들은 현재 문서(TF)와 일반적인 문서(DF)에서 등장확률이 높은 반면, ‘NLP’, ’Token’[비비61] 과 같은 단어들은 현재 문서(TF)에서의 등장 확률은 높고, 일반적인 문서(DF)에서의 등장 확률은 낮을 가능성이 높습니다. TF-IDF에서 DF를 역(inverse)으로 반영하기 위해 log를 사용합니다. 따라서 위의 수식은 다음과 같이 변형할 수 있습니다.
위와 같이 TF-IDF로 표현한 단어 중요도는 단어의 정보를 더욱 많이 가지고 있는 만큼 DTM과 비교했을 때 더욱 높은 성능을 얻을 수 있습니다. 지금까지컴퓨터로 단어를 표현하는 BoW의 개념과 DTM 그리고 TF-IDF에 대해 다루어 보았습니다. 그러나 모든 과도기적 기술이 그러하듯 DTM과 TF-IDF 역시 치명적인 한계점을 가지고 있습니다. 이제 카운트 기반 단어표현의 한계를 극복하기 위해 등장한 분포 기반 단어표현(distribution based word representation)에 대해 배워보기 전에 우선 카운트 기반 단어표현 방식의 한계를 알아봅시다.
1. 문맥 파악이 불가능하다
BoW는 ‘단어 주머니’라는 이름에서 유추할 수 있듯이 문맥을 고려하지 않고 단어를 모아 놓기만 할 뿐 순서나 문맥은 전혀 고려하지 않습니다. 이러한 이유 때문에 BoW는 같은 단어라도 위치와 문맥에 따라 전혀 다른 의미가 될 수 있는 자연어(natural language)의 고유한 성질을 올바르게 표현할 수 없지요.
예시로 ‘Time flies like a bullet’이라는 문장을 살펴봅시다. 해당 문장은 ‘시간은 총알처럼 빠르게 흐른다.’라는 의미로 해석될 수 있지만, 문맥에 따라서는 ‘시간 파리들은 총알을 좋아한다’라는 의미로 해석될 수도 있습니다. 이 두 경우 fly라는 단어는 ‘날다’, ’파리’ 라는 전혀 다른 두 가지 의미로 해석될 수 있으며, like는 ‘좋아하다’라는 동사 혹은 ’~와 같다’라는 형용사로 해석될 수 있는 것입니다. 그러나 단순히 단어의 등장 횟수에만 기반하여 단어를 표현하는 BoW 방식은 문장이 전혀 다른 두 가지의 방식으로 해석될 수 있는 자연어(natural language)의 특성을 전혀 반영하지 못합니다.
2. 희소행렬(sparse matrix ) 문제
원핫 인코딩(one-hot encoding[비비68] )에 의존하는 BoW 방식은 단어 하나하나를 0과1의 이진수로 표현한다는 것을 배웠습니다. 예를 들어 ‘I like an apple’이라는 문장을 BoW 방식으로 표현하면 ‘I(1000)’, ’like(0100)’, ’an(0010)’, ’apple(0001)’로 이루어진 행렬로 표현할 수 있습니다.
희소행렬(sparse matrix)은 공간의 낭비가 심하다
원핫인코딩의 예에서 살펴본 ‘쉽게 배우는 자연어처리’라는 문장은 3개의 토큰으로 이루어진 매우 단순한 문장으로, 원핫인코딩을 사용하면 위와 같이 3차원 행렬로 표현할 수 있었습니다. 이처럼 단어의 수가 적을 때는 원핫인코딩의 표현방식이 문제가 되지 않을 것입니다. 하지만 문장이 길어지면 어떨까요? 세계에서 가장 긴 문장은 46만개의 단어로 이루어져 있다고 합니다. 니겔 텀(Nigel Tomm)이라는 작가가 펴낸 『The Blah Story』 에 등장하는 하나의 문장에는 무려 46만개에 달하는 단어가 들어가 있다고 하는데, 원핫인코딩으로 이 한문장을 표현하기 위해서는 자그만치 46만 차원의 행렬을 만들어야 하는데, 이는 사실상 불가능한 일이죠.
이러한 문제는 단어를 0과1로 표현하는 이진수의 특성을 고려했을 때 행렬상의 공간 대부분이 0[비비72] 으로 채워져 있기 때문에 발생하는데, 이처럼 데이터를 표현하기 위해 필요한 저장공간은 큰 반면 실질적으로 담고 있는 정보는 매우 적은 문제를 희소행렬(sparse matrix) 문제라고 합니다. 원핫인코딩은 텍스트 데이터를 표현하는 데에 있어서 매우 효율성이 떨어지는 방식인 것입니다. 따라서 방대한 양의 텍스트 데이터를 입력하고 표현하기에 원핫인코딩 방식은 부적절합니다. 이러한 문제를 해결하기 위해 단어 임베딩이라는 새로운 임베딩 방법이 등장합니다.