컴퓨터가 인간의 언어를 이해할 때, 컴퓨터가 이해할 수 있도록 숫자로 변환하는 과정이 필요하다. 여기서 인간의 언어를 ‘자연어’라고 한다. 컴퓨터는 숫자로 처리하고 숫자로 이해하기 때문에, 자연어를 숫자로 처리해주어야 한다. 이 처리 과정을 자연어 전처리라고 한다.
자연어 처리(NLP, Natural Language Processing)에서 전처리 과정에 텍스트를 벡터로 변환하는 **벡터화(Vetorization)**라는 과정이 있다.
<aside> 🌊 전처리 과정 (in Text Mining)
이번엔, 전처리 과정 중 벡터화에 관련된 내용만 살펴볼 예정이다.
벡터화의 방식에는 크게 두 가지 방식이 있는데, 콜아웃에 적었다시피 BoW (Bag of Words) 방식과 임베딩 (Embedding)방식 이 둘로 나뉘게 된다.
카운트
기반의 단어 표현
BoW, 단어 주머니. 이름에서 알 수 있듯이 문장이나 문서에 포함된 단어 토큰을 등장한 순서를 고려 하지 않고, 하나의 ‘가방’에 담는다는 뜻이다. 하나의 가방에 담게 되면, 순서보다는 빈도수
만 고려하게 된다.
https://ogre51.medium.com/nlp-explain-bag-of-words-3b9fc4f211e8
문서에 나오는 텍스트를 전부 단어 단위로 토큰화를 해주고, 이 단어들을 전부 가방에 집어 넣어 준다. 이때 가방 안에서 순서, 맥락, 문법은 전혀 고려하지 않는다. 그리고 가방 안에 단어들이 몇 개가 있는지 등장 횟수를 count 해준다.
<aside> 💡 BoW Bag of Words
문서 내에서 문장의 단어가 나온 횟수(빈도)만큼 중요도를 나타낸다고 보고, 이를 벡터로 만들어주는 방법!
</aside>
예를 들어, 다음과 같은 문장이 2개 있다고 가정해보자.
1. hello world. he is ruru.
2. my name is ruru.
이 두 개의 문장으로 Bag of Words를 만들면 다음과 같이 만들어질 것이다.
hello | world | he | is | ruru | my | name | |
---|---|---|---|---|---|---|---|
hello world. he is ruru. | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
my name is ruru. | 0 | 0 | 0 | 1 | 1 | 1 | 1 |
TOTAL | 1 | 1 | 1 | 2 | 2 | 1 | 1 |
BoW = {hello : 1, world : 1, he : 1, is : 2, ruru : 2, my : 1, name : 1}
BoW 방식은, 직관적으로 이해가 가능하고 단어의 빈도수를 기반으로 문서를 비교하거나 주제를 파악하는데 유용하다는 장점이 있다. 그러나 문맥 해석이나 의미론적 차이까지 분별하지는 못한다는 단점을 가지고 있다. 텍스트를 보다 정확히 이해하려면, 단어의 등장 순서나 문맥의 내용에 따라 토큰의 의미를 파악하는 것이 중요하다.
분포
기반의 단어 표현
분포 가설: 비슷한 위치의 단어는 비슷한 의미를 띄운다는 가설
**강아지**란 단어는 *귀엽다, 예쁘다, 애교* 등의 단어가 주로 함께 등장하는데
분포 가설에 따라서 해당 내용을 가진 텍스트의 단어들을 벡터화한다면
해당 단어 벡터들은 유사한 벡터값을 가지게 됨.
이렇게 표현된 벡터들은 원-핫 벡터처럼 벡터의 차원이 단어 집합(vocabulary)의 크기일 필요가 없으므로, 벡터의 차원이 상대적으로 저차원으로 줄어들게 된다.
Ex) 강아지 = [ 0 0 0 0 0 1 0 0 0 0 0 0 ... 중략 ... 0]
1이란 값 뒤에 994개의 0의 값을 가지는 벡터가 됨!
하지만 Word2Vec으로 임베딩 된 벡터는 굳이 벡터 차원이 단어 집합의 크기가 될 필요가 없게됨!
Ex) 강아지 = [0.2 0.3 0.5 0.7 0.2 ... 중략 ... 0.2]
⇒ 요약하면 희소 표현이 고차원에 각 차원이 분리된 표현 방법이었다면, 분산 표현은 저차원에 단어의 의미를 여러 차원에다가 분산하여 표현한다.. 이런 표현 방법을 사용하면 단어 벡터 간 유의미한 유사도를 계산할 수 있게 된 것이다!
<aside> 💡 임베딩 Embedding
토큰들을 벡터 공간에 표현하는 방법 비슷한 의미를 갖는 단어들끼리 가깝게 위치하도록 만드는 것!
</aside>
<aside> ❓ 근데 컴퓨터가 어떻게 토큰들을 **의미적으로 ‘가깝다’**고 판단할 수 있지?
</aside>
강아지란 단어를 표현하기 위해 사용자가 설정한 차원의 수를 가지는 벡터가 되며 각 차원의 값은 실수값을 가지게 됨.
Word2Vec의 구조
CBOW의 방식은 주변 단어로 타깃 단어를 예측하고, Skip-gram 방식은 타깃 단어로 주변단어를 예측함
전반적인 내용만 다루기 때문에 상세한 내용은 생략
대량의 문서(Document)를 보유하고, 데이터셋 내 포함된 문장이 완전하면 임베딩으로 좋은 성능을 낼 수 있다. 앞서 살펴본 BoW와는 달리, 단어가 사용된 맥락과 순서를 반영한다는 장점을 가지고 있지만, BoW 방식에 비해서 시간이 오래 걸리고 직관적 이해가 어렵다. 처리 기법에 대한 이해도도 필요하고, 텍스트가 다루는 주제에 따라 편향된 결과가 나올 수 있어 유의해야 한다.