[AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 언어지능 딥러닝- Bidirectional Layer, Embedding Layer -9주차-
< 언어 정리>
Corpus | 텍스트 문서들의 집합 |
Document | 하나의 텍스트 데이터(ex 하나의 신문 기사) |
Tokenizing | 직접 사용할 의미있는 단위 |
Embedding | 단어, 토큰, 문서 등을 vetor로 바꾸는 것 |
- 언어 전처리 과정
Sentence -> Tokenization -> Cleaning, Stemming -> Encoding -> Sorting -> Padding, Similarity
- tokenization
: 주어진 문장에서 ‘의미부여’가 가능한 단위 찾기
단어를 처리하는 방식이 패키지마다 다르므로 내가 처리하고자 하는 방식을 가지고 있는 패키지를 선택하는 것이 중요하다.
# tensorflow의 tokenizer
from tensorflow.keras.preprocessing.text import Tokenizer
# tokenizer 선언
# num_words 상위 몇 개까지(n개) 출력할 것인가
# lower : 입력받은 문자열을 소문자로 변환할지를 선택
tokenizer = Tokenizer(num_words= n, lower = False)
tokenizer.fit_on_texts(x_train)
x_train = tokenizer.texts_to_sequences(x_train)
# nltk의 tokenizer
from nltk.tokenize import TreebankWordTokenizer
# tokenizer 선언
tokenizer = TreebankWordTokenizer()
tokenizer.tokenize(text)
- Cleaning (정제)
: 데이터 사용 목적에 맞추어 노이즈를 제거
(1) 대문자 vs 소문자
mike vs Mike / US vs us
(2) 출현 횟수가 적은 단어 제거
(3) 길이가 짧은 단어, 지시(대)명사, 관사 제거
- Stemming
* 어간(Stem): 단어의 의미를 담은 핵심
* 접사(Affix): 단어에 추가 용법 부여
(1) 어간 추출
: 품사 정보 갖고 있지 않다.
=> stemming의 대표적 방법인 Porter Algorithm 사용
(2) 표제어 추출
: 단어의 품사 정보를 포함하고 있다.
=> stemming의 대표적 방법인 Porter Algorithm 사용
(3) 불용어 (Stopword)
: 문장에서 대세로 작용하지 않는, 중요도가 낮은 단어 제거
메모리 차원, 시간 차원, 해석 차원에서 지워주는 것이 좋다.
import nltk
nltk.download(‘stopwords’)
from nltk.corpus import stopwords
- Encoding
: 전처리 된 문장의 단어들에게 숫자를 부여 (정수 인코딩)
첫 문장부터 순서대로 단어들에게 숫자를 부여할 수 있지만, 많이 나온 순서대로 단어에게 숫자를 부여하는 것이 더 좋아 보인다. 따라서 빈 딕셔너리를 만들고 딕셔너리에 해당 단어가 있으면 +1을 해준 후 정렬하여 많이 나온 순서대로 단어에게 숫자를 부여한다.
- Padding
: input shape를 맞춰주기 위하여 zero-padding을 해준다.
from tensorflow.keras.preprocessing.sequence import pad_sequences
# maxlen: 총 길이 n
# maxlen 지정 안 해주면 가장 긴 길이를 기준으로 padding
x_train = pad_sequences(x_train, maxlen = n)
x_test = pad_sequences(x_test, maxlen = n)
- TF-IDF ( Term Frequency – Inverse Document Frequency )
: 단어들의 중요한 정도를 가중치로 매기는 방법
- Bidirectional Layer
: RNN 같은 경우(정방향) 마지막 시점(최신정보)이 과거의 맥락을 고려하여 반영하는데, 시점에 대한 역방향 레이어를 추가하여 첫 시점에서 과거정보(미래정보)도 고려하게 하여 RNN의 단점을 보완한다.
# 정방향, 역방향 layer를 정해줄 수 있음
# 역방향 layer에 go-backwards = True 적어줘야함
forward layer = keras.layers.LSTM(24, return_sequences=True)
backward layer = keras.layers.GRU(16, go_backwards=True, return_sequences=True)
bid_hl = keras.layers.Bidirectional(layer = forward layer, backward_layer=backward layer)(hl)
Conv1D(filters = n, # n 종류의 특징을 제작
stride = m, # filter가 얼마나 촘촘히 훑을 것 인지
kernel_size = k, # 한번에 관찰할 시점 수
padding = ‘valid’ # default는 valid
activation = ‘relu’,
)
MaxPool1D(n) # n개중 최댓값만 추출
- embedding
model.add(keras.layers.Embedding(max_words, # 총 단어 개수
embedding, # 특징 수
input_length = max_len # input shape에 맞게 설정
))