딥러닝(텐서플로우)

자연어 처리(NLP), 원핫벡터 (ft.임베딩), GlobalPooling

Dean83 2023. 4. 6. 10:20

1. 자연어 처리 NLP

Natural Language Process를 자연어 처리라고 한다. 

우리가 일상적으로 사용하는 문장을 이해하고 딥러닝에서 활용하기 위함이고, 앞서 이야기 했듯

NLP를 위해 LSTM 알고리즘을 사용하여 처리한다. 

 

그리고 여기서 빠질수 없는것이 원핫벡터이다.

이 카테고리 초기 글 중 FNN 에 관련한 글을 적었을때 설명한 적이 있으나, 따로 글로 빼는것이

찾기가 편할것 같아서 따로 기록을 한다. 

 

2. 원핫벡터 (원핫 인코딩)

일상적으로 사용하는 문장을 데이터화 하여 사용하기 위한 방법이다. 1개만 1의 값을 가지고 나머지는 0을 가지는 

벡터를 원핫 벡터라고 한다. 

 

"나는 버스를 타고 출근을 한다." 

 

라는 문장이 있을 경우, 각 단어를 구분짓기 위해 임의의 숫자를 배정해보자 예를들어,

나는 =  2, 버스를 = 3, 타고 = 4, 출근을 = 5,한다 =1  이라고 하면, 위의 문장을  숫자 나열로 바꾸면, 2,3,4,5,1 이 된다. 

이 뿐만 아니라 번호의 조합을 변경 하면, 다른 문장을 만들어 낼 수 도 있다.

 

이를 원핫 벡터로 치환을 하면, 

나는 = 0,1,0,0,0 , 버스를 = 0,0,1,0,0, 타고 = 0,0,0,1,0 , 출근을 = 0,0,0,0,1, 한다 = 1,0,0,0,0 으로 표현 할 수 있다.

(차례로, 2번째 인덱스만 1, 3번째 인덱스만 1 ...... 첫번째 인덱스만 1)

 

총 문장에 대한 원핫벡터는 (0,1,0,0,0)  으로  행렬 표현 할 수 있다. 

                                            (0,0,1,0,0)

                                            (0,0,0,1,0)

                                            (0,0,0,0,1)

                                            (1,0,0,0,0)

 

원핫벡터의 경우, 단어와 단어간의 유사성 등은 담을 수 없다. (오직 단어의 배치만 표현하므로)

 

2.1 Embedding

이렇게 행렬 형태로 변환 하는것을 임베딩 이라고 한다.  결과값으로 또한 이 데이터 형식은 CNN에서 입력받는 데이터와 같기에 CNN을 통해 자연어 처리를 하기도 하였다.  학습을 하면서 의미가 비슷한 단어의 벡터거리가 가까워지고, 그렇지 않은 경우는 멀어지도록 한다면, 단어간의 유사도를 알 수 있고 자연어 처리를 할 수 있게 된다.  (이를 분산표현이라고 한다) 단어 뿐 아니라 다른곳에서도 사용 할 수 있다. (동물 종의 유사성, 과일 종류 등등...)

Embedding 함수는, 원핫벡터가 아닌 dense vector,  즉 실수값을 갖는 벡터를 리턴한다.

 

- keras.layers.Embedding() 으로 함수 호출을 하면 된다. 

인자값 설명

- input_dim 숫자값 : 총 단어의 갯수

- output_dim 숫자값 : 결과값이 출력되는 개수. 만일 3 x 3 행렬 인풋일 경우, output_dim 에 2를 입력하면, 3 x 2 행렬이
                                   리턴된다. 이 의미는 한 문장에 포함될 수 있는 단어의 갯수를 의미한다. 

- mask_zero true or false : 패딩된 값인 0을 무시할지 말지 여부

 

2.2. keras.processing.text.tokenizer

텍스트를 단어 기반으로 토큰화를 하는 클래스이다. 단어 기준으로 문장을 자르고, 각 단어에 숫자를 key로 하는 딕셔너리를 만든다. 

 

- fit_on_texts(문자열) 함수 : 문자열을 리스트 형태로 변환

- word_index 변수 : key가 숫자이고, value가 단어인 딕셔너리 변수 

- text_to_sequences(문자열) 함수 : 문장을 숫자로 변환하여 표현함. (위에 명시한 [2,3,4,5,1] 이런식으로) 
  이전에 fit_on_texts 로 토큰화가 되지 않은 문자열을 인자값으로 줄 경우, 새로 추가된 단어는 제외하고 결과를 준다.
   - tokenizer 클래스 생성자 인자값인 oov_token 에 문자열 인자값을 줄 경우, 토큰화 되지 않은 단어들은 해당 문자열로

     처리하여 인덱싱 하고 결과를 준다. 당연히 부정확 한 결과가 될 것이다.  

 

2.3 keras.processing.sequence.pad_sequences() 함수 

서로 다른 개수의 단어로 구성된 문장을 같은 길이로 맞추어  준다. 데이터 양식이 일치해야 하므로 사용한다. 

- sequences 인자값 (문자열) :  문자열 집합

- padding='post' 혹은 'pre' : 패딩을 채울 위치

- value 숫자값 : 채울값. 0으로 채우는게 일반적이다. 

- maxlen 숫자값 : 최대 길이를 제한. 이 숫자를 넘는 경우는 잘라냄

- truncating 'post' 혹은 'pre' : 잘라내야 할 경우, 뒤를 잘라낼지, 앞을 잘라낼지 결정

 

tokenizer = keras.preprocessing.text.Tokenizer()
tokenizer.fit_on_texts(X)
X = tokenizer.texts_to_sequences(X)
X = keras.preprocessing.sequence.pad_sequences(X, value=0, padding='post', maxlen=숫자)

//X는 문장을 담고 있는 배열 변수

 

3. GlobalPooling

CNN에서 이미지 학습을 하기 위해 이미지 사이즈를 줄이는 용도로서 MaxPooling 을 사용 하였다. 

GlobalPooling 또한 입력값이 사이즈를 줄이는 역할을 하나, 동시에 차원 또한 줄이는 역할을 한다. 자연어는 차원이 큰 데이터 이기 때문에 학습을 위해서 GlobalPooling 을 통해 압축을 하여 학습을 하게 된다. 

keras.layers.GlobalAveragePooling1D() 를 통해 1차원으로 변경하면서 데이터를 줄인다. 

 

자연어 데이터의 차원을 코딩적으로 설명을 하자면, 벡터화를 하였을때 해당 개수가 100개라고 하면 이는 100 차원이다. 

([0,0,1,0,......] 이 100 개라 하면, 이는 100차원 이다)

'딥러닝(텐서플로우)' 카테고리의 다른 글

윈도우 기법  (0) 2023.04.06
RNN, LSTM  (0) 2023.04.06
DeConv (DCNN), ConvTranspose  (0) 2023.04.05
이미지 생성, GAN  (0) 2023.04.05
Object Detection 및 Semantic Segmentation (FCN)  (1) 2023.04.05