Attention please

[딥러닝] 시소러스, 동시발생행렬 본문

딥러닝/RNN

[딥러닝] 시소러스, 동시발생행렬

Seongmin.C 2022. 10. 7. 13:53
728x90

이 카테고리에서 다룰 것은 RNN입니다.

 

자연어를 처리하기 위해 어떤 식으로 텍스트들을 전처리를 하며,

어떻게 층이 구성되는지 알아보겠습니다.

 

하지만 이번 글에서 설명할 시소러스는 머신러닝과는 거리가 멀기도 하니,

시소러스에 대해서는 머신러닝이 왜 필요한 것인지 아는 정도로 끝내도록 하겠습니다.

 

 

 

 

 

 

 

 

시소러스

시소러스란 단어 사이의 상위와 하위 관계를 트리로 체계화 한것을 의미합니다.

 

예를 들어 car의 하위관계에 속하는 단어는 SUV가 있을 것이며,

상위관계에 속하는 단어에는 motor vehicle이 있을 것입니다.

 

 

다음과 같이 단어들의 관계를 트리구조로 나타냅니다.

 

 

 

 

 

 

 

 

시소러스의 문제점

하지만 위 시소러스에게는 큰 문제점이 있습니다.

 

일단 시소러스는 머신러닝과 같은 기법으로 만드는 것이 아닙니다.

 

모두 사람이 직접 개입하여 수작업으로 만드는 것이기에, 

머신러닝과는 상당이 거리가 멀다고 한 것입니다.

 

그렇기에 가질 수 있는 문제점 3가지는 

 


1. 시대변화에 대응하기 어렵다.

 

아무래도 시대가 흐르면 흐를 수록 같은 단어지만 다른 의미로 변질되기도 하며,

새로운 단어가 끊임없이 생겨나기 때문에 수작업으로 일일이 대응하기 어렵습니다.

 

2. 사람을 쓰는 비용이 크다.

 

앞서 말했던 것처럼 일일이 수작업으로 하는 것이기 때문에

드는 시간, 비용 모두 크다는 문제가 있습니다.

 

3. 단어의 미묘한 차이를 표현하기 어렵다.

 

같은 뜻이여도 상황에 따라 다르게 쓰이는 단어들이 있습니다.

예를 들어, 빈티지와 레트로의 단어가 그 예시입니다.

 

오래된 게임을 나타낼 때 빈티지 게임이라 하면 어색하고,

레트로 게임이라 해야 어색하지 않은 것처럼

단어간의 미묘한 차이들을 수작업으로 표현하기에는 어려움이 있습니다.


 

 

 

 

 

 

 

 

 

희소표현

CNN의 경우 이미지들은 이미 행렬의 형태를 나타내고 있기 때문에

머신러닝에 돌리기 위한 전처리가 필수적이지 않습니다.

 

하지만 텍스트의 경우에는 따로 벡터나 행렬의 형태가 아니기 때문에

벡터로 변환해주는 전처리 과정이 필수적입니다.

 

텍스트의 한 덩어리를 말뭉치라 표현하는데,

예를 들어,

 

You say goodbye and I say hello.

 

와 같은 말뭉치가 있다고 해봅시다.

 

 

이때 위 말뭉치를 벡터로 전처리 하기 위해 가장 쉽게 접근할 수 있는 방법은

순서에 따라 벡터화 시키는 것입니다.

 

단어 ID vector
you 0 [1,0,0,0,0,0,0]
say 1 [0,1,0,0,0,0,0]
goodbye 2 [0,0,1,0,0,0,0]
and 3 [0,0,0,1,0,0,0]
I 4 [0,0,0,0,1,0,0]
hello 6 [0,0,0,0,0,1,0]
. 7 [0,0,0,0,0,0,1]

 

 

 

 

 

 

 

 

희소 표현의 문제점

하지만 다음과 같이 전처리를 하게 되면 문제가 있습니다.

 

 

1. 말뭉치의 양이 늘어나면 벡터의 크기가 지나치게 커진다.

 

CNN의 경우 화소를 표현하는데 3차원이면 모든 색을 표현할 수 있습니다.

 

하지만 위 말뭉치의 경우 단지 7개의 단어만이 등장했을 뿐인데

이미 7차원의 벡터가 된 것을 볼 수 있습니다.

 

 

 

2. 벡터가 단어의 의미를 포함하지 않는다.

 

 단어는 서로 관련성을 가집니다.

하지만 위와같은 희소표현은 단어간의 관련성을 벡터에서 나타낼 수 없다는 것입니다.

 

(화소표현의 경우 RGB의 채널로 구성되어 있기에 계열을 파악할 수 있습니다.)

 

 

 

 

 

 

 

 

동시 발생 행렬

위 문제들을 해결하기 위해 나온 것이 동시발생행렬입니다.

 

여기에는 윈도우라는 개념이 나오는데

윈도우만큼 주위 단어들을 벡터에 집어넣는 것입니다.

 

즉, Nice to meet you 라는 말뭉치가 있고 윈도우가 1이라면,

 

  Nice to meet you
Nice 0 1 0 0
to 1 0 1 0
meet 0 1 0 1
you 0 0 1 0

 

와 같이 윈도우의 크기만큼 주위의 단어에 1을 매기는 것입니다.

 

위 같은 방법으로 단어와 단어 사이에

연관성이 벡터에 들어가게 됩니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
Comments