-
텍스트 데이터 다루기
배경 지식
1. 텍스트 벡터화의 방식
- 텍스트를 단어로 나누고 각 단어를 하나의 벡터로 변환
- 텍스트를 문자로 나누고 각 문자를 하나의 벡터로 변환
- 텍스트에서 단어나 문자의 n-그램을 추출하여 각 n-그램을 하나의 벡터로 변환
* 텍스트 벡터화란?
텍스트를 수치형 텐서로 변환하는 과정, 딥러닝 모델은 수치형 텐서만 다룰 수 있기때문에 반드시 이 과정이 필요함
모든 텍스트 벡터화 과정은 토큰화 적용 후 생성된 토큰에 수치형 벡터를 연결하는것으로 이루어짐
* n-그램이란?
문장에서 추출한 N개의 연속된 단어 그룹
n=2라면, "The cat"은 {"The", "cat", "The cat"} 으로 분해됨
2. 토큰과 벡터를 연결하는 방법
- 원-핫 인코딩
- 단어 임베딩 ( = 토큰 임베딩 )
* 토큰 : 텍스트를 나누는 단위
* 토큰화 : 텍스트를 토큰으로 나누는 작업
이번 글에서는 이 토큰과 벡터를 연결하는 2가지 방법 (원핫인코딩, 단어임베딩)을 위주로 작성하려한다.
원-핫 인코딩
1. One-Hot-Encoding 이란?
- 토큰을 벡터로 변환하는 가장 일반적이고 기본적인 방법
- 모든 단어에 고유한 정수 index를 부여한 후, 이 index를 이진 벡터로 변환
( 이때, 해당 벡터의 index만 1이고 나머지는 모두 0 )
2. 케라스에서 사용하는 방법
직접 코드로 원-핫 인코딩을 구현할수는 있지만,
케라스에서는 텍스트 데이터를 단어 or 문자수준의 원핫인코딩으로 변환해주는 유틸리티가 있음
3. 원-핫 해싱 ( = 원-핫 인코딩의 변종 )
- 어휘사전에 있는 토큰의 수가 너무 클때 사용
- 단어를 해싱하여 고정된 크기의 벡터로 변환
- 장점 : 단어인덱스가 필요없으므로 메모리 절약, 전체 데이터 확인하지않고도 토큰 생성 가능
- 단점 : 해시 충돌
* 해시 충돌이란?
2개의 단어가 같은 해시를 만들었을때 머신러닝이 이 단어 차이를 인식하지 못하는것
해싱 공간의 차원이 토큰개수보다 훨씬 크면 충돌 가능성은 감소됨
단어 임베딩
1. 원-핫 인코딩과의 차이점
- 희소하고 고차원인 원-핫 인코딩과 달리, 저차원의 실수형 벡터 (밀집 벡터)
- 수동적으로 인코딩하는 원핫인코딩과는 달리 데이터로부터 학습함
- 원핫인코딩보다 더 많은 정보를 더 적은 차원에 저장함
2. 단어 임베딩을 만드는 방법
- 풀려고 하는 문제와 함께 단어 임베딩을 학습하는 방법
: 랜덤한 단어 벡터로 시작하여 가중치를 학습하는 것과 같은 방식으로 단어 벡터를 학습함
- 사전 훈련된 단어 임베딩을 사용하는 방법
처음부터 단어 임베딩을 학습하는 방법과 사전 훈련된 단어 임베딩을 사용하는 방법 이 2가지를 모두 다뤄볼것이다.
3. Embedding 층을 사용하여 단어 임베딩 학습하기
- 단어 임베딩이란?
단어 사이에 있는 의미 관계를 반영하여 기하학적 공간에 매핑하는 것
ex) 동의어의 경우, 비슷한 단어 벡터로 임베딩됨
거리와 특정 방향은 단어 사이의 의미와 관계되어 있음
ex) dog와 cat VS wolf와 tiger : 두 집단간의 거리는 애완동물에서 야생동물로 이동하는것을 의미
- 케라스에서 사용하는 방법 ( = Embedding 층 사용하기 )
☞ Embedding 층 추가하기
케라스에서는, Embedding 층을 추가하여 단어 임베딩을 구현할 수 있음
Embedding 층은 정수 index를 밀집 벡터로 매핑하는 딕셔너리라고 이해하면 좋음
☞ 입력
( samples, sequence_length ) 인 2D 정수 텐서
배치의 시퀀스는 모두 길이가 같아야하므로 길면 잘리고 작으면 0으로 패딩됨
☞ 출력
( samples, sequence_length, embedding_dimensionality ) 인 3D 실수형 텐서
☞ 가중치
처음에는 랜덤하게 초기화되고, 훈련하면서 역전파를 통해 점차 조정됨
☞ 실습 코드 설명 ( Embedding 층 사용 방법 )
이 코드에는 안나와있지만, 데이터 전처리단계에서 정수리스트로 데이터를 로드한 후, 리스트를 2D 정수텐서로 변환함
그 후, Embedding층을 통해 3D 실수형 텐서로 변환시킴.
이 때, Flatten() 에서 사용하기 위해 input_length의 값도 넣어주어야함
* 이 방법은 단어 사이의 관계나 문장 구조를 고려하지 않는 방법이므로,
전체를 고려하기 위해서는 Embedding 층 위에 순환 층이나 1D 합성곱 층을 추가하는 것이 좋음
4. 사전 훈련된 단어 임베딩 사용하기
- 훈련데이터가 부족할 때 미리 계산된 임베딩 공간에서 임베딩 벡터를 로드하는 방법
- 케라스는 Embedding 층을 위해 내려받을 수 있는 사전 훈련된 단어 임베딩 DB가 있음
( = Word2vec, GloVe, ... )
<케라스 창시자에게 배우는 딥러닝>(길벗, 2018)을 학습하고 개인 학습용으로 정리한 내용입니다.
'인공지능 > 케라스 창시자에게 배우는 딥러닝' 카테고리의 다른 글
[5. 컴퓨터 비전을 위한 딥러닝] 5.3 사전훈련된 컨브넷 사용하기 (0) 2021.01.24 [5. 컴퓨터 비전을 위한 딥러닝] 5.2 소규모 데이터셋에서 컨브넷 훈련하기 (0) 2021.01.20 [5. 컴퓨터 비전을 위한 딥러닝] 5.1 합성곱 신경망 소개 (0) 2021.01.20 [4. 머신러닝의 기본요소] 4-5. 보편적인 머신 러닝 작업 흐름 (0) 2021.01.13 [4. 머신러닝의 기본요소] 4-3, 4-4. 데이터 전처리 및 과대적합과 과소적합 (0) 2021.01.12 댓글