Tokenizer()
num_words= # 단어의 빈도수가 높은 순으로 사용할 단어 개수
filters= # 걸러낼 문자 리스트 (default: '!"#$%&()*+,-./:;<=>?@[\]^_`{|}~\t\n')
lower= # 입력받은 문자열을 소문자로 변환할지 (True, False)
split= # 단어를 분리하는 기준
char_level= # True인 경우 모든 문자가 토큰으로 처리
oov_token= # text_to_sequences 호출 과정에서 word_index에 추가되어 out-of-vocabulary words를 대체함
.fit_on_texts(sentences) # 문자 데이터를 입력받아 리스트 형태로 변환
.word_index # 단어와 숫자의 키-밸류를 포함하는 딕셔너리 변환
.text_to_sequences(sentences) # 텍스트 안의 단어들을 숫자의 시퀀스의 형태로 변환
.pad_sequences(sentences) # 숫자 0을 이용해서 같은 길이의 시퀀스로 변환
- maxlen= # 모든 시퀀스의 최대길이를 설정하여 제한
- dtype= # 출력 시퀀스의 자료형, 가변적 길이의 문자열로 패딩하려면 'object'
- padding= # 'pre':앞쪽에 0 추가(default), 'post':뒤쪽에 0 추가
- truncating= # 'pre':길이가 초과됐을 때 앞쪽을 자름, 'post': 뒤쪽을 자름
- value= # 부동소수점 및 문자열(패딩할 값)
예제
토큰화 및 padding(길이 맞추기)
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.preprocessing.text import Tokenizer
num_words = 100
padding_size = 150
embedding_dim = 300
def tokenize(data, tokenizer, train=False):
if train:
tokenizer = Tokenizer(num_words=num_words)
tokenizer.fit_on_texts(data)
vocab_size = len(tokenizer.word_index) + 1
data_enc = tokenizer.texts_to_sequences(data)
data_enc = pad_sequences(data_enc, maxlen=padding_size)
return tokenizer, vocab_size, data_enc
# 토큰화
tokenizer = Tokenizer()
tokenizer, vocab_size, X_train_enc = tokenize(X_train, tokenizer, train=True)
임베딩 행렬 제작
import gensim.downloader as api
wv = api.load('word2vec-google-news-300')
embedding_matrix = np.zeros((vocab_size, embedding_dim))
def get_vector(word):
"""
해당 word가 word2vec에 있는 단어일 경우 임베딩 벡터를 반환
"""
if word in wv:
return wv[word]
else:
return None
for word, i in tokenizer.word_index.items():
temp = get_vector(word)
if temp is not None:
embedding_matrix[i] = temp
모델 제작
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, GlobalAveragePooling1D
def get_model():
input_ = tf.keras.Input(shape=(padding_size))
x = Embedding(vocab_size, 300,
weights=[embedding_matrix],
input_length=padding_size)(input_)
x = GlobalAveragePooling1D()(x) # 입력되는 행렬의 평균을 구하는 층(단어 벡터의 평균)
output_ = Dense(1, activation='sigmoid')(x)
model = tf.keras.Model(inputs=[input_], outputs=[output_])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics='accuracy')
return model
tf.keras.backend.clear_session() # 메모리에서 모델 완전히 제거 (버그때문?)
model = get_model()
model.fit(X_train_enc, y_train, batch_size=64, epochs=10, validation_split=0.2)