From 084f96d0542811c360cf6e2028e4feabf8d30f90 Mon Sep 17 00:00:00 2001 From: uyeongjae Date: Tue, 28 Sep 2021 06:47:50 +0000 Subject: [PATCH 1/7] first commit --- .gitignore | 145 ++++++++++++++ EDA_uyzae.ipynb | 502 ++++++++++++++++++++++++++++++++++++++++++++++++ inference.py | 102 ++++++++++ load_data.py | 57 ++++++ train.py | 249 ++++++++++++++++++++++++ 5 files changed, 1055 insertions(+) create mode 100644 .gitignore create mode 100644 EDA_uyzae.ipynb create mode 100644 inference.py create mode 100644 load_data.py create mode 100644 train.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4906f4c --- /dev/null +++ b/.gitignore @@ -0,0 +1,145 @@ + +# Created by https://www.toptal.com/developers/gitignore/api/python +# Edit at https://www.toptal.com/developers/gitignore?templates=python + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# End of https://www.toptal.com/developers/gitignore/api/python diff --git a/EDA_uyzae.ipynb b/EDA_uyzae.ipynb new file mode 100644 index 0000000..5b57423 --- /dev/null +++ b/EDA_uyzae.ipynb @@ -0,0 +1,502 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 6, + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import torch\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns\n", + "from transformers import AutoTokenizer, AutoConfig, AutoModelForSequenceClassification, Trainer, TrainingArguments, RobertaConfig, RobertaTokenizer, RobertaForSequenceClassification, BertTokenizer\n", + "from load_data import *\n", + "import re\n", + "\n", + "class RE_Dataset(torch.utils.data.Dataset):\n", + " \"\"\" Dataset 구성을 위한 class.\"\"\"\n", + " def __init__(self, pair_dataset, labels):\n", + " self.pair_dataset = pair_dataset\n", + " self.labels = labels\n", + "\n", + " def __getitem__(self, idx):\n", + " item = {key: val[idx].clone().detach() for key, val in self.pair_dataset.items()}\n", + " item['labels'] = torch.tensor(self.labels[idx])\n", + " return item\n", + "\n", + " def __len__(self):\n", + " return len(self.labels)\n", + "\n", + "def preprocessing_dataset(dataset):\n", + " \"\"\" 처음 불러온 csv 파일을 원하는 형태의 DataFrame으로 변경 시켜줍니다.\"\"\"\n", + " subject_entity = []\n", + " object_entity = []\n", + " for i,j in zip(dataset['subject_entity'], dataset['object_entity']):\n", + " i = i[1:-1].split(',')[0].split(':')[1]\n", + " j = j[1:-1].split(',')[0].split(':')[1]\n", + "\n", + " subject_entity.append(i)\n", + " object_entity.append(j)\n", + " out_dataset = pd.DataFrame({'id':dataset['id'], 'sentence':dataset['sentence'],'subject_entity':subject_entity,'object_entity':object_entity,'label':dataset['label'],})\n", + " return out_dataset\n", + "\n", + "def load_data(dataset_dir):\n", + " \"\"\" csv 파일을 경로에 맡게 불러 옵니다. \"\"\"\n", + " pd_dataset = pd.read_csv(dataset_dir)\n", + " dataset = preprocessing_dataset(pd_dataset)\n", + " \n", + " return dataset\n" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 127, + "source": [ + "train_dataset = load_data(\"../dataset/train/train.csv\")\n", + "test_dataset = load_data(\"../dataset/test/test_data.csv\")\n", + "\n", + "train_dataset.head()" + ], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idsentencesubject_entityobject_entitylabel
00〈Something〉는 조지 해리슨이 쓰고 비틀즈가 1969년 앨범 《Abbey R...'비틀즈''조지 해리슨'no_relation
11호남이 기반인 바른미래당·대안신당·민주평화당이 우여곡절 끝에 합당해 민생당(가칭)으...'민주평화당''대안신당'no_relation
22K리그2에서 성적 1위를 달리고 있는 광주FC는 지난 26일 한국프로축구연맹으로부터...'광주FC''한국프로축구연맹'org:member_of
33균일가 생활용품점 (주)아성다이소(대표 박정부)는 코로나19 바이러스로 어려움을 겪...'아성다이소''박정부'org:top_members/employees
441967년 프로 야구 드래프트 1순위로 요미우리 자이언츠에게 입단하면서 등번호는 8...'요미우리 자이언츠''1967'no_relation
\n", + "
" + ], + "text/plain": [ + " id sentence subject_entity \\\n", + "0 0 〈Something〉는 조지 해리슨이 쓰고 비틀즈가 1969년 앨범 《Abbey R... '비틀즈' \n", + "1 1 호남이 기반인 바른미래당·대안신당·민주평화당이 우여곡절 끝에 합당해 민생당(가칭)으... '민주평화당' \n", + "2 2 K리그2에서 성적 1위를 달리고 있는 광주FC는 지난 26일 한국프로축구연맹으로부터... '광주FC' \n", + "3 3 균일가 생활용품점 (주)아성다이소(대표 박정부)는 코로나19 바이러스로 어려움을 겪... '아성다이소' \n", + "4 4 1967년 프로 야구 드래프트 1순위로 요미우리 자이언츠에게 입단하면서 등번호는 8... '요미우리 자이언츠' \n", + "\n", + " object_entity label \n", + "0 '조지 해리슨' no_relation \n", + "1 '대안신당' no_relation \n", + "2 '한국프로축구연맹' org:member_of \n", + "3 '박정부' org:top_members/employees \n", + "4 '1967' no_relation " + ] + }, + "metadata": {}, + "execution_count": 127 + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 8, + "source": [ + "plt.figure(figsize=(15, 5)) \n", + "ax = sns.countplot(x = 'label', data = train_dataset)\n", + "\n", + "plt.xticks(np.arange(30), list(train_dataset.label.unique()), rotation = 90)\n", + "plt.title('Labels Ratio',fontsize= 14)\n", + "plt.xlabel('Label')\n", + "plt.ylabel('Number of label')\n", + "\n", + "counts = train_dataset['label'].value_counts()\n", + "counts_pct = [f'{elem * 100:.2f}%' for elem in counts / counts.sum()]\n", + "for i, v in enumerate(counts_pct):\n", + " ax.text(i, 0, v, horizontalalignment = 'center', rotation = 90, size = 10, color = 'black', fontweight = 'bold')\n", + " \n", + "plt.show()" + ], + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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vxDNxcDP/n3bzOxMv0rpLcnWJSIiIiIiIocotJZDM/sKr9WvuJmtwKs6+gLQz8zaAMuA6/2HDwUuBRYBu4DbAJxzm8ysOzDRf9zTzrlYkZv2eBVR8wA/+j8iIiIiIiJyGMwr9vnfoW6lIiIiIiLyX2Zmk51zdVMvj7pbqYiIiIiIiPwLKTkUERERERERJYciIiIiIiKi5FBERERERERQcigiIiIiIiIoORQRERERERGUHIqIiIiIiAhKDkVERERERATIntUbkFXWv/t5aOsucXfL0NYtIiIiIiISBrUcioiIiIiIiJJDERERERERUXIoIiIiIiIiKDkUERERERERlByKiIiIiIgISg5FREREREQEJYciIiIiIiKCkkMRERERERFByaGIiIiIiIig5FBERERERERQcigiIiIiIiIoORQRERERERGUHIqIiIiIiAhKDkVERERERAQlhyIiIiIiIoKSQxEREREREUHJoYiIiIiIiKDkUERERERERFByKCIiIiIiIig5FBEREREREZQcioiIiIiICEoORUREREREBCWHIiIiIiIigpJDERERERERQcmhiIiIiIiIoORQREREREREUHIoIiIiIiIiKDkUERERERERlByKiIiIiIgISg5FREREREQEJYciIiIiIiKCkkMRERERERFByaGIiIiIiIig5FBERERERERQcigiIiIiIiIoORQRERERERGUHIqIiIiIiAhZlBya2f1mNtvMZpnZV2aW28wqm9l4M1tkZl+bWU7/sbn824v8+49Ltp5H/eXzzaxJVuyLiIiIiIjIsSDy5NDMygH3AXWdcycD2YAbgReB15xzJwCbgTb+U9oAm/3lr/mPw8xq+s87CWgKvGNm2aLcFxERERERkWNFVnUrzQ7kMbPsQF5gNXABMMC/vw/QzP/7Kv82/v2Nzcz85X2dc/HOuSXAIqBeNJsvIiIiIiJybIk8OXTOrQReAf7GSwq3ApOBLc65BP9hK4By/t/lgOX+cxP8xxdLvjyN54iIiIiIiMghyIpupUXwWv0qA2WBfHjdQsOM2c7MJpnZpPXr14cZSkRERERE5KiUFd1KLwSWOOfWO+f2Ad8CDYDCfjdTgPLASv/vlUAFAP/+QsDG5MvTeE4Kzrn3nXN1nXN1S5QoEfT+iIiIiIiIHPWyIjn8GzjTzPL6YwcbA3OAkcC1/mNaA9/7fw/yb+Pf/6tzzvnLb/SrmVYGqgITItoHERERERGRY0r2gz8kWM658WY2AJgCJABTgfeBIUBfM3vGX9bbf0pv4DMzWwRswqtQinNutpn1w0ssE4AOzrnESHdGRERERETkGBF5cgjgnOsKdE21eDFpVBt1zu0BrktnPc8Czwa+gSIiIiIiIv8xWTWVhYiIiIiIiPyLKDkUERERERERJYciIiIiIiKi5FBERERERERQcigiIiIiIiIoORQRERERERGUHIqIiIiIiAhKDkVERERERAQlhyIiIiIiIoKSQxEREREREUHJoYiIiIiIiKDkUERERERERFByKCIiIiIiIig5FBEREREREZQcioiIiIiICEoORUREREREBCWHIiIiIiIigpJDERERERERQcmhiIiIiIiIoORQREREREREUHIoIiIiIiIiKDkUERERERERlByKiIiIiIgISg5FREREREQEJYciIiIiIiKCkkMRERERERFByaGIiIiIiIig5FBERERERERQcigiIiIiIiIoORQRERERERGUHIqIiIiIiAhKDkVERERERAQlhyIiIiIiIoKSQxEREREREUHJoYiIiIiIiKDkUERERERERFByKCIiIiIiIkD29O4ws9MyeqJzbkrwmyMiIiIiIiJZId3kEOiRwX0OuCDgbREREREREZEskm5y6Jw7P8oNERERERERkaxz0DGHZpbXzLqY2fv+7apmdnn4myYiIiIiIiJRyUxBmo+BvcDZ/u2VwDOhbZGIiIiIiIhELjPJYRXn3EvAPgDn3C7AQt0qERERERERiVRmksO9ZpYHrwgNZlYFiA91q0RERERERCRSGVUrjekK/ARUMLMvgAbArWFulIiIiIiIiETroC2HzrlhwDV4CeFXQF3n3KgjCWpmhc1sgJnNM7O5ZnaWmRU1s2FmttD/XcR/rJlZTzNbZGYzks+/aGat/ccvNLPWR7JNIiIiIiIi/2WZ6VYKcB7QGDgfaBhA3DeAn5xz1YFawFzgEWCEc64qMMK/DXAJUNX/aQe8C2BmRfFaNesD9YCusYRSREREREREDk1mprJ4B7gLmAnMAu40s7cPN6CZFQLOBXoDOOf2Oue2AFcBffyH9QGa+X9fBXzqPOOAwmZWBmgCDHPObXLObQaGAU0Pd7tERERERET+yzIz5vACoIZzLlaQpg8w+whiVgbWAx+bWS1gMtARKOWcW+0/Zg1Qyv+7HLA82fNX+MvSWy4iIiIiIiKHKDPdShcBFZPdruAvO1zZgdOAd51zdYCdHOhCCoCfiLojiJGCmbUzs0lmNmn9+vVBrVZEREREROSYkW5yaGY/mNkgoAAw18xGmdlIvPGBBY4g5gpghXNuvH97AF6yuNbvLor/e51//0q8hDSmvL8sveX/4Jx73zlX1zlXt0SJEkew6SIiIiIiIsemjLqVvhJGQOfcGjNbbmYnOufm4xW6meP/tAZe8H9/7z9lEHCPmfXFKz6z1Tm32sx+Bp5LVoTmYuDRMLZZRERERETkWJducuicGx1i3HuBL8wsJ7AYuA2vFbOfmbUBlgHX+48dClyK15V1l/9YnHObzKw7MNF/3NPOuU0hbrOIiIiIiMgx66AFaczsTOBNoAaQE8gG7HTOFTzcoM65aUDdNO5qnMZjHdAhnfV8BHx0uNshIiIiIiIinswUpHkLaAEsBPIAdwCHPZWFiIiIiIiI/PtkJjnEObcIyOacS3TOfYzmExQRERERETmmZGaew13+2MBpZvYSsJpMJpUiIiIiIiJydMhMktcKb5zhPXhzElYAmoe5USIiIiIiIhKtg7YcOueW+X/uBrqFuzkiIiIiIiKSFdJNDs1sJuDSu985d2ooWyQiIiIiIiKRy6jl8PLItkJERERERESyVLrJYbLupCIiIiIiInKMU9VRERERERERUXIoIiIiIiIiGSSHZjbC//1idJsjIiIiIiIiWSGjgjRlzOxs4Eoz6wtY8judc1NC3TIRERERERGJTEbJ4ZPAE0B54NVU9znggrA2SkRERERERKKVUbXSAcAAM3vCOdc9wm0SERERERGRiGXUcgiAc667mV0JnOsvGuWcGxzuZomIiIiIiEiUDlqt1MyeBzoCc/yfjmb2XNgbJiIiIiIiItE5aMshcBlQ2zmXBGBmfYCpwGNhbpiIiIiIiIhEJ7PzHBZO9nehELZDREREREREslBmWg6fB6aa2Ui86SzOBR4JdatEREREREQkUpkpSPOVmY0CzvAXPeycWxPqVomIiIiIiEikMtNyiHNuNTAo5G0RERERERGRLJLZMYciIiIiIiJyDFNyKCIiIiIiIhknh2aWzczmRbUxIiIiIiIikjUyTA6dc4nAfDOrGNH2iIiIiIiISBbITEGaIsBsM5sA7IwtdM5dGdpWiYiIiIiISKQykxw+EfpWiIiIiIiISJbKzDyHo82sElDVOTfczPIC2cLfNBEREREREYnKQauVmllbYADwnr+oHPBdiNskIiIiIiIiEcvMVBYdgAbANgDn3EKgZJgbJSIiIiIiItHKTHIY75zbG7thZtkBF94miYiIiIiISNQykxyONrPHgDxmdhHQH/gh3M0SERERERGRKGUmOXwEWA/MBO4EhgJdwtwoERERERERiVZmqpUmmVkfYDxed9L5zjl1KxURERERETmGHDQ5NLPLgF7AX4ABlc3sTufcj2FvnIiIiIiIiETjoMkh0AM43zm3CMDMqgBDACWHIiIiIiIix4jMjDncHksMfYuB7SFtj4iIiIiIiGSBdFsOzewa/89JZjYU6Ic35vA6YGIE2yYiIiIiIiIRyahb6RXJ/l4LnOf/vR7IE9oWiYiIiIiISOTSTQ6dc7dFuSEiIiIiIiKSdTJTrbQycC9wXPLHO+euDG+zREREREREJEqZqVb6HdAb+AFICnVrREREREREJEtkJjnc45zrGfqWSKBWvf1AKOst2+HVUNYrIiIiIiJZKzPJ4Rtm1hX4BYiPLXTOTQltq0RERERERCRSmUkOTwFaARdwoFup82+LiIiIiIjIMSAuE4+5DjjeOXeec+58/+eIE0Mzy2ZmU81ssH+7spmNN7NFZva1meX0l+fyby/y7z8u2Toe9ZfPN7MmR7pNIiIiIiIi/1WZSQ5nAYVDiN0RmJvs9ovAa865E4DNQBt/eRtgs7/8Nf9xmFlN4EbgJKAp8I6ZZQthO0VERERERI55mUkOCwPzzOxnMxsU+zmSoGZWHrgM+NC/bXjdVAf4D+kDNPP/vsq/jX9/Y//xVwF9nXPxzrklwCKg3pFsl4iIiIiIyH9VZsYcdg0h7uvA/4AC/u1iwBbnXIJ/ewVQzv+7HLAcwDmXYGZb/ceXA8YlW2fy54iIiIiIiMghOGhy6JwbHWRAM7scWOecm2xmjYJcdwYx2wHtACpWrBhFSBERERERkaPKQbuVmtl2M9vm/+wxs0Qz23YEMRsAV5rZUqAvXnfSN4DCZhZLVssDK/2/VwIV/G3JDhQCNiZfnsZzUnDOve+cq+ucq1uiRIkj2HQREREREZFj00GTQ+dcAedcQedcQSAP0Bx453ADOucedc6Vd84dh1dQ5lfn3M3ASOBa/2Gtge/9vwf5t/Hv/9U55/zlN/rVTCsDVYEJh7tdIiIiIiIi/2WZKUizn/N8B4QxbcTDwANmtghvTGFvf3lvoJi//AHgEX9bZgP9gDnAT0AH51xiCNslIiIiIiJyzDvomEMzuybZzTigLrAniODOuVHAKP/vxaRRbdQ5twdvrsW0nv8s8GwQ2yIiIiIiIvJflplqpVck+zsBWIo3jYSIiIiIiIgcIzJTrfS2KDZEREREREREsk66yaGZPZnB85xzrnsI2yMiIiIiIiJZIKOWw51pLMsHtMErGKPkUERERERE5BiRbnLonOsR+9vMCgAdgdvw5ibskd7zRERERERE5OiT4ZhDMyuKN33EzUAf4DTn3OYoNkxERERERESik9GYw5eBa4D3gVOcczsi2yoRERERERGJVEYthw8C8UAX4HEziy03vII0BUPeNpH/rAEfNw1lvdfe9lMo6xURERGRo19GYw7jotwQERERERERyTpKAEVERERERETJoYiIiIiIiCg5FBEREREREZQcioiIiIiICEoORUREREREBCWHIiIiIiIigpJDERERERERQcmhiIiIiIiIoORQREREREREUHIoIiIiIiIiKDkUERERERERlByKiIiIiIgISg5FREREREQEJYciIiIiIiKCkkMRERERERFByaGIiIiIiIig5FBERERERERQcigiIiIiIiIoORQRERERERGUHIqIiIiIiAhKDkVERERERAQlhyIiIiIiIoKSQxEREREREUHJoYiIiIiIiKDkUERERERERFByKCIiIiIiIig5FBEREREREZQcioiIiIiICEoORUREREREBCWHIiIiIiIigpJDERERERERQcmhiIiIiIiIoORQREREREREUHIoIiIiIiIiKDkUERERERERlByKiIiIiIgISg5FRERERESELEgOzayCmY00szlmNtvMOvrLi5rZMDNb6P8u4i83M+tpZovMbIaZnZZsXa39xy80s9ZR74uIiIiIiMixInsWxEwAHnTOTTGzAsBkMxsG3AqMcM69YGaPAI8ADwOXAFX9n/rAu0B9MysKdAXqAs5fzyDn3ObI90hEDknPL5qEst77bv45lPWKiIiI/BdE3nLonFvtnJvi/70dmAuUA64C+vgP6wM08/++CvjUecYBhc2sDNAEGOac2+QnhMOAptHtiYiIiIiIyLEjS8cc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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + } + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 9, + "source": [ + "def label_to_num(label):\n", + " num_label = []\n", + " with open('dict_label_to_num.pkl', 'rb') as f:\n", + " dict_label_to_num = pickle.load(f)\n", + " for v in label:\n", + " num_label.append(dict_label_to_num[v])\n", + " \n", + " return num_label\n", + "\n", + "def tokenized_non_paddig(dataset, tokenizer):\n", + " \"\"\" tokenizer에 따라 sentence를 tokenizing 합니다.\"\"\"\n", + " concat_entity = []\n", + " for e01, e02 in zip(dataset['subject_entity'], dataset['object_entity']):\n", + " temp = ''\n", + " temp = e01 + '[SEP]' + e02\n", + " concat_entity.append(temp)\n", + " tokenized_sentences = tokenizer(\n", + " concat_entity,\n", + " list(dataset['sentence']),\n", + " return_tensors=\"pt\",\n", + " padding=True,\n", + " truncation=True,\n", + " max_length=256,\n", + " add_special_tokens=True,\n", + " )\n", + " return tokenized_sentences" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 10, + "source": [ + "MODEL_NAME = \"xlm-roberta-large\"\n", + "tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)\n", + "\n", + "tokenized_train = tokenized_non_paddig(train_dataset, tokenizer)\n", + "train_label = label_to_num(train_dataset['label'].values)\n", + "RE_train_dataset = RE_Dataset(tokenized_train, train_label)" + ], + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/opt/conda/envs/basic/lib/python3.8/site-packages/transformers/tokenization_utils_base.py:2227: UserWarning: `max_length` is ignored when `padding`=`True`.\n", + " warnings.warn(\"`max_length` is ignored when `padding`=`True`.\")\n" + ] + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 11, + "source": [ + "data_length = [len([tok for tok in sent if tok != tokenizer.pad_token_id]) for sent in tokenized_train['input_ids']]" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 12, + "source": [ + "plt.figure(figsize=(15, 5)) \n", + "ax = sns.histplot(data = data_length)\n", + "\n", + "plt.title('Input token Length',fontsize= 14)\n", + "plt.xlabel('Length')\n", + "plt.ylabel('Count')\n", + "\n", + "plt.show()" + ], + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + } + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 138, + "source": [ + "def special_lang_idx(dataset):\n", + " df = dataset[['subject_entity', 'object_entity']]\n", + " df = df.applymap(lambda x : re.sub('[a-zA-Zㄱ-ㅎ가-힣0-9 ]', '', x))\n", + " # com = re.compile('\\w+')\n", + " # df = df.applymap(lambda x : \"\".join(com.findall(x)))\n", + " df = df.applymap(lambda x : \"\".join(re.findall('\\w', x)))\n", + " df = df.applymap(lambda x : re.sub('\\s', '', x))\n", + " df.replace('', np.nan, inplace=True)\n", + " \n", + " special_lang_idx = []\n", + "\n", + " special_lang_idx.extend(list(df[df.notnull()['subject_entity']==True].index))\n", + " special_lang_idx.extend(list(df[df.notnull()['object_entity']==True].index))\n", + "\n", + " special_lang_idx = list(set(special_lang_idx))\n", + "\n", + " return special_lang_idx\n", + "\n" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 139, + "source": [ + "trn_special_lang_idx = special_lang_idx(train_dataset)\n", + "tst_special_lang_idx = special_lang_idx(test_dataset)\n", + "print(\"num of special lang in the obj&sub of Train set :\", len(trn_special_lang_idx))\n", + "print(\"num of special lang in the obj&sub of Test set :\", len(tst_special_lang_idx))" + ], + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "num of special lang in the obj&sub of Train set : 215\n", + "num of special lang in the obj&sub of Test set : 56\n" + ] + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 143, + "source": [ + "trn_spc_lang = train_dataset.iloc[trn_special_lang_idx].head()" + ], + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
idsentencesubject_entityobject_entitylabel
2201622016능은 경기도 화성시에 위치한 융릉(隆陵)으로 남편인 장조와 함께 묻혀 있으며 인근에...'효의왕후''건릉(健陵)'no_relation
56345634토레 안드레 플로(Tore André Flo, 1973년 6월 15일, 송노피오라네...'토레 안드레 플로''Tore André Flo'per:alternate_names
1945819458윤종신(尹鍾信, 1969년 10월 15일 ~)은 대한민국의 작곡가, 가수 겸 방송인이다.'윤종신''尹鍾信'per:alternate_names
66676667최창권(崔彰權, 천주교 세례명 바오로, 1934년 10월 26일 ~ 2008년 1월...'최창권''崔彰權'per:alternate_names
2202822028한편 복녕군은 고종 즉위 후인 1864년(고종 원년) 음력 7월 9일 효헌(孝獻)의...'복녕군''효헌(孝獻)'per:alternate_names
\n", + "
" + ], + "text/plain": [ + " id sentence \\\n", + "22016 22016 능은 경기도 화성시에 위치한 융릉(隆陵)으로 남편인 장조와 함께 묻혀 있으며 인근에... \n", + "5634 5634 토레 안드레 플로(Tore André Flo, 1973년 6월 15일, 송노피오라네... \n", + "19458 19458 윤종신(尹鍾信, 1969년 10월 15일 ~)은 대한민국의 작곡가, 가수 겸 방송인이다. \n", + "6667 6667 최창권(崔彰權, 천주교 세례명 바오로, 1934년 10월 26일 ~ 2008년 1월... \n", + "22028 22028 한편 복녕군은 고종 즉위 후인 1864년(고종 원년) 음력 7월 9일 효헌(孝獻)의... \n", + "\n", + " subject_entity object_entity label \n", + "22016 '효의왕후' '건릉(健陵)' no_relation \n", + "5634 '토레 안드레 플로' 'Tore André Flo' per:alternate_names \n", + "19458 '윤종신' '尹鍾信' per:alternate_names \n", + "6667 '최창권' '崔彰權' per:alternate_names \n", + "22028 '복녕군' '효헌(孝獻)' per:alternate_names " + ] + }, + "metadata": {}, + "execution_count": 143 + } + ], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": 144, + "source": [ + "t_spc_lang = test_dataset.iloc[tst_special_lang_idx].head()" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [ + "plt.figure(figsize=(15, 5)) \n", + "ax = sns.countplot(x = 'label', data = train_dataset)\n", + "\n", + "plt.xticks(np.arange(30), list(train_dataset.label.unique()), rotation = 90)\n", + "plt.title('Labels Ratio',fontsize= 14)\n", + "plt.xlabel('Label')\n", + "plt.ylabel('Number of label')\n", + "\n", + "counts = train_dataset['label'].value_counts()\n", + "counts_pct = [f'{elem * 100:.2f}%' for elem in counts / counts.sum()]\n", + "for i, v in enumerate(counts_pct):\n", + " ax.text(i, 0, v, horizontalalignment = 'center', rotation = 90, size = 10, color = 'black', fontweight = 'bold')\n", + " \n", + "plt.show()" + ], + "outputs": [], + "metadata": {} + }, + { + "cell_type": "code", + "execution_count": null, + "source": [], + "outputs": [], + "metadata": {} + } + ], + "metadata": { + "interpreter": { + "hash": "883f4b2fb0a3279582c48a1b3ea671410eb924431136537ea6c03e47c9180cb0" + }, + "kernelspec": { + "display_name": "Basic", + "language": "python", + "name": "basic" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.11" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/inference.py b/inference.py new file mode 100644 index 0000000..1843549 --- /dev/null +++ b/inference.py @@ -0,0 +1,102 @@ +from transformers import AutoTokenizer, AutoConfig, AutoModelForSequenceClassification, Trainer, TrainingArguments +from torch.utils.data import DataLoader +from load_data import * +import pandas as pd +import torch +import torch.nn.functional as F + +import pickle as pickle +import numpy as np +import argparse +from tqdm import tqdm + +def inference(model, tokenized_sent, device): + """ + test dataset을 DataLoader로 만들어 준 후, + batch_size로 나눠 model이 예측 합니다. + """ + dataloader = DataLoader(tokenized_sent, batch_size=16, shuffle=False) + model.eval() + output_pred = [] + output_prob = [] + for i, data in enumerate(tqdm(dataloader)): + with torch.no_grad(): + outputs = model( + input_ids=data['input_ids'].to(device), + attention_mask=data['attention_mask'].to(device), + # token_type_ids=data['token_type_ids'].to(device) + ) + logits = outputs[0] + prob = F.softmax(logits, dim=-1).detach().cpu().numpy() + logits = logits.detach().cpu().numpy() + result = np.argmax(logits, axis=-1) + + output_pred.append(result) + output_prob.append(prob) + + return np.concatenate(output_pred).tolist(), np.concatenate(output_prob, axis=0).tolist() + +def num_to_label(label): + """ + 숫자로 되어 있던 class를 원본 문자열 라벨로 변환 합니다. + """ + origin_label = [] + with open('dict_num_to_label.pkl', 'rb') as f: + dict_num_to_label = pickle.load(f) + for v in label: + origin_label.append(dict_num_to_label[v]) + + return origin_label + +def load_test_dataset(dataset_dir, tokenizer): + """ + test dataset을 불러온 후, + tokenizing 합니다. + """ + test_dataset = load_data(dataset_dir) + test_label = list(map(int,test_dataset['label'].values)) + # tokenizing dataset + tokenized_test = tokenized_dataset(test_dataset, tokenizer) + return test_dataset['id'], tokenized_test, test_label + +def main(args): + """ + 주어진 dataset csv 파일과 같은 형태일 경우 inference 가능한 코드입니다. + """ + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + # load tokenizer + Tokenizer_NAME = "roberta-base" + tokenizer = AutoTokenizer.from_pretrained(Tokenizer_NAME) + + ## load my model + MODEL_NAME = args.model_dir # model dir. + model = AutoModelForSequenceClassification.from_pretrained(args.model_dir) + model.parameters + model.to(device) + + ## load test datset + test_dataset_dir = "../dataset/test/test_data.csv" + test_id, test_dataset, test_label = load_test_dataset(test_dataset_dir, tokenizer) + Re_test_dataset = RE_Dataset(test_dataset ,test_label) + + ## predict answer + pred_answer, output_prob = inference(model, Re_test_dataset, device) # model에서 class 추론 + pred_answer = num_to_label(pred_answer) # 숫자로 된 class를 원래 문자열 라벨로 변환. + + ## make csv file with predicted answer + ######################################################### + # 아래 directory와 columns의 형태는 지켜주시기 바랍니다. + output = pd.DataFrame({'id':test_id,'pred_label':pred_answer,'probs':output_prob,}) + + output.to_csv('./prediction/submission.csv', index=False) # 최종적으로 완성된 예측한 라벨 csv 파일 형태로 저장. + #### 필수!! ############################################## + print('---- Finish! ----') +if __name__ == '__main__': + parser = argparse.ArgumentParser() + + # model dir + parser.add_argument('--model_dir', type=str, default="./best_model/roberta-base") + args = parser.parse_args() + print(args) + main(args) + diff --git a/load_data.py b/load_data.py new file mode 100644 index 0000000..73b13cb --- /dev/null +++ b/load_data.py @@ -0,0 +1,57 @@ +import pickle as pickle +import os +import pandas as pd +import torch + + +class RE_Dataset(torch.utils.data.Dataset): + """ Dataset 구성을 위한 class.""" + def __init__(self, pair_dataset, labels): + self.pair_dataset = pair_dataset + self.labels = labels + + def __getitem__(self, idx): + item = {key: val[idx].clone().detach() for key, val in self.pair_dataset.items()} + item['labels'] = torch.tensor(self.labels[idx]) + return item + + def __len__(self): + return len(self.labels) + +def preprocessing_dataset(dataset): + """ 처음 불러온 csv 파일을 원하는 형태의 DataFrame으로 변경 시켜줍니다.""" + subject_entity = [] + object_entity = [] + for i,j in zip(dataset['subject_entity'], dataset['object_entity']): + i = i[1:-1].split(',')[0].split(':')[1] + j = j[1:-1].split(',')[0].split(':')[1] + + subject_entity.append(i) + object_entity.append(j) + out_dataset = pd.DataFrame({'id':dataset['id'], 'sentence':dataset['sentence'],'subject_entity':subject_entity,'object_entity':object_entity,'label':dataset['label'],}) + return out_dataset + +def load_data(dataset_dir): + """ csv 파일을 경로에 맡게 불러 옵니다. """ + pd_dataset = pd.read_csv(dataset_dir) + dataset = preprocessing_dataset(pd_dataset) + + return dataset + +def tokenized_dataset(dataset, tokenizer): + """ tokenizer에 따라 sentence를 tokenizing 합니다.""" + concat_entity = [] + for e01, e02 in zip(dataset['subject_entity'], dataset['object_entity']): + temp = '' + temp = e01 + ' [SEP]' + e02 + concat_entity.append(temp) + tokenized_sentences = tokenizer( + concat_entity, + list(dataset['sentence']), + return_tensors="pt", + padding=True, + truncation=True, + max_length=128, + add_special_tokens=True, + ) + return tokenized_sentences diff --git a/train.py b/train.py new file mode 100644 index 0000000..69e16ac --- /dev/null +++ b/train.py @@ -0,0 +1,249 @@ +import pickle as pickle +import os +import pandas as pd +import torch +import sklearn +import numpy as np +from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score +from transformers import AutoTokenizer, AutoConfig, AutoModelForSequenceClassification, Trainer, TrainingArguments, RobertaConfig, RobertaTokenizer, RobertaForSequenceClassification, BertTokenizer +from load_data import * +import random +import wandb +from sklearn.model_selection import StratifiedKFold + +def seed_everything(seed): + torch.manual_seed(seed) + torch.cuda.manual_seed(seed) + torch.cuda.manual_seed_all(seed) # if use multi-GPU + torch.backends.cudnn.deterministic = True + torch.backends.cudnn.benchmark = False + np.random.seed(seed) + random.seed(seed) + +def klue_re_micro_f1(preds, labels): + """KLUE-RE micro f1 (except no_relation)""" + label_list = ['no_relation', 'org:top_members/employees', 'org:members', + 'org:product', 'per:title', 'org:alternate_names', + 'per:employee_of', 'org:place_of_headquarters', 'per:product', + 'org:number_of_employees/members', 'per:children', + 'per:place_of_residence', 'per:alternate_names', + 'per:other_family', 'per:colleagues', 'per:origin', 'per:siblings', + 'per:spouse', 'org:founded', 'org:political/religious_affiliation', + 'org:member_of', 'per:parents', 'org:dissolved', + 'per:schools_attended', 'per:date_of_death', 'per:date_of_birth', + 'per:place_of_birth', 'per:place_of_death', 'org:founded_by', + 'per:religion'] + no_relation_label_idx = label_list.index("no_relation") + label_indices = list(range(len(label_list))) + label_indices.remove(no_relation_label_idx) + return sklearn.metrics.f1_score(labels, preds, average="micro", labels=label_indices) * 100.0 + +def klue_re_auprc(probs, labels): + """KLUE-RE AUPRC (with no_relation)""" + labels = np.eye(30)[labels] + + score = np.zeros((30,)) + for c in range(30): + targets_c = labels.take([c], axis=1).ravel() + preds_c = probs.take([c], axis=1).ravel() + precision, recall, _ = sklearn.metrics.precision_recall_curve(targets_c, preds_c) + score[c] = sklearn.metrics.auc(recall, precision) + return np.average(score) * 100.0 + +def compute_metrics(pred): + """ validation을 위한 metrics function """ + labels = pred.label_ids + preds = pred.predictions.argmax(-1) + probs = pred.predictions + + # calculate accuracy using sklearn's function + f1 = klue_re_micro_f1(preds, labels) + auprc = klue_re_auprc(probs, labels) + acc = accuracy_score(labels, preds) # 리더보드 평가에는 포함되지 않습니다. + + return { + 'micro f1 score': f1, + 'auprc' : auprc, + 'accuracy': acc, + } + +def label_to_num(label): + num_label = [] + with open('dict_label_to_num.pkl', 'rb') as f: + dict_label_to_num = pickle.load(f) + for v in label: + num_label.append(dict_label_to_num[v]) + + return num_label + +def train(): + # load model and tokenizer + # MODEL_NAME = "bert-base-uncased" + MODEL_NAME = "xlm-roberta-large" + tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) + + # load dataset + with open('./train_eval_idx.pkl', 'rb') as f: + data_idx = pickle.load(f) + + dataset = load_data("../dataset/train/train.csv") + train_dataset = dataset.iloc[data_idx['train']] + dev_dataset = dataset.iloc[data_idx['eval']] + + train_label = label_to_num(train_dataset['label'].values) + dev_label = label_to_num(dev_dataset['label'].values) + + # tokenizing dataset + tokenized_train = tokenized_dataset(train_dataset, tokenizer) + tokenized_dev = tokenized_dataset(dev_dataset, tokenizer) + + # make dataset for pytorch. + RE_train_dataset = RE_Dataset(tokenized_train, train_label) + RE_dev_dataset = RE_Dataset(tokenized_dev, dev_label) + + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + + print(device) + # setting model hyperparameter + model_config = AutoConfig.from_pretrained(MODEL_NAME) + model_config.num_labels = 30 + + model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, config=model_config) + print(model.config) + model.parameters + model.to(device) + + # 사용한 option 외에도 다양한 option들이 있습니다. + # https://huggingface.co/transformers/main_classes/trainer.html#trainingarguments 참고해주세요. + training_args = TrainingArguments( + output_dir='./results', # output directory + save_total_limit=5, # number of total save model. + save_steps=500, # model saving step. + num_train_epochs=5, # total number of training epochs + learning_rate=3e-5, # learning_rate + per_device_train_batch_size=64, # batch size per device during training + per_device_eval_batch_size=64, # batch size for evaluation + warmup_ratio=0.1, + warmup_steps=500, # number of warmup steps for learning rate scheduler + weight_decay=0.01, # strength of weight decay + logging_dir='./logs', # directory for storing logs + logging_steps=100, # log saving step. + evaluation_strategy='steps', # evaluation strategy to adopt during training + # `no`: No evaluation during training. + # `steps`: Evaluate every `eval_steps`. + # `epoch`: Evaluate every end of epoch. + eval_steps = 500, # evaluation step. + load_best_model_at_end = True, + seed = 42, + + report_to = "wandb", + run_name = f"0927-{MODEL_NAME}" + ) + trainer = Trainer( + model=model, # the instantiated 🤗 Transformers model to be trained + args=training_args, # training arguments, defined above + train_dataset=RE_train_dataset, # training dataset + eval_dataset=RE_dev_dataset, # evaluation dataset + compute_metrics=compute_metrics # define metrics function + ) + + # train model + trainer.train() + model.save_pretrained(f'./best_model/{MODEL_NAME}') + +def train_kfold(): + # load model and tokenizer + # MODEL_NAME = "bert-base-uncased" + MODEL_NAME = "xlm-roberta-large" + tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) + + # load dataset + dataset = load_data("../dataset/train/train.csv") + dataset_label = label_to_num(dataset['label'].values) + skf = StratifiedKFold(n_splits=5) + fold_data = skf.split(dataset, dataset_label) + + for fold_i, (trn_idx, dev_idx) in enumerate(fold_data): + + train_dataset = dataset.iloc[trn_idx] + dev_dataset = dataset.iloc[dev_idx] + + train_label = label_to_num(train_dataset['label'].values) + dev_label = label_to_num(dev_dataset['label'].values) + + # tokenizing dataset + tokenized_train = tokenized_dataset(train_dataset, tokenizer) + tokenized_dev = tokenized_dataset(dev_dataset, tokenizer) + + # make dataset for pytorch. + RE_train_dataset = RE_Dataset(tokenized_train, train_label) + RE_dev_dataset = RE_Dataset(tokenized_dev, dev_label) + + device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') + + print(device) + # setting model hyperparameter + model_config = AutoConfig.from_pretrained(MODEL_NAME) + model_config.num_labels = 30 + + model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, config=model_config) + print(model.config) + model.parameters + model.to(device) + + # 사용한 option 외에도 다양한 option들이 있습니다. + # https://huggingface.co/transformers/main_classes/trainer.html#trainingarguments 참고해주세요. + training_args = TrainingArguments( + output_dir='./results', # output directory + save_total_limit=5, # number of total save model. + save_steps=500, # model saving step. + num_train_epochs=5, # total number of training epochs + learning_rate=3e-5, # learning_rate + per_device_train_batch_size=50, # batch size per device during training + per_device_eval_batch_size=50, # batch size for evaluation + warmup_ratio=0.1, + warmup_steps=500, # number of warmup steps for learning rate scheduler + weight_decay=0.01, # strength of weight decay + logging_dir='./logs', # directory for storing logs + logging_steps=100, # log saving step. + evaluation_strategy='steps', # evaluation strategy to adopt during training + # `no`: No evaluation during training. + # `steps`: Evaluate every `eval_steps`. + # `epoch`: Evaluate every end of epoch. + eval_steps = 500, # evaluation step. + load_best_model_at_end = True, + seed = 42, + + report_to = "wandb", + run_name = f"0928-{MODEL_NAME}-{fold_i+1}/5_fold" + ) + trainer = Trainer( + model=model, # the instantiated 🤗 Transformers model to be trained + args=training_args, # training arguments, defined above + train_dataset=RE_train_dataset, # training dataset + eval_dataset=RE_dev_dataset, # evaluation dataset + compute_metrics=compute_metrics # define metrics function + ) + + # train model + trainer.train() + model.save_pretrained(f'./best_model/{MODEL_NAME}_fold_{fold_i+1}/5') + +def main(): + # train() + train_kfold() + +if __name__ == '__main__': + seed_everything(42) + + os.environ["WANDB_PROJECT"] = "klue_re_xlm-roberta-large-5_fold" + call_wandb = True + try: + os.environ["WANDB_PROJECT"] + except KeyError: + call_wandb = False + if call_wandb: + import wandb + wandb.login() + + main() From 571716da3dd532110e850d4d03f77f8cc3cd251c Mon Sep 17 00:00:00 2001 From: uyeongjae Date: Fri, 1 Oct 2021 05:37:03 +0000 Subject: [PATCH 2/7] add data_augmentation.py --- data_augmentation.py | 104 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 data_augmentation.py diff --git a/data_augmentation.py b/data_augmentation.py new file mode 100644 index 0000000..b94c145 --- /dev/null +++ b/data_augmentation.py @@ -0,0 +1,104 @@ +import numpy as np +import pandas as pd +import pickle +from typing import List, Tuple, Union, Dict, Text + +def find_nth(string, substring, n): + if (n == 1): + return string.find(substring) + else: + return string.find(substring, find_nth(string, substring, n - 1) + 1) + +def entity_prepro(sentence, entity): + start_idx = find_nth(sentence, entity[0], entity[2]) + end_idx = start_idx + len(entity[0]) + + p_entity = { + "word" : entity[0], + "start_idx" : start_idx, + "end_idx" : end_idx, + "type" : entity[1] + } + + return p_entity + + +def data_organizing( + sentence : Text, + subjects : Tuple[str, str, int], + objects : Tuple[str, str, int] +) -> Union[Text, Dict[str, str], Dict[str, str]]: + + p_subjects = entity_prepro(sentence, subjects) + p_objects = entity_prepro(sentence, objects) + + return [sentence, p_subjects, p_objects] + +def augmentation( + tagged_sentences : Union[List[Tuple[str, str]]] +) -> List[Union[str, Dict, Dict]]: + + tagged_sentence_word_cnt = [] + + for sent in tagged_sentences: # 토큰별로 몇번째로 등장했는지 추가 + tmp = '' + count_tagged = [] + for tok, tag in sent: + count_tagged.append((tok, tag, tmp.count(tok)+1)) + tmp += tok + tagged_sentence_word_cnt.append(count_tagged) + + print("Number of Data to aumgented :", len(tagged_sentence_word_cnt)) + + augmented_data = [] + for tag_sent in tagged_sentence_word_cnt: + org_sent = "".join([tok for tok, tag, _ in tag_sent]) + obj_list = [(tok, tag, cnt) for tok, tag, cnt in tag_sent if tag_map[tag]!='O'] + sbj_list = [(tok, tag, cnt) for tok, tag, cnt in obj_list if tag in ['PERSON', 'ORGANIZATION']] + cand_list = [[org_sent, sbj, obj] for sbj in sbj_list for obj in obj_list if sbj!=obj] + augmented_data.extend([data_organizing(sent, sbj, obj) for sent, sbj, obj in cand_list]) + + print("Number of Augmented data :", len(augmented_data)) + + return augmented_data + +def main(): + using_tag = ['PERSON', 'LOCATION', 'ORGANIZATION', 'DATE', 'TIME', 'CITY'] + + tag_map = { + 'PERSON' : 'PER', + 'LOCATION' : 'LOC', + 'ORGANIZATION' : 'ORG', + 'CITY' : 'LOC', + 'COUNTRY' : 'ORG', #ORG + 'ARTIFACT' : 'O', + 'DATE' : 'DAT', + 'TIME' : 'DAT', + 'CIVILIZATION' : 'O', + 'ANIMAL' : 'O', + 'PLANT' : 'O', + 'QUANTITY' : 'NOH', + 'STUDY_FIELD' : 'O', + 'THEORY' : 'O', + 'EVENT' : 'O', #ORG + 'MATERIAL' : 'O', + 'TERM' : 'O', + 'OCCUPATION' : 'O', #직업 + 'DISEASE' : 'O', + 'O' : 'O', + } + with open('tagged_sentence.pickle', 'rb') as f: + tagged_sentence = pickle.load(f) + + aug_data = augmentation(tagged_sentence) + + augmented_data = pd.DataFrame(aug_data) + augmented_data.columns = ['sentence', 'subject_entity', 'object_entity'] + augmented_data['label'] = None + augmented_data['source'] = 'augmented' + + augmented_data.to_csv("augmented_data.csv", index=False) + + with open('augmented_data.pickle', 'wb') as f: + pickle.dump(augmented_data, f, pickle.HIGHEST_PROTOCOL) + \ No newline at end of file From dce3d44954129a4f5301a85a965c05df206f0f2c Mon Sep 17 00:00:00 2001 From: MyungHoon Jin Date: Sat, 9 Oct 2021 14:12:06 +0900 Subject: [PATCH 3/7] Delete .gitignore prevent conflict --- .gitignore | 144 ----------------------------------------------------- 1 file changed, 144 deletions(-) delete mode 100644 .gitignore diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 2424553..0000000 --- a/.gitignore +++ /dev/null @@ -1,144 +0,0 @@ -# Created by https://www.toptal.com/developers/gitignore/api/python -# Edit at https://www.toptal.com/developers/gitignore?templates=python - -### Python ### -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - From eb632233a2bc001a467d5344555aa84272ec06a7 Mon Sep 17 00:00:00 2001 From: MyungHoon Jin Date: Sat, 9 Oct 2021 14:12:17 +0900 Subject: [PATCH 4/7] Delete EDA_uyzae.ipynb prevent conflict --- EDA_uyzae.ipynb | 502 ------------------------------------------------ 1 file changed, 502 deletions(-) delete mode 100644 EDA_uyzae.ipynb diff --git a/EDA_uyzae.ipynb b/EDA_uyzae.ipynb deleted file mode 100644 index 5b57423..0000000 --- a/EDA_uyzae.ipynb +++ /dev/null @@ -1,502 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 6, - "source": [ - "import numpy as np\n", - "import pandas as pd\n", - "import torch\n", - "import matplotlib.pyplot as plt\n", - "import seaborn as sns\n", - "from transformers import AutoTokenizer, AutoConfig, AutoModelForSequenceClassification, Trainer, TrainingArguments, RobertaConfig, RobertaTokenizer, RobertaForSequenceClassification, BertTokenizer\n", - "from load_data import *\n", - "import re\n", - "\n", - "class RE_Dataset(torch.utils.data.Dataset):\n", - " \"\"\" Dataset 구성을 위한 class.\"\"\"\n", - " def __init__(self, pair_dataset, labels):\n", - " self.pair_dataset = pair_dataset\n", - " self.labels = labels\n", - "\n", - " def __getitem__(self, idx):\n", - " item = {key: val[idx].clone().detach() for key, val in self.pair_dataset.items()}\n", - " item['labels'] = torch.tensor(self.labels[idx])\n", - " return item\n", - "\n", - " def __len__(self):\n", - " return len(self.labels)\n", - "\n", - "def preprocessing_dataset(dataset):\n", - " \"\"\" 처음 불러온 csv 파일을 원하는 형태의 DataFrame으로 변경 시켜줍니다.\"\"\"\n", - " subject_entity = []\n", - " object_entity = []\n", - " for i,j in zip(dataset['subject_entity'], dataset['object_entity']):\n", - " i = i[1:-1].split(',')[0].split(':')[1]\n", - " j = j[1:-1].split(',')[0].split(':')[1]\n", - "\n", - " subject_entity.append(i)\n", - " object_entity.append(j)\n", - " out_dataset = pd.DataFrame({'id':dataset['id'], 'sentence':dataset['sentence'],'subject_entity':subject_entity,'object_entity':object_entity,'label':dataset['label'],})\n", - " return out_dataset\n", - "\n", - "def load_data(dataset_dir):\n", - " \"\"\" csv 파일을 경로에 맡게 불러 옵니다. \"\"\"\n", - " pd_dataset = pd.read_csv(dataset_dir)\n", - " dataset = preprocessing_dataset(pd_dataset)\n", - " \n", - " return dataset\n" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 127, - "source": [ - "train_dataset = load_data(\"../dataset/train/train.csv\")\n", - "test_dataset = load_data(\"../dataset/test/test_data.csv\")\n", - "\n", - "train_dataset.head()" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idsentencesubject_entityobject_entitylabel
00〈Something〉는 조지 해리슨이 쓰고 비틀즈가 1969년 앨범 《Abbey R...'비틀즈''조지 해리슨'no_relation
11호남이 기반인 바른미래당·대안신당·민주평화당이 우여곡절 끝에 합당해 민생당(가칭)으...'민주평화당''대안신당'no_relation
22K리그2에서 성적 1위를 달리고 있는 광주FC는 지난 26일 한국프로축구연맹으로부터...'광주FC''한국프로축구연맹'org:member_of
33균일가 생활용품점 (주)아성다이소(대표 박정부)는 코로나19 바이러스로 어려움을 겪...'아성다이소''박정부'org:top_members/employees
441967년 프로 야구 드래프트 1순위로 요미우리 자이언츠에게 입단하면서 등번호는 8...'요미우리 자이언츠''1967'no_relation
\n", - "
" - ], - "text/plain": [ - " id sentence subject_entity \\\n", - "0 0 〈Something〉는 조지 해리슨이 쓰고 비틀즈가 1969년 앨범 《Abbey R... '비틀즈' \n", - "1 1 호남이 기반인 바른미래당·대안신당·민주평화당이 우여곡절 끝에 합당해 민생당(가칭)으... '민주평화당' \n", - "2 2 K리그2에서 성적 1위를 달리고 있는 광주FC는 지난 26일 한국프로축구연맹으로부터... '광주FC' \n", - "3 3 균일가 생활용품점 (주)아성다이소(대표 박정부)는 코로나19 바이러스로 어려움을 겪... '아성다이소' \n", - "4 4 1967년 프로 야구 드래프트 1순위로 요미우리 자이언츠에게 입단하면서 등번호는 8... '요미우리 자이언츠' \n", - "\n", - " object_entity label \n", - "0 '조지 해리슨' no_relation \n", - "1 '대안신당' no_relation \n", - "2 '한국프로축구연맹' org:member_of \n", - "3 '박정부' org:top_members/employees \n", - "4 '1967' no_relation " - ] - }, - "metadata": {}, - "execution_count": 127 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 8, - "source": [ - "plt.figure(figsize=(15, 5)) \n", - "ax = sns.countplot(x = 'label', data = train_dataset)\n", - "\n", - "plt.xticks(np.arange(30), list(train_dataset.label.unique()), rotation = 90)\n", - "plt.title('Labels Ratio',fontsize= 14)\n", - "plt.xlabel('Label')\n", - "plt.ylabel('Number of label')\n", - "\n", - "counts = train_dataset['label'].value_counts()\n", - "counts_pct = [f'{elem * 100:.2f}%' for elem in counts / counts.sum()]\n", - "for i, v in enumerate(counts_pct):\n", - " ax.text(i, 0, v, horizontalalignment = 'center', rotation = 90, size = 10, color = 'black', fontweight = 'bold')\n", - " \n", - "plt.show()" - ], - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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vxDNxcDP/n3bzOxMv0rpLcnWJSIiIiIiIocotJZDM/sKr9WvuJmtwKs6+gLQz8zaAMuA6/2HDwUuBRYBu4DbAJxzm8ysOzDRf9zTzrlYkZv2eBVR8wA/+j8iIiIiIiJyGMwr9vnfoW6lIiIiIiLyX2Zmk51zdVMvj7pbqYiIiIiIiPwLKTkUERERERERJYciIiIiIiKi5FBERERERERQcigiIiIiIiIoORQRERERERGUHIqIiIiIiAhKDkVERERERATIntUbkFXWv/t5aOsucXfL0NYtIiIiIiISBrUcioiIiIiIiJJDERERERERUXIoIiIiIiIiKDkUERERERERlByKiIiIiIgISg5FREREREQEJYciIiIiIiKCkkMRERERERFByaGIiIiIiIig5FBERERERERQcigiIiIiIiIoORQRERERERGUHIqIiIiIiAhKDkVERERERAQlhyIiIiIiIoKSQxEREREREUHJoYiIiIiIiKDkUERERERERFByKCIiIiIiIig5FBEREREREZQcioiIiIiICEoORUREREREBCWHIiIiIiIigpJDERERERERQcmhiIiIiIiIoORQREREREREUHIoIiIiIiIiKDkUERERERERlByKiIiIiIgISg5FREREREQEJYciIiIiIiKCkkMRERERERFByaGIiIiIiIig5FBERERERERQcigiIiIiIiIoORQRERERERGUHIqIiIiIiAhZlBya2f1mNtvMZpnZV2aW28wqm9l4M1tkZl+bWU7/sbn824v8+49Ltp5H/eXzzaxJVuyLiIiIiIjIsSDy5NDMygH3AXWdcycD2YAbgReB15xzJwCbgTb+U9oAm/3lr/mPw8xq+s87CWgKvGNm2aLcFxERERERkWNFVnUrzQ7kMbPsQF5gNXABMMC/vw/QzP/7Kv82/v2Nzcz85X2dc/HOuSXAIqBeNJsvIiIiIiJybIk8OXTOrQReAf7GSwq3ApOBLc65BP9hK4By/t/lgOX+cxP8xxdLvjyN54iIiIiIiMghyIpupUXwWv0qA2WBfHjdQsOM2c7MJpnZpPXr14cZSkRERERE5KiUFd1KLwSWOOfWO+f2Ad8CDYDCfjdTgPLASv/vlUAFAP/+QsDG5MvTeE4Kzrn3nXN1nXN1S5QoEfT+iIiIiIiIHPWyIjn8GzjTzPL6YwcbA3OAkcC1/mNaA9/7fw/yb+Pf/6tzzvnLb/SrmVYGqgITItoHERERERGRY0r2gz8kWM658WY2AJgCJABTgfeBIUBfM3vGX9bbf0pv4DMzWwRswqtQinNutpn1w0ssE4AOzrnESHdGRERERETkGBF5cgjgnOsKdE21eDFpVBt1zu0BrktnPc8Czwa+gSIiIiIiIv8xWTWVhYiIiIiIiPyLKDkUERERERERJYciIiIiIiKi5FBERERERERQcigiIiIiIiIoORQRERERERGUHIqIiIiIiAhKDkVERERERAQlhyIiIiIiIoKSQxEREREREUHJoYiIiIiIiKDkUERERERERFByKCIiIiIiIig5FBEREREREZQcioiIiIiICEoORUREREREBCWHIiIiIiIigpJDERERERERQcmhiIiIiIiIoORQREREREREUHIoIiIiIiIiKDkUERERERERlByKiIiIiIgISg5FREREREQEJYciIiIiIiKCkkMRERERERFByaGIiIiIiIig5FBERERERERQcigiIiIiIiIoORQRERERERGUHIqIiIiIiAhKDkVERERERAQlhyIiIiIiIoKSQxEREREREUHJoYiIiIiIiKDkUERERERERFByKCIiIiIiIkD29O4ws9MyeqJzbkrwmyMiIiIiIiJZId3kEOiRwX0OuCDgbREREREREZEskm5y6Jw7P8oNERERERERkaxz0DGHZpbXzLqY2fv+7apmdnn4myYiIiIiIiJRyUxBmo+BvcDZ/u2VwDOhbZGIiIiIiIhELjPJYRXn3EvAPgDn3C7AQt0qERERERERiVRmksO9ZpYHrwgNZlYFiA91q0RERERERCRSGVUrjekK/ARUMLMvgAbArWFulIiIiIiIiETroC2HzrlhwDV4CeFXQF3n3KgjCWpmhc1sgJnNM7O5ZnaWmRU1s2FmttD/XcR/rJlZTzNbZGYzks+/aGat/ccvNLPWR7JNIiIiIiIi/2WZ6VYKcB7QGDgfaBhA3DeAn5xz1YFawFzgEWCEc64qMMK/DXAJUNX/aQe8C2BmRfFaNesD9YCusYRSREREREREDk1mprJ4B7gLmAnMAu40s7cPN6CZFQLOBXoDOOf2Oue2AFcBffyH9QGa+X9fBXzqPOOAwmZWBmgCDHPObXLObQaGAU0Pd7tERERERET+yzIz5vACoIZzLlaQpg8w+whiVgbW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/2Gtge/9vwf5t/Hv/9U55/zlN/rVTCsDVYEJh7tdIiIiIiIi/2WZKUizn/N8B4QxbcTDwANmtghvTGFvf3lvoJi//AHgEX9bZgP9gDnAT0AH51xiCNslIiIiIiJyzDvomEMzuybZzTigLrAniODOuVHAKP/vxaRRbdQ5twdvrsW0nv8s8GwQ2yIiIiIiIvJflplqpVck+zsBWIo3jYSIiIiIiIgcIzJTrfS2KDZEREREREREsk66yaGZPZnB85xzrnsI2yMiIiIiIiJZIKOWw51pLMsHtMErGKPkUERERERE5BiRbnLonOsR+9vMCgAdgdvw5ibskd7zRERERERE5OiT4ZhDMyuKN33EzUAf4DTn3OYoNkxERERERESik9GYw5eBa4D3gVOcczsi2yoRERERERGJVEYthw8C8UAX4HEziy03vII0BUPeNpH/rAEfNw1lvdfe9lMo6xURERGRo19GYw7jotwQERERERERyTpKAEVERERERETJoYiIiIiIiCg5FBEREREREZQcioiIiIiICEoORUREREREBCWHIiIiIiIigpJDERERERERQcmhiIiIiIiIoORQREREREREUHIoIiIiIiIiKDkUERERERERlByKiIiIiIgISg5FREREREQEJYciIiIiIiKCkkMRERERERFByaGIiIiIiIig5FBERERERERQcigiIiIiIiIoORQRERERERGUHIqIiIiIiAhKDkVERERERAQlhyIiIiIiIoKSQxEREREREUHJoYiIiIiIiKDkUERERERERFByKCIiIiIiIig5FBEREREREZQcioiIiIiICEoORUREREREBCWHIiIiIiIigpJDERERERERQcmhiIiIiIiIoORQREREREREUHIoIiIiIiIiKDkUERERERERlByKiIiIiIgISg5FRERERESELEgOzayCmY00szlmNtvMOvrLi5rZMDNb6P8u4i83M+tpZovMbIaZnZZsXa39xy80s9ZR74uIiIiIiMixInsWxEwAHnTOTTGzAsBkMxsG3AqMcM69YGaPAI8ADwOXAFX9n/rAu0B9MysKdAXqAs5fzyDn3ObI90hEDknPL5qEst77bv45lPWKiIiI/BdE3nLonFvtnJvi/70dmAuUA64C+vgP6wM08/++CvjUecYBhc2sDNAEGOac2+QnhMOAptHtiYiIiIiIyLEjS8cc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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - } - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 9, - "source": [ - "def label_to_num(label):\n", - " num_label = []\n", - " with open('dict_label_to_num.pkl', 'rb') as f:\n", - " dict_label_to_num = pickle.load(f)\n", - " for v in label:\n", - " num_label.append(dict_label_to_num[v])\n", - " \n", - " return num_label\n", - "\n", - "def tokenized_non_paddig(dataset, tokenizer):\n", - " \"\"\" tokenizer에 따라 sentence를 tokenizing 합니다.\"\"\"\n", - " concat_entity = []\n", - " for e01, e02 in zip(dataset['subject_entity'], dataset['object_entity']):\n", - " temp = ''\n", - " temp = e01 + '[SEP]' + e02\n", - " concat_entity.append(temp)\n", - " tokenized_sentences = tokenizer(\n", - " concat_entity,\n", - " list(dataset['sentence']),\n", - " return_tensors=\"pt\",\n", - " padding=True,\n", - " truncation=True,\n", - " max_length=256,\n", - " add_special_tokens=True,\n", - " )\n", - " return tokenized_sentences" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 10, - "source": [ - "MODEL_NAME = \"xlm-roberta-large\"\n", - "tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)\n", - "\n", - "tokenized_train = tokenized_non_paddig(train_dataset, tokenizer)\n", - "train_label = label_to_num(train_dataset['label'].values)\n", - "RE_train_dataset = RE_Dataset(tokenized_train, train_label)" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/opt/conda/envs/basic/lib/python3.8/site-packages/transformers/tokenization_utils_base.py:2227: UserWarning: `max_length` is ignored when `padding`=`True`.\n", - " warnings.warn(\"`max_length` is ignored when `padding`=`True`.\")\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 11, - "source": [ - "data_length = [len([tok for tok in sent if tok != tokenizer.pad_token_id]) for sent in tokenized_train['input_ids']]" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 12, - "source": [ - "plt.figure(figsize=(15, 5)) \n", - "ax = sns.histplot(data = data_length)\n", - "\n", - "plt.title('Input token Length',fontsize= 14)\n", - "plt.xlabel('Length')\n", - "plt.ylabel('Count')\n", - "\n", - "plt.show()" - ], - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": { - "needs_background": "light" - } - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 138, - "source": [ - "def special_lang_idx(dataset):\n", - " df = dataset[['subject_entity', 'object_entity']]\n", - " df = df.applymap(lambda x : re.sub('[a-zA-Zㄱ-ㅎ가-힣0-9 ]', '', x))\n", - " # com = re.compile('\\w+')\n", - " # df = df.applymap(lambda x : \"\".join(com.findall(x)))\n", - " df = df.applymap(lambda x : \"\".join(re.findall('\\w', x)))\n", - " df = df.applymap(lambda x : re.sub('\\s', '', x))\n", - " df.replace('', np.nan, inplace=True)\n", - " \n", - " special_lang_idx = []\n", - "\n", - " special_lang_idx.extend(list(df[df.notnull()['subject_entity']==True].index))\n", - " special_lang_idx.extend(list(df[df.notnull()['object_entity']==True].index))\n", - "\n", - " special_lang_idx = list(set(special_lang_idx))\n", - "\n", - " return special_lang_idx\n", - "\n" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 139, - "source": [ - "trn_special_lang_idx = special_lang_idx(train_dataset)\n", - "tst_special_lang_idx = special_lang_idx(test_dataset)\n", - "print(\"num of special lang in the obj&sub of Train set :\", len(trn_special_lang_idx))\n", - "print(\"num of special lang in the obj&sub of Test set :\", len(tst_special_lang_idx))" - ], - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "num of special lang in the obj&sub of Train set : 215\n", - "num of special lang in the obj&sub of Test set : 56\n" - ] - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 143, - "source": [ - "trn_spc_lang = train_dataset.iloc[trn_special_lang_idx].head()" - ], - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
idsentencesubject_entityobject_entitylabel
2201622016능은 경기도 화성시에 위치한 융릉(隆陵)으로 남편인 장조와 함께 묻혀 있으며 인근에...'효의왕후''건릉(健陵)'no_relation
56345634토레 안드레 플로(Tore André Flo, 1973년 6월 15일, 송노피오라네...'토레 안드레 플로''Tore André Flo'per:alternate_names
1945819458윤종신(尹鍾信, 1969년 10월 15일 ~)은 대한민국의 작곡가, 가수 겸 방송인이다.'윤종신''尹鍾信'per:alternate_names
66676667최창권(崔彰權, 천주교 세례명 바오로, 1934년 10월 26일 ~ 2008년 1월...'최창권''崔彰權'per:alternate_names
2202822028한편 복녕군은 고종 즉위 후인 1864년(고종 원년) 음력 7월 9일 효헌(孝獻)의...'복녕군''효헌(孝獻)'per:alternate_names
\n", - "
" - ], - "text/plain": [ - " id sentence \\\n", - "22016 22016 능은 경기도 화성시에 위치한 융릉(隆陵)으로 남편인 장조와 함께 묻혀 있으며 인근에... \n", - "5634 5634 토레 안드레 플로(Tore André Flo, 1973년 6월 15일, 송노피오라네... \n", - "19458 19458 윤종신(尹鍾信, 1969년 10월 15일 ~)은 대한민국의 작곡가, 가수 겸 방송인이다. \n", - "6667 6667 최창권(崔彰權, 천주교 세례명 바오로, 1934년 10월 26일 ~ 2008년 1월... \n", - "22028 22028 한편 복녕군은 고종 즉위 후인 1864년(고종 원년) 음력 7월 9일 효헌(孝獻)의... \n", - "\n", - " subject_entity object_entity label \n", - "22016 '효의왕후' '건릉(健陵)' no_relation \n", - "5634 '토레 안드레 플로' 'Tore André Flo' per:alternate_names \n", - "19458 '윤종신' '尹鍾信' per:alternate_names \n", - "6667 '최창권' '崔彰權' per:alternate_names \n", - "22028 '복녕군' '효헌(孝獻)' per:alternate_names " - ] - }, - "metadata": {}, - "execution_count": 143 - } - ], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": 144, - "source": [ - "t_spc_lang = test_dataset.iloc[tst_special_lang_idx].head()" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [ - "plt.figure(figsize=(15, 5)) \n", - "ax = sns.countplot(x = 'label', data = train_dataset)\n", - "\n", - "plt.xticks(np.arange(30), list(train_dataset.label.unique()), rotation = 90)\n", - "plt.title('Labels Ratio',fontsize= 14)\n", - "plt.xlabel('Label')\n", - "plt.ylabel('Number of label')\n", - "\n", - "counts = train_dataset['label'].value_counts()\n", - "counts_pct = [f'{elem * 100:.2f}%' for elem in counts / counts.sum()]\n", - "for i, v in enumerate(counts_pct):\n", - " ax.text(i, 0, v, horizontalalignment = 'center', rotation = 90, size = 10, color = 'black', fontweight = 'bold')\n", - " \n", - "plt.show()" - ], - "outputs": [], - "metadata": {} - }, - { - "cell_type": "code", - "execution_count": null, - "source": [], - "outputs": [], - "metadata": {} - } - ], - "metadata": { - "interpreter": { - "hash": "883f4b2fb0a3279582c48a1b3ea671410eb924431136537ea6c03e47c9180cb0" - }, - "kernelspec": { - "display_name": "Basic", - "language": "python", - "name": "basic" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.8.11" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} \ No newline at end of file From 56bc15251eea01850884f13622628e17de223ca3 Mon Sep 17 00:00:00 2001 From: MyungHoon Jin Date: Sat, 9 Oct 2021 14:12:38 +0900 Subject: [PATCH 5/7] Delete inference.py prevent conflict --- inference.py | 102 --------------------------------------------------- 1 file changed, 102 deletions(-) delete mode 100644 inference.py diff --git a/inference.py b/inference.py deleted file mode 100644 index 1843549..0000000 --- a/inference.py +++ /dev/null @@ -1,102 +0,0 @@ -from transformers import AutoTokenizer, AutoConfig, AutoModelForSequenceClassification, Trainer, TrainingArguments -from torch.utils.data import DataLoader -from load_data import * -import pandas as pd -import torch -import torch.nn.functional as F - -import pickle as pickle -import numpy as np -import argparse -from tqdm import tqdm - -def inference(model, tokenized_sent, device): - """ - test dataset을 DataLoader로 만들어 준 후, - batch_size로 나눠 model이 예측 합니다. - """ - dataloader = DataLoader(tokenized_sent, batch_size=16, shuffle=False) - model.eval() - output_pred = [] - output_prob = [] - for i, data in enumerate(tqdm(dataloader)): - with torch.no_grad(): - outputs = model( - input_ids=data['input_ids'].to(device), - attention_mask=data['attention_mask'].to(device), - # token_type_ids=data['token_type_ids'].to(device) - ) - logits = outputs[0] - prob = F.softmax(logits, dim=-1).detach().cpu().numpy() - logits = logits.detach().cpu().numpy() - result = np.argmax(logits, axis=-1) - - output_pred.append(result) - output_prob.append(prob) - - return np.concatenate(output_pred).tolist(), np.concatenate(output_prob, axis=0).tolist() - -def num_to_label(label): - """ - 숫자로 되어 있던 class를 원본 문자열 라벨로 변환 합니다. - """ - origin_label = [] - with open('dict_num_to_label.pkl', 'rb') as f: - dict_num_to_label = pickle.load(f) - for v in label: - origin_label.append(dict_num_to_label[v]) - - return origin_label - -def load_test_dataset(dataset_dir, tokenizer): - """ - test dataset을 불러온 후, - tokenizing 합니다. - """ - test_dataset = load_data(dataset_dir) - test_label = list(map(int,test_dataset['label'].values)) - # tokenizing dataset - tokenized_test = tokenized_dataset(test_dataset, tokenizer) - return test_dataset['id'], tokenized_test, test_label - -def main(args): - """ - 주어진 dataset csv 파일과 같은 형태일 경우 inference 가능한 코드입니다. - """ - device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') - # load tokenizer - Tokenizer_NAME = "roberta-base" - tokenizer = AutoTokenizer.from_pretrained(Tokenizer_NAME) - - ## load my model - MODEL_NAME = args.model_dir # model dir. - model = AutoModelForSequenceClassification.from_pretrained(args.model_dir) - model.parameters - model.to(device) - - ## load test datset - test_dataset_dir = "../dataset/test/test_data.csv" - test_id, test_dataset, test_label = load_test_dataset(test_dataset_dir, tokenizer) - Re_test_dataset = RE_Dataset(test_dataset ,test_label) - - ## predict answer - pred_answer, output_prob = inference(model, Re_test_dataset, device) # model에서 class 추론 - pred_answer = num_to_label(pred_answer) # 숫자로 된 class를 원래 문자열 라벨로 변환. - - ## make csv file with predicted answer - ######################################################### - # 아래 directory와 columns의 형태는 지켜주시기 바랍니다. - output = pd.DataFrame({'id':test_id,'pred_label':pred_answer,'probs':output_prob,}) - - output.to_csv('./prediction/submission.csv', index=False) # 최종적으로 완성된 예측한 라벨 csv 파일 형태로 저장. - #### 필수!! ############################################## - print('---- Finish! ----') -if __name__ == '__main__': - parser = argparse.ArgumentParser() - - # model dir - parser.add_argument('--model_dir', type=str, default="./best_model/roberta-base") - args = parser.parse_args() - print(args) - main(args) - From 359166785e238b011691f9ef9686ab7f2c328932 Mon Sep 17 00:00:00 2001 From: MyungHoon Jin Date: Sat, 9 Oct 2021 14:12:46 +0900 Subject: [PATCH 6/7] Delete load_data.py prevent conflict --- load_data.py | 57 ---------------------------------------------------- 1 file changed, 57 deletions(-) delete mode 100644 load_data.py diff --git a/load_data.py b/load_data.py deleted file mode 100644 index 73b13cb..0000000 --- a/load_data.py +++ /dev/null @@ -1,57 +0,0 @@ -import pickle as pickle -import os -import pandas as pd -import torch - - -class RE_Dataset(torch.utils.data.Dataset): - """ Dataset 구성을 위한 class.""" - def __init__(self, pair_dataset, labels): - self.pair_dataset = pair_dataset - self.labels = labels - - def __getitem__(self, idx): - item = {key: val[idx].clone().detach() for key, val in self.pair_dataset.items()} - item['labels'] = torch.tensor(self.labels[idx]) - return item - - def __len__(self): - return len(self.labels) - -def preprocessing_dataset(dataset): - """ 처음 불러온 csv 파일을 원하는 형태의 DataFrame으로 변경 시켜줍니다.""" - subject_entity = [] - object_entity = [] - for i,j in zip(dataset['subject_entity'], dataset['object_entity']): - i = i[1:-1].split(',')[0].split(':')[1] - j = j[1:-1].split(',')[0].split(':')[1] - - subject_entity.append(i) - object_entity.append(j) - out_dataset = pd.DataFrame({'id':dataset['id'], 'sentence':dataset['sentence'],'subject_entity':subject_entity,'object_entity':object_entity,'label':dataset['label'],}) - return out_dataset - -def load_data(dataset_dir): - """ csv 파일을 경로에 맡게 불러 옵니다. """ - pd_dataset = pd.read_csv(dataset_dir) - dataset = preprocessing_dataset(pd_dataset) - - return dataset - -def tokenized_dataset(dataset, tokenizer): - """ tokenizer에 따라 sentence를 tokenizing 합니다.""" - concat_entity = [] - for e01, e02 in zip(dataset['subject_entity'], dataset['object_entity']): - temp = '' - temp = e01 + ' [SEP]' + e02 - concat_entity.append(temp) - tokenized_sentences = tokenizer( - concat_entity, - list(dataset['sentence']), - return_tensors="pt", - padding=True, - truncation=True, - max_length=128, - add_special_tokens=True, - ) - return tokenized_sentences From 4fb10a925624edcefffb9593704d189fbb9793c9 Mon Sep 17 00:00:00 2001 From: MyungHoon Jin Date: Sat, 9 Oct 2021 14:13:13 +0900 Subject: [PATCH 7/7] Delete train.py prevent conflict --- train.py | 249 ------------------------------------------------------- 1 file changed, 249 deletions(-) delete mode 100644 train.py diff --git a/train.py b/train.py deleted file mode 100644 index 69e16ac..0000000 --- a/train.py +++ /dev/null @@ -1,249 +0,0 @@ -import pickle as pickle -import os -import pandas as pd -import torch -import sklearn -import numpy as np -from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score -from transformers import AutoTokenizer, AutoConfig, AutoModelForSequenceClassification, Trainer, TrainingArguments, RobertaConfig, RobertaTokenizer, RobertaForSequenceClassification, BertTokenizer -from load_data import * -import random -import wandb -from sklearn.model_selection import StratifiedKFold - -def seed_everything(seed): - torch.manual_seed(seed) - torch.cuda.manual_seed(seed) - torch.cuda.manual_seed_all(seed) # if use multi-GPU - torch.backends.cudnn.deterministic = True - torch.backends.cudnn.benchmark = False - np.random.seed(seed) - random.seed(seed) - -def klue_re_micro_f1(preds, labels): - """KLUE-RE micro f1 (except no_relation)""" - label_list = ['no_relation', 'org:top_members/employees', 'org:members', - 'org:product', 'per:title', 'org:alternate_names', - 'per:employee_of', 'org:place_of_headquarters', 'per:product', - 'org:number_of_employees/members', 'per:children', - 'per:place_of_residence', 'per:alternate_names', - 'per:other_family', 'per:colleagues', 'per:origin', 'per:siblings', - 'per:spouse', 'org:founded', 'org:political/religious_affiliation', - 'org:member_of', 'per:parents', 'org:dissolved', - 'per:schools_attended', 'per:date_of_death', 'per:date_of_birth', - 'per:place_of_birth', 'per:place_of_death', 'org:founded_by', - 'per:religion'] - no_relation_label_idx = label_list.index("no_relation") - label_indices = list(range(len(label_list))) - label_indices.remove(no_relation_label_idx) - return sklearn.metrics.f1_score(labels, preds, average="micro", labels=label_indices) * 100.0 - -def klue_re_auprc(probs, labels): - """KLUE-RE AUPRC (with no_relation)""" - labels = np.eye(30)[labels] - - score = np.zeros((30,)) - for c in range(30): - targets_c = labels.take([c], axis=1).ravel() - preds_c = probs.take([c], axis=1).ravel() - precision, recall, _ = sklearn.metrics.precision_recall_curve(targets_c, preds_c) - score[c] = sklearn.metrics.auc(recall, precision) - return np.average(score) * 100.0 - -def compute_metrics(pred): - """ validation을 위한 metrics function """ - labels = pred.label_ids - preds = pred.predictions.argmax(-1) - probs = pred.predictions - - # calculate accuracy using sklearn's function - f1 = klue_re_micro_f1(preds, labels) - auprc = klue_re_auprc(probs, labels) - acc = accuracy_score(labels, preds) # 리더보드 평가에는 포함되지 않습니다. - - return { - 'micro f1 score': f1, - 'auprc' : auprc, - 'accuracy': acc, - } - -def label_to_num(label): - num_label = [] - with open('dict_label_to_num.pkl', 'rb') as f: - dict_label_to_num = pickle.load(f) - for v in label: - num_label.append(dict_label_to_num[v]) - - return num_label - -def train(): - # load model and tokenizer - # MODEL_NAME = "bert-base-uncased" - MODEL_NAME = "xlm-roberta-large" - tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) - - # load dataset - with open('./train_eval_idx.pkl', 'rb') as f: - data_idx = pickle.load(f) - - dataset = load_data("../dataset/train/train.csv") - train_dataset = dataset.iloc[data_idx['train']] - dev_dataset = dataset.iloc[data_idx['eval']] - - train_label = label_to_num(train_dataset['label'].values) - dev_label = label_to_num(dev_dataset['label'].values) - - # tokenizing dataset - tokenized_train = tokenized_dataset(train_dataset, tokenizer) - tokenized_dev = tokenized_dataset(dev_dataset, tokenizer) - - # make dataset for pytorch. - RE_train_dataset = RE_Dataset(tokenized_train, train_label) - RE_dev_dataset = RE_Dataset(tokenized_dev, dev_label) - - device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') - - print(device) - # setting model hyperparameter - model_config = AutoConfig.from_pretrained(MODEL_NAME) - model_config.num_labels = 30 - - model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, config=model_config) - print(model.config) - model.parameters - model.to(device) - - # 사용한 option 외에도 다양한 option들이 있습니다. - # https://huggingface.co/transformers/main_classes/trainer.html#trainingarguments 참고해주세요. - training_args = TrainingArguments( - output_dir='./results', # output directory - save_total_limit=5, # number of total save model. - save_steps=500, # model saving step. - num_train_epochs=5, # total number of training epochs - learning_rate=3e-5, # learning_rate - per_device_train_batch_size=64, # batch size per device during training - per_device_eval_batch_size=64, # batch size for evaluation - warmup_ratio=0.1, - warmup_steps=500, # number of warmup steps for learning rate scheduler - weight_decay=0.01, # strength of weight decay - logging_dir='./logs', # directory for storing logs - logging_steps=100, # log saving step. - evaluation_strategy='steps', # evaluation strategy to adopt during training - # `no`: No evaluation during training. - # `steps`: Evaluate every `eval_steps`. - # `epoch`: Evaluate every end of epoch. - eval_steps = 500, # evaluation step. - load_best_model_at_end = True, - seed = 42, - - report_to = "wandb", - run_name = f"0927-{MODEL_NAME}" - ) - trainer = Trainer( - model=model, # the instantiated 🤗 Transformers model to be trained - args=training_args, # training arguments, defined above - train_dataset=RE_train_dataset, # training dataset - eval_dataset=RE_dev_dataset, # evaluation dataset - compute_metrics=compute_metrics # define metrics function - ) - - # train model - trainer.train() - model.save_pretrained(f'./best_model/{MODEL_NAME}') - -def train_kfold(): - # load model and tokenizer - # MODEL_NAME = "bert-base-uncased" - MODEL_NAME = "xlm-roberta-large" - tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) - - # load dataset - dataset = load_data("../dataset/train/train.csv") - dataset_label = label_to_num(dataset['label'].values) - skf = StratifiedKFold(n_splits=5) - fold_data = skf.split(dataset, dataset_label) - - for fold_i, (trn_idx, dev_idx) in enumerate(fold_data): - - train_dataset = dataset.iloc[trn_idx] - dev_dataset = dataset.iloc[dev_idx] - - train_label = label_to_num(train_dataset['label'].values) - dev_label = label_to_num(dev_dataset['label'].values) - - # tokenizing dataset - tokenized_train = tokenized_dataset(train_dataset, tokenizer) - tokenized_dev = tokenized_dataset(dev_dataset, tokenizer) - - # make dataset for pytorch. - RE_train_dataset = RE_Dataset(tokenized_train, train_label) - RE_dev_dataset = RE_Dataset(tokenized_dev, dev_label) - - device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') - - print(device) - # setting model hyperparameter - model_config = AutoConfig.from_pretrained(MODEL_NAME) - model_config.num_labels = 30 - - model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, config=model_config) - print(model.config) - model.parameters - model.to(device) - - # 사용한 option 외에도 다양한 option들이 있습니다. - # https://huggingface.co/transformers/main_classes/trainer.html#trainingarguments 참고해주세요. - training_args = TrainingArguments( - output_dir='./results', # output directory - save_total_limit=5, # number of total save model. - save_steps=500, # model saving step. - num_train_epochs=5, # total number of training epochs - learning_rate=3e-5, # learning_rate - per_device_train_batch_size=50, # batch size per device during training - per_device_eval_batch_size=50, # batch size for evaluation - warmup_ratio=0.1, - warmup_steps=500, # number of warmup steps for learning rate scheduler - weight_decay=0.01, # strength of weight decay - logging_dir='./logs', # directory for storing logs - logging_steps=100, # log saving step. - evaluation_strategy='steps', # evaluation strategy to adopt during training - # `no`: No evaluation during training. - # `steps`: Evaluate every `eval_steps`. - # `epoch`: Evaluate every end of epoch. - eval_steps = 500, # evaluation step. - load_best_model_at_end = True, - seed = 42, - - report_to = "wandb", - run_name = f"0928-{MODEL_NAME}-{fold_i+1}/5_fold" - ) - trainer = Trainer( - model=model, # the instantiated 🤗 Transformers model to be trained - args=training_args, # training arguments, defined above - train_dataset=RE_train_dataset, # training dataset - eval_dataset=RE_dev_dataset, # evaluation dataset - compute_metrics=compute_metrics # define metrics function - ) - - # train model - trainer.train() - model.save_pretrained(f'./best_model/{MODEL_NAME}_fold_{fold_i+1}/5') - -def main(): - # train() - train_kfold() - -if __name__ == '__main__': - seed_everything(42) - - os.environ["WANDB_PROJECT"] = "klue_re_xlm-roberta-large-5_fold" - call_wandb = True - try: - os.environ["WANDB_PROJECT"] - except KeyError: - call_wandb = False - if call_wandb: - import wandb - wandb.login() - - main()