KT AIVLE/AI Track(교육)

[AI] KT AIVLE(KT 에이블스쿨) 3기 AI 개발자 트랙 언어지능 딥러닝- Bidirectional Layer, Embedding Layer -9주차-

머준 2023. 4. 1. 13:29

< 언어 정리>

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에 맞게 설정
				))