├── requirements.txt ├── download_pretrained.py ├── preprocessing.py ├── README.md ├── test.py ├── export_to_onnx.py ├── .gitignore ├── train.py ├── model.py ├── LICENSE └── Preprocessing.ipynb /requirements.txt: -------------------------------------------------------------------------------- 1 | matplotlib 2 | numpy==1.19.5 3 | pandas==1.4.1 4 | pytorch-lightning==1.5.4 5 | torch==1.8.1 6 | torchmetrics==0.5.0 7 | torchvision==0.9.1 8 | tornado==6.1 9 | tqdm==4.60.0 10 | transformers==4.8.2 11 | wget==3.2 12 | kobert-tokenizer==0.1 -------------------------------------------------------------------------------- /download_pretrained.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | from transformers import BertModel 3 | from kobert_tokenizer import KoBERTTokenizer 4 | 5 | 6 | parser = argparse.ArgumentParser() 7 | parser.add_argument('--save_path', 8 | type=str, 9 | default='pretrained', 10 | help='where to save pretrained model and tokenizer') 11 | args = parser.parse_args() 12 | 13 | 14 | model = BertModel.from_pretrained('skt/kobert-base-v1', output_attentions=True) 15 | tokenizer = KoBERTTokenizer.from_pretrained('skt/kobert-base-v1') 16 | 17 | model.save_pretrained(args.save_path) 18 | tokenizer.save_pretrained(args.save_path) -------------------------------------------------------------------------------- /preprocessing.py: -------------------------------------------------------------------------------- 1 | import re 2 | import pandas as pd 3 | from tqdm import tqdm 4 | 5 | 6 | def removing_non_korean(df): 7 | for idx, row in tqdm(df.iterrows(), desc='removing_non_korean', total=len(df)): 8 | new_doc = re.sub('[^가-힣]', '', row['document']).strip() 9 | df.loc[idx, 'document'] = new_doc 10 | return df 11 | 12 | 13 | def generate_preprocessed(data_path): 14 | 15 | train = pd.read_csv(f'{data_path}/ratings_train.txt', sep='\t') 16 | test = pd.read_csv(f'{data_path}/ratings_test.txt', sep='\t') 17 | 18 | # 필요없는 열은 drop 19 | train.drop(['id'], axis=1, inplace=True) 20 | test.drop(['id'], axis=1, inplace=True) 21 | 22 | # null 제거 23 | train.dropna(inplace=True) 24 | test.dropna(inplace=True) 25 | 26 | # 중복 제거 27 | train.drop_duplicates(subset=['document'], inplace=True, ignore_index=True) 28 | test.drop_duplicates(subset=['document'], inplace=True, ignore_index=True) 29 | 30 | train.to_csv(f'{data_path}/train_clean.csv', index=False) 31 | test.to_csv(f'{data_path}/test_clean.csv', index=False) 32 | 33 | # 한국어 외 제거 34 | train = removing_non_korean(train) 35 | test = removing_non_korean(test) 36 | 37 | train.to_csv(f'{data_path}/train_only_korean.csv', index=False) 38 | test.to_csv(f'{data_path}/test_only_korean.csv', index=False) 39 | 40 | # mecab, komoran 형태소 분석 결과는 테스트 성능이 낮아 포함하지 않음 -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Naver sentiment movie corpus(NSMC) BERT Pytorch Lightning 2 | 3 | [[POST] ⚡pytorch lightning 으로 koBERT Fine-tuning 하기 - NSMC](https://velog.io/@jaylnne/Pytorch-Lightning-%EC%9C%BC%EB%A1%9C-koBERT-Fine-Tuning-%ED%95%B4%EB%B3%B4%EA%B8%B0-NSMC) 4 | 5 | ## Download pretrained model and tokenizer 6 | ```shell 7 | $ python download_pretrained.py --save_path pretrained 8 | ``` 9 | - It will create `'./pretrained'` directory. 10 | - It will download kobert pretrained model and tokenizer files below `'./pretrained'` directory. 11 | 12 | ## Train 13 | ```shell 14 | # run example 15 | python train.py 16 | ``` 17 | - arguments 18 | - seed: random seed number 19 | - data_path: where to prepare data 20 | - max_epoch: maximum number of epochs to train 21 | - num_gpus: number of available gpus (-1: all avauilable) 22 | - mode: train only korean data or not 23 | - save_path: where to save checkpoints files 24 | - valid_size: size of validation file 25 | - max_seq_len: number of available gpus 26 | - batch_size: batch size 27 | 28 | ## Test 29 | ```shell 30 | # run example 31 | python test.py --ckpt_path checkpoints/epoch=05-val_acc=0.897.ckpt 32 | ``` 33 | - arguments 34 | - ckpt_path: checkpoint file path which is execute test with 35 | - The rest is same with train.py 36 | 37 | ## Export to onnx 38 | ```shell 39 | # run example 40 | python export_to_onnx.py --ckpt_path checkpoints/epoch=05-val_acc=0.897.ckpt 41 | ``` 42 | - It will create `model.onnx`. -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import argparse 3 | from pytorch_lightning import Trainer, seed_everything 4 | 5 | from model import * 6 | 7 | 8 | def main(): 9 | parser = argparse.ArgumentParser() 10 | parser.add_argument('--seed', 11 | type=int, 12 | default=42) 13 | parser.add_argument('--data_path', 14 | type=str, 15 | default='data', 16 | help='where to prepare data') 17 | parser.add_argument('--num_gpus', 18 | type=int, 19 | default=-1, 20 | help='number of available gpus') 21 | parser.add_argument('--mode', 22 | type=str, 23 | default='clean', 24 | choices=['clean', 'only_korean']) 25 | parser.add_argument('--ckpt_path', 26 | type=str, 27 | help='checkpoint file path') 28 | parser.add_argument('--valid_size', 29 | type=float, 30 | default=0.1, 31 | help='size of validation file') 32 | parser.add_argument('--max_seq_len', 33 | type=int, 34 | default=200, 35 | help='maximum length of input sequence data') 36 | parser.add_argument('--batch_size', 37 | type=int, 38 | default=32, 39 | help='batch size') 40 | args = parser.parse_args() 41 | 42 | seed_everything(args.seed, workers=True) 43 | 44 | dm = NSMCDataModule( 45 | data_path=args.data_path, 46 | mode=args.mode, 47 | valid_size=args.valid_size, 48 | max_seq_len=args.max_seq_len, 49 | batch_size=args.batch_size, 50 | ) 51 | dm.setup('test') 52 | 53 | model = NSMCClassification() 54 | 55 | trainer = Trainer( 56 | accelerator='gpu', 57 | strategy="ddp", 58 | devices=args.num_gpus, 59 | auto_select_gpus=True, 60 | ) 61 | trainer.test(model, dm, ckpt_path=args.ckpt_path) 62 | 63 | 64 | if __name__ == '__main__': 65 | main() -------------------------------------------------------------------------------- /export_to_onnx.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import argparse 3 | import numpy as np 4 | from pytorch_lightning import Trainer, seed_everything 5 | 6 | from model import * 7 | 8 | 9 | def main(): 10 | parser = argparse.ArgumentParser() 11 | parser.add_argument('--seed', 12 | type=int, 13 | default=42) 14 | parser.add_argument('--data_path', 15 | type=str, 16 | default='data', 17 | help='where to prepare data') 18 | parser.add_argument('--num_gpus', 19 | type=int, 20 | default=-1, 21 | help='number of available gpus') 22 | parser.add_argument('--mode', 23 | type=str, 24 | default='clean', 25 | choices=['clean', 'only_korean']) 26 | parser.add_argument('--ckpt_path', 27 | type=str, 28 | help='checkpoint file path') 29 | parser.add_argument('--valid_size', 30 | type=float, 31 | default=0.1, 32 | help='size of validation file') 33 | parser.add_argument('--max_seq_len', 34 | type=int, 35 | default=200, 36 | help='maximum length of input sequence data') 37 | parser.add_argument('--batch_size', 38 | type=int, 39 | default=32, 40 | help='batch size') 41 | args = parser.parse_args() 42 | 43 | seed_everything(args.seed, workers=True) 44 | 45 | model = NSMCClassification() 46 | 47 | input_ids = torch.as_tensor(np.ones([1, 200]), dtype=int) 48 | attention_mask = torch.as_tensor(np.ones([1, 200]), dtype=int) 49 | token_type_ids = torch.as_tensor(np.ones([1, 200]), dtype=int) 50 | 51 | torch.onnx.export(model, 52 | args=(input_ids, attention_mask, token_type_ids), 53 | f='model.onnx', 54 | export_params=True, 55 | do_constant_folding=True, 56 | opset_version=11, 57 | output_names=['output'], 58 | ) 59 | 60 | 61 | if __name__ == '__main__': 62 | 63 | main() -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Custom 2 | lightning_logs/ 3 | pretrained/ 4 | checkpoints/ 5 | 6 | # Byte-compiled / optimized / DLL files 7 | __pycache__/ 8 | *.py[cod] 9 | *$py.class 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | wheels/ 28 | pip-wheel-metadata/ 29 | share/python-wheels/ 30 | *.egg-info/ 31 | .installed.cfg 32 | *.egg 33 | MANIFEST 34 | 35 | # PyInstaller 36 | # Usually these files are written by a python script from a template 37 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 38 | *.manifest 39 | *.spec 40 | 41 | # Installer logs 42 | pip-log.txt 43 | pip-delete-this-directory.txt 44 | 45 | # Unit test / coverage reports 46 | htmlcov/ 47 | .tox/ 48 | .nox/ 49 | .coverage 50 | .coverage.* 51 | .cache 52 | nosetests.xml 53 | coverage.xml 54 | *.cover 55 | *.py,cover 56 | .hypothesis/ 57 | .pytest_cache/ 58 | 59 | # Translations 60 | *.mo 61 | *.pot 62 | 63 | # Django stuff: 64 | *.log 65 | local_settings.py 66 | db.sqlite3 67 | db.sqlite3-journal 68 | 69 | # Flask stuff: 70 | instance/ 71 | .webassets-cache 72 | 73 | # Scrapy stuff: 74 | .scrapy 75 | 76 | # Sphinx documentation 77 | docs/_build/ 78 | 79 | # PyBuilder 80 | target/ 81 | 82 | # Jupyter Notebook 83 | .ipynb_checkpoints 84 | 85 | # IPython 86 | profile_default/ 87 | ipython_config.py 88 | 89 | # pyenv 90 | .python-version 91 | 92 | # pipenv 93 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 94 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 95 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 96 | # install all needed dependencies. 97 | #Pipfile.lock 98 | 99 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 100 | __pypackages__/ 101 | 102 | # Celery stuff 103 | celerybeat-schedule 104 | celerybeat.pid 105 | 106 | # SageMath parsed files 107 | *.sage.py 108 | 109 | # Environments 110 | .env 111 | .venv 112 | env/ 113 | venv/ 114 | ENV/ 115 | env.bak/ 116 | venv.bak/ 117 | 118 | # Spyder project settings 119 | .spyderproject 120 | .spyproject 121 | 122 | # Rope project settings 123 | .ropeproject 124 | 125 | # mkdocs documentation 126 | /site 127 | 128 | # mypy 129 | .mypy_cache/ 130 | .dmypy.json 131 | dmypy.json 132 | 133 | # Pyre type checker 134 | .pyre/ 135 | -------------------------------------------------------------------------------- /train.py: -------------------------------------------------------------------------------- 1 | import torch 2 | import argparse 3 | from pytorch_lightning import Trainer, seed_everything 4 | from pytorch_lightning.callbacks import ModelCheckpoint 5 | from pytorch_lightning.callbacks.early_stopping import EarlyStopping 6 | 7 | from model import * 8 | 9 | 10 | def main(): 11 | 12 | parser = argparse.ArgumentParser() 13 | parser.add_argument('--seed', 14 | type=int, 15 | default=42) 16 | parser.add_argument('--data_path', 17 | type=str, 18 | default='data', 19 | help='where to prepare data') 20 | parser.add_argument('--max_epoch', 21 | type=int, 22 | default=10, 23 | help='maximum number of epochs to train') 24 | parser.add_argument('--num_gpus', 25 | type=int, 26 | default=-1, 27 | help='number of available gpus') 28 | parser.add_argument('--mode', 29 | type=str, 30 | default='clean', 31 | choices=['clean', 'only_korean']) 32 | parser.add_argument('--save_path', 33 | type=str, 34 | default='checkpoints', 35 | help='where to save checkpoint files') 36 | parser.add_argument('--valid_size', 37 | type=float, 38 | default=0.1, 39 | help='size of validation file') 40 | parser.add_argument('--max_seq_len', 41 | type=int, 42 | default=200, 43 | help='maximum length of input sequence data') 44 | parser.add_argument('--batch_size', 45 | type=int, 46 | default=64, 47 | help='batch size') 48 | args = parser.parse_args() 49 | 50 | seed_everything(args.seed, workers=True) 51 | 52 | dm = NSMCDataModule( 53 | data_path=args.data_path, 54 | mode=args.mode, 55 | valid_size=args.valid_size, 56 | max_seq_len=args.max_seq_len, 57 | batch_size=args.batch_size, 58 | ) 59 | dm.prepare_data() 60 | dm.setup('fit') 61 | 62 | model = NSMCClassification() 63 | 64 | checkpoint_callback = ModelCheckpoint( 65 | monitor='val_acc', 66 | dirpath=args.save_path, 67 | filename='{epoch:02d}-{val_acc:.3f}', 68 | verbose=True, 69 | save_last=False, 70 | mode='max', 71 | save_top_k=1, 72 | ) 73 | early_stopping = EarlyStopping( 74 | monitor='val_acc', 75 | mode='max', 76 | ) 77 | 78 | trainer = Trainer( 79 | max_epochs=args.max_epoch, 80 | accelerator='gpu', 81 | strategy="ddp", 82 | devices=args.num_gpus, 83 | auto_select_gpus=True, 84 | callbacks=[checkpoint_callback, early_stopping], 85 | ) 86 | trainer.fit(model, dm) 87 | 88 | 89 | if __name__ == '__main__': 90 | main() -------------------------------------------------------------------------------- /model.py: -------------------------------------------------------------------------------- 1 | import os 2 | import wget 3 | import torch 4 | import warnings 5 | warnings.filterwarnings('ignore') 6 | import pandas as pd 7 | import torch.nn as nn 8 | import torch.nn.functional as F 9 | import pytorch_lightning as pl 10 | from transformers import BertModel 11 | from kobert_tokenizer import KoBERTTokenizer 12 | from torch.utils.data import random_split, Dataset, DataLoader 13 | from sklearn.metrics import precision_recall_fscore_support, accuracy_score 14 | 15 | from preprocessing import generate_preprocessed 16 | 17 | 18 | class NSMCClassification(pl.LightningModule): 19 | 20 | def __init__(self): 21 | super(NSMCClassification, self).__init__() 22 | 23 | # load pretrained koBERT 24 | self.bert = BertModel.from_pretrained('pretrained', output_attentions=True) 25 | 26 | # simple linear layer (긍/부정, 2 classes) 27 | self.W = nn.Linear(self.bert.config.hidden_size, 2) 28 | self.num_classes = 2 29 | 30 | def forward(self, input_ids, attention_mask, token_type_ids): 31 | 32 | out = self.bert( 33 | input_ids=input_ids, 34 | attention_mask=attention_mask, 35 | token_type_ids=token_type_ids, 36 | ) 37 | 38 | h_cls = out['last_hidden_state'][:, 0] 39 | logits = self.W(h_cls) 40 | attn = out['attentions'] 41 | 42 | return logits, attn 43 | 44 | def training_step(self, batch, batch_nb): 45 | # batch 46 | input_ids = batch['input_ids'] 47 | attention_mask = batch['attention_mask'] 48 | token_type_ids = batch['token_type_ids'] 49 | label = batch['label'] 50 | 51 | # forward 52 | y_hat, attn = self.forward(input_ids, attention_mask, token_type_ids) 53 | 54 | # BCE loss 55 | loss = F.cross_entropy(y_hat, label.long()) 56 | 57 | # logs 58 | tensorboard_logs = {'train_loss': loss} 59 | 60 | return {'loss': loss, 'log': tensorboard_logs} 61 | 62 | def validation_step(self, batch, batch_nb): 63 | # batch 64 | input_ids = batch['input_ids'] 65 | attention_mask = batch['attention_mask'] 66 | token_type_ids = batch['token_type_ids'] 67 | label = batch['label'] 68 | 69 | # forward 70 | y_hat, attn = self.forward(input_ids, attention_mask, token_type_ids) 71 | 72 | # loss 73 | loss = F.cross_entropy(y_hat, label.long()) 74 | 75 | # accuracy 76 | a, y_hat = torch.max(y_hat, dim=1) 77 | val_acc = accuracy_score(y_hat.cpu(), label.cpu()) 78 | val_acc = torch.tensor(val_acc) 79 | self.log('val_acc', val_acc, prog_bar=True) 80 | 81 | return {'val_loss': loss, 'val_acc': val_acc} 82 | 83 | def validation_end(self, outputs): 84 | avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean() 85 | avg_val_acc = torch.stack([x['val_acc'] for x in outputs]).mean() 86 | 87 | tensorboard_logs = {'val_loss': avg_loss,'avg_val_acc':avg_val_acc} 88 | return {'avg_val_loss': avg_loss, 'progress_bar': tensorboard_logs} 89 | 90 | def test_step(self, batch, batch_nb): 91 | input_ids = batch['input_ids'] 92 | attention_mask = batch['attention_mask'] 93 | token_type_ids = batch['token_type_ids'] 94 | label = batch['label'] 95 | 96 | y_hat, attn = self.forward(input_ids, attention_mask, token_type_ids) 97 | 98 | a, y_hat = torch.max(y_hat, dim=1) 99 | test_acc = accuracy_score(y_hat.cpu(), label.cpu()) 100 | test_acc = torch.tensor(test_acc) 101 | 102 | self.log_dict({'test_acc': test_acc}) 103 | 104 | return {'test_acc': test_acc} 105 | 106 | def test_end(self, outputs): 107 | avg_test_acc = torch.stack([x['test_acc'] for x in outputs]).mean() 108 | 109 | tensorboard_logs = {'avg_test_acc': avg_test_acc} 110 | 111 | return {'avg_test_acc': tensorboard_logs} 112 | 113 | def configure_optimizers(self): 114 | parameters = [] 115 | for p in self.parameters(): 116 | if p.requires_grad: 117 | parameters.append(p) 118 | 119 | optimizer = torch.optim.Adam(parameters, lr=2e-05, eps=1e-08) 120 | 121 | return optimizer 122 | 123 | 124 | class NSMCDataset(Dataset): 125 | 126 | def __init__(self, file_path, max_seq_len): 127 | self.data = pd.read_csv(file_path) 128 | self.max_seq_len = max_seq_len 129 | self.tokenizer = KoBERTTokenizer.from_pretrained('pretrained') 130 | 131 | def __len__(self): 132 | return len(self.data) 133 | 134 | def __getitem__(self, index): 135 | data = self.data.iloc[index] 136 | 137 | doc = data['document'] 138 | features = self.tokenizer.encode_plus(str(doc), 139 | add_special_tokens=True, 140 | max_length=self.max_seq_len, 141 | pad_to_max_length='longest', 142 | truncation=True, 143 | return_attention_mask=True, 144 | return_tensors='pt', 145 | ) 146 | input_ids = features['input_ids'].squeeze(0) 147 | attention_mask = features['attention_mask'].squeeze(0) 148 | token_type_ids = features['token_type_ids'].squeeze(0) 149 | label = torch.tensor(data['label']) 150 | 151 | return { 152 | 'input_ids': input_ids, 153 | 'attention_mask': attention_mask, 154 | 'token_type_ids': token_type_ids, 155 | 'label': label 156 | } 157 | 158 | 159 | class NSMCDataModule(pl.LightningDataModule): 160 | 161 | def __init__(self, data_path, mode, valid_size, max_seq_len, batch_size): 162 | self.data_path = data_path 163 | self.full_data_path = f'{self.data_path}/train_{mode}.csv' 164 | self.test_data_path = f'{self.data_path}/test_{mode}.csv' 165 | self.valid_size = valid_size 166 | self.max_seq_len = max_seq_len 167 | self.batch_size = batch_size 168 | 169 | def prepare_data(self): 170 | # download data 171 | if not os.path.isfile(f'{self.data_path}/ratings_train.txt'): 172 | wget.download('https://github.com/e9t/nsmc/raw/master/ratings_train.txt', out=self.data_path) 173 | if not os.path.isfile(f'{self.data_path}/ratings_test.txt'): 174 | wget.download('https://github.com/e9t/nsmc/raw/master/ratings_test.txt', out=self.data_path) 175 | generate_preprocessed(self.data_path) 176 | 177 | def setup(self, stage): 178 | if stage in (None, 'fit'): 179 | full = NSMCDataset(self.full_data_path, self.max_seq_len) 180 | train_size = int(len(full) * (1 - self.valid_size)) 181 | valid_size = len(full) - train_size 182 | self.train, self.valid = random_split(full, [train_size, valid_size]) 183 | 184 | elif stage in (None, 'test'): 185 | self.test = NSMCDataset(self.test_data_path, self.max_seq_len) 186 | 187 | def train_dataloader(self): 188 | return DataLoader(self.train, batch_size=self.batch_size, num_workers=5, shuffle=True, pin_memory=True) 189 | 190 | def val_dataloader(self): 191 | return DataLoader(self.valid, batch_size=self.batch_size, num_workers=5, shuffle=False, pin_memory=True) 192 | 193 | def test_dataloader(self): 194 | return DataLoader(self.test, batch_size=self.batch_size, num_workers=5, shuffle=False, pin_memory=True) 195 | 196 | ## TODO predict_dataloader 추가 197 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /Preprocessing.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "id": "1d5b8d7d-2867-4b23-ab4d-587e0ff7ad0b", 6 | "metadata": {}, 7 | "source": [ 8 | "### 네이버 영화 평점 리뷰 데이터 노트북" 9 | ] 10 | }, 11 | { 12 | "cell_type": "markdown", 13 | "id": "ca267689-bfc2-45fc-9684-c04c885f1153", 14 | "metadata": {}, 15 | "source": [ 16 | "#### 읽어오기" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "id": "2953aea1-b1f6-4c29-b229-3e7629cb2d27", 23 | "metadata": {}, 24 | "outputs": [ 25 | { 26 | "data": { 27 | "text/plain": [ 28 | "'data/ratings_test (1).txt'" 29 | ] 30 | }, 31 | "execution_count": 1, 32 | "metadata": {}, 33 | "output_type": "execute_result" 34 | } 35 | ], 36 | "source": [ 37 | "import wget\n", 38 | "\n", 39 | "wget.download('https://github.com/e9t/nsmc/raw/master/ratings_train.txt', out='data')\n", 40 | "wget.download('https://github.com/e9t/nsmc/raw/master/ratings_test.txt', out='data')" 41 | ] 42 | }, 43 | { 44 | "cell_type": "code", 45 | "execution_count": 2, 46 | "id": "57eb0e7e-1e42-4273-95d5-8d863a810cca", 47 | "metadata": { 48 | "tags": [] 49 | }, 50 | "outputs": [], 51 | "source": [ 52 | "import pandas as pd\n", 53 | "\n", 54 | "train = pd.read_csv('data/ratings_train.txt', sep='\\t')\n", 55 | "test = pd.read_csv('data/ratings_test.txt', sep='\\t')\n", 56 | "\n", 57 | "# 필요없는 열은 drop\n", 58 | "train.drop(['id'], axis=1, inplace=True)\n", 59 | "test.drop(['id'], axis=1, inplace=True)" 60 | ] 61 | }, 62 | { 63 | "cell_type": "markdown", 64 | "id": "43bc5f78-3f71-452d-897f-b2f4d941174b", 65 | "metadata": {}, 66 | "source": [ 67 | "#### Null 값 제거하기" 68 | ] 69 | }, 70 | { 71 | "cell_type": "code", 72 | "execution_count": 3, 73 | "id": "d14ffad7-4e05-424f-ba28-61cc3d00e99b", 74 | "metadata": {}, 75 | "outputs": [ 76 | { 77 | "name": "stdout", 78 | "output_type": "stream", 79 | "text": [ 80 | "trainset null 개수:\n", 81 | "document 5\n", 82 | "label 0\n", 83 | "dtype: int64\n", 84 | "\n", 85 | "testset null 개수:\n", 86 | "document 3\n", 87 | "label 0\n", 88 | "dtype: int64\n" 89 | ] 90 | } 91 | ], 92 | "source": [ 93 | "# null 개수 확인\n", 94 | "print(f'trainset null 개수:\\n{train.isnull().sum()}\\n')\n", 95 | "print(f'testset null 개수:\\n{test.isnull().sum()}')" 96 | ] 97 | }, 98 | { 99 | "cell_type": "code", 100 | "execution_count": 4, 101 | "id": "fbb578b3-5c0d-499f-baeb-77daf0e86855", 102 | "metadata": {}, 103 | "outputs": [], 104 | "source": [ 105 | "train.dropna(inplace=True)\n", 106 | "test.dropna(inplace=True)" 107 | ] 108 | }, 109 | { 110 | "cell_type": "markdown", 111 | "id": "8c4f0b7f-bbcd-4049-85ae-295cac6ef340", 112 | "metadata": {}, 113 | "source": [ 114 | "#### 중복 제거하기" 115 | ] 116 | }, 117 | { 118 | "cell_type": "code", 119 | "execution_count": 5, 120 | "id": "22890b74-901c-4def-abc5-ea7f94c8bb4a", 121 | "metadata": {}, 122 | "outputs": [ 123 | { 124 | "name": "stdout", 125 | "output_type": "stream", 126 | "text": [ 127 | "중복 제거 전 train length: 149995\n", 128 | "중복 제거 후 train length: 146182\n", 129 | "\n", 130 | "중복 제거 전 test length: 49997\n", 131 | "중복 제거 후 test length: 49157\n", 132 | "\n" 133 | ] 134 | } 135 | ], 136 | "source": [ 137 | "print(f'중복 제거 전 train length: {len(train)}')\n", 138 | "train.drop_duplicates(subset=['document'], inplace=True, ignore_index=True)\n", 139 | "print(f'중복 제거 후 train length: {len(train)}\\n')\n", 140 | "print(f'중복 제거 전 test length: {len(test)}')\n", 141 | "test.drop_duplicates(subset=['document'], inplace=True, ignore_index=True)\n", 142 | "print(f'중복 제거 후 test length: {len(test)}\\n')" 143 | ] 144 | }, 145 | { 146 | "cell_type": "markdown", 147 | "id": "94867514-82e1-43d1-bb86-551bb946e844", 148 | "metadata": {}, 149 | "source": [ 150 | "#### 전체 데이터 label 분포 확인하기" 151 | ] 152 | }, 153 | { 154 | "cell_type": "code", 155 | "execution_count": 6, 156 | "id": "3d77bf92-7e0e-4852-b842-a524152f1989", 157 | "metadata": {}, 158 | "outputs": [ 159 | { 160 | "data": { 161 | "image/png": "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eYmtuXPcXP+dvp+//e1v3HzzzQwePJg33njjrJc1nDhxgmXLlnHdddfx/e9/n8cff7xBP55t6e/MpbP4+HiqqqpYvXp1o+XnppbYfvOb3zB27Fiuvvpq7HZ7o8s7Tu/zn//8J7fccgsxMTGkpKTwt7/9zdtTbTjvZ5A88cUXX/Dss88ya9YsLrjgAgYMGEBlZSVBQUGkp6fTt29fSkpKWLVqFZWVlWRmZjZ7f2+88QaXX345jz/+OOXl5Tz11FM899xzZGRktKp9l1xyCTabjX/84x/cdtttAJSXl3P77bdz4YUXUl1dze9+9ztuu+02duzYQUBAAD/96U954IEHiIiIYNasWQDGDENpaSkpKSlcdNFF1NbWsn37dm6//Xa2b99OREQEAPfddx+DBg3i2Wefxc/Pj//85z8NXgRff/115s2bx6233srcuXP5/PPPee6553C73Tz66KNMmTKFkpIS3n77bVavXg1wTjMNLpeLiy++mOTkZPz9/fnoo49YtWoVx48fZ+bMmQ22XbRoERMmTOD2229n586dZGRkYLPZjKnm9957j2nTpvHDH/6QlStXUllZyc9//nOOHDnCypUrW93GMwUGBnL11Vc3OwA2d46b6z+A7du3c+mll/LTn/6U+vr6Ztvy0EMP8ZOf/ISZM2eyefNmHnzwQbZs2cIVV1zh0bFERUXx6KOP8vTTT7N69WpCQ0ObnWGdPXs2n3/+OY888gj9+vXjpZde4o477iA3N9eYTYO2f558F6xdu5YVK1Zw9913c9111/Hhhx+SlZVFr169uP3224Fze9x4Y8SIEbz44oucOHGC7t278+WXX3LNNddw22234efnx/vvv8/ChQvp1q0b48eP54YbbuCuu+5i3bp1xlJinz59AM+ev9nZ2bz22mvMmzePAQMGcPDgQQoLC40QVVVVxU9+8hOCgoLIyMigV69e5OTkkJqayo4dO7BarSxfvpyHH36YJUuWEBUV1fqO+P8qKiqYOXMmVquVQ4cO8atf/Yo777yT1157DR8fH2O77du3M3DgQB5//HEOHjzIs88+y6JFi4zxpLa2ltTUVI4cOcIjjzxCcHAwGzZsYNq0aeTl5REaGnrObYVTffb6669TWlra5BJUc+e4uf6DUzPVCxYs4O677+Z73/seVqv1rGFx3bp1DBkyhGeffZb9+/ezYsUK/Pz8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OJ1OSkpKiI6OxsfHB39/f4qKioiJiSE3N5epU6cadbZu3crQoUPZsWMHw4cPb3EGSUS6ltLSUj766CNiYmK0xC9e0xJ/19FWS/wtBiSAxx57jIcffpgTJ04QERHBk08+ycmTJ0lLS2Pz5s2Eh4eTlZUFQGRkJImJiYwbNw4fHx+WLFmCj8+pgSQjI8O4BiAuLo64uDgAJk+ezPz587Hb7QQGBrJixYo2OTgR+W74+uuvmTNnDgsXLqRPnz5n3U5L/HI2WuLvOtpqid+jgHTllVeyZcuWRuXr169vcvv77ruP++67r1H54MGD2b59e6PyHj16sHLlSk+aIiJdzIkTJ5gzZw7JycmMHTsWwFjit1qtbbbEb7PZtMQvIgZ9k7aIdFput5tFixYxaNAgUlNTjfL4+Hhyc3MBGi3xOxwOamtrOXDggLHEb7VajSV+t9vdqM7WrVsBtMQvIgaPZpBERDrCe++9x7Zt27jsssuYMGECAHPnzmXGjBla4heRdmVxn6cf1/BmjfElXTjXKUwf0MPrOt5eA6C+7hy86eu2uqDy26TH5PlH40/X0Vbjj5bYREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREw8Ckjx8fEkJyczYcIEJk2aBEBVVRWpqamMHTuW1NRUDh8+bGyfnZ2N3W4nISGB3bt3G+X79u0jOTkZu93OsmXLcLvdANTW1pKWlobdbmfKlCmUlpa25TGKiIiIeMXjGaT169ezbds2tmzZAkBOTg6xsbHk5eURGxtLTk4OAPv378fhcOBwOFi7di1Lly6lvr4egIyMDDIzM8nLy6OkpITCwkIANm3aRN++fdm5cyfTpk1j+fLlbX2cIiIiIh5r9RJbQUEBKSkpAKSkpJCfn2+UJyUl4efnR0REBAMHDqS4uBiXy0V1dTVDhw7FYrGQkpJCQUEBALt27WLixIkAJCQksHfvXmN2SUREROTb5uvphtOnT8disXDrrbdy6623UlFRgdVqBcBqtXLo0CEAnE4nMTExRr2wsDCcTie+vr7YbDaj3Gaz4XQ6jTrh4eGnGuTrS0BAAJWVlQQHB5+1Pf369cbX18ezxpce9/QwpR2Fhga0fz31dafQ2r4WEeksPApIGzZsICwsjIqKClJTUxk0aNBZt21q5sdisZy1vLk6zamsPNZSs6WTOXjwqNd1QkMDWlVPOpY3faYwJSKdkUdLbGFhYQCEhIRgt9spLi4mJCQEl8sFgMvlMmZ7bDYb5eXlRl2n04nVam1UXl5ebsxA2Ww2ysrKAKirq+Po0aMEBQWd+9GJiIiItEKLAenYsWNUV1cbf+/Zs4fIyEji4+PJzc0FIDc3lzFjxgCnPvHmcDiora3lwIEDlJSUEB0djdVqxd/fn6KiItxud6M6W7duBWDHjh0MHz68xRkkERERkfbS4hJbRUUFs2fPBqC+vp7x48cTFxfH4MGDSUtLY/PmzYSHh5OVlQVAZGQkiYmJjBs3Dh8fH5YsWYKPz6lrhTIyMkhPT6empoa4uDji4uIAmDx5MvPnz8dutxMYGMiKFSva63hFREREWmRxn6cfF/PmGoeXdOFupzB9QA+v63h7DZL6unPwpq/Px2uQ9Jg8/2j86TraavzRN2mLiIiImCggiYiIiJgoIImIiIiYKCCJiIiImCggiYiIiJgoIImIiIiYKCCJiIiImCggiYiIiJgoIImIiIiYKCCJiIiImCggiYiIiJgoIImIiIiYKCCJiIiImCggiYiIiJgoIImIiIiYKCCJiIiImCggiUinlZ6eTmxsLOPHjzfKVq1axahRo5gwYQITJkzgrbfeMm7Lzs7GbreTkJDA7t27jfJ9+/aRnJyM3W5n2bJluN1uAGpra0lLS8NutzNlyhRKS0u/vYMTkU5NAUlEOq1Jkyaxdu3aRuXTpk1j27ZtbNu2jdGjRwOwf/9+HA4HDoeDtWvXsnTpUurr6wHIyMggMzOTvLw8SkpKKCwsBGDTpk307duXnTt3Mm3aNJYvX/7tHZyIdGoKSCLSaQ0bNozAwECPti0oKCApKQk/Pz8iIiIYOHAgxcXFuFwuqqurGTp0KBaLhZSUFAoKCgDYtWsXEydOBCAhIYG9e/cas0si0rUpIInIeefVV18lOTmZ9PR0Dh8+DIDT6cRmsxnbhIWF4XQ6G5XbbDacTqdRJzw8HABfX18CAgKorKz8Fo9ERDor345ugIiIN2677TZmzZqFxWIhKyuLp556iieffLLJmR+LxXLWcqDZ25rTr19vfH19PGtw6XHPtpN2FRoa0P711NedQmv72kwBSUTOKxdccIHx95QpU7j33nuBUzND5eXlxm1OpxOr1dqovLy8HKvVatQpKyvDZrNRV1fH0aNHCQoKarENlZXH2uho5Nty8OBRr+uEhga0qp50LG/6rLkwpSU2ETmvuFwu4+/8/HwiIyMBiI+Px+FwUFtby4EDBygpKSE6Ohqr1Yq/vz9FRUW43W5yc3MZM2aMUWfr1q0A7Nixg+HDh3s0gyQi332aQRKRTmvu3Lm88847VFZWEhcXxwMPPMA777zDxx9/DED//v3JzMwEIDIyksTERMaNG4ePjw9LlizBx+fUMlhGRgbp6enU1NQQFxdHXFwcAJMnT2b+/PnY7XYCAwNZsWJFxxyoiHQ6Fvd5+pENb6bQXtK6cKcwfUAPr+t4O8Wtvu4cvOnrtrpe4Nukx+T5R+NP19FW44+W2ERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREw8Dkj19fWkpKQwc+ZMAKqqqkhNTWXs2LGkpqZy+PBhY9vs7GzsdjsJCQns3r3bKN+3bx/JycnY7XaWLVvG6d/Jra2tJS0tDbvdzpQpUygtLW2r4xMRERHxmscB6de//jWXXHKJ8f+cnBxiY2PJy8sjNjaWnJwcAPbv34/D4cDhcLB27VqWLl1KfX09ABkZGWRmZpKXl0dJSQmFhYUAbNq0ib59+7Jz506mTZvG8uXL2/IYRURERLziUUAqLy/nzTffZPLkyUZZQUEBKSkpAKSkpJCfn2+UJyUl4efnR0REBAMHDqS4uBiXy0V1dTVDhw7FYrGQkpJCQUEBALt27WLixIkAJCQksHfvXmN2SUREROTb5uvJRk888QTz58/n66+/NsoqKiqwWq0AWK1WDh06BIDT6SQmJsbYLiwsDKfTia+vLzabzSi32Ww4nU6jTnh4+KkG+foSEBBAZWUlwcHBZ21Tv3698fX18ewoS497tp20q9DQgPavp77uFFrb1yIinUWLAenPf/4zwcHBXH311bz99tst3mFTMz8Wi+Ws5c3VaU5l5bEW2yKdy8GDR72uExoa0Kp60rG86TOFKRHpjFoMSO+//z67du2isLCQ48ePU11dzcMPP0xISAgulwur1YrL5TJme2w2G+Xl5UZ9p9OJ1WptVF5eXm7MQNlsNsrKyrDZbNTV1XH06FGCgoLa+FBFREREPNPiNUjz5s2jsLCQXbt28dxzzzF8+HCWL19OfHw8ubm5AOTm5jJmzBgA4uPjcTgc1NbWcuDAAUpKSoiOjsZqteLv709RURFut7tRna1btwKwY8cOhg8f3uIMkoiIiEh78egapKbMmDGDtLQ0Nm/eTHh4OFlZWQBERkaSmJjIuHHj8PHxYcmSJfj4nLpWKCMjg/T0dGpqaoiLiyMuLg6AyZMnM3/+fOx2O4GBgaxYsaINDk1ERESkdSzu8/TjYt5c4/CSLtztFKYP6OF1HW+vQVJfdw7e9PX5eA2SHpPnH40/XUdbjT/6Jm0REREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQRERERkxYD0vHjx5k8eTI/+tGPSEpKYuXKlQBUVVWRmprK2LFjSU1N5fDhw0ad7Oxs7HY7CQkJ7N692yjft28fycnJ2O12li1bhtvtBqC2tpa0tDTsdjtTpkyhtLS0rY9TRERExGMtBiQ/Pz/Wr1/PH//4R3Jzc9m9ezdFRUXk5OQQGxtLXl4esbGx5OTkALB//34cDgcOh4O1a9eydOlS6uvrAcjIyCAzM5O8vDxKSkooLCwEYNOmTfTt25edO3cybdo0li9f3o6HLCLni/T0dGJjYxk/frxRpjdnIvJtaDEgWSwW/P39Aairq6Ourg6LxUJBQQEp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j91uJzAwkBUrVrTX8YqIiIi0yOI+Tz8u5s0U/ku6LqVTmD6gh9d1vF1iU193Dt709fm4xKbH5PlH40/X0Vbjj75JW0RERMREAUlERETERAFJRERExEQBSURERMREAUlERETERAFJRERExEQBSURERMREAUlERETERAFJRERExEQBSURERMREAUlERETERAFJRERExEQBSURERMREAUlERETERAFJRERExMS3oxsgItIa8fHx+Pv7061bN3x8fNiyZQtVVVU89NBDfPHFF/Tv35/nn3+ewMBAALKzs9m8eTPdunVj8eLFjBo1CoB9+/aRnp5OTU0No0ePZtGiRVgslo48NBHpBDSDJCLnrfXr17Nt2za2bNkCQE5ODrGxseTl5REbG0tOTg4A+/fvx+Fw4HA4WLt2LUuXLqW+vh6AjIwMMjMzycvLo6SkhMLCwg47HhHpPBSQROQ7o6CggJSUFABSUlLIz883ypOSkvDz8yMiIoKBAwdSXFyMy+WiurqaoUOHYrFYSElJoaCgoAOPQEQ6Cy2xich5a/r06VgsFm699VZuvfVWKioqsFqtAFitVg4dOgSA0+kkJibGqBcWFobT6cTX1xebzWaU22w2nE5ni/vt1683vr4+njWy9LgXRyTtJTQ0oP3rqa87hdb2tZkCkoiclzZs2EBYWBgVFRWkpqYyaNCgs27rdrsblVkslrOWt6Sy8ph3jZUOd/DgUa/rhIYGtKqedCxv+qy5MKUlNhE5L4WFhQEQEhKC3W6nuLiYkJAQXC4XAC6Xi+DgYODUzFB5eblR1+l0YrVaG5WXl5cbM1Ai0rUpIInIeefYsWNUV1cbf+/Zs4fIyEji4+PJzc0FIDc3lzFjxgCnPvHmcDiora3lwIEDlJSUEB0djdVqxd/fn6KiItxud4M6ItK1aYlNRM47FRUVzJ49G4D6+nrGjx9PXFwcgwcPJi0tjc2bNxMeHk5WVhYAkZGRJCYmMm7cOHx8fFiyZAk+PqeuIcrIyDA+5h8XF0dcXFyHHZeIdB4Wd1OL8OcBb9YYX9KFc53C9AE9vK7j7TUA6uvOwZu+bqsLKr9NekyefzT+dB1tNf5oiU1ERETERAFJRERExEQBSURERMREAUlERETERAFJRERExEQBSURERMREAUlERETERAFJRERExEQBSURERMREAUlERETERAFJRERExEQBSURERMREAUlERETEpMWAlJ6eTmxsLOPHjzfKqqqqSE1NZezYsaSmpnL48GHjtuzsbOx2OwkJCezevdso37dvH8nJydjtdpYtW4bb7QagtraWtLQ07HY7U6ZMobS0tC2PT0RERMRrLQakSZMmsXbt2gZlOTk5xMbGkpeXR2xsLDk5OQDs378fh8OBw+Fg7dq1LF26lPr6egAyMjLIzMwkLy+PkpISCgsLAdi0aRN9+/Zl586dTJs2jeXLl7f1MYqIiIh4pcWANGzYMAIDAxuUFRQUkJKSAkBKSgr5+flGeVJSEn5+fkRERDBw4ECKi4txuVxUV1czdOhQLBYLKSkpFBQUALBr1y4mTpwIQEJCAnv37jVml0REREQ6QquuQaqoqMBqtQJgtVo5dOgQAE6nE5vNZmwXFhaG0+lsVG6z2XA6nUad8PBwAHx9fQkICKCysrJ1RyMiIiLSBnzb8s6amvmxWCxnLW+uTkv69euNr6+PZw0rPe7ZdtKuQkMD2r+e+rpTaG1fi4h0Fq0KSCEhIbhcLqxWKy6Xi+DgYODUzFB5ebmxndPpxGq1NiovLy83ZqBsNhtlZWXYbDbq6uo4evQoQUFBLbahsvJYa5ouHejgwaNe1wkNDWhVPelY3vSZwpSIdEatWmKLj48nNzcXgNzcXMaMGWOUOxwOamtrOXDgACUlJURHR2O1WvH396eoqAi3292oztatWwHYsWMHw4cP92gGSURERKS9tDiDNHfuXN555x0qKyuJi4vjgQceYMaMGaSlpbF582bCw8PJysoCIDIyksTERMaNG4ePjw9LlizBx+fUMlhGRgbp6enU1NQQFxdHXFwcAJMnT2b+/PnY7XYCAwNZsWJFOx6uiIiISMss7vP0I2PeTOG/pOtSOoXpA3p4XcfbJTb1defgTV+fj0tsekyefzT+dB1tNf7om7RFRERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETBSQREREREwUkERERERMFJBERERETDpNQCosLCQhIQG73U5OTk5HN0dEuhCNPyJi1ikCUn19PZmZmaxduxaHw8H27dvZv39/RzdLRLoAjT8i0pROEZCKi4sZOHAgERER+Pn5kZSUREFBQUc3S0S6AI0/ItKUThGQnE4nNpvN+H9YWBhOp7MDWyQiXYXGHxFpim9HNwDA7XY3KrNYLM3WCQ0N8Pj+F3ixrXQ+6mtpTxp/pDnq666rU8wg2Ww2ysvLjf87nU6sVmsHtkhEugqNPyLSlE4RkAYPHkxJSQkHDhygtrYWh8NBfHx8RzdLRLoAjT8i0pROscTm6+vLkiVLuPvuu6mvr+fmm28mMjKyo5slIl2Axh8RaYrF3dQCvIiIiEgX1imW2EREREQ6EwUkERERERMFJJOqqipSU1MZO3YsqampHD58uNE2ZWVlTJ06lcTERJKSkli/fr1x26pVqxg1ahQTJkxgwoQJvPXWWy3us6WfOXC73Sxbtgy73U5ycjIffvihx3XPZb9//OMfSU5OJjk5mR//+Md8/PHHxm3x8fEkJyczYcIEJk2a5NV+Pdn322+/zbXXXmucx9WrV3tc91z3vXbtWmO/48eP58orr6Sqqgo4t+NOT08nNjaW8ePHN3l7e/WzJ/tuz74Wz2n8+S+NPxp/oIPHH7c08PTTT7uzs7PdbrfbnZ2d7X7mmWcabeN0Ot379u1zu91u99GjR91jx451f/LJJ2632+1euXKle+3atR7vr66uzj1mzBj3559/7j5+/Lg7OTnZuK/T3nzzTff06dPdJ0+edP/97393T5482eO657Lf9957z11VVWW04fR+3W63+8Ybb3RXVFR4fJze7vt///d/3TNmzGhV3XPd95kKCgrcU6dONf5/Lsf9zjvvuPft2+dOSkpq8vb26GdP991efS3e0fjzXxp/NP643R07/mgGyaSgoICUlBQAUlJSyM/Pb7SN1WolKioKgD59+jBo0KBWf/OuJz9zcLpNFouFIUOGcOTIEVwu1zn9RIInda+55hoCAwMBGDJkSIPvijkX7d3utqzvcDjO+q7HW8OGDTPOZ1Pao5893Xd79bV4R+PPf2n80fjT0RSQTCoqKowvibNarRw6dKjZ7UtLS/noo4+IiYkxyl599VWSk5NJT09vcor8TJ78zIF5G5vNhtPpPKefSPC27ubNm4mLi2tQNn36dCZNmsTGjRs92qe3+y4qKuJHP/oRd999N5988kmr2t3afQN888037N69m7FjxzYob+1xe9u2tujn1mjLvhbvaPxpmsaf/9L48+3pFN+D9G2bNm0aX331VaPytLQ0r+7n66+/Zs6cOSxcuJA+ffoAcNtttzFr1iwsFgtZWVk89dRTPPnkk2e9D7cHP3Nwtm08qXsu+z3tf//3f9m8eTO//e1vjbINGzYQFhZGRUUFqampDBo0iGHDhrXZvqOioti1axf+/v689dZbzJ49m7y8vHM6Zk/3fdqf//xnrrnmGoKCgoyycznu1rbtXI/ZG23d19KYxh+NP57U1/hzSkeOP10yIL388stnvS0kJASXy4XVasXlchEcHNzkdidOnGDOnDkkJyc3SPgXXHCB8feUKVO49957m22LJz9zYN6mvLwcq9XKiRMnWv0TCZ7+vMLHH3/M4sWLefHFF+nXr59RHhYWBpw6X3a7neLiYo8ftJ7s+/SADzB69GiWLl3KoUOHzvlnIbyp73A4SEpKalB2Lsftbdvaop+90R59LY1p/NH440l9jT+ndOT4oyU2k/j4eHJzcwHIzc1lzJgxjbZxu90sWrSIQYMGkZqa2uA2l8tl/J2fn9/iN/J68jMHp9vkdrspKioiICAAq9V6Tj+R4EndL7/8kgceeIBnnnmGiy++2Cg/duwY1dXVxt979uzx6puHPdn3wYMHjXcuxcXFnDx5kn79+p3zz0J4Wv/o0aO8++67Dfr/XI+7Je3Rz55qr74W72j8+S+NPxp/Onr86ZIzSM2ZMWMGaWlpbN68mfDwcLKysoBTqfl0un3vvffYtm0bl112GRMmTABg7ty5jB49mmeffdb4iGL//v3JzMxsdn9n+5mDDRs2AKemzEePHs1bb72F3W6nV69ePPHEE83W9YQn+12zZg1VVVUsXboUAB8fH7Zs2UJFRQWzZ88GoL6+nvHjxzdaMz7Xfe/YsYMNGzbg4+NDz549ee6557BYLOf8sxCe7Btg586djBw5kt69ext1z/W4586dyzvvvENlZSVxcXE88MAD1NXVGfttj372dN/t1dfiHY0/Gn9A409nGX/0UyMiIiIiJlpiExERETFRQBIRERExUUASERERMVFAEhERETFRQBIRERExUUASERERMVFAEhERETFRQBIREREx+X8wYJKCc50hvwAAAABJRU5ErkJggg==\n", 162 | "text/plain": [ 163 | "
" 164 | ] 165 | }, 166 | "metadata": {}, 167 | "output_type": "display_data" 168 | } 169 | ], 170 | "source": [ 171 | "import matplotlib.pyplot as plt\n", 172 | "plt.style.use('seaborn')\n", 173 | "\n", 174 | "train_vlcnt = train['label'].value_counts().reset_index()\n", 175 | "test_vlcnt = test['label'].value_counts().reset_index()\n", 176 | "\n", 177 | "plt.subplots(constrained_layout=True)\n", 178 | "\n", 179 | "plt.subplot(1, 2, 1)\n", 180 | "plt.title('Train Dataset Label Distribution', fontsize=15)\n", 181 | "plt.bar(train_vlcnt['index'], train_vlcnt['label'], color='skyblue')\n", 182 | "\n", 183 | "plt.subplot(1, 2, 2)\n", 184 | "plt.title('Test Dataset Label Distribution', fontsize=15)\n", 185 | "plt.bar(test_vlcnt['index'], test_vlcnt['label'], color='skyblue')\n", 186 | "\n", 187 | "plt.show()" 188 | ] 189 | }, 190 | { 191 | "cell_type": "code", 192 | "execution_count": 7, 193 | "id": "575645ff-ccd9-4089-bf39-7badc6dcc899", 194 | "metadata": {}, 195 | "outputs": [ 196 | { 197 | "data": { 198 | "image/png": "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YOjQoVi1ahWSkpLMXiDpJ5x26dIF9vb26NmzJ+bMmYPJkyebfMeci4sL/vvf/2LNmjU4ceIEDh8+jF69euGNN96At7e3yQJp9OjRWLx4MbZv345NmzahuroaPXr0wKxZs2BlZYUNGzbggw8+QGpqKj777DO4uLhgxowZeOmllxAcHGywL/2rPNLT03Hs2DEUFRWhW7duePjhh7FgwQKj9b29vfHVV19h48aNOHz4MH788Ud07twZCoUCI0aMQGBg4G3H2lY5BYCnn34aPXv2xMaNG5GUlISKigq4urriueeew4svvmg00dfNzQ27du1CfHw8kpOT8fnnn6NLly7o0aMH5syZYzDJt0+fPvj000/x/vvv4+DBg7CyssLQoUOxdetWHDhw4I5cg2+88QZ8fHywdetWHDlyBGVlZXBwcBDPcfLkyS3av5WVFdavX493330X33zzDa5evQpBEDBkyJDbLpD279/f6LLZs2fj/vvvx9y5czF48GB89tlnOHHiBFJSUmBrawsXFxc88cQTmDRpUovOAwCio6PRq1cvbN26FVu3bkW3bt3g7++PiIgI+Pj4GD1mw8HBAevWrcN//vMf7Nq1S7zpYPLkySyQLJBMEEw8n52IiOgulZWVhcDAQAQHB+O9994zdzjUTnEOEhER3ZWuXLliNPm+oqICb775JgAYvKKGSIpDbEREdFfavHkzNBoNhg8fDmdnZ/z11184evQo8vLy4OPjg6CgIHOHSO0YCyQiIrorPf744zh79iy+//57FBcXQy6X46GHHkJoaChmz57d6DPXiADOQSIiIiIywjlIRERERBIddojtypWyW6/URN2734uiojv3Lqn2inlowFw0YC7qMQ8NmIt6zEODjpYLZ+fGH9/AHqQbyOVW5g6hXWAeGjAXDZiLesxDA+aiHvPQ4G7KBQskIiIiIgkWSEREREQSLJCIiIiIJFggEREREUmwQCIiIiKS6LC3+d/t5ryV0uJ9bFzs2wqREBERWZ5b9iDl5uYiNDQUQUFBCA4OxubNmwEAxcXFCAsLQ0BAAMLCwlBSUiJuExsbC39/fwQGBiItLU1sz8zMREhICPz9/bFixQroH+JdVVWF+fPnw9/fHzNmzEBOTk5rnycRERHRbbtlgWRlZYXFixfjm2++wbZt2/DFF1/g/PnziIuLg7e3N5KSkuDt7Y24uDgA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\n", 199 | "text/plain": [ 200 | "
" 201 | ] 202 | }, 203 | "metadata": {}, 204 | "output_type": "display_data" 205 | } 206 | ], 207 | "source": [ 208 | "import numpy as np\n", 209 | "import matplotlib.pyplot as plt\n", 210 | "plt.style.use('seaborn')\n", 211 | "\n", 212 | "train_doc_len = [len(x) for x in train['document']]\n", 213 | "test_doc_len = [len(x) for x in test['document']]\n", 214 | "\n", 215 | "plt.subplots(constrained_layout=True)\n", 216 | "\n", 217 | "plt.subplot(2, 1, 1)\n", 218 | "plt.title('Train Dataset Document Length', fontsize=20)\n", 219 | "plt.hist(train_doc_len, bins=30)\n", 220 | "\n", 221 | "plt.subplot(2, 1, 2)\n", 222 | "plt.title('Test Dataset Document Length', fontsize=20)\n", 223 | "plt.hist(test_doc_len, bins=30)\n", 224 | "\n", 225 | "plt.show()" 226 | ] 227 | }, 228 | { 229 | "cell_type": "markdown", 230 | "id": "d1588824-94d9-4e2a-8005-d1a82647870c", 231 | "metadata": {}, 232 | "source": [ 233 | "#### 정규표현식으로 한국어만 남기기" 234 | ] 235 | }, 236 | { 237 | "cell_type": "code", 238 | "execution_count": 8, 239 | "id": "e5800cc2-a1c7-4896-a346-a7e26bb3e8fb", 240 | "metadata": {}, 241 | "outputs": [], 242 | "source": [ 243 | "import re\n", 244 | "from tqdm import tqdm\n", 245 | "\n", 246 | "def removing_non_korean(df):\n", 247 | " for idx, row in tqdm(df.iterrows(), desc='removing_non_korean', total=len(df)):\n", 248 | " new_doc = re.sub('[^가-힣]', '', row['document']).strip()\n", 249 | " df.loc[idx, 'document'] = new_doc\n", 250 | " return df" 251 | ] 252 | }, 253 | { 254 | "cell_type": "code", 255 | "execution_count": 9, 256 | "id": "05d9e9d5-87e8-45b6-b63c-6433aa55d460", 257 | "metadata": {}, 258 | "outputs": [ 259 | { 260 | "name": "stderr", 261 | "output_type": "stream", 262 | "text": [ 263 | "removing_non_korean: 100%|██████████| 146182/146182 [00:23<00:00, 6164.58it/s]\n", 264 | "removing_non_korean: 100%|██████████| 49157/49157 [00:07<00:00, 6221.34it/s]\n" 265 | ] 266 | } 267 | ], 268 | "source": [ 269 | "train = removing_non_korean(train)\n", 270 | "test = removing_non_korean(test)" 271 | ] 272 | }, 273 | { 274 | "cell_type": "markdown", 275 | "id": "54ff6db1-847f-4248-867d-7ef5638fa9c0", 276 | "metadata": {}, 277 | "source": [ 278 | "#### 조사 제거하지 않은 데이터 저장" 279 | ] 280 | }, 281 | { 282 | "cell_type": "code", 283 | "execution_count": 10, 284 | "id": "46ee1bb7-5a7a-45bf-8a58-d7f7a341c2b5", 285 | "metadata": {}, 286 | "outputs": [], 287 | "source": [ 288 | "train.to_csv('data/train_none.csv', index=False)\n", 289 | "test.to_csv('data/test_none.csv', index=False)" 290 | ] 291 | }, 292 | { 293 | "cell_type": "markdown", 294 | "id": "210a8c33-571d-4559-a92a-aec2db9d3c75", 295 | "metadata": {}, 296 | "source": [ 297 | "#### 조사 제거하기" 298 | ] 299 | }, 300 | { 301 | "cell_type": "code", 302 | "execution_count": 11, 303 | "id": "e4af453a-f31e-4f42-9590-95ffd81c3744", 304 | "metadata": {}, 305 | "outputs": [], 306 | "source": [ 307 | "tags = ['JK', 'JKS', 'JKC', 'JKG', 'JKO', 'JKB', 'JKV', 'JKQ', 'JX', 'JC', 'EP', 'EF', 'EC', 'ETN', 'ETM']" 308 | ] 309 | }, 310 | { 311 | "cell_type": "code", 312 | "execution_count": 12, 313 | "id": "95dc7828-b3f6-4ff7-a764-addc1ef2e7ad", 314 | "metadata": {}, 315 | "outputs": [ 316 | { 317 | "name": "stderr", 318 | "output_type": "stream", 319 | "text": [ 320 | "removing josa: 100%|██████████| 146182/146182 [00:38<00:00, 3833.24it/s]\n", 321 | "removing josa: 100%|██████████| 49157/49157 [00:12<00:00, 3925.97it/s]\n" 322 | ] 323 | } 324 | ], 325 | "source": [ 326 | "from konlpy.tag import Mecab\n", 327 | "\n", 328 | "m = Mecab()\n", 329 | "\n", 330 | "def remove_josa_mecab(df, tags):\n", 331 | " for idx, row in tqdm(df.iterrows(), desc='removing josa', total=len(df)):\n", 332 | " josa_removed = [x[0] for x in m.pos(row['document']) if x[1] not in tags]\n", 333 | " df.loc[idx, 'document'] = ' '.join(josa_removed)\n", 334 | " return df\n", 335 | "\n", 336 | "train_mecab = remove_josa_mecab(train, tags)\n", 337 | "test_mecab = remove_josa_mecab(test, tags)" 338 | ] 339 | }, 340 | { 341 | "cell_type": "code", 342 | "execution_count": 13, 343 | "id": "89d4dcee-3ad6-4044-b2af-18b5f2869df0", 344 | "metadata": {}, 345 | "outputs": [ 346 | { 347 | "name": "stderr", 348 | "output_type": "stream", 349 | "text": [ 350 | "removing josa: 100%|██████████| 146182/146182 [01:53<00:00, 1285.80it/s]\n", 351 | "removing josa: 100%|██████████| 49157/49157 [00:38<00:00, 1292.33it/s]\n" 352 | ] 353 | } 354 | ], 355 | "source": [ 356 | "from konlpy.tag import Komoran\n", 357 | "\n", 358 | "k = Komoran()\n", 359 | "\n", 360 | "def remove_josa_komoran(df, tags):\n", 361 | " for idx, row in tqdm(df.iterrows(), desc='removing josa', total=len(df)):\n", 362 | " josa_removed = [x[0] for x in k.pos(row['document']) if x[1] not in tags]\n", 363 | " df.loc[idx, 'document'] = ' '.join(josa_removed)\n", 364 | " return df\n", 365 | "\n", 366 | "train_komoran = remove_josa_komoran(train, tags)\n", 367 | "test_komoran = remove_josa_komoran(test, tags)" 368 | ] 369 | }, 370 | { 371 | "cell_type": "markdown", 372 | "id": "8ddfb1ff-08c9-46de-bf30-064dcdff8456", 373 | "metadata": {}, 374 | "source": [ 375 | "#### label 분포 확인하기" 376 | ] 377 | }, 378 | { 379 | "cell_type": "code", 380 | "execution_count": 14, 381 | "id": "9085d6d5-87b6-4e7e-bd04-a4f663809fe8", 382 | "metadata": {}, 383 | "outputs": [ 384 | { 385 | "data": { 386 | "image/png": "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\n", 387 | "text/plain": [ 388 | "
" 389 | ] 390 | }, 391 | "metadata": {}, 392 | "output_type": "display_data" 393 | } 394 | ], 395 | "source": [ 396 | "import matplotlib.pyplot as plt\n", 397 | "plt.style.use('seaborn')\n", 398 | "\n", 399 | "train_mecab_vlcnt = train_mecab['label'].value_counts().reset_index()\n", 400 | "train_komoran_vlcnt = train_komoran['label'].value_counts().reset_index()\n", 401 | "\n", 402 | "plt.subplot(1, 2, 1)\n", 403 | "plt.title('train_mecab', fontsize=20)\n", 404 | "plt.bar(train_mecab_vlcnt['index'], train_mecab_vlcnt['label'], color='skyblue')\n", 405 | "\n", 406 | "plt.subplot(1, 2, 2)\n", 407 | "plt.title('train_komoran', fontsize=20)\n", 408 | "plt.bar(train_komoran_vlcnt['index'], train_komoran_vlcnt['label'], color='skyblue')\n", 409 | "\n", 410 | "plt.show()" 411 | ] 412 | }, 413 | { 414 | "cell_type": "markdown", 415 | "id": "960969dc-8d58-442b-a977-0e4d0a3919ab", 416 | "metadata": { 417 | "tags": [] 418 | }, 419 | "source": [ 420 | "#### document 데이터 길이 확인해보기" 421 | ] 422 | }, 423 | { 424 | "cell_type": "code", 425 | "execution_count": 15, 426 | "id": "7d67599b-5e6d-4151-ba26-d0068ee13405", 427 | "metadata": {}, 428 | "outputs": [ 429 | { 430 | "data": { 431 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAAkgAAAGUCAYAAADOCt1mAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAABGMUlEQVR4nO3df1xU953v8dcwhG4DiIoMQ7mEhA0Yq4Ho1lzJRkwgIwWk4g9yYxOrJKnb2GrRPMyCJi5y7WpSU2P01oW4zZrUukYjeOs0V3FMgm1NjMnDS3g0udU0VLAwGEQDGkXw3D98OBsGEOSHAzPv5+Ph4+F8zzlzPh8O47z9njNnTIZhGIiIiIiIi5+nCxAREREZbBSQRERERNwoIImIiIi4UUASERERcaOAJCIiIuJGAUlERETEjQKSiAyIjRs3Mnr0aN5//31Pl+IV5s6dy+jRoz1dhojPUEAS8RE1NTWMHj2avLw8T5ciIjLo+Xu6ABHxTo8++ijp6el861vf8nQpIiI3TAFJRAbEyJEjGTlypKfLEBHpFZ1iE/EBGzduJCUlBYCSkhJGjx7t+rN7927ef/99Ro8ezcaNG6moqGDBggXce++9jB49mpqaGgDee+89nnvuOdLT05kwYQLx8fFMmzaNTZs2cenSpU732dk1SKNHj2bu3LmcOXOG5557jvvvv59x48aRkZHBm2++2esev34K8eTJkyxevJj//t//O+PHj+fxxx/nz3/+M0C7/d59993MmjWL9957r9PnbG1tZdu2bTz88MNMmDCBhIQEsrKy+PWvf82VK1c63aaiooLc3FwmT57MuHHjuP/++3n88cf53e9+12693bt3s2jRIlJSUoiPj2fChAk88sgj7Nmz57p9trS0sH79epKTkxk3bhwPPfQQmzZtoqWlpRc/NRHpimaQRHzAvffeyw9+8ANee+017rrrLh566CHXsjFjxvDll18CcOzYMYqKiviHf/gHZs2aRWNjI7fccgsAr7zyCp9//jnjx49nypQptLS08NFHH7Fx40bef/99/uM//gOz2dyjer788kvmzJlDQEAAqampXLp0iX379rF8+XL8/PyYMWNGr3s9deoU2dnZ/P3f/z0zZszg1KlTlJWVMXfuXHbs2MGTTz5JUFAQaWlpnDt3jt/97nf88Ic/ZN++fe1OB16+fJkf/ehH/P73v+eOO+5g2rRpfOMb3+D999/nf/7P/8n//b//l5///Oft9v3GG29QUFCAn58fycnJ3H777TQ0NFBZWcn27dtJT093rVtQUMCdd97JxIkTCQsL4+zZs7z77rs888wzfP755+Tm5nba309/+lM+/vhjvvvd7+Lv74/D4WDjxo1UVlayefNmTCZTr392IvI1hoj4hOrqaiMuLs7453/+5w7L3nvvPSMuLs6Ii4sztm/f3un2J0+eNK5cudJhfP369UZcXJxht9vbjb/88stGXFyc8d5777Ubv7af5cuXG62tra7x48ePG2PGjDHS0tJ6056rv7i4OOOXv/xlu2WbNm0y4uLijIkTJxrPPfec0dbW5lpWUlJixMXFGT/72c86rb+wsLBdna2trUZ+fr4RFxdnlJWVtav/29/+tjFx4kTjz3/+c4f6amtr2z3+61//2mGdS5cuGT/4wQ+Mb3/720ZdXV27ZY899pgRFxdnTJ061Th79qxr/OLFi8bDDz9sxMXFGSUlJdf5CYnIjdApNhFxGTNmDI888kiny6KiojqdnZg3bx4Ahw4d6vF+vvnNb5Kfn99uxunOO+9kwoQJfPbZZzQ3N99g5f8lMjKSBQsWtBu7NiPV0tLCM888g5/ff/3Tl5mZib+/P5988olr7MqVK/z6178mLCysQ51ms5m8vDxMJhO//e1vXePbt2+ntbWVhQsXEhsb26Euq9Xa7vFtt93WYZ2AgAAeffRRWltbOXz4cKf9PfXUU4SEhLgef+Mb32Dp0qUAfTpFKSLt6RSbiLjEx8d3uezChQu89tprlJWVUVVVxfnz5zEMw7W8vr6+x/uJjo4mKCiow/i1ENHU1NTp8p4YM2ZMh1N9FosFgNtvv73D85rNZkJDQ3E6na6xzz//nLNnz3L77bezefPmTvfzd3/3d/zlL39xPT527BgAkydP7lGdf/vb33jllVc4fPgwtbW1XLx4sd3yr9fzdffee2+Hse985zsdQp6I9I0Ckoi4jBo1qtPxy5cvM2/ePCoqKoiLiyM9PZ2RI0fi73/1n5AbvUh42LBhnY5fe762trYbrPy/BAcHd/m8nS27try1tdX1+OzZswBUVVWxadOmLvd1/vx519+bmpoACA8P77bG6upqZs+ezZdffsl3vvMd7r//foKCgjCbzZw6dYqSkpIuf56dHSOz2czw4cNpaGjodt8i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MjbQ5177er7z8bUH+7GaoelXecmeLqFbOo/v/dSz9/O1fsH3eh4y1yCJiIiIeDMFJBERERE3CkgiIiIibhSQRERERNwoIImIiIi4UUASERERcaOAJCIiIuJGAUlERETEjQKSiIiIiBsFJBERERE3CkgiIiIibhSQRERERNwoIImIiIi4UUASERERcaOAJCIiIuLG39MFiPd6fO3BPm3/q7zkfqpERETkxmgGSURERMSNApKIiIiIm24DUn5+PomJiUybNs01dvbsWXJycpg6dSo5OTmcO3fOtayoqAibzUZqaiqHDh1yjVdWVpKZmYnNZmP16tUYhgFAS0sLubm52Gw2srOzqamp6c/+RERERG5YtwFp5syZbNmypd1YcXExiYmJ7N+/n8TERIqLiwE4ceIEdrsdu93Oli1bWLVqFW1tbQAUFBRQWFjI/v37qaqqory8HICdO3cybNgwysrKmD9/PuvWrevvHkVERERuSLcXaU+cOLHDrI7D4eD1118HICsri7lz57Js2TIcDgcZGRkEBAQQFRVFdHQ0FRUVREZG0tzczPjx413bOBwOpkyZwsGDB/nJT34CQGpqKoWFhRiGgclk6u9eb0jm03s8un8RERHxnF59iq2hoQGLxQKAxWLhzJkzADidThISElzrhYeH43Q68ff3x2q1usatVitOp9O1TURExNVi/P0JDg6msbGRkSNHXreGESNuxd/f3JvyZYgICwv2qv0MFr7WL6hnX+Br/YLv9Xyz++3Xj/lfu67o60wmU5fj19umO42NF3pRoQwlp083Dfg+wsKCb8p+Bgtf6xfUsy/wtX7B93oeqH6vF7p69Sm20NBQ6uvrAaivr3fN9litVurq6lzrOZ1OLBZLh/G6ujrXDJTVaqW2thaA1tZWmpqaGD58eG/KEhEREekXvQpIycnJlJaWAlBaWkpKSopr3G6309LSQnV1NVVVVcTHx2OxWAgMDOTYsWMYhtFhm5KSEgD27dvHpEmTPH79kYiIiPi2bk+xLV26lCNHjtDY2EhSUhKLFi1iwYIF5ObmsmvXLiIiItiwYQMAsbGxpKWlkZ6ejtlsZuXKlZjNV68TKigoID8/n4sXL5KUlERSUhIAs2fPZtmyZdhsNkJCQli/fv0AtisiIiLSPZPR2UVAQ8BAn3vt69dkSN/djK8a0Xl876eevZ+v9Qu+1/OQ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9ZZj3NX7Unx8vMdezwpIIiIiIm50ik1ERETEjQKSiIiIiBsFJBERERE3CkgiIiIibhSQRERERNwoIImIiIi4UUASERERcaOAJCI9tnHjRkaPHs37779/U/ZXU1PD6NGjycvLuyn7ExG5RgFJZAhTgBARGRj+ni5ARIaORx99lPT0dL71rW95uhQRkQGlgCQiPTZy5EjXt2mLiHgznWITGaI2btzo+mbrkpISRo8e7fqze/du3n//fUaPHs3GjRupqKhgwYIF3HvvvYwePZqamhoA3nvvPZ577jnS09OZMGEC8fHxTJs2jU2bNnHp0qVO99nZNUijR49m7ty5nDlzhueee47777+fcePGkZGRwZtvvtnvvV+5coXVq1czevRofvKTn7hqvXLlCtu3b2fWrFmMHz+ee+65h1mzZvGb3/yGK1eudHiea3V/8cUX5Ofnc99993HPPffwyCOPcPToUQAuXLjA888/z4MPPujq6a233uq0rpaWFoqLi8nMzCQhIYEJEybw/e9/n9/97ncd1v366dHPP/+c3NxcEhMTueuuu1w/38rKSlavXs33vvc97r33Xu6++26mTp3K2rVrOXfuXIfn3L17t+v4v/fee8ydO5fx48czYcIEFixYwGeffdbrn7mIr9EMksgQde+99/KDH/yA1157jbvuuouHHnrItWzMmDF8+eWXABw7doyioiL+4R/+gVmzZtHY2Mgtt9wCwCuvvMLnn3/O+PHjmTJlCi0tLXz00Uds3LiR999/n//4j//AbDb3qJ4vv/ySOXPmEBAQQGpqKpcuXWLfvn0sX74cPz8/ZsyY0S99X7p0iWXLlrFv3z4effRRnn32Wde3fy9btoy9e/cSERHB7NmzMZlMHDhwgFWrVvHhhx/y4osvdll3YGAgGRkZnDt3jt/97nc88cQT7Nixg5UrV3Lu3DkeeOABWltb2bt3L0uWLCEiIoJ77rnH9TwtLS088cQTHDlyhJiYGL7//e9z8eJF9u3bx5IlS/j0009ZunRph/2fPHmShx9+mNtvv53MzEwuXrxIUFAQAG+88QYHDhxg4sSJ3HfffbS1tfGnP/2JV199lfLyct544w3Xul/3zjvv4HA4mDx5Mo888gifffYZ7777Lh9//DF2u12zgCI9YYjIkFVdXW3ExcUZ//zP/9xh2XvvvWfExcUZcXFxxvbt2zvd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\n", 432 | "text/plain": [ 433 | "
" 434 | ] 435 | }, 436 | "metadata": {}, 437 | "output_type": "display_data" 438 | } 439 | ], 440 | "source": [ 441 | "import numpy as np\n", 442 | "import matplotlib.pyplot as plt\n", 443 | "plt.style.use('seaborn')\n", 444 | "\n", 445 | "train_mecab_doc_len = [len(x) for x in train_mecab['document']]\n", 446 | "train_komoran_doc_len = [len(x) for x in train_komoran['document']]\n", 447 | "\n", 448 | "plt.subplots(constrained_layout=True)\n", 449 | "\n", 450 | "plt.subplot(2, 1, 1)\n", 451 | "plt.title('train_mecab', fontsize=20)\n", 452 | "plt.hist(train_mecab_doc_len, bins=30)\n", 453 | "\n", 454 | "plt.subplot(2, 1, 2)\n", 455 | "plt.title('train_komoran', fontsize=20)\n", 456 | "plt.hist(train_komoran_doc_len, bins=30)\n", 457 | "\n", 458 | "plt.show()" 459 | ] 460 | }, 461 | { 462 | "cell_type": "markdown", 463 | "id": "da1c4fb9-6421-4924-be38-a537882551be", 464 | "metadata": {}, 465 | "source": [ 466 | "#### 전처리 완료 데이터 저장하기" 467 | ] 468 | }, 469 | { 470 | "cell_type": "code", 471 | "execution_count": 16, 472 | "id": "2e0d60ff-2487-471d-b76f-125bddd8f492", 473 | "metadata": {}, 474 | "outputs": [], 475 | "source": [ 476 | "train_mecab.to_csv('data/train_mecab.csv', index=False)\n", 477 | "test_mecab.to_csv('data/test_mecab.csv', index=False)\n", 478 | "\n", 479 | "train_komoran.to_csv('data/train_komoran.csv', index=False)\n", 480 | "test_komoran.to_csv('data/test_komoran.csv', index=False)" 481 | ] 482 | }, 483 | { 484 | "cell_type": "code", 485 | "execution_count": null, 486 | "id": "2cc1aa98-793b-4778-b9a0-a2166cbc0fab", 487 | "metadata": {}, 488 | "outputs": [], 489 | "source": [] 490 | } 491 | ], 492 | "metadata": { 493 | "kernelspec": { 494 | "display_name": "py38", 495 | "language": "python", 496 | "name": "py38" 497 | }, 498 | "language_info": { 499 | "codemirror_mode": { 500 | "name": "ipython", 501 | "version": 3 502 | }, 503 | "file_extension": ".py", 504 | "mimetype": "text/x-python", 505 | "name": "python", 506 | "nbconvert_exporter": "python", 507 | "pygments_lexer": "ipython3", 508 | "version": "3.8.12" 509 | } 510 | }, 511 | "nbformat": 4, 512 | "nbformat_minor": 5 513 | } 514 | --------------------------------------------------------------------------------