import json import tensorflow as tf import numpy as np import urllib from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences
# DO NOT CHANGE THIS CODE OR THE TESTS MAY NOT WORK vocab_size = 1000 embedding_dim = 16 max_length = 120 trunc_type='post' padding_type='post' oov_tok = "<OOV>" training_size = 20000
sentences = [] labels = [] # YOUR CODE HERE
model = tf.keras.Sequential([ # YOUR CODE HERE. KEEP THIS OUTPUT LAYER INTACT OR TESTS MAY FAIL tf.keras.layers.Dense(1, activation='sigmoid') ]) return model
# Note that you'll need to save your model as a .h5 like this # This .h5 will be uploaded to the testing infrastructure # and a score will be returned to you if __name__ == '__main__': model = solution_model() model.save("mymodel.h5")
2. 데이터 가공
: sarcasm 학습데이터는 json 포맷이다. 받아온 sarcasm.json 파일을 로드해와 sentences와 labels로 나눈다.
# sarcasm 데이터 다운로드 urllib.request.urlretrieve('https://storage.googleapis.com/download.tensorflow.org/data/sarcasm.json', 'sarcasm.json')
withopen('sarcasm.json') as file: data = json.load(file)
# 데이터를 sentence와 label로 나눈다. dataset = [] for elem in data: sentences.append(elem['headline']) labels.append(elem['is_sarcastic']) # 훈련 데이터와 테스트 데이터로 분류 training_size = int(len(data)*0.2) train_sentences = sentences[:training_size] train_labels = labels[:training_size] validation_sentences = sentences[training_size:] validation_labels = labels[training_size:]
import re from lxml import etree import urllib.request import zipfile from nltk.tokenize import word_tokenize, sent_tokenize from gensim.models import Word2Vec import nltk
nltk.download('punkt')
# 데이터 다운로드 urllib.request.urlretrieve("https://wit3.fbk.eu/get.php?path=XML_releases/xml/ted_en-20160408.zip&filename=ted_en-20160408.zip", filename="ted_en-20160408.zip")
# xml 파일로부터 <content>와 </content> 사이의 내용만 가져온다. with zipfile.ZipFile('ted_en-20160408.zip', 'r') as z: target_text = etree.parse(z.open('ted_en-20160408.xml', 'r')) parse_text = '\n'.join(target_text.xpath('//content/text()'))
# 정규 표현식의 sub 모듈을 통해 content 중간에 등장하는 (Audio), (Laughter) 등의 배경음 부분을 제거. # 해당 코드는 괄호로 구성된 내용을 제거. content_text = re.sub(r'\([^)]*\)', '', parse_text)
# 입력 코퍼스에 대해서 NLTK를 이용하여 문장 토큰화를 수행. sent_text=sent_tokenize(content_text)
# 각 문장에 대해서 구두점을 제거하고, 대문자를 소문자로 변환. normalized_text = [] for string in sent_text: tokens = re.sub(r"[^a-z0-9]+", " ", string.lower()) normalized_text.append(tokens)
# 각 문장에 대해서 NLTK를 이용하여 단어 토큰화를 수행. result = [word_tokenize(sentence) for sentence in normalized_text]
model = Word2Vec(sentences=result, size=16, window=5, min_count=5, workers=4, sg=0) model.wv.save_word2vec_format('eng_w2v') # 워드 임베딩 저장
trainable=True 로 두면 생성한 embedding matrix를 초기 임베딩 레이어 값으로 사용하되, 모델 학습에 따라서 값을 다시 학습한다. 원래대로라면 이미 만들어진 임베딩 매트릭스 값을 학습하지 않는것이 맞겠지만, 내 경우 TED로 생성한 embedding table이 당연하게도 엄청 좋지는 않아서… 그냥 모델이랑 같이 학습을 시켜주는게 더 효과가 좋았다.