Tokenizer 자연어처리

정현준·2022년 11월 17일
0
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)

0개의 댓글