├── data ├── conversation_data │ ├── __init__.py │ ├── origin │ │ └── __init__.py │ └── processed │ │ └── __init__.py ├── sample_messanger.txt └── sample_data.txt ├── requirements.txt ├── images ├── meena_architecture.png └── meena_pretrain_losses.png ├── logs └── eval_log.txt ├── common ├── arg.py ├── line_graph.py ├── generate.py ├── preprocess.py └── dataset.py ├── config ├── meena-config-small.json ├── meena-config.json ├── meena-finetuning-config-v3.json └── meena-finetuning-config.json ├── example ├── streamlit_chat.py ├── model_summary.py └── chat.py ├── model ├── util.py ├── meena.py └── transformer.py ├── README.md └── train ├── run_finetuning.py └── run_pretraining.py /data/conversation_data/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/conversation_data/origin/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /data/conversation_data/processed/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | torch 2 | transformers 3 | fairseq 4 | apex 5 | streamlit 6 | torchinfo -------------------------------------------------------------------------------- /images/meena_architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nawnoes/pytorch-meena/HEAD/images/meena_architecture.png -------------------------------------------------------------------------------- /images/meena_pretrain_losses.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/nawnoes/pytorch-meena/HEAD/images/meena_pretrain_losses.png -------------------------------------------------------------------------------- /logs/eval_log.txt: -------------------------------------------------------------------------------- 1 | 2021-11-29 00:04:25.888240 | Step: 244752 | Eval Loss: 2.404416812163053 | Perplexity: 11.65835942295386 2 | 2021-12-03 09:08:34.156683 | Step: 244752 | Eval Loss: 2.3621913817035693 | Perplexity: 11.167123869112794 3 | 2021-12-07 18:21:33.774223 | Step: 244752 | Eval Loss: 2.3400771625341417 | Perplexity: 10.926374201652774 4 | 2021-12-12 04:00:44.135243 | Step: 244752 | Eval Loss: 2.3263206558148672 | Perplexity: 10.77570709134895 -------------------------------------------------------------------------------- /common/arg.py: -------------------------------------------------------------------------------- 1 | import json 2 | 3 | class Arg: 4 | def __init__(self, **entries): 5 | self.__dict__.update(entries) 6 | 7 | class ModelConfig: 8 | def __init__(self, config_path): 9 | self.config_path = config_path 10 | f = open(self.config_path, 'r') 11 | self.config_json = json.load(f) 12 | self.arg = Arg(**self.config_json) 13 | 14 | def get_config(self): 15 | return self.arg 16 | 17 | if __name__=='__main__': 18 | configs = ModelConfig().get_config() 19 | print(configs) 20 | 21 | 22 | -------------------------------------------------------------------------------- /config/meena-config-small.json: -------------------------------------------------------------------------------- 1 | { 2 | "vocab_path" : "../data/vocab-10K.txt", 3 | "data_path" :"../data/tmp/" , 4 | "checkpoint_path" : "../checkpoint", 5 | "model_name": "komeena-small", 6 | "dim": 768, 7 | "encoder_depth": 1, 8 | "decoder_depth": 3, 9 | "n_head": 32, 10 | "max_seq_len" : 128, 11 | "dropout_prob": 0.1, 12 | "batch_size" : 4, 13 | "epochs" : 20, 14 | "log_steps" : 1, 15 | "ckpt_steps" : 100, 16 | "gradient_accumulation_steps": 1, 17 | "fp16": false, 18 | "fp16_opt_level": "O2" 19 | } 20 | -------------------------------------------------------------------------------- /config/meena-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "vocab_path" : "../data/vocab-10K.txt", 3 | "data_path" :"../data/plain/" , 4 | "checkpoint_path" : "../checkpoint", 5 | "cache_path" : "../cache", 6 | "model_name": "komeena-base", 7 | "dim": 2560, 8 | "encoder_depth": 1, 9 | "decoder_depth": 9, 10 | "n_head": 32, 11 | "max_seq_len" : 128, 12 | "dropout_prob": 0.1, 13 | "batch_size" : 4, 14 | "epochs" : 5, 15 | "log_steps" : 1, 16 | "ckpt_steps" : 20000, 17 | "gradient_accumulation_steps": 512, 18 | "fp16": true, 19 | "fp16_opt_level": "O2" 20 | } 21 | -------------------------------------------------------------------------------- /config/meena-finetuning-config-v3.json: -------------------------------------------------------------------------------- 1 | { 2 | "vocab_path" : "../data/vocab-10K.txt", 3 | "data_path" :"../data/finetuning/" , 4 | "checkpoint_path" : "../checkpoint", 5 | "cache_path" : "../cache", 6 | "model_name": "komeena-base-finetuning-v3", 7 | "dim": 2560, 8 | "encoder_depth": 1, 9 | "decoder_depth": 9, 10 | "n_head": 32, 11 | "max_seq_len" : 128, 12 | "dropout_prob": 0.1, 13 | "batch_size" : 4, 14 | "epochs" : 5, 15 | "log_steps" : 1, 16 | "ckpt_steps" : 20000, 17 | "gradient_accumulation_steps": 512, 18 | "fp16": true, 19 | "fp16_opt_level": "O2" 20 | } 21 | -------------------------------------------------------------------------------- /config/meena-finetuning-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "vocab_path" : "../data/vocab-10K.txt", 3 | "data_path" :"../data/finetuning/" , 4 | "checkpoint_path" : "../checkpoint", 5 | "cache_path" : "../cache", 6 | "model_name": "komeena-base-finetuning-v2", 7 | "dim": 2560, 8 | "encoder_depth": 1, 9 | "decoder_depth": 9, 10 | "n_head": 32, 11 | "max_seq_len" : 128, 12 | "dropout_prob": 0.1, 13 | "batch_size" : 4, 14 | "epochs" : 5, 15 | "log_steps" : 1, 16 | "ckpt_steps" : 20000, 17 | "gradient_accumulation_steps": 512, 18 | "fp16": true, 19 | "fp16_opt_level": "O2" 20 | } 21 | -------------------------------------------------------------------------------- /common/line_graph.py: -------------------------------------------------------------------------------- 1 | import matplotlib.pyplot as plt 2 | import json 3 | import numpy as np 4 | import matplotlib.ticker as ticker 5 | 6 | 7 | # 라인그래프 8 | def print_json_line_graph(json_path): 9 | f = open(json_path, 'r') 10 | json_data = json.load(f) 11 | lists = json_data.items() # sorted by key, return a list of tuples 12 | len_total_step = len(lists) 13 | num = 1000 14 | 15 | lists = list(filter(lambda x: int(x[0]) % num==0, lists)) 16 | x, y = zip(*lists) # unpack a list of pairs into two tuples 17 | 18 | plt.plot(x, y, 'r') 19 | plt.xticks(np.arange(0,len_total_step//num+1), labels=map(lambda x: x if x % ((len_total_step//num)*num) ==0 else '',range(0,len_total_step+1,num))) 20 | plt.xlabel('step') 21 | plt.ylabel('loss') 22 | plt.title('Train Losses') 23 | plt.show() 24 | 25 | if __name__=='__main__': 26 | # print_json_line_graph('../logs/komeena-base_train_results.json') 27 | print_json_line_graph('../logs/komeena-base-finetuning_train_results.json') -------------------------------------------------------------------------------- /example/streamlit_chat.py: -------------------------------------------------------------------------------- 1 | import streamlit as st 2 | import random 3 | render_count = 0 4 | def get_random_message()->str: 5 | sample_text=['만나서 반가워', 6 | '안녕', 7 | '오늘 날씨는 어때?',] 8 | return random.choice(sample_text) 9 | 10 | def chat(input_txt:str)->str: 11 | pass 12 | # def on_change_text_input(text): 13 | # st.session_state['chat_input'] = text 14 | # print(st.session_state['chat_input']) 15 | def send_chat(): 16 | chat_input=st.session_state['chat_input'] 17 | print(chat_input) 18 | st.session_state['chat_input'] = 'Changed' 19 | print(st.session_state['chat_input']) 20 | 21 | def get_text_input_container(): 22 | txt_input = st.empty() 23 | txt_input.text_input('text') 24 | 25 | st.session_state['chat_input']='please input txt' 26 | print(f'render_count: {render_count}') 27 | render_count += 1 28 | # Header 29 | st.subheader('Chat Example') 30 | st.markdown('chat with **pytorch-meena**.') 31 | 32 | 33 | # Chat 34 | st.session_state['contents'] = '안녕하세요\n만나서 반가워요.\n' 35 | chat_area = st.text_area('Chat',st.session_state['contents'],key=1) 36 | 37 | # Text Input 38 | placeholder = st.empty() 39 | input = placeholder.text_input('text1') 40 | send_bttn = st.empty() 41 | click_clear = send_bttn.button('clear text input1') 42 | # print(f'click_cleaner {click_clear}') 43 | if click_clear: 44 | print(input) 45 | st.session_state['contents'] += f"{input}\n" 46 | chat_area = st.text_area('Chat',st.session_state['contents'],key=2) 47 | -------------------------------------------------------------------------------- /example/model_summary.py: -------------------------------------------------------------------------------- 1 | import torch 2 | from model.meena import Meena 3 | from common.arg import ModelConfig 4 | from transformers import BertTokenizer 5 | import pytorch_model_summary as pms 6 | from torchinfo import summary 7 | 8 | def print_pmx(model, *args): 9 | pms.summary(model, *args, print_summary=True) 10 | 11 | def print_torchinfo(model,*args): 12 | summary(model, depth=1, input_data=[*args]) 13 | 14 | base_path = '..' 15 | config_path = f'{base_path}/config/meena-finetuning-config-v3.json' 16 | 17 | # Config 18 | config = ModelConfig(config_path=config_path).get_config() 19 | 20 | # Tokenizer 21 | tokenizer = BertTokenizer(vocab_file=config.vocab_path, do_lower_case=False) 22 | 23 | # Meena Model 24 | model = Meena( 25 | vocab_size=tokenizer.vocab_size, 26 | dim=config.dim, 27 | encoder_depth=config.encoder_depth, 28 | decoder_depth=config.decoder_depth, 29 | max_seq_len=config.max_seq_len, 30 | head_num=config.n_head, 31 | dropout=config.dropout_prob) 32 | 33 | # Model Inputs 34 | encoder_input_ids = torch.randint(0,10000,(1,128)) 35 | decoder_input_ids = torch.randint(0,10000,(1,128)) 36 | encoder_input_mask = torch.tensor([True for _ in range(128)]) 37 | 38 | # PMS Summary 39 | # print_pmx(model, encoder_input_ids,decoder_input_ids, encoder_input_mask) 40 | 41 | # torchinfo 42 | print_torchinfo(model, encoder_input_ids,decoder_input_ids, encoder_input_mask) 43 | """ 44 | print in console 45 | ----------------------------------------------------------------------- 46 | Layer (type) Output Shape Param # Tr. Param # 47 | ======================================================================= 48 | MeenaEncoder-1 [1, 128, 2560] 104,604,160 104,604,160 49 | MeenaDecoder-2 [1, 128, 2560] 970,083,840 970,083,840 50 | LayerNorm-3 [1, 128, 2560] 5,120 5,120 51 | Linear-4 [1, 128, 10000] 25,600,000 25,600,000 52 | ======================================================================= 53 | Total params: 1,100,293,120 54 | Trainable params: 1,100,293,120 55 | Non-trainable params: 0 56 | ----------------------------------------------------------------------- 57 | """ -------------------------------------------------------------------------------- /model/util.py: -------------------------------------------------------------------------------- 1 | from functools import reduce 2 | 3 | from torch.nn import ModuleList 4 | import torch.nn.functional as F 5 | from torch.autograd import Variable 6 | 7 | import copy 8 | import math 9 | import torch 10 | import numpy as np 11 | """ 12 | ModuleList는 목록에 하위 모듈을 보관하것 13 | 이때 모듈들은 파이썬 리스트들 처럼 인덱스를 사용할 수 있다. 14 | """ 15 | def clones(module, N): 16 | return ModuleList([copy.deepcopy(module) for i in range(N)]) 17 | 18 | """ 19 | 디코더에서 어텐션 스코어 매트릭스에서 20 | 이후의 값들에 대해 -∞으로 마스킹 처리해주기 위한 함수 21 | (1, size, size)의 마스크를 리턴한다. 22 | """ 23 | def subsequent_mask(size): 24 | "Mask out subsequent positions." 25 | attn_shape = (1, size, size) 26 | subsequent_mask = np.triu(np.ones(attn_shape), k=1).astype('uint8') 27 | return torch.from_numpy(subsequent_mask) == 0 28 | 29 | """ 30 | 디코더 target mask 생성 31 | """ 32 | def make_std_mask(tgt, pad_token_idx = 0): 33 | 'Create a mask to hide padding and future words.' 34 | target_mask = (tgt != pad_token_idx).unsqueeze(-2) 35 | target_mask = target_mask & Variable(subsequent_mask(tgt.size(-1)).type_as(target_mask.data)) 36 | return target_mask.squeeze() 37 | 38 | def log(t, eps=1e-9): 39 | return torch.log(t + eps) 40 | 41 | def gumbel_noise(t): 42 | noise = torch.zeros_like(t).uniform_(0, 1) 43 | return -log(-log(noise)) 44 | 45 | def gumbel_sample(t, temperature = 1.): 46 | return ((t / temperature) + gumbel_noise(t)).argmax(dim=-1) 47 | 48 | def prob_mask_like(t, prob): 49 | return torch.zeros_like(t).float().uniform_(0, 1) < prob 50 | 51 | def mask_with_tokens(t, token_ids): 52 | init_no_mask = torch.full_like(t, False, dtype=torch.bool) 53 | mask = reduce(lambda acc, el: acc | (t == el), token_ids, init_no_mask) 54 | return mask 55 | 56 | def get_mask_subset_with_prob(mask, prob): 57 | batch, seq_len, device = *mask.shape, mask.device 58 | max_masked = math.ceil(prob * seq_len) 59 | 60 | num_tokens = mask.sum(dim=-1, keepdim=True) 61 | mask_excess = (mask.cumsum(dim=-1) > (num_tokens * prob).ceil()) 62 | mask_excess = mask_excess[:, :max_masked] 63 | 64 | rand = torch.rand((batch, seq_len), device=device).masked_fill(~mask, -1e9) 65 | _, sampled_indices = rand.topk(max_masked, dim=-1) 66 | sampled_indices = (sampled_indices + 1).masked_fill_(mask_excess, 0) 67 | 68 | new_mask = torch.zeros((batch, seq_len + 1), device=device) 69 | new_mask.scatter_(-1, sampled_indices, 1) 70 | return new_mask[:, 1:].bool() 71 | 72 | def temperature_sampling(logits, temperature): 73 | if temperature is None or temperature == 0.0: 74 | return torch.argmax(logits) 75 | probs = F.softmax(logits / temperature) 76 | pred_ids = probs.cpu().multinomial(probs.size()[1], replacement=False) 77 | return pred_ids -------------------------------------------------------------------------------- /common/generate.py: -------------------------------------------------------------------------------- 1 | import random 2 | import torch 3 | import torch.nn.functional as F 4 | 5 | import random 6 | import torch 7 | import torch.nn.functional as F 8 | 9 | 10 | def random_sampling(predict, vocab, k=1024): 11 | # k개 중 랜덤으로 선택된 값을 반환. 사실상 top_k와 같은 기 12 | gen = [] 13 | 14 | probs, indexs = torch.topk(predict, k=k, dim=-1) 15 | probs = probs.squeeze().tolist()[-1] 16 | indexs = indexs.squeeze().tolist()[-1] 17 | 18 | for i in range(len(indexs)): 19 | gen.append((vocab.to_tokens(indexs[i]), probs[i])) 20 | # print('topk word and value: ', gen) 21 | 22 | rand_num = random.randint(0, k - 1) 23 | gen_word = vocab.to_tokens(indexs[rand_num]) 24 | 25 | return gen_word 26 | 27 | 28 | def top_p(logits, threshold=0.9, temperature=0.88, is_uniform_sample=False): 29 | tmp_logits = logits/temperature 30 | sorted_logits, sorted_indices = torch.sort(tmp_logits, descending=True) 31 | indexs = sorted_indices.tolist() 32 | 33 | sorted_softmax_logits = torch.softmax(sorted_logits, dim=-1) 34 | cum_probs = torch.cumsum(sorted_softmax_logits, dim=-1) 35 | 36 | sorted_indices_to_remove = cum_probs > threshold 37 | top_p_index = 0 38 | 39 | # Top-p에 해당하는 index를 획득 40 | for i in range(len(sorted_indices_to_remove)): 41 | if sorted_indices_to_remove[i] == True: 42 | top_p_index = 0 if i == 0 else i - 1 43 | break 44 | 45 | if is_uniform_sample: 46 | # uniform sampling 47 | sampled_index = random.randint(0, top_p_index - 1) 48 | else: 49 | # sampling by probability 50 | # 확률에 따라 샘플링 된 인덱스를 반환 51 | sampled_index = torch.multinomial(sorted_softmax_logits, 1) 52 | 53 | return indexs[sampled_index] 54 | 55 | 56 | def top_k(predict, k, is_uniform_sample=False): 57 | # topk 중 랜덤으로 선택된 값을 반환. 58 | probs, indexs = torch.topk(predict, k=k, dim=-1) 59 | 60 | if is_uniform_sample: 61 | # uniform sampling 62 | sampled_index = random.randint(0, k - 1) 63 | else: 64 | # sampling by probability 65 | # 확률에 따라 샘플링 된 인덱스를 반환 66 | sampled_index = torch.multinomial(probs, 1) 67 | 68 | return indexs[sampled_index] 69 | 70 | def sample_and_rank(logit, N, temperature=0.88, is_uniform_sample=True): 71 | logit = logit.squeeze() 72 | logit = logit/temperature 73 | softmax_logit = torch.softmax(logit,dim=-1) 74 | 75 | # 1. Sample N independent candidate responses using plain random sampling with Temperature 76 | if is_uniform_sample: 77 | sampled_indice = random.choices([x for x in range(0,len(softmax_logit))],k=N) 78 | else: 79 | sampled_indice = torch.multinomial(softmax_logit, N) 80 | 81 | sampled_values = softmax_logit[sampled_indice] 82 | 83 | # 2. Select candidate response with highest probability 84 | candidate_list = list(zip(sampled_indice, sampled_values)) 85 | max_candidate = max(candidate_list, key=lambda x: x[1]) 86 | 87 | return max_candidate[0] #, max_candidate[1] # return index, score -------------------------------------------------------------------------------- /model/meena.py: -------------------------------------------------------------------------------- 1 | from torch import nn 2 | from model.transformer import PositionalEmbedding, Encoder, Decoder 3 | from torch.nn import CrossEntropyLoss 4 | 5 | 6 | class MeenaEncoder(nn.Module): 7 | def __init__(self, 8 | token_emb, 9 | dim=2560, 10 | encoder_depth=1, 11 | max_seq_len=128, 12 | head_num=32, 13 | dropout=0.1): 14 | super().__init__() 15 | self.token_emb = token_emb 16 | self.position_emb = PositionalEmbedding(dim,max_seq_len) 17 | 18 | self.encoders = nn.ModuleList([Encoder(d_model=dim, head_num=head_num, dropout=dropout) for _ in range(encoder_depth)]) 19 | 20 | def forward(self, input_ids, input_mask): 21 | inputs_embed = self.token_emb(input_ids) 22 | position_embed = self.position_emb(input_ids) 23 | 24 | hidden_states = inputs_embed + position_embed 25 | 26 | for encoder in self.encoders: 27 | hidden_states = encoder(hidden_states, input_mask) 28 | 29 | return hidden_states 30 | 31 | class MeenaDecoder(nn.Module): 32 | def __init__(self, 33 | token_emb, 34 | dim=2560, 35 | decoder_depth=13, 36 | max_seq_len=128, 37 | head_num=32, 38 | dropout=0.1): 39 | super().__init__() 40 | self.token_emb = token_emb 41 | self.position_emb = PositionalEmbedding(dim,max_seq_len) 42 | 43 | self.decoders = nn.ModuleList([Decoder(d_model=dim, head_num=head_num, dropout=dropout) for _ in range(decoder_depth)]) 44 | 45 | def forward(self, input_ids, encoder_hidden_states, encoder_mask): 46 | inputs_embed = self.token_emb(input_ids) 47 | position_embed = self.position_emb(input_ids) 48 | 49 | hidden_states = inputs_embed + position_embed 50 | for decoder in self.decoders: 51 | hidden_states = decoder(hidden_states, encoder_hidden_states, encoder_mask) 52 | 53 | return hidden_states 54 | 55 | class Meena(nn.Module): 56 | def __init__(self, 57 | vocab_size, 58 | dim=2560, 59 | encoder_depth=1, 60 | decoder_depth=13, 61 | max_seq_len=128, 62 | head_num=32, 63 | dropout=0.1): 64 | super(Meena, self).__init__() 65 | 66 | # Embedding 67 | self.token_emb = nn.Embedding(vocab_size, dim) 68 | 69 | # Meena Model 70 | self.meena_encoder = MeenaEncoder(self.token_emb,dim,encoder_depth,max_seq_len,head_num,dropout) 71 | self.meena_decoder = MeenaDecoder(self.token_emb,dim,decoder_depth,max_seq_len,head_num,dropout) 72 | 73 | # LM Head 74 | self.norm = nn.LayerNorm(dim) 75 | self.lm_head = nn.Linear(dim, vocab_size, bias=False) 76 | 77 | def forward(self, encoder_input_ids, decoder_input_ids, encoder_input_mask, labels=None): 78 | encoder_hidden_state = self.meena_encoder(encoder_input_ids, encoder_input_mask) 79 | decoder_logit = self.meena_decoder(decoder_input_ids, encoder_hidden_state, encoder_input_mask) 80 | 81 | lm_logits = self.lm_head(self.norm(decoder_logit)) 82 | 83 | loss = None 84 | if labels is not None: 85 | # Shift so that tokens < n predict n 86 | shift_logits = lm_logits[..., :-1, :].contiguous() 87 | shift_labels = labels[..., 1:].contiguous() 88 | 89 | # Flatten the tokens 90 | loss_fct = CrossEntropyLoss(ignore_index=0) 91 | loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)) 92 | 93 | return lm_logits, loss 94 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Meena 2 | Implementation of Meena for open domain conversation using pytorch. 3 | The model in this repository use vanilla Transformer seq2seq model (not Evolved Transformer). The model consists of 1 encoder and 9 decoder. 4 | 5 | ## Model 6 | Transformer seq2seq model. 7 | ![](./images/meena_architecture.png) 8 | 9 | ### Model Summary 10 | - Total Prameters: **1.1B**(1,100,293,120) 11 | ``` 12 | ----------------------------------------------------------------------- 13 | Layer (type) Output Shape Param # Tr. Param # 14 | ======================================================================= 15 | MeenaEncoder-1 [1, 128, 2560] 104,604,160 104,604,160 16 | MeenaDecoder-2 [1, 128, 2560] 970,083,840 970,083,840 17 | LayerNorm-3 [1, 128, 2560] 5,120 5,120 18 | Linear-4 [1, 128, 10000] 25,600,000 25,600,000 19 | ======================================================================= 20 | Total params: 1,100,293,120 21 | Trainable params: 1,100,293,120 22 | Non-trainable params: 0 23 | ----------------------------------------------------------------------- 24 | ``` 25 | 26 | 27 | ## Vocab 28 | This repository use **10K Wordpiece BPE**. 29 | > Original Meena use sentencepiece library. Meena team use a vocabulary of 8K BPE because they found in early experiments to be sufficient for generating specific response. 30 | 31 | 32 | ## Data 33 | **Pretraining Data** 34 | - 34GB Korean corpus data 35 | 36 | **Test Pretrainig Data** 37 | - Kowiki(634MB) + Messanger data(63MB) 38 | 39 | **Conversation Data** 40 | - Korean SNS data (500MB) 41 | 42 | ## Pretraining 43 | Pretrained on 34GB Korean corpus data. 44 | ### Train Loss 45 | - epoch: 1 46 | - step: 2250000 47 | 48 | ![](./images/meena_pretrain_losses.png) 49 | 50 | ### Evaluation 51 | - Total eval loss: 2.2944 52 | - Total eval perplexity: 10.4958 53 | 54 | ```sh 55 | 2021-09-02 16:49:49.942686 | Step: 1557220 | Eval Loss: 2.294469305341254 | Perplexity: 10.495867182863075 56 | ``` 57 | 58 | ## Fine-tuning 59 | Fine-tuned on 500MB Korean SNS data 60 | 61 | **Evaluation** 62 | 63 | | epoch | loss | Perplexity | 64 | |:-------:|--------|------------| 65 | | 1 | 2.40 | 11.65 | 66 | | 2 | 2.36 | 11.16 | 67 | | 3 | 2.34 | 10.92 | 68 | | 4 | 2.32 | 10.77 | 69 | 70 | 71 | 72 | ## Checkpoint 73 | ### 1. Pretrained Meena 74 | - it's preparing 75 | ### 2. Fine-tuned Meena 76 | - it's preparing 77 | 78 | ## Device 79 | - V100, 16G Memory 80 | - Cuda 10.1, Driver 418.67 81 | 82 | ## Chat Example 83 | - Top-p sampling (threshold=0.9, min_len=15, temperature = 0.9) 84 | ### example 1 85 | ``` 86 | #### Example 87 | Meena에게 말을 건네세요:  88 | User : 오늘은 날이 좋아서 밖에 나가고 싶다 89 | Meena: 90 |  ㅋㅋㅋㅋㅋㅋㅋㅋ 91 |  기운내라 ㅋㅋㅋ 92 | User : 너는 뭐하고 있니 93 | Meena: 94 |  유튜브보고있어 95 |  지금 96 |  티비보면서 97 | User : 티비도 보고 유튜브도 보다니 대단하네 98 | Meena: 99 |  어 구독자 100 |  천만은 못 넘네 101 |  삼성화재 - 케티 간 거라 헷갈린다.. 102 | User : 지금 몇시야? 103 | Meena: 104 |  지금 105 |  < 사진 > 106 |  이거 하고이쓰게 107 |  < 이름 > 안뇽 108 | ``` 109 | ### example 2 110 | ``` 111 | Meena에게 말을 건네세요:  112 | User : 나 최근에 제주도로 여행 갔다 왔는데 좋더라 113 | Meena: 114 |  아 난 좋아 115 |  일단은 시골 의사이신 분들 만나는 거 재밌었음 116 |  나도 그것도 꽂혀서 117 |  간거같음 118 | User : 시골 의사 분들이랑 만나면 뭘하는데? 119 | Meena: 120 |  집에서 쉬고 싶어 121 |  이제 막 시작해서... 122 | User : 그래그래.. 요즘 여행 갈만한데 없나 123 | Meena: 124 |  항공권이 지금 40만원대야요 ㅈㅁㅌ 125 | User : 어우 돈 꽤나 많이 들겠네 126 | Meena: 127 |  근데 사실 나는 강도가 약해서 128 |  토할거같아 129 | ``` 130 | 131 | ### example 3 132 | ``` 133 | Meena에게 말을 건네세요:  134 | User : 요즘 친구한테 안좋은 일이 있대 135 | Meena: 136 |  어떤? 137 |  입대에 대한? 138 |  어제도 말하고? 139 | User : 군대 말고 여자친구랑 안좋은가봐 140 | Meena: 141 |  군대ㅋㅋㅋ아냐 142 |  좋기는한거갘은데 143 |  흠 144 |  동시에 깊이 생각못할듯 145 | User : 어떻게 위로해주는게 좋으려나? 146 | Meena: 147 |  우선 시작을 해봐야할것 같아 부족할것 같아서 148 | ``` 149 | -------------------------------------------------------------------------------- /common/preprocess.py: -------------------------------------------------------------------------------- 1 | # import pandas as pd 2 | import os 3 | import json 4 | import re 5 | from tqdm import tqdm 6 | 7 | def add_turn_info(origin_path, processed_path): 8 | file_name = 'wellness.txt' 9 | 10 | f = open(f'{origin_path}/{file_name}','r',encoding='utf-8') 11 | w_f = open(f'{processed_path}/{file_name}','w',encoding='utf-8') 12 | 13 | count =0 14 | while True: 15 | line = f.readline() 16 | if not line: break 17 | if line == '\n': 18 | count=0 19 | w_f.write('\n') 20 | else: 21 | if count % 2 ==0: 22 | w_f.write(f'A: {line}') 23 | else: 24 | w_f.write(f'B: {line}') 25 | count +=1 26 | 27 | f.close() 28 | w_f.close() 29 | 30 | def csv2txt_emotional_conversation_data(origin_path, processed_path): 31 | file_name = 'emotional_conversation' 32 | df = pd.read_csv(f'{origin_path}/{file_name}.csv') 33 | 34 | w_f = open(f'{processed_path}/{file_name}.txt', 'w', encoding='utf-8') 35 | for i, row in df.iterrows(): 36 | # for row in df.itertuples(index=False): 37 | for i, item in row.items(): 38 | if not pd.isna(item): 39 | if i == '상황키워드': 40 | w_f.write(item + '\n') 41 | elif i not in ['번호', '연령', '성별', '신체질환', '감정_소분류', '감정_대분류']: 42 | if '사람문장' in i: 43 | w_f.write('A: ' + item + '\n') 44 | elif '시스템응답' in i: 45 | w_f.write('B: ' + item + '\n') 46 | w_f.write('\n') 47 | w_f.close() 48 | 49 | def sns_conversation_data(file_path): 50 | return_data = [] 51 | participants = { 52 | "P01":"A", 53 | "P02":"B", 54 | "P03":"C", 55 | "P04":"D", 56 | "P05":"E", 57 | "P06":"F", 58 | "P07":"G", 59 | "P08":"H", 60 | "P09": "I", 61 | "P10": "J", 62 | 63 | } 64 | with open(file_path,"r",encoding='utf-8') as json_file: 65 | json_data = json.load(json_file,strict=False) 66 | 67 | # print(json_data) 68 | converstions = json_data["data"] 69 | 70 | for conv in converstions: 71 | header = conv["header"]["dialogueInfo"] 72 | meta = f"{header['type']} {header['topic']}" 73 | return_data.append(meta) 74 | body = conv['body'] 75 | for b in body: 76 | return_data.append(f'{participants[b["participantID"]]}: {b["utterance"]}') 77 | 78 | return_data.append("") 79 | 80 | return return_data 81 | 82 | def run_preprocess_sns_data(dir_path= '/Volumes/T7 Touch/NLP Data/korean_sns'): 83 | origin_path = f'{dir_path}/origin' 84 | processed_path = f'{dir_path}/processed' 85 | 86 | file_list = os.listdir(origin_path) 87 | w_f = open(f'{processed_path}/korean_sns.txt','w',encoding='utf-8') 88 | 89 | for file in file_list: 90 | print(f'process {origin_path}/{file}') 91 | datas = sns_conversation_data(f'{origin_path}/{file}') 92 | for data in datas: 93 | w_f.write(data+'\n') 94 | # w_f.write('\n') 95 | 96 | w_f.close() 97 | 98 | def find_system_token(file_path = "../data/plain/korean_sns.txt"): 99 | system_token = set([]) 100 | pattern = re.compile("#@[ㄱ-ㅎ|가-힣]*#[ㄱ-ㅎ|가-힣]*#|#@[ㄱ-ㅎ|가-힣]*#") 101 | file = open(file_path,'r') 102 | total_line_num = get_num_lines(file_path) 103 | for line in tqdm(file, total=total_line_num): 104 | results = pattern.findall(line) 105 | set_results = set(results) 106 | diff_set = set_results - system_token 107 | if len(diff_set) > 0: 108 | for item in diff_set: 109 | system_token.add(item) 110 | return system_token 111 | 112 | import json 113 | def replace_system_token(file_path = "../data/plain/korean_sns.txt"): 114 | replace_file_path = '../data/system_token.json' 115 | json_file = open(replace_file_path,'r') 116 | system_token = json.load(json_file) 117 | 118 | data_file = open(file_path,'r') 119 | out_file = open('../data/finetuning/korean_sns_v2.txt', 'w') 120 | 121 | pattern = re.compile("#@[ㄱ-ㅎ|가-힣|A-Z|a-z]*#[ㄱ-ㅎ|가-힣]*#|#@[ㄱ-ㅎ|가-힣|A-Z|a-z]*#") 122 | 123 | total_line_num = get_num_lines(file_path) 124 | for line in tqdm(data_file, total=total_line_num): 125 | re_result = pattern.findall(line) 126 | for item in re_result: 127 | if item in system_token.keys(): 128 | line=line.replace(item,system_token[item]) 129 | out_file.write(line) 130 | 131 | data_file.close() 132 | json_file.close() 133 | out_file.close() 134 | 135 | 136 | 137 | 138 | 139 | import mmap 140 | 141 | def get_num_lines(file_path): 142 | fp = open(file_path, "r+") 143 | buf = mmap.mmap(fp.fileno(), 0) 144 | lines = 0 145 | while buf.readline(): 146 | lines += 1 147 | return lines 148 | 149 | 150 | if __name__=='__main__': 151 | data_path = '/Volumes/T7 Touch/NLP Data/korean_sns/origin/미용과건강.json' 152 | 153 | # data = sns_conversation_data(data_path) 154 | # run_preprocess_sns_data() 155 | # print(data) 156 | # a= find_system_token() 157 | # print(a) 158 | replace_system_token() 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | -------------------------------------------------------------------------------- /model/transformer.py: -------------------------------------------------------------------------------- 1 | import math 2 | import torch 3 | import torch.nn as nn 4 | import torch.nn.functional as F 5 | 6 | def self_attention(query, key, value, mask=None, causal=False): 7 | key_transpose = torch.transpose(key,-2,-1) # (bath, head_num, d_k, token_) 8 | matmul_result = torch.matmul(query,key_transpose) # MatMul(Q,K) 9 | d_k = query.size()[-1] 10 | attention_score = matmul_result/math.sqrt(d_k) # Scale 11 | 12 | if mask is not None: 13 | attention_score = attention_score.masked_fill(mask == 0, -1e4) 14 | 15 | if causal: 16 | query_len = query.size()[2] 17 | # causal_mask = torch.tril(torch.ones(query_len, query_len)) 18 | # attention_score = attention_score.masked_fill_(causal_mask == 0, -1e4) 19 | i, j = torch.triu_indices(query_len, query_len, 1) 20 | attention_score[:, :, i, j] = -1e4 21 | 22 | softmax_attention_score = F.softmax(attention_score,dim=-1) # 어텐션 값 23 | result = torch.matmul(softmax_attention_score,value) 24 | 25 | return result, softmax_attention_score 26 | 27 | class MultiHeadAttention(nn.Module): 28 | def __init__(self, head_num =8 , d_model = 512,dropout = 0.1, causal=False): 29 | super(MultiHeadAttention,self).__init__() 30 | 31 | # print(d_model % head_num) 32 | # assert d_model % head_num != 0 # d_model % head_num == 0 이 아닌경우 에러메세지 발생 33 | 34 | self.head_num = head_num 35 | self.d_model = d_model 36 | self.d_k = self.d_v = d_model // head_num 37 | self.causal = causal 38 | 39 | self.w_q = nn.Linear(d_model,d_model) 40 | self.w_k = nn.Linear(d_model,d_model) 41 | self.w_v = nn.Linear(d_model,d_model) 42 | self.w_o = nn.Linear(d_model,d_model) 43 | 44 | self.self_attention = self_attention 45 | self.dropout = nn.Dropout(p=dropout) 46 | 47 | def forward(self, query, key, value, mask = None): 48 | if mask is not None: 49 | mask = mask.unsqueeze(1) 50 | 51 | batche_num = query.size(0) 52 | 53 | query = self.w_q(query).view(batche_num, -1, self.head_num, self.d_k).transpose(1, 2) 54 | key = self.w_k(key).view(batche_num, -1, self.head_num, self.d_k).transpose(1, 2) 55 | value = self.w_v(value).view(batche_num, -1, self.head_num, self.d_k).transpose(1, 2) 56 | 57 | attention_result, attention_score = self.self_attention(query, key, value, mask, self.causal) 58 | 59 | attention_result = attention_result.transpose(1,2).contiguous().view(batche_num, -1, self.head_num * self.d_k) 60 | 61 | 62 | return self.w_o(attention_result) 63 | 64 | class FeedForward(nn.Module): 65 | def __init__(self,d_model, dropout = 0.1): 66 | super(FeedForward,self).__init__() 67 | self.w_1 = nn.Linear(d_model, d_model*4) 68 | self.w_2 = nn.Linear(d_model*4, d_model) 69 | self.dropout = nn.Dropout(p=dropout) 70 | 71 | def forward(self, x): 72 | return self.w_2(self.dropout(F.relu(self.w_1(x)))) 73 | 74 | class LayerNorm(nn.Module): 75 | def __init__(self, features, eps=1e-6): 76 | super(LayerNorm,self).__init__() 77 | self.a_2 = nn.Parameter(torch.ones(features)) 78 | self.b_2 = nn.Parameter(torch.zeros(features)) 79 | self.eps = eps 80 | def forward(self, x): 81 | mean = x.mean(-1, keepdim =True) # 평균 82 | std = x.std(-1, keepdim=True) # 표준편차 83 | 84 | return self.a_2 * (x-mean)/ (std + self.eps) + self.b_2 85 | 86 | class ResidualConnection(nn.Module): 87 | def __init__(self, size, dropout): 88 | super(ResidualConnection,self).__init__() 89 | self.norm = LayerNorm(size) 90 | self.dropout = nn.Dropout(dropout) 91 | 92 | def forward(self, x, sublayer): 93 | return x + self.dropout((sublayer(self.norm(x)))) 94 | 95 | class Encoder(nn.Module): 96 | def __init__(self, d_model, head_num, dropout): 97 | super(Encoder,self).__init__() 98 | self.multi_head_attention = MultiHeadAttention(d_model= d_model, head_num= head_num) 99 | self.residual_1 = ResidualConnection(d_model,dropout=dropout) 100 | 101 | self.feed_forward = FeedForward(d_model) 102 | self.residual_2 = ResidualConnection(d_model,dropout=dropout) 103 | 104 | def forward(self, input, mask): 105 | x = self.residual_1(input, lambda x: self.multi_head_attention(x, x, x, mask)) 106 | x = self.residual_2(x, lambda x: self.feed_forward(x)) 107 | return x 108 | 109 | class Decoder(nn.Module): 110 | def __init__(self, d_model,head_num, dropout): 111 | super(Decoder,self).__init__() 112 | self.masked_multi_head_attention = MultiHeadAttention(d_model= d_model, head_num= head_num, causal=True) 113 | self.residual_1 = ResidualConnection(d_model,dropout=dropout) 114 | 115 | self.encoder_decoder_attention = MultiHeadAttention(d_model=d_model, head_num=head_num) 116 | self.residual_2 = ResidualConnection(d_model, dropout=dropout) 117 | 118 | self.feed_forward = FeedForward(d_model) 119 | self.residual_3 = ResidualConnection(d_model, dropout=dropout) 120 | 121 | 122 | def forward(self, target, encoder_output= None, encoder_mask =None): 123 | x = self.residual_1(target, lambda x: self.masked_multi_head_attention(x, x, x)) 124 | if encoder_output is not None and encoder_mask is not None: 125 | x = self.residual_2(x, lambda x: self.encoder_decoder_attention(x, encoder_output, encoder_output, encoder_mask)) 126 | x = self.residual_3(x, lambda x: self.feed_forward(x)) 127 | 128 | return x 129 | 130 | class Embeddings(nn.Module): 131 | def __init__(self, vocab_num, d_model): 132 | super(Embeddings,self).__init__() 133 | self.emb = nn.Embedding(vocab_num,d_model) 134 | self.d_model = d_model 135 | def forward(self, x): 136 | return self.emb(x) * math.sqrt(self.d_model) 137 | 138 | class PositionalEmbedding(nn.Module): 139 | def __init__(self, dim, max_seq_len): 140 | super().__init__() 141 | self.embedding = nn.Embedding(max_seq_len, dim) 142 | 143 | def forward(self, x): 144 | t = torch.arange(x.shape[1], device=x.device) 145 | return self.embedding(t) 146 | 147 | if __name__=="__main__": 148 | pass 149 | -------------------------------------------------------------------------------- /example/chat.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | warnings.filterwarnings("ignore") 3 | 4 | import torch 5 | from common.arg import ModelConfig 6 | from model.meena import Meena 7 | from transformers import BertTokenizer 8 | from common.generate import top_p, top_k,sample_and_rank 9 | import time 10 | 11 | 12 | def get_encoder_input(tokenizer:BertTokenizer, input_str:list, config: ModelConfig): 13 | encoder_input = torch.tensor(tokenizer.encode(input_str, 14 | add_special_tokens=False, 15 | pad_to_max_length=True, 16 | max_length=config.max_seq_len, 17 | return_tensors='pt', 18 | truncation=True)) 19 | encoder_input_mask = encoder_input !=0 20 | return encoder_input, encoder_input_mask 21 | 22 | def get_decoder_input(tokenizer:BertTokenizer, input_str:list, config: ModelConfig): 23 | decoder_input = torch.tensor(tokenizer.encode(input_str, 24 | add_special_tokens=False, 25 | max_length=config.max_seq_len, 26 | return_tensors='pt', 27 | truncation=True)) 28 | return decoder_input 29 | 30 | def get_next_token(logit, func, **args): 31 | next_token_ebedd = logit.squeeze()[-1] 32 | sampled_word = func(next_token_ebedd, **args) 33 | 34 | return sampled_word 35 | 36 | def remove_pad_token(tokenizer:BertTokenizer, input_ids: torch.Tensor): 37 | pad_token_mask = input_ids != tokenizer.pad_token_id 38 | removed_pad_input_ids = input_ids[pad_token_mask] 39 | return removed_pad_input_ids.tolist() 40 | 41 | def make_new_source_input(tokenizer:BertTokenizer, target_input_ids: torch.Tensor, source_input_ids:torch.Tensor): 42 | list_target_input_ids = target_input_ids.tolist()[0] 43 | list_target_input_ids.append(tokenizer.sep_token_id) 44 | 45 | source_input_ids = remove_pad_token(tokenizer, source_input_ids[0]) 46 | source_input_ids = source_input_ids + list_target_input_ids[1:] 47 | if source_input_ids[-127:][0] == tokenizer.cls_token_id: 48 | source_input_ids = source_input_ids[-127:] 49 | else: 50 | source_input_ids = [tokenizer.cls_token_id] + source_input_ids[-127:] 51 | 52 | source_input_str = tokenizer.decode(source_input_ids, clean_up_tokenization_spaces=True) 53 | 54 | return torch.tensor(source_input_ids), source_input_str 55 | 56 | def print_output(out_ids, tokenizer:BertTokenizer): 57 | out_str = tokenizer.decode(out_ids) 58 | turn = 'B :' 59 | out_str = f'Meena: {out_str[4:]}' 60 | out_list = out_str.split(turn) 61 | 62 | if len(out_list)==1: 63 | print(out_str) 64 | elif len(out_list)>1: 65 | for item in out_list: 66 | print(item) 67 | time.sleep(1.1) 68 | 69 | def main(): 70 | 71 | config_path = '../config/meena-config.json' 72 | checkpoint_path = '../checkpoint/komeena-base-finetuning-v3.pth' 73 | 74 | device = 'cuda' if torch.cuda.is_available() else 'cpu' 75 | config = ModelConfig(config_path).get_config() 76 | 77 | tokenizer = BertTokenizer(config.vocab_path, do_lower_case=False) 78 | 79 | model = Meena(vocab_size=tokenizer.vocab_size, 80 | dim=config.dim, 81 | encoder_depth=config.encoder_depth, 82 | decoder_depth=config.decoder_depth, 83 | max_seq_len=config.max_seq_len, 84 | head_num=config.n_head, 85 | dropout=config.dropout_prob) 86 | 87 | checkpoint = torch.load(checkpoint_path, map_location=device) 88 | model.load_state_dict(checkpoint['model_state_dict']) 89 | del checkpoint 90 | 91 | model.eval() 92 | 93 | # Meta data for conversation 94 | meta_data = '[CLS] ' 95 | 96 | # Start of chat with Meena 97 | target_str = '[CLS] B: ' 98 | print('Meena에게 말을 건네세요: ') 99 | 100 | count = 0 101 | min_len = 15 102 | 103 | while True: 104 | user_query = input('A : ') 105 | user_query = f'A : {user_query}' 106 | 107 | if count == 0: 108 | source_str = meta_data + user_query + ' [SEP] ' 109 | else: 110 | user_query_ids = tokenizer.encode(user_query, add_special_tokens=False, max_length=config.max_seq_len, 111 | truncation=True) 112 | user_query_ids.append(tokenizer.sep_token_id) 113 | user_query_ids = torch.tensor(user_query_ids) 114 | _, source_str = make_new_source_input(tokenizer, user_query_ids.unsqueeze(0), source_input_ids) 115 | source_input_ids, source_input_mask = get_encoder_input(tokenizer=tokenizer, input_str=source_str, 116 | config=config) 117 | target_input_ids = get_decoder_input(tokenizer=tokenizer, input_str=target_str, config=config) 118 | 119 | # Sentence completed normally 120 | is_complete = False 121 | 122 | for _ in range(config.max_seq_len): 123 | logit, _ = model(source_input_ids, target_input_ids, source_input_mask) 124 | sampled_word = get_next_token(logit, top_p) 125 | # sampled_word = get_next_token(logit, sample_and_rank, N=20, temperature=0.88, is_uniform_sample=False) 126 | 127 | if sampled_word == tokenizer.sep_token_id: 128 | if len(target_input_ids[0]) > min_len: 129 | # print(f'{tokenizer.decode(target_input_ids[0], skip_special_tokens=True)}') 130 | print_output(target_input_ids[0],tokenizer) 131 | source_input_ids, source_str = make_new_source_input(tokenizer, target_input_ids, source_input_ids) 132 | target_str = '[CLS] B: ' 133 | is_complete = True 134 | break 135 | else: 136 | addtional_target_str = ' [UNK] B: ' 137 | addtional_target_ids = tokenizer.encode(addtional_target_str, add_special_tokens=False) 138 | 139 | target_input_ids = target_input_ids.tolist() 140 | target_input_ids[0].append(addtional_target_ids[0]) 141 | target_input_ids = torch.tensor(target_input_ids) 142 | 143 | else: 144 | target_input_ids = target_input_ids.tolist() 145 | target_input_ids[0].append(sampled_word) 146 | target_input_ids = torch.tensor(target_input_ids) 147 | 148 | if is_complete == False: 149 | source_input_ids, source_str = make_new_source_input(tokenizer, target_input_ids, source_input_ids) 150 | target_str = '[CLS] B: ' 151 | 152 | count += 1 153 | 154 | 155 | 156 | if __name__=='__main__': 157 | main() 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | -------------------------------------------------------------------------------- /train/run_finetuning.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | warnings.filterwarnings("ignore") 4 | import sys 5 | 6 | sys.path.append('../') 7 | 8 | import torch 9 | 10 | from torch.utils.data import DataLoader, random_split 11 | 12 | from tqdm import tqdm 13 | from transformers import BertTokenizer 14 | from fairseq.optim.adafactor import Adafactor 15 | from apex import amp 16 | 17 | import os 18 | import json 19 | import logging 20 | from datetime import datetime 21 | from model.meena import Meena 22 | from common.arg import ModelConfig 23 | from common.dataset import DatasetForSeq2seqV2, DatasetForSeq2seqConversation 24 | 25 | class MeenaTrainer(object): 26 | def __init__(self, 27 | dataset, 28 | model, 29 | tokenizer, 30 | max_len, 31 | model_name, 32 | checkpoint_path, 33 | device=None, 34 | train_batch_size=8, 35 | eval_batch_size=None, 36 | log_dir='../logs', 37 | fp16=True): 38 | 39 | self.dataset = dataset 40 | self.model = model 41 | self.tokenizer = tokenizer 42 | self.max_len = max_len 43 | self.model_name = model_name 44 | self.checkpoint_path = checkpoint_path 45 | self.device = device 46 | self.n_gpu = torch.cuda.device_count() if torch.cuda.is_available() else 0 47 | self.train_batch_size = train_batch_size 48 | self.eval_batch_size = eval_batch_size 49 | self.log_dir = log_dir 50 | self.fp16 = fp16 51 | 52 | if device is None: 53 | self.device = 'cuda:1' if torch.cuda.is_available() else 'cpu' 54 | 55 | if eval_batch_size is None: 56 | self.eval_batch_size = train_batch_size 57 | 58 | logging.basicConfig(filename=f'{log_dir}/{self.model_name}-{datetime.now().date()}.log', level=logging.INFO) 59 | 60 | def build_dataloaders(self, train_test_split=0.1, train_shuffle=True, eval_shuffle=True): 61 | dataset_len = len(self.dataset) 62 | eval_len = int(dataset_len * train_test_split) 63 | train_len = dataset_len - eval_len 64 | train_dataset, eval_dataset = random_split(self.dataset, (train_len, eval_len)) 65 | train_loader = DataLoader(train_dataset, batch_size=self.train_batch_size, shuffle=train_shuffle) 66 | eval_loader = DataLoader(eval_dataset, batch_size=self.eval_batch_size, shuffle=eval_shuffle) 67 | logging.info(f'''train_dataloader size: {len(train_loader.dataset)} | shuffle: {train_shuffle} 68 | eval_dataloader size: {len(eval_loader.dataset)} | shuffle: {eval_shuffle}''') 69 | 70 | return train_loader, eval_loader 71 | 72 | def train(self, 73 | epochs, 74 | train_dataloader, 75 | eval_dataloader, 76 | optimizer, 77 | log_steps, 78 | ckpt_steps, 79 | gradient_accumulation_steps=1): 80 | losses = {} 81 | global_steps = 0 82 | local_steps = 0 83 | step_loss = 0.0 84 | start_epoch = 0 85 | start_step = 0 86 | step_perplexity = 0.0 87 | 88 | # Logging 89 | logging.info(f'{datetime.now()} | Moved model to: {self.device}') 90 | logging.info( 91 | f'{datetime.now()} | train_batch_size: {self.train_batch_size} | eval_batch_size: {self.eval_batch_size}') 92 | logging.info(f'{datetime.now()} | Epochs: {epochs} | log_steps: {log_steps} | ckpt_steps: {ckpt_steps}') 93 | logging.info(f'{datetime.now()} | gradient_accumulation_steps: {gradient_accumulation_steps}') 94 | 95 | # Train 96 | self.model.zero_grad() # Reset gradients tensors 97 | for epoch in range(start_epoch, epochs): # tqdm(range(epochs), desc='Epochs', position=0): 98 | logging.info(f'{datetime.now()} | Epoch: {epoch}') 99 | pb = tqdm(enumerate(train_dataloader), 100 | desc=f'Epoch-{epoch} Iterator', 101 | total=len(train_dataloader), 102 | bar_format='{l_bar}{bar:10}{r_bar}' 103 | ) 104 | for step, batch in pb: 105 | # if step < start_step: 106 | # continue 107 | encoder_input_ids, decoder_input_ids, encoder_input_mask, labels = batch # _ is input_mask 108 | encoder_input_ids, decoder_input_ids, encoder_input_mask, labels = encoder_input_ids.to(self.device), decoder_input_ids.to(self.device), encoder_input_mask.to(self.device), labels.to(self.device) 109 | output = self.model(encoder_input_ids, decoder_input_ids, encoder_input_mask, labels) # output: lm_logits, loss, encoder_logit, x 110 | 111 | loss = output[1] 112 | 113 | step_perplexity += torch.exp(loss) 114 | origin_loss = loss.item() 115 | 116 | loss = loss / gradient_accumulation_steps # divide loss into gradient accumulation step 117 | if self.fp16: 118 | with amp.scale_loss(loss, optimizer) as scaled_loss: 119 | scaled_loss.backward() 120 | else: 121 | loss.backward() 122 | 123 | step_loss += origin_loss 124 | losses[global_steps] = origin_loss 125 | 126 | local_steps += 1 127 | global_steps += 1 128 | 129 | if global_steps % gradient_accumulation_steps == 0: 130 | if self.fp16: 131 | torch.nn.utils.clip_grad_norm_(amp.master_params(optimizer), max_norm=1.0) 132 | else: 133 | torch.nn.utils.clip_grad_norm_(self.model.parameters(), max_norm=1.0) 134 | 135 | optimizer.step() 136 | self.model.zero_grad() 137 | 138 | if global_steps % log_steps == 0: 139 | pb.set_postfix_str( 140 | f''' Train Loss: {format(step_loss / local_steps, ".4f")} | step_perplexity: {format(step_perplexity/local_steps,".4f")} | Steps: {global_steps}''') 141 | step_loss = 0.0 142 | local_steps = 0 143 | step_perplexity =0.0 144 | 145 | if global_steps % ckpt_steps == 0: 146 | self.save(epoch, self.model, optimizer, losses, global_steps) 147 | logging.info(f'{datetime.now()} | Saved checkpoint to: {self.checkpoint_path}') 148 | with open(f'{self.log_dir}/{self.model_name}_train_results.json', 'w') as results_file: 149 | json.dump(losses, results_file) 150 | results_file.close() 151 | 152 | # Evaluate every epoch 153 | self.evaluate(eval_dataloader) 154 | self.model.train() 155 | start_step = 0 156 | 157 | self.save(epoch, self.model, optimizer, losses, global_steps) 158 | 159 | return self.model 160 | 161 | def evaluate(self, dataloader): 162 | self.model.eval() 163 | 164 | eval_loss = 0.0 165 | perplexity = 0.0 166 | eval_steps = 0 167 | 168 | logging.info(f'{datetime.now()} | Evaluating {self.model_name}') 169 | for step, batch in tqdm(enumerate(dataloader), 170 | desc='Evaluating', 171 | leave=True, 172 | total=len(dataloader), 173 | bar_format='{l_bar}{bar:10}{r_bar}'): 174 | 175 | encoder_input_ids, decoder_input_ids, encoder_input_mask, labels = batch # _ is input_mask 176 | encoder_input_ids, decoder_input_ids, encoder_input_mask, labels = encoder_input_ids.to(self.device), decoder_input_ids.to(self.device), encoder_input_mask.to(self.device), labels.to(self.device) 177 | 178 | with torch.no_grad(): 179 | output = self.model(encoder_input_ids, decoder_input_ids, encoder_input_mask, labels) # output: lm_logits, loss, encoder_logit, x 180 | 181 | tmp_eval_loss = output[1] 182 | tmp_perplexity = torch.exp(tmp_eval_loss) 183 | 184 | if self.n_gpu > 1: 185 | tmp_eval_loss = tmp_eval_loss.mean() 186 | 187 | eval_loss += tmp_eval_loss.item() 188 | perplexity += tmp_perplexity.item() 189 | eval_steps += 1 190 | 191 | total_eval_loss = eval_loss / eval_steps 192 | total_perplexity = perplexity / eval_steps 193 | 194 | logging.info(f'{datetime.now()} | Step: {step} | Eval Loss: {total_eval_loss} | Perplexity: {total_perplexity}') 195 | with open(f'{self.log_dir}/{self.model_name}_eval_results.txt', 'a+') as results_file: 196 | results_file.write(f'{datetime.now()} | Step: {step} | Eval Loss: {total_eval_loss} | Perplexity: {total_perplexity}\n') 197 | results_file.close() 198 | 199 | def save(self, epoch, model, optimizer, losses, train_step): 200 | model.cpu() 201 | torch.save({ 202 | 'epoch': epoch, # 현재 학습 epoch 203 | 'model_state_dict': model.state_dict(), # 모델 저장 204 | 'optimizer_state_dict': optimizer.state_dict(), # 옵티마이저 저장 205 | 'losses': losses, # Loss 저장 206 | 'train_step': train_step, # 현재 진행한 학습 207 | 'amp': amp.state_dict() 208 | }, f'{self.checkpoint_path}/{self.model_name}.pth') 209 | model.cuda() 210 | 211 | def meena_dataset(config, tokenizer, finetune_dataset): 212 | cache_data_path = f'{config.cache_path}/{config.model_name}.pickle' 213 | cache_dir_path= os.path.dirname(cache_data_path) 214 | 215 | if os.path.exists(cache_data_path): # 캐시 데이터가 존재하는 경우 216 | dataset = torch.load(cache_data_path) 217 | return dataset 218 | else: # 캐시 데이터가 없는 경우 219 | if not os.path.exists(cache_dir_path): 220 | os.makedirs(cache_dir_path) # 캐시 디렉토리 경로 생성 221 | 222 | dataset = finetune_dataset(tokenizer, config.max_seq_len, config.data_path,threshold=0.0) 223 | torch.save(dataset, cache_data_path) # 데이터 저장 224 | 225 | return dataset 226 | 227 | 228 | def main(): 229 | torch.manual_seed(9) 230 | torch.cuda.set_device(1) 231 | base_path = '..' 232 | 233 | log_dir = f'{base_path}/logs' 234 | config_path = f'{base_path}/config/meena-finetuning-config-v3.json' 235 | device = 'cuda:1' if torch.cuda.is_available() else 'cpu' 236 | 237 | # Config 238 | config = ModelConfig(config_path=config_path).get_config() 239 | 240 | # Tokenizer 241 | tokenizer = BertTokenizer(vocab_file=config.vocab_path, do_lower_case=False) 242 | 243 | # Dataset 244 | # dataset = DatasetForSeq2seqV2(tokenizer, config.max_seq_len, config.data_path) 245 | dataset = meena_dataset(config,tokenizer, DatasetForSeq2seqConversation) 246 | 247 | # Meena Model 248 | model = Meena( 249 | vocab_size = tokenizer.vocab_size, 250 | dim=config.dim, 251 | encoder_depth=config.encoder_depth, 252 | decoder_depth=config.decoder_depth, 253 | max_seq_len=config.max_seq_len, 254 | head_num=config.n_head, 255 | dropout=config.dropout_prob) 256 | 257 | if torch.cuda.is_available(): 258 | model.cuda(1) 259 | 260 | checkpoint_path = f'{config.checkpoint_path}/{config.model_name}.pth' 261 | checkpoint = torch.load(checkpoint_path, map_location=device) 262 | model.load_state_dict(checkpoint['model_state_dict']) 263 | 264 | del checkpoint 265 | 266 | # optimizer = Adafactor(model.parameters()) 267 | optimizer = Adafactor(model.parameters(), 268 | scale_parameter=False, # (default: True) if True, learning rate is scaled by root mean square of parameter 269 | relative_step=False, # (default: True) if True, time-dependent learning rate is computed 270 | warmup_init=False, # (default: False) time-dependent learning rate computation depends on whether warm-up initialization is being used 271 | lr=5e-5) 272 | # optimizer = AdamW(model.parameters(), lr=3e-4) 273 | 274 | if config.fp16: 275 | model, optimizer = amp.initialize(model, optimizer, opt_level=config.fp16_opt_level) 276 | 277 | # Pretraining Traniner 278 | trainer = MeenaTrainer(dataset, model, tokenizer, 279 | model_name=config.model_name, 280 | max_len=config.max_seq_len, 281 | checkpoint_path=config.checkpoint_path, 282 | train_batch_size=config.batch_size, 283 | eval_batch_size=config.batch_size, 284 | log_dir=log_dir, 285 | fp16=config.fp16 286 | ) 287 | 288 | train_dataloader, eval_dataloader = trainer.build_dataloaders(train_test_split=0.1) 289 | 290 | trainer.train(epochs=config.epochs, 291 | train_dataloader=train_dataloader, 292 | eval_dataloader=eval_dataloader, 293 | optimizer=optimizer, 294 | log_steps=config.log_steps, 295 | ckpt_steps=config.ckpt_steps, 296 | gradient_accumulation_steps=config.gradient_accumulation_steps) 297 | 298 | 299 | if __name__ == '__main__': 300 | main() 301 | -------------------------------------------------------------------------------- /train/run_pretraining.py: -------------------------------------------------------------------------------- 1 | import warnings 2 | 3 | warnings.filterwarnings("ignore") 4 | import sys 5 | 6 | sys.path.append('../') # for local 7 | 8 | import torch 9 | from torch.utils.data import DataLoader, random_split 10 | 11 | from tqdm import tqdm 12 | from transformers import BertTokenizer 13 | from fairseq.optim.adafactor import Adafactor 14 | from apex import amp 15 | 16 | import os 17 | import json 18 | import logging 19 | from datetime import datetime 20 | from model.meena import Meena 21 | from common.arg import ModelConfig 22 | from common.dataset import DatasetForSeq2seqV2 23 | 24 | class MeenaTrainer(object): 25 | def __init__(self, 26 | dataset, 27 | model, 28 | tokenizer, 29 | max_len, 30 | model_name, 31 | checkpoint_path, 32 | device=None, 33 | train_batch_size=8, 34 | eval_batch_size=None, 35 | log_dir='../logs', 36 | fp16=True): 37 | 38 | self.dataset = dataset 39 | self.model = model 40 | self.tokenizer = tokenizer 41 | self.max_len = max_len 42 | self.model_name = model_name 43 | self.checkpoint_path = checkpoint_path 44 | self.device = device 45 | self.n_gpu = torch.cuda.device_count() if torch.cuda.is_available() else 0 46 | self.train_batch_size = train_batch_size 47 | self.eval_batch_size = eval_batch_size 48 | self.log_dir = log_dir 49 | self.fp16 = fp16 50 | 51 | if device is None: 52 | self.device = 'cuda:0' if torch.cuda.is_available() else 'cpu' 53 | 54 | if eval_batch_size is None: 55 | self.eval_batch_size = train_batch_size 56 | 57 | logging.basicConfig(filename=f'{log_dir}/{self.model_name}-{datetime.now().date()}.log', level=logging.INFO) 58 | 59 | def build_dataloaders(self, train_test_split=0.1, train_shuffle=True, eval_shuffle=True): 60 | dataset_len = len(self.dataset) 61 | eval_len = int(dataset_len * train_test_split) 62 | train_len = dataset_len - eval_len 63 | train_dataset, eval_dataset = random_split(self.dataset, (train_len, eval_len)) 64 | train_loader = DataLoader(train_dataset, batch_size=self.train_batch_size, shuffle=train_shuffle) 65 | eval_loader = DataLoader(eval_dataset, batch_size=self.eval_batch_size, shuffle=eval_shuffle) 66 | logging.info(f'''train_dataloader size: {len(train_loader.dataset)} | shuffle: {train_shuffle} 67 | eval_dataloader size: {len(eval_loader.dataset)} | shuffle: {eval_shuffle}''') 68 | 69 | return train_loader, eval_loader 70 | 71 | def train(self, 72 | epochs, 73 | train_dataloader, 74 | eval_dataloader, 75 | optimizer, 76 | log_steps, 77 | ckpt_steps, 78 | gradient_accumulation_steps=1): 79 | losses = {} 80 | global_steps = 0 81 | local_steps = 0 82 | step_loss = 0.0 83 | start_epoch = 0 84 | start_step = 0 85 | step_perplexity = 0.0 86 | 87 | # Load Checkpoint 88 | if os.path.isfile(f'{self.checkpoint_path}/{self.model_name}.pth'): 89 | self.model.cpu() 90 | checkpoint = torch.load(f'{self.checkpoint_path}/{self.model_name}.pth', map_location=self.device) 91 | start_epoch = checkpoint['epoch'] 92 | losses = checkpoint['losses'] 93 | global_steps = checkpoint['train_step'] 94 | start_step = global_steps if start_epoch == 0 else global_steps % len(train_dataloader) 95 | 96 | self.model.load_state_dict(checkpoint['model_state_dict']) 97 | optimizer.load_state_dict(checkpoint['optimizer_state_dict']) 98 | amp.load_state_dict(checkpoint['amp']) 99 | 100 | # remove checkpoint for gpu memory 101 | del checkpoint 102 | 103 | # release unopccupied memory 104 | torch.cuda.empty_cache() 105 | self.model.train() 106 | self.model.to(self.device) 107 | 108 | # Logging 109 | logging.info(f'{datetime.now()} | Moved model to: {self.device}') 110 | logging.info( 111 | f'{datetime.now()} | train_batch_size: {self.train_batch_size} | eval_batch_size: {self.eval_batch_size}') 112 | logging.info(f'{datetime.now()} | Epochs: {epochs} | log_steps: {log_steps} | ckpt_steps: {ckpt_steps}') 113 | logging.info(f'{datetime.now()} | gradient_accumulation_steps: {gradient_accumulation_steps}') 114 | 115 | # Train 116 | self.model.zero_grad() # Reset gradients tensors 117 | for epoch in range(start_epoch, epochs): # tqdm(range(epochs), desc='Epochs', position=0): 118 | logging.info(f'{datetime.now()} | Epoch: {epoch}') 119 | pb = tqdm(enumerate(train_dataloader), 120 | desc=f'Epoch-{epoch} Iterator', 121 | total=len(train_dataloader), 122 | bar_format='{l_bar}{bar:10}{r_bar}' 123 | ) 124 | for step, batch in pb: 125 | # if step < start_step: 126 | # continue 127 | encoder_input_ids, decoder_input_ids, encoder_input_mask, labels = batch # _ is input_mask 128 | encoder_input_ids, decoder_input_ids, encoder_input_mask, labels = encoder_input_ids.to(self.device), decoder_input_ids.to(self.device), encoder_input_mask.to(self.device), labels.to(self.device) 129 | output = self.model(encoder_input_ids, decoder_input_ids, encoder_input_mask, labels) # output: lm_logits, loss, encoder_logit, x 130 | 131 | loss = output[1] 132 | 133 | step_perplexity += torch.exp(loss) 134 | origin_loss = loss.item() 135 | 136 | loss = loss / gradient_accumulation_steps # divide loss into gradient accumulation step 137 | if self.fp16: 138 | with amp.scale_loss(loss, optimizer) as scaled_loss: 139 | scaled_loss.backward() 140 | else: 141 | loss.backward() 142 | 143 | step_loss += origin_loss 144 | losses[global_steps] = origin_loss 145 | 146 | local_steps += 1 147 | global_steps += 1 148 | 149 | if global_steps % gradient_accumulation_steps == 0: 150 | if self.fp16: 151 | torch.nn.utils.clip_grad_norm_(amp.master_params(optimizer), max_norm=1.0) 152 | else: 153 | torch.nn.utils.clip_grad_norm_(self.model.parameters(), max_norm=1.0) 154 | 155 | optimizer.step() 156 | self.model.zero_grad() 157 | 158 | if global_steps % log_steps == 0: 159 | pb.set_postfix_str( 160 | f''' Train Loss: {format(step_loss / local_steps, ".4f")} | step_perplexity: {format(step_perplexity/local_steps,".4f")} | Steps: {global_steps}''') 161 | step_loss = 0.0 162 | local_steps = 0 163 | step_perplexity =0.0 164 | 165 | if global_steps % ckpt_steps == 0: 166 | self.save(epoch, self.model, optimizer, losses, global_steps) 167 | logging.info(f'{datetime.now()} | Saved checkpoint to: {self.checkpoint_path}') 168 | with open(f'{self.log_dir}/{self.model_name}_train_results.json', 'w') as results_file: 169 | json.dump(losses, results_file) 170 | results_file.close() 171 | 172 | # Evaluate every epoch 173 | self.evaluate(eval_dataloader) 174 | self.model.train() 175 | start_step = 0 176 | 177 | self.save(epoch, self.model, optimizer, losses, global_steps) 178 | 179 | return self.model 180 | 181 | def evaluate(self, dataloader): 182 | self.model.eval() 183 | 184 | eval_loss = 0.0 185 | perplexity = 0.0 186 | eval_steps = 0 187 | 188 | logging.info(f'{datetime.now()} | Evaluating {self.model_name}') 189 | for step, batch in tqdm(enumerate(dataloader), 190 | desc='Evaluating', 191 | leave=True, 192 | total=len(dataloader), 193 | bar_format='{l_bar}{bar:10}{r_bar}'): 194 | 195 | encoder_input_ids, decoder_input_ids, encoder_input_mask, labels = batch # _ is input_mask 196 | encoder_input_ids, decoder_input_ids, encoder_input_mask, labels = encoder_input_ids.to(self.device), decoder_input_ids.to(self.device), encoder_input_mask.to(self.device), labels.to(self.device) 197 | 198 | with torch.no_grad(): 199 | output = self.model(encoder_input_ids, decoder_input_ids, encoder_input_mask, labels) # output: lm_logits, loss, encoder_logit, x 200 | 201 | tmp_eval_loss = output[1] 202 | tmp_perplexity = torch.exp(tmp_eval_loss) 203 | 204 | if self.n_gpu > 1: 205 | tmp_eval_loss = tmp_eval_loss.mean() 206 | 207 | eval_loss += tmp_eval_loss.item() 208 | perplexity += tmp_perplexity.item() 209 | eval_steps += 1 210 | 211 | total_eval_loss = eval_loss / eval_steps 212 | total_perplexity = perplexity / eval_steps 213 | 214 | logging.info(f'{datetime.now()} | Step: {step} | Eval Loss: {total_eval_loss} | Perplexity: {total_perplexity}') 215 | with open(f'{self.log_dir}/{self.model_name}_eval_results.txt', 'a+') as results_file: 216 | results_file.write(f'{datetime.now()} | Step: {step} | Eval Loss: {total_eval_loss} | Perplexity: {total_perplexity}\n') 217 | results_file.close() 218 | 219 | def save(self, epoch, model, optimizer, losses, train_step): 220 | model.cpu() 221 | torch.save({ 222 | 'epoch': epoch, # 현재 학습 epoch 223 | 'model_state_dict': model.state_dict(), # 모델 저장 224 | 'optimizer_state_dict': optimizer.state_dict(), # 옵티마이저 저장 225 | 'losses': losses, # Loss 저장 226 | 'train_step': train_step, # 현재 진행한 학습 227 | 'amp': amp.state_dict() 228 | }, f'{self.checkpoint_path}/{self.model_name}.pth') 229 | model.cuda() 230 | 231 | def meena_dataset(config, tokenizer): 232 | cache_data_path = f'{config.cache_path}/{config.model_name}.pickle' 233 | cache_dir_path= os.path.dirname(cache_data_path) 234 | 235 | if os.path.exists(cache_data_path): # 캐시 데이터가 존재하는 경우 236 | dataset = torch.load(cache_data_path) 237 | return dataset 238 | else: # 캐시 데이터가 없는 경우 239 | if not os.path.exists(cache_dir_path): 240 | os.makedirs(cache_dir_path) # 캐시 디렉토리 경로 생성 241 | 242 | dataset = DatasetForSeq2seqV2(tokenizer, config.max_seq_len, config.data_path) 243 | torch.save(dataset, cache_data_path) # 데이터 저장 244 | 245 | return dataset 246 | 247 | 248 | def main(): 249 | torch.manual_seed(9) 250 | base_path = '..' 251 | 252 | log_dir = f'{base_path}/logs' 253 | config_path = f'{base_path}/config/meena-config.json' 254 | 255 | # Config 256 | config = ModelConfig(config_path=config_path).get_config() 257 | 258 | # Tokenizer 259 | tokenizer = BertTokenizer(vocab_file=config.vocab_path, do_lower_case=False) 260 | 261 | # Dataset 262 | dataset = meena_dataset(config,tokenizer) 263 | 264 | # Meena Model 265 | model = Meena( 266 | vocab_size = tokenizer.vocab_size, 267 | dim=config.dim, 268 | encoder_depth=config.encoder_depth, 269 | decoder_depth=config.decoder_depth, 270 | max_seq_len=config.max_seq_len, 271 | head_num=config.n_head, 272 | dropout=config.dropout_prob 273 | ) 274 | if torch.cuda.is_available(): 275 | model.cuda() 276 | 277 | # optimizer = Adafactor(model.parameters()) 278 | optimizer = Adafactor(model.parameters(), scale_parameter=False, relative_step=False, warmup_init=False, lr=3e-4) 279 | # optimizer = AdamW(model.parameters(), lr=3e-4) 280 | 281 | if config.fp16: 282 | model, optimizer = amp.initialize(model, optimizer, opt_level=config.fp16_opt_level) 283 | 284 | # Pretraining Traniner 285 | trainer = MeenaTrainer(dataset, model, tokenizer, 286 | model_name=config.model_name, 287 | max_len=config.max_seq_len, 288 | checkpoint_path=config.checkpoint_path, 289 | train_batch_size=config.batch_size, 290 | eval_batch_size=config.batch_size, 291 | log_dir=log_dir, 292 | fp16=config.fp16 293 | ) 294 | 295 | train_dataloader, eval_dataloader = trainer.build_dataloaders(train_test_split=0.1) 296 | 297 | trainer.train(epochs=config.epochs, 298 | train_dataloader=train_dataloader, 299 | eval_dataloader=eval_dataloader, 300 | optimizer=optimizer, 301 | log_steps=config.log_steps, 302 | ckpt_steps=config.ckpt_steps, 303 | gradient_accumulation_steps=config.gradient_accumulation_steps) 304 | 305 | 306 | if __name__ == '__main__': 307 | main() 308 | -------------------------------------------------------------------------------- /common/dataset.py: -------------------------------------------------------------------------------- 1 | import os 2 | import torch 3 | import logging 4 | import random 5 | from transformers import BertTokenizer 6 | from torch.utils.data import Dataset 7 | from tqdm import tqdm 8 | import copy 9 | from common.arg import ModelConfig 10 | 11 | 12 | class DatasetForSeq2seq(Dataset): 13 | def __init__(self, tokenizer, max_len, dir_path): 14 | logging.info('Start pretraining data for seq2seq load!') 15 | 16 | self.tokenizer = tokenizer 17 | self.max_len = max_len 18 | 19 | self.source = [] 20 | self.target = [] 21 | 22 | # 파일 리스트 23 | file_list = os.listdir(dir_path) 24 | 25 | file_progress_bar = tqdm(file_list, position=0, leave=True, bar_format='{l_bar}{bar:10}{r_bar}') 26 | for file_name in file_progress_bar: 27 | path = f'{dir_path}/{file_name}' 28 | data_file = open(path, 'r', encoding='utf-8') 29 | for line in tqdm(data_file, 30 | desc='Data load for pretraining', 31 | position=1, leave=True): 32 | line = line[:-1] 33 | splited_line = line.split('\t') 34 | 35 | self.source.append(splited_line[0]) 36 | self.target.append(splited_line[1]) 37 | 38 | logging.info('Complete data load') 39 | 40 | def _tokenize_input_ids(self, input_ids: list, add_special_tokens: bool = False, pad_to_max_length: bool = True): 41 | inputs = torch.tensor( 42 | self.tokenizer.encode(input_ids, add_special_tokens=add_special_tokens, max_length=self.max_len, 43 | pad_to_max_length=pad_to_max_length, return_tensors='pt', truncation=True)) 44 | return inputs 45 | 46 | def __len__(self): 47 | return len(self.source) 48 | 49 | def __getitem__(self, idx): 50 | encoder_input_ids = self._tokenize_input_ids(self.source[idx]) 51 | decoder_input_ids = self._tokenize_input_ids(self.target[idx]) 52 | labels = decoder_input_ids.clone() 53 | 54 | encoder_input_ids = encoder_input_ids.squeeze() 55 | decoder_input_ids = decoder_input_ids.squeeze() 56 | labels = labels.squeeze() 57 | encoder_inputs_mask = encoder_input_ids != 0 58 | 59 | return encoder_input_ids, decoder_input_ids, encoder_inputs_mask.unsqueeze(0), labels 60 | 61 | class DatasetForSeq2seqV2(Dataset): 62 | def __init__(self,tokenizer, max_len, dir_path,threshold=0.5): 63 | logging.info('Load Meena Seq2Seq Data') 64 | self.tokenizer=tokenizer 65 | self.max_len=max_len 66 | 67 | self.source=[] 68 | self.target=[] 69 | 70 | self.threshold = threshold 71 | 72 | file_list = os.listdir(dir_path) 73 | # file_progress_bar = tqdm(file_list, position=0, leave=True, bar_format='{l_bar}{bar:10}{r_bar}') 74 | for file_name in file_list:#file_progress_bar: 75 | path = f'{dir_path}/{file_name}' 76 | total_file_len = file_len(path) 77 | data_file = open(path,'r', encoding='utf-8') 78 | 79 | tmp_source =[] 80 | tmp_target =[] 81 | tmp_source_len =0 82 | tmp_target_len =0 83 | 84 | for line in tqdm(data_file, 85 | total=total_file_len, 86 | desc=f'Load {file_name}', 87 | position=0, leave=True): 88 | line = line[:-1] 89 | if line == '': 90 | tmp_source = [] 91 | tmp_target = [] 92 | tmp_source_len = 0 93 | tmp_target_len = 0 94 | continue 95 | 96 | line_ids = self.tokenizer.encode(line, add_special_tokens=False, pad_to_max_length=False, max_length=max_len-2,truncation=True) 97 | line_ids += [self.tokenizer.sep_token_id] 98 | 99 | if len(tmp_target)>0: 100 | tmp_value = tmp_target.pop(0) 101 | tmp_target_len -= len(tmp_value) 102 | 103 | tmp_target.append(line_ids) 104 | tmp_target_len += len(line_ids) 105 | else: 106 | tmp_target.append(line_ids) 107 | tmp_target_len += len(line_ids) 108 | continue 109 | 110 | while len(tmp_value) + tmp_source_len > max_len: 111 | pop_source = tmp_source.pop(0) 112 | tmp_source_len -= len(pop_source) 113 | del pop_source 114 | tmp_source.append(tmp_value) 115 | tmp_source_len += len(tmp_value) 116 | 117 | if random.random() >= self.threshold: 118 | source, target = self.get_trainig_data(tmp_source, tmp_target) 119 | self.source.append(source) 120 | self.target.append(target) 121 | 122 | 123 | def get_trainig_data(self, source, target): 124 | if len(source) ==0 or len(target) ==0: 125 | return 126 | full_source = [self.tokenizer.cls_token_id] 127 | full_target = [self.tokenizer.cls_token_id] 128 | for line in source: 129 | full_source += line 130 | for line in target: 131 | full_target += line 132 | return full_source, full_target 133 | 134 | def _tokenize_input_ids(self, input_ids: list, add_special_tokens: bool = False, pad_to_max_length: bool = True): 135 | inputs = torch.tensor( 136 | self.tokenizer.encode(input_ids, add_special_tokens=add_special_tokens, max_length=self.max_len, 137 | pad_to_max_length=pad_to_max_length, return_tensors='pt', truncation=True)) 138 | return inputs 139 | 140 | def __len__(self): 141 | return len(self.source) 142 | 143 | def __getitem__(self, idx): 144 | encoder_input_ids = self._tokenize_input_ids(self.source[idx]) 145 | decoder_input_ids = self._tokenize_input_ids(self.target[idx]) 146 | labels = decoder_input_ids.clone() 147 | 148 | encoder_input_ids = encoder_input_ids.squeeze() 149 | decoder_input_ids = decoder_input_ids.squeeze() 150 | labels = labels.squeeze() 151 | encoder_inputs_mask = encoder_input_ids != 0 152 | 153 | return encoder_input_ids, decoder_input_ids, encoder_inputs_mask.unsqueeze(0), labels 154 | 155 | 156 | class DatasetForSeq2seqConversation(Dataset): 157 | def __init__(self, tokenizer:BertTokenizer, max_len:int, dir_path:str, threshold=0.0): 158 | logging.info('Load Meena Seq2Seq Conversation Data') 159 | self.tokenizer = tokenizer 160 | self.max_len = max_len 161 | 162 | self.source = [] 163 | self.target = [] 164 | 165 | self.threshold = threshold 166 | 167 | file_list = os.listdir(dir_path) 168 | # file_progress_bar = tqdm(file_list, position=0, leave=True, bar_format='{l_bar}{bar:10}{r_bar}') 169 | for file_name in file_list: # file_progress_bar: 170 | path = f'{dir_path}/{file_name}' 171 | total_file_len = file_len(path) 172 | data_file = open(path, 'r', encoding='utf-8') 173 | 174 | tmp_source = [] 175 | tmp_target = [] 176 | tmp_source_len = 0 177 | tmp_target_len = 0 178 | 179 | for line in tqdm(data_file, 180 | total=total_file_len, 181 | desc=f'Load {file_name}', 182 | position=0, leave=True): 183 | line = line[:-1] 184 | if line == '': 185 | tmp_source = [] 186 | tmp_target = [] 187 | tmp_source_len = 0 188 | tmp_target_len = 0 189 | continue 190 | 191 | line_ids = self.tokenizer.encode(line, add_special_tokens=False, pad_to_max_length=False, max_length=max_len - 2, truncation=True) 192 | 193 | 194 | if len(tmp_target) > 0: # 기존에 target 데이터가 있는 경우 195 | if tmp_target[-1][0:2] == line_ids[0:2]: 196 | # 화자가 같은 경우 197 | # 이전 source와 target 제거 198 | self.source.pop(-1) 199 | self.target.pop(-1) 200 | 201 | if tmp_target_len + len(line_ids) + 1 >= max_len - 2: 202 | while tmp_target_len + len(line_ids) + 1 >= max_len - 2: 203 | if len(tmp_target)>0: 204 | pop_target = tmp_target.pop(0) 205 | tmp_source.append(pop_target) 206 | tmp_target_len -= len(pop_target) 207 | tmp_source_len += len(pop_target) 208 | else: 209 | diff = (len(line_ids)+1) - (max_len+2) 210 | line_ids = line_ids[0:-diff] 211 | 212 | while tmp_source_len > max_len: 213 | pop_source = tmp_source.pop(0) 214 | tmp_source_len -= len(pop_source) 215 | if tmp_target != []: 216 | tmp_target[-1].append(self.tokenizer.unk_token_id) 217 | tmp_target.append(line_ids) 218 | tmp_target_len += len(line_ids)+1 219 | else: 220 | tmp_target.append(line_ids) 221 | tmp_target_len += len(line_ids) 222 | else: 223 | # 화자가 다른 경우 224 | # tmp_target 초기화 225 | tmp_value = copy.deepcopy(tmp_target) 226 | tmp_target = [] 227 | tmp_target_len = 0 228 | 229 | tmp_target.append(line_ids) 230 | tmp_target_len += len(line_ids) 231 | else: # target 데이터가 없는 경우 232 | tmp_target.append(line_ids) 233 | tmp_target_len += len(line_ids) 234 | continue 235 | 236 | tmp_value_len = 0 237 | for tmp in tmp_value: 238 | tmp_value_len += len(tmp) 239 | 240 | # tmp_value_len = min(tmp_value_len, max_len) 241 | while tmp_value_len + tmp_source_len > max_len-2: 242 | pop_source = tmp_source.pop(0) 243 | tmp_source_len -= len(pop_source) 244 | del pop_source 245 | 246 | for i, tmp in enumerate(tmp_value): 247 | if tmp_source != [] and i == 0: 248 | tmp_source[-1].append(self.tokenizer.sep_token_id) 249 | tmp_source_len += 1 250 | tmp_source.append(tmp) 251 | tmp_source_len += len(tmp) 252 | tmp_value =[] 253 | tmp_value_len =0 254 | 255 | if self.threshold ==0.0 or self.threshold <= random.random(): 256 | source, target = self.get_trainig_data(tmp_source, tmp_target) 257 | self.source.append(source) 258 | self.target.append(target) 259 | 260 | def get_trainig_data(self, source, target): 261 | if len(source) == 0 or len(target) == 0: 262 | return 263 | full_source = [self.tokenizer.cls_token_id] 264 | full_target = [self.tokenizer.cls_token_id] 265 | for line in source: 266 | full_source += line 267 | for line in target: 268 | full_target += line 269 | full_source.append(self.tokenizer.sep_token_id) 270 | full_target.append(self.tokenizer.sep_token_id) 271 | return full_source, full_target 272 | 273 | def _tokenize_input_ids(self, input_ids: list, add_special_tokens: bool = False, pad_to_max_length: bool = True): 274 | inputs = torch.tensor( 275 | self.tokenizer.encode(input_ids, add_special_tokens=add_special_tokens, max_length=self.max_len, 276 | pad_to_max_length=pad_to_max_length, return_tensors='pt', truncation=True)) 277 | return inputs 278 | 279 | def __len__(self): 280 | return len(self.source) 281 | 282 | def __getitem__(self, idx): 283 | encoder_input_ids = self._tokenize_input_ids(self.source[idx]) 284 | decoder_input_ids = self._tokenize_input_ids(self.target[idx]) 285 | labels = decoder_input_ids.clone() 286 | 287 | encoder_input_ids = encoder_input_ids.squeeze() 288 | decoder_input_ids = decoder_input_ids.squeeze() 289 | labels = labels.squeeze() 290 | encoder_inputs_mask = encoder_input_ids != 0 291 | 292 | return encoder_input_ids, decoder_input_ids, encoder_inputs_mask.unsqueeze(0), labels 293 | 294 | 295 | def file_len(fname): 296 | with open(fname) as f: 297 | for i, l in enumerate(f): 298 | pass 299 | return i + 1 300 | 301 | 302 | def make_seq2seq_data(tokenizer, dir_path, max_len): 303 | max_len -= 1 # [CLS] 토큰을 위함 304 | source = [] 305 | target = [] 306 | 307 | source_sum_len = 0 308 | target_sum_len = 0 309 | 310 | 311 | # 파일 리스트 312 | file_list = os.listdir(dir_path) 313 | 314 | file_progress_bar = tqdm(file_list, position=0, leave=True, bar_format='{l_bar}{bar:10}{r_bar}') 315 | for file_name in file_progress_bar: 316 | path = f'{dir_path}/{file_name}' 317 | data_file = open(path, 'r', encoding='utf-8') 318 | out_data_file = open(f'{dir_path}processed/{file_name}', 'a', encoding='utf-8') 319 | for line in tqdm(data_file, 320 | desc='Data load for pretraining', 321 | position=1, leave=True): 322 | line = line[:-1] 323 | line_ids = tokenizer.encode(line, add_special_tokens=False, pad_to_max_length=False, max_length=max_len,truncation=True) 324 | 325 | if line == '': 326 | source = [] 327 | target = [] 328 | 329 | source_sum_len = 0 330 | target_sum_len = 0 331 | continue 332 | line += ' [SEP] ' 333 | line_ids += [tokenizer.sep_token_id] 334 | if target_sum_len + len(line_ids)+1 max_len and len(target)>0: 339 | save_train_data(out_data_file, source, target) 340 | 341 | target_pop = target.pop(0) 342 | source.append(target_pop) 343 | 344 | target_sum_len -= len(target_pop[1])+1 345 | source_sum_len += len(target_pop[1])+1 346 | 347 | while source_sum_len > max_len: 348 | source_pop = source.pop(0) 349 | source_sum_len -= len(source_pop[1])+1 350 | 351 | # if source_sum_len >0 and target_sum_len > 0: 352 | # save_train_data(out_data_file, source, target) 353 | 354 | def save_train_data(outfile_writer, source, target): 355 | if len(source) == 0 or len(target) == 0: 356 | return 357 | full_source_str = '[CLS] ' 358 | full_target_str = '[CLS] ' 359 | for line in source: 360 | full_source_str += line[0] 361 | for line in target: 362 | full_target_str += line[0] 363 | 364 | outfile_writer.write(f'{(full_source_str.strip())}\t{full_target_str.strip()}\n') 365 | 366 | def meena_dataset(config, tokenizer): 367 | cache_data_path = f'{config.cache_path}/{config.model_name}.pickle' 368 | cache_dir_path= os.path.dirname(cache_data_path) 369 | 370 | if os.path.exists(cache_data_path): # 캐시 데이터가 존재하는 경우 371 | dataset = torch.load(cache_data_path) 372 | return dataset 373 | else: # 캐시 데이터가 없는 경우 374 | if not os.path.exists(cache_dir_path): 375 | os.makedirs(cache_dir_path) # 캐시 디렉토리 경로 생성 376 | 377 | dataset = DatasetForSeq2seqConversation(tokenizer, config.max_seq_len, config.data_path) 378 | torch.save(dataset, cache_data_path) # 데이터 저장 379 | 380 | return dataset 381 | def save_sample_data(dataset,tokenizer): 382 | max_len = len(dataset) 383 | with open(f'{config.cache_path}/sampled_data.txt','w') as f: 384 | for i in range(0,max_len,5000): 385 | source = dataset.source[i] 386 | target = dataset.target[i] 387 | f.write(f'context: {tokenizer.decode(source)}\nanswer: {tokenizer.decode(target)}\n\n') 388 | 389 | 390 | if __name__ == '__main__': 391 | data_path = '../data/tmp/' 392 | tokenizer = BertTokenizer('../data/vocab-10K.txt', do_lower_case=False) 393 | # dataset = make_seq2seq_data(tokenizer, data_path, 128) 394 | # dataset = DatasetForSeq2seqV2(tokenizer,128, data_path) 395 | # dataset = DatasetForSeq2seqConversation(tokenizer, 128, data_path) 396 | 397 | base_path = '..' 398 | 399 | log_dir = f'{base_path}/logs' 400 | config_path = f'{base_path}/config/meena-config.json' 401 | 402 | # Config 403 | config = ModelConfig(config_path=config_path).get_config() 404 | dataset = meena_dataset(config, tokenizer) 405 | 406 | save_sample_data(dataset, tokenizer) 407 | # print(dataset) 408 | # save_path ='../cache/train_data.pickle' 409 | # torch.save(dataset,save_path) 410 | # 411 | # a = torch.load(save_path) 412 | # print(dataset) 413 | -------------------------------------------------------------------------------- /data/sample_messanger.txt: -------------------------------------------------------------------------------- 1 | 여행 (여행지, 계획 등) 2 | A=20대 남성 군인 3 | B=20대 여성 사무 종사자 4 | A: 누나 모해?? 5 | B: ㅋㅋㅋㅋ 일하고 있지ㅠㅠ 6 | A: ㅋㅋㅋㅋㅋㅋ나돈데 지금 몰래 여행갈곳 찾는중 ㅎ 7 | B: 오오 어디? 8 | A: 외국은 돈이 없어서 못가구 ㅠ 9 | A: 국내에서 온천?갈까 생각중이야 10 | B: 국내에 온천이 있어? 11 | A: 찾아보니까 온양온천???있던데? 12 | A: 역도 있더라 ㄷㄷ 13 | B: ㅋㅋㅋㅋ헐 대박 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 어때? 14 | A: 쫌 괜춘한거 같긴한데 아직 알아보는중이라 ㅠㅠ 15 | A: 누나는 어디 안가? 16 | B: 나는 연말에 휴가 있어서 그때 해외로 뜰거야 ㅎㅎ 17 | A: 오 해외오디??? 18 | B: 방콕갔다올라고 ㅋㅋㅋ 예전에 가서 카운트다운했는데 너무 재밌게 놀았어서 한번 더 가서 할라구>< 19 | A: 오..방콕이....베트남인가...?태국인가? 20 | B: 태국이지 ㅋㅋㅋㅋㅋ 베트남은 호치민? 21 | A: 아맞네맞네 ㅋㅋㅋㅋㅋ 잠깐 헷갈렷당 22 | A: 나도 국내말고 해와가고싶다... 23 | A: 나좀데려가조..... 24 | B: 캐리어에 넣어줄까..? 25 | A: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 26 | B: 베트남은 나랑 안맞아서 태국이 좋아 ㅠㅠ 27 | A: 베트남 알레르기...? 28 | B: 태국만 벌써 두번 갔다 왔는데 이번에 가면 세번째지롱 29 | A: 오 30 | A: 모야 31 | A: 부러워 32 | A: 나 해외 33 | A: 나간적 한번두 없는데 34 | B: 너 누나 세계여행 하고 온거 몰라? 35 | A: ㅋㅋㅋㅋㅋㅋ진짜로?????? 36 | B: 작년에 8개월 나갔다왔자나 ㅎㅎ 37 | A: 진짜???어디어디???? 38 | B: 17개국인가 18개국 갔다왔어 39 | A: 와.....왠일로???? 40 | A: 누나가 직접? 41 | A: 아니면 뭐 패키지같은거야?? 42 | B: 볼리비아 페루 콜롬비아 베네수엘라 멕시코 쿠바 프랑스 영국 아이슬란드 포루투칼 스페인 모로코 이집트 요르단 43 | B: 아니 배낭여행 ㅋㅋㅋㅋㅋㅋ 44 | A: 혼자서?!??! 45 | A: 와 뭔가 부럽다...ㅠㅠ 46 | B: 웅ㅋㅋㅋㅋㅋ 공항이랑 버스터미널에서 자면서 47 | B: 여행했쥐 48 | A: 나는 엄두도 못내겠던데.... 49 | A: 진짜 신기하다 ㅋㅋㅋㅋㅋ나랑 뭔가 다른세계사람같앜ㅋㅋㅋㅋㅋ 50 | B: 지금까지 갔다온 나라 다합하면 30개국 될걸? 51 | A: 앞으로 여행문의는 주지혜투어? 52 | B: 예전에 한번 세어보니까 30개국에 100개 도시 넘게 갔다왔는데 53 | B: 앜ㅋㅋㅋㅋㅋㅋㅋㅋ 54 | B: 티켓팅은 알아서^^ 55 | A: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ나는 56 | A: 뭔가 해외여행갈라치면 57 | A: 여권부터시작해서 짐싸고 뭐하고 알아보고 58 | A: 이런게 눔 ㄱ ㅣ찮아서 ㅠㅠ 59 | A: 차마...못하겟어.... 60 | A: 누나처럼 장시간 여행가려면 하던것도 61 | B: ㅋㅋㅋㅋㅋㅋ 62 | A: 다 손놓고 가야해서 ㅠ 63 | A: 어쩌다 가게되써 64 | B: 그냥 별거 없어 국내랑 다를게 없는데.....ㅎㅎ 65 | A: ㅋㅋㅋㅋㅋㅋㅋ내가 집돌이라 그런걸수도 있겠다 66 | B: ㅋㅋㅋㅋㅋ 으으 좀 나가라 넌 ㅋㅋㅋ 67 | B: 돌아댕겨야지 68 | A: 헤헤...개춥...존춥... 69 | B: 추울때는 동남아가 최고야 ㅠㅠㅠ 70 | B: 나 택배 아져씨와서 71 | B: ㅠㅠㅠㅠㅠㅠ 72 | B: 이따 얘기하쟈 73 | A: ㅋㅋㅋㅋㅋㅋ언넝 맞이해 74 | 75 | 일과 직업 (취업, 스펙, 업무, 급여, 회의) 76 | A=20대 남성 군인 77 | B=20대 여성 전문가 및 관련 종사자 78 | A: 누나 뭐해? 아직 일중? 79 | B: 앗 name1야안녕^^ 80 | B: 무슨일이니^^? 81 | B: 정말 오랜만이다. 82 | A: ㅋㅋㅋㅋ퇴근하기전에 83 | A: 시간남아서 카톡했지 ^^7 84 | B: 퇴근이 몇신데? 85 | B: 나는 일하기싫다 86 | B: 나도 퇴근하고싶다 87 | A: 진정해 나도 퇴근하고싶다 88 | A: 같이 일하는 실무사가 있는데 89 | B: 그렇구나 90 | A: 자꾸 나한테 쓸데없는 말시켜.. 91 | B: 힘내 92 | B: 저런.. 93 | B: 나도 사수가 94 | B: 쓸데없는걸로 화내서 95 | A: 뭘로 화내는데?ㅡㅡ 96 | B: 그냥 일을안가르쳐주고 97 | B: 왜모르냐고 화내서.. 98 | A: 웅웅 99 | B: 너무 속상해 100 | A: 아니 왜그런데 대체? 101 | B: 그래도 열심해야지 102 | B: 돈이없으면 나도없으니가 103 | B: 에휴 104 | A: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 105 | A: 나도 우리 관리자분한테 106 | A: 맨날 알랑방구 꾸ㅣ는걸^^... 107 | A: 나부르면 쪼르르 달려가서 네?^^ 108 | B: 와 너 109 | B: 예전에도 방귀뿡뿡뀌더니 110 | B: 지금도 잘뀌나보네 111 | A: 내가 한방귀 뀌지 또 ㅎ 112 | B: 그래서 널싫어하는거아니야? 113 | B: 너 방귀냄새 114 | B: 솔직히 토나와. 115 | A: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ아니 그게아니잖아 116 | A: 요즘 117 | A: 일은 어떻게 할만하슈? 118 | B: 방귀좀 자제하자 119 | B: 일은뭐 120 | A: 네..자제토록 하겠습니다.. 121 | B: 할만하지 122 | A: 누나가 뭔일 했었지 123 | B: 컴퓨터가 너무 낡아서 124 | B: 부시고싶은거빼곤 125 | A: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ응 126 | B: 괜찮아 127 | A: ㅋㅋㅋㅋㅋㅋ왜안바꿔줘? 128 | A: 총무과에 방귀뀌고와 129 | B: 웅 회사가 나보다 돈이없나봐 130 | B: 저런것도 컴퓨터라고 131 | B: 쓰라고하는것보니^^ 132 | A: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 133 | A: 근무시간에 134 | A: 겜하는거아님? 135 | B: 근무시간에 주식해 136 | B: 요즘 137 | A: 난 주식망했어 138 | A: 어떡해...? 139 | B: 왜? 140 | B: 왜망했어 141 | B: 하긴 일하면서 142 | A: 그냥 어쩌다보니.........직장도 때려치고싶다^^ 143 | B: 주식하니까 망하지 144 | B: 우리둘다 월급루팡하지말고 145 | B: 열심히하자 146 | A: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 147 | A: 월급루팡은 생명이지 148 | B: 그치 149 | A: 5시 퇴근까지 150 | A: 30분남았다... 151 | B: 오 축하해 152 | A: 하....나 마무리하러간다 153 | A: 수고해 154 | B: 그래 155 | B: 다음에 밥한끼하자 156 | A: 오키오키 157 | 158 | 식음료 (식사, 음식, 배달, 맛집, 요리) 159 | A=20대 여성 가정 주부 160 | B=20대 여성 기타 161 | B: 짜쟌 162 | A: ㅋㅋㅋ 163 | A: 오늘 나는 아침에 8시에나와서 두유만먹어가지구 164 | B: name1 끝낫웅? 165 | B: 아이구 힘들었겟다ㅠㅠ 166 | A: 아까 쉬는시간에잠깐 삼김 2개 겨우먹음 167 | A: ㅋㄷㅋㄷ 168 | A: 삼각김밥! 169 | A: 너는 ??? 170 | B: ㅋㄱㅋㄱㄱㅋㄱㅋ나 171 | B: 완전 맛이쏜 172 | B: 맛있는 떡볶이집을 알아냇웅!! 173 | A: 오디 ? 174 | B: 운전하다가 175 | B: 신혼집근처골목? 176 | B: 뒷골목인데 177 | A: 신혼집이어딘데 ? 178 | B: 왠지 고수의 향기가 느껴지는거야ㅋㄱㅋㅋㄱㅋㄱ 179 | B: 망우동쪽이거든>< 180 | A: 아하 망우동이구나~ 181 | A: ㅋㅋㅋㅋㅋ 182 | B: 학교가 주변에 잇엇는지ㅋㄱㄱㅋㄱㅋㄱ웅웅 183 | A: 오오대박근데근데?? 184 | A: 얼마야 ? 185 | B: 그래서 주차를 186 | B: 서둘러하고는 187 | B: 똭들어갓어 188 | A: 웅 189 | B: 근데 내가 첨이라 190 | B: 가격표를 보고잇엇는데 191 | B: 할머니께서 엄청 인자하신거야 192 | A: 웅웅 193 | B: 그러면서 그냥천원어치만 시키고 194 | B: 먹고 더 시키든지 195 | A: 지금 천원어치 파는데가 있긴함 ? 196 | B: 담에또라고하시는거야 197 | A: 대박; 198 | B: 그니께ㄱㅋㄱㅋㄱㄱㅋㄱ 199 | B: 아근데 여기가 조금어러운 200 | B: 어렵고 그런동네인거같아 201 | B: 나도 여기가 처음이라 몰랏거든 202 | A: 천원이면 양이 그러케 만커나하진않앗겟네 203 | A: 그래도 나는 천원만주고 조금사먹능거 너무 조음 204 | B: 맞아 근데 많앗어ㅋㄱㅋㅋㄱㄱㄱ 205 | B: 내가엄청 배고파서 206 | A: 맨날 잔뜩사서 남기거든. ; 207 | B: 급하게 숟가락으르ㅡ 208 | B: 먹기시작햇는데 209 | B: 달콤하고ㅋㄱㅋㄱㄱㄱㅋ 210 | B: 아아 name1이는양이적어서 211 | A: 아냐 212 | A: 너나나나그게그거임 ㅋㄷㅋㄷ 213 | B: 조금씩 파는곳이 더 좋겟다ㅋㄱㄲㄱㄱㅋㄱㄱ 214 | A: 마니쳐묵음 215 | A: 요새 기본3천원보통이자나 216 | B: 아냐 나는 소나기밥이야ㅣㄱㄱㅋㅋㄱㄱㅋㄱㄱㄱㄱ 217 | A: 그럼 넘마나;; 218 | B: 마쟈 근데 마음이 뭔가 훈훈한겨 219 | A: 울집앞에도 220 | B: 그래서내가 221 | B: 웅웅ㅣㄱㄱㅋㄱㄱㅋㄱㄱ 222 | A: 1인분으로 223 | A: 4천원짜리 224 | B: 오오 225 | A: 순대조금오뎅조금튀김조금 떡볶이 226 | A: 조금합쳐서4천원에팔아 227 | B: 요새는거의 3천원부터인데 228 | A: 그게나한테딱임 229 | B: 거기 구성알차다ㅋㄱㅋㄱㅋㄱㄱㄱㅋ 230 | A: 다엄청조금씩넣어서 ㅋㅋㅋ 231 | A: 내스타일임 232 | A: 내가원래한입맛보고다버림 ㅋㅋㅌ 233 | B: ㅋㄱㅋㄱㄱㅋㄱㅋ나도궁금타 담에가보쟈 234 | B: 여기ㅋㄱㄱㅋㄱㅋ달고 235 | A: 맨날치킨먹는다고시켜놓고 다남김 236 | B: 애들입맛 딱 237 | A: ㅋㅋ울집앞은그냥그래;;거기갈바에딴데가자 ㅋㅋㅋ 238 | B: 옛날 학교앞맛이야ㅋㄱㅋㄱ ㅋㄱㄱ 239 | A: ㅋㅋ그래 240 | A: 담에사와바 241 | A: ㅋㅋㅋㅋ 242 | B: 그래ㅋㄱㄱㅋㄱㄱㅋ수원맛집많으니까 243 | A: 천원이니까 244 | B: 근데신기한거는 245 | B: 떡을 246 | A: 사달라고부담업이말한다 247 | B: 덜익은거 248 | A: 갠히2천원어치사지말고 249 | A: 한입거리만 가져와바 250 | B: 푹익은거 고를 수 잇게 251 | B: 해주시더라구ㅋㄱㅋㄱㅋㄱㄱ 252 | A: 오 대박 ㅋㅋㅋㅋ 253 | A: 그것고내맘에든다 254 | B: 아글고 망우리만두가 잇는데 255 | B: 보기에는 형편없어서 256 | A: ㅋㅋㅋㅋㅋ거기서시골인만큼 맛집은많구만 !!!! 257 | B: 예전에는 사람들이 그거 만두보고 웃었대ㄱㅋㄱㄱㄱㅋ 258 | B: 여기는 진짜 259 | B: 서울의 시골같아ㅋㅋㄱㅋㄱㅋㄱㅋ 260 | A: ㅋㅋㅋㅋㅋ 261 | B: 봐봐사진보여주께 262 | A: ㅜㅜ거기가서울이냐 263 | A: 흑흑 264 | B: 그바삭한 그냥 만두피?ㅋㄱㅋㄱㄱㄱㅋㄱ 265 | B: 그런거같은데 국물 찍어먹으면 266 | B: 진짜대박ㅋㄱㄱㄱㅋㄱㄱㅋㄱㄱ 267 | A: 아아 야끼만두 268 | A: 인가보네 269 | B: 여긴걍ㅠㅠ구리야구리 270 | B: 서울아녀 271 | A: 거의만두피수준 272 | A: 구리지! 273 | B: 마쟈ㅋㄱㄱㅋㅋㄱㄱㄱㅋㄱㅋㄱ 274 | B: 먹는데 275 | B: 초록색 분식집 그릇도 반갑고 276 | B: 277 | B: 달달구리 떡볶이 278 | A: 저기.... 279 | B: 맛도좋고ㅋㄱㅋㄱㄱㅋㄱㄱㄱㄱㅋ 280 | B: 웅ㅋㄱㅋㄱㄱㅋㅋㄱㄲ 281 | B: 위생은 그냥그래보엿거든? 282 | B: 근데 나름 엄청 무언가 깨끗히 치우고 계셧어 계속 283 | A: ㅋㅋㅋ 284 | A: 할매들이또성격이깨끗한할매는 겁나깨끗하지 285 | B: name1이는 배안고파?ㅋㄱㅋㄱㄱㄱ 286 | B: 마쟈 287 | A: 근데그냥시장통은 넘더럽...;;; 288 | A: 그래서잘골라가야뎀 289 | A: 거긴먼가무림의고수냄새가난다 290 | B: 그사장님 엄청ㅠㅠ정성이셧웅 291 | B: 시장통은 그냥정신이 없구 292 | A: ㅋㅋㅋㅋ나배고프지그래서열심힞집가고 293 | A: 잇자나 294 | A: 근데우리목욜에 295 | A: 만나면뭐먹을래 ? 296 | B: 우리 그날 화악 땡기는거 가쟈 297 | B: 아님 저번에 298 | A: 아침이라화악땡기진... 299 | B: 수원단호박파스타먹엇던 300 | B: 거기가보까?ㅋㄱㅋㄱㄱㅋㄱㄱㅣㅣ 301 | A: 노노 또가긴시름 302 | A: 너랑만나는날고적은데 303 | B: 아침부터 파스타는 너무 느글거리려나 304 | A: 새로은데가겟어 305 | B: 웅웅ㅋㄱㅋㄱㅋㄱㅋ그러쟛 찾아보께 아직2틀남앗으니 306 | B: 케케케케 신난당 307 | A: 찾아보진마!! 308 | A: 힘쓰지마 309 | A: 너의시간 310 | A: 그런데쓰지마 311 | B: 간만에 쉬는날 ❤😍먹는걸로 312 | B: 스트레스풀고 노는거딩 313 | A: 음식먹고싶은거나열해보자! 314 | A: 목요일에먹을거 ! 315 | B: name1이도 먹고픈거 생각해봐>< 316 | B: 나는 음 일단 317 | B: 샤브샤브도 떠올랏구ㅋㄱㅋㄱㅋㄱ 318 | A: 그래 같이 319 | A: 떠올리자^^ 320 | B: 또 머잇징 321 | A: 아 나는 샤브샤브 얼마전에 안조은일 잇엇름 3주전에;; 322 | A: 대박 323 | A: 야 그 324 | B: 평소에 맨날 집에서만 먹어서 325 | B: 오잉 무슨일?음식점에서? 326 | A: 평촌 주공공이건물잇지 ? 327 | A: 거기뽕잎샤브인가그게되게오래됏거든 328 | B: 웅웅 거기 먹을거 거의 1층만잇는ㅜㅜ 329 | A: 그리고예전에 330 | B: 웅웅 나도가봣디 거기 331 | A: 몇번간적도잇고 332 | B: 웅웅 333 | A: 걍그냥그런곳이거든 334 | A: 그래서저번에name4랑 같이 셋이 갓어 335 | B: 조금 바꼈어?맛이? 336 | A: 그냥평타니까 337 | A: 아니아니그런게아냐 338 | B: 옹그럼?? 339 | A: 맛이바낀건 안조은일이아니구 340 | A: 아니갓는데 ㅋㅋㅋㅋ 341 | A: 막 고기에 342 | A: 이상한 343 | B: 웅웅 ㅋㄱㅋㄱㄱㄲㄱ거기오랜만이다 344 | A: 가루???돌가루???같은게붕어잇는거야 345 | B: 헐 음식에? 346 | A: 근데첨엔그냥 얼음부스러기 347 | A: 같은건줄알고 348 | A: 걍다집어넣고 끓엿어 349 | B: 웅웅 그렇게 보였겟네 350 | A: 근데 먹다보니까 351 | B: 헉 같이 짬뽕됏구머ㆍ 352 | A: 진심 매우 막 안씹히는 353 | A: 돌가루 354 | B: 웅웅 355 | A: 가막입에서나오는거 356 | A: 그그그그 조개껍질씹으면 357 | A: 나는 그 돌가루같이 358 | B: 아니 근데 진짜 돌이엿어? 359 | A: 절대안씹히는거탸 360 | A: 아니그래서첨엔내입이이상한줄알고 361 | A: 뱉엇어 362 | B: 헐 이나가면 어떡하려구 363 | B: 잘햇네 364 | B: 웅웅 365 | A: 근데 두번째먹엇는데 또 그러는거야 366 | A: 진짜걍 이상항가루 367 | B: ㅜㅜ그게뭐지? 368 | A: 석회가루... 369 | A: 그래서내가뱉엇는데 370 | B: 샤브샤브에?돌가루라니 371 | A: name3도 자기도똑같이생각햇는데자기입이이상항줄알고 372 | A: 참앗다는거야 373 | B: 말도안돼 대박 374 | A: 아욕나오네 375 | A: 다시생각해도 376 | B: 남편도 참았대? 377 | B: 하긴 378 | B: 음식점에서 그런게 379 | A: 380 | B: 나온다는 생각은 안드니까 381 | A: 아니 382 | B: 헐 383 | A: 그게아니라 먼가싶어서 384 | A: 걐우뚱하고잇엇던거지 385 | B: 색깔이 조금 돌같지 않네? 386 | A: 그래서진짴ㅋㅋㅋ반복되니까 내가 사장을 불럿어 ㅋㅋㅋㅋ 387 | A: 여기 이상한게나왓다고 ㅋㅋㅋㅋㅋ 388 | B: 웅웅ㅋㄱㅋㅋㄱㅋㄱㄱㄱㄱㅋ 389 | A: 근데 막 먹어도된다는거야 ㅋㅋㅋㅋㅌㅌ 390 | A: 안씹히는데 391 | A: ㄴㅋㅋㅋ 392 | B: 도대체 그게멉니까 하고 393 | A: 진짜걍 석회가루엿어 394 | B: 으잉 그걸먹으래? 395 | A: ㅋㅋㅋㅌㅋ진짜아욕나오네 396 | B: 안씹히는데도? 397 | A: 미친놈이따로없는거야 398 | A: 그냥인간이먹으면 399 | B: 너무하네 음식점 장사하면서 400 | A: 안되는게들어잇엇어 401 | B: 다른분들은 그러면 402 | B: 사장님도 맛보던데 403 | A: 근데 계속내가괜찮다고햇는데 404 | A: 막 그럼다시준다면서 405 | A: 새로주겟다는거야 406 | B: 사실 새로주는게 맞지ㅜㅜ 407 | A: 그래서아니갠찬타고이미 다끓엿다고 됏다고 408 | A: name3는 409 | B: 그거어떻게먹어ㅠㅠ 410 | B: 와대박 411 | A: 나가자는 412 | A: 말이야 413 | A: 저런데ㅛㅓ어떻게먹냐고 그런거지 414 | B: 아아 입맛이 415 | A: 맛이이상한게아니라 진짜 416 | A: 그냥 인간이먹으면 안되는덜 417 | B: 떨어지셧구나ㅜㅜ 418 | B: 찝찝하지 419 | B: 당근 420 | A: 계속 먹고잇엇던거고 421 | A: 되게더러워ㅛ거든 422 | A: 처음부터더러워서찝찝햇는데그냥 까딸스럽게굴지말고 참고대충먹고가자 423 | A: 둘다속으로 424 | B: 와 근데 저게 진짜 돌이면 425 | A: 생각만그러고잇엇던거지 426 | A: 돌이면나아차라리 427 | B: 왜 거기 안에 들어잇던거야?? 428 | A: 돌이아니라 그냥 석회가루 429 | B: 아 진짜 미쳣다 430 | A: 돌가루라능건첨에 내눈에 431 | A: 그랫다는거고 432 | B: 먹는거에 그렇게 해놓고 433 | B: 죄송하다고 안하셨웅? 434 | A: 씹어보니까 걍 인간이먹음안되는 그런거엿어 435 | A: ㅇㅇ 그런거안라고 걍계솓 436 | A: 먹어도된대 ㄴㅋㅋㅋㅋㅋㅌ 437 | A: 졸라웃으면서 438 | B: 아니ㅋㄱㅋㄱㄱㄱㅋㄱㅋ 439 | B: 그걸 누가먹어 440 | A: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅌ 진짜근데걍나왓어괜찮아요하고 441 | A: 나왓어 442 | B: 파는걸 그렇게 팔ㅅ연서 443 | B: 팔면서 444 | A: 아..다시생각하니까너무화난다 445 | B: 대처하는게 너무 화난다 446 | A: 암튼 거기가지마 name2아 너무더러워 447 | A: 다음에다른친구랑 가더라도 448 | B: 머리카락 나와도 사람들 449 | A: 아냐 그게대처가문제가아니야 450 | B: 다시는 안가는게 음식점 장사인데 451 | A: 대처나발꺼지고 걍 452 | B: 웅웅 453 | B: 더럽다ㅜㅜ 454 | A: 거기는 더러운곳이라 455 | A: 가지말란거야 456 | B: 안가야겟다 457 | A: 위생이엏마나쓰레기면그래 458 | B: 땡큐ㅠㅠ 459 | A: 너거기절대가지마 460 | 나알지?수정할수잇는거면내가 뭐라뭐라햇겟지 461 | B: 맛집이 널리고 널렸누데 462 | A: 근데딱보니까 답업으니까 됏다그러고 463 | B: 굳이 거길 가기에는 464 | A: 걍바로뛰쳐나왓어 465 | B: 그렇지그렇지 466 | B: 잘햇네 467 | A: 수정이되고나발이고가아니고거긴그냥 468 | A: 더러워 469 | A: 절대가면안되 470 | B: 괜히 입맛만 버렸겟다 471 | A: 너도가지마 472 | 위생에안일한태도를가진 사장은 473 | A: 안돼 474 | B: ㅜㅜ그럴때 갑자기 식욕 떨어지든데 475 | B: 웅웅 그런 음식점사장님 476 | A: ㅋㅋㅌ그래서걍내려가자마자 밑에일층에 무슨 구포국수?라는 잔치국수파는곳에서대충사먹엇어 477 | B: 처음들어봐ㅋㅋㄱㅋㄱㄱㅋㄱㄱㄱㄱ 478 | A: name4때문에 479 | A: 빨리어디든들어가야햇어 480 | B: ㅜㅜ구포국수 거기 깔끔하대 481 | B: 아아name1이ㅡ 482 | B: 나 요새 청첩장 돌리느라 483 | B: 친구들한테 밥사주는데 484 | A: 응 맞아 갠찬ㅌ더라 485 | A: 싼맛에조아 486 | B: 음식점 많이 찾아보게 되잖웅 487 | A: 울엄마최애식당임 488 | B: 맞아 구포싸고 괜찮고 맛있웅 489 | A: 구포국순ㄴ 490 | B: ㅋㄱㅋㄱㄱㅋㄱㄱㄱ울엄마도 491 | A: 잠시만 나걷고잇거든 492 | B: 국물이맛있으시대ㅋㄱㅋㄱㄱㄱㅋ 493 | B: 웅웅 조심히 걷구 짐많지? 494 | 배도고프고ㅠㅠ고생했겠다 495 | A: ㅋㅋㅋㅋㅋ 고마오 496 | A: 나이제 전철내려서 버스기다려!! 497 | B: ㄱㄲㅋㄱㅋㄱㄱㅋ가방무겁지?ㅠㅠ 498 | A: ㅋㅋ 아냐아냐 견딜만해 499 | A: 아배고프다 500 | B: 어제 청첩장 밥사주믄서 501 | B: 이수역으로가서 502 | A: 암튼 그래서 얼마전 그일로인해 요새 샤브샤브는 겁나 안땡김 503 | B: 파스타집갓는데 504 | B: 맛있드라구ㅋㄱㅋㄱㅋㄱㅋ 505 | B: 그래 그럼 샤브샤브는 패스하쟈 506 | A: 이수역도왠지 뜨네기가마나서맛업응거같읃데 507 | A: 맛잇엇음 ? 508 | B: 마쟈ㅋㅋㄱㅋㄱㅋㄱㄱ아재동네같은데 509 | B: 그와중에 510 | A: ㅠㅠ돈마니썻겟네 맨날 그렇게 사주고다닐라믄 511 | B: 최근에오픈한곳 갔거든 512 | A: 사당주변도진짜먹을거업어 513 | B: ㅠㅇㅠㅠ웅 엄마카드써서 엄청 눈치보여 514 | A: 식당이름 머엿는데 ? 515 | B: 마쟈 사당이수 516 | B: 먹을거 없웅ㅠㅠ 517 | B: 이즈이즈라는 518 | B: 곳이엿웅 519 | A: 그럼나는 사주지마 520 | A: 돈많이썼으니가 521 | B: 아녀 name1이는 더 맛있는거 522 | B: 사주고파~~!!! 523 | A: ;;;;;; 524 | A: 아아그럼 525 | B: 안댕 서운해ㅜㅜ사주고파 526 | B: 527 | A: 한끼는 너가사구 한끼는내가사자 528 | A: 529 | B: ㅋㅋㅋㄱㄱㄱㄱㅋㄱㄱ아녀 우리 애매하게 아점일지도 몰라 530 | B: 오전부터보니까ㅋㄱㅋㄱㅋㄱㄱㅋ 531 | A: 그니까!! 532 | B: name1아 먹고픈거 533 | A: 아점먹구 저녁먹구! 534 | B: 생각해뒀다가 535 | A: 그날name3늦게옴 536 | A: 아아그럼이러자 537 | A: 한끼사먹구 538 | B: 목요일 아침에 꼭얘기하쟝♡ 539 | A: 한끼는울집 540 | A: 그 541 | A: 샐러드 542 | B: 아녀 무슨 543 | A: 먹자 544 | A: 시름말구! 545 | B: 설거지하고name1이힘드러노노ㅠㅠㅠ 546 | A: 샐러드가..? 547 | A: 일회용품인데..? 548 | B: 내가맛난거사줄게 두번먹쟈ㅋㅋㄱㅋㅋㄱㄱㄱ 549 | B: 아근뎃 550 | B: 어제 그사장님이 551 | A: ㅋㅋㅋㅋ 댓어 샐러드도먹쟈!!! 일회용품리라 설거지안함 !!후수 552 | B: 감자튀김이랑 리코타샐러드 서비스 553 | B: 주셨어ㅋㄱㄱㄱㅋㅋㄱㅋ 554 | A: ㅋㅋ왜 ? 555 | A: 너가너므이뽀서 ? 556 | B: 모르겟어ㄱㅋㄱㄱㄱㄱㄱ아니아니 557 | B: 왠지 558 | B: 음식점이 얼마 559 | B: 생긴지 안됐나봐 560 | A: 오 서비스를 잘하는 곳이네!! 561 | B: 그래서 애들이 사진찍으니까 562 | B: 갑자기 한개 563 | B: 두개 564 | A: 니가그러케조은 기억이잇으니까 나에게도추천하자나 565 | A: ㅋㅋㅋㅋ 566 | B: 서비스를!! 567 | B: ㄱㄱㄲㄱㅋㄱㄱㅋㄱㄱㄱ맞아 568 | A: 그러게머리좋네사진찍으니까 569 | A: 딱내주면 570 | A: 자기식당더빛나보이지 571 | A: 더꽉차보이고 ㅋㅋㅋ 572 | B: 음식은 다 기억하기 나름인거 같아 573 | B: ㅋㄱㅋㄱㅋㄱㅋㄱㅋ그렇지 574 | B: 글고 오늘도 575 | B: 떡볶이 추억의 맛이잖웅 576 | A: 그치만 뽕잎은정말안덴다 내가왠만하면 다신안가고그런게업단말이지 ? 577 | A: 쳐묵는거조아해서..후.. 578 | B: 절대가지말응 579 | B: ㅜㅜ 580 | A: 근데거ㅅ긴증말업어져야됨 581 | B: 그런 음식점은 알려줘 안가야겠다ㅋㄱㅋㄱㅋㄱㄱㅋ 582 | A: ㄴname2아 나이제집도착햇능데 583 | A: 너무어지러워 ㅠㅠ 밥을못먹어서그런듯 584 | A: 근데라면밖에 없어서..이거라도 먹으려고 끓이는중이야 ㅠㅠ 585 | B: ㅠㅠ라면밖에 없어? 586 | B: name1이 잘먹고 다녀야 587 | B: 기운날텐데ㅜㅜ 588 | 건강에는 잘 먹는게 최고야 589 | B: 특히 추워져서 면역도 떨어지구ㅠㅠ 590 | A: 꽃게탕면 ? 591 | A: 별루안조아하는데 ㅠ이거밖에업음 ㅠㅠ 흑흑 592 | B: 얼큰하긴 하겠당ㅠㅠ 593 | B: 나도 조율사 아저씨 다녀가시면 594 | B: 뭐라도 먹고 집에 내려가야되는데 595 | B: 걱정이당ㅠㅠ 596 | A: 떡볶이가넘부실하긴햇지 597 | A: 넌왜케밥을잘안챙겨먹닝??????!!! 598 | A: 난돼지라잘먹어 오늘같은날만 이렇게먹는거야 599 | A: 너가밥을잘먹어야하는데 600 | B: 나는 이제 곧 601 | B: 드레스 입는데 602 | B: 식단조절도 안해갖고ㅠㅠ 603 | B: 큰일이야 604 | A: ㅋㅋㅋ그냥얼굴만이쁘면돼 몸은어차피안나와 605 | A: 그리거니가지금좀덜먹는다고 더날씬하게안나옴 606 | 맘편히먹어 607 | A: 몸생각해서 좋은거먹어 608 | A: 너가 밥제대로챙겨먹엇단소리를들은적이없다 ... 609 | B: 고마워ㅠㅠㅠ하긴 먹는거 610 | B: 체력으로도 이어지드라구 611 | B: 요새 탄수화물 적게 먹어본다고 612 | B: 하고있는데 기운이 없어ㅋㄱㅋㄱㅋㅋ 613 | A: 헐.. ㅠㅠ 그랫구나 614 | A: 맞아 탄수화물덜먹으면 체력딸림.... 615 | A: 근데 탄수화물을적게먹고 다요트를 하는중인데 떡볶이릉 무거...!?!?!?!?!?!?! 616 | B: 너무 갑자기 땡겨갖고 식욕에 617 | B: 나의 정신을 잃고야 618 | B: 말앗응ㅋㅋㄱㅋㅋ벌써 다먹엇웅? 619 | A: ㅋㅋㅋㅋ 이미진작다먹엇지 ... 620 | A: 넘맛없엇다 621 | A: 배가고파서먹긴먹는데 뭔가 맛있는걸로 배채우면 뿌듯하잖아 622 | 맛없는걸로배채우면 슬픔 ㅠ 623 | B: 오오드디어 조율사 아저씨 오셨다ㅋㄱㅋㄱㅋㄱㅋㅋㅋ 624 | B: 이따가 ㅠㅠ얼큰한 우동이나 먹고프다 625 | B: 그렇겟다ㅜㅜ밖에서 고생하고와서 626 | A: 무슨 또 우동이야 먹지마 627 | B: 라면먹어갖고ㅠㅠ 628 | B: 흑흑 살찌려나ㅋㄱㅋㄱㄱㄱㄱㅋ 629 | A: 떡볶이먹었으니까 밥으로먹어!!!! 630 | B: 샐러드말구 631 | B: 밥먹으까? 632 | A: 노노 넘영양은 없는데 탄수화물만머금 ㅇㅇ 633 | B: 그래ㅠㅠ나요새 어깨도 아파갖고ㅠㅠ미치갓응 634 | B: 어깨에 좋은 한약이라도 635 | A: 걍 뭐 간단히마트에서사다가고기를1장만굽어먹는다던지 636 | B: 지어먹어야하나 637 | A: 차라리그러면영앙가는조응데 638 | 살은덜찌니까 639 | B: 고기구워먹는것도 맜있겟다 640 | A: 한약은효과음슴 641 | B: 나는 해먹는게 귀찮아서 642 | B: 큰일이당ㅜㅜ 643 | B: 결혼해서 요리도 많이 해야되는데 644 | A: 해먹는거겁나귀탄치;;;너만의문제가아님 645 | B: 한약먹어봤웅? 646 | B: 아그렇구나ㅋㄱㅋㄱㅋㄱㅋ다그런거군 647 | A: ㅋㅋ그래서요새 배달시캬먹는사람이많잖아 648 | A: 결혼해도다들편하게배달해먹어 649 | B: 나는 요리보다ㄱㄱㅋㅋㄱㄱㄱ 시켜먹는게 650 | B: 가성비도 있다고 생각햐 651 | B: 그렇지그렇지ㅜㅜ글고 음식해놓으면 652 | B: 다 남게되드라 653 | A: ㅋㅋ배달음식시켜도다남아 654 | A: 몰랏지 ㅋㅋ 655 | A: 여튼 가족적을땐 남은음식무조건생김 ㅋㅋㅋ 656 | B: 그럼 신혼때는 거의 657 | B: 어떻게 해서먹엇웅? 658 | B: 팁 알려주랑ㅠㅠ음식해먹는게 기본이라 659 | A: 오빠는신혼집오늘언제와 ? 660 | B: 어렵드라구 유튜브라도 661 | B: 봐야하낭 662 | A: 지금도신혼이야 ㅋㅌ name4는아직 애기라서 어차피그게그거임 663 | B: 오늘ㅠㅠ오지말라케흥 664 | B: ㅠㅠ 665 | A: ㅋㅋ유튜브보고몇개따라해봐ㅛ거 666 | A: 걍내맘내키는대로 해먹지 667 | B: 오늘은 조율받고 6시면 집가면 668 | A: 근데대부분시켜먹어 669 | A: 엄마가해주고 670 | B: 차막히고 8시라ㅠㅠ 671 | B: 밥도 늦게먹을거 가탓 672 | B: 아아 어머님 요리 넘 673 | B: 좋겟당 674 | A: ㅜㅜ 675 | A: 아너그럼 6시에출발 ? 676 | A: 오빠는안양에서만나 ? 677 | B: 웅웅ㅠㅠ오늘 오빠 아예 안만나구 678 | B: 집가서 내가 쉰다했웅 679 | B: 너무피곤해갖고ㅠ쥬 680 | B: 밥이고뭐고 여기서 밥사먹고 운전하면 681 | A: 아아그치 넘늦어지지 682 | A: 너낼또일찍나가야되잖아 683 | A: 움 그럼 우리다시 목욜에 만나면 머먹을지 얘기해보자 684 | A: 685 | B: 웅웅 카페가딩ㅜㅜ 686 | B: 아근뎃 카페가서 커피마셔서 687 | B: 그런가 커피가 688 | B: 이뇨작용있잖웅~~! 689 | A: 커피마시면 심하지 ㅋㅋㅌ 690 | A: 오줌너무마료외ㅝ 691 | B: 웅웅ㅋㄱㅋㄱㄱㅋㅋ커피마시고 와서 692 | B: 더 배고프거나 693 | B: 아님 괜히 살빠지는 느낌이야 694 | B: ㅋㅋㄱㄲㄱㅋㅋㄱ그래 목요일날 머먹을지 얘기해보쟈 695 | A: ㅋㅋㅋㅌ근데전혀살안빠짐 696 | A: 커피마시면 살더찜 697 | A: 위장병온대 698 | A: 너먹고시픈거잇어 ? 699 | B: 예스라 미안해ㅠㅠ피아노조율얘기듣다가ㅠㅠ길어져서ㅠㅠㅠㅠ아직하시고계셔 700 | B: 나능ㅋㄱㅋㄱㄱㅋㅋㄱ뜨듯한거 느끼한거만 아니면좋아유 701 | B: name1이는?ㅋㄱㅋㄱㄱㅋㄱㅋ샤브아냐도 중식도 있고 702 | B: 아근데 파스타양식도 요새 겁나 좋고 걍 다좋아ㅋㄱㅋㄱㄱㅋ식욕폭발 703 | B: 704 | A: 뜨뜻하고느끼한거는 싫다구?? 705 | 너가아까말한 샤브랑 파스타가 뜨뜻이랑 느끼인디 ㅋㅋㅋㅋㅋㅋㅌ 706 | A: 나는 파스타도조쿠 움.. 암거나조아 나도 ㅋㅋㅋ 707 | A: 찾아보고와서메뉴나열할게잠시망 708 | B: 나두나두ㅋㄱㄱㅋㅋㄱㄱ수원근처나 광교근처 709 | B: 맛집찾아보구잇웅ㅋㄱㅋㄱㅋ 710 | A: 현백판교는어때?? 가까운데! 711 | A: 너 운전하기힘들면 같이 광교신분당선타구 가면 금방이야! 712 | A: 거기맛집마는거 같든뎅!! 713 | 아직 몇군데못가밧지만 714 | A: 715 | B: 오 현백좋당 거기가 맛집 많으면 716 | B: 거기가쟈>< 717 | B: 현백 안가본지 오래됐웅😍❤ 718 | A: 내가 생각한 게 세군데 정도되는데! 719 | A: 광교에 앨리웨이라고 있어 새로오픈한덴데 새로라고하기엔 몇개월지낫지만 아직도 가오픈만한곳이많아서 720 | A: 아브뉴프랑이랑은 또 다르게 광교에서 획기적으로 오픈한 곳인데거기에 맛집이 몰려있어 721 | A: 도쿄등심이라는곳이랑 세상에모든아침인가 그두군데가 기존 장사잘되는덴데 둘다너무비싸! 722 | 세상에모든아침은 시댁이랑도 갓엇어 723 | 대신에 724 | B: 세상의모든아침 광교점 양식 | 경기 수원시 영통구 address 725 | B: 요기맞지?>< 726 | A: 웅맞아 727 | A: 근데 저두군데말구 728 | B: 729 | A: 요새 압구정동맛집 들어온게 대박핫하다고하더라고 730 | 형훈텐진??? 731 | A: 아아니다 형훈텐동! 732 | B: 압구정동?오홋 그래 아브뉴프랑 안가본지 진짜오래됏당 733 | B: 형훈텐동 734 | B: 가봣는데 진짜맛잇응 735 | A: 여기가 완전대받핫하대 근데 저기보다 가격갠찬아서 만약가면 저기가자 736 | A: 근데아브뉴프랑이랑다른대야 737 | A: 앨리웨이라고햇잔아 다른곳이야 738 | B: 739 | A: 아브뉴프랑은 롯데마트있는곳이구 740 | 내가생각한덴 앨리웨이! 741 | 광교에앨리웨이라고있어새로오픈항데!! 라고햇징 742 | 아브뉴프랑은 이미상권들어온지좀됏고 743 | 앨리웨이는 얼마안됏어 그래서핫한게마니들어와 744 | B: 앨리웨이는 쇼핑몰같은곳이야?! 745 | A: 음..그냥 똑같애 아브뉴같이 음식점 ㅋㅋ 746 | A: 근데 앨리웨이가 좀더가격대가잇어 약간 ! 747 | B: 아하~!앨리웨이가 음식점 이름이 아니엿구나!ㅋㅋㄱㄱㅋㅋ 748 | B: 아브뉴프랑은 마쟈 749 | B: 진짜 상권들어온지 좀됐구 750 | B: 앨리웨이가보쟈 안가봣으니께ㅋㄱㅋㄱㅋㅋ 751 | A: 앨리웨이는 이제 막 붐 일으키려하는데 752 | 생각보다 잘은안되나봐 753 | 어쨋건 핫한 맛집은 마니들어오더라고 754 | A: 1. 광교 아브뉴 프랑가면 바나나테이블 ! 755 | 2. 광교 앨리웨이 형훈텐동 756 | 3. 광교에 수많른 브런치집중에하나! 757 | B: 가보쟈 앨리웨이ㅋㄱㅋㅋㄱㅋㄱㅋ 758 | B: 형훈텐동이 드레스샵 근처여서 759 | B: 가봣엇거든 맛잇드랏 760 | A: 4. 현백 판교 신승반점? 여기도 평일에도줄스더라 761 | B: 바삭바삭ㅋㄱㅋㄱㄱㅋㄱㅋ 762 | A: ㅇ응응 시건맞으면 앨리웨이가구 763 | B: name1 맛집많이안당ㅋㄱㅋㅋㄱㄱ 764 | A: 봐서그날먹고시픈대로가자 765 | B: 멋있당ㅋㄱㅋㄱㅋㄱㄱㅋ 766 | A: 후보들나열해야할거같아서 나영햇름 767 | B: ㅋㄱㅋㄱㅋㄱㄱ조아조아 768 | B: 안그래도ㅠㅠ배터리충전기도 769 | B: 안가져와갖고ㅠㅠ지금 770 | A: 형훈텐동이 우리원하는대로 시간이안맞을수도이ㅛ어ㅜㅜ 771 | B: 비타500만 마시고 졸음버티다가 772 | B: 집가려구ㅠㅠ 773 | A: 비타500이라니 커피마시지 ㅠㅜ 774 | B: 거기브레이크타임잇웅? 775 | A: 캡슐벌써다먹엇어 ? 776 | B: ㅠㅠ커피는 화장실 가고싶을거가타서 777 | B: ㅠㅠ차막힐때는 집 2시간도걸려봣응ㅠㅠ 778 | A: 그래..맞아 막히면 글치... 779 | B: 웅ㅠㅠ지금 11프로당 배터리갓흑흑 780 | A: 브레이크타임도잇구오픈도 12시인가 늦게하더라구 781 | A: 그래그래 집가서연락해~!! 782 | B: 아항 그냥그럼 목욜에 땡기는거 가쟛ㅋㄱㅋㅋㄱㅋㄱㄱㄱ 783 | A: 운전조심히하시오❤ 784 | B: 저기 저 목록에만 나열되어 785 | B: 있는 음식점들로도 786 | B: 엄청 대단한걸 787 | B: 멋지당ㅋㄱㅋㅋㄱㅋ 788 | A: ㅋㅋ 789 | B: name1는 어디서 다찾아? 790 | B: 음식점?와우 791 | A: 노노 792 | B: 난 인스타 빼고는 793 | A: 지나가다본거 794 | B: 거의없어갖구 795 | B: ㅋㄱㅋㄱㅋㄱ아진짜??! 796 | A: 찾아봐서핫한거말하는거~~ 797 | A: 광교가동네라서말함 ~~ 798 | A: 앨리웨이같은경우 집주볌이라찾아봐서 시댁이랑갓구 799 | B: ㅋㅋㄱㅋㅋㄱ광교 먹을거 많지ㅋㅋㄱㅋㄱㄱ예쁜카페도 많구 800 | A: 거기갓을때 도쿄등심도핫하다는걸알앗고 801 | B: 카페는 진짜 판교도 좋드랑ㅋㄱㅋㄱㅋㄱ아항 802 | A: 앨리웨이 갠찬은거같아서 너랑가려거 찾아봣는데 803 | B: 도쿄등심 아예 처음봣웅 804 | A: 형훈텐동이핻유명해서! 805 | A: 말함 ㅋㄷㅋㄷ 806 | B: 앨리웨이도 그렇구 807 | B: 형훈텐동은 진짜 브레이크타임 808 | A: 동네라서 앎!! ㅋㅋ 809 | B: 기다려서 먹어봣웅ㅠㅠ힘들다능ㅋㄱㄱㅋ 810 | A: 너도 범계에 막 새로뭐들어오면알앗을거하능 811 | A: 암튼 암튼 운전조심해! 812 | B: 웅웅ㅋㄱㅋㄱㅋ근데 범계는 핫하지않응ㅠㅠ음식점들은 별르ㅡ 813 | A: 배터리없으니까 아껴!집가서알려죠!! 814 | B: 죄다 술집이야ㅋㄱㅋㄱㄱㅋㄱㄱㄱ 815 | B: 웅웅고마워ㅋㄱㅋㄱㄱㅋㄱㅋ 816 | A: 집에잘도착했니 ? 817 | B: 이제왓떠ㅠㅠ아까쉬다가왓웅ㅋㄱㅋㄱㅋ와서 배고픈데 818 | B: 지금 생활의달인에서 819 | B: 해물스튜파스타 달인한다ㅋㅋㄱㅋㅋ 820 | B: 요새 대세는 역시 먹는 방송이야ㅋㅋㄱㅋㄱㅋㄱㄱㄱ 821 | A: ㅜㅜ나어떡하니 822 | B: 오잉 왜??? 823 | A: 니가떡볶이먹엇다그래서 ...지금 10시읻데 떡순튀 세트로 시켯어... 824 | B: 와우 지금?ㅋㄱㅋㄱㅋㅋ아까안먹엇웅저녁? 825 | A: 하..진짜 내가 8시이후에는안먹으려고 원칙세웟는데 826 | A: 너무 827 | A: 의지박약이야 828 | A: 고쳐줘....ㅠ 829 | B: 웅ㅠㅠ아이구ㅠㅠ나도 사실 지금 830 | B: 너무배고픈데 831 | B: 뭘먹어야 안찔지... 832 | A: 음..넌 833 | B: 그런음식은 없는데ㅠㅠ 834 | A: 샐러드잇르면샐러드.. 835 | A: ?? 836 | B: 고구마나먹으까ㅠㅠ 837 | B: 한개만? 838 | A: 어 839 | A: 어어그래라 840 | A: 고구마는갠춘 841 | A: 고구마하나만먹어 842 | B: ㅋㅋㄱㅋㄱㄱㅋㄱㄱㄱㄱㄱㄱㄱㅋ 843 | B: 고구마 하나 씻어서 844 | B: 에어프라이어 넣어야겟다 845 | A: 에어프라이기를 846 | A: 아주야무지게사용하는군!!! 847 | A: 몇분이나걸림 ? 848 | B: 좋아 에어프라이어에 한 20분? 849 | B: 이면 파근파근 850 | B: 맛있웅ㅋㄱㅋㄱㅋㄱㅋ군밤도 맛있드라구 851 | B: 요새 이걸로 해먹는 재미가 아주 쏠쏠해 852 | A: 흠.. 853 | A: 20분이나기다려야하는데 854 | A: 1개만만든다구...? 아깝s...나라면 두개넣는다 ㅋㅋㅋㅋㅋ 855 | A: 856 | B: ㅋㅋㅋㅋㅋㅋㅋㅋㅋ아님 그냥 씻고 857 | B: 잘거같아 858 | B: 오늘은ㅠㅠ고구마 먹으면 더 피로회복이 안될것 같아ㅋㄱㅋㄱㅋㄱㅋ 859 | A: 그니까내가이게문제야 860 | A: 진짜돼지새끼도아니고,,;; 861 | A: 어떻게해야하니????때려줘라좀 862 | B: 갑자기 땡길때는답없어ㅋㅋㅋㄱㄱ 863 | B: 나도그랫응ㅠㅠ 864 | B: 아까 말한 그 집이얌??? 865 | A: name2아 난 거의매일그래..그래서살이안빠져... 866 | A: 진지하게고민이란다 867 | A: 아니 거기는 이제문닫앗지 흑흑 ㅠㅠ 868 | A: 그니까이게문제야바바들어바바 869 | 1인분씩안팔고막 최소금액 14000이여야 배달해주자나 ? 870 | B: 웅웅 근데 가성비가 너무좋당ㅠㅠ배달비빼믄 871 | A: 그러니까 걍 14000원을 채워서 시키는거야 872 | 구래서 막 잔뜩왓어 873 | 근데나는 사실상 뱃속에넣을수잇는게 한정적이다?그래서 지금 음식의 20프로도안먹엇는데 다남앗어 흑흣흣흐그흐그흐그흐그ㅡ흐그 874 | A: 무슨가성비? ㅠㅠ갑자기..?;; 875 | B: 헉 14000원을 876 | A: 배달비도들지당근 ㅠㅠ 877 | B: 채운거구나!! 878 | B: 헉대박 879 | A: 14000원을 시켜야지만 880 | A: 배달이되지 881 | A: 배달비따로구 882 | B: 그러네ㅠㅠ가성비가 떨어지는거네 883 | A: 근데이러케안하면배달이안와 ㅠㅠ 884 | B: 나는 예전에 885 | A: 근데그럼나는어쩔수업으니까늘시켜 886 | A: 근데늘 나는 여기서 대부분 다남겨 887 | B: 엽기떡볶이먹을때 888 | A: 어느정도냐면 889 | B: 걍혼자 15000원그릇 다먹고 890 | B: ㅋㅋㄱㅋㄱㅋㄱㅋㄱ배탈나고 891 | B: 난리도아녓어 892 | A: 893 | A: 894 | A: 차라리다먹음 모르겟는데.. 895 | B: 헉!!!!!순대먹고싶다... 896 | A: 그냥 ....... 이렇게잔뜩시키고 897 | A: 이렇게다남겨 898 | B: 남편분은 같이 안드셔???? 899 | A: 이게내가다먹은거야.... 900 | A: name3아직안왓어... 901 | A: 내가이번주12시에온댓잔아... 902 | B: 대박....나도먹고파 지금 903 | B: 그게이번주구나ㅠㅠ 904 | A: 저기서 새우튀김 하나먹고 905 | B: 해먹기가 그렇네 혼자서 906 | B: ㅠㅠ 907 | A: 순대3개집어먹엇구 908 | A: 떡 세개먹엇구 909 | B: 헐...남은거는 넘나아깝다 910 | A: 오뎅한조각먹음 ㅠㅠ흑흑 911 | B: name1이는 많이 못먹는구나ㅠㅠ 912 | A: 이따name3가와서먹고싶음대충먹고 913 | A: 아님갼내일루넘어가 914 | A: 내일먹지 915 | B: 나는 내가 다먹어ㅋㅋㄱㅋㄱㄱㄱㅋ 916 | A: 근데 늘이런식이야 흑흑 917 | A: 흑흑흑흑 918 | B: 흑 아근뎃 순대에 919 | A: 밤에시키면혼좀내줘 920 | B: 튀김옷 한번 더 입혀서 921 | B: 튀기먼 922 | B: 맛있겟다 크크크킄 923 | A: ㅠㅠ 그러케해밧는데 난별로드라고 ㅠㅠ 924 | B: 예전에 학교앞 순대꼬치 엄청 좋아햇거든ㅋㅋㅋㅋ 925 | A: 학교앞에그렁걸팔앗엇구나.....기억못햇름.... 926 | A: 아빨리너네집놀러가서 927 | B: 아아 대학교때 심지어 그런게잇어서 928 | A: 맛잇는거해먹구 커피내려먹고 놀고싶당 929 | A: 근데 내가애기가잇어서 ㅠ잼나게못놀텐데 930 | B: 엄청먹었지ㅋㄱㅋㄱㅋㅋㄱㅋㄱㅋ 931 | A: 내가 진짜 빨리부지런히 name4 맡기구 932 | 대중교통이용해서 망우까지가면 너가망우로픽업나와서 같이 집가서 놀구 시간맞춰서 또 나는 name4데리러 가고 933 | A: 그래야겟다 934 | B: 괘아나ㅋㄱㅋㄱㅋ아가랑 같이오면 나도기쁘지 935 | B: 애기 간식머먹어~?? 936 | A: 내가싫어서 ㅋㅋㅋㅋ 937 | A: 내가 그냥재밋게놀고싶어 938 | B: 히익ㅠㅠㅠ그먼곳카지ㅠㅠ아냐 내가픽업가께 수원으로 939 | A: name4를데려가는거자체부터가나한텐노는게아니라 고생시작임 940 | A: 근데너그럼정식으로사는건 941 | B: 아아ㅠㅠ엄마는 그렇구먼그렇구먼 942 | A: 결혼식이후부터야 ? 943 | B: 웅웅결혼식이후부터야ㅋㅋㅋㄱㄱㅋ 944 | B: 아직 살림살이도 내옷같은것도 안넣엇웅 945 | A: 너무 먼데 또 한번가면 마니놀아야지 946 | 그래서아침일찍가는게낫겟어 947 | A: 그럼결혼리후에 948 | B: 마쟈ㅋㅋㄱㅋㄱㅋㄱㄱㄱ 949 | B: 쭈욱놀다가>< 950 | A: 평일에함갈게 951 | B: 웅웅 952 | A: 글구 나중에 953 | A: name4랑른 954 | A: name3랑같이 955 | A: 카시트태워서 956 | A: 안전하게집들이갈게 957 | B: 그래그래ㅋㄱㅋㄱㅋㄱㅋㅋ놀러오구 남편분이랑 또한번초대하께 958 | B: 959 | A: ㅎㅎ 난그냥너랑 단지놀목적으루다가 960 | B: name1 편하게 놀 수 있게 961 | B: ㅋㅋㄱㅋㄱㅋㄱㅋㄱ나지금 962 | A: 어 편하게뒹굴뒹굴 963 | B: 배고픔보다 뒷목이 아파서 964 | A: 걍 머해먹고 티비보면서같이누워이ㅛ고걍쉬고싶음 965 | B: 롤러 목뒤에 대고잇는데 966 | A: name4데리고가면절대못쉼 967 | B: 진짜시원해 968 | B: name4도놀아주자ㅋㅋㄱㅋㅋㅋ 969 | B: name1 무슨음식잘해? 970 | A: 아니나혼자간다고!!!!!!!@@ 971 | A: 나음식잘하는거업고 972 | B: 나도 가르쳐줘ㅋㅋㅋㅋㅋㄱ 973 | A: 라면 974 | A: 같이만들자 975 | B: 아유ㅠㅠname4두고오기는그렇잖웅ㅠㅠ 976 | A: 난라면 할테니까 977 | A: 왜그려 978 | B: 내가name1이 울집에놀러오면데러가께ㅠㅠ 979 | A: 방금얘기끝난거아녓어 ? 980 | B: 아가보러ㅠㅠ5시이전에 가야되니께ㅠㅠ 981 | A: 내가한번 가고혼자놀러가고 982 | B: 맘편히 못놀러갈까봐ㅠㅠ 983 | B: 아아 984 | A: name4데리고는 985 | A: name3랑간다구 986 | B: 그래서 남편잇을때 애기데리고오고?? 987 | A: 한거아녓어 ?? 988 | A: 어어 989 | B: 아하ㅋㄱㅋㄱㅋㄱㄱㅋㄱㄱㅋ 990 | A: 캬시트가없는데 991 | A: 너무 위험해서 멀어서~ 992 | B: 나완전 헛소리작렬이야ㅋㅋㄱㅋㄱㄱㅋ 993 | B: 오늘 로그아웃직전이야 컨디션이ㅋㄱㅋㅋㄱㄱㄱ 994 | A: 암턴 나혼자가면 라면끓이자 995 | A: 키득키득 996 | A: 997 | A: 그리고 캡슐커피해먹고 피아노쳐줘 998 | B: ㅋㄱㅋㄱㄱㅋㄱㅋㄱㄱ내가머라도 열심히 요리를 배워두께 999 | A: 노노 1000 | B: ㅋㄱㅋㄱㅋㄱㅋㄱㅋ그래그랫 푸핫 1001 | A: 뭐리도열심히하는건 1002 | A: 오빠도잇을때 1003 | B: 피아노연습도 해야겟다ㅋㄱㅋㄱㄱㄱㅋㄱㅋ 1004 | A: name3랑name4가면그때뽐내시고 1005 | A: 나랑놀때는 1006 | A: 편안히 걍 퍼질르자 1007 | B: 듣고픈곡잇웅~??!♡ 1008 | A: ㅋㅋㅋㅋㅋ 1009 | A: 어어내가리스트뽑아서말할게조만간 1010 | A: 난빨리너의홈스윗홈을 보고시플뿐❤ 1011 | B: ㅋㅋㄱㄱㅋㄱㅋㄱㅋㄱㅋㅋ리스트주면 1012 | B: 연습해두께 1013 | B: 오늘도 name1가 준 커피머신으로 1014 | A: ㅋㅋㅋㅋㅋ 1015 | B: 커피내려먹고왓어💕진짜고맙게잘쓰구잇웅 1016 | B: 너무죠아ㅋㄱㅋㄱㅋㅋㄱ 1017 | B: 근데 나 입맛이ㅋㄱㅋㄱㄱ이상한가봐 1018 | A: 망우역 1019 | A: 까지 1020 | A: 너희집에서 1021 | B: 맛구분이없어ㅋㄱㄱㅋㄱㄱㄱㄱㅋ 1022 | A: 자동차로픽업오면 1023 | A: 몇분걸려 ? 1024 | B: 웅ㅋㄱㅋㄱㅋㄱㄱㄱㄲ1시간정도걸려 1025 | A: 시간계산하느라구!!! 1026 | A: 뭐어 1027 | .???? 1028 | A: 1시간 ??? 1029 | B: 차안막히믄ㅋㄱㅋㄱㅋㅋ외곽순환타고와서 1030 | A: 망우에서 1031 | A: 부터 1032 | A: 신혼집까지 ? 1033 | B: 웅웅ㅋㅋㄱㅋㅋㄱ아 1034 | B: 망우?? 1035 | B: 아헷갈렷닷 1036 | A: 예압!!!! 1037 | B: 울집이 양원역이 더 가까워갖구 1038 | A: 내가망우로가면 1039 | 니가망우로 나오면 니집까지몇분걸리냐구!!! 1040 | A: 아하!! 1041 | B: 망우계산해보께 1042 | B: ㄱㄱㅋㄱㅋㄱㅋㄱㄱㄱ 1043 | A: 양원 1044 | A: 역으로 1045 | B: 나 누워서 타자해갖구 한템포 느력ㄱㅋㄱㅋㄱㅋㄱㄱㅋ 1046 | A: 갈게!@ 1047 | A: 양원역에서니집까지 1048 | A: 몇분임 ? 1049 | B: 1050 | B: 요렇게 걸린닷ㅋㄱㅋㄱㅋㅋ근데진심 걸어올거리는아녀 1051 | B: 겁나멀엇응 1052 | A: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 1053 | A: 2분 ? 1054 | A: ㅋㅋㅋㅋㅋㅋ 1055 | A: 그래그럼 1056 | A: 내가 1057 | A: 울집에서 1058 | A: 양원역까지 1059 | B: 차로2분ㅋㄱㅋㄱㅋㄱㄱㄱㅋ 1060 | A: 2시간7분걸린대니까 1061 | A: 9시에출발할게 1062 | A: 그럼너가 11시7분에양원역으로와줘 1063 | B: 그래ㅋㄱㄱㅋㄱㅋㄱㅋㄱㄱㅋㄱㄱㅋ 1064 | A: 그럼 너희집에 11시10분에도착하겟네 1065 | A: 1066 | B: 아근데 이거 결혼하고얘기지?ㅋㄱㅋㄱㅋㄱㅋㄱㄱ 1067 | A: ㅋ러 1068 | A: 어어 1069 | B: 이번주목요일이랑 1070 | A: 당근쓰 1071 | A: 이번주목욜은노놉 1072 | B: 헷갈렷어ㅋㄱㄱㄱㅋㄱㄱㅋㄱㄱㅋ 1073 | A: ㅋㅋㅋㅋㅌㅌㅌㅌ 1074 | A: 내가내가 1075 | B: ㅋㅋㄱㄱㅋㄱㄱㅋㄱ아웃기당 1076 | B: 당 1077 | A: 내가 2시간7분을 1078 | A: 도전해보겟다!!! 1079 | A: 울학겨 1시간 50분 !!! 1080 | B: ㅋㄱㅋㄱㅋㄱㅋㄱ와우 1081 | B: 아님예스라 1082 | A: 그때의기억을 더듬으며 1083 | A: ㅋㅋㅋㅋㅋ개웃기다 1084 | B: 서울에 오는 광역버스잇어?ㅋㄱㅋㄱㄱㄱㄱㅋ 1085 | B: 중간으로 픽업가케ㅋㄱㄱㅋㄱㄱㄱㅋ 1086 | A: 어어 광역버스가 사당역으로가거든 1087 | A: 그래서내가 1088 | A: 사당역르로가서 1089 | A: 이촌으로갈라타서 1090 | B: 내가 수원가면 name1가 부담되낫 1091 | A: 이촌에서 경의중앙선타거 갈게!!! 1092 | A: 기다리고잇러!!! 1093 | A: ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 1094 | B: 내가가면 진짜왕복 2시간20분이믄 1095 | B: 될텐데ㅠㅠ 1096 | A: ㅋㅋㅋㅋㅋㅋㅋㅋ 1097 | B: 너무머나먼길ㅋㄱㅋㄱㅋㄱㄱㄱㅋ 1098 | A: 아냐아냐 나중에집에가능거는 1099 | A: name4땜에 1100 | A: 좀부탁하구 1101 | B: 어휴ㅠㅠ울집올때도 1102 | A: 가는건 아침이니까 !!! 넘힘들어 1103 | A: 내가갈게 1104 | B: 픽업해주러가께ㅠㅠ 1105 | A: 너넘힘듬! 1106 | A: 내가9시에상큼하게출발하면데지 1107 | B: 아님 오빠보고 친정놀러가자해서 1108 | A: 광역버스 을지로까지 1109 | A: 가는거잇는데! 1110 | B: 친정집에서 하루자고 1111 | A: 을지로까지는 1112 | A: 너어때 ? 1113 | A: 종로쪽! 1114 | B: name1이 픽업해서 올라가야겟다ㅋㄱㄱㅋㄱㄱㅋ 1115 | A: 좀낫나?그게그건가 ? 1116 | B: 거기도좋아ㅋㄱㅋㄱㅋㄱㄱㄱㅋ 1117 | A: 오오 그래그럼 1118 | A: 내가 종로쪽으로갈게 1119 | A: 그럼 너도덜부담 나도덜부담 !! 1120 | B: 그건 나중에 고민해보쟠ㄱㅋㄱㅋㄱㅋ 1121 | B: 일단 이번주 목욜날 신나게먹쟈 1122 | B: 기ㅑ캬캬캬 1123 | A: 나는 버스한번만타면 가니까 그건 1시간정도면가 !! 1124 | A: 구래굴개 1125 | A: 1126 | B: 수요일 드레스 셀렉이 끝나면 1127 | B: 조금 마음이 편할거 가탓 1128 | A: 그럼집에갈때도걍 버스타고갈테니까 종로에내려줘 1129 | A: ㅎㅎㄹㅎㅎㅎㅎ 1130 | B: ㅋㅋㄱㄱㅋㄱㄱㅋㄱㄱㄱㅋㄱㄱ웅웅 1131 | A: 아주좋아 1132 | B: 아이고아녀집은 1133 | B: 데려다주께❤그리고 오빠도 픽업해서 데려오께 1134 | A: ㅋㅋㅋㅋ오빠픽업한대 1135 | A: ㅋㅋㅋ 1136 | B: ㅋㄱㅋㄱㄱㄱㅋㄱㄱㅋ다겸사겸사하께 1137 | A: 아암튼ㅇ이얘기는 1138 | A: 나중에하고 1139 | B: 아웃기딩ㅋㄱㅋㄱㄱㅋㄱㄱㄱ 1140 | A: 나지금너무매워 1141 | A: 꾸역꾸역 몇개라도더먹세 1142 | A: 넣고잇는데 ㅠ 1143 | A: 맵다흑 1144 | B: ㅋㄱㅋㄱㅋㄱㅋㄱㅋ체해조심햐 1145 | B: 마실거 있응? 1146 | B: 순대와 떡볶이는 환타랑 먹어야 제격인뎃 1147 | A: ㅋㅋㅌ나환타시로함 ㅠ 불량식품.. 1148 | A: 콜라잇오 1149 | A: 1150 | B: ㅋㄱㅋㄱㅋㄱㅋ콜라 1151 | B: 환타 선배다 1152 | A: 콜라도불량식품이지만ㅁㅁㅁ 1153 | B: 1154 | A: 맛이환타는불량맛 ㅋㅋㅋㅋㅋ 1155 | B: 콜라는 환타보다 형님같은 맛ㅋㄱㅋㄱㅋㄱㅋㅋ 1156 | B: 대선배의 맛 1157 | A: 1158 | A: 투데이쓰눈 1159 | A: 어때 ? 1160 | A: 오늘도 별로로 그렷니 ? 1161 | B: 오 예스라 눈 겁나 이쁘다!!! 1162 | B: 자리가 완전 잡혓구나 1163 | A: 아직 완전은아냐! 1164 | B: 벌써!!!빨리잡혓네 1165 | A: 다들아직좀남앗다구하는데 마니조아졋대! 1166 | B: 눈앞머리를 조금더 속눈썹에 1167 | A: 1달정도는 더 지나면 이제 더더 자연스러울거같대 1168 | B: 가까이그리면돼ㅋㄱㅋㄱㄱㅋ 1169 | B: 웅웅진짜이뻐이뻐 1170 | A: 눈앞머리는 거의안그렷어 ㅠ 1171 | A: 거길채워야되니?ㅠㅠ 1172 | B: 굳굳ㄱㅋㄱㅋㄱㅋㄱㅋ살짝? 1173 | A: 넘답답해보일까바 안그렷는데 1174 | B: 나도 라인은 잘못그려서ㅠㅠ 1175 | A: ㅋㅋㅋㅋㅋㅋㅋㅋ 1176 | B: 근데 진짜이뻐이뻐❤💕 1177 | B: 잘됏당ㅋㄱㅋㄱㅋㄱㅋ잘햇어잘햇어 1178 | A: 퓨...... 1179 | B: 지금 먹는데 톡ㄴ하느라 1180 | B: 체하지않게 1181 | B: 천천히먹그ㅜ 1182 | A: 아니..이제전혀앙머거 ㅠ 1183 | A: 맛업어 ㅠㅠ 1184 | B: 아궁ㅠㅠ나같으면 다먹엇을거야ㅋㄱㅋㅋㄱㄱㄱ 1185 | A: 야아 맞다 그 배달의민족에서 1186 | B: 식신ㅋㄱㅋㄱㄱㄱㄱㄱ 1187 | A: 저번에 총금액 1188 | A: 조회 그걸로 실시간검색 1189 | A: 1위엿다며 1190 | B: 웅웅오잉?진짜? 1191 | A: 근데 그거 막 인간들 캡쳐올리면 천만원응그냥넘기고 8천만원 1192 | A: 1억 인증샷나오고 1193 | B: 난 아예 첨 듣는얘기야 1194 | A: 난리도아니엿대 1195 | B: 헐 그건머지? 1196 | A: ㅋㅋㅌ 검색해바!!! 1197 | A: #배달의민족총주문금액 1198 | A: 얼마전에난리도아니엇어!! 1199 | A: 일반인댓글들도 막 자기 평생월급이 다 여기로갓다면서 어쩌고 저쩌고 ㅋㅋㅋㅋ 1200 | B: 와ㅋㄱㅋㅋㅋㄱㄱㅋ 1201 | B: 지금 눌러서 1202 | B: 보고왓거든 1203 | B: 대박이네ㅋㄱㅋㄱㅋㄱㅋ 1204 | A: 지금 저 이벤트는 끝낫는데 1205 | 고객센터에문의하면알려주거든 1206 | 나도 한 배달음식하니까 ㅋㅋㅋㅋㅋㅋㅋ..마음속으로두려워하면서 1207 | A: 물어봄 1208 | B: 벤쯔라는 먹방 유투버는 억소리난대 1209 | B: ㅋㅋㅋㄱㅋㄱㄱㅋㅋㄱㅋㄱㄱ 1210 | A: 설마 5백만원은 안넘겟지...하면서 1211 | A: ㅋㅋㅋ얼마게 맞춰봐 1212 | B: 얼마나왓어?ㅋㅋㅋㄱㅋㄱㄱ 1213 | A: 업다운!! 1214 | B: 한 500업 1215 | A: ㅋㅋㅋㅋㅋㅋㅋ 1216 | A: 다운이거든 1217 | A: ㅋㅋㅋㅋㅋ5백은심햇다 1218 | B: ㅋㄱㅋㄱㅋㄱㅋㄱ몇년에걸쳐 1219 | B: 그럼 250다운? 1220 | A: 음 만으로 2년꽉꽉 1221 | A: 250 업 ! 1222 | B: ㅋㄱㅋㄱㅋㄱㅋㄱㄱㅋ2년 그렇지 1223 | B: 와우 1224 | B: 330만원다운 1225 | A: 어 다운 1226 | B: ㅋㅋㅋㄱㅋㄱㅋㄱㄱㄱ재밋다이거 1227 | A: ㅋㅋㅋㅋㅋㅋ 1228 | B: 오오 290업 1229 | A: ㅋㅋㅋㅋㅋ 1230 | A: 헐 너 도사다 1231 | A: 291만원 !!! 1232 | A: 이엇어 1233 | A: ㅋㅋㅋㅋㅋㅋㅋㅋ 1234 | B: ㅋㄱㅋㄱㅋㅋㄱㄱㄱㄱ대강 계산해봣거든 1235 | B: 톡하믄서ㅋㄱㅋㅋㄱㄱㄱㅋ 1236 | A: 생각보단 덜나와서다행 1237 | ... 1238 | A: 와대박 1239 | A: 또그걸순간계산함? 1240 | A: 역시똘똘혀 1241 | B: 한달평균ㅋㄱㅋㄱㅋㄱㄱ웅웅ㅋㄱㄱㅋㄱㅋ아녀 1242 | B: 사람들이 외식비용이 1243 | B: 한달에 15만원정도래 1244 | A: 일년에150만원정도은 쳐묵쳐묵 햇읏거같랏지? 1245 | A: ㅋㅋㅋㅋㅋㅋㅋㅌ 1246 | B: 어디서봣지?ㅋㄱㅋㄱㅋㅋㄱㄱㅋ암튼 1247 | A: 한달에15만원? ㅅㅂ난 2주에 15만원쳐먹은거같은데 1248 | A: ㅋㅋㅋㅋㅋㅌㅋ 1249 | A: ㅌㅋㅌㅌㅋㅌㅌㅌㅌㅌㅋㅋㅋ 1250 | B: ㅋㅋㄱㅋㄱㅋㅋㄱㅋㅋㄱ2주에 겁나웃겨 1251 | B: 나ㅠㅠ돈벌엇을때는 1252 | A: ㅋㅋㅋㅌㅌ아이돼지..어쩌니?날좀때려줘라좀 1253 | B: 치킨 피자가 일주일에 1254 | B: 기본이엿응ㅠㅠ 1255 | A: ㅋㅋㅋㅋㅋㅋㅋ 1256 | A: 지금현재!! 1257 | B: 아녀 근데ㅋㄱㅋㄱㅋㄱ먹는거에 비해 진짜마른거아녀?! 1258 | A: 결혼이후마의 라이프 애브리데이! 1259 | A: ㅋㅋ아냐나운아진짜그럼말말아 1260 | B: 나는ㅋㅋㄱㅋㅋㄱ일단 튀김이 너무좋아서 큰일이야 1261 | A: 내원래몸무게에서7키로가쪄잇다는건 1262 | A: 심한거야 1263 | B: 아진짜로?7키로가쪗다고? 1264 | A: 왜안빠지겟어 ㅠ이렇게밤에쳐먹으니까안빠지는거야 1265 | A: 아니아니 15키로쪗엇장아 1266 | B: 얼굴이나 팔 이런곳에 1267 | A: 8키로빠지고 1268 | B: 티가안나서 그런가보다 1269 | A: 7키로가남은거지 1270 | B: ㅠㅠ쥬 1271 | B: 몰랏네와우 1272 | A: 예전에 내팔뚝알잔아 ㅠ 1273 | A: 엄청얇앗엇잔아 1274 | A: 지금은 팔뚝도 살이잇어 ㅠ 1275 | B: 근데 좋겟다ㅠㅠㅠ티가안나잖웅 1276 | A: 난단다 ㅠ 1277 | A: 학원이랑과외에서 1278 | B: 나는 일단 허벅다리가 티가나ㅋㄱㅋㄱㄱㅋㄱㄱㅋ 1279 | A: 미안하지만..살좀빼고사진찍으라고 1280 | A: 욕먹앗어 1281 | B: 엉덩이도 엉덩시 수준이아냐 1282 | A: 지금은약간 경고정도..? 1283 | B: 방뎅이임ㅋㄱㅋㄱㅋㄱㅋㄱㄱ 1284 | A: 근데아마 한달뒤에도안지키면 1285 | B: 아진짜???!! 1286 | A: 또 저번처럼 욕쳐먹을거야 1287 | A: 응.... 1288 | A: 완전예전처람은아니여도 좀 빼야할거같다고 1289 | A: 그 샘이 걍 대놓고말함 1290 | 미안하지만name1씨 빼야할거같아요 1291 | 포샵믿고안빼려면 그냥 이거하지마세요 1292 | 이럼 ㅠ 1293 | B: 과외쌤은 잘 안드실거같아 1294 | B: ㅜㅜ 1295 | B: 헐무섭당 1296 | A: 선생님은 원래돼지엿대 근데병걸렷어서 1297 | B: 나같은 애는 몬하겟다 1298 | A: 빠졋대 1299 | B: ㄱ ㅋㄱㄱㅋㄱㄱㅋㄱㄱ 1300 | A: 갑상선이안좋아졋더니갑자기살이쫙빠졋대 1301 | B: 맨날 먹고 내일빼야지하고ㅠㅠ 1302 | B: 아아쌤은 ㅜㅠ아파서 1303 | B: 빠지시니까 건강챙기시는쪽으로다가 1304 | A: 응 그렇대.... 1305 | B: 엄청 챙겨드셧겟네ㅠㅠ 1306 | A: 그냥 살이저절로빠졋대 1307 | A: 갑상선이원래 1308 | A: 막찌거나 막빠지거나 1309 | A: 둘중하나짆아 1310 | A: 옛날에 가정시간에배웟는데 기억잘안난다 ㅋ ... 1311 | B: 와 근데 갑상선이 1312 | B: 그렇게 무서운거구나 1313 | B: ㅠㅠ살도 저절로빠지고 1314 | A: 응그래서허각도 갑상선암투병히다가 1315 | A: 다시나왓거니 1316 | A: 살쪄잇잔아 1317 | B: 웅웅 허각도 그랫어?? 1318 | B: 나 세상돌아가는 걸 모르고 지냇네ㅠㅠ 1319 | A: 응 걘암이래 1320 | A: 낼은우디가 ?? 1321 | B: 아아ㅠㅠ암투병 진짜 힘드러ㅠㅠ 1322 | B: 낼ㄹ은 퍄노같이햇던 동생이 1323 | B: 화성쪽에서 7시에끝나갖구ㅠㅠ수원가는데 1324 | B: 수원역이라 걍 차두고가려구ㅠㅠ 1325 | B: 카페알바끝나구 집에서 조금자다가 나가도 될거가타ㅋㄱㅋㅋㄱㅋ 1326 | B: 요새ㅠㅠ카페알바 체력이 지치는거 같응ㅠㅠ 1327 | A: 아앗글쿠나 나낼 1328 | A: 면접보러 안양가! 1329 | A: 알바뽑는겅아닌데 ㅋㅋㅋㅌ 나는 알바라고 생각하고 뭐라도하려고 1330 | A: 면접가! 1331 | B: 오오 무슨면접?!!♡ 1332 | B: 아ㅠㅠ낼은 근데 진차진짜보고픈데 1333 | B: 잠깐이라도 쉬고 저녁에 약속가께ㅠㅠname1이 안양와서 1334 | A: 강사 면접 ! 1335 | B: 보고프다ㅠㅠ 1336 | B: 오오 1337 | A: 엉웅 아냐아냐나도 1338 | A: 낼 1339 | B: 벙계?!♡ 1340 | A: 면접보고 바로가려구 1341 | A: 학원가! 1342 | A: 평촌학원가에서!보고 1343 | A: 아마 2시??에출발히면 어차피 넉넉잡아서 얼집으로가면 4시거의되니간! 1344 | B: 웅웅 그래도 안양오니까 커피라도 사주고픈데ㅠㅠ요새 카페다녀오면 완전 퀨ㅇ해갖구 1345 | B: 아아ㅠㅠ글구낭 1346 | A: 난 1347 | A: 넌 1348 | A: 카페알바돌아로면 1349 | B: 낼 잘되면좋겟댯>< 1350 | A: 몇시지 ? 1351 | B: 나바로오면 2시10분정도나 15분돼 1352 | B: ㄱㅋㄱㄱㅋㄱㅋㄱㄱㅋ 1353 | A: ㅋㅋㅋ 그럼안데안데 1354 | A: 만나서하이파이브하거 1355 | A: 떠나야뎀 1356 | B: 낼은ㅠㅠ청첩장 인사도 전화못돌린분들 돌리고ㅠㅠ 1357 | B: 전화아직 못드린분들도 잇는데 1358 | B: 진짜전화할시간도 없어갖고ㅠㅠ톡도그렇구ㅠㅠ 1359 | B: 너무졸려ㅠㅠ진짜 아무것도 안하고 쉬고파ㅠㅠ결혼식 하고 신혼여행가서 폰끄고 푹자고파ㅋㄱㅋㄱㅋㄱㅋㄱㄱㅋ 1360 | B: 낼그럼ㅠㅠ못보고 가겟구나ㅠㅜ그려그려 1361 | A: ㅋㅋㅋㅋㅋ 진짜빡치겟다 1362 | B: 목요인날 신나게놀쟈ㅠㅠ 1363 | A: 금방 그런날이올거야 결혼식도1달남앗는데머 1364 | A: 신행가서 폰머하라까 1365 | B: 웅웅ㅠㅠ진짜폰으로 멀티하기에는ㅠㅠ너무힘들드라구 1366 | A: 어차피 무음히면되고외국인데 ㅋㅋㅋㅋㅋ 1367 | A: 걍 폰은사진찍어야되니까 1368 | A: 냅두고 1369 | B: 청첩장 돌리는거 겁나ㅠㅠ피곤해 이거진짜진심 1370 | A: 편히잇음더ㅣ지 >.< 1371 | B: 우편보내는것도 가야되는데 아오ㅋㅋㄱㄱㅋㄱㅋㄱㄱㅋ 1372 | B: 마댜ㅋㅋㄱㅋㄱㄱㄱㅋ 1373 | B: 빨리 여행가고파ㅠㅠ가서 먹방찍고 1374 | B: 고기먹고 파스타먹고ㅠㅁㅠ그러고팟 1375 | A: 우편을보낸다고..? 1376 | A: 대단하네.... 1377 | A: ㅠㅠ 1378 | B: 웅웅ㅠㅠ멀리사는분들 1379 | A: 리스펙name2.. 1380 | B: 종이첩청장 보내드리려구ㅠㅠ 1381 | A: 그냥모바일보내지.. 1382 | B: 요새는 성의없다고 1383 | B: 싫어하는분들도 1384 | B: 계신대서ㅠㅠ 1385 | A: 아성의없러도어쩌겟니..세상이그렇게변햇는걸 1386 | B: 오히려 어르신들은 괜찮은데 1387 | A: 그거다맞추면서어떻게사니 1388 | A: 어휴 1389 | B: 결혼준비하면서 1390 | A: 너가참이런걸좀고쳐야하능데! 1391 | B: 언니들이나 주변쌤들한테 1392 | B: 들엇는데 1393 | B: 그거 진짜말많드라구 1394 | A: 싫어하능사람잇지당근 1395 | B: 뒷말이 장난아녀ㅋㄱㅋㅋㄱㅋㄱ 1396 | A: 근데그렁사람은걍버려 1397 | A: 어떻게다챙겨 1398 | B: 걍 어차피 뽑아서 많이 남은 청첩장 1399 | A: 싫어하라고해 1400 | B: 우편보내드리려구ㅋㄱㅋㄱㅋㄱㅋㄱ 1401 | B: 기왕이면 먼걸음 오사ㅡㄴ데 1402 | A: 니가사람들못챙기는것도아니고 그간의노력이얼만대 1403 | B: 기분좋게 1404 | B: ㅋㄱㅋㄱㅋㄱㅋㄱㅋㄱㄱㅋ아녀 1405 | A: 그딴걸로 실망을해 1406 | B: 다는 못챙기구살아서 1407 | B: ㅠㅠ근데 1408 | B: 폐백음식 어여시켜야되는데 1409 | A: 아직안시켯어 ? 1410 | B: 이번주에 시키면되겟징? 1411 | B: 웅웅ㅋㄱㅋㄱㄱㅋㅋ 1412 | B: 맘에드는곳 고른곳은 잇거든 1413 | B: 엄마랑 거기서 하기로햇는데 1414 | B: 여태 몬햇다ㅠㅠ 1415 | A: 올마야 ? 1416 | B: 정신이없어갖고ㅠㅠ매번 칭구들 전화오고ㅠㅠ밤에 내가 통화들어주다갓ㅋㄱㅋㄱㅋㄱㅋ못한적도잇어갖고ㅠㅠㅠ그러다가 할머니 모시고와서 2주일은 할머니 챙겨드리고 1417 | B: ㅠㅠㅋㄱㅋㄱㄱㅋㄱㄱㅋㄱㄱ 1418 | A: 안비싸 ??? 1419 | B: 거의 이것저것다하면 60만원돈되겟드라구~! 1420 | B: 55~60정도?됏엇웅 1421 | A: 갠찬네!!!! 1422 | A: 구성갠차느면어여시켜 1423 | B: 오그정도믄 괜찮아?ㅋㄱㅋㄱㅋㄱㄱ 1424 | A: 인터넷으로주문해야해 ? 1425 | B: 웅웅 광진구쪽이셔서 1426 | B: 인터넷으로 바로주문만하믄되는데 1427 | B: 엄마랑 얘기할때 엄마가자고ㅠ쥬 1428 | A: 그럼지금시켜나생각낫을때 1429 | A: 에엥?엄마가가신다구 ? 1430 | B: 그래갖고ㅠㅠ시간이 어긋나서 몬햇웅ㅋㅋㅋㄱㄱㄱㅋ 1431 | A: 광진구까진 ? 1432 | B: 아아 엄마가 자고 주무시고 1433 | B: 그래서 얘기를 할 시간이 없엇웅ㅋㄱㅋㄱㄱㄱㅋㄱ 1434 | A: ㅋㅋ 글쿠나 1435 | A: 빨리자너도이제 ㅠㅠ 1436 | B: 웅웅name1도 자ㅠㅠ오늘 진짜졸려갖고 1437 | B: name1이 저녁늦게먹어서 1438 | B: 속쓰릴텐데 위 안아프게조심하구 1439 | B: 내일 면접도 아자아자화이팅!!♡♡ 1440 | B: 아침은 먹엇웅~~??♡오늘도 어제 먹던떡볶이? 1441 | -------------------------------------------------------------------------------- /data/sample_data.txt: -------------------------------------------------------------------------------- 1 | 대류열 전달 2 | 대류열 전달(Convective heat transfer)은 간단히 대류라고도 하며 이류를 통해 한 장소에서 다른 장소로 열을 전달시키는 것을 말한다. 3 | 열이 물체를 통해서 이동하는 것이 아니라 따뜻해진 유체(액체나 기체)의 흐름에 의해서 고온 부분에서 저온 부분으로 이동하는 현상을 열의 대류라고 한다. 4 | 열전도와는 달라서 대류는 열이 운동하는 유체를 따라서 이동한다. 5 | 이런 점이 열 대류의 특징이다. 6 | 지구 전체는 두꺼운 공기층에 싸여 있다. 7 | 물이나 공기는 대기의 열로 따뜻해져서 활발하게 대류를 이루고 있다. 8 | 이것들이 해류도 되고 바람이 된다. 9 | 이에 의해서 열이 이동하므로 바닷물의 온도와 기온이 지구 위에서 고르게 되어 어떤 곳은 온도가 극도로 높다든다 낮다든가 하는 현상은 없다. 10 | 이 때문에 지구는 공기과 물이 없는 달 등에 비하면 훨씬 살기 좋은 환경에 있는 것이다. 11 | 12 | 물의 가열 13 | 물의 가열은 에너지원을 사용하여 초기 온도보다 높은 온도로 물을 가열하는 전열 과정이다. 14 | 시험관에 물을 반쯤 넣고 밑바닥쪽을 고정시킨 채 물의 윗부분만을 가열하면 윗쪽의 물이 끓는다. 15 | 그러나 바닥 쪽은 가열되지 않아서 그대로 차갑다. 16 | 만약 시험관 대신 구리 막대를 사용해서 같은 실험을 하면, 윗부분만 가열해도 아랫 부분은 손으로 잡을 수 없을 만큼 뜨거워진다. 17 | 이 두 현상의 차이는 물이 구리에 비해서 열의 전달이 좋지 않기 때문이다. 18 | 구리와 물의 열전도율을 비교하면 구리의 열전도율은 물의 약 1000배이다. 19 | 반대로 말하면 물은 구리의 약 100분의 1밖에 열은 전달하지 않는 것이 된다. 20 | 따라서 열전도만으로 시험관 속의 물을 가열하기는 매우 어렵다. 21 | 그러나 시험관의 물도 밑바닥에서 가열하면 전체가 고르게 더워지고, 이윽고 끓게 된다. 22 | 23 | 피막이아과 24 | 피막이아과(---亞科, )는 두릅나무과의 아과이다. 25 | 26 | 온도 측정 27 | 온도 측정(溫度測定, temperature measurement, thermometry)은 즉각적인 평가 또는 나중에 평가하기 위해 현재의 지역 온도를 측정하는 과정을 말한다. 28 | 표준화된 관련 측정으로 구성된 데이터셋을 사용하여 온도 추이를 평가할 수 있다. 29 | 표준화된 온도 측정을 시도한 일은 17세기 이전이었다. 30 | 예를 들어 기원후 170년, 물리학자 갈레노스는 얼음과 끓는 물을 동등한 비율로 섞어서 중립적인 온도 표준을 만들어냈다. 31 | 온도를 측정하려면 물체의 특별한 상태의 변화와 규칙적인 열 팽창을 이용한다. 32 | 보통 사용되는 온도계에는 섭씨 온도 눈금이 표시되어 있다. 33 | 이 온도 눈금은 1742년 스웨덴의 물리학자 셀시우스에 의해서 정해진 것으로, 이것을 나타내는데 30도 C라든가 30℃와 같은 C의 기호를 붙인다. 34 | 이외에 화씨 온도나 절대 온도가 온도 측정에 사용된다. 35 | 섭씨 온도는 다음과 같이 해서 정해지고 있다. 36 | 즉, 얼음이 녹는 온도를 0℃로 하고 또 1기압의 대기 속에서 물이 끓는 온도를 100℃로 결정하고, 0℃와 100℃ 사이를 100등분해서 그것을 1℃로 정하고 있다. 37 | 화씨 온도는 독일의 물리학자 파렌하이트가 1724년에 고안한 것으로, 이 온도를 나타낼 때는 F의 기호를 붙인다. 38 | 화씨 온도에 있어서는 얼음이 녹는 온도를 32℉, 물이 끓는 온도를 212℉로 하고 그 사이를 180등분 해서 1℉로 정하고 있다. 39 | 40 | 평형력 41 | 평형력(平衡力, equilibrant force)은 물체를 정적 평형 상태로 옮기는 힘이다. 42 | 하나의 물체에 여러 가지 힘이 동시에 작용하고, 물체가 정지하거나 또는 등속도 운동을 하고 있을 때, 이러한 힘들은 균형되어 있다고 한다. 43 | 하나의 물체에 작용하는 힘이 동일선상에 있으며, 크기가 같고, 방향이 반대일 때, 이 두 힘은 균형을 이룬다. 44 | 이 경우 두 힘이 동일한 점에 작용하지 않아도 된다. 45 | 어느 쪽으로도 움직이지 않아 승부가 나지 않을 때의 줄다리기나 막대 밀기가 이 예이다. 46 | 47 | 베사라비아 관구 대교구 48 | 베사라비아 관구 대교구 (Mitropolia Basarabiei)는 몰도바에 소재하는 루마니아 정교회의 자치 교회이다. 49 | 관할구역은 몰도바 공화국의 영토로 몰도바인과 루마니아 디아스포라를 대상으로 사목하고있다. 50 | 베사라비아 정교회라고도 한다. 51 | 베사라비아 관구 대교구는 1918년 키시너우 교구로 설립되었고, 1927년 수도 대교구가 되었다. 52 | 소련이 베사라비아 지역을 점령하고 몰도바 소비에트 사회주의 공화국(1944-1991)이 통치를 할 때는 공산주의의 영향으로 교회 활동이 위축되었다. 53 | 1992년 9월 14일 베사라비아의 수도 대교구가 지위를 회복하였고 1995년 관구 대교구로 승격되었다. 54 | 현재의 베사라비아 관구 대주교는 페트루(Petru)이다. 55 | 56 | FC 서울 2020 시즌 57 | FC 서울의 2020 시즌은 창단 후 37번째 시즌이자 최용수 감독의 2기 3년차 시즌이다. 58 | FC 서울 공식 웹사이트 일정 및 결과 59 | 2020 시즌 선수 등록을 완료한 모든 FC 서울 선수 60 | ※ (대후) 표기는 우선지명으로 기 선발된 후 대학에 진학하여 중퇴 및 졸업 후 당해 연도에 입단하는 선수를 의미한다. 61 | ※ (대) 표기는 우선지명으로 선발은 되었지만 당해 연도에 입단하지 않고 대학 진학 후 입단하는 선수를 의미한다. 62 | ※ (직) 표기는 우선지명으로 선발되어 고등학교 졸업 후 당해 연도에 직행으로 입단하는 선수를 의미한다. 63 | ※ (미) 표기는 우선지명으로 선발되었지만 당해 연도 직행 입단 혹은 대학 진학 후 입단 등을 결정하지 못한 진로 미정인 선수를 의미한다. 64 | 65 | 길이의 단위 66 | 길이의 단위는 길이 측정을 위해 쓰이는 임의로 선택된 기준이나 수용된 참조 기준을 말한다. 67 | 길이·시간·무게·온도 등 갖가지 물리량 중에서 가장 간단하게 측정되는 것이 길이이다. 68 | 길이에 대한 단위가 필요하게 된 원인의 하나는 농경지나 거주지의 경계선을 확정하기 위해서였을 것이다. 69 | 현재 영국과 미국 등에서는 관례적으로 푸트가 사용되고 있는데, 이는 사람의 발길이에 유래하고 있다. 고대의 문명이 발달한 지방에서의 단위도 오늘날의 푸트와 같은 정도였을 것이다. 70 | 그 이유는 기구가 없더라도 걸음으로써 간단히 측정할 수 있다는 점과, 택지나 농경지 따위는 푸트를 단위로 하여도 무방하기 때문이었을 것이다. 71 | 한편, 우리나라를 비롯한 중국·일본 등은 예부터 '척'으로 길이의 단위로 삼아 왔으나 현대에는 계량법에 의거, 미터법을 사용하고 있다. 72 | 73 | 필립 리브 74 | 필립 리브(, 1966년 2월 28일 ~ )은 영국의 판타지 · 아동 문학 작가이다. 75 | 76 | 성 삼위일체 대성당 (뉴욕) 77 | 성 삼위일체 대성당(Archdiocesan Cathedral of the Holy Trinity)은 미국 뉴욕 시 어퍼이스트사이드에 위치한 동방 정교회 성당이다. 78 | 콘스탄티노폴리스 총대주교청 미국 그리스 정교회 관구 대교구에 소속되어 있다. 79 | 1891년에 준공되었고 미국에서 두 번째로 설립된 그리스 정교회 사목구이고 뉴욕에서는 첫 번째로 설립된 정교회 사목구이다. 80 | 그리고 서반구에서는 가장 규모가 큰 동방 정교회 교회이다. 81 | 82 | 배설관 83 | 배설관(排泄管), 배출관(排出管), 신관은 척추동물의 콩팥과 비슷한 기능을 수행하는, 한 쌍으로 발견되는 무척추동물의 장기이다. 84 | 원신관(原腎管)은 다세포 동물에서 볼 수 있는 가장 원시적인 배설 기관으로, 편형동물·유형동물·윤형동물 등에서 볼 수 있다. 85 | 이것은 몸의 좌우로 뻗어 있는 주된 관에서 나뭇가지 모양의 가는 관이 몸의 곳곳에 분포하고 있다. 86 | 그 관의 끝에는 불꽃 세포가 있는데, 여기에서 노폐물을 걸러 세관에 이어지는 배설공으로 배출한다. 87 | 불꽃 세포는 깔때기 모양으로 퍼진 큰 세포로, 그 안에는 신축성이 있는 편모의 다발이 있어서, 그 운동으로 노폐물이 세관 내로 유도되는데, 편모 다발의 운동이 마치 불꽃이 흔들리는 것처럼 보인다고 하여 불꽃 세포라 불린다. 88 | 89 | 원 웨이 티켓 90 | 원 웨이 티켓(one-way ticket)은 다음을 의미한다. 91 | 92 | 에로틱 타잔 93 | 《에로틱 타잔》(Jungle Heat, Tarzan-X: Shame Of Jane, Tharzan - La vera storia del figlio della giungla)은 이탈리아에서 제작된 조 다마토 감독의 1994년 드라마 영화이다. 94 | 로코 시프레디 등이 주연으로 출연하였다. 95 | 96 | 교회 해체와 젠더 이데올로기 97 | 《교회 해체와 젠더 이데올로기》(The Destruction of Church and Gender Ideology)는 이정훈이 저술한 책이다. 98 | 2018년 1월 30일 킹덤북스에서 출간되었다. 99 | 책의 목차는 아래와 같다. 100 | 101 | 우익청년 윤성호 102 | 《우익청년 윤성호》(Seongho, The Right wing boy)는 한국에서 제작된 윤성호 감독의 2004년 다큐멘터리 영화이다. 103 | 독립영화인 국가보안법철폐 프로젝트라는 이름으로도 알려져 있다. 104 | 105 | 이효종씨 가족의 저녁식사 106 | 《이효종씨 가족의 저녁식사》(Dinner At Lee's House)는 한국에서 제작된 정희성 감독의 2003년 영화이다. 107 | 한국영화아카데미 등이 제작에 참여하였다. 108 | 109 | 완전한 사육 2007 110 | 《완전한 사육 2007》(Love education, )은 홍콩에서 제작된 오문증 감독의 2007년 스릴러, 공포 영화이다. 111 | 사카가미 카오리 등이 주연으로 출연하였다. 112 | 113 | 죄의 기독교적 관점 114 | 기독교의 기본 교리는 그리스도 품에서의 속죄이기에, 죄의 교리는 기독교의 중심이다. 115 | 죄에 관한 연구이자 기독교 신학의 한 분야인 죄악론 (罪惡論)은, 죄를 하느님의 인격과 기독교 성경법을 멸시하고 다른 사람들을 해치는 그에게의 범죄 행위로 묘사한다. 116 | 기독교인 입장에서 볼 때 이는 인간의 합리적 성질뿐만 아니라 하느님의 본성과 그의 영원한 율법을 위반하는 악한 인간 행위이다. 117 | 성 아우구스티누스의 고전적 정의에 따르면 "하느님의 영원한 율법에 반대하는 말, 행동 또는 욕망"이다. 118 | 기독교 죄악론은 자연법, 기독교 윤리의 개념과 밀접한 관련이 있다. 119 | 일부 학자들 가운데서, 죄는 구속력이 없는 철학적 틀과 기독교 윤리의 관점에 대한 법적 위반 또는 계약 위반으로 이해되며, 따라서 구원은 법적인 용어로 여겨지는 경향이 있다. 120 | 후에 아우구스티누스가 펠라기우스주의자들과의 토론에서 제기했듯이, 다른 기독교 학자들은 죄가 근본적으로 기독교 신에 대한 사랑의 상실과 자애의 증가와 관계 있다고 이해한다. 121 | 죄의 법적 정의와 마찬가지로, 이 정의는 기독교적 은혜와 구원에 대한 이해에도 영향을 미치며, 따라서 관계적 용어로 볼 수 있다. 122 | 123 | 미나리아과 124 | 미나리아과(---亞科, )는 미나리과의 아과이다. 125 | 126 | 인텔리레온 127 | 인텔리레온은 8세대 가라르지방을 배경으로 한 포켓몬스터 소드실드 스타팅 포켓몬들중 물타입 울머기의 최종진화채이다. 128 | 인텔리레온은 도마뱀과 스파이를 모티브로 하여 둘을 결합시킨 형태이다. 129 | 그리고 다이맥스 후에 공격할땐 자신의 한 손을 마치 스파이의 총 모양으로 만들어 공격한다. 130 | 전용기도 노려맞히기라는 기술로 스파이 포켓몬이 쓸만한 기술이다. 131 | 132 | 고수족 133 | 고수족(--族, )은 미나리아과의 족이다. 134 | 135 | 미정의 값 136 | 컴퓨팅(특히 프로그래밍에서) 미정의 값은 문법적으로 유효함에도 불구하고 식이 올바른 값을 가지고 있지 않은 상태이다. 137 | 미정의 값은 빈 문자열, 불리언의 "false", 또는 정의되었으나 비어있는 값과는 구별된다. 138 | 상황에 따라 미정의 값을 평가할 때 예외나 미정의 동작을 일으킬 수 있으며 일부 프로그래밍 언어에서 미정의 값은 예측할만한 일반적인 프로그램 실행 중에 발생할 수 있다. 139 | 동적 자료형 언어들은 일반적으로 미정의 값을 가능하면 명시적으로 처리한다. 140 | 이를테면 펄은 codice_1 연산자가 있어서 이러한 값을 변수로 "할당"할 수 있다. 141 | 다른 형 체계에서 미정의 값은 알 수 없고 예측하지 못하는 값을 의미할 수 있으며 평가 시도 시 프로그램 실패를 일으킬 수 있다. 142 | 143 | 사나이 부르스 144 | 《사나이 부르스》는 한국에서 제작된 김영걸 감독의 1969년 영화이다. 145 | 박노식 등이 주연으로 출연하였고 차태진 등이 제작에 참여하였다. 146 | 147 | 비애 148 | 비애는 다음을 의미한다. 149 | 150 | 비애 (1952년 영화) 151 | 《비애》(Ruby Gentry)는 미국에서 제작된 킹 비더 감독의 1952년 드라마, 멜로/로맨스 영화이다. 152 | 제니퍼 존스 등이 주연으로 출연하였다. 153 | 154 | 비애 (1990년 영화) 155 | 《비애》(La Putain Du Roi, The King's Whore)는 영국에서 제작된 엑셀 코티 감독의 1990년 드라마 영화이다. 티모시 달튼 등이 주연으로 출연하였고 모리스 베르나르트 등이 제작에 참여하였다. 1990년 칸 영화제에 출품되었다. 156 | 157 | 원산지관리사 158 | 무역분야 자격증 159 | ・ 관세사 160 | ・ 원산지관리사 161 | ・ 보세사 162 | ・ 물류관리사 163 | ・ 국제무역사 164 | ・ 무역영어 165 | ・ 유통관리사 166 | ・ 무역관리사 167 | 국가전문인력채용 지원금 대상자격 168 | ・ 변호사 169 | ・ 변리사 170 | ・ 세무사 171 | ・ 관세사 172 | ・ 경영지도사 173 | ・ 원산지관리사 174 | ・ 공인노무사 175 | ・ 공인회계사 176 | 2010년 6월 제1기 원산지관리사 시험시행하여 2019년 12월 현재, 27기 원산지관리사를 배출. 177 | 2012년 12월27일 관세청으로부터 국가공인을 획득 한 7년차 국가공인자격이다. 178 | 원산지관리사의 업무는 크게 다음과 같다. 179 | 1. 원산지관리사는 FTA 발효국가와 무역거래기업, 관련국가 물류업체들에게 FTA 특혜관세혜택을 누릴 수 있도록 지식서비스를 제공한다. 180 | 2. 원산지관리사는 수출입관련 기업 현장에서 사업기획, 생산 및 구매전략, 원산지관리실무, 원산지 관리시스템 운영 등의 직무를 수행한다. 181 | 3. 원산지관리사는 FTA 특혜관세 혜택을 향유하기 위해, 전략적 수출지역 선정 및 체약국별 원가개선효과를 분석하고, 글로벌 생산과 조달 네트워크를 구축한다. 182 | 관세청이 국제원산지정보원으로 시행을 위임하면서 원산지관리사 뿐만아니라 실무에 포커스를 맞춘 원산지실무사의 시험도 국제원산지정보원이 시험을 주관한다. 183 | 시험은 1년에 통상 2회실시. 184 | 국가공인을 획득 한 해인 2012년부터 초반까지는 연3회 실시한 해도 있었으나, 어느순간 다시 연2회로 굳어졌다. 185 | FTA 특혜관세 수요에 따라 국가가 합격자 TO를 조절하고 있다는 평. 186 | 비교적 무난한 난이도로 고득점 할 수 있는 과목. FTA 관련법령의 암기가 필요하다. 187 | FTA협정의 경우 매년 추가되고 있으므로 암기해야 할 법령 또한 늘어난다. 188 | 한국의 경우 FTA를 공격적으로 추진하고 있는 국가이므로 원산지관리사를 취득하려면 추가적인 협정이 늘어나기전에 빨리 취득하는 것이 이득. 말장난이 심하기 때문에 수험자에따라서 의외로 어려워 하는 수험자도 적지 않은편. 벼락치기나 속독을 통한 유추학습이 잘 안통하는 시험이므로 충분한 이해를 바탕으로 한 꼼꼼한 반복회독이 필요하다. 189 | 원산지관리사에서 과락이 가장 많이 발생하는 자타공인 킬링파트. 97개의 류와 5,000개 이상의 호를 달달달 외워야만 하는 과목이다. 190 | 그리고 HS-CODE가 변환되는 세번변경통칙은 씹어먹을 수준으로 이해를 해야 손을 댈 수 있는 과목. 관세사 2차시험에나 나올법한 내용들이 원산지관리사의 품목분류 파트에서 공부를 해야한다. 191 | 여기서 많은 수강생들이 포기하며 실제로 과락율 또한 매우 높은 수준. 특히 한국의 주력산업인 자동차, 전자, 철강, 기계류부분은 호까지 완벽하게 암기하지 않으면 과락을 면하지 못할 가능성이 높다. 192 | 각 협정별 원산지결정기준 등 법률조항과 규칙등의 암기와 이해가 필요하다. 193 | 특히 계산문제들이 점점 까다로워지고 있으며 아예 교재에서는 전략적으로계산문제는 패스 해버리라고 나와있다. 194 | 충분한 이해를 통한 암기가 이루어지지 않을 경우 풀 수 없는 문제들이 많아 꼼꼼한 공부가 필요하다. 195 | 품목분류만큼은 아니지만 수험생들이 적잖히 고전하는 과목. 196 | 무역관련 전공자라면 조금 공부하면 고득점이 가능한 과목이다. 197 | 평이한 난이도의 암기문제가 대부분이나 중간중간 등장하는 세율 및 금액계산과 날짜계산 문제는 상당히 골치아프다. 198 | 199 | 꿩먹고 알먹고 200 | 《꿩먹고 알먹고》는 한국에서 제작된 심우섭 감독의 1966년 영화이다. 201 | 서영춘 등이 주연으로 출연하였고 박의순 등이 제작에 참여하였다. 202 | 203 | 수정탕 둘째 딸 204 | 《수정탕 둘째 딸》(Good Yeon-Ha)는 한국에서 제작된 박이웅 감독의 2008년 영화이다. 205 | 한지율 등이 주연으로 출연하였고 황선영 등이 제작에 참여하였다. 206 | 207 | 눈 감으면 보이는 세상 208 | 《눈 감으면 보이는 세상》은 한국에서 제작된 배경윤 감독의 1996년 영화이다. 209 | 오광록 등이 주연으로 출연하였고 배경윤 등이 제작에 참여하였다. 210 | 211 | 대결투 212 | 대결투는 다음을 의미한다. 213 | 214 | 대결투 (1971년 영화) 215 | 《대결투》(大決鬥, The Duel)는 홍콩에서 제작된 장철 감독의 1971년 액션, 드라마 영화이다. 216 | 적룡 등이 주연으로 출연하였다. 217 | 218 | 호소자 219 | 《호소자》(好小子, Young Dragons: Kung Fu Kids)는 타이완에서 제작된 장미군 감독의 1986년 액션 영화이다. 220 | 안정국 등이 주연으로 출연하였다. 221 | 222 | 그들에겐 각자의 몫이 있다 223 | 《그들에겐 각자의 몫이 있다 224 | 》(To Each His Own)는 미국에서 제작된 밋첼 레이슨 감독의 1946년 영화이다. 225 | 올리비아 드 하빌랜드 등이 주연으로 출연하였고 찰스 브래킷 등이 제작에 참여하였다. 226 | 227 | 급동기협 228 | 《급동기협》(急凍奇俠: Iceman Cometh)은 홍콩에서 제작된 곽요량 감독의 1989년 영화이다. 229 | 원표 등이 주연으로 출연하였고 추문회 등이 제작에 참여하였다. 230 | 출시명은 청옥불이다. 231 | 232 | 호스 위스퍼러 233 | 《호스 위스퍼러》(The Horse Whisperer)는 미국에서 제작된 로버트 레드포드 감독의 1998년 드라마, 멜로/로맨스 영화이다. 234 | 로버트 레드포드 등이 주연으로 출연하였고 패트릭 마키 등이 제작에 참여하였다. 235 | 236 | 웅이 이야기 237 | 《웅이 이야기》(Woong's Story)는 한국에서 제작된 이하송 감독의 2007년 드라마, 가족 영화이다. 김우석 등이 주연으로 출연하였다. 238 | 239 | 행복의 조건 240 | 행복의 조건은 다음을 의미한다. 241 | 242 | 행복의 조건 (1959년 영화) 243 | 《행복의 조건》는 한국에서 제작된 이봉래 감독의 1959년 영화이다. 244 | 윤일봉 등이 주연으로 출연하였고 이래원 등이 제작에 참여하였다. 245 | 246 | 화류춘몽 247 | 《화류춘몽》은 한국에서 제작된 박성복 감독의 1958년 영화이다. 248 | 최봉 등이 주연으로 출연하였고 최일 등이 제작에 참여하였다. 249 | 250 | 영구와 땡칠이 2 251 | 《영구와 땡칠이 2 - 소림사 가다》(영구와 땡칠이 소림사 가다: Yong-Gu And Taeng-Chiri Go To Sorim Temple)는 한국에서 제작된 남기남 감독의 1989년 가족, 모험, 액션, 코미디 영화이다. 252 | 심형래 등이 주연으로 출연하였고 정욱 등이 제작에 참여하였다. 253 | 254 | 삼천포 아가씨 255 | 《삼천포 아가씨》는 한국에서 제작된 강찬우 감독의 1966년 영화이다. 256 | 황정순 등이 주연으로 출연하였고 김태현 등이 제작에 참여하였다. 257 | 258 | 여대생의 첫 욕망 259 | 《여대생의 첫 욕망》(Premiers Desirs, First Desires)은 프랑스에서 제작된 데이비드 해밀턴 감독의 1983년 드라마, 멜로/로맨스 영화이다. 260 | 모니카 브로에크 등이 주연으로 출연하였고 알레인 테르지안 등이 제작에 참여하였다. 261 | 262 | 은하에서 온 별똥왕자 3 - 은하열차 88 263 | 《은하에서 온 별똥왕자 3 - 은하열차 88》(The Meteor Prince From The Milky Way 3)는 한국에서 제작된 석도원 감독의 1988년 영화이다. 264 | 이건주 등이 주연으로 출연하였고 박재홍 등이 제작에 참여하였다. 265 | 266 | 달과 꼭지 267 | 《달과 꼭지》(La Teta Y La Luna, The Tit And The Moon)는 프랑스에서 제작된 비가스 루나 감독의 1994년 코미디 영화이다. 268 | 비엘 듀란 등이 주연으로 출연하였고 안드레스 빈센테 고메스 등이 제작에 참여하였다. 269 | 270 | 매화방 천둥불 271 | 《매화방 천둥불》(Light Of Maehwabang)는 한국에서 제작된 이광섭 감독의 1989년 멜로/로맨스 영화이다. 272 | 한명구 등이 주연으로 출연하였고 김원두 등이 제작에 참여하였다. 273 | 274 | 평양 기생 275 | 《평양 기생》은 한국에서 제작된 이규웅 감독의 1966년 영화이다. 276 | 신영균 등이 주연으로 출연하였고 이수길 등이 제작에 참여하였다. 277 | 278 | 죽는 자를 위한 기도 279 | 《죽는 자를 위한 기도》(A Prayer For The Dying)는 미국에서 제작된 마이크 호지스 감독의 1987년 액션, 드라마 영화이다. 280 | 미키 루크 등이 주연으로 출연하였고 사무엘 골드윈 주니어 등이 제작에 참여하였다. 281 | 282 | 투 문 정션 2 283 | 《투 문 정션 2》(Return To Two Moon Junction)는 미국에서 제작된 파하드 맨 감독의 1995년 영화이다. 284 | 멜린다 285 | 클락 등이 주연으로 출연하였고 멜 펄 등이 제작에 참여하였다. 286 | 287 | 백 투 백 288 | 백 투 백(Back to Back, back-to-back)은 다음을 의미한다. 289 | 290 | 아메리칸 신디케이트 2 - 백 투 백 291 | 《아메리칸 신디케이트 2 - 백 투 백》(Back To Back)는 미국에서 제작된 로저 나이거드 감독의 1996년 액션, 드라마 영화이다. 292 | 마이클 루커 등이 주연으로 출연하였고 아키 코민 등이 제작에 참여하였다. 293 | 294 | 자매의 화원 295 | 《자매의 화원》(A Sister's Garden)는 한국에서 제작된 신상옥 감독의 1959년 드라마 영화이다. 최은희 등이 주연으로 출연하였고 신상옥 등이 제작에 참여하였다. 1959년 개봉 후 2018년 2월 26일 대한민국에서 재개봉되었다. 296 | 297 | 하노버 스트리트 298 | 《하노버 스트리트》(Hanover Street)는 영국에서 제작된 피터 하이암스 감독의 1979년 드라마, 액션, 모험, 멜로/로맨스 영화이다. 299 | 해리슨 포드 등이 주연으로 출연하였고 폴 라자러스 3세 등이 제작에 참여하였다. 300 | 301 | 여자 19세 302 | 《여자 19세》는 한국에서 제작된 김수용 감독의 1964년 영화이다. 303 | 강신성일 등이 주연으로 출연하였고 백완 등이 제작에 참여하였다. 304 | 305 | 악마 같은 여자 306 | 《악마 같은 여자》(Saving Silverman)는 미국에서 제작된 데니스 듀간 감독의 2001년 코미디 영화이다. 307 | 제이슨 빅스 등이 주연으로 출연하였다. 308 | 309 | 하얀 면사포 310 | 《하얀 면사포》(Noce Blanche, White Wedding)는 프랑스에서 제작된 장-클로드 브리소 감독의 1989년 드라마, 멜로/로맨스 영화이다. 311 | 바네사 파라디 등이 주연으로 출연하였고 마가렛 메네고즈 등이 제작에 참여하였다. 312 | 313 | 월급봉투 314 | 《월급봉투》는 한국에서 제작된 김수용 감독의 1964년 영화이다. 315 | 신영균 등이 주연으로 출연하였고 박원석 등이 제작에 참여하였다. 316 | 317 | 남자는 괴로워 318 | 남자는 괴로워는 다음을 의미한다. 319 | 320 | 남자는 괴로워 (1973년 영화) 321 | 《남자는 괴로워》(L'Evenement Le Plus Important Depuis Que L'Homme A Marche Sur La Lune)는 이탈리아에서 제작된 자크 데미 감독의 1973년 영화이다. 322 | 까뜨린느 드뇌브 등이 주연으로 출연하였다. 323 | 324 | 사귀는 사람 있니 325 | 《사귀는 사람 있니》(Are You Seeing Anyone)는 한국에서 제작된 김형주 감독의 2002년 드라마, 멜로/로맨스 영화이다. 326 | 김태훈 등이 주연으로 출연하였다. 327 | 328 | 노란 샤쓰 입은 사나이 329 | 《노란 샤쓰 입은 사나이》는 한국에서 제작된 엄심호 감독의 1962년 영화이다. 330 | 신영균 등이 주연으로 출연하였고 차태진 등이 제작에 참여하였다. 331 | 332 | 구타 유발자... 333 | 잠들다 334 | 《구타 유발자... 335 | 잠들다》(Four Million Blows)는 한국에서 제작된 유정현 감독의 1999년 영화이다. 336 | 유정현 등이 주연으로 출연하였다. 337 | 338 | 아랑 드롱의 조로 339 | 《조로》(Zorro)는 이탈리아, 프랑스에서 제작된 듀시오 테사리 감독의 1975년 모험, 서부 영화이다. 340 | 알랭 들롱 등이 주연으로 출연하였고 루치아노 마르티노 등이 제작에 참여하였다. 341 | 342 | 가리베가스 343 | 《가리베가스》(Garivegas)는 한국에서 제작된 김선민 감독의 2005년 영화이다. 344 | 이윤미 등이 주연으로 출연하였다. 345 | 346 | 사랑도 흥정이 되나요? 347 | 《사랑도 흥정이 되나요? 348 | 》(Combien Tu M'Aimes?, How Much Do You Love Me?)는 프랑스에서 제작된 베르뜨랑 블리에 감독의 2005년 코미디, 드라마, 멜로/로맨스 영화이다. 모니카 벨루치 등이 주연으로 출연하였고 올리비에 델보스크 등이 제작에 참여하였다. 349 | 350 | 놀부 흥부 351 | 《놀부 흥부》는 한국에서 제작된 김조성 감독의 1925년 영화이다. 352 | 문수일 등이 주연으로 출연하였고 하야가와 고슈 등이 제작에 참여하였다. 353 | 354 | 배우 수업 355 | 배우 수업은 다음을 뜻한다. 356 | 357 | 배우 수업 (1978년 영화) 358 | 《배우 수업》은 한국에서 제작된 이형표 감독의 1978년 영화이다. 359 | 이대근 등이 주연으로 출연하였고 강대진 등이 제작에 참여하였다. 360 | 361 | 작은 이야기 362 | 《작은 이야기》(Small Story)는 한국에서 제작된 진영기 감독의 2002년 멜로/로맨스 영화이다. 363 | 박치화 등이 주연으로 출연하였다. 364 | 365 | 누가 해변에서 함부로 불꽃놀이를 하는가 366 | 《누가 해변에서 함부로 불꽃놀이를 하는가》는 한국에서 제작된 조여래 감독의 2008년 드라마 영화이다. 367 | 백승현 등이 주연으로 출연하였고 최선용 등이 제작에 참여하였다. 368 | 369 | 3일 간의 전쟁 370 | 3일 간의 전쟁은 다음을 의미한다. 371 | 372 | 내일은 뭐 할거니 373 | 《내일은 뭐 할거니》는 한국에서 제작된 이봉원 감독의 1986년 영화이다. 374 | 강석현 등이 주연으로 출연하였고 이봉원 등이 제작에 참여하였다. 375 | 376 | 꿈꾸는 식물 377 | 《꿈꾸는 식물》(Dreaming Plant)은 한국에서 제작된 최기풍 감독의 1990년 멜로/로맨스 영화이다. 378 | 김진화 등이 주연으로 출연하였고 임종구 등이 제작에 참여하였다. 379 | 380 | 리크텐스테이니아속 381 | 리크텐스테이니아속(lichtensteinia屬, )은 미나리아과의 단형 족인 리크텐스테이니아족(lichtensteinia族, )에 속하는 유일한 속이다. 382 | 속명은 독일의 생물학자인 마르틴 힌리히 리히텐슈타인(Martin Hinrich Lichtenstein)의 이름을 따 지어졌다. 383 | 384 | 캉캉 69 385 | 《캉캉 69》는 한국에서 제작된 석도원 감독의 1992년 에로, 멜로/로맨스, 드라마 영화이다. 386 | 유연실 등이 주연으로 출연하였고 강미영 등이 제작에 참여하였다. 387 | 388 | 거친 녀석들 389 | 거친 녀석들은 다음을 의미한다. 390 | 391 | 거친 녀석들 (2007년 영화) 392 | 《거친 녀석들》(Wild Hogs)은 미국에서 제작된 월트 벡커 감독의 2007년 모험, 코미디 영화이다. 393 | 팀 알렌 등이 주연으로 출연하였고 브라이언 로빈스 등이 제작에 참여하였다. 394 | 395 | 배꼽 버스 396 | 《배꼽 버스》는 한국에서 제작된 박광우 감독의 1995년 코미디, 멜로/로맨스 영화이다. 397 | 김수정 등이 주연으로 출연하였고 김보식 등이 제작에 참여하였다. 398 | 399 | 무도회의 수첩 400 | 《무도회의 수첩》(Un Carnet De Bal, Dance Of Life)는 프랑스에서 제작된 줄리앙 뒤비비에르 감독의 1937년 영화이다. 401 | 아리 보르 등이 주연으로 출연하였다. 402 | 403 | 불타는 김 대리의 밤 404 | 《불타는 김 대리의 밤》(Mr. Kim's Burning Night)은 한국에서 제작된 공부성 감독의 2007년 드라마, 코미디 영화이다. 박재현 등이 주연으로 출연하였다. 405 | 406 | 별 3형제 407 | 《별 3형제》는 한국에서 제작된 김기 감독의 1977년 영화이다. 408 | 전호진 등이 주연으로 출연하였고 이전철 등이 제작에 참여하였다. 409 | 410 | 오버 미 411 | 《오버 미》(Over Me)는 한국에서 제작된 임창재 감독의 1996년 영화이다. 412 | 이용이 등이 주연으로 출연하였고 임창재 등이 제작에 참여하였다. 413 | 414 | 웬일이니 415 | 《웬일이니》는 한국에서 제작된 진준랑 감독의 1983년 영화이다. 416 | 하원 등이 주연으로 출연하였고 정창화 등이 제작에 참여하였다. 417 | 418 | 마를로티엘라 419 | 마를로티엘라(marlothiella, )는 미나리아과의 단형 족인 마를로티엘라족(marlothiella族, )의 단형 속인 마를로티엘라속(marlothiella屬, )에 속하는 유일한 종이다. 420 | 나미비아에 분포한다. 421 | 422 | 임 그리워 423 | 《임 그리워》는 한국에서 제작된 고영남 감독의 1970년 영화이다. 424 | 최무룡 등이 주연으로 출연하였고 전석진 등이 제작에 참여하였다. 425 | 426 | 이자벨 에버하트 427 | 《이자벨 에버하트》(Isabelle Eberhardt)는 프랑스에서 제작된 이안 프링글 감독의 1991년 드라마 영화이다. 428 | 마틸다 메이 등이 주연으로 출연하였고 다니엘 샤프 등이 제작에 참여하였다. 429 | 430 | 하얀 외침 검은 태양 431 | 《하얀 외침 검은 태양》(Le Brasier)은 프랑스에서 제작된 에릭 바비에 감독의 1991년 드라마 영화이다. 432 | 마루츠카 데트메르스 등이 주연으로 출연하였다. 433 | 434 | 미나리족 435 | 미나리족(---族, )은 미나리아과의 족이다. 436 | 437 | 베로니카 게린 438 | 베로니카 게린(Veronica Guerin, 1958년 7월 5일 ~ 1996년 6월 26일)은 마약왕들에 의해 살해된, 아일랜드의 범죄를 알린 기자이다. 439 | 학교에 운동선수로 재학하였다가 나중에 아일랜드 축구, 농구팀에서 경기를 뛰었다. 440 | 회계를 공부한 뒤 7년 간 홍보 업무를 진행했고 그 뒤 피어너 팔에서 Seán Haughey의 선거 대리인으로 있었다. 441 | 1990년 기자가 되어 선데이 브즈니스 포스트와 선데이 트리뷴에 기사를 썼다. 442 | 1994년 선데이 인디펜던트에서 범죄에 관해 기사를 쓰기 시작했다. 443 | 1996년, 신호등에 멈춰서 있는 동안 치명적인 총상을 당했다. 444 | 이 총상은 아일랜드의 분노를 샀다. 445 | 그녀의 사망에 관한 조사 이후 수많은 체포와 유죄선고가 잇따랐다. 446 | 447 | 베로니카 게린 (영화) 448 | 《베로니카 게린》(Veronica Guerin)는 영국에서 제작된 조엘 슈마허 감독의 2003년 드라마 영화이다. 449 | 케이트 블란쳇 등이 주연으로 출연하였고 제리 브룩하이머 등이 제작에 참여하였다. 450 | 더블린의 마약 거래를 조사하다가 결국 1996년 37세의 나이로 죽임을 당한 아일랜드의 기자 베로니카 게린에 초점을 두고 있다. 451 | 452 | 테오레마 453 | 《테오레마》(Theorem, Teorema)는 이탈리아에서 제작된 피에르 파올로 파졸리니 감독의 1968년 드라마, 미스터리 영화이다. 454 | 실바나 망가노 등이 주연으로 출연하였고 마놀로 볼로그니니 등이 제작에 참여하였다. 455 | 456 | 잊을 수 없는 순간 457 | 《잊을 수 없는 순간》은 한국에서 제작된 이강윤 감독의 1985년 드라마 영화이다. 458 | 김덕영 등이 주연으로 출연하였고 정도환 등이 제작에 참여하였다. 459 | 460 | 우희준 461 | 우희준은 2018년 인도네시아 자카르타 아시안 게임 대한민국 국가대표 참가자 출신이고 동시에 2019년 대한민국 미스코리아 선(善) 출신이다. 462 | 463 | 위험한 남편 464 | 《위험한 남편》(危險한 男便)은 한국에서 제작된 이용민 감독의 1970년 영화이다. 465 | 남정임 등이 주연으로 출연하였고 주동진 등이 제작에 참여하였다. 466 | 467 | 윌리엄 캠벨 (1841년) 468 | 윌리엄 캠벨(William Campbell, 甘為霖, 1841년~1921년)은 청나라 말기 대만에서 선교 활동을 했던 스코틀랜드 출신의 장로교 선교사이다. 469 | 그는 대만과 관련된 주제에 대해 폭넓게 썼으며, 맹인학교도 설립했다. 470 | 그 섬의 초기 역사(특히 네덜란드 시대)에 관심이 많았던 당시 그의 지식은 “의심할 여지 없이 이 주제에서는 가장 위대한 권위자”라고 불릴 정도였다. 471 | 그는 일월담호를 보게 된 최초의 유럽인이었을 것이며, 그는 17세기 네덜란드 선교사 조지 칸디디우스를 기리기 위해, 그 호수를 칸디디우스호(Lake Candidius)라고 이름 지었다. 472 | 캠벨은 1871년 청나라가 다스리는 대만에 도착해 대만 남부(현대의 타이난)에 자리잡았고, 이 지역에서 한족과 대만 원주민을 모두에게 선교를 펼쳤다. 473 | 그는 대만에서 선교활동을 하던 토머스 바클레이, 제임스 레이드라프 맥스웰, 조지 레슬리 맥케이 등과 동시대의 사람이었다. 474 | ‘원주민 성직자’(즉 한족와 원주민 성직자들)의 가장 강력한 지지자였던 캠벨은 다음과 같은 한 특별한 사건에 대해 썼다. 475 | 캠벨은 청불 전쟁에 대한 기록을 남겼을 뿐만 아니라, 일본의 점령과 대만의 전환을 목격했다. 476 | 그의 선교는 그가 1917년 마지막으로 대만을 떠나 1921년 고향인 스코틀랜드로 돌아갈 때까지 46년간 지속되었다. 477 | 478 | 영광의 침실 479 | 《영광의 침실》은 한국에서 제작된 김응천 감독의 1959년 영화이다. 480 | 황해 등이 주연으로 출연하였고 김동식 등이 제작에 참여하였다. 481 | 482 | 미국 제18공수군단장 483 | 다음은 제18(XVIII)공수군단의 군단장의 목록이다. 484 | 485 | 둘 하나 섹스 486 | 《둘 하나 섹스》(Yellow Flower)는 한국에서 제작된 이지상 감독의 1998년 드라마 영화이다. 487 | 김중기 등이 주연으로 출연하였다. 488 | 489 | 버스를 타다 490 | 《버스를 타다》(Bus Stop)는 한국에서 제작된 주형진 감독의 2006년 드라마, 공포, 스릴러 영화이다. 491 | 하시은 등이 주연으로 출연하였다. 492 | 493 | 모의 법정 (영화) 494 | 《모의 법정》(Listen To Me)은 미국에서 제작된 더글러스 데이 스튜어트 감독의 1989년 영화이다. 495 | 크리스토퍼 앳킨스 등이 주연으로 출연하였다. 496 | 497 | 오부자 498 | 오부자는 다음을 의미한다. 499 | 500 | 오부자 (1969년 영화) 501 | 《오부자》(五父子, Father and Sons)는 한국에서 제작된 권철휘 감독의 1969년 코미디 영화이다. 502 | 김희갑 등이 주연으로 출연하였고 신상옥 등이 제작에 참여하였다. 503 | 504 | 구름 저편에 505 | 《구름 저편에》(Par-Dela Les Nuages, Beyond The Clouds)는 독일에서 제작된 감독미켈란젤로 안토니오니, 빔 벤더스 감독의 1995년 드라마, 멜로/로맨스 영화이다. 506 | 화니 아르당 등이 주연으로 출연하였고 필립 카카손 등이 제작에 참여하였다. 507 | 508 | 사랑의 파도 509 | 《사랑의 파도》(Sea Of Love)는 미국에서 제작된 해롤드 벡커 감독의 1989년 네오누아르 범죄, 스릴러, 드라마 영화이다. 510 | 알 파치노 등이 주연으로 출연하였고 마틴 브레그먼 등이 제작에 참여하였다. 511 | 512 | 나는 너를 천사라고 부른다 513 | 《나는 너를 천사라고 부른다》(I Call You Angel)는 한국에서 제작된 김인수 감독의 1992년 드라마 영화이다. 514 | 강리나 등이 주연으로 출연하였고 홍면유 등이 제작에 참여하였다. 515 | 516 | 소파 승진 517 | 《소파 승진》(Promotion Canape)은 프랑스에서 제작된 디디에 카민카 감독의 1990년 코미디 영화이다. 518 | 마르고 아바스칼 등이 주연으로 출연하였다. 519 | 520 | 검은 장갑 521 | 《검은 장갑》은 한국에서 제작된 김성민 감독의 1963년 영화이다. 522 | 박노식 등이 주연으로 출연하였고 오석조 등이 제작에 참여하였다. 523 | 524 | 미, 마이셀프 525 | 《미, 마이셀프》(ขอให้รักจงเจริญ, Me... Myself)는 태국에서 제작된 퐁파트 와치라번종 감독의 2007년 멜로/로맨스, 드라마, 코미디 영화이다. 526 | 아난다 에버링햄 등이 주연으로 출연하였고 피야락 마하타나삽 등이 제작에 참여하였다. 527 | 528 | 삽질, 텍사스 529 | 《삽질, 텍사스》(Shoveling, TEXAS)는 한국에서 제작된 성시흡 감독의 2008년 코미디, 판타지 영화이다. 530 | 안치욱 등이 주연으로 출연하였다. 531 | 532 | 에덴의 서쪽 533 | 《에덴의 서쪽》은 한국에서 제작된 권영순 감독의 1994년 드라마, 멜로/로맨스 영화이다. 534 | 문태선 등이 주연으로 출연하였고 K.Y. 림 등이 제작에 참여하였다. 535 | 536 | 지구여 멈춰라 내리고 싶다 537 | 《지구여 멈춰라 내리고 싶다 538 | 》는 한국에서 제작된 이재웅 감독의 1974년 멜로/로맨스 영화이다. 539 | 남진 등이 주연으로 출연하였고 이우석 등이 제작에 참여하였다. 540 | 541 | 연애할 시간 없다 542 | 《연애할 시간 없다 543 | 》는 한국에서 제작된 이종기 감독의 1964년 영화이다. 544 | 최지희 등이 주연으로 출연하였고 안태식 등이 제작에 참여하였다. 545 | 546 | 나도 연애할 수 있다 547 | 《나도 연애할 수 있다 548 | 》는 한국에서 제작된 임원직 감독의 1965년 영화이다. 549 | 김승호 등이 주연으로 출연하였고 홍의선 등이 제작에 참여하였다. 550 | 551 | 자전거를 타고 온 크리스마스 552 | 《자전거를 타고 온 크리스마스》(Christmas Comes On A Bicycle)는 한국에서 제작된 박선욱 감독의 2003년 드라마 영화이다. 553 | 김태우 등이 주연으로 출연하였다. 554 | 555 | 서스펙트 제로 556 | 《서스펙트 제로》(Suspect Zero)는 미국에서 제작된 E. 일라이어스 메리지 감독의 2004년 스릴러, 범죄, 공포, 드라마 영화이다. 557 | 아론 에크하트 등이 주연으로 출연하였고 게이 허쉬 등이 제작에 참여하였다. 558 | 559 | 애마와 변강쇠 560 | 《애마와 변강쇠》는 한국에서 제작된 김문옥 감독의 1995년 영화이다. 561 | 한명구 등이 주연으로 출연하였다. 562 | 563 | 나터러도마뱀붙이 564 | 나터러도마뱀붙이("Tropiocolotes nattereri" )는 나터러 게코(Natterer's gecko)라 불리며, 이집트, 이스라엘, 요르단, 사우디아라비아에 서식하는 종이다. 565 | 종명, "nattereri" 는 오스트리아의 조류학자 요한 나터러()를 기린 것이다. 566 | 나터러도마뱀붙이는 난생한다. 567 | 성적 이형성은 뚜렷하지 않으나, 칼슘낭을 확인하면 도움이 된다. 568 | 569 | 하드카바 570 | 《하드카바》(I, Madman)는 미국에서 제작된 티보 타카스 감독의 1989년 공포, 스릴러 영화이다. 571 | 제니 라이트 등이 주연으로 출연하였고 라파엘 아이슨먼 등이 제작에 참여하였다. 572 | 573 | 2022년 2월 574 | 575 | 576 | 577 | Memories (노래) 578 | "Memories"는 미국의 팝 록 밴드 마룬 5의 노래이다. 579 | 580 | 토요일 밤에 581 | 《토요일 밤에》는 한국에서 제작된 이성구 감독의 1974년 드라마 영화이다. 582 | 신일룡 등이 주연으로 출연하였고 한갑진 등이 제작에 참여하였다. 583 | 584 | 포스 맨 585 | 《포스 맨》(De Vierde Man, The Fourth Man)은 네덜란드에서 제작된 폴 버호벤 감독의 1983년 드라마, 미스터리, 스릴러 영화이다. 586 | 예로엔 크라베 등이 주연으로 출연하였고 롭 휴베르 등이 제작에 참여하였다. 587 | 588 | 대삼원 589 | 《대삼원》(大三元: Tristar)은 홍콩에서 제작된 서극 감독의 1996년 액션, 멜로/로맨스 영화이다. 590 | 장국영 등이 주연으로 출연하였고 왕응상 등이 제작에 참여하였다. 591 | 592 | Without Me (할시의 노래) 593 | "Without Me"는 미국의 가수 할시의 노래이다. 594 | 595 | 안녕, 쿠로 596 | 《안녕, 쿠로》(さよなら, クロ, Sayonara, Kuro)는 일본에서 제작된 마츠오카 조지 감독의 2003년 드라마 영화이다. 597 | 츠마부키 사토시 등이 주연으로 출연하였고 토야 노부유키 등이 제작에 참여하였다. 598 | 599 | 섹스와 철학 600 | 《섹스와 철학》(Sex & Philosophy)은 타지키스탄에서 제작된 모흐센 마흐말바프 감독의 2005년 드라마 영화이다. 601 | 다레르 나자로브가 목소리를 맡았다. 602 | 이 영화의 배경은 타지키스탄이다. 603 | 2005년 9월 몬트리올 세계영화제에서 초연되었다. 604 | 대한민국, 터키, 이탈리아, 싱가포르, 러시아에서 극장 상영되었다. 605 | 606 | 도둑과 경관 607 | 《도둑과 경관》(Rene La Canne)은 프랑스에서 제작된 프란시스 지로드 감독의 1976년 영화이다. 608 | 장 카르메 등이 주연으로 출연하였고 자크-에릭 스트라우스 등이 제작에 참여하였다. 609 | 출시명은 누구에게 줄까요 610 | 이다. 611 | 1977년 개봉되었으며 534,714명의 관람객 수를 기록하였다. 612 | 613 | 언제까지나 그대만을 614 | 《언제까지나 그대만을》는 한국에서 제작된 권영순 감독의 1959년 영화이다. 615 | 이택균 등이 주연으로 출연하였고 고병두 등이 제작에 참여하였다. 616 | 617 | 엑시트 운즈 618 | 《엑시트 운즈》(Exit Wounds)는 미국에서 제작된 안드레이 바르코비악 감독의 2001년 미스터리, 액션, 스릴러 영화이다. 619 | 스티븐 시걸 등이 주연으로 출연하였고 조엘 실버 등이 제작에 참여하였다. 620 | 621 | 김치관 (친일파) 622 | 김치관(金致寬)은 남해3·1 독립운동 (南海三一獨立運動) 1919년 4월 2일- 1919년 4월 6일 당시 많은 군중들의 시위 위세에 놀라 이를 경찰 주재소에 밀고한 인물이다. 623 | 제2대 김치관(金致勸) 624 | 취임일 : 1916.07.20 625 | 이임일 : 1922.09.23 626 | 출생 시기 등 신상 정보는 알려진 바 없다. 627 | 일제 강점기때의 김치관(金致勸)은 남해군 제 2대 고현면장였다. 628 | 남해3·1 독립운동 (南海三一獨立運動) 1919년 4월 2일- 1919년 4월 6일 당시. 설천면 남양리에서 출발한 독립만세 시위 행렬이 문항리, 진목리, 비란리을 지나 고현면 도마리. 시위행렬이 고현면(古縣面) 이어리(당시 고현면 사무소 소재지는 이어리)에 이르자 그곳 고현 면장 김치관(金致寬)은 많은 군중들의 시위 위세에 놀라 이를 경찰 주재소에 밀고하였고, 629 | 파도와 같은 시위 군중의 힘을 이기지 못한 경찰은 결국 발포를 해 이를 진압하기 이른다. 630 | 이때 일본의 주구(走狗) 김치관(金致寬)은 경찰의 경비전화를 빌려 사천경찰서에 이곳 사태의 위급함을 알리면서 경찰과 일군을 출동시켜달 응원(應援)해라고 요청하였다. 631 | 632 | I Don't Care 633 | "I Don't Care"는 영국의 가수 에드 시런과 캐나다의 가수 저스틴 비버의 노래입니다. 634 | 635 | 눈부신 하루 636 | 눈부신 하루는 다음을 의미한다. 637 | 638 | 눈부신 하루 (2005년 영화) 639 | 《눈부신 하루》(One Shining Day)는 한국에서 제작된 민동현 감독의 2005년 드라마, 판타지, 멜로/로맨스 영화이다. 640 | 모리 유키에 등이 주연으로 출연하였고 차보현 등이 제작에 참여하였다. 641 | 642 | 써튼 퓨리 643 | 《써튼 퓨리》(Certain Fury)는 미국에서 제작된 스티븐 질렌홀 감독의 1985년 액션, 드라마 영화이다. 644 | 테이텀 오닐 등이 주연으로 출연하였고 길버트 아들러 등이 제작에 참여하였다. 645 | 646 | 프랜서 647 | 프랜서는 다음을 의미한다. 648 | 649 | 프랜서 (1989년 영화) 650 | 《프랜서》(Prancer)는 미국에서 제작된 존 D. 핸콕 감독의 1989년 드라마, 가족 영화이다. 651 | 샘 엘리어트 등이 주연으로 출연하였고 라파엘라 드 로렌티스 등이 제작에 참여하였다. 652 | 653 | 프랜서 (2001년 영화) 654 | 《프랜서》(Prancer Returns)는 캐나다에서 제작된 조슈아 버틀러 감독의 2001년 영화이다. 655 | 존 코베트 등이 주연으로 출연하였고 오스카 L. 코스토 등이 제작에 참여하였다. 656 | 657 | 드라큐라 애마 658 | 《드라큐라 애마》는 한국에서 제작된 석도원 감독의 1994년 드라마, 에로 영화이다. 659 | 오노아 등이 주연으로 출연하였고 정경희 등이 제작에 참여하였다. 660 | 661 | 사랑은 무서워 662 | 《사랑은 무서워》는 한국에서 제작된 김묵 감독의 1965년 영화이다. 663 | 강신성일 등이 주연으로 출연하였고 주동진 등이 제작에 참여하였다. 664 | 665 | 바늘풀족 666 | 바늘풀족(---族, )은 미나리아과의 족이다. 667 | 668 | 마리아스 러버 669 | 《마리아스 러버》(Maria's Lovers)는 미국에서 제작된 안드레이 콘찰로프스키 감독의 1984년 드라마, 멜로/로맨스 영화이다. 나스타샤 킨스키 등이 주연으로 출연하였고 로렌스 테일러-모토프 등이 제작에 참여하였다. 670 | 671 | 경상도 사나이 672 | 《경상도 사나이》는 한국에서 제작된 민경식 감독의 1960년 영화이다. 673 | 이대엽 등이 주연으로 출연하였고 박시춘 등이 제작에 참여하였다. 674 | 675 | Someone You Loved 676 | "Someone You Loved"는 스코틀랜드의 팝 록 밴드 루이스 카팔디의 노래이다. 677 | 678 | 왕자 미륵 679 | 《왕자 미륵》은 한국에서 제작된 이태환 감독의 1959년 영화이다. 680 | 방수일 등이 주연으로 출연하였고 성동호 등이 제작에 참여하였다. 681 | 682 | 퍼펙트 웨딩 683 | 《퍼펙트 웨딩》(Monster-In-Law)은 미국에서 제작된 로버트 루케틱 감독의 2005년 코미디, 멜로/로맨스 영화이다. 684 | 제니퍼 로페즈 등이 주연으로 출연하였고 폴라 웨인스타인 등이 제작에 참여하였다. 685 | 686 | 블랙 로브 687 | 《블랙 로브》(Black Robe)는 캐나다에서 제작된 브루스 베레스포드 감독의 1991년 드라마 영화이다. 688 | 로데어 블루토 등이 주연으로 출연하였고 수 밀리켄 등이 제작에 참여하였다. 689 | 690 | Liar (노래) 691 | "Liar"는 카밀라 카베요의 노래이다. 692 | 693 | 화야 694 | 《화야》는 한국에서 제작된 최영철 감독의 1983년 드라마 영화이다. 695 | 왕호 등이 주연으로 출연하였고 최춘지 등이 제작에 참여하였다. 696 | 697 | 힛쳐 (2007년 영화) 698 | 《힛쳐》(The Hitcher)는 미국에서 제작된 데이브 마이어스 감독의 2007년 공포, 액션, 범죄, 스릴러, 드라마 영화이다. 699 | 숀 빈 등이 주연으로 출연하였고 마이클 베이 등이 제작에 참여하였다. 700 | 701 | There's Nothing Holdin' Me Back 702 | "There's Nothing Holdin' Me Back"는 캐나다의 가수 숀 멘데스의 노래이다. 703 | 704 | 신풍협객 705 | 《신풍협객》은 한국에서 제작된 김시현 감독의 1972년 영화이다. 706 | 남일 등이 주연으로 출연하였고 박원석 등이 제작에 참여하였다. 707 | 708 | 바디 스내치 709 | 《바디 스내치》(Body To Body, Corps A Corps)는 프랑스에서 제작된 프랑소와 한스 감독의 2003년 스릴러, 드라마 영화이다. 710 | 엠마누엘 자이그너 등이 주연으로 출연하였다. 711 | 712 | 핵분열가족 713 | 《핵분열가족》(The Freaking Family)은 한국에서 제작된 박재영 감독의 2004년 코미디, 공포, 가족 영화이다. 714 | 이현정 등이 주연으로 출연하였다. 715 | 716 | 위험한 진실 717 | 《위험한 진실》(Truth Or Consequences, N.M.)은 미국에서 제작된 키퍼 서덜랜드 감독의 1997년 액션, 범죄, 드라마 영화이다. 718 | 빈센트 갈로 등이 주연으로 출연하였고 케빈 J. 메식 등이 제작에 참여하였다. 719 | 720 | 나의 친구여 721 | 《나의 친구여》는 한국에서 제작된 유장안 감독의 1928년 영화이다. 722 | 나웅 등이 주연으로 출연하였고 단천 등이 제작에 참여하였다. 723 | 724 | 퍼펙트 머더 725 | 《퍼펙트 머더》(A Perfect Murder)는 미국에서 제작된 앤드루 데이비스 감독의 1998년 범죄, 스릴러 영화이다. 726 | 마이클 더글라스 등이 주연으로 출연하였고 앤 코펠슨 등이 제작에 참여하였다. 727 | 728 | 서울 야누스 729 | 《서울 야누스》(Seoul Janus)는 한국에서 제작된 김영한 감독의 1991년 영화이다. 730 | 하재영 등이 주연으로 출연하였고 임상돈 등이 제작에 참여하였다. 731 | 732 | 로잔나 포에버 733 | 《로잔나 포에버》(Roseanna's Grave, Roseanna Forever)는 이탈리아에서 제작된 폴 웨이랜드 감독의 1997년 영화이다. 장 르노 등이 주연으로 출연하였고 폴 트리비츠 등이 제작에 참여하였다. 734 | 735 | 웰컴 프레지던트 736 | 《웰컴 프레지던트》(Welcome To Mooseport)는 미국에서 제작된 도날드 페트리 감독의 2004년 코미디 영화이다. 737 | 진 핵크만 등이 주연으로 출연하였고 마크 프리드맨 등이 제작에 참여하였다. 738 | 739 | 셀러리족 740 | 셀러리족(celery族, )은 미나리아과의 족이다. 741 | 742 | 지옥의 특전대 743 | 《지옥의 특전대》(The Wild Geese)는 영국에서 제작된 앤드류 V. 맥라글렌 감독의 1978년 전쟁, 액션 영화이다. 744 | 리차드 버튼 등이 주연으로 출연하였고 유언 로이드 등이 제작에 참여하였다. 745 | 746 | 버수스 747 | 버수스는 다음을 의미한다. 748 | 749 | 버수스 (2000년 영화) 750 | 《버수스》(Versus)는 미국에서 제작된 기타무라 류헤이 감독의 2000년 액션, 모험, 판타지 영화이다. 751 | 사카구치 타쿠 등이 주연으로 출연하였다. 752 | Reviews 753 | 754 | 7인의 새벽 755 | 《7인의 새벽》(Running Seven Dogs)은 한국에서 제작된 김주만 감독의 2001년 코미디, 액션 영화이다. 756 | 이지현 등이 주연으로 출연하였고 여한구 등이 제작에 참여하였다. 757 | 758 | 하이랜더 2 759 | 《하이랜더 2》(Highlander II: The Quickening)는 프랑스에서 제작된 러셀 멀케이 감독의 1991년 액션, SF 영화이다. 760 | 크리스토퍼 램버트 등이 주연으로 출연하였고 피터 S. 데이비스 등이 제작에 참여하였다. 761 | 762 | 헬레이저 3 763 | 《헬레이저 3》(Hellraiser III: Hell On Earth)는 미국에서 제작된 안소니 힉콕스 감독의 1992년 공포 영화이다. 764 | 케빈 번하드트 등이 주연으로 출연하였고 크리스토퍼 피그 등이 제작에 참여하였다. 765 | 766 | 센터 오브 월드 767 | 《센터 오브 월드》(The Center Of The World)는 미국에서 제작된 웨인 왕 감독의 2001년 드라마 영화이다. 768 | 몰리 파커 등이 주연으로 출연하였고 웨인 왕 등이 제작에 참여하였다. 769 | 770 | 캅 랜드 771 | 《캅 랜드》(Cop Land)는 미국에서 제작된 제임스 맨골드 감독의 1997년 네오 누아르 드라마 영화이다. 772 | 실베스터 스탤론 등이 주연으로 출연하였고 카리 우즈 등이 제작에 참여하였다. 773 | 774 | 엘 토포 775 | 《엘 토포》(The Gopher, El Topo)는 멕시코에서 제작된 알레한드로 조도로프스키 감독의 1970년 서부 영화이다. 776 | 알레한드로 조도로프스키 등이 주연으로 출연하였다. 777 | 778 | 햄버거 쟈니 779 | 《햄버거 쟈니》는 한국에서 제작된 설태호 감독의 1988년 드라마, 멜로/로맨스 영화이다. 780 | 자니 윤 등이 주연으로 출연하였고 설태호 등이 제작에 참여하였다. 781 | 782 | 스피룰라 783 | 스피룰라는 십완상목 두족류의 일종으로 몸속에 나선형의 껍데기를 가지고 있다. 784 | 2개의 지느러미 사이 약간 오목한 곳에 발광기관을 가지고 있으며 먹물주머니는 아주 작다. 785 | 스피룰라는 머리와 8개의 짧은 다리 그리고 2개의 촉완을 모두 외투강 안에 넣고 움츠리는 동작도 가능하다. 786 | 스피룰라를 제외하고 스피룰라목에 속하는 종들은 모두 멸종되었고 현존하는 종은 스피룰라 하나 뿐이다. 787 | 학명은 스피룰라 스피룰라("spirula spirula")이며 깊은 바다에 살고 올라오는 법이 잘 없어 한동안 스피룰라에 대해 알 수 있는 것이라고는 죽은 뒤 떠오르는 껍데기밖에는 없어 정체가 밝혀지지 않다가 최근 발견되어 그 정체가 세상에 알려졌다. 788 | 789 | 폰티 790 | 폰티는 다음 인물을 가리킨다. 791 | 792 | 마켄젠 793 | 마켄젠은 다음 인물을 의미한다. 794 | 795 | 셀리눔족 796 | 셀리눔족(selinum族, )은 미나리아과의 족이다. 797 | 798 | 송병기 799 | 송병기(宋炳琪, 1962년 3월 10일 ~ )는 대한민국의 교통, 토목 공학자이자, 공무원, 정치인이다. 800 | 801 | 체이스 앤더슨 802 | 로버트 체이스 앤더슨 (Robert Chase Anderson, 1987년 11월 30일 ~ )은 미국 프로야구 아메리칸 리그 토론토 블루제이스의 선수이다. 803 | 2009년 9라운드 276순위로 애리조나 다이아몬드백스에 입단 했다. 804 | 2014년 5월 11일 시카고 화이트삭스와의 경기에서 첫 메이저리그 데뷔를 하였다. 805 | 2016년 1월 30일 밀워키 브루어스의 진 세구라 등과 트레이드 되어 에런 힐과 함께 애리조나 다이아몬드백스에서 밀워키 브루어스로 이적했고, 2019년 11월 4일 트레이드를 통해 다시 토론토 블루제이스로 팀을 옮겼다. 806 | ※ 2019년 시즌 종료 기준 807 | 808 | 블란카 다라곤 왕녀 (1424년) 809 | 블란카 다라곤 왕녀()는 아라곤 왕국과 나바라 왕국의 왕녀이자 나바라 왕국의 대립 여왕 수리아 2세()였으며 카스티야 국왕 엔리케 4세가 아스투리아스 공 엔리케 시절의 부인(아스투리아스 공비)이다. 810 | 811 | 레드 플래닛 812 | 《레드 플래닛》(Red Planet)은 미국, 오스트레일리아에서 제작된 안토니 호프만 감독의 2000년 SF, 액션, 스릴러 영화이다. 813 | 발 킬머 등이 주연으로 출연하였고 브루스 버그만 등이 제작에 참여하였다. 814 | 815 | 조지 왕의 광기 816 | 《조지 왕의 광기》(The Madness Of King George)는 영국에서 제작된 니콜라스 하이트너 감독의 1994년 코미디, 드라마 영화이다. 817 | 나이젤 호손 등이 주연으로 출연하였고 스티븐 에반스 등이 제작에 참여하였다. 818 | 819 | 우연한 여행 820 | 《우연한 여행》은 한국에서 제작된 김정진 감독의 1994년 드라마 영화이다. 821 | 김명곤 등이 주연으로 출연하였고 유인택 등이 제작에 참여하였다. 822 | 823 | 심야의 탈출 824 | 심야의 탈출은 다음을 의미한다. 825 | 826 | 심야의 탈출 (1947년 영화) 827 | 《심야의 탈출》(Odd Man Out)은 영국에서 제작된 캐럴 리드 감독의 1947년 범죄, 스릴러, 드라마 영화이다. 828 | 제임스 메이슨 등이 주연으로 출연하였고 캐럴 리드 등이 제작에 참여하였다. 829 | 830 | 심야의 탈출 (1982년 영화) 831 | 《심야의 탈출》(Night Crossing)은 영국에서 제작된 델버트 맨 감독의 1981년 영화이다. 832 | 존 허트 등이 주연으로 출연하였고 톰 리취 등이 제작에 참여하였다. 833 | 834 | 돌아온 손오공 835 | 《돌아온 손오공 - 동훈별곡》은 한국에서 제작된 은희복 감독의 1990년 SF, 모험 영화이다. 836 | 이원승 등이 주연으로 출연하였고 문여송 등이 제작에 참여하였다. 837 | 838 | 에어 레이지 839 | 《에어 레이지》(Air Rage)는 미국에서 제작된 프레드 올렌 레이 감독의 2001년 액션 영화이다. 840 | 아이스-티 등이 주연으로 출연하였고 돈 키 주니어 등이 제작에 참여하였다. 841 | 842 | 미녀 사냥 843 | 《미녀 사냥》은 한국에서 제작된 김오대 감독의 1990년 드라마, 멜로/로맨스 영화이다. 844 | 이충식 등이 주연으로 출연하였고 김추련 등이 제작에 참여하였다. 845 | 846 | 크리스마스 건너뛰기 847 | 《크리스마스 건너뛰기》(Christmas With The Kranks)는 미국에서 제작된 조 로스 감독의 2004년 코미디, 드라마 영화이다. 848 | 팀 알렌 등이 주연으로 출연하였고 마이클 바네이단 등이 제작에 참여하였다. 849 | 850 | 스타힐리조트 851 | 스타힐리조트는 한국 경기도 남양주시 화도읍에 위치한 스키장이다. 852 | 과거 명칭인 천마산 스키장(또는 리조트)으로도 널리 알려져 있다. 853 | 854 | 최갑석 855 | 최갑석이라는 동명이인은 다음과 같다. 856 | 857 | 알프스 스키장 858 | 알프스 스키장 또는 알프스리조트는 한국 강원도 고성군 간성읍에 위치한 스키장이다. 859 | 현재는 휴장 상태로 재개장 여부는 알려지지 않았다. 860 | 861 | 낮과 밤 (드라마) 862 | 《낮과 밤》은 2020년 방송 예정 863 | 864 | 날아라 슛돌이 - 뉴 비기닝 865 | 《날아라 슛돌이 - 뉴 비기닝》은 KBS 2TV에서 방송되는 텔레비전 프로그램이다. 866 | 축구 초보에서부터 완성형 축구선수 등 다양한 실력을 가진 어린이들이 출연, 친구가 필요한 아이들이 축구를 통해 처음 만나 서로 부족했던 부분을 만회하면서, 성장 스토리를 그리는 스포츠 예능 프로그램 867 | 868 | 대명비발디파크 869 | 대명비발디파크는 한국 강원도 홍천군 서면에 위치한 스키장이다. 870 | 871 | 즈베즈다 (방송) 872 | 전러시아 국립 방송채널 "조국"()는 러시아의 국영 방송으로, 러시아 국방부가 소유하고 있다. 873 | 즈베즈다는 러시아어로 "조국"이라 하며, 현재 최고경영자는 그리고리 크리체프스키로, 과거 NTV에서 활동 한 적 있다. 874 | 1998년 러시아 국방부 부서인 러시아 국방부 중앙 텔레비전 및 라디오 스튜디오가 새로운 방송 설립을 위한 입찰에 성공하면서 개국 준비를 앞두고 있었으며, 2001년 9월에는 러시아 통신부에 의해 2주간 경고를 받은 적이 있었다. 875 | 876 | 오투리조트 877 | 오투리조트는 한국 강원도 태백시 황지동에 위치한 스키장이다. 878 | 879 | 나가오 야스노리 880 | 나가오 야스노리(, 1950년 5월 2일 ~ )는 일본의 전 프로 야구 선수이자 야구 지도자이다. 881 | 사가현 사가시 출신이며 현역 시절 포지션은 내야수였다. 882 | 사가니시 고등학교 시절에는 내야수, 대기 투수로서 활약했다. 883 | 2학년 때인 1967년 여름에는 3학년생이 졸업한 것에 의한 야구부원 부족으로 경기를 할 수 없게 되자 각 교실을 돌며 선수를 모았다는 일화가 있다. 884 | 3학년 때인 1968년 하계 고시엔 사가현 예선에서 준결승에 진출했지만 사가 공업고등학교에게서 9회에 역전패를 당해 고시엔 대회 출장은 이루질 못했다. 885 | 졸업 후에는 이스즈 자동차에 입사, 사내 야구부에서는 2번 타자로서 1971년 도시 대항 야구 대회에 출전했다. 886 | 팀내 에이스 도요타 겐지를 거느리고 2차전에 진출했지만 에 패하여 탈락했다. 887 | 그해 프로 야구 드래프트 회의에서 니시테쓰 라이온스로부터 3순위 지명을 받았지만 입단을 거부했고 이듬해 1972년 드래프트 1순위로 야쿠르트 아톰스에 입단했다. 888 | 프로 2년째인 1974년에는 도조 후미히로, 3년째인 1975년에는 마스카와 마이쿠와 유격수 자리를 놓고 경쟁했다. 889 | 1976년에는 2루수로 되돌아가면서 이듬해 1977년에는 주전으로 고정됐고 그 해는 처음으로 규정 타석(32위, 타율 0.244)을 채우는 등 3년 만의 A클래스 진입과 동시에 팀의 첫 2위 도약에 기여했다. 890 | 1978년에는 데이브 힐튼의 입단에 의해서 2루수 자리를 양보했지만 대기 내야수로서는 최초로 팀의 리그 우승에 기여했다. 891 | 그해 한큐 브레이브스와 맞붙은 일본 시리즈에서는 대타로서 2경기에 출전했고 10월 18일에 열린 4차전(니시노미야)에서는 0대 5 상황에서 상대 투수 이마이 유타로로부터 역전의 계기가 되는 안타를 때려내며 야쿠르트 구단 사상 첫 일본 시리즈 우승에 기여했다. 892 | 같은 해 오프에는 간베 도시오, 사토 다케히데, 데라다 요시타카와의 맞트레이드로 찰리 매뉴엘과 함께 긴테쓰 버펄로스로 이적했다. 893 | 긴테쓰에서도 내야 유틸리티 플레이어로 활약하며 1979년에는 규정 타석 미만이면서도 타율 0.310의 성적을 기록했고 긴테쓰에서 3년 동안 팀의 리그 2연패 달성에 공헌했다. 894 | 1982년 1월에는 현금 트레이드로 한신 타이거스에 이적했다. 895 | 그해 시즌 중인 5월 25일에 자택에서 화재가 발생하여 피해를 입었지만, 개인 최고 타율인 0.358을 기록한 것 외에도 주로 대타로 활약했다. 896 | 1985년에 트레이드로 한신에 입단한 나가사키 게이지와 함께 좌완 대타로 활약하면서 대타로서의 타율이 3할을 넘는 등 팀의 21년 만의 리그 우승과 동시에 일본 시리즈 우승에도 기여했다. 897 | 1987년을 끝으로 현역에서 은퇴했다. 898 | 이후 한신에서 2군 수비·주루 코치(1988년 ~ 1990년, 2010년), 2군 내야 수비·주루 코치(1994년 ~ 1995년), 2군 내야 수비 코치(1996년), 2군 육성 코치(2011년), 편성부 스카우트(1991년 ~ 1993년, 1997년 ~ 2009년) 등을 역임했다. 899 | 스카우트로 활동하던 시절에는 주로 규슈 지역을 담당하여 마토바 간이치, 기다 고, 노하라 마사시, 시라니타 히로카즈, 가이 유헤이 등을 영입했다. 900 | 2014년 12월부터 2017년까지 모교인 사가니시 고등학교에서 코치를 맡았고 2018년부터는 사가 현립 다라 고등학교 감독으로 맡고 있다. 901 | 902 | 한솔오크밸리 903 | 한솔오크밸리는 한국 강원도 원주시 지정면에 위치한 스키장이다. 904 | 905 | 양지파인리조트 906 | 양지파인리조트는 한국 경기도 용인시 처인구 양지면에 위치한 스키장이다. 907 | 지산포레스트리조트와 가깝다. 908 | 909 | 지산포레스트리조트 910 | 지산포레스트리조트는 한국 경기도 이천시 마장면에 위치한 스키장이다. 911 | 양지파인리조트와 가깝다. 912 | 913 | 곤지암리조트 914 | 곤지암리조트는 한국 경기도 광주시 도척면에 위치한 스키장이다. 915 | LG그룹에 의해 운영된다. 916 | 917 | 베어스타운 918 | 베어스타운은 한국 경기도 포천시 내촌면에 위치한 스키장이다. 919 | 2014년 이랜드그룹에 인수되었다. 920 | 921 | 에덴밸리리조트 922 | 에덴밸리리조트는 한국 경상남도 양산시 원동면에 위치한 스키장이다. 923 | 현재 한국 최남단의 스키장이다. 924 | 925 | 알렉스 폰티 926 | 알렉스 지오 폰티는 1953년 9월 1일 이탈리아 로마에서 태어났고 카를로 폰티의 장남이자 이탈리아 영화제작자이며 이탈리아 모델이다. 927 | 친할아버지인 레오네 폰티의 얼굴도 보지도 못하고 어린 시절에 이탈리아 건축가인 지오 폰티를 할아버지로 살아왔고 종조부인 줄리오 폰티, 종조모인 리사 폰티, 레티시아 폰티, 지오바나 폰티, 증조할아버지인 에토레 폰티는 이탈리아 정치인이고 새엄마인 소피아 로렌은 이탈리아 배우로 활동하고 누나인 구엔달리나 폰티는 변호사이며 아내인 산드라 몬텔레오니 대표는 이탈리아 기업인이고 딸인 안젤리카 폰티는 1982년생이라 이탈리아 모델이라고 살아왔다. 928 | 종조부인 안드레아 폰티와 지안펠리스 폰티의 이름을 보내고 있으며 현재는 영화기획자로 활동하고 있었다. 929 | 930 | 카를로스 곤 931 | 카를로스 곤(Carlos Ghosn, 1954년 3월 9일 ~ )은 브라질에서 태어난 레바논 혈동의 프랑스의 사업가이다. 932 | 레바논 혈통인 레바논-브라질 이중국적 아버지와 프랑스인 어머니 사이에서 출생해 삼중국적을 가지고 있다. 933 | 그랑제콜 준비반에 가기 위해 프랑스로 가서 우수한 그랑제콜을 졸업하고 르노에 입사했다. 934 | 르노-닛산 연합 이후 닛산의 개혁을 이끌었다. 935 | 일본에서 배임혐의를 받자 레바논으로 몰래 출국하였다. 936 | 937 | 무주동계올림픽 구상 938 | 이하는 과거 무주 동계올림픽의 유치 구상에 대하여 다룬다. 939 | 1992년 북한이 1995년 개최하기로 했던 제3회 동계아시아경기대회를 포기하였다. 940 | 이에 대회의 국내 유치 논의가 있었고 전라북도의 무주와 강원도의 용평(평창) 등이 후보지로 떠올랐다. 941 | 두 지역의 경쟁 끝에 결과적으로 전북은 1997년 제18회 동계유니버시아드대회를, 강원은 1999년 제4회 동계아시아경기대회를 유치하게 된다. 942 | 이후 두 대회는 각자의 목표인 동계올림픽을 위한 테스트이벤트의 성격을 띄게 되었다. 943 | 2000년대 들어 국가적으로 2010년 동계올림픽의 유치를 추진하며 전북(무주)은 강원(평창)과 다시 한번 경쟁하게 된다. 944 | 그 결과 국내 후보지로 선정된 평창은 공식 투표에서 캐나다의 밴쿠버에 패해 유치에 실패하였다. 945 | 이후 평창이 다시 2014년의 대회 유치를 추진하자 무주는 이전 선정 당시 2014년의 대회 후보지로 무주가 우선한다는 합의가 있었다며 반발하였다. 946 | 이와 비슷한 시기 태권도 공원의 장소가 무주로 결정되며 갈등이 일단락되었다. 947 | 한편 평창은 2014년과 2018년 대회 유치에 연이어 도전한 끝에 2018년 대회를 유치하게 된다. 948 | 2018년 동계올림픽을 앞두고 활강 종목 경기장이 들어설 가리왕산의 환경 문제가 부각되자 전북은 경기장의 신설 대신 무주리조트를 보완하여 활용하자고 주장하였다. 949 | 그러나 이는 실현되지 않았다. 950 | 951 | 인구집단건강 952 | 인구집단건강(人口集團健康, Population health)은 개인들의 모임인 인구집단의 건강과 인구집단 내에서의 건강의 분포를 의미한다. 953 | 954 | 건강영향평가 955 | 건강영향평가(Health Impact Assessment, HIA)는 정책, 계획, 프로그램 또는 프로젝트가 인구집단건강과 인구집단의 건강에 영향을 미치는 요인에 어떠한 영향을 끼치는지 판단하는 도구, 절차, 방법 또는 그 조합들을 의미한다. 956 | 957 | 스피룰라 스피룰라 958 | 스피룰라 스피룰라는 스피룰라목에 속하는 두족류 중 유일하게 현존하는 종이다. 959 | 스피룰라 스피룰라가 스피룰라목의 마지막 종이라고 할 수 있기 때문에 스피룰라 스피룰라가 멸종한다면 스피룰라목에도 더 이상 현존하는 종은 없게 되는 것이다. 960 | 또한 스피룰라 스피룰라(spirula spirula)는 학명이며 스피룰라라고 부르는 것이 보통이다. 961 | 962 | 미키 하지메 963 | 미키 하지메(, 1977년 4월 25일 ~ )는 일본의 전 프로 야구 선수이자 야구 지도자이며, 현재 퍼시픽 리그인 도호쿠 라쿠텐 골든이글스 감독이다. 964 | 오사카부 오사카시 스미노에구 출신이며 현역 시절 포지션은 내야수였다. 965 | 우에노미야 고등학교 시절에는 고교 통산 23홈런을 기록할 정도의 간판 타자로 알려지면서 1995년 프로 야구 드래프트 회의에서 후쿠도메 고스케(긴테쓰가 지명권 획득), 사와이 료스케(지바 롯데가 지명권 획득)와 제비뽑기에서 패한 야쿠르트 스왈로스로부터 1순위 지명(낙첨 1순위)을 받고 입단했다. 966 | 2001년에는 79경기에 출전했지만 시즌 타율이 2할을 넘지 못할 정도의 저조한 성적을 남겨서 수뇌진들로부터 평가를 얻지 못했다. 967 | 2002년 이후에는 시로이시 노리유키와 노구치 요시유키의 성장, 다나카 히로야스 등의 입단도 있어서 내야수의 대기 선수 자리조차도 굳히지 못하는 시즌이 계속되고 있었다. 968 | 2004년에는 타격 요령에 눈을 뜬 것을 기해 스위치히터로 전향했는데 그 해에는 26타수 7안타를 기록했고 이듬해 2005년에는 11타수 4안타를 기록하여 출전 기회는 적었지만 어느 정도의 결과를 남겼다. 969 | 2007년 10월 9일에는 대타로 현역 마지막 경기에 출전한 후루타 아쓰야 선수 겸임 감독의 대주자로 기용됐다. 970 | 2008년에는 가와시마 게이조, 하시모토 요시타카, 오시모토 다케히코와의 맞트레이드로 후지이 슈고, 사카모토 야타로 등과 함께 홋카이도 닛폰햄 파이터스에 이적했다. 971 | 그 해 6월 8일에 3타수 2안타 1볼넷, 2루타를 포함해 2타점을 기록하는 맹활약으로 프로 13년째에 처음으로 히어로 인터뷰의 주인공이 되는 경험을 했다. 972 | 같은 해 10월 23일에 현역에서 은퇴했다. 973 | 2009년에 닛폰햄의 2군 내야 수비 주루 코치로 부임했고 2012년에는 1군 내야 수비 코치로 승격됐다. 974 | 이듬해 2013년 10월 14일에 닛폰햄을 퇴단했다. 975 | 2013년 10월 23일에 2014년 시즌부터 도쿄 야쿠르트 스왈로스 2군 내야 수비 주루 코치로 부임했다는 사실이 언론에 발표됐다. 976 | 이듬해 2015년에는 1군 작전 겸 내야 수비 주루 코치로 승격됐고 그 다음해인 2016년에는 1군 수석 코치 겸 내야 수비 주루 코치로 승격됐다. 977 | 2017년에는 1군 수석 코치로 부임했고 2018년에는 2군 수석 코치로 배치 전환됐다. 978 | 2019년에는 도호쿠 라쿠텐 골든이글스 2군 감독을 맡았고 같은 해 10월 11일에는 구단이 2020년부터 1군 감독을 맡게됐다는 내용의 보도 자료를 발표했다. 979 | 또한 현역 시절에 59안타를 기록하여 1군 감독으로 부임한 사례는 전임 라쿠텐 감독인 히라이시 요스케의 39안타, 전 한큐 브레이브스, 닛폰햄 파이터스 감독인 우에다 도시하루의 56안타에 이은 최소 기록이다. 980 | 잦은 손목 부상으로 인해 타격이 늘지 않았고 타격에 관해서는 신인 시절에 기대를 걸었던 만큼의 눈에 띈 성적을 남기지 못했다. 981 | 원래는 우타자였지만 빠른 발을 가졌다는 평가를 받아 양타자로 전향했다는 에피소드가 있다. 982 | 타격과는 대조적으로 빠른 발로 단순한 단거리 달리기 능력은 10대 시절에 절정을 이뤘다고 본인이 《슈칸 베이스볼》과의 인터뷰에서 말했으며 그 쇠약함을 말년에는 주루·도루 기술 향상으로 보강했다고 말한 바있다. 983 | 그런 반면 뜬공으로 따라나가는 등의 실수도 다소 많이 보였다. 984 | 수비 범위는 넓었지만 리스트에 문제가 있었기 때문에 송구에 대한 신뢰도는 그리 높지 않았다. 985 | 특히 2루에서의 실책이 가장 많았다. 986 | 987 | 벨렘나이트 988 | 벨렘나이트(Belemnitida, belemnites)는 중생대에 서식했던 두족류로 오징어의 직계 조상이라고 할 수 있다. 989 | 오징어의 직계 조상인 만큼 오징어와 판박이인데 지느러미가 있고 심지어는 먹물주머니까지 갖추고 있었다! 990 | 다만 오징어와는 달리 사냥에 특화된 촉완이 없고 6개의 다리에는 빨판 대신 가시가 나 있었다. 991 | 화살촉처럼 생긴 2cm 정도의 껍데기(화석 부분)는 몸속 가장 끝부분에 위치해 있었으며 암모나이트와 동시대에 살았던 두족류이다 992 | 보니 같은 두족류인 암모나이트와 함께 설명되는 경우가 많다. 993 | 994 | 크리스 워들 995 | 축구 기자 루크 기넬(Luke Ginnell)은 '매직 크리스(Magic Chris)'라는 별명을 썼으며, 워들은 "유럽에서 가장 좋은 공격형 미드필더 중 한 명으로 널리 인정받았다"고 썼다. 996 | 1978년부터 1998년까지 이어진 프로 경력에서, 그는 뉴캐슬 유나이티드, 토트넘 홋스퍼, 올랭피크 드 마르세유, 셰필드 웬즈데이 등을 포함한 여러 클럽에서 활동했다. 997 | 1989년, 450만 파운드의 이적료로 토트넘에서 마르세유로 이적하면서 그는 세계에서 세 번째로 비싼 선수가 되었으며, 클럽과 함께 3회 연속으로 리그 1 우승을 하고 1991년 유러피언 컵 결승전 에서 뛰었다. 998 | 웬즈데이에서 활동할 때는 1992-93 시즌에 보여준 활약상을 통해 잉글랜드축구기자협회(FWA) 올해의 축구선수로 선정되었다. 999 | 워들은 1985년에서 1991 년까지 잉글랜드 축구 국가대표팀에서 62경기에 출전했으며, 1986년 FIFA 월드컵 준준결승, 1990년 FIFA 월드컵 준결승 진출을 함께 했다. 1000 | 또한 UEFA 유로 1988에 출전하기도 했다. 1001 | 그는 50대의 나이에도 세미프로페셔널 수준의 노던 카운티즈 이스트 리그의 할람 소속으로 경기를 뛰기도 했으며 프리미어리그와 UEFA 챔피언스리그 팀원으로 BBC 라디오 5 라이브와 계약을 맺고 있다. 1002 | 워들은 펠로 주니어스와 함께 축구 경력을 시작하여 화이트하우스 SC, 마운트 플레전트 SC, HMH 프린팅, 펠로 SC, 림 레인 SC 및 클라크 채프먼에서 활동했으며 1978-79 시즌이 시작되기 전에 토 로 타운에 입단했다. 1003 | 워들은 식품 가공업(조미료 공장)에 종사하면서 선덜랜드와 코번트리 시티와의 입단 테스트에서 탈락했다. 1004 | 그는 1980년 7월 뉴캐슬 유나이티드에 1,000 파운드의 금액으로 입단했다. 1005 | 그는 1980년 10월 22일에 있었던 슈루즈베리 타운과의 홈 경기(1-0 승리)에서 2부 데뷔전을 치렀으며, 유력한 공격형 미드필더로 빠르게 정착하였고, 1983-84 시즌 말미에는케빈 키건, 피터 비어슬리와 함께 뉴캐슬의 1부 승격을 이끌었다. 1006 | 워들은 1984년 9월 22일에 로프터스 로드에서 있었던 퀸스 파크 레인저스와의 경기에서 전반전에만 해트트릭을 하며 4-0의 우위를 가져왔다. 1007 | 그러나, QPR의 반격으로 경기는 5-5로 끝났다. 1008 | 그는 25세의 나이임에도, 잉글랜드 U-21에 발탁되었고 1985년 3월에 있었던 아일랜드와의 경기에서 데뷔했다. 1009 | 워들은 뉴캐슬에서 170경기 46득점의 기록을 남긴 후, 1985년 7월 1일 59만 파운드의 이적료를 통해토트넘 홋스퍼에 입단했다. 1010 | 그는 리그 개막일에 벌어진 왓퍼드와의 홈 경기(4-0 승)에서 리그 데뷔전을 치르며 두 개의 득점을 기록했지만, 3위로 마친 이전 시즌과는 달리 10위로 시즌을 마감하면서, 피터 슈리브스가 감독에서 해임되고 루턴 타운에서 온 데이비드 플릿이 그의 후임자로 임명됐다. 1011 | 토트넘에 입단한 후, 잉글랜드 대표팀에서 정기적으로 활동하게 됐고 멕시코에서 있었던 1986년 FIFA 월드컵에서 8강에 진출한 팀에서 비어슬리와 다시 연이 닿았다. 1012 | 그는 월드컵 이후 가장 유익한 시즌을 보냈다. 1013 | 그는 1987년 코번트리가 스퍼스를 물리쳤던 FA컵에서 준우승 메달을 획득했고 리그에서는 3위로 마감했으며 리그 컵에서는 준결승에 올랐다. 1014 | 같은 해, 워들은 팝 차트에 이름이 올라가기도 했으며, 스퍼스와 잉글랜드 대표팀 동료인 글렌 호들과의 듀엣으로 제작한 싱글 'Diamond Lights'가 UK Top 20을 만들었습니다. 1015 | 1988년에는 유럽 선수권 대회에서 조별 리그 세 경기를 모두 패배한 잉글랜드 대표팀의 일원으로 있었다. 1016 | 1985년 헤이젤 참사의 영향으로 잉글랜드의 클럽의 유럽 대항전 출전이 금지되면서 워들이 해외 팀으로 이적할 것이라는 이야기가 있었지만, 해외로 이적하기 전까지 네 시즌을 화이트 하트 레인에서 보냈다. 1017 | 1989년 7월 1일, 토트넘에서 138경기 33득점의 기록을 남긴 워들은 450만 파운드의 이적료를 통해 프랑스의 클럽 올랭피크 드 마르세유로 이적했고 이는 당시 축구선수의 영입을 위해 지불된 금액 중 세 번째로 높은 금액이었다. 1018 | 프랑스에 있는 동안 클럽은 리그 1 우승 3회(1990, 1991, 1992)의 업적을 일궈냈다. 1019 | 또한 마르세유는 1991년 유러피언컵 결승전에서 츠르베나 즈베즈다와의 경기에서 패배하고 준우승에 그쳤다. 1020 | 1991-92 시즌에는 레인저스에서 이적해서 한 시즌을 보내고 다시 스코틀랜드로 돌아간 잉글랜드의 미드필더 트레버 스티븐과 함께 뛰기도 했다. 1021 | 워들은 1990년 FIFA 월드컵 준결승에서 잉글랜드 소속으로 6경기에 선발 출전했다. 1022 | 그는 서독과의 준결승에서 팀이 1-1로 비긴 경기의 연장전에서 포스트를 강타했다. 1023 | 그러나 이 경기에 대한 그의 마지막 기여는 승부차기에서 실축한 것이었고, 볼은 바를 맞고 나갔으며 독일을 결승에 보내버린 것이었다. 1024 | 그는 이후 토너먼트 이전에 유리 겔러와 마이클 잭슨과의 우연한 만남을 승부차기 실축의 책임으로 돌렸다. 1025 | 워들에 대한 겔러의 고별사는 "당신이 더 높이 갈수록, 더 강하게 떨어진다"였다고 보도됐다. 1026 | 그는 잉글랜드가 이탈리아에게 2-1로 패배한 3위 결정전에서 후보로 경기를 시작했다. 1027 | 마르세유에서 있었던 몇 년 동안, 팬들은 그에게 '매직 크리스(Magic Chris)'라는 별명을 붙여줬다. 1028 | 그는 전 마르세유 선수였던 로예르 마그누손의 후계자로 알려지고 있다. 1029 | 1998년에는 클럽의 100주년을 기념하여 진행된 올랭피크 드 마르세유 역대 최고의 선수 선정 투표에서 장피에르 파팽에 이어 2위에 오르기도 했다. 1030 | 그는 클럽에서 팝 뮤직 경력을 다시 이어갔고 팀 동료인 바질 볼리와 함께 "We've Got a Feeling" 이라는 노래를 녹음했다. 1990년에 있었던 잉글랜드의 승부차기 패배 이후 1년 만에, 워들과 마르세유는 1991년 유러피언 컵 결승전에 진출했다. 워들은 승부차기에서 나서지는 않았고 경기를 정규 시간을 0-0으로 끝낸 후 승부차기에서 다시 패배했다. 마르세유가 1993년에 유러피언 컵에서 우승했을 때는 워들이 이미 클럽을 떠난 상황이었다. 1031 | 워들은 1992년 7월에 100만 파운드의 이적료를 통해 셰필드 웬즈데이로 이적하면서 잉글랜드로 돌아왔고, 트레버 프랜시스의 지도를 받았다. 1032 | 이 클럽은 1992-93 시즌에 두 개의 국내 컵 대회 결승에 진출했으며(모두 아스널에게 패배했고 워들은 FA컵 결승전 재경기에서 웬즈데이의 득점을 기록했다), 1033 | 워들은 1993년에 축구기자협회 올해의 축구 선수로 선정되었다. 1034 | 1993-94 시즌에는 웬즈데이의 리그 컵 준결승 진출을 도왔지만, 이 우승 트로피를 향한 마지막 도전은 맨체스터 유나이티드에 의해 좌절되었고, 웬즈데이는 그 다음 두 시즌을 중하위권으로 마쳤으며, 1995년에는 프랜시스가 해임되고 워들과 함께 했었던 전직 토트넘 감독 데이비드 플릿이 이어받았다. 1035 | 이러한 활약에도 그는 1990년 7월 보비 롭슨의 뒤를 이어받은 그레엄 테일러 감독 하에서 단 3경기의 A매치에 출전했다. 1036 | 1996년 1월, 케빈 키건은 징계를 받은 다비드 지놀라의 대체를 위해 뉴캐슬 유나이티드에 워들을 재영입하려고 했지만, 10년도 더 이전에 뉴캐슬 팀에서 그와 함께 뛴 선수의 재영입에 대한 키건의 50만 파운드 제의는 거절됐고 키건은 데이비드 플릿이 이 35세의 선수에게 붙인 1백만 파운드의 가격을 지불하고 싶지 않았다. 1037 | 이 시기에 셀틱, 리즈 유나이티드, 선덜랜드 역시 워들과의 계약에 관심이 있었지만, 이적이 성사되지는 않았다. 1038 | 또한 번리가 그를 선수 겸 감독으로 선임하는 데 관심을 드러냈지만 워들은 힐즈버러에서 시즌을 마쳤다. 1039 | 109경기에 출전해서 10개의 득점과 그보다 더 많은 도움을 기록한 그의 힐즈버러에서의 마지막 경력은 부상으로 인해 망쳐졌고 1996-97 시즌에는 5경기를 뛰고 방출되었다 1040 | (올즈는 프리미어십의 상위권에 위치했었던 상황이었고, 젊은 감각 촬영 한 때 그는 1996-97 시즌에 5 개 게임을 출시 된 리치 험프리 - 5 경기에서 4 골을 - 그의 날개 아래) 후 데이비드 플리트 (David Pleat)가 109 경기를 뛰면서 더 많은 어시스트로 10 골을 넣었다. 1041 | 1996년 9월, 그는 스코틀랜드 퍼스트 디비전의 폴커크에 입단했지만, 그 다음달에 디비전 원의 브래드퍼드 시티에서 뛰기 위해 국경의 남쪽으로 돌아왔다. 1042 | 짧았지만 시티에서의 시간은 성공적이었고 그는 팬들의 확실한 지지를 받았다. 1043 | 그는 TV로 생중계된 허더즈필드 타운과의 경기의 코너킥 상황에서 직접 득점을 넣기도 했다. 1044 | 또한, 그가 구디슨 파크에서 있었던 에버턴과의 FA컵 경기(3-2 승)에서 넣은 골은 1997년 2 월 '매치 오브 더 데이 이달의 골(Match of the Day Goal of the Month)'에서 2위를 차지했다. 1045 | 브래드퍼드와 함께한 그의 노력은 시즌을 완전히 마치지 못했지만 디비전 원에서의 잔류에 기여했다. 1046 | 1997 년 3월, 7만 5천 파운드의 이적료를 통해 어렸을 때 응원했던 선덜랜드로 이적했고 에버튼을 상대로 하나의 득점을 올리고 선덜랜드의 득점에 도움을 줬지만 시즌이 끝날 때 선덜랜드가 프리미어리그에서 강등되는 것을 막지 못했다. 1047 | 1997년 5월, 그는 자유 이적으로 로커 파크로 적을 옮겼고 번리의 선수 겸 감독으로 선임됐다. 1048 | 번리는 실망스러운 시즌을 보냈고, 시즌이 끝날 때 강등을 면했을 뿐이었다. 1049 | 그는 1997년 10월에 있었던 본머스와의 경기(2-2 무)에서 하나의 득점을 기록했다. 1050 | 워들은 여름에 번리를 떠났고 1998년 9월에 토키 유나이티드에 입단했다. 1051 | 그는 수요일 토필드에서 7 번 뛰었고 코치로 수요일 셰필드로 돌아왔다. 1052 | 그는 1999 년 7 월 예비 팀 코치로 임명되어 지역 선술집에서 뛰었지만 2000 년 6 월 폴 주얼 (Paul Jewell) 을 감독으로 임명했다. 1053 | 토키 유나이티드에서 출발 한 후, Waddle는 비리 그 워크 Town 타운 에서 60 번의 출전과 3 골을 기록하면서 2 계절을 즐겼습니다. 1054 | 그의 가장 두드러진 모습은 Frickley Athletic과의 12–0 노던 프리미어 리그 기록에서 승리 한 것입니다. 1055 | 그는 또한 북부 프리미어 리그 퍼스트 디비전의 Glapwell 과 Stocksbridge Park Steels 에 출연하여 비 리그 수준에서 40 대 초반까지 경력을 계속했습니다. 1056 | 아마추어 수준에서 연주 한 셰필드 2012-13 시즌 동안 할람에 대한 Wragg 이상-40 리그 그는 무릎 부상으로 11 년 후 은퇴 와서 위해 서명 셰필드 기반의 비 리그 측 경이 2013년 7월 22일에. 그는 프리 시즌에 체스터 필드에 대한 데뷔를했다. 1057 | 하프 타임에 교체 선수로 등장했다. 1058 | 한림 FC는 6-2로 패했다. 1059 | Waddle은 2013 년 8 월 1 일에 1 년 계약을 체결하여 2013-14 시즌 프로모션 추진을 위해 ESPN 해설 팀의 일원으로 남아있는 한남을 약속했습니다. 1060 | 1985 년 3 월 26 일, 여전히 뉴캐슬 선수였던 Waddle은 Bobby Robson 의 잉글랜드에 의해 2-1로 승리하여 아일랜드 공화국 에서 처음으로 선임되었습니다. 1061 | 그는 곧 잉글랜드 대표팀의 정규 멤버가되었으며 그해 10 월 16 일 터키 에서 5-0으로이긴 10 번째 국제 경기에서 잉글랜드의 첫 골을 기록했다. 1062 | Waddle은 1986 년 과 1990 년 FIFA 월드컵 및 UEFA 유로 1988 에서 잉글랜드 대표팀에있었습니다. 1063 | 잉글랜드는 3 경기를 모두 잃은 유로 88의 그룹 스테이지에서 탈락했지만 1986 년 월드컵 준준결승과 1990 년 준결승에 도달했다. 1064 | 총격전에서 바 위로 1 인치는 서독으로 패배. 그는 잉글랜드가 진행될 경우 다음 경기에서 경기를 중단 한 Paul Gascoigne 이 너무 화가 나서 5 차 페널티를 받았다고 말했다. 1065 | 1990 년 월드컵에서의 Waddle의 공연은 2010 년 "The Guardian" 을 위해 썼던 Rob Bagchi에 의해 "최고"로 묘사되었습니다. 1066 | 그는 1991 년 10 월 16 일 터키에서 1-0으로 승리하면서 62 번의 캡을 마지막으로 우승했다. 1067 | 1989 년 5 월 27 일 스코틀랜드 와의 마지막 경기에서 잉글랜드는 6 골을 기록했다. 1068 | 1994 년 초 Terry Venables 가 새로운 잉글랜드 감독이되었을 때, 덴마크 와의 첫 경기에서 Waddle을 분대에 포함 시키려고 애썼다. 1069 | 그러나 Waddle은 당시 부상을 입었고 선택할 수 없었습니다. 1070 | 1997-98 시즌을 감독으로 보냈음에도 불구하고 Waddle은 은퇴 후 코칭으로 돌아 오지 않았으며 TV 축구 전문가, 논평자 및 스포츠 신문 작가가되었습니다. 1071 | 그는 이전에 Setanta Sports 및 ESPN 에서 근무했으며 현재 BBC Radio Five Live 의 프리미어 리그 축구 커버리지 분석가로 일하고 있습니다. 1072 | Waddle은 BBC Radio Five Live 에 프리미어 리그 경기의 요약으로 출연했으며 "The Sun" 신문에도 기사를 썼습니다. 1073 | Waddle은 Setanta Sports 와 2008-09 년 잉글랜드의 모든 시합에 대해 논평하기 위해 계약을 체결했습니다. 1074 | Waddle은 ESPN 의 잉글리쉬 프리미어 리그 축구 커버리지에 대한 공동 의견을 제출했으며 아랍 에미리트 두바이의 스튜디오에서 잉글리쉬 프리미어 리그를 커버하는 Showsports Arabia의 전문가입니다. 1075 | 2003 년 티에리 앙리 (Thierry Henry) 는 꿈의 팀 라인업에서 Waddle을 지명했습니다. 1076 |   에 잉글랜드 로의 무거운 패배 독일 의 두 번째 라운드에서 2010 FIFA 월드컵, 뒤뚱는 비판 영어 축구 협회는 주장 :는 "FA는 자신의 뒷부분에 앉아서 대회 이후 대회 후 아무것도 토너먼트을한다. 왜 듣지 않습니까? 왜 그들은 다른 나라를보고 '어떻게 인재를 계속 생산합니까?'라고 묻지 않습니까? 우리는 선수들로부터 재능을 코치합니다. . . 우리는 많은 아이디어가 부족하고 너무 실망입니다. 우리 리그의 돈은 무섭고 우리가하는 일은 쓰레기 아이디어로 낭비하는 것입니다. . . 우리는 템포를 유지하면 기회가 있다고 생각합니다. 우리는 한 방향으로 만 놀 수 있으며 가난합니다. 당신은 축구를 계속하고 시간당 백 마일을 뛰고 90 분 동안 팀을 압박하는 트로피를 얻기를 기대할 수 없습니다. 당신은 느리게, 느리게, 빨리 재생할 수 있어야하고 우리는 그것을 할 수 없습니다. " 1077 | Waddle에는 딸 Brooke과 아들 Jack이 있습니다. 1078 | 2012 년 4 월 29 일 Jack은 Chesterfield 에서 1 년 간의 첫 팀 계약을 체결했습니다. 1079 | 그의 사촌 인 앨런 와들 (Alan Waddle )은 핼리팩스 타운, 리버풀, 레스터 시티, 스완 지 시티, 뉴 포트 카운티, 맨스필드 타운, 하 틀풀 유나이티드 및 피터 버러 유나이티드 에서 리그 풋볼을 했습니다 . 1080 | 2005 년, 그는 셰필드의 Dore 에있는 한 술집 에서 한 남자를 공격 한 혐의로 기소되었습니다. 1081 | 그러나 증거 부족으로 기소됐다. 1082 | Waddle은 BBC 코미디 "The Fast Show" 에서 사용 된 대중 문화 참고 자료 풀의 핵심 부분이었습니다. 1083 | Waddle에 대한 언급과 사진은 쇼의 "Chanel 9"뉴스 세그먼트에서 정기적으로 등장했습니다. 1084 | 올랭피크 드 마르세유 1085 | 잉글랜드 1086 | 개인 1087 | 1088 | 유갈 1089 | 유갈(劉揭, ? ~ 기원전 166년)은 전한 전기의 관료이다. 1090 | 고제 때 낭(郞)이 되었다. 1091 | 고후 8년(기원전 180년), 고후가 죽고 동생 주허후 유장과 함께 여씨 타도를 모의한 제애왕이 거병하였다. 1092 | 중앙군을 쥐고 있었던 여산과 여록은 진압에 나서려 하였으나, 주발·진평의 사주를 받은 역기의 설득으로 봉국으로 돌아가려 하였다. 1093 | 그러나 가수의 간언을 들은 여산이 돌아가지 않고 입궁하려 하였다. 1094 | 전객 유갈은 주발의 명으로 황명을 사칭하여 역기와 함께 여록을 재차 설득하였고, 결국 여록은 북군(北軍)을 주발에게 넘기고 정말로 봉국으로 돌아갔다. 1095 | 여록이 돌아가자 유갈은 궁문을 닫고 여산이 들어오지 못하게 하였다. 1096 | 곧 대신들이 궁궐을 장악하였고, 여산은 유장에게 살해당하였다. 1097 | 여산을 죽인 대신들은 여씨 일족을 잡아들여 주멸하였고, 대왕 유항을 불러들여 황제로 옹립하였다 1098 | (문제). 유갈은 이때의 공으로 양신후(陽信侯)에 봉해지고 금 천 근을 받았다. 1099 | 양신이후 14년(기원전 166년)에 죽어 시호를 이(夷)라 하였다. 1100 | 아들 유중의(劉中意)가 작위를 이었으나, 경제 6년(기원전 151년) 죄를 지어 작위가 박탈되었다. 1101 | 1102 | 배가본드 2 1103 | 《배가본드 2》는 시즌 1을 시청했던 수많은 시청자들의 계속적인 요구에 따라, 편성이 확정된 드라마로서, 시청자들에게 또 하나의 전환점을 제공한 액션멜로 드라마다. 1104 | 차달건의 사막 이후의 다음 이야기로 전개 될것을 예상한다 1105 | 1106 | 모클렌어 1107 | 모클렌어(Moklen)는 태국 남부 서해안에서 쓰이는 오스트로네시아어족 언어이다. 1108 | 태국 남부와 미얀마에 분포하는 모켄어와 매우 가까운 관계이며 함께 모클렌어군을 이룬다. 1109 | Larish (2005)는 태국 내에서 모클렌어가 쓰이는 주요 지역을 3곳으로 나눈다. 1110 | 모클렌어는 주로 팡응아주에서 쓰이지만 라농주와 푸껫섬에서도 쓰인다. 1111 | Swastham (1982)은 태국 남부 팡응아주 타이므앙군 람피 마을()의 모클렌어 방언을 기술하였다. 1112 | Swastham (1982)은 람피 마을 주변의 모클렌어 사용 마을을 다음과 같이 북쪽에서 남쪽 순으로 나열한다. 1113 | 방삭(Bang Sak), 쿡칵(Khuk Khak), 방니앙(Bang Niang), 퉁마프라우(Thung Maphraw), 타찻차이(Tha Chat Chai). 1114 | Bishop & Peterson (1987)은 다양한 모클렌어 방언을 조사하였다. 1115 | 1116 | 총참모장 1117 | 총참모장은 군대에서 참모의 수장을 가리킨다. --------------------------------------------------------------------------------