From 5e05f50c13d9c33b0da985069b6a05e4d2d12d2d Mon Sep 17 00:00:00 2001 From: lig96 Date: Thu, 6 Jul 2023 01:12:57 +0000 Subject: [PATCH 01/63] [Feature] Create sentence-sentimental model --- sentence-sentimental/train.py | 104 ++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 sentence-sentimental/train.py diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py new file mode 100644 index 0000000..3816bbb --- /dev/null +++ b/sentence-sentimental/train.py @@ -0,0 +1,104 @@ +from transformers import AutoModelForSequenceClassification, AutoTokenizer +from transformers import TrainingArguments, Trainer +from transformers import pipeline +import torch +from torch.utils.data import Dataset +import pandas as pd +import sklearn +from datasets import load_metric + +def compute_metrics(pred): + labels = pred.label_ids + preds = pred.predictions.argmax(-1) + + acc = load_metric('accuracy').compute(predictions=preds, references=labels)['accuracy'] + f1 = load_metric('f1').compute(predictions=preds, references=labels, average='micro')['f1'] + + return {'accuracy':acc, 'f1':f1} + +class SentimentalDataset(Dataset): + def __init__(self, encodings, labels): + self.encoding = encodings + self.labels = labels + + def __getitem__(self, idx): + data = {key: val[idx] for key, val in self.encoding.items()} + data['labels'] = torch.tensor(self.labels[idx]).long() + return data + + def __len__(self): + return len(self.labels) + + + +## git clone https://github.com/ukairia777/finance_sentiment_corpus.git +## 먼저 해야 함 +## 나중에 readme.md 작성할 예정 + +device = torch.device("cuda" if torch.cuda.is_available() else 'cpu') +MODEL_NAME = 'klue/roberta-base' +model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=3).to(device) +tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) + +data = pd.read_csv( + '/opt/ml/finance_sentiment_corpus/finance_data.csv' + ) +data['labels'] = data['labels'].map({'negative':0, 'neutral':1, 'positive':2}) +train_encoding = tokenizer( + data['kor_sentence'].tolist(), + return_tensors='pt', + padding=True, + truncation=True + ) +train_set = SentimentalDataset(train_encoding, data['labels']) + + + +training_args = TrainingArguments( + output_dir = './outputs', + logging_steps = 50, + num_train_epochs = 1, + per_device_train_batch_size=32, + per_device_eval_batch_size=32, + fp16=True +) + +trainer = Trainer( + model=model, + args=training_args, + train_dataset=train_set, + eval_dataset=train_set, + compute_metrics=compute_metrics +) + +## + +print('train start') +trainer.train() + +print('evaulate start') +trainer.evaluate() + +print('inference start') +## 방법 1 +model = model.to('cpu') ## 주의 +my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' +classifier = pipeline("sentiment-analysis", model=model, + tokenizer=tokenizer) +inference_output = classifier(my_text) +print(inference_output) +# [{'label': 'LABEL_2', 'score': 0.8627877831459045}] + +## 방법 2 +my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' +model.eval() +with torch.no_grad(): + temp = tokenizer( + my_text, + return_tensors='pt', + padding=True, + truncation=True + ) + predicted_label = model(**temp) + print(torch.nn.Softmax(dim=-1)(predicted_label.logits)) + # tensor([[0.0108, 0.1264, 0.8628]]) From 31df2893f1c599151df54325be5f1862d9df2985 Mon Sep 17 00:00:00 2001 From: lig96 Date: Thu, 6 Jul 2023 04:50:15 +0000 Subject: [PATCH 02/63] [Feature] Add wandb --- sentence-sentimental/train.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py index 3816bbb..04c0675 100644 --- a/sentence-sentimental/train.py +++ b/sentence-sentimental/train.py @@ -6,6 +6,7 @@ import pandas as pd import sklearn from datasets import load_metric +import wandb def compute_metrics(pred): labels = pred.label_ids @@ -53,13 +54,14 @@ def __len__(self): train_set = SentimentalDataset(train_encoding, data['labels']) - +run = wandb.init(project="final_sentimental", entity="nlp-10") training_args = TrainingArguments( output_dir = './outputs', logging_steps = 50, num_train_epochs = 1, per_device_train_batch_size=32, per_device_eval_batch_size=32, + report_to="wandb", fp16=True ) @@ -78,6 +80,7 @@ def __len__(self): print('evaulate start') trainer.evaluate() +run.finish() print('inference start') ## 방법 1 From 9f1bf4e9ad6a2b1ff6c4cb5c6201c95927a441ac Mon Sep 17 00:00:00 2001 From: limha Date: Thu, 6 Jul 2023 05:36:50 +0000 Subject: [PATCH 03/63] =?UTF-8?q?[Feature]=20modulize=20and=20add=20cross?= =?UTF-8?q?=20validation=20=09-=20new=20file:=20=20=20experiment/datasets.?= =?UTF-8?q?ipynb=20=20=20=20=20=20=20=20=20:=20experiment=20=ED=8F=B4?= =?UTF-8?q?=EB=8D=94=20=EC=83=9D=EC=84=B1=20=09-=20new=20file:=20=20=20sen?= =?UTF-8?q?tence-sentimental/dataset/datasets.py=20=09-=20new=20file:=20?= =?UTF-8?q?=20=20sentence-sentimental/main.py=20=09-=20new=20file:=20=20?= =?UTF-8?q?=20sentence-sentimental/metrics/metrics.py=20=09-=20new=20file:?= =?UTF-8?q?=20=20=20sentence-sentimental/utils/utils.py=20=20=20=20=20-=20?= =?UTF-8?q?modified:=20=20=20sentence-sentimental/train.py=20=20=20=20=20-?= =?UTF-8?q?=20modified:=20=20=20sentence-sentimental/train.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- experiment/datasets.ipynb | 249 +++++++++++++++++++++++ sentence-sentimental/dataset/datasets.py | 15 ++ sentence-sentimental/main.py | 4 + sentence-sentimental/metrics/metrics.py | 10 + sentence-sentimental/train.py | 220 +++++++++++--------- sentence-sentimental/utils/utils.py | 9 + 6 files changed, 410 insertions(+), 97 deletions(-) create mode 100644 experiment/datasets.ipynb create mode 100644 sentence-sentimental/dataset/datasets.py create mode 100644 sentence-sentimental/main.py create mode 100644 sentence-sentimental/metrics/metrics.py create mode 100644 sentence-sentimental/utils/utils.py diff --git a/experiment/datasets.ipynb b/experiment/datasets.ipynb new file mode 100644 index 0000000..2ff9e40 --- /dev/null +++ b/experiment/datasets.ipynb @@ -0,0 +1,249 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import torch\n", + "import pandas as pd\n", + "import sklearn\n", + "\n", + "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", + "from transformers import TrainingArguments, Trainer\n", + "from transformers import pipeline\n", + "\n", + "import sys\n", + "sys.path.append('../sentence-sentimental')\n", + "\n", + "from dataset.datasets import SentimentalDataset\n", + "from metrics.metrics import compute_metrics\n", + "\n", + "from sklearn.datasets import load_iris # 샘플 데이터 로딩\n", + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Downloading pytorch_model.bin: 100%|██████████| 443M/443M [00:04<00:00, 100MB/s] \n", + "Some weights of the model checkpoint at klue/roberta-base were not used when initializing RobertaForSequenceClassification: ['lm_head.layer_norm.bias', 'lm_head.layer_norm.weight', 'lm_head.decoder.bias', 'lm_head.bias', 'lm_head.decoder.weight', 'lm_head.dense.weight', 'lm_head.dense.bias']\n", + "- This IS expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n", + "- This IS NOT expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n", + "Some weights of RobertaForSequenceClassification were not initialized from the model checkpoint at klue/roberta-base and are newly initialized: ['classifier.out_proj.weight', 'classifier.out_proj.bias', 'classifier.dense.bias', 'classifier.dense.weight']\n", + "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n" + ] + } + ], + "source": [ + "device = torch.device(\"cuda\" if torch.cuda.is_available() else 'cpu')\n", + "MODEL_NAME = 'klue/roberta-base'\n", + "model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=3).to(device)\n", + "tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv('/opt/ml/finance_sentiment_corpus/finance_data.csv')\n", + "data['labels'] = data['labels'].map({'negative':0, 'neutral':1, 'positive':2})\n", + "\n", + "train_encoding = tokenizer(\n", + " data['kor_sentence'].tolist(),\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True\n", + " )\n", + "\n", + "train_set = SentimentalDataset(train_encoding, data['labels'])" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "4846 4846\n" + ] + } + ], + "source": [ + "print(len(data['kor_sentence']), len(data['labels']))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "sentence_train, sentence_test, label_train, label_test = train_test_split(data['kor_sentence'], data['labels'],\n", + " test_size=0.2, \n", + " shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리\n", + " random_state=34)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "train_encoding = tokenizer(\n", + " sentence_train.tolist(),\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True\n", + " )\n", + "\n", + "test_encoding = tokenizer(\n", + " sentence_test.tolist(),\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "train_set = SentimentalDataset(train_encoding, label_train)\n", + "test_set = SentimentalDataset(test_encoding, label_test)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [ + { + "ename": "AttributeError", + "evalue": "'SentimentalDataset' object has no attribute 'len'", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/opt/ml/level3_nlp_finalproject-nlp-04/sentence-sentimental/datasets.ipynb Cell 8\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m train_set\u001b[39m.\u001b[39;49mlen()\n", + "\u001b[0;31mAttributeError\u001b[0m: 'SentimentalDataset' object has no attribute 'len'" + ] + } + ], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1828 핀란드 식품업계 기업들은 우크라이나가 제공하는 기회에 관심이 많다.\n", + "4809 펜틱+아이넨은 미디어하우스가 제공하는 인터넷 콘텐츠 대부분이 영원히 무료일 수는 없...\n", + "1166 또한 이러한 시장에 대한 6년간의 역사적 분석이 제공됩니다.\n", + "277 루키 총리는 핀란드 사본리나에 위치한 키론살미 해협을 가로지르는 철제 구조물의 인도...\n", + "4670 2009년 8월 3일 핀란드 미디어 그룹 Ilkka-Yhtyma Oyj(헬: ILK...\n", + " ... \n", + "3515 알스트롬 주식거래소 7.2.2.27 10시 30분에 발표 알스트롬 주식회사의 총 5...\n", + "4503 라우트 대변인은 \"다른 인력에 대한 적응 조치는 당분간 적절하다\"고 말했다.\n", + "434 주식수 증가는 2006년 스톡옵션제도에 따라 회사 경영에 부여된 주식선택권에 따른 ...\n", + "3212 개발사업단도 지난해 11월 대비 개발사업단가를 3분의 1가량 낮추겠다고 밝혔다.\n", + "3773 이 건물에는 제품 개발 및 테스트 실험실이 들어설 예정이다.\n", + "Name: kor_sentence, Length: 3876, dtype: object" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sentence_train" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(data)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "dataset.datasets.SentimentalDataset" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(train_set)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "mrc", + "language": "python", + "name": "python3" + }, + "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.10.11" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "6433bde22504cbf34326cab27df20b94e196fcf98213f776ce9807cc95ec7583" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/sentence-sentimental/dataset/datasets.py b/sentence-sentimental/dataset/datasets.py new file mode 100644 index 0000000..8cf0252 --- /dev/null +++ b/sentence-sentimental/dataset/datasets.py @@ -0,0 +1,15 @@ +import torch +from torch.utils.data import Dataset + +class SentimentalDataset(Dataset): + def __init__(self, encodings, labels): + self.encoding = encodings + self.labels = labels + + def __getitem__(self, idx): + data = {key: val[idx] for key, val in self.encoding.items()} + data['labels'] = torch.tensor(self.labels[idx]).long() + return data + + def __len__(self): + return len(self.labels) \ No newline at end of file diff --git a/sentence-sentimental/main.py b/sentence-sentimental/main.py new file mode 100644 index 0000000..41c7d80 --- /dev/null +++ b/sentence-sentimental/main.py @@ -0,0 +1,4 @@ +from train import train + +if __name__== "__main__" : + train() \ No newline at end of file diff --git a/sentence-sentimental/metrics/metrics.py b/sentence-sentimental/metrics/metrics.py new file mode 100644 index 0000000..a58d37b --- /dev/null +++ b/sentence-sentimental/metrics/metrics.py @@ -0,0 +1,10 @@ +from datasets import load_metric + +def compute_metrics(pred): + labels = pred.label_ids + preds = pred.predictions.argmax(-1) + + acc = load_metric('accuracy').compute(predictions=preds, references=labels)['accuracy'] + f1 = load_metric('f1').compute(predictions=preds, references=labels, average='micro')['f1'] + + return {'accuracy':acc, 'f1':f1} \ No newline at end of file diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py index 3816bbb..a3857b3 100644 --- a/sentence-sentimental/train.py +++ b/sentence-sentimental/train.py @@ -1,104 +1,130 @@ -from transformers import AutoModelForSequenceClassification, AutoTokenizer -from transformers import TrainingArguments, Trainer -from transformers import pipeline import torch -from torch.utils.data import Dataset import pandas as pd import sklearn -from datasets import load_metric - -def compute_metrics(pred): - labels = pred.label_ids - preds = pred.predictions.argmax(-1) - - acc = load_metric('accuracy').compute(predictions=preds, references=labels)['accuracy'] - f1 = load_metric('f1').compute(predictions=preds, references=labels, average='micro')['f1'] - - return {'accuracy':acc, 'f1':f1} - -class SentimentalDataset(Dataset): - def __init__(self, encodings, labels): - self.encoding = encodings - self.labels = labels - - def __getitem__(self, idx): - data = {key: val[idx] for key, val in self.encoding.items()} - data['labels'] = torch.tensor(self.labels[idx]).long() - return data - - def __len__(self): - return len(self.labels) +import random +import numpy as np +from transformers import AutoModelForSequenceClassification, AutoTokenizer +from transformers import TrainingArguments, Trainer +from transformers import pipeline - -## git clone https://github.com/ukairia777/finance_sentiment_corpus.git -## 먼저 해야 함 -## 나중에 readme.md 작성할 예정 - -device = torch.device("cuda" if torch.cuda.is_available() else 'cpu') -MODEL_NAME = 'klue/roberta-base' -model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=3).to(device) -tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) - -data = pd.read_csv( - '/opt/ml/finance_sentiment_corpus/finance_data.csv' +from dataset.datasets import SentimentalDataset +from metrics.metrics import compute_metrics + +from sklearn.datasets import load_iris # 샘플 데이터 로딩 +from sklearn.model_selection import train_test_split + +from utils.utils import config_seed + +''' +- git clone https://github.com/ukairia777/finance_sentiment_corpus.git 먼저 실행 +- readme.md 작성 예정 +''' +def train() : + SEED = 42 + + config_seed(SEED) + + device = torch.device("cuda" if torch.cuda.is_available() else 'cpu') + + # 모델과 tokenizer 설정 + MODEL_NAME = 'klue/roberta-base' + model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=3).to(device) + tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) + + # data 받기 및 train/test 나누기 + data = pd.read_csv('/opt/ml/finance_sentiment_corpus/finance_data.csv') + data['labels'] = data['labels'].map({'negative':0, 'neutral':1, 'positive':2}) + + sentence_train, sentence_test, label_train, label_test = train_test_split(data['kor_sentence'], data['labels'], + test_size=0.2, + shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리 + random_state=SEED) + + train_encoding = tokenizer(sentence_train.tolist(), + return_tensors='pt', + padding=True, + truncation=True + ) + + test_encoding = tokenizer(sentence_test.tolist(), + return_tensors='pt', + padding=True, + truncation=True + ) + + train_set = SentimentalDataset(train_encoding, label_train) + test_set = SentimentalDataset(test_encoding, label_test) + + training_args = TrainingArguments( + output_dir = './outputs', + logging_steps = 50, + num_train_epochs = 1, + per_device_train_batch_size=32, + per_device_eval_batch_size=32, + fp16=True ) -data['labels'] = data['labels'].map({'negative':0, 'neutral':1, 'positive':2}) -train_encoding = tokenizer( - data['kor_sentence'].tolist(), - return_tensors='pt', - padding=True, - truncation=True + + trainer = Trainer( + model=model, + args=training_args, + train_dataset=train_set, + eval_dataset=train_set, + compute_metrics=compute_metrics ) -train_set = SentimentalDataset(train_encoding, data['labels']) - - - -training_args = TrainingArguments( - output_dir = './outputs', - logging_steps = 50, - num_train_epochs = 1, - per_device_train_batch_size=32, - per_device_eval_batch_size=32, - fp16=True -) - -trainer = Trainer( - model=model, - args=training_args, - train_dataset=train_set, - eval_dataset=train_set, - compute_metrics=compute_metrics -) - -## - -print('train start') -trainer.train() - -print('evaulate start') -trainer.evaluate() - -print('inference start') -## 방법 1 -model = model.to('cpu') ## 주의 -my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' -classifier = pipeline("sentiment-analysis", model=model, - tokenizer=tokenizer) -inference_output = classifier(my_text) -print(inference_output) -# [{'label': 'LABEL_2', 'score': 0.8627877831459045}] - -## 방법 2 -my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' -model.eval() -with torch.no_grad(): - temp = tokenizer( - my_text, - return_tensors='pt', - padding=True, - truncation=True - ) - predicted_label = model(**temp) - print(torch.nn.Softmax(dim=-1)(predicted_label.logits)) - # tensor([[0.0108, 0.1264, 0.8628]]) + + print('---train start---') + trainer.train() + + print('---evaulate start---') + trainer.evaluate() + + print('---inference start---') + + ## 방법 1 + model = model.to('cpu') ## 주의 + my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' + classifier = pipeline("sentiment-analysis", model=model, + tokenizer=tokenizer) + inference_output = classifier(my_text) + print(inference_output) + # [{'label': 'LABEL_2', 'score': 0.8627877831459045}] + + ## 방법 2 + my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' + model.eval() + with torch.no_grad() : # 기울기 그래프가 안 생겨서 속도가 빨라진다. + temp = tokenizer( + my_text, + return_tensors='pt', + padding=True, + truncation=True + ) + predicted_label = model(**temp) + print(torch.nn.Softmax(dim=-1)(predicted_label.logits)) + # tensor([[0.0108, 0.1264, 0.8628]]) + + ''' + Data + - train / validation 나누기 + - test data 만들기 + - data 갯수가 늘어야 한다.. + > 적절한 갯수 물어보기? + - seed 고정 + - 실행 시간 기록 + + compute_metric 및 datasets module화 + + 실행시간 기록 + + 모델 저장하고 huggingface에 올리기 + wandb 생성 + - 하이퍼 파라미터 튜닝 + - training arguments 수정 + + 출력으로 크롤링한 기사들을 문장 단위로 split 해서 감성 분석으로 한 뒤, csv 파일로 저장 (키워드 추출 팀에게 넘겨주기) + + 성능올리는 방법론 + - ? + - ? + ''' \ No newline at end of file diff --git a/sentence-sentimental/utils/utils.py b/sentence-sentimental/utils/utils.py new file mode 100644 index 0000000..7caf61b --- /dev/null +++ b/sentence-sentimental/utils/utils.py @@ -0,0 +1,9 @@ +import torch +import random +import numpy as np + +def config_seed(SEED) : + random.seed(SEED) + np.random.seed(SEED) + torch.manual_seed(SEED) + torch.cuda.manual_seed_all(SEED) \ No newline at end of file From 28bec090f14ed2c58d3ca3ed1e8e3b13a986d603 Mon Sep 17 00:00:00 2001 From: limha Date: Thu, 6 Jul 2023 05:37:56 +0000 Subject: [PATCH 04/63] [Feature] remove the list to do - modified: sentence-sentimental/train.py --- sentence-sentimental/train.py | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py index a3857b3..c6f206a 100644 --- a/sentence-sentimental/train.py +++ b/sentence-sentimental/train.py @@ -102,29 +102,4 @@ def train() : ) predicted_label = model(**temp) print(torch.nn.Softmax(dim=-1)(predicted_label.logits)) - # tensor([[0.0108, 0.1264, 0.8628]]) - - ''' - Data - - train / validation 나누기 - - test data 만들기 - - data 갯수가 늘어야 한다.. - > 적절한 갯수 물어보기? - - seed 고정 - - 실행 시간 기록 - - compute_metric 및 datasets module화 - - 실행시간 기록 - - 모델 저장하고 huggingface에 올리기 - wandb 생성 - - 하이퍼 파라미터 튜닝 - - training arguments 수정 - - 출력으로 크롤링한 기사들을 문장 단위로 split 해서 감성 분석으로 한 뒤, csv 파일로 저장 (키워드 추출 팀에게 넘겨주기) - - 성능올리는 방법론 - - ? - - ? - ''' \ No newline at end of file + # tensor([[0.0108, 0.1264, 0.8628]]) \ No newline at end of file From b190ab094f3bee5cbf30be67e568a665754ce782 Mon Sep 17 00:00:00 2001 From: limha Date: Thu, 6 Jul 2023 07:02:49 +0000 Subject: [PATCH 05/63] [Feature] fix bug in train.py - modified: sentence-sentimental/train.py --- experiment/datasets.ipynb | 348 ++++++++++++++++++++++++++++++++-- sentence-sentimental/train.py | 4 +- 2 files changed, 332 insertions(+), 20 deletions(-) diff --git a/experiment/datasets.ipynb b/experiment/datasets.ipynb index 2ff9e40..610a130 100644 --- a/experiment/datasets.ipynb +++ b/experiment/datasets.ipynb @@ -2,9 +2,18 @@ "cells": [ { "cell_type": "code", - "execution_count": 2, + "execution_count": 1, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/envs/mrc/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], "source": [ "import torch\n", "import pandas as pd\n", @@ -26,18 +35,17 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "Downloading pytorch_model.bin: 100%|██████████| 443M/443M [00:04<00:00, 100MB/s] \n", - "Some weights of the model checkpoint at klue/roberta-base were not used when initializing RobertaForSequenceClassification: ['lm_head.layer_norm.bias', 'lm_head.layer_norm.weight', 'lm_head.decoder.bias', 'lm_head.bias', 'lm_head.decoder.weight', 'lm_head.dense.weight', 'lm_head.dense.bias']\n", + "Some weights of the model checkpoint at klue/roberta-base were not used when initializing RobertaForSequenceClassification: ['lm_head.layer_norm.bias', 'lm_head.layer_norm.weight', 'lm_head.dense.bias', 'lm_head.decoder.bias', 'lm_head.decoder.weight', 'lm_head.dense.weight', 'lm_head.bias']\n", "- This IS expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n", "- This IS NOT expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n", - "Some weights of RobertaForSequenceClassification were not initialized from the model checkpoint at klue/roberta-base and are newly initialized: ['classifier.out_proj.weight', 'classifier.out_proj.bias', 'classifier.dense.bias', 'classifier.dense.weight']\n", + "Some weights of RobertaForSequenceClassification were not initialized from the model checkpoint at klue/roberta-base and are newly initialized: ['classifier.out_proj.bias', 'classifier.out_proj.weight', 'classifier.dense.weight', 'classifier.dense.bias']\n", "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n" ] } @@ -51,7 +59,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -68,10 +76,108 @@ "train_set = SentimentalDataset(train_encoding, data['labels'])" ] }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pandas.core.frame.DataFrame" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(data)" + ] + }, { "cell_type": "code", "execution_count": 5, "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from sklearn.datasets import load_wine\n", + "\n", + "wine = load_wine()" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "X = wine['data']\n", + "Y = wine['target']" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "X_train, X_test, y_train, y_test = train_test_split(X, Y, stratify=Y, random_state=777)" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(X_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "numpy.ndarray" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(X)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, "outputs": [ { "name": "stdout", @@ -87,19 +193,142 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 11, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pandas.core.series.Series" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(data['kor_sentence'])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 Gran에 따르면, 그 회사는 회사가 성장하고 있는 곳이지만, 모든 생산을 러시아로...\n", + "1 테크노폴리스는 컴퓨터 기술과 통신 분야에서 일하는 회사들을 유치하기 위해 10만 평...\n", + "2 국제 전자산업 회사인 엘코텍은 탈린 공장에서 수십 명의 직원을 해고했으며, 이전의 ...\n", + "3 새로운 생산공장으로 인해 회사는 예상되는 수요 증가를 충족시킬 수 있는 능력을 증가...\n", + "4 2009-2012년 회사의 업데이트된 전략에 따르면, Basware는 20% - 4...\n", + " ... \n", + "4841 런던 마켓워치 -- 은행주의 반등이 FTSE 100지수의 약세를 상쇄하지 못하면서 ...\n", + "4842 린쿠스키아의 맥주 판매량은 416만 리터로 6.5% 감소했으며 카우노 알루스의 맥주...\n", + "4843 영업이익은 2007년 68.8 mn에서 35.4 mn으로 떨어졌으며, 선박 판매 이...\n", + "4844 페이퍼 부문 순매출은 2008년 2분기 241.1 mn에서 2009년 2분기 221...\n", + "4845 핀란드에서의 판매는 1월에 10.5% 감소한 반면, 국외에서의 판매는 17% 감소했다.\n", + "Name: kor_sentence, Length: 4846, dtype: object" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data['kor_sentence']" + ] + }, + { + "cell_type": "code", + "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "sentence_train, sentence_test, label_train, label_test = train_test_split(data['kor_sentence'], data['labels'],\n", " test_size=0.2, \n", - " shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리\n", + " # shuffle=True, \n", + " stratify=data['labels'], # label에 비율을 맞춰서 분리\n", " random_state=34)" ] }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pandas.core.series.Series" + ] + }, + "execution_count": 41, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(data['kor_sentence'])" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pandas.core.series.Series" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(label_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1828 핀란드 식품업계 기업들은 우크라이나가 제공하는 기회에 관심이 많다.\n", + "4809 펜틱+아이넨은 미디어하우스가 제공하는 인터넷 콘텐츠 대부분이 영원히 무료일 수는 없...\n", + "1166 또한 이러한 시장에 대한 6년간의 역사적 분석이 제공됩니다.\n", + "277 루키 총리는 핀란드 사본리나에 위치한 키론살미 해협을 가로지르는 철제 구조물의 인도...\n", + "4670 2009년 8월 3일 핀란드 미디어 그룹 Ilkka-Yhtyma Oyj(헬: ILK...\n", + " ... \n", + "3515 알스트롬 주식거래소 7.2.2.27 10시 30분에 발표 알스트롬 주식회사의 총 5...\n", + "4503 라우트 대변인은 \"다른 인력에 대한 적응 조치는 당분간 적절하다\"고 말했다.\n", + "434 주식수 증가는 2006년 스톡옵션제도에 따라 회사 경영에 부여된 주식선택권에 따른 ...\n", + "3212 개발사업단도 지난해 11월 대비 개발사업단가를 3분의 1가량 낮추겠다고 밝혔다.\n", + "3773 이 건물에는 제품 개발 및 테스트 실험실이 들어설 예정이다.\n", + "Name: kor_sentence, Length: 3876, dtype: object" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sentence_train" + ] + }, + { + "cell_type": "code", + "execution_count": 16, "metadata": {}, "outputs": [], "source": [ @@ -120,32 +349,115 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True))\n", + "test_set = SentimentalDataset(test_encoding, label_test.reset_index(drop=True))" + ] + }, + { + "cell_type": "code", + "execution_count": 18, "metadata": {}, "outputs": [], "source": [ - "train_set = SentimentalDataset(train_encoding, label_train)\n", - "test_set = SentimentalDataset(test_encoding, label_test)" + "training_args = TrainingArguments(\n", + " output_dir = './outputs',\n", + " logging_steps = 50,\n", + " num_train_epochs = 1,\n", + " per_device_train_batch_size=32,\n", + " per_device_eval_batch_size=32,\n", + " fp16=True\n", + " )\n", + "\n", + "trainer = Trainer(\n", + " model=model,\n", + " args=training_args,\n", + " train_dataset=train_set,\n", + " eval_dataset=test_set,\n", + " compute_metrics=compute_metrics\n", + " )\n" ] }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 24, "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", + "To disable this warning, you can either:\n", + "\t- Avoid using `tokenizers` before the fork if possible\n", + "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", + "/bin/bash: wandb: command not found\n" + ] + } + ], + "source": [ + "!wandb offline" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [ 51/122 00:04 < 00:06, 11.13 it/s, Epoch 0.41/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, { "ename": "AttributeError", - "evalue": "'SentimentalDataset' object has no attribute 'len'", + "evalue": "module 'wandb' has no attribute 'log'", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mAttributeError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m/opt/ml/level3_nlp_finalproject-nlp-04/sentence-sentimental/datasets.ipynb Cell 8\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0m train_set\u001b[39m.\u001b[39;49mlen()\n", - "\u001b[0;31mAttributeError\u001b[0m: 'SentimentalDataset' object has no attribute 'len'" + "\u001b[1;32m/opt/ml/level3_nlp_finalproject-nlp-04/experiment/datasets.ipynb Cell 22\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m'\u001b[39m\u001b[39m---train start---\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m----> 2\u001b[0m trainer\u001b[39m.\u001b[39;49mtrain()\n", + "File \u001b[0;32m/opt/conda/envs/mrc/lib/python3.10/site-packages/transformers/trainer.py:1664\u001b[0m, in \u001b[0;36mTrainer.train\u001b[0;34m(self, resume_from_checkpoint, trial, ignore_keys_for_eval, **kwargs)\u001b[0m\n\u001b[1;32m 1659\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmodel_wrapped \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmodel\n\u001b[1;32m 1661\u001b[0m inner_training_loop \u001b[39m=\u001b[39m find_executable_batch_size(\n\u001b[1;32m 1662\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_inner_training_loop, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_train_batch_size, args\u001b[39m.\u001b[39mauto_find_batch_size\n\u001b[1;32m 1663\u001b[0m )\n\u001b[0;32m-> 1664\u001b[0m \u001b[39mreturn\u001b[39;00m inner_training_loop(\n\u001b[1;32m 1665\u001b[0m args\u001b[39m=\u001b[39;49margs,\n\u001b[1;32m 1666\u001b[0m resume_from_checkpoint\u001b[39m=\u001b[39;49mresume_from_checkpoint,\n\u001b[1;32m 1667\u001b[0m trial\u001b[39m=\u001b[39;49mtrial,\n\u001b[1;32m 1668\u001b[0m ignore_keys_for_eval\u001b[39m=\u001b[39;49mignore_keys_for_eval,\n\u001b[1;32m 1669\u001b[0m )\n", + "File \u001b[0;32m/opt/conda/envs/mrc/lib/python3.10/site-packages/transformers/trainer.py:2019\u001b[0m, in \u001b[0;36mTrainer._inner_training_loop\u001b[0;34m(self, batch_size, args, resume_from_checkpoint, trial, ignore_keys_for_eval)\u001b[0m\n\u001b[1;32m 2016\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstate\u001b[39m.\u001b[39mepoch \u001b[39m=\u001b[39m epoch \u001b[39m+\u001b[39m (step \u001b[39m+\u001b[39m \u001b[39m1\u001b[39m \u001b[39m+\u001b[39m steps_skipped) \u001b[39m/\u001b[39m steps_in_epoch\n\u001b[1;32m 2017\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcontrol \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallback_handler\u001b[39m.\u001b[39mon_step_end(args, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstate, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcontrol)\n\u001b[0;32m-> 2019\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_maybe_log_save_evaluate(tr_loss, model, trial, epoch, ignore_keys_for_eval)\n\u001b[1;32m 2020\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 2021\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcontrol \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallback_handler\u001b[39m.\u001b[39mon_substep_end(args, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstate, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcontrol)\n", + "File \u001b[0;32m/opt/conda/envs/mrc/lib/python3.10/site-packages/transformers/trainer.py:2286\u001b[0m, in \u001b[0;36mTrainer._maybe_log_save_evaluate\u001b[0;34m(self, tr_loss, model, trial, epoch, ignore_keys_for_eval)\u001b[0m\n\u001b[1;32m 2283\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_globalstep_last_logged \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstate\u001b[39m.\u001b[39mglobal_step\n\u001b[1;32m 2284\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstore_flos()\n\u001b[0;32m-> 2286\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mlog(logs)\n\u001b[1;32m 2288\u001b[0m metrics \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[1;32m 2289\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcontrol\u001b[39m.\u001b[39mshould_evaluate:\n", + "File \u001b[0;32m/opt/conda/envs/mrc/lib/python3.10/site-packages/transformers/trainer.py:2648\u001b[0m, in \u001b[0;36mTrainer.log\u001b[0;34m(self, logs)\u001b[0m\n\u001b[1;32m 2646\u001b[0m output \u001b[39m=\u001b[39m {\u001b[39m*\u001b[39m\u001b[39m*\u001b[39mlogs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39m{\u001b[39m\"\u001b[39m\u001b[39mstep\u001b[39m\u001b[39m\"\u001b[39m: \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstate\u001b[39m.\u001b[39mglobal_step}}\n\u001b[1;32m 2647\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstate\u001b[39m.\u001b[39mlog_history\u001b[39m.\u001b[39mappend(output)\n\u001b[0;32m-> 2648\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcontrol \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mcallback_handler\u001b[39m.\u001b[39;49mon_log(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49margs, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mstate, \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mcontrol, logs)\n", + "File \u001b[0;32m/opt/conda/envs/mrc/lib/python3.10/site-packages/transformers/trainer_callback.py:390\u001b[0m, in \u001b[0;36mCallbackHandler.on_log\u001b[0;34m(self, args, state, control, logs)\u001b[0m\n\u001b[1;32m 388\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mon_log\u001b[39m(\u001b[39mself\u001b[39m, args: TrainingArguments, state: TrainerState, control: TrainerControl, logs):\n\u001b[1;32m 389\u001b[0m control\u001b[39m.\u001b[39mshould_log \u001b[39m=\u001b[39m \u001b[39mFalse\u001b[39;00m\n\u001b[0;32m--> 390\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mcall_event(\u001b[39m\"\u001b[39;49m\u001b[39mon_log\u001b[39;49m\u001b[39m\"\u001b[39;49m, args, state, control, logs\u001b[39m=\u001b[39;49mlogs)\n", + "File \u001b[0;32m/opt/conda/envs/mrc/lib/python3.10/site-packages/transformers/trainer_callback.py:397\u001b[0m, in \u001b[0;36mCallbackHandler.call_event\u001b[0;34m(self, event, args, state, control, **kwargs)\u001b[0m\n\u001b[1;32m 395\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mcall_event\u001b[39m(\u001b[39mself\u001b[39m, event, args, state, control, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 396\u001b[0m \u001b[39mfor\u001b[39;00m callback \u001b[39min\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallbacks:\n\u001b[0;32m--> 397\u001b[0m result \u001b[39m=\u001b[39m \u001b[39mgetattr\u001b[39;49m(callback, event)(\n\u001b[1;32m 398\u001b[0m args,\n\u001b[1;32m 399\u001b[0m state,\n\u001b[1;32m 400\u001b[0m control,\n\u001b[1;32m 401\u001b[0m model\u001b[39m=\u001b[39;49m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mmodel,\n\u001b[1;32m 402\u001b[0m tokenizer\u001b[39m=\u001b[39;49m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mtokenizer,\n\u001b[1;32m 403\u001b[0m optimizer\u001b[39m=\u001b[39;49m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49moptimizer,\n\u001b[1;32m 404\u001b[0m lr_scheduler\u001b[39m=\u001b[39;49m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mlr_scheduler,\n\u001b[1;32m 405\u001b[0m train_dataloader\u001b[39m=\u001b[39;49m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mtrain_dataloader,\n\u001b[1;32m 406\u001b[0m eval_dataloader\u001b[39m=\u001b[39;49m\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49meval_dataloader,\n\u001b[1;32m 407\u001b[0m \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs,\n\u001b[1;32m 408\u001b[0m )\n\u001b[1;32m 409\u001b[0m \u001b[39m# A Callback can skip the return of `control` if it doesn't change it.\u001b[39;00m\n\u001b[1;32m 410\u001b[0m \u001b[39mif\u001b[39;00m result \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n", + "File \u001b[0;32m/opt/conda/envs/mrc/lib/python3.10/site-packages/transformers/integrations.py:807\u001b[0m, in \u001b[0;36mWandbCallback.on_log\u001b[0;34m(self, args, state, control, model, logs, **kwargs)\u001b[0m\n\u001b[1;32m 805\u001b[0m \u001b[39mif\u001b[39;00m state\u001b[39m.\u001b[39mis_world_process_zero:\n\u001b[1;32m 806\u001b[0m logs \u001b[39m=\u001b[39m rewrite_logs(logs)\n\u001b[0;32m--> 807\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_wandb\u001b[39m.\u001b[39;49mlog({\u001b[39m*\u001b[39m\u001b[39m*\u001b[39mlogs, \u001b[39m\"\u001b[39m\u001b[39mtrain/global_step\u001b[39m\u001b[39m\"\u001b[39m: state\u001b[39m.\u001b[39mglobal_step})\n", + "\u001b[0;31mAttributeError\u001b[0m: module 'wandb' has no attribute 'log'" ] } ], - "source": [] + "source": [ + "\n", + "print('---train start---')\n", + "trainer.train()" + ] }, { "cell_type": "code", diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py index c6f206a..36f1354 100644 --- a/sentence-sentimental/train.py +++ b/sentence-sentimental/train.py @@ -53,8 +53,8 @@ def train() : truncation=True ) - train_set = SentimentalDataset(train_encoding, label_train) - test_set = SentimentalDataset(test_encoding, label_test) + train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True)) + test_set = SentimentalDataset(test_encoding, label_test.reset_index(drop=True)) training_args = TrainingArguments( output_dir = './outputs', From a0ead24f8fbec32b3def9c255c7281e027753305 Mon Sep 17 00:00:00 2001 From: lig96 Date: Sun, 9 Jul 2023 16:46:46 +0000 Subject: [PATCH 06/63] [Feature] Add val2 valdation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit train - 4800개의 80% val - 4800개의 20% val2 - 100개(한국 뉴스 바탕으로 직접 라벨링) 데이터셋을 위와 같이 구성했습니다. --- sentence-sentimental/train.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py index 36f1354..2ffcaf0 100644 --- a/sentence-sentimental/train.py +++ b/sentence-sentimental/train.py @@ -36,10 +36,10 @@ def train() : data = pd.read_csv('/opt/ml/finance_sentiment_corpus/finance_data.csv') data['labels'] = data['labels'].map({'negative':0, 'neutral':1, 'positive':2}) - sentence_train, sentence_test, label_train, label_test = train_test_split(data['kor_sentence'], data['labels'], - test_size=0.2, - shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리 - random_state=SEED) + temp = train_test_split(data['kor_sentence'], data['labels'], + test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리 + random_state=SEED) + sentence_train, sentence_val, label_train, label_val = temp train_encoding = tokenizer(sentence_train.tolist(), return_tensors='pt', @@ -47,14 +47,22 @@ def train() : truncation=True ) - test_encoding = tokenizer(sentence_test.tolist(), + val_encoding = tokenizer(sentence_val.tolist(), return_tensors='pt', padding=True, truncation=True ) train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True)) - test_set = SentimentalDataset(test_encoding, label_test.reset_index(drop=True)) + val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True)) + + data2 = pd.read_csv('/opt/ml/finance_sentiment_corpus/native_korean_news_100.csv') + val2_encoding = tokenizer(data2['kor_sentence'].tolist(), + return_tensors='pt', + padding=True, + truncation=True + ) + val2_set = SentimentalDataset(val2_encoding, data2['labels']) training_args = TrainingArguments( output_dir = './outputs', @@ -76,8 +84,11 @@ def train() : print('---train start---') trainer.train() - print('---evaulate start---') - trainer.evaluate() + print('---val evaulate start---') + trainer.evaluate(eval_dataset=val_set, metric_key_prefix='val1') + + print('---test evaluate start---') + trainer.evaluate(eval_dataset=val2_set, metric_key_prefix='val2') print('---inference start---') From b9e72114bd50307ad4dc112bbbeea43e99a90c1e Mon Sep 17 00:00:00 2001 From: lig96 Date: Sun, 9 Jul 2023 17:01:04 +0000 Subject: [PATCH 07/63] [Feature] Change style --- sentence-sentimental/train.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py index 2ffcaf0..9ca908e 100644 --- a/sentence-sentimental/train.py +++ b/sentence-sentimental/train.py @@ -21,18 +21,19 @@ - readme.md 작성 예정 ''' def train() : + ## 설정 SEED = 42 - config_seed(SEED) - device = torch.device("cuda" if torch.cuda.is_available() else 'cpu') - # 모델과 tokenizer 설정 + + ## 모델 MODEL_NAME = 'klue/roberta-base' model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=3).to(device) tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) - # data 받기 및 train/test 나누기 + + ## 데이터 data = pd.read_csv('/opt/ml/finance_sentiment_corpus/finance_data.csv') data['labels'] = data['labels'].map({'negative':0, 'neutral':1, 'positive':2}) @@ -46,13 +47,11 @@ def train() : padding=True, truncation=True ) - val_encoding = tokenizer(sentence_val.tolist(), return_tensors='pt', padding=True, truncation=True ) - train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True)) val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True)) @@ -64,6 +63,8 @@ def train() : ) val2_set = SentimentalDataset(val2_encoding, data2['labels']) + + ## 학습 training_args = TrainingArguments( output_dir = './outputs', logging_steps = 50, @@ -72,7 +73,6 @@ def train() : per_device_eval_batch_size=32, fp16=True ) - trainer = Trainer( model=model, args=training_args, @@ -84,15 +84,15 @@ def train() : print('---train start---') trainer.train() + + ## 평가 print('---val evaulate start---') trainer.evaluate(eval_dataset=val_set, metric_key_prefix='val1') print('---test evaluate start---') trainer.evaluate(eval_dataset=val2_set, metric_key_prefix='val2') - print('---inference start---') - - ## 방법 1 + print('---inference start---') ## 추론 방법 1 model = model.to('cpu') ## 주의 my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' classifier = pipeline("sentiment-analysis", model=model, @@ -101,10 +101,10 @@ def train() : print(inference_output) # [{'label': 'LABEL_2', 'score': 0.8627877831459045}] - ## 방법 2 + print('---inference start---') ## 추론 방법 2 my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' model.eval() - with torch.no_grad() : # 기울기 그래프가 안 생겨서 속도가 빨라진다. + with torch.no_grad() : temp = tokenizer( my_text, return_tensors='pt', From b123fd9aedf2a472837aa8789dff5963b05e2425 Mon Sep 17 00:00:00 2001 From: ChoiHwimin Date: Mon, 10 Jul 2023 15:42:13 +0900 Subject: [PATCH 08/63] [Feature] Create Keyword Extraction Pipeline [Feature] Create Keyword Extraction Pipeline - #20 --- .../keyword extraction pipeline.ipynb | 3957 +++++++++++++++++ 1 file changed, 3957 insertions(+) create mode 100644 keyword-extraction/keyword extraction pipeline.ipynb diff --git a/keyword-extraction/keyword extraction pipeline.ipynb b/keyword-extraction/keyword extraction pipeline.ipynb new file mode 100644 index 0000000..ebfb0fe --- /dev/null +++ b/keyword-extraction/keyword extraction pipeline.ipynb @@ -0,0 +1,3957 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "2d9c22439311433fbde63dec91fb7ffc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9acf167658a04032b54f36eb8cc1e9c8", + "IPY_MODEL_afca155d3a204bc19526d1578e3ff403", + "IPY_MODEL_f451cacff7044b3ea30925553902a0bc" + ], + "layout": "IPY_MODEL_b2ce5bdd00274c07939363b8a51affe7" + } + }, + "9acf167658a04032b54f36eb8cc1e9c8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9f7a91fbb53142a2963b49034c6e9f39", + "placeholder": "​", + "style": "IPY_MODEL_ccc1c4fb85cb4fffaf074cb6c7657357", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "afca155d3a204bc19526d1578e3ff403": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ab20e37d3dde4b5ba482e50e878b2eab", + "max": 365, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a5578182f4ec480bb479b5ee014b7e39", + "value": 365 + } + }, + "f451cacff7044b3ea30925553902a0bc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7c1fa72ef3bd45458cd136b1b01c44b5", + "placeholder": "​", + "style": "IPY_MODEL_69239a07eea34a2890c1da133a0cb47c", + "value": " 365/365 [00:00<00:00, 5.66kB/s]" + } + }, + "b2ce5bdd00274c07939363b8a51affe7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9f7a91fbb53142a2963b49034c6e9f39": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ccc1c4fb85cb4fffaf074cb6c7657357": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ab20e37d3dde4b5ba482e50e878b2eab": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a5578182f4ec480bb479b5ee014b7e39": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7c1fa72ef3bd45458cd136b1b01c44b5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "69239a07eea34a2890c1da133a0cb47c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2046ef77bcd747ebaf2282d968d8d324": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9444d0ea409a443fa7843d620bed9fae", + "IPY_MODEL_5910343a2e2c46d89b221e272cce619a", + "IPY_MODEL_d4af78e36c0745559630d836f572ba10" + ], + "layout": "IPY_MODEL_7c443272e9584cd8a4e0bc494acac30d" + } + }, + "9444d0ea409a443fa7843d620bed9fae": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7b59e111e7cc413d9bfa87a6e077cc9f", + "placeholder": "​", + "style": "IPY_MODEL_b564d91d5d0e4168b19a3b7dc4089cf8", + "value": "Downloading (…)solve/main/vocab.txt: 100%" + } + }, + "5910343a2e2c46d89b221e272cce619a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_01fd16484b264eaaa3360e0de6972933", + "max": 263327, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9ab3dcd684d244848e5354ceeedeedeb", + "value": 263327 + } + }, + "d4af78e36c0745559630d836f572ba10": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_560c4ecb19f7446785ebd16eddc814f7", + "placeholder": "​", + "style": "IPY_MODEL_92e86e1a4a044af790df8e11f9a7fa0d", + "value": " 263k/263k [00:00<00:00, 3.41MB/s]" + } + }, + "7c443272e9584cd8a4e0bc494acac30d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7b59e111e7cc413d9bfa87a6e077cc9f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b564d91d5d0e4168b19a3b7dc4089cf8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "01fd16484b264eaaa3360e0de6972933": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9ab3dcd684d244848e5354ceeedeedeb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "560c4ecb19f7446785ebd16eddc814f7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "92e86e1a4a044af790df8e11f9a7fa0d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b5dcac63cd2649ef8a96d76111c31bbb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3df8295c1ef04c14897bb86f7f81a8a0", + "IPY_MODEL_7799deaee83a4ccdbbbb0e3a96b8a042", + "IPY_MODEL_5c89b41d27aa444a81f76098cf632513" + ], + "layout": "IPY_MODEL_7d6bcfa8eb794cf18cb282ca92e248dd" + } + }, + "3df8295c1ef04c14897bb86f7f81a8a0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e96da164d67d44998b4615edc9816731", + "placeholder": "​", + "style": "IPY_MODEL_3456d1eb82404263bce844e673579be6", + "value": "Downloading (…)/main/tokenizer.json: 100%" + } + }, + "7799deaee83a4ccdbbbb0e3a96b8a042": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_692ab560e5414507add9093ab3d308b1", + "max": 814850, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d4198e59eae247ff920a7fece1ddb701", + "value": 814850 + } + }, + "5c89b41d27aa444a81f76098cf632513": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a7e43dc7a1b2457fa5ea5ea359fafd08", + "placeholder": "​", + "style": "IPY_MODEL_7ec13f29d83d4be58fa557bbf5b4b980", + "value": " 815k/815k [00:00<00:00, 10.5MB/s]" + } + }, + "7d6bcfa8eb794cf18cb282ca92e248dd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e96da164d67d44998b4615edc9816731": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3456d1eb82404263bce844e673579be6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "692ab560e5414507add9093ab3d308b1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d4198e59eae247ff920a7fece1ddb701": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a7e43dc7a1b2457fa5ea5ea359fafd08": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7ec13f29d83d4be58fa557bbf5b4b980": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0c81c2073c2c4c8fac1d174d356d1659": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_afe5c9d4af724fef936d0b7b69c8d10b", + "IPY_MODEL_4fed88c7a3b848678f09ec9a13bb3c46", + "IPY_MODEL_b4c69a733e084bc1bea1e5106eedd48b" + ], + "layout": "IPY_MODEL_9e2472bae3f9489eb637ad681b551eaf" + } + }, + "afe5c9d4af724fef936d0b7b69c8d10b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_799a551beed049e78a16caad61bfaff3", + "placeholder": "​", + "style": "IPY_MODEL_7dfabc71cf9b460fbc350ec21cbe3165", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "4fed88c7a3b848678f09ec9a13bb3c46": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_17c52890539445a8a3e3ba25e1a34805", + "max": 125, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_720050fc0b2f45ed973564357b8b96c0", + "value": 125 + } + }, + "b4c69a733e084bc1bea1e5106eedd48b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e8f1b7529d104fb597c34827ff0b55c9", + "placeholder": "​", + "style": "IPY_MODEL_4c654170f9f64a7081ce622964ea9a6b", + "value": " 125/125 [00:00<00:00, 1.06kB/s]" + } + }, + "9e2472bae3f9489eb637ad681b551eaf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "799a551beed049e78a16caad61bfaff3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7dfabc71cf9b460fbc350ec21cbe3165": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "17c52890539445a8a3e3ba25e1a34805": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "720050fc0b2f45ed973564357b8b96c0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e8f1b7529d104fb597c34827ff0b55c9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4c654170f9f64a7081ce622964ea9a6b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "aa3972c512604047a848ccbfd6ce7549": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_149b398730f14bc3a84d2537b1f43192", + "IPY_MODEL_3b6dd37cb3ac4300a608e4b7e47513fe", + "IPY_MODEL_2075e02c4a4b4e22a90b1a57299d110a" + ], + "layout": "IPY_MODEL_6a7c0dbf679b4588b7e127fd293343c3" + } + }, + "149b398730f14bc3a84d2537b1f43192": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2045aba1e11c4d618b763af8832f869f", + "placeholder": "​", + "style": "IPY_MODEL_b06d6137f7ee4ddfb34fbc4ba67b701b", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "3b6dd37cb3ac4300a608e4b7e47513fe": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_534575664a26442f8d9a82d2a2c7aaed", + "max": 1880, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9456688719ac46bb889049d7afabf36b", + "value": 1880 + } + }, + "2075e02c4a4b4e22a90b1a57299d110a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_08e297bfd5ea4d549d75855a8d8bfc53", + "placeholder": "​", + "style": "IPY_MODEL_a3d4c956d2e84bac8a285cef6d4e30dd", + "value": " 1.88k/1.88k [00:00<00:00, 33.5kB/s]" + } + }, + "6a7c0dbf679b4588b7e127fd293343c3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2045aba1e11c4d618b763af8832f869f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b06d6137f7ee4ddfb34fbc4ba67b701b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "534575664a26442f8d9a82d2a2c7aaed": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9456688719ac46bb889049d7afabf36b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "08e297bfd5ea4d549d75855a8d8bfc53": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a3d4c956d2e84bac8a285cef6d4e30dd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f41a5c3f217a447e9b5ab384e8f49fe4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e792d635a172466489805d0ff0ea690a", + "IPY_MODEL_0a3ab3fa5b6f434e80f1be44ea869715", + "IPY_MODEL_ad5b79173e414a11954054baad03d074" + ], + "layout": "IPY_MODEL_843b2195c06240f280516695e6c6a163" + } + }, + "e792d635a172466489805d0ff0ea690a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8fea3fa5e37e4f089de7160e9b93603d", + "placeholder": "​", + "style": "IPY_MODEL_24502943168641218c700a88a50b5fcd", + "value": "Downloading model.safetensors: 100%" + } + }, + "0a3ab3fa5b6f434e80f1be44ea869715": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_26c44f82b0b64fa6b0daea6d9d4e3557", + "max": 56284578, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7c13738bca27482799c444fc7fdaee54", + "value": 56284578 + } + }, + "ad5b79173e414a11954054baad03d074": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4468bd12e8364289bad249ac201dca98", + "placeholder": "​", + "style": "IPY_MODEL_09483de37bb04a688b6b1484825f4ff8", + "value": " 56.3M/56.3M [00:00<00:00, 70.6MB/s]" + } + }, + "843b2195c06240f280516695e6c6a163": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8fea3fa5e37e4f089de7160e9b93603d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "24502943168641218c700a88a50b5fcd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "26c44f82b0b64fa6b0daea6d9d4e3557": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7c13738bca27482799c444fc7fdaee54": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4468bd12e8364289bad249ac201dca98": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "09483de37bb04a688b6b1484825f4ff8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "cells": [ + { + "cell_type": "code", + "source": [ + "!pip install transformers" + ], + "metadata": { + "id": "-IvPt6jot3kn" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "!pip install sentence_transformers" + ], + "metadata": { + "id": "aiOjtV_Ft4GR" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "import numpy as np\n", + "import pandas as pd" + ], + "metadata": { + "id": "SXcUC-2ct3gZ" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.metrics.pairwise import cosine_distances" + ], + "metadata": { + "id": "29c0VPz8uxJ_" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# 임시 코드 입니다" + ], + "metadata": { + "id": "wBvRYC-yv54e" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "6Jhfqe5yylTF" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from transformers import AutoTokenizer, AutoModelForTokenClassification\n", + "from transformers import pipeline\n", + "\n", + "tokenizer = AutoTokenizer.from_pretrained(\"Leo97/KoELECTRA-small-v3-modu-ner\")\n", + "model = AutoModelForTokenClassification.from_pretrained(\"Leo97/KoELECTRA-small-v3-modu-ner\")\n", + "ner = pipeline(\"ner\", model=model, tokenizer=tokenizer)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 209, + "referenced_widgets": [ + "2d9c22439311433fbde63dec91fb7ffc", + "9acf167658a04032b54f36eb8cc1e9c8", + "afca155d3a204bc19526d1578e3ff403", + "f451cacff7044b3ea30925553902a0bc", + "b2ce5bdd00274c07939363b8a51affe7", + "9f7a91fbb53142a2963b49034c6e9f39", + "ccc1c4fb85cb4fffaf074cb6c7657357", + "ab20e37d3dde4b5ba482e50e878b2eab", + "a5578182f4ec480bb479b5ee014b7e39", + "7c1fa72ef3bd45458cd136b1b01c44b5", + "69239a07eea34a2890c1da133a0cb47c", + "2046ef77bcd747ebaf2282d968d8d324", + "9444d0ea409a443fa7843d620bed9fae", + "5910343a2e2c46d89b221e272cce619a", + "d4af78e36c0745559630d836f572ba10", + "7c443272e9584cd8a4e0bc494acac30d", + "7b59e111e7cc413d9bfa87a6e077cc9f", + "b564d91d5d0e4168b19a3b7dc4089cf8", + "01fd16484b264eaaa3360e0de6972933", + "9ab3dcd684d244848e5354ceeedeedeb", + "560c4ecb19f7446785ebd16eddc814f7", + "92e86e1a4a044af790df8e11f9a7fa0d", + "b5dcac63cd2649ef8a96d76111c31bbb", + "3df8295c1ef04c14897bb86f7f81a8a0", + "7799deaee83a4ccdbbbb0e3a96b8a042", + "5c89b41d27aa444a81f76098cf632513", + "7d6bcfa8eb794cf18cb282ca92e248dd", + "e96da164d67d44998b4615edc9816731", + "3456d1eb82404263bce844e673579be6", + "692ab560e5414507add9093ab3d308b1", + "d4198e59eae247ff920a7fece1ddb701", + "a7e43dc7a1b2457fa5ea5ea359fafd08", + "7ec13f29d83d4be58fa557bbf5b4b980", + "0c81c2073c2c4c8fac1d174d356d1659", + "afe5c9d4af724fef936d0b7b69c8d10b", + "4fed88c7a3b848678f09ec9a13bb3c46", + "b4c69a733e084bc1bea1e5106eedd48b", + "9e2472bae3f9489eb637ad681b551eaf", + "799a551beed049e78a16caad61bfaff3", + "7dfabc71cf9b460fbc350ec21cbe3165", + "17c52890539445a8a3e3ba25e1a34805", + "720050fc0b2f45ed973564357b8b96c0", + "e8f1b7529d104fb597c34827ff0b55c9", + "4c654170f9f64a7081ce622964ea9a6b", + "aa3972c512604047a848ccbfd6ce7549", + "149b398730f14bc3a84d2537b1f43192", + "3b6dd37cb3ac4300a608e4b7e47513fe", + "2075e02c4a4b4e22a90b1a57299d110a", + "6a7c0dbf679b4588b7e127fd293343c3", + "2045aba1e11c4d618b763af8832f869f", + "b06d6137f7ee4ddfb34fbc4ba67b701b", + "534575664a26442f8d9a82d2a2c7aaed", + "9456688719ac46bb889049d7afabf36b", + "08e297bfd5ea4d549d75855a8d8bfc53", + "a3d4c956d2e84bac8a285cef6d4e30dd", + "f41a5c3f217a447e9b5ab384e8f49fe4", + "e792d635a172466489805d0ff0ea690a", + "0a3ab3fa5b6f434e80f1be44ea869715", + "ad5b79173e414a11954054baad03d074", + "843b2195c06240f280516695e6c6a163", + "8fea3fa5e37e4f089de7160e9b93603d", + "24502943168641218c700a88a50b5fcd", + "26c44f82b0b64fa6b0daea6d9d4e3557", + "7c13738bca27482799c444fc7fdaee54", + "4468bd12e8364289bad249ac201dca98", + "09483de37bb04a688b6b1484825f4ff8" + ] + }, + "id": "V41IQomT-pFV", + "outputId": "977c97aa-ad09-4bad-d58c-1b3fc343a895" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Downloading (…)okenizer_config.json: 0%| | 0.00/365 [00:00\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
companytitlelinkwriterdatecontent
0CNT85CNT85, 156.5억 규모 공사 계약 체결https://finance.naver.com/item/news_read.naver...이데일리2023.07.03 13:46[이데일리 원다연 기자] CNT85(056730)는 테크로스워터앤에너지와 156억 ...
1CNT85CNT85, 28억 규모 RTO 설치공사 공급계약https://finance.naver.com/item/news_read.naver...이데일리2023.06.16 14:30[이데일리 김보겸 기자] CNT85(056730)는 28억원 규모의 당진공장 축열식...
2CNT85CNT85, 4.6억 규모 전환청구권 행사https://finance.naver.com/item/news_read.naver...이데일리2023.05.26 16:22[이데일리 김응태 기자] CNT85(056730)는 4억6000만원 규모의 23회차...
3CNT85CNT85, 1분기 영업익 2.3억원…흑자전환 성공https://finance.naver.com/item/news_read.naver...머니투데이2023.05.12 14:42플랜트, 필터·여과수처리 사업을 운영하는 CNT85가 1분기 영업이익 2억3000만...
4CNT85CNT85, 7억 규모 전환청구권 행사https://finance.naver.com/item/news_read.naver...이데일리2023.04.28 17:25[이데일리 이정현 기자] CNT85(056730)는 7억 원 규모의 23회차 무기명...
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + " \n", + " " + ] + }, + "metadata": {}, + "execution_count": 11 + } + ] + }, + { + "cell_type": "code", + "source": [ + "text = df.loc[0]['content']" + ], + "metadata": { + "id": "UpCiSdvSurwq" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "title = df.loc[0]['title']" + ], + "metadata": { + "id": "ihvjZ9dXurnC" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "text" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 54 + }, + "id": "Vflr9KeNCA4j", + "outputId": "0ea4b104-34d2-4221-f0bd-fa623856b160" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'[이데일리 원다연 기자] CNT85(056730)는 테크로스워터앤에너지와 156억 5000만원 규모의 기흥 SDR 그린센터 오수처리시설 기계배관 공사 계약을 체결했다고 3일 공시했다.이는 최근 매출액 대비 48.78%에 해당한다. 계약 기간은 지난 30일부터 내년 12월 31일까지다.'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 15 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result = return_words(text)\n", + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gXOh8ZA8vEQq", + "outputId": "7e249d57-d4b3-47ba-df76-745def4d5664" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['일리',\n", + " '원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '0567',\n", + " '##30',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3',\n", + " '##일',\n", + " '48 . 78 %']" + ] + }, + "metadata": {}, + "execution_count": 14 + } + ] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " todo : 현재 입력 데이터의 길이가 길면 출력이 이상해 지는 문제가 있음\n", + " 아래 예시 확인\n", + "'''" + ], + "metadata": { + "id": "ZMxs6kUCffTZ" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "result = return_words(text[:50])\n", + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rxlltjT5CUX4", + "outputId": "511984ba-e3c3-4e4c-ccca-cd4aa9ad5447" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['원다연', '기자', 'CNT85', '056730', '테크로스워터앤에너지', '156억 5000']" + ] + }, + "metadata": {}, + "execution_count": 24 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result = return_words(text[:101])\n", + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IG2E3rJdCwv5", + "outputId": "d6573205-682d-42d0-99aa-74b9afbf41af" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '056730',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3일']" + ] + }, + "metadata": {}, + "execution_count": 27 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result = return_words(text[:130])\n", + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "KWZpH3MuDA-B", + "outputId": "d5472fdf-cf67-4bb6-b5e3-a587713833ed" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['일리',\n", + " '원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '056730',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3일',\n", + " '48 . 78 %']" + ] + }, + "metadata": {}, + "execution_count": 31 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result = return_words(text)\n", + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tEO_oMYPCF7I", + "outputId": "a6a4c31d-1286-45f5-d5ee-5ac6ffeeb896" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['일리',\n", + " '원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '0567',\n", + " '##30',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3',\n", + " '##일',\n", + " '48 . 78 %']" + ] + }, + "metadata": {}, + "execution_count": 32 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0sceVfkRvEOX", + "outputId": "4d870c4f-d19c-4db7-8150-9d0c4c374fe6" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'word': ['일리',\n", + " '원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '0567',\n", + " '##30',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3',\n", + " '##일',\n", + " '48 . 78 %'],\n", + " 'score': [['I-OG'],\n", + " ['B-OG', 'I-OG', 'I-PS'],\n", + " ['B-CV'],\n", + " ['B-AF', 'I-AF', 'I-AF'],\n", + " ['B-QT', 'I-QT'],\n", + " ['B-QT'],\n", + " ['B-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG'],\n", + " ['B-QT', 'I-QT', 'I-QT'],\n", + " ['B-LC'],\n", + " ['B-AF', 'I-AF', 'I-AF', 'I-AF'],\n", + " ['B-DT'],\n", + " ['B-DT'],\n", + " ['B-QT', 'I-QT', 'I-QT', 'I-QT']],\n", + " 'entity': [[0.49553466],\n", + " [0.5833473, 0.45962462, 0.5877794],\n", + " [0.61917484],\n", + " [0.41322687, 0.45933244, 0.35766423],\n", + " [0.82425725, 0.73227006],\n", + " [0.80768573],\n", + " [0.86274034,\n", + " 0.8953028,\n", + " 0.89671725,\n", + " 0.92597497,\n", + " 0.9127999,\n", + " 0.9244243,\n", + " 0.9098607],\n", + " [0.63297695, 0.64723974, 0.66578895],\n", + " [0.7482972],\n", + " [0.33515036, 0.42516705, 0.46068886, 0.416388],\n", + " [0.7863837],\n", + " [0.77908856],\n", + " [0.7852038, 0.78137255, 0.8358253, 0.80113524]],\n", + " 'index': [[(3, 5)],\n", + " [(6, 7), (7, 8), (8, 9)],\n", + " [(10, 12)],\n", + " [(14, 16), (16, 17), (17, 19)],\n", + " [(20, 22), (22, 24)],\n", + " [(24, 26)],\n", + " [(29, 31), (31, 33), (33, 34), (34, 35), (35, 36), (36, 37), (37, 39)],\n", + " [(41, 44), (44, 45), (46, 50)],\n", + " [(57, 59)],\n", + " [(60, 62), (62, 63), (64, 66), (66, 68)],\n", + " [(94, 95)],\n", + " [(95, 96)],\n", + " [(115, 117), (117, 118), (118, 120), (120, 121)]]}" + ] + }, + "metadata": {}, + "execution_count": 33 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "1Jc0Cr8mDkGP" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "DjdmghkDDj9A" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "result = return_words(text[:130])\n", + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "h5DIRDQGDqFi", + "outputId": "d36d8ed1-cde9-45a1-a032-d509d3af6c06" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['일리',\n", + " '원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '056730',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3일',\n", + " '48 . 78 %']" + ] + }, + "metadata": {}, + "execution_count": 34 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "0wXruLk2ss5G" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### 불용어 제거" + ], + "metadata": { + "id": "saTscqVSr4Pv" + } + }, + { + "cell_type": "code", + "source": [ + "#stopword 목록 다운\n", + "!git clone https://gist.github.com/d10b18575a73778da4bc83853385465c.git stopwords" + ], + "metadata": { + "id": "EQAr45AJt3TS", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "c2d348de-ab1f-44a7-9a28-664c47f155e7" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Cloning into 'stopwords'...\n", + "remote: Enumerating objects: 3, done.\u001b[K\n", + "remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3\u001b[K\n", + "Unpacking objects: 100% (3/3), 2.75 KiB | 2.75 MiB/s, done.\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " todo : 불용어 추가\n", + "'''\n", + "def load_stopwords(custom_stopwords = None):\n", + " words = []\n", + "\n", + " if custom_stopwords:\n", + " words.extend(custom_stopwords)\n", + "\n", + " file_path = \"./stopwords/stopwords.txt\"\n", + " with open(file_path, 'r') as file:\n", + " words.extend(file.read().split('\\n'))\n", + "\n", + " # file_path = \"./stopword.txt\"\n", + " # with open(file_path, 'r') as file:\n", + " # words.extend(file.read().split('\\n'))\n", + "\n", + " # file_path = \"./stopword2.txt\"\n", + " # with open(file_path, 'r') as file:\n", + " # words.extend(file.read().split('\\n')[1:])\n", + "\n", + " return list(set(words))" + ], + "metadata": { + "id": "GEF_B-bEq5Aa" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# custom = []\n", + "custom = ['기자','3일']\n", + "stopwords = load_stopwords(custom)" + ], + "metadata": { + "id": "qY5xgD4irmKq" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(len(stopwords))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "js9a5HsGEm5x", + "outputId": "58a2ebfa-7cad-461c-bf74-9df6e207228b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "597\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "result" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Depd1ifUGXRv", + "outputId": "3c5996a7-d7aa-4ac8-8e70-0b16db6c968d" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'word': ['일리',\n", + " '원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '056730',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3일',\n", + " '48 . 78 %'],\n", + " 'score': [['I-OG'],\n", + " ['B-OG', 'I-PS', 'I-PS'],\n", + " ['B-CV'],\n", + " ['B-AF', 'I-AF', 'I-AF'],\n", + " ['B-QT', 'I-QT', 'I-QT'],\n", + " ['B-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG'],\n", + " ['B-QT', 'I-QT', 'I-QT'],\n", + " ['B-LC'],\n", + " ['B-AF', 'I-AF', 'I-AF', 'I-AF'],\n", + " ['B-DT', 'I-DT'],\n", + " ['B-QT', 'I-QT', 'I-QT', 'I-QT']],\n", + " 'entity': [[0.4308679],\n", + " [0.5620235, 0.4328442, 0.6262465],\n", + " [0.6986592],\n", + " [0.42377126, 0.45967755, 0.36286187],\n", + " [0.9009548, 0.8883027, 0.940171],\n", + " [0.87209386,\n", + " 0.89965653,\n", + " 0.89785665,\n", + " 0.9268155,\n", + " 0.9119154,\n", + " 0.9234293,\n", + " 0.9095367],\n", + " [0.64638066, 0.6557225, 0.6707427],\n", + " [0.7661712],\n", + " [0.37843058, 0.4347338, 0.47299442, 0.4301917],\n", + " [0.8726086, 0.946883],\n", + " [0.83745456, 0.8217816, 0.870865, 0.8377137]],\n", + " 'index': [[(3, 5)],\n", + " [(6, 7), (7, 8), (8, 9)],\n", + " [(10, 12)],\n", + " [(14, 16), (16, 17), (17, 19)],\n", + " [(20, 22), (22, 24), (24, 26)],\n", + " [(29, 31), (31, 33), (33, 34), (34, 35), (35, 36), (36, 37), (37, 39)],\n", + " [(41, 44), (44, 45), (46, 50)],\n", + " [(57, 59)],\n", + " [(60, 62), (62, 63), (64, 66), (66, 68)],\n", + " [(94, 95), (95, 96)],\n", + " [(115, 117), (117, 118), (118, 120), (120, 121)]]}" + ] + }, + "metadata": {}, + "execution_count": 53 + } + ] + }, + { + "cell_type": "code", + "source": [ + "remove_idxs = [i for i, word in enumerate(result['word']) if word in stopwords]\n", + "remove_idxs" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "-6kzIpMVGXLN", + "outputId": "1596d600-9e7c-44db-d80f-5aebabdf70b7" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[2, 9]" + ] + }, + "metadata": {}, + "execution_count": 54 + } + ] + }, + { + "cell_type": "code", + "source": [ + "for idx in sorted(remove_idxs, reverse=True):\n", + " del result['word'][idx]\n", + " del result['score'][idx]\n", + " del result['entity'][idx]\n", + " del result['index'][idx]" + ], + "metadata": { + "id": "ci0iEZ0oGXFz" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "result" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "m3mvNACsHTYh", + "outputId": "e2da1dd4-be67-4d71-b61f-7f6cf7d9287b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'word': ['일리',\n", + " '원다연',\n", + " 'CNT85',\n", + " '056730',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '48 . 78 %'],\n", + " 'score': [['I-OG'],\n", + " ['B-OG', 'I-PS', 'I-PS'],\n", + " ['B-AF', 'I-AF', 'I-AF'],\n", + " ['B-QT', 'I-QT', 'I-QT'],\n", + " ['B-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG'],\n", + " ['B-QT', 'I-QT', 'I-QT'],\n", + " ['B-LC'],\n", + " ['B-AF', 'I-AF', 'I-AF', 'I-AF'],\n", + " ['B-QT', 'I-QT', 'I-QT', 'I-QT']],\n", + " 'entity': [[0.4308679],\n", + " [0.5620235, 0.4328442, 0.6262465],\n", + " [0.42377126, 0.45967755, 0.36286187],\n", + " [0.9009548, 0.8883027, 0.940171],\n", + " [0.87209386,\n", + " 0.89965653,\n", + " 0.89785665,\n", + " 0.9268155,\n", + " 0.9119154,\n", + " 0.9234293,\n", + " 0.9095367],\n", + " [0.64638066, 0.6557225, 0.6707427],\n", + " [0.7661712],\n", + " [0.37843058, 0.4347338, 0.47299442, 0.4301917],\n", + " [0.83745456, 0.8217816, 0.870865, 0.8377137]],\n", + " 'index': [[(3, 5)],\n", + " [(6, 7), (7, 8), (8, 9)],\n", + " [(14, 16), (16, 17), (17, 19)],\n", + " [(20, 22), (22, 24), (24, 26)],\n", + " [(29, 31), (31, 33), (33, 34), (34, 35), (35, 36), (36, 37), (37, 39)],\n", + " [(41, 44), (44, 45), (46, 50)],\n", + " [(57, 59)],\n", + " [(60, 62), (62, 63), (64, 66), (66, 68)],\n", + " [(115, 117), (117, 118), (118, 120), (120, 121)]]}" + ] + }, + "metadata": {}, + "execution_count": 56 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "bOnMBZihHTTX" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "I_9x2bcdINrq", + "outputId": "8adc2679-c363-4857-935a-4bfdd919dfeb" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['일리',\n", + " '원다연',\n", + " 'CNT85',\n", + " '056730',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '48 . 78 %']" + ] + }, + "metadata": {}, + "execution_count": 58 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "VjyoDJajGXAQ" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### 벡터화" + ], + "metadata": { + "id": "grQ_6GhAr-Zo" + } + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "E2WP0Ukor9lV" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " 참고 사이트 :\n", + " https://devocean.sk.com/blog/techBoardDetail.do?ID=164033\n", + "'''" + ], + "metadata": { + "id": "wH4_QbLD1QmC" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " todo : sota 모델 찾기\n", + "'''\n", + "from sentence_transformers import SentenceTransformer\n", + "model = SentenceTransformer('jhgan/ko-sroberta-multitask')" + ], + "metadata": { + "id": "0086Wo6C1QGX" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(title)\n", + "print(text)\n", + "print(words)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qjogJSFtIfLN", + "outputId": "fa9998a1-cc3f-4a23-a7aa-f9ec846ec41c" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "CNT85, 156.5억 규모 공사 계약 체결\n", + "[이데일리 원다연 기자] CNT85(056730)는 테크로스워터앤에너지와 156억 5000만원 규모의 기흥 SDR 그린센터 오수처리시설 기계배관 공사 계약을 체결했다고 3일 공시했다.이는 최근 매출액 대비 48.78%에 해당한다. 계약 기간은 지난 30일부터 내년 12월 31일까지다.\n", + "['일리', '원다연', 'CNT85', '056730', '테크로스워터앤에너지', '156억 5000', '기흥', 'SDR 그린센터', '48 . 78 %']\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# title 벡터화\n", + "title_emb = model.encode(title)\n", + "# text 벡터화\n", + "doc_emb = model.encode(text)\n", + "# words 백터화\n", + "word_emb = model.encode(words)\n", + "# print(doc_emb.shape)\n", + "# print(word_emb.shape)" + ], + "metadata": { + "id": "l0MxvjSst3P8" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# 코사인 유사도 측정\n", + "title_word_dists = cosine_distances([title_emb], word_emb).flatten()\n", + "text_word_dists = cosine_distances([doc_emb], word_emb).flatten()\n", + "print('title과 text의 cosine distance: ',cosine_distances([doc_emb], [title_emb]).flatten())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ZO7J0ZlTyDNq", + "outputId": "df325d5f-63be-4ed5-8944-9a49562fd036" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "title과 text의 cosine distance: [0.36870557]\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "text_word_dists" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VMuNJeyiKK43", + "outputId": "5f00413e-1b0d-4178-8919-6923a94da41b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([0.87537664, 0.82498133, 0.5951872 , 0.6734893 , 0.49724144,\n", + " 0.6993714 , 0.6877056 , 0.6774784 , 0.71606404], dtype=float32)" + ] + }, + "metadata": {}, + "execution_count": 72 + } + ] + }, + { + "cell_type": "code", + "source": [ + "print('title과 words의 cosine distance')\n", + "for i in np.argsort(title_word_dists):\n", + " print(words[i],title_word_dists[i])" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ZP9idZW_yDKl", + "outputId": "bffb2575-50d8-4db0-fe82-6862245ae5a9" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "title과 words의 cosine distance\n", + "CNT85 0.36422163\n", + "156억 5000 0.5453429\n", + "테크로스워터앤에너지 0.58205175\n", + "056730 0.6712269\n", + "SDR 그린센터 0.7803867\n", + "원다연 0.8208597\n", + "기흥 0.82504976\n", + "일리 0.8513015\n", + "48 . 78 % 0.97520405\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "print('text과 words의 cosine distance')\n", + "for i in np.argsort(text_word_dists):\n", + " print(words[i],text_word_dists[i])" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "GGaUCZvWw2DM", + "outputId": "5c954ed0-7070-4714-d2dd-5a81248ad187" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "text과 words의 cosine distance\n", + "테크로스워터앤에너지 0.49724144\n", + "CNT85 0.5951872\n", + "056730 0.6734893\n", + "SDR 그린센터 0.6774784\n", + "기흥 0.6877056\n", + "156억 5000 0.6993714\n", + "48 . 78 % 0.71606404\n", + "원다연 0.82498133\n", + "일리 0.87537664\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Score 계산" + ], + "metadata": { + "id": "sIFjWEeGfKDw" + } + }, + { + "cell_type": "code", + "source": [ + "# score 구하기 (임시)\n", + "score = 0.6 * (1 - title_word_dists) + 0.4 * (1 - text_word_dists)\n", + "score" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "MIPArmgdKdD3", + "outputId": "2d242fc8-e6a2-4af6-d1ec-b4ac62053994" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([0.13906845, 0.17749166, 0.5433922 , 0.32786816, 0.4518724 ,\n", + " 0.3930457 , 0.22988792, 0.26077664, 0.12845196], dtype=float32)" + ] + }, + "metadata": {}, + "execution_count": 79 + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(list(score))\n", + "np.argsort(score)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SUYEYhvVLpNH", + "outputId": "43485f27-9b25-47b6-ffa8-b780095f3045" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[0.13906845, 0.17749166, 0.5433922, 0.32786816, 0.4518724, 0.3930457, 0.22988792, 0.26077664, 0.12845196]\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([8, 0, 1, 6, 7, 3, 5, 4, 2])" + ] + }, + "metadata": {}, + "execution_count": 86 + } + ] + }, + { + "cell_type": "code", + "source": [ + "top_k = 3\n", + "top_words = []\n", + "for i in np.argsort(-score)[:top_k]:\n", + " top_words.append()\n", + " print(i, words[i], 'score :',score[i], 'title score :', 1 - title_word_dists[i], 'text score :', 1 - text_word_dists[i])" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SYzgrLMbKaNg", + "outputId": "03928fd4-f28c-4621-a1d5-c7eb8899397c" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "2 CNT85 score : 0.5433922 title score : 0.6357783675193787 text score : 0.4048128128051758\n", + "4 테크로스워터앤에너지 score : 0.4518724 title score : 0.41794824600219727 text score : 0.5027585625648499\n", + "5 156억 5000 score : 0.3930457 title score : 0.45465707778930664 text score : 0.3006286025047302\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(title)\n", + "text" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 72 + }, + "id": "E_KCOQKowB-Q", + "outputId": "676655e0-90c8-49ad-ce59-bd6baf5d7d7f" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "CNT85, 156.5억 규모 공사 계약 체결\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'[이데일리 원다연 기자] CNT85(056730)는 테크로스워터앤에너지와 156억 5000만원 규모의 기흥 SDR 그린센터 오수처리시설 기계배관 공사 계약을 체결했다고 3일 공시했다.이는 최근 매출액 대비 48.78%에 해당한다. 계약 기간은 지난 30일부터 내년 12월 31일까지다.'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 91 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result['word'].index()" + ], + "metadata": { + "id": "QY-vX00vNLyM" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " todo : 유사도 threshold로 word filtering\n", + "'''" + ], + "metadata": { + "id": "BOdvOz985F71" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "eNzZI4yd5Ftc" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### 키워드 빈도수 계산" + ], + "metadata": { + "id": "2ehFBbv_4pL-" + } + }, + { + "cell_type": "code", + "source": [ + "word_counts = {}\n", + "for word in words:\n", + " count = text.count(word)\n", + " word_counts[word] = count" + ], + "metadata": { + "id": "0J1zc7eM4omG" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "word_counts" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nINedIBL4QeH", + "outputId": "07c2a191-5da0-43a6-9714-de1ed241653b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'챗': 1,\n", + " '등': 1,\n", + " '출현': 1,\n", + " '미국 반도체 업체 엔비디아 주가': 1,\n", + " '연일': 1,\n", + " '행진': 1,\n", + " '어가': 1,\n", + " '차기': 1,\n", + " '혜주': 1,\n", + " '관심': 1}" + ] + }, + "metadata": {}, + "execution_count": 33 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "8ojvYDaJ4ZPk" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " todo :\n", + " 1. 뉴스 제목과 word의 유사도 측정\n", + " 2. 빈도수, 제목과 유사성, 본문과 유사성 등 을 합쳐 점수 계산\n", + " (option) 기사 간 키워드 클러스터링 해서 filtering\n", + "'''" + ], + "metadata": { + "id": "oOFahDC94CbE" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "vpTWM1jz4C0h" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "WIdcILnO4DIS" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " todo : option\n", + " 급상승 키워드 재순위화\n", + "'''" + ], + "metadata": { + "id": "4rrtsYJOyDCp" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "N-vrylfxt3Mr" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "_-m4zal0t3J_" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + "나중에 참고용\n", + "elastric search 도입 참고용\n", + "https://www.lesstif.com/dbms/elastic-search-nori-80248960.html\n", + "'''" + ], + "metadata": { + "id": "sHsULSEyt3GK" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "8lWwifjxt3DB" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file From d6076d823c34d5dfe9e14009b061ab47446ad1f9 Mon Sep 17 00:00:00 2001 From: Yungi Date: Fri, 14 Jul 2023 14:20:56 +0900 Subject: [PATCH 09/63] [Feature] Add labeling Code - Add Bard API labeling Code - Add GPT API labeling Code --- labeling/__init__.py | 2 ++ labeling/bard_api.py | 0 labeling/gpt_api.py | 0 3 files changed, 2 insertions(+) create mode 100644 labeling/__init__.py create mode 100644 labeling/bard_api.py create mode 100644 labeling/gpt_api.py diff --git a/labeling/__init__.py b/labeling/__init__.py new file mode 100644 index 0000000..5473bfc --- /dev/null +++ b/labeling/__init__.py @@ -0,0 +1,2 @@ +from .bard_api import * +from .gpt_api import * \ No newline at end of file diff --git a/labeling/bard_api.py b/labeling/bard_api.py new file mode 100644 index 0000000..e69de29 diff --git a/labeling/gpt_api.py b/labeling/gpt_api.py new file mode 100644 index 0000000..e69de29 From 82e70284d9112c1bbbac0219e59917a2c68b9afc Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Fri, 14 Jul 2023 18:35:02 +0900 Subject: [PATCH 10/63] [Feature] Create GPT API labeling base code --- labeling/gpt_api.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/labeling/gpt_api.py b/labeling/gpt_api.py index e69de29..baa031f 100644 --- a/labeling/gpt_api.py +++ b/labeling/gpt_api.py @@ -0,0 +1,43 @@ +import os +import openai + +def get_completion(prompt, model="gpt-3.5-turbo"): + messages = [{"role": "user", "content": prompt}] + + response = openai.ChatCompletion.create( + model=model, + messages=messages, + temperature=0, + ) + + return response.choices[0].message["content"] + +def get_label(news: str) -> str: + key = os.environ['OPENAPI_KEY'] + openai.api_key = key + + prompt = f'''### 역할: + 너는 어느 증권사 재무팀에서 일하고 있는 애널리스트야. 너의 주 업무는 뉴스 기사를 보고 해당 기사가 "긍정" 혹은 "부정"인지 라벨링 하는 것이야. 이때 아래의 규칙을 따라야해. + + ### 규칙: + 1. 주어진 기사에 대해 하나의 ["긍정", "부정"]만을 선택하여 라벨링한다. + 2. 기사는 "### 기사:" 부분부터 시작된다. + 3. 출력은 "### 출력"와 같이 json 형식으로 출력한다. + 4. 라벨링은 기사 전문에 대해서 라벨링한다. + 5. 중립은 선택지에 없다. + + ### 출력 + {{"label": "긍정", "reason": "새로운 투자 유치로 인해 해당 기업의 전망이 밝을것으로 예측된다. "}} + + ## 기사: + {news}''' + + response = get_completion(prompt) + return response + +if __name__ == "__main__": + news = """ +7일 삼성전자 시작으로 2분기 어닝시즌 돌입 삼성전자 20 평균 예상 영업이익은 2693억원 수준 9000억원 예상한 증권사부터 8200억원 손실 전망도 "업황 개선에 대한 시선은 동일...비중 확대 이데일리 김인경 기자) 2분기 어닝시즌의 첫 테이프를 끊는 삼성전자(005930)의 실적발표가 다가오는 가운데 증권가가 '반도체 업황 개선 속도'를 놓고 논쟁을 하고 있다. 2분기가 다 지난 시점에 삼성전자가 9000억원을 벌어들였을 것이라 추정하는 곳이 있는가 하면 8200억원의 영업손실을 봤을 것이라는 전망도 나오고 있다. 시장에선 2조원 가까운 전망 치 차이가 당황스럽다는 입장이다. [이데일리 김정훈 기자120 영업익 평균은 2700억원.. 9000억원 기대도4일 마켓포인트에 따르면 삼성전자는 이날 전 거래일과 같은 7만3000원에 거래를 마쳤다. 다만 장 중 7만3600원까지 오르며 연중 최고가를 기록하기도 했다. 삼성전자는 오는 7일 2분기 잠정 실적을 발표한다. 증권정보업체 에프앤가이드에 따르면 연결기준 삼성전자의 2분기 매출액은 전년 동기보다 19.89% 감소한 61조8512억원, 영업이익은 같은 기간 98.09% 줄어든 2693억원 수준으로 추정된다. 하지만 내용을 뜯어보면 실적을 가능하기 어 렵다는 얘기가 나온다. 2분기 중반 무렵인 5월 15일 이후 증권사 13곳이 삼성전자의 2분기 영업이익을 제시했는데, 가장 높은 수준을 전망한 곳은 KB증권(9000억원)이다. KB증권은 고대역폭메모리(HBIM) 시장이 삼성전자의 어닝 서프라이즈를 이끌 것으로 봤다. 시장조사기 관인 트렌드포스에 따르면 2023년 HBM 시장 점유율은 SK하이닉스 53%, 삼성전자 38%, 마이크론 9% 수준이다. 이에 따라 HBM의 폭발적인 성장은 고스란히 한국 반도체업체의 수익으로 이어질 것이란 얘기다. 김동원 KB증권 연구원은 “메모리 반도체 업황이 바닥을 통과 하고 있는 가운데 실적은 이미 1분기에 바닥을 친 것으로 평가된다”면서 "한국 메모리 반도체 업체가 연 평균 45% 성장하는 HIBM 시장의 90%를 차지하면서 삼성전자의 2분기 영업이익 역시 시장 평균 기대치의 4배를 상회할 것이라고 기대했다. 삼성증권 역시 삼성전자가 2 분기 7030억원의 영업익을 남겼을 것이라고 기대했다. 앞서 미국 반도체 기업 마이크론이 호실적을 낸 만큼, 삼성전자도 깜짝실적을 낼 수 있다는 이유에서다. 마이크론은 지난달 28일(현지시간) 올해 3-5월 매출이 37억5200만달러(약 4조9300억원)를 기록했다고 밝혔다. 월가 전망치인 36억5000만 달러(약 4조8000억원)를 웃도는 수준이다. 황민성 삼성증권 연구원은 "마이크론 실적은 삼성전자나 SK하이닉스도 2분기 시장 기대치를 웃도는 실적을 낼 것임을 시사한다"고 평가했다. 이 외에도 키움증권(6340억원), SK증권(5000억원), 유진투자증권(3000억원) 등이 증권사 평균보다 훨씬 높은 2분기 영업이익을 내다봤다 적자 우려 증권사도 여전.."업황 개선 기대는 동일"하지만 일각에선 •적자 가능성도 제기하고 있다. 신한투자증권과 BNK투자증권은 삼성전자가 2분기 각각 2270억원, 8200억원의 영업손실을 냈을 것으 로 예상하고 있다. 이민희 BNK투자증권 연구원은 "D램 실적이 소폭 상향됐지만 모바일 수요 악화 영향이 2분기에도 지속됐다"면서 비메모리 매출 부진으로 파운드리 부문도 2분기에는 적자 전환이 예상되고, 스마트폰의 경우 출하 감소 등으로 두 자릿수 영업이익률을 유지 할 수 있을 지가 불투명하다고 지적했다. 다만 2분기 실적에 대한 시선은 엇갈려도 반도체 업황이 점차 개선될 것이라는 전망은 모두 동일하다. 김선우 메리츠증권 연구원은 "HBM과 차세대 후공정 등 신기술 도입이 본격화하고, 미 중 반도체 갈등 우려도 사실상 고점을 지나고 있다고 강조했다. 삼성전자가 최근 한 달 동안 2.96% 오르며 코스피의 상승률(0.94%)을 상회한 만큼, 실적과 별개로 주가는 소강상태를 맞을 것이란 전망도 있다. 김록호 하나증권 연구원은 "최근 한 달 사이 급등했던 만큼 주가는 잠시 쉬어가는 흐름을 보일 수도 있다" 면서도 +42분기 D램 업계의 재고가 피크아웃되는 흐름 속에 삼성전자 비중확대 전략은 유효할 것"이라라고 조언했다. +""" + print(get_label(news)) \ No newline at end of file From fd9e16bf02ea34b01ce76d06e2708b5430026c74 Mon Sep 17 00:00:00 2001 From: limha Date: Sat, 15 Jul 2023 07:16:33 +0000 Subject: [PATCH 11/63] [Feature] preprocessing crwaling data new file: sentence-sentimental/preprocess/main.py new file: sentence-sentimental/preprocess/preprocessing.py --- sentence-sentimental/preprocess/main.py | 15 ++ .../preprocess/preprocessing.py | 162 ++++++++++++++++++ 2 files changed, 177 insertions(+) create mode 100644 sentence-sentimental/preprocess/main.py create mode 100644 sentence-sentimental/preprocess/preprocessing.py diff --git a/sentence-sentimental/preprocess/main.py b/sentence-sentimental/preprocess/main.py new file mode 100644 index 0000000..be67cd2 --- /dev/null +++ b/sentence-sentimental/preprocess/main.py @@ -0,0 +1,15 @@ +from preprocessing import * +import pandas as pd + +if __name__ == '__main__' : + df = pd.read_csv("/opt/ml/finance_sentiment_corpus/뉴스_corpus.csv") + + df = df[['title', 'date', 'content']] + + # corpus + df = preprocess_dataframe(df) + df.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_data.csv") + + # sentence + df_sentence = preprocess_dataframe_to_sentence(df) + df_sentence.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_sentence_data.csv") \ No newline at end of file diff --git a/sentence-sentimental/preprocess/preprocessing.py b/sentence-sentimental/preprocess/preprocessing.py new file mode 100644 index 0000000..b813a8a --- /dev/null +++ b/sentence-sentimental/preprocess/preprocessing.py @@ -0,0 +1,162 @@ +import re +import pandas as pd + +def remove_text(texts) : + pattern = r"\*? ?재판매 및 DB 금지" + + preprocessed_text = '' + + text = re.sub(pattern, "", texts).strip() + if text: + preprocessed_text = text + + return preprocessed_text + + +def remove_press(texts): + """ + 언론 정보를 제거 + -> ~~ 기자 (연합뉴스) + -> (서울=연합뉴스) ~~ 특파원 + """ + re_patterns = [ + r"\([^(]*?(뉴스|경제|일보|미디어|데일리|한겨례|타임즈|위키트리)\)", + r"[가-힣]{0,4} (기자|선임기자|수습기자|특파원|객원기자|논설고문|통신원|연구소장) =?", # 이름 + 기자 + r"[가-힣]{1,}(뉴스|경제|일보|미디어|데일리|한겨례|타임|위키트리)", # (... 연합뉴스) .. + r"[\(\[]\s+[\)\]]", # ( ) + r"[\(\[]=\s+[\)\]]", # (= ) + r"[\)\]]\s+=[\)\]]", # ( =) + ] + + preprocessed_text = '' + for re_pattern in re_patterns : + text = re.sub(re_pattern, "", str(texts)) + if text : + preprocessed_text = text + + return preprocessed_text + +def remove_photo_info(texts): + ## 수정 필요 + """ + 뉴스의 이미지 설명 대한 label 제거 + """ + preprocessed_text = [] + + preprocessed_text = re.sub(r"\(출처 ?= ?.+\) |\(사진 ?= ?.+\) |\(자료 ?= ?.+\)| \(자료사진\) |사진=.+기자 ", "", texts).strip() + preprocessed_text = re.sub(r"\/사진제공?=\S+?\s+ | \/\s사진?=", " ", preprocessed_text) + + return preprocessed_text + +def change_quotation(texts) : + pattern = r"\"" + replacement = "\'" + + processed_text = re.sub(pattern, replacement, texts) + + return processed_text + +def remove_email(texts): + """ + 이메일을 제거 + """ + preprocessed_text = '' + + text = re.sub(r"[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+", "", texts).strip() + if text: + preprocessed_text = text + + return preprocessed_text + +def remove_day(texts): + """ + 날짜와 관련된 숫자 제거 + """ + pattern = r'\d{4}\.\d{2}\.\d{2}' + + text = re.sub(pattern, "", texts) + return text + +def remove_triangle(texts): + pattern = r'▶?\s.+=' + + text = re.sub(pattern, "", texts) + return text + +def remove_parentheses(texts): + """ + 괄호와 그 안에 있는 내용들을 제거 + """ + pattern = r'[\(\[][^(^[]*[\)\]]' + + processed_text = re.sub(pattern, '', texts) + + return processed_text + +def split_sentence(texts) : + sentence_list = texts.split(". ") + + return sentence_list + +# 혹시 필요한 것들 모음 +def remove_hashtag(texts): + """ + 해쉬태그(#)를 제거합니다. + """ + preprocessed_text = '' + + text = re.sub(r"#\S+", "", texts).strip() + if text: + preprocessed_text = text + + return preprocessed_text + +def remove_url(texts): + """ + URL을 제거합니다. + 주소: www.naver.com`` -> 주소: + """ + preprocessed_text = '' + + text = re.sub(r"(http|https)?:\/\/\S+\b|www\.(\w+\.)+\S*", "", texts).strip() + text = re.sub(r"pic\.(\w+\.)+\S*", "", texts).strip() + + preprocessed_text = text + + return preprocessed_text + +def all_preprocessing(texts) : + # texts = remove_text(texts) + texts = remove_press(texts) + texts = remove_photo_info(texts) + texts = remove_url(texts) + + return texts + +def preprocess_dataframe(df): + df['content_corpus'] = df['content'].apply(all_preprocessing) + + return df + +def preprocess_dataframe_to_sentence(df): + df_sentence = pd.DataFrame(columns=['title', 'date', 'content_sentence']) + + for index, row in df.iterrows(): + title = row['title'] + date = row['date'] + content = row['content_sentence'] + + content = split_sentence(content) + + for sentence in content: + l = len(df_sentence) + new_row = {'title': title, 'date': date, 'content_sentence': sentence} + + new_row = pd.DataFrame(new_row, index = [l]) + df_sentence = pd.concat([df_sentence, new_row], axis = 0) + + return df_sentence + +if __name__ == "__main__" : + text = '여기에 넣고 싶은 문구를 넣어서 실험해보세요.' + print(text) \ No newline at end of file From d5d5fe36a03cc1b300820898063a4f5263505921 Mon Sep 17 00:00:00 2001 From: limha Date: Sat, 15 Jul 2023 07:56:31 +0000 Subject: [PATCH 12/63] [Feature] fix bug modified: sentence-sentimental/preprocess/main.py modified: sentence-sentimental/preprocess/preprocessing.py --- sentence-sentimental/preprocess/main.py | 4 ++- .../preprocess/preprocessing.py | 34 ++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/sentence-sentimental/preprocess/main.py b/sentence-sentimental/preprocess/main.py index be67cd2..2f5b679 100644 --- a/sentence-sentimental/preprocess/main.py +++ b/sentence-sentimental/preprocess/main.py @@ -12,4 +12,6 @@ # sentence df_sentence = preprocess_dataframe_to_sentence(df) - df_sentence.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_sentence_data.csv") \ No newline at end of file + df_sentence.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_sentence_data.csv") + + print("완료! ml/finance_sentiment_corpus/ 에서 data를 확인해보세요!") \ No newline at end of file diff --git a/sentence-sentimental/preprocess/preprocessing.py b/sentence-sentimental/preprocess/preprocessing.py index b813a8a..9e51ce3 100644 --- a/sentence-sentimental/preprocess/preprocessing.py +++ b/sentence-sentimental/preprocess/preprocessing.py @@ -11,8 +11,7 @@ def remove_text(texts) : preprocessed_text = text return preprocessed_text - - + def remove_press(texts): """ 언론 정보를 제거 @@ -93,6 +92,23 @@ def remove_parentheses(texts): return processed_text +def remove_copyright(texts): + """ + 뉴스 내 포함된 저작권 관련 텍스트를 제거합니다. + """ + re_patterns = [ + r"\<저작권자(\(c\)|ⓒ|©|\(Copyright\)|(\(c\))|(\(C\))).+?\>", + r"저작권자\(c\)|ⓒ|©|(Copyright)|(\(c\))|(\(C\))" + ] + preprocessed_text = '' + + for re_pattern in re_patterns : + text = re.sub(re_pattern, "", texts) + if text: + preprocessed_text = text + + return preprocessed_text + def split_sentence(texts) : sentence_list = texts.split(". ") @@ -126,10 +142,17 @@ def remove_url(texts): return preprocessed_text def all_preprocessing(texts) : - # texts = remove_text(texts) + texts = remove_text(texts) texts = remove_press(texts) texts = remove_photo_info(texts) - texts = remove_url(texts) + texts = remove_email(texts) + texts = remove_copyright(texts) + texts = remove_day(texts) + texts = remove_triangle(texts) + texts = remove_parentheses(texts) + texts = remove_copyright(texts) + + texts = change_quotation(texts) return texts @@ -144,12 +167,13 @@ def preprocess_dataframe_to_sentence(df): for index, row in df.iterrows(): title = row['title'] date = row['date'] - content = row['content_sentence'] + content = row['content'] content = split_sentence(content) for sentence in content: l = len(df_sentence) + sentence = all_preprocessing(sentence) new_row = {'title': title, 'date': date, 'content_sentence': sentence} new_row = pd.DataFrame(new_row, index = [l]) From a53962dac7889a9fa28793512cae5f439c9b4e81 Mon Sep 17 00:00:00 2001 From: lig96 Date: Sun, 16 Jul 2023 17:17:20 +0000 Subject: [PATCH 13/63] [Feature] Support longer texts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 512 토큰 이상의 문장들에 대해서도 토크나이저가 학습할 수 있게 합니다. --- sentence-sentimental/dataset/datasets.py | 5 +- sentence-sentimental/train.py | 61 ++++++++++++++++++------ 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/sentence-sentimental/dataset/datasets.py b/sentence-sentimental/dataset/datasets.py index 8cf0252..00c401e 100644 --- a/sentence-sentimental/dataset/datasets.py +++ b/sentence-sentimental/dataset/datasets.py @@ -4,8 +4,9 @@ class SentimentalDataset(Dataset): def __init__(self, encodings, labels): self.encoding = encodings - self.labels = labels - + self.labels = labels[self.encoding['overflow_to_sample_mapping'].tolist()].reset_index(drop=True) + # 여러 개로 나뉜 문장에 대해 1개의 라벨을 매핑해줍니다. + def __getitem__(self, idx): data = {key: val[idx] for key, val in self.encoding.items()} data['labels'] = torch.tensor(self.labels[idx]).long() diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py index 9ca908e..9c8f660 100644 --- a/sentence-sentimental/train.py +++ b/sentence-sentimental/train.py @@ -42,15 +42,28 @@ def train() : random_state=SEED) sentence_train, sentence_val, label_train, label_val = temp + max_length=30 + stride=0 + ## TODO 임의의 값으로 차후 수정 train_encoding = tokenizer(sentence_train.tolist(), return_tensors='pt', padding=True, - truncation=True + truncation=True, + ## + max_length=max_length, + stride=stride, + return_overflowing_tokens=True, + return_offsets_mapping=False ) val_encoding = tokenizer(sentence_val.tolist(), return_tensors='pt', padding=True, - truncation=True + truncation=True, + ## + max_length=max_length, + stride=stride, + return_overflowing_tokens=True, + return_offsets_mapping=False ) train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True)) val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True)) @@ -59,7 +72,12 @@ def train() : val2_encoding = tokenizer(data2['kor_sentence'].tolist(), return_tensors='pt', padding=True, - truncation=True + truncation=True, + ## + max_length=max_length, + stride=stride, + return_overflowing_tokens=True, + return_offsets_mapping=False ) val2_set = SentimentalDataset(val2_encoding, data2['labels']) @@ -92,25 +110,38 @@ def train() : print('---test evaluate start---') trainer.evaluate(eval_dataset=val2_set, metric_key_prefix='val2') - print('---inference start---') ## 추론 방법 1 - model = model.to('cpu') ## 주의 - my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' - classifier = pipeline("sentiment-analysis", model=model, - tokenizer=tokenizer) - inference_output = classifier(my_text) - print(inference_output) - # [{'label': 'LABEL_2', 'score': 0.8627877831459045}] + # print('---inference start---') ## 추론 방법 1 + # model = model.to('cpu') ## 주의 + # my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' + # classifier = pipeline("sentiment-analysis", model=model, + # tokenizer=tokenizer) + # inference_output = classifier(my_text) + # print(inference_output) + # # [{'label': 'LABEL_2', 'score': 0.8627877831459045}] print('---inference start---') ## 추론 방법 2 - my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' + my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯'*10 + model = model.to('cpu') model.eval() with torch.no_grad() : temp = tokenizer( my_text, return_tensors='pt', padding=True, - truncation=True + truncation=True, + ## + max_length=max_length, + stride=stride, + return_overflowing_tokens=True, + return_offsets_mapping=False ) + temp = { + 'input_ids':temp['input_ids'], + 'token_type_ids':temp['token_type_ids'], + 'attention_mask':temp['attention_mask'], + } predicted_label = model(**temp) - print(torch.nn.Softmax(dim=-1)(predicted_label.logits)) - # tensor([[0.0108, 0.1264, 0.8628]]) \ No newline at end of file + print(torch.nn.Softmax(dim=-1)(predicted_label.logits).mean(dim=0)) + # tensor([[0.0108, 0.1264, 0.8628]]) +if __name__ == '__main__': + train() \ No newline at end of file From 48386322aff97b5a1219424266f3b7ef63c17545 Mon Sep 17 00:00:00 2001 From: limha Date: Sat, 15 Jul 2023 07:56:31 +0000 Subject: [PATCH 14/63] [Feature] fix bug modified: sentence-sentimental/preprocess/main.py modified: sentence-sentimental/preprocess/preprocessing.py [Cherry-pick] Cherry pick from d5d5fe - Cherry pick from d5d5fe for preprocessing. --- sentence-sentimental/preprocess/main.py | 17 ++ .../preprocess/preprocessing.py | 186 ++++++++++++++++++ 2 files changed, 203 insertions(+) create mode 100644 sentence-sentimental/preprocess/main.py create mode 100644 sentence-sentimental/preprocess/preprocessing.py diff --git a/sentence-sentimental/preprocess/main.py b/sentence-sentimental/preprocess/main.py new file mode 100644 index 0000000..2f5b679 --- /dev/null +++ b/sentence-sentimental/preprocess/main.py @@ -0,0 +1,17 @@ +from preprocessing import * +import pandas as pd + +if __name__ == '__main__' : + df = pd.read_csv("/opt/ml/finance_sentiment_corpus/뉴스_corpus.csv") + + df = df[['title', 'date', 'content']] + + # corpus + df = preprocess_dataframe(df) + df.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_data.csv") + + # sentence + df_sentence = preprocess_dataframe_to_sentence(df) + df_sentence.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_sentence_data.csv") + + print("완료! ml/finance_sentiment_corpus/ 에서 data를 확인해보세요!") \ No newline at end of file diff --git a/sentence-sentimental/preprocess/preprocessing.py b/sentence-sentimental/preprocess/preprocessing.py new file mode 100644 index 0000000..9e51ce3 --- /dev/null +++ b/sentence-sentimental/preprocess/preprocessing.py @@ -0,0 +1,186 @@ +import re +import pandas as pd + +def remove_text(texts) : + pattern = r"\*? ?재판매 및 DB 금지" + + preprocessed_text = '' + + text = re.sub(pattern, "", texts).strip() + if text: + preprocessed_text = text + + return preprocessed_text + +def remove_press(texts): + """ + 언론 정보를 제거 + -> ~~ 기자 (연합뉴스) + -> (서울=연합뉴스) ~~ 특파원 + """ + re_patterns = [ + r"\([^(]*?(뉴스|경제|일보|미디어|데일리|한겨례|타임즈|위키트리)\)", + r"[가-힣]{0,4} (기자|선임기자|수습기자|특파원|객원기자|논설고문|통신원|연구소장) =?", # 이름 + 기자 + r"[가-힣]{1,}(뉴스|경제|일보|미디어|데일리|한겨례|타임|위키트리)", # (... 연합뉴스) .. + r"[\(\[]\s+[\)\]]", # ( ) + r"[\(\[]=\s+[\)\]]", # (= ) + r"[\)\]]\s+=[\)\]]", # ( =) + ] + + preprocessed_text = '' + for re_pattern in re_patterns : + text = re.sub(re_pattern, "", str(texts)) + if text : + preprocessed_text = text + + return preprocessed_text + +def remove_photo_info(texts): + ## 수정 필요 + """ + 뉴스의 이미지 설명 대한 label 제거 + """ + preprocessed_text = [] + + preprocessed_text = re.sub(r"\(출처 ?= ?.+\) |\(사진 ?= ?.+\) |\(자료 ?= ?.+\)| \(자료사진\) |사진=.+기자 ", "", texts).strip() + preprocessed_text = re.sub(r"\/사진제공?=\S+?\s+ | \/\s사진?=", " ", preprocessed_text) + + return preprocessed_text + +def change_quotation(texts) : + pattern = r"\"" + replacement = "\'" + + processed_text = re.sub(pattern, replacement, texts) + + return processed_text + +def remove_email(texts): + """ + 이메일을 제거 + """ + preprocessed_text = '' + + text = re.sub(r"[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+", "", texts).strip() + if text: + preprocessed_text = text + + return preprocessed_text + +def remove_day(texts): + """ + 날짜와 관련된 숫자 제거 + """ + pattern = r'\d{4}\.\d{2}\.\d{2}' + + text = re.sub(pattern, "", texts) + return text + +def remove_triangle(texts): + pattern = r'▶?\s.+=' + + text = re.sub(pattern, "", texts) + return text + +def remove_parentheses(texts): + """ + 괄호와 그 안에 있는 내용들을 제거 + """ + pattern = r'[\(\[][^(^[]*[\)\]]' + + processed_text = re.sub(pattern, '', texts) + + return processed_text + +def remove_copyright(texts): + """ + 뉴스 내 포함된 저작권 관련 텍스트를 제거합니다. + """ + re_patterns = [ + r"\<저작권자(\(c\)|ⓒ|©|\(Copyright\)|(\(c\))|(\(C\))).+?\>", + r"저작권자\(c\)|ⓒ|©|(Copyright)|(\(c\))|(\(C\))" + ] + preprocessed_text = '' + + for re_pattern in re_patterns : + text = re.sub(re_pattern, "", texts) + if text: + preprocessed_text = text + + return preprocessed_text + +def split_sentence(texts) : + sentence_list = texts.split(". ") + + return sentence_list + +# 혹시 필요한 것들 모음 +def remove_hashtag(texts): + """ + 해쉬태그(#)를 제거합니다. + """ + preprocessed_text = '' + + text = re.sub(r"#\S+", "", texts).strip() + if text: + preprocessed_text = text + + return preprocessed_text + +def remove_url(texts): + """ + URL을 제거합니다. + 주소: www.naver.com`` -> 주소: + """ + preprocessed_text = '' + + text = re.sub(r"(http|https)?:\/\/\S+\b|www\.(\w+\.)+\S*", "", texts).strip() + text = re.sub(r"pic\.(\w+\.)+\S*", "", texts).strip() + + preprocessed_text = text + + return preprocessed_text + +def all_preprocessing(texts) : + texts = remove_text(texts) + texts = remove_press(texts) + texts = remove_photo_info(texts) + texts = remove_email(texts) + texts = remove_copyright(texts) + texts = remove_day(texts) + texts = remove_triangle(texts) + texts = remove_parentheses(texts) + texts = remove_copyright(texts) + + texts = change_quotation(texts) + + return texts + +def preprocess_dataframe(df): + df['content_corpus'] = df['content'].apply(all_preprocessing) + + return df + +def preprocess_dataframe_to_sentence(df): + df_sentence = pd.DataFrame(columns=['title', 'date', 'content_sentence']) + + for index, row in df.iterrows(): + title = row['title'] + date = row['date'] + content = row['content'] + + content = split_sentence(content) + + for sentence in content: + l = len(df_sentence) + sentence = all_preprocessing(sentence) + new_row = {'title': title, 'date': date, 'content_sentence': sentence} + + new_row = pd.DataFrame(new_row, index = [l]) + df_sentence = pd.concat([df_sentence, new_row], axis = 0) + + return df_sentence + +if __name__ == "__main__" : + text = '여기에 넣고 싶은 문구를 넣어서 실험해보세요.' + print(text) \ No newline at end of file From 39c473ea8845969101304395d75155df3e7d4a18 Mon Sep 17 00:00:00 2001 From: Yungi Date: Mon, 17 Jul 2023 11:10:54 +0900 Subject: [PATCH 15/63] [Docs] Add KeyWord Extraction Notebook --- Notebooks/KeyWord Extraction.ipynb | 356 +++++++++++++++++++++++++++++ 1 file changed, 356 insertions(+) create mode 100644 Notebooks/KeyWord Extraction.ipynb diff --git a/Notebooks/KeyWord Extraction.ipynb b/Notebooks/KeyWord Extraction.ipynb new file mode 100644 index 0000000..a2af4ad --- /dev/null +++ b/Notebooks/KeyWord Extraction.ipynb @@ -0,0 +1,356 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import os\n", + "\n", + "from pathlib import Path\n", + "from transformers import AutoModel, AutoTokenizer\n", + "from konlpy.tag import Mecab" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "outputs": [], + "source": [ + "news_path = Path.cwd().parent.joinpath(\"Data\", \"News\")" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 5, + "outputs": [], + "source": [ + "news = pd.DataFrame()\n", + "for news_code in os.listdir(news_path):\n", + "\tload_news = pd.read_csv(Path.joinpath(news_path, news_code))\n", + "\tload_news = load_news.dropna()\n", + "\tnews = pd.concat([news, load_news])\n", + "news = news.reset_index(drop=True)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 6, + "outputs": [ + { + "data": { + "text/plain": " company title \\\n7493 삼성전자 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... \n7494 삼성전자 LS일렉트릭, 텍사스 공장 짓는다…현지 삼성·SK·LG 전력 지원 \n7495 삼성전자 “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 \n7496 삼성전자 SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 \n7497 삼성전자 ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 \n... ... ... \n9521 삼성전자 엔비디아 폭등에…삼성전자·SK하이닉스 동반 강세 \n9522 삼성전자 \"7만전자 영차\"…삼성전자, 장초반 1% 이상 올라[특징주] \n9523 삼성전자 코스피, 외인 순매수 속 강보합…삼전 1%·하이닉스 3% 상승 \n9524 삼성전자 삼전·하이닉스 강세에 코스피도 상승 출발…외인 매수세 \n9525 삼성전자 반도체 반등 시작했나…삼성전자·SK하이닉스 연일 강세 \n\n link writer \\\n7493 https://finance.naver.com/item/news_read.naver... 조선비즈 \n7494 https://finance.naver.com/item/news_read.naver... 뉴스1 \n7495 https://finance.naver.com/item/news_read.naver... 매일경제 \n7496 https://finance.naver.com/item/news_read.naver... 뉴시스 \n7497 https://finance.naver.com/item/news_read.naver... 매경이코노미 \n... ... ... \n9521 https://finance.naver.com/item/news_read.naver... 뉴시스 \n9522 https://finance.naver.com/item/news_read.naver... 뉴스1 \n9523 https://finance.naver.com/item/news_read.naver... 한국경제 \n9524 https://finance.naver.com/item/news_read.naver... 머니투데이 \n9525 https://finance.naver.com/item/news_read.naver... 머니투데이 \n\n date content \n7493 2023.07.10 15:29 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... \n7494 2023.07.10 15:08 북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ... \n7495 2023.07.10 15:07 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... \n7496 2023.07.10 15:05 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (... \n7497 2023.07.10 14:58 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... \n... ... ... \n9521 2023.05.26 09:25 [서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간... \n9522 2023.05.26 09:19 경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김... \n9523 2023.05.26 09:16 지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외... \n9524 2023.05.26 09:15 /사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강... \n9525 2023.05.26 09:12 [특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉... \n\n[2033 rows x 6 columns]", + "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 \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 \n \n \n \n \n
companytitlelinkwriterdatecontent
7493삼성전자데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ...https://finance.naver.com/item/news_read.naver...조선비즈2023.07.10 15:29챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...
7494삼성전자LS일렉트릭, 텍사스 공장 짓는다…현지 삼성·SK·LG 전력 지원https://finance.naver.com/item/news_read.naver...뉴스12023.07.10 15:08북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ...
7495삼성전자“삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연https://finance.naver.com/item/news_read.naver...매일경제2023.07.10 15:07삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...
7496삼성전자SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급https://finance.naver.com/item/news_read.naver...뉴시스2023.07.10 15:05해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (...
7497삼성전자‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파https://finance.naver.com/item/news_read.naver...매경이코노미2023.07.10 14:58북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...
.....................
9521삼성전자엔비디아 폭등에…삼성전자·SK하이닉스 동반 강세https://finance.naver.com/item/news_read.naver...뉴시스2023.05.26 09:25[서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간...
9522삼성전자\"7만전자 영차\"…삼성전자, 장초반 1% 이상 올라[특징주]https://finance.naver.com/item/news_read.naver...뉴스12023.05.26 09:19경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김...
9523삼성전자코스피, 외인 순매수 속 강보합…삼전 1%·하이닉스 3% 상승https://finance.naver.com/item/news_read.naver...한국경제2023.05.26 09:16지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외...
9524삼성전자삼전·하이닉스 강세에 코스피도 상승 출발…외인 매수세https://finance.naver.com/item/news_read.naver...머니투데이2023.05.26 09:15/사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강...
9525삼성전자반도체 반등 시작했나…삼성전자·SK하이닉스 연일 강세https://finance.naver.com/item/news_read.naver...머니투데이2023.05.26 09:12[특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉...
\n

2033 rows × 6 columns

\n
" + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "news[news['company'] == \"삼성전자\"]" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 8, + "outputs": [ + { + "data": { + "text/plain": " company title \\\n7493 삼성전자 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... \n7494 삼성전자 LS일렉트릭, 텍사스 공장 짓는다…현지 삼성·SK·LG 전력 지원 \n7495 삼성전자 “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 \n7496 삼성전자 SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 \n7497 삼성전자 ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 \n... ... ... \n9521 삼성전자 엔비디아 폭등에…삼성전자·SK하이닉스 동반 강세 \n9522 삼성전자 \"7만전자 영차\"…삼성전자, 장초반 1% 이상 올라[특징주] \n9523 삼성전자 코스피, 외인 순매수 속 강보합…삼전 1%·하이닉스 3% 상승 \n9524 삼성전자 삼전·하이닉스 강세에 코스피도 상승 출발…외인 매수세 \n9525 삼성전자 반도체 반등 시작했나…삼성전자·SK하이닉스 연일 강세 \n\n link writer \\\n7493 https://finance.naver.com/item/news_read.naver... 조선비즈 \n7494 https://finance.naver.com/item/news_read.naver... 뉴스1 \n7495 https://finance.naver.com/item/news_read.naver... 매일경제 \n7496 https://finance.naver.com/item/news_read.naver... 뉴시스 \n7497 https://finance.naver.com/item/news_read.naver... 매경이코노미 \n... ... ... \n9521 https://finance.naver.com/item/news_read.naver... 뉴시스 \n9522 https://finance.naver.com/item/news_read.naver... 뉴스1 \n9523 https://finance.naver.com/item/news_read.naver... 한국경제 \n9524 https://finance.naver.com/item/news_read.naver... 머니투데이 \n9525 https://finance.naver.com/item/news_read.naver... 머니투데이 \n\n date content \n7493 2023.07.10 15:29 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... \n7494 2023.07.10 15:08 북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ... \n7495 2023.07.10 15:07 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... \n7496 2023.07.10 15:05 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (... \n7497 2023.07.10 14:58 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... \n... ... ... \n9521 2023.05.26 09:25 [서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간... \n9522 2023.05.26 09:19 경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김... \n9523 2023.05.26 09:16 지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외... \n9524 2023.05.26 09:15 /사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강... \n9525 2023.05.26 09:12 [특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉... \n\n[2008 rows x 6 columns]", + "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 \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 \n \n \n \n \n
companytitlelinkwriterdatecontent
7493삼성전자데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ...https://finance.naver.com/item/news_read.naver...조선비즈2023.07.10 15:29챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...
7494삼성전자LS일렉트릭, 텍사스 공장 짓는다…현지 삼성·SK·LG 전력 지원https://finance.naver.com/item/news_read.naver...뉴스12023.07.10 15:08북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ...
7495삼성전자“삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연https://finance.naver.com/item/news_read.naver...매일경제2023.07.10 15:07삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...
7496삼성전자SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급https://finance.naver.com/item/news_read.naver...뉴시스2023.07.10 15:05해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (...
7497삼성전자‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파https://finance.naver.com/item/news_read.naver...매경이코노미2023.07.10 14:58북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...
.....................
9521삼성전자엔비디아 폭등에…삼성전자·SK하이닉스 동반 강세https://finance.naver.com/item/news_read.naver...뉴시스2023.05.26 09:25[서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간...
9522삼성전자\"7만전자 영차\"…삼성전자, 장초반 1% 이상 올라[특징주]https://finance.naver.com/item/news_read.naver...뉴스12023.05.26 09:19경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김...
9523삼성전자코스피, 외인 순매수 속 강보합…삼전 1%·하이닉스 3% 상승https://finance.naver.com/item/news_read.naver...한국경제2023.05.26 09:16지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외...
9524삼성전자삼전·하이닉스 강세에 코스피도 상승 출발…외인 매수세https://finance.naver.com/item/news_read.naver...머니투데이2023.05.26 09:15/사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강...
9525삼성전자반도체 반등 시작했나…삼성전자·SK하이닉스 연일 강세https://finance.naver.com/item/news_read.naver...머니투데이2023.05.26 09:12[특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉...
\n

2008 rows × 6 columns

\n
" + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "news[news['company'] == \"삼성전자\"].drop_duplicates(subset='title')" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# Train New Tokenizer\n", + "# def get_news(news):\n", + "# \tcontent = news['content']\n", + "# \tfor start_idx in range(0, len(content), 1000):\n", + "# \t\tsamples = content[start_idx:start_idx+1000]\n", + "# \t\tyield samples" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# tokenizer = AutoTokenizer.from_pretrained(\"klue/roberta-base\")\n", + "# trained_tokenizer = tokenizer.train_new_from_iterator(get_news(news), vocab_size=32000)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# trained_tokenizer.tokenize(news.sample(1)['content'].item())" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 9, + "outputs": [], + "source": [ + "company = news['company'].unique()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 10, + "outputs": [], + "source": [ + "ecopro = news[news['company'] == '에코프로']['content']" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 11, + "outputs": [], + "source": [ + "samsung = news[news['company'] == '삼성전자']['content']" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 12, + "outputs": [ + { + "data": { + "text/plain": "7493 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...\n7494 북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ...\n7495 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...\n7496 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (...\n7497 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...\n ... \n9521 [서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간...\n9522 경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김...\n9523 지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외...\n9524 /사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강...\n9525 [특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉...\nName: content, Length: 2033, dtype: object" + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samsung" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 13, + "outputs": [], + "source": [ + "from krwordrank.word import summarize_with_keywords" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 14, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "scan vocabs ... \n", + "num vocabs = 30397\n", + "done = 10\n" + ] + } + ], + "source": [ + "samsung_keywords = summarize_with_keywords(samsung.tolist(),\n", + "\t\t\t\t\t\t\t\t min_count=10,\n", + "\t\t\t\t\t\t\t\t max_length=10,\n", + "\t\t\t\t\t\t\t\t beta=0.85,\n", + "\t\t\t\t\t\t\t\t max_iter=10,\n", + "\t\t\t\t\t\t\t\t verbose=True)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 15, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "scan vocabs ... \n", + "num vocabs = 12622\n", + "done = 10\n" + ] + } + ], + "source": [ + "ecopro_keywords = summarize_with_keywords(ecopro.tolist(),\n", + "\t\t\t\t\t\t\t\t min_count=10,\n", + "\t\t\t\t\t\t\t\t max_length=10,\n", + "\t\t\t\t\t\t\t\t beta=0.85,\n", + "\t\t\t\t\t\t\t\t max_iter=10,\n", + "\t\t\t\t\t\t\t\t verbose=True)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 16, + "outputs": [ + { + "data": { + "text/plain": "{'삼성': 113.04899471286005,\n '있다.': 96.40025318211502,\n '반도체': 76.9444809698702,\n '것으로': 57.41522417632173,\n '지난': 44.09371281340386,\n '시장': 41.46153028474646,\n '미국': 38.031196586616815,\n '올해': 37.70354689784546,\n '20': 32.574438066067046,\n '있는': 32.05366671509987,\n '따르면': 31.490588741709978,\n '통해': 29.819577665835357,\n '글로벌': 27.451159114847776,\n '제품': 27.020630444594993,\n '대비': 26.903514518127682,\n '말했다.': 26.652387349729356,\n 'AI': 24.394467032344135,\n '국내': 24.16760445268324,\n '대한': 23.415857106259235,\n '밝혔다.': 23.041813486837455,\n '최근': 23.025695399497952,\n '파운드리': 22.402067269813514,\n '실적': 22.267028820371173,\n '기업': 22.248983977863332,\n '2분기': 21.792027397688823,\n '위해': 21.5718121136273,\n '기술': 21.518306211439885,\n '이후': 20.889227921875438,\n '이어': 20.279837730556185,\n '연구원은': 20.121186816728986,\n '메모리': 20.013778836789744,\n '위한': 18.3880931725465,\n '이날': 18.117215069742315,\n '사업': 17.92858192379237,\n '했다.': 16.876348161285556,\n '스마트': 16.766850786194194,\n '최대': 16.7539714595688,\n '것이': 16.656891018475932,\n '등을': 16.639149420003566,\n '중국': 16.54890383819393,\n '이번': 16.429622935691302,\n '갤럭시': 16.108544225282593,\n '기자]': 15.281724222039594,\n '매출': 15.113520072559439,\n '주가': 14.873539455566247,\n '투자': 14.847024909171799,\n 'TV': 14.774839631407232,\n '함께': 14.67042481586292,\n '전망': 14.2072089165826,\n '각각': 14.151467429653152,\n '세계': 14.08805380041153,\n '특히': 13.954154964610524,\n '현재': 13.727580147803764,\n '업계': 13.624476380663015,\n '서울': 13.39578518613723,\n '오른': 13.28257220616118,\n '열린': 13.171850855907183,\n '10': 13.127804978207454,\n 'D램': 13.104814252989478,\n '1분기': 13.065691640004898,\n '상승': 12.934905065043786,\n '개발': 12.690562199448552,\n '같은': 12.686543269127075,\n '기존': 12.660521818672008,\n '이상': 12.551319454786267,\n '가장': 12.376730741078857,\n '공정': 12.058946044436594,\n '오는': 11.852371658108838,\n '수요': 11.823481852996538,\n '제공': 11.512378466201946,\n '다양한': 11.462409872127832,\n '외국인': 11.391831267344774,\n '프로': 11.36956535143897,\n '고객': 11.141642457050207,\n '경우': 11.082107682421261,\n '기준': 11.08195045421991,\n '영업': 11.003131941251652,\n '관련': 10.971401407697837,\n '주요': 10.951053631956672,\n 'OLED': 10.93389035668707,\n '확대': 10.929831688510971,\n '하반기': 10.78476355703099,\n '따라': 10.533051495722162,\n '출시': 10.506325932631405,\n '대해': 10.323349537573318,\n 'SK하이닉스': 10.19297727744963,\n '사용': 10.084722014770199,\n '차세대': 9.925454133544799,\n '1위': 9.89215093382253,\n '예상': 9.781481776697856,\n '한국': 9.761195412123847,\n '반면': 9.688303839817408,\n '생산': 9.60406675688774,\n '가운데': 9.462230130219446,\n '관계자는': 9.45382339157439,\n '에너지': 9.441387451197949,\n '비스포크': 9.389580621539862,\n '가격': 9.21583725806167,\n \"'삼성\": 9.157540532568149,\n 'LG': 9.055550403168208}" + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "samsung_keywords" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 17, + "outputs": [ + { + "data": { + "text/plain": "{'에코프': 54.889926129265355,\n '있다.': 50.15794883185085,\n '주가': 32.208321531943106,\n '지난': 28.02402241567823,\n '것으로': 23.148091240480124,\n '대비': 22.73903068801928,\n '이날': 22.300822473609166,\n '오른': 20.55145039943215,\n '투자': 20.326081943714932,\n '따르면': 20.231533316702556,\n '상승': 19.049847308432042,\n '코스닥': 17.805913531509685,\n '연구원은': 17.555263009569227,\n '각각': 17.226170678785344,\n '거래': 15.385203867153033,\n '양극재': 15.093433961339818,\n '올해': 14.98328092983398,\n '최근': 14.303050376010049,\n '대한': 14.257971201212495,\n '개인': 13.649856045867324,\n '공매도': 13.553441253263456,\n '미국': 13.056397864081916,\n '기업': 12.961074989749152,\n '현재': 12.244882983648905,\n '있는': 12.216823557403572,\n '하락': 11.976526868536139,\n '기준': 11.938983704280195,\n '시장': 11.821909606994756,\n '국내': 11.540605061803102,\n '종목': 11.365818093263782,\n '20': 11.253322834538004,\n '주식': 11.129030719338278,\n '반면': 11.014786466296483,\n '이후': 10.199095486966236,\n '외국인': 9.610091829773992,\n '말했다.': 9.488019423566351,\n '배터리': 9.286679672657694,\n '순매수': 9.090008812269485,\n '장중': 9.082321431644582,\n '2차': 8.981199445665863,\n '10': 8.725850139283011,\n '상장': 8.638330843843544,\n '이어': 8.60627591237572,\n '매도': 8.595488891917958,\n '생산': 8.506924278944544,\n '밝혔다.': 8.417713342614647,\n '관련': 8.396886825534901,\n '전날': 8.07280030567031,\n '했다.': 7.8301759176879795,\n '자회사': 7.606553752027324,\n '실적': 7.480810547261821,\n '역시': 7.382803951348751,\n '매수': 7.330625796116874,\n '급등': 7.320371588273142,\n '증권': 7.160946144592455,\n '같은': 7.0474046243294,\n '상위': 6.983408733653821,\n '대해': 6.913006765999552,\n '소재': 6.87618260127226,\n '들어': 6.7873567734875335,\n '중이다.': 6.759198140348204,\n '위한': 6.75017133471917,\n '가장': 6.672047369673819,\n '이상': 6.623429481580587,\n '지수': 6.467811532312368,\n '높은': 6.432358343820328,\n '오전': 6.423436136803585,\n '내린': 6.3948323145491575,\n '원),': 6.336123601034103,\n '등을': 6.29948359365883,\n '전기차': 6.29602311691635,\n 'JYP': 6.265788265865504,\n '기록': 6.1924825822205705,\n '매출': 6.0649108367224684,\n '전구체': 6.05625301887726,\n '장을': 6.003681345873961,\n '가운데': 5.99308043971747,\n '위해': 5.942913257204755,\n '1분기': 5.927935451826446,\n '특히': 5.910735646368337,\n '것이': 5.82644797564794,\n '마쳤다.': 5.724675950284127,\n '올랐다.': 5.700854068975071,\n '경우': 5.610166528751129,\n '기관': 5.514381261022586,\n '것은': 5.420623021429579,\n '규모': 5.37162192457227,\n '전년': 5.293710680905656,\n '성장': 5.290821878882535,\n '삼성': 5.206893585272747,\n '기자]': 5.189995398024994,\n '예상': 5.1702086252124015,\n '사업': 5.151595301835381,\n '기간': 5.1296201190158595,\n '기대': 5.093648573320658,\n '한국': 5.087456783661878,\n '증가한': 5.080745851521144,\n '이달': 4.998743613210991,\n '공장': 4.9884009499974615,\n '다만': 4.8965672152555655}" + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ecopro_keywords" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 18, + "outputs": [], + "source": [ + "top_k = set(samsung_keywords) - set(ecopro_keywords)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 19, + "outputs": [], + "source": [ + "t = {key : samsung_keywords[key] for key in top_k}" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 20, + "outputs": [ + { + "data": { + "text/plain": "[('반도체', 76.9444809698702),\n ('통해', 29.819577665835357),\n ('글로벌', 27.451159114847776),\n ('제품', 27.020630444594993),\n ('AI', 24.394467032344135),\n ('파운드리', 22.402067269813514),\n ('2분기', 21.792027397688823),\n ('기술', 21.518306211439885),\n ('메모리', 20.013778836789744),\n ('스마트', 16.766850786194194),\n ('최대', 16.7539714595688),\n ('중국', 16.54890383819393),\n ('이번', 16.429622935691302),\n ('갤럭시', 16.108544225282593),\n ('TV', 14.774839631407232),\n ('함께', 14.67042481586292),\n ('전망', 14.2072089165826),\n ('세계', 14.08805380041153),\n ('업계', 13.624476380663015),\n ('서울', 13.39578518613723),\n ('열린', 13.171850855907183),\n ('D램', 13.104814252989478),\n ('개발', 12.690562199448552),\n ('기존', 12.660521818672008),\n ('공정', 12.058946044436594),\n ('오는', 11.852371658108838),\n ('수요', 11.823481852996538),\n ('제공', 11.512378466201946),\n ('다양한', 11.462409872127832),\n ('프로', 11.36956535143897),\n ('고객', 11.141642457050207),\n ('영업', 11.003131941251652),\n ('주요', 10.951053631956672),\n ('OLED', 10.93389035668707),\n ('확대', 10.929831688510971),\n ('하반기', 10.78476355703099),\n ('따라', 10.533051495722162),\n ('출시', 10.506325932631405),\n ('SK하이닉스', 10.19297727744963),\n ('사용', 10.084722014770199),\n ('차세대', 9.925454133544799),\n ('1위', 9.89215093382253),\n ('관계자는', 9.45382339157439),\n ('에너지', 9.441387451197949),\n ('비스포크', 9.389580621539862),\n ('가격', 9.21583725806167),\n (\"'삼성\", 9.157540532568149),\n ('LG', 9.055550403168208)]" + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "sorted(t.items() , reverse=True, key=lambda x: x[1])" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} From 366b4893fa96e879e79d23f376bd23058d5f3ea5 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Mon, 17 Jul 2023 21:39:59 +0900 Subject: [PATCH 16/63] [Feature] Complate labeling code with GPT API - Works with GPT API. - Before run, please set "OPENAPI_KEY" os enviroment variable. --- labeling/gpt_api.py | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/labeling/gpt_api.py b/labeling/gpt_api.py index baa031f..a232026 100644 --- a/labeling/gpt_api.py +++ b/labeling/gpt_api.py @@ -1,4 +1,8 @@ import os +from tqdm import tqdm + +import pandas as pd + import openai def get_completion(prompt, model="gpt-3.5-turbo"): @@ -34,10 +38,27 @@ def get_label(news: str) -> str: response = get_completion(prompt) return response + # return "### 출력{\"label\": \"긍정\", \"reason\": \"새로운 투자 유치로 인해 해당 기업의 전망이 밝을것으로 예측된다. \"}" if __name__ == "__main__": - news = """ -7일 삼성전자 시작으로 2분기 어닝시즌 돌입 삼성전자 20 평균 예상 영업이익은 2693억원 수준 9000억원 예상한 증권사부터 8200억원 손실 전망도 "업황 개선에 대한 시선은 동일...비중 확대 이데일리 김인경 기자) 2분기 어닝시즌의 첫 테이프를 끊는 삼성전자(005930)의 실적발표가 다가오는 가운데 증권가가 '반도체 업황 개선 속도'를 놓고 논쟁을 하고 있다. 2분기가 다 지난 시점에 삼성전자가 9000억원을 벌어들였을 것이라 추정하는 곳이 있는가 하면 8200억원의 영업손실을 봤을 것이라는 전망도 나오고 있다. 시장에선 2조원 가까운 전망 치 차이가 당황스럽다는 입장이다. [이데일리 김정훈 기자120 영업익 평균은 2700억원.. 9000억원 기대도4일 마켓포인트에 따르면 삼성전자는 이날 전 거래일과 같은 7만3000원에 거래를 마쳤다. 다만 장 중 7만3600원까지 오르며 연중 최고가를 기록하기도 했다. 삼성전자는 오는 7일 2분기 잠정 실적을 발표한다. 증권정보업체 에프앤가이드에 따르면 연결기준 삼성전자의 2분기 매출액은 전년 동기보다 19.89% 감소한 61조8512억원, 영업이익은 같은 기간 98.09% 줄어든 2693억원 수준으로 추정된다. 하지만 내용을 뜯어보면 실적을 가능하기 어 렵다는 얘기가 나온다. 2분기 중반 무렵인 5월 15일 이후 증권사 13곳이 삼성전자의 2분기 영업이익을 제시했는데, 가장 높은 수준을 전망한 곳은 KB증권(9000억원)이다. KB증권은 고대역폭메모리(HBIM) 시장이 삼성전자의 어닝 서프라이즈를 이끌 것으로 봤다. 시장조사기 관인 트렌드포스에 따르면 2023년 HBM 시장 점유율은 SK하이닉스 53%, 삼성전자 38%, 마이크론 9% 수준이다. 이에 따라 HBM의 폭발적인 성장은 고스란히 한국 반도체업체의 수익으로 이어질 것이란 얘기다. 김동원 KB증권 연구원은 “메모리 반도체 업황이 바닥을 통과 하고 있는 가운데 실적은 이미 1분기에 바닥을 친 것으로 평가된다”면서 "한국 메모리 반도체 업체가 연 평균 45% 성장하는 HIBM 시장의 90%를 차지하면서 삼성전자의 2분기 영업이익 역시 시장 평균 기대치의 4배를 상회할 것이라고 기대했다. 삼성증권 역시 삼성전자가 2 분기 7030억원의 영업익을 남겼을 것이라고 기대했다. 앞서 미국 반도체 기업 마이크론이 호실적을 낸 만큼, 삼성전자도 깜짝실적을 낼 수 있다는 이유에서다. 마이크론은 지난달 28일(현지시간) 올해 3-5월 매출이 37억5200만달러(약 4조9300억원)를 기록했다고 밝혔다. 월가 전망치인 36억5000만 달러(약 4조8000억원)를 웃도는 수준이다. 황민성 삼성증권 연구원은 "마이크론 실적은 삼성전자나 SK하이닉스도 2분기 시장 기대치를 웃도는 실적을 낼 것임을 시사한다"고 평가했다. 이 외에도 키움증권(6340억원), SK증권(5000억원), 유진투자증권(3000억원) 등이 증권사 평균보다 훨씬 높은 2분기 영업이익을 내다봤다 적자 우려 증권사도 여전.."업황 개선 기대는 동일"하지만 일각에선 •적자 가능성도 제기하고 있다. 신한투자증권과 BNK투자증권은 삼성전자가 2분기 각각 2270억원, 8200억원의 영업손실을 냈을 것으 로 예상하고 있다. 이민희 BNK투자증권 연구원은 "D램 실적이 소폭 상향됐지만 모바일 수요 악화 영향이 2분기에도 지속됐다"면서 비메모리 매출 부진으로 파운드리 부문도 2분기에는 적자 전환이 예상되고, 스마트폰의 경우 출하 감소 등으로 두 자릿수 영업이익률을 유지 할 수 있을 지가 불투명하다고 지적했다. 다만 2분기 실적에 대한 시선은 엇갈려도 반도체 업황이 점차 개선될 것이라는 전망은 모두 동일하다. 김선우 메리츠증권 연구원은 "HBM과 차세대 후공정 등 신기술 도입이 본격화하고, 미 중 반도체 갈등 우려도 사실상 고점을 지나고 있다고 강조했다. 삼성전자가 최근 한 달 동안 2.96% 오르며 코스피의 상승률(0.94%)을 상회한 만큼, 실적과 별개로 주가는 소강상태를 맞을 것이란 전망도 있다. 김록호 하나증권 연구원은 "최근 한 달 사이 급등했던 만큼 주가는 잠시 쉬어가는 흐름을 보일 수도 있다" 면서도 -42분기 D램 업계의 재고가 피크아웃되는 흐름 속에 삼성전자 비중확대 전략은 유효할 것"이라라고 조언했다. -""" - print(get_label(news)) \ No newline at end of file + path_file = "" + pos_start = 0 + len_slice = 500 + + df_news = pd.read_csv(path_file)[pos_start:pos_start+len_slice] + df_news = df_news.drop_duplicates(["title"]) + df_news = df_news.dropna() + + list_result = [] + + for idx, row in tqdm(df_news.iterrows(), total=df_news.shape[0]): + try: + list_result.append(get_label(row["content_corpus"])) + except Exception as e: + print(f"idx: {idx}, err: {e}") + list_result.append(f"idx: {idx}, err: {e}") + + df_news["label"] = list_result + + df_news.to_csv(f"./label_{pos_start}_to_{pos_start + len_slice}.csv") + \ No newline at end of file From 59e9802ebbfe9d49ab018d8b7f67167d61ee43ff Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Mon, 17 Jul 2023 21:47:03 +0900 Subject: [PATCH 17/63] =?UTF-8?q?[Experiment]=20Log=20for=20experiments=20?= =?UTF-8?q?-=20Notebook=20files=20about=20model=20and=20dataset=20experime?= =?UTF-8?q?nts.=20=20=20=20=20-=20Model:=20T5,=20koGPT(only=20inference),?= =?UTF-8?q?=20polyglot=20=20=20=20=20-=20Dataset:=20=EB=85=BC=EB=AC=B8?= =?UTF-8?q?=EC=9A=94=EC=95=BD(in=20AIHub),=20"daekeun-ml/naver-news-summar?= =?UTF-8?q?ization-ko"(in=20Huggingface)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Summerization/Datasets/Dataset.ipynb | 512 ++++ .../Inferences/polyglot-ko.ipynb | 141 ++ .../Model/Model_train_with_T5_news.ipynb | 630 +++++ .../Model/Model_train_with_T5_paper.ipynb | 1546 ++++++++++++ .../Summerization/Model/koGPT_prompt.ipynb | 486 ++++ .../Model/polyglot-ko-3.8b_with_news.ipynb | 2178 +++++++++++++++++ .../Model/polyglot-ko-5.8b_with_news.ipynb | 1884 ++++++++++++++ 7 files changed, 7377 insertions(+) create mode 100644 Notebooks/Summerization/Datasets/Dataset.ipynb create mode 100644 Notebooks/Summerization/Inferences/polyglot-ko.ipynb create mode 100644 Notebooks/Summerization/Model/Model_train_with_T5_news.ipynb create mode 100644 Notebooks/Summerization/Model/Model_train_with_T5_paper.ipynb create mode 100644 Notebooks/Summerization/Model/koGPT_prompt.ipynb create mode 100644 Notebooks/Summerization/Model/polyglot-ko-3.8b_with_news.ipynb create mode 100644 Notebooks/Summerization/Model/polyglot-ko-5.8b_with_news.ipynb diff --git a/Notebooks/Summerization/Datasets/Dataset.ipynb b/Notebooks/Summerization/Datasets/Dataset.ipynb new file mode 100644 index 0000000..7c18e0d --- /dev/null +++ b/Notebooks/Summerization/Datasets/Dataset.ipynb @@ -0,0 +1,512 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "5276e03e-ffa0-4e05-9074-109211440be1", + "metadata": {}, + "source": [ + "# 논문 요약 데이터셋\n", + "- 본 노트북 파일은 AIHub의 `논문요약` 데이터셋을 CSV 및 Huggingface용 데이터셋으로 변환하는 파일입니다. " + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "9a72f9c4-1980-444f-9c07-a3dd36d4e718", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dataset.ipynb Model_train.ipynb dataset input repos\n" + ] + } + ], + "source": [ + "!ls" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "ccd8a1a2-14df-4e64-aad0-c20aa47f6114", + "metadata": {}, + "outputs": [], + "source": [ + "import json\n", + "import pandas as pd\n", + "from tqdm import tqdm\n", + "from typing import List\n", + "from datasets import Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "72c5e5c2-6bf3-4ac7-a299-95b8fc40c0cc", + "metadata": {}, + "outputs": [], + "source": [ + "# file_json = open(\"dataset/papaer/논문요약_0206_0.json\", \"w\")\n", + "# paper_file = json.dump(json_file)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "8225c7dc-24b5-4cfa-9a50-e82fbc347d8a", + "metadata": {}, + "outputs": [], + "source": [ + "def json_to_dict(file_path: str) -> List:\n", + " list_paper = []\n", + " \n", + " # \"dataset/papaer/논문요약_0206_0.json\"\n", + " # file_json = open(file_path, \"w\")\n", + " # paper_json = json.load(file_json)\n", + " with open(file_path, 'r') as f:\n", + " paper_json = json.load(f)\n", + "\n", + " for idx, paper in enumerate(tqdm(paper_json[\"data\"])):\n", + " # doc_type = paper[\"doc_type\"]\n", + " doc_id = paper[\"doc_id\"]\n", + " title = paper[\"title\"]\n", + " ipc = paper[\"ipc\"]\n", + "\n", + " # 전체요약 구분\n", + " summary_entire_ori = paper[\"summary_entire\"][0][\"orginal_text\"]\n", + " summary_entire_sum = paper[\"summary_entire\"][0][\"summary_text\"]\n", + "\n", + " # 섹션요약 구분\n", + " summary_section_ori = paper[\"summary_section\"][0][\"orginal_text\"]\n", + " summary_section_sum = paper[\"summary_section\"][0][\"summary_text\"]\n", + "\n", + " dict_entire = {\"doc_id\": doc_id, \\\n", + " \"title\": title, \"ipc\": ipc, \\\n", + " \"all\": summary_entire_ori, \"sum\": summary_entire_sum}\n", + " dict_section = {\"doc_id\": doc_id + \"_1\", \\\n", + " \"title\": title, \"ipc\": ipc, \\\n", + " \"all\": summary_section_ori, \"sum\": summary_section_sum}\n", + "\n", + " list_paper.append(dict_entire)\n", + " list_paper.append(dict_section)\n", + "\n", + " return list_paper" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "deeafaaf-8e9b-4528-b8f8-687668fdeefd", + "metadata": {}, + "outputs": [], + "source": [ + "list_path = [\"dataset/paper/논문요약_0206_0.json\", \"dataset/paper/논문요약_0206_1.json\",\\\n", + " \"dataset/paper/논문요약_0206_2.json\", \"dataset/paper/논문요약_0220_0.json\",\\\n", + " \"dataset/paper/논문요약_0225_5_1.json\", \"dataset/paper/논문요약_0225_7_0.json\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "1059e752-f948-496f-833e-9cfbc24bad13", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "100%|██████████| 32000/32000 [00:00<00:00, 135936.65it/s]\n", + "100%|██████████| 32000/32000 [00:00<00:00, 299057.78it/s]\n", + "100%|██████████| 6259/6259 [00:00<00:00, 329809.15it/s]\n", + "100%|██████████| 10021/10021 [00:00<00:00, 319888.58it/s]\n", + "100%|██████████| 32000/32000 [00:00<00:00, 306960.89it/s]\n", + "100%|██████████| 32000/32000 [00:00<00:00, 294306.14it/s]\n" + ] + } + ], + "source": [ + "list_paper = []\n", + "\n", + "for path in list_path:\n", + " list_paper = list_paper + json_to_dict(path)" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "id": "7b46bf11-6ec6-4df1-942d-d657252c145d", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "288560\n" + ] + }, + { + "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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
doc_idtitleipcallsum
245262A220223592655국가문화유산으로서 문학기록의 조직화 방안복합학본 연구는 국내 문학관에 분산 소장되어 있는 작가의 문학자료에 대한 기록학적 탐구와...본고는 국내 문학관에 분산 소장되어 있는 작가의 문학자료에 관한 기록학적 탐구 및 ...
281212A220223610632중국?티베트 佛典 目錄들에 있어서 部와 『新編諸宗敎藏總錄』에 있어서 部의 分類體系에...복합학본 논문에서는 대각 국사 의천이 중국?한국?일본의 동북아시아에서 찬술된 주석서들을 ...본 논문에서는 대각 국사 의천이 중국?한국?일본의 동북아시아에서 찬술된 주석서들을 ...
160811A220223614431_1수사․정보기관의 통신정보 수집에 관한 비판적 연구- 전기통신사업법 및 통신비밀보호법...사회과학최근 범죄수사 등을 목적으로 한 개인정보 수집문제가 정보통신기술의 발전과 더불어 사...공익적 목적을 위한 정보수집일지라도 수사목적을 넘어설 가능성이 있는데, 현행법상 정...
119431A201008236701_1“괴델의 불완전성 정리: 증명된 신화?”인문학공리화된 산수체계가 주어진 한 산수문장의 증명 혹은 반중 여부를 유한한 절차를 통하...괴델의 불완전성 정리는, 공리화된 산수체계가 산수문장의 증명 또는 반증 여부를 유한...
17671A201008185530_1긍정심리학 관점으로 본 학교스포츠클럽 운영 경험과 의미사회과학최근 학생들은 학교에서 분노조절, 주의산만, 집단따돌림 등의 문제행동을 보이고 있다...학생들은 학교에서 분노조절, 주의산만, 집단따돌림 등의 문제행동을 보이고 있다. 이...
65162A201008209282교류분석과 실존주의 맥락에서 도박중독자의 자아상태와 인생태도 분석에 관한 연구사회과학본 연구는 도박중독자의 자아상태와 인생태도를 교류분석과 실존주의 맥락에서 이해하기 ...본 논문은 도박중독자의 자아상태 및 인생태도를 교류분석과 실존주의 측면에서 이해하기...
211820A220223640203짝 프로그래밍 학습방법이 창의적 문제해결력과효율성에 미치는 영향사회과학2015 개정 교육과정에 의해 프로그래밍 교육이 초등학교 교과에 반영됨에 따라 프로...이 연구에서는 초등학생을 대상으로 짝 프로그래밍 학습방법을 적용해 창의적 문제해결력...
153508A200928010600코스닥기업의 유가증권시장 이전상장에 대한 연구 The Study on Firms t...사회과학코스닥시장에서 유가증권시장으로 이전한 기업의 특성을 조사하고, 이전상장에 대한 주식...코스닥시장에서 유가증권시장으로 이전한 기업의 특성을 조사하고, 이전상장에 대한 주식...
181820A220223625151교사와 어머니가 인식한유아의 성역할 사회화 형성변인 분석사회과학본 연구는 유아가 성장함에 따라 그들과 주로 많은 시간을 보내고 이들의 성역할 개념...이 연구는 유아가 성장함에 따라 그들과 주로 많은 시간을 보내고 이들의 성역할 개념...
152400A200928013287현존재의 실존과 불안의 두 얼굴—근원적불안 The Existence of There...인문학이 글은 불안 4부작 가운데 세 번째 논문이다. 현존재에게 비본래적실존의 빌미를 허...불안거리는 불안의 선천적 가능성의 조건답게 현존재에서 불안의 기분을 환기하고 불안의...
122350A201008238166제2언어 복합어의 재인에서 의미적 투명성과 형태-음운적 예측가능성의 역할인문학본 논문에서 제안한 제2언어 형태정보처리모형은 복합어에 대한 온라인 재인에서의 구조...이 논문에서 제안한 제2언어 형태정보처리모형은 복합어에 관한 온라인 재인에서의 구조...
29303A201008191348_1플립러닝을 적용한 예비유아교사의 유아음악교육 수업개선 실행연구예술체육음악은 유아들의 인지적 · 정서적 · 신체적 발달을 돕고(Haines & Gerbe...유아기는 음악적성 발달 및 음악적 감수성을 계발하기 위한 최적기이므로 다양한 음악활...
85642A201008219733일본 후지필름의 성공사례사회과학후지필름의 비전은 새로운 제품을 개발하는 도전을 두려워 않고, 새로운 가치를 창조함...후지필름의 비전은 새로운 제품을 개발하는 도전을 두려워 않고, 새로운 가치를 창조함...
221259A220223644949_1지역발전을 위한 지방계약법제와 민간투자법제의 정비방안사회과학‘지역발전’(regional development)의 개념은 여러 가지 의미로 사용...본고에서는 지역발전 관련법 중 ‘지방자치단체를 당사자로 하는 계약에 관한 법률’과 ...
162012A220223615036전북지역 문화유산의 활용 방안—최명희의 <혼불>을 중심으로복합학이 논문은 전라북도를 대표하는 문학유산으로 평가되고 있는 최명희 작 <혼불>의 활용...본고는 전라북도를 대표하는 문학유산으로 평가되는 최명희 작 <혼불>의 활용 현황 및...
170100A220223619173다중사회정체성 맥락에서 평가자 집단 유형이 동남아이주민들의 자기고정관념화에 미치는 영향사회과학본 연구에서는 다중사회정체성 맥락에서 정체성의 특출성과 평가자 집단 유형이 동남아이...이 연구에서는 다중사회정체성 맥락에서 정체성의 특출성과 평가자 집단 유형이 동남아이...
198422A220223633469노인교육 관련 연구에 나타난 학습자로서의 노인사회과학이 연구는 1990년부터 2014년 6월까지 국내 주요 학술지에 게재된 노인교육 관...본 연구는 1990년부터 2014년 6월까지 국내 주요 학술지에 게재된 노인교육 관...
184926A220223626712HEC-RAS 모형을 이용한 하상장갑화 모의 - 민감도분석을 중심으로 -인문학HEC-RAS모형을 대상으로 유사량공식, 조도계수, 모의시간간격, SPI에 따른 하...HEC-RAS모형을 대상으로 유사량공식과 조도계수, 모의시간간격 그리고 SPI에 따...
230847A220223585447_1모드 미분을 이용한 기하비선형 보의 축소 모델공학또한 모드미분은 비선형 문제에서 나타나는 인장-굽힘 연계거동을 효과적으로 표현할 수...본 논문에서는 기 개발된 비선형 부분구조화 기법 중의 하나인 모드미분(modal d...
1391A201008177390_1고등학교 교과과정이 청년 노동시장에 미치는 영향에 관한 연구사회과학학업 성취도와 노동 시장에 대한 교육과정의 영향을 분석하는 연구는 기존에 많이 진행...학업 성취도와 노동 시장에 대한 교육과정의 영향을 분석한 기존의 연구는 선택 편의를...
\n", + "
" + ], + "text/plain": [ + " doc_id title \\\n", + "245262 A220223592655 국가문화유산으로서 문학기록의 조직화 방안 \n", + "281212 A220223610632 중국?티베트 佛典 目錄들에 있어서 部와 『新編諸宗敎藏總錄』에 있어서 部의 分類體系에... \n", + "160811 A220223614431_1 수사․정보기관의 통신정보 수집에 관한 비판적 연구- 전기통신사업법 및 통신비밀보호법... \n", + "119431 A201008236701_1 “괴델의 불완전성 정리: 증명된 신화?” \n", + "17671 A201008185530_1 긍정심리학 관점으로 본 학교스포츠클럽 운영 경험과 의미 \n", + "65162 A201008209282 교류분석과 실존주의 맥락에서 도박중독자의 자아상태와 인생태도 분석에 관한 연구 \n", + "211820 A220223640203 짝 프로그래밍 학습방법이 창의적 문제해결력과효율성에 미치는 영향 \n", + "153508 A200928010600 코스닥기업의 유가증권시장 이전상장에 대한 연구 The Study on Firms t... \n", + "181820 A220223625151 교사와 어머니가 인식한유아의 성역할 사회화 형성변인 분석 \n", + "152400 A200928013287 현존재의 실존과 불안의 두 얼굴—근원적불안 The Existence of There... \n", + "122350 A201008238166 제2언어 복합어의 재인에서 의미적 투명성과 형태-음운적 예측가능성의 역할 \n", + "29303 A201008191348_1 플립러닝을 적용한 예비유아교사의 유아음악교육 수업개선 실행연구 \n", + "85642 A201008219733 일본 후지필름의 성공사례 \n", + "221259 A220223644949_1 지역발전을 위한 지방계약법제와 민간투자법제의 정비방안 \n", + "162012 A220223615036 전북지역 문화유산의 활용 방안—최명희의 <혼불>을 중심으로 \n", + "170100 A220223619173 다중사회정체성 맥락에서 평가자 집단 유형이 동남아이주민들의 자기고정관념화에 미치는 영향 \n", + "198422 A220223633469 노인교육 관련 연구에 나타난 학습자로서의 노인 \n", + "184926 A220223626712 HEC-RAS 모형을 이용한 하상장갑화 모의 - 민감도분석을 중심으로 - \n", + "230847 A220223585447_1 모드 미분을 이용한 기하비선형 보의 축소 모델 \n", + "1391 A201008177390_1 고등학교 교과과정이 청년 노동시장에 미치는 영향에 관한 연구 \n", + "\n", + " ipc all \\\n", + "245262 복합학 본 연구는 국내 문학관에 분산 소장되어 있는 작가의 문학자료에 대한 기록학적 탐구와... \n", + "281212 복합학 본 논문에서는 대각 국사 의천이 중국?한국?일본의 동북아시아에서 찬술된 주석서들을 ... \n", + "160811 사회과학 최근 범죄수사 등을 목적으로 한 개인정보 수집문제가 정보통신기술의 발전과 더불어 사... \n", + "119431 인문학 공리화된 산수체계가 주어진 한 산수문장의 증명 혹은 반중 여부를 유한한 절차를 통하... \n", + "17671 사회과학 최근 학생들은 학교에서 분노조절, 주의산만, 집단따돌림 등의 문제행동을 보이고 있다... \n", + "65162 사회과학 본 연구는 도박중독자의 자아상태와 인생태도를 교류분석과 실존주의 맥락에서 이해하기 ... \n", + "211820 사회과학 2015 개정 교육과정에 의해 프로그래밍 교육이 초등학교 교과에 반영됨에 따라 프로... \n", + "153508 사회과학 코스닥시장에서 유가증권시장으로 이전한 기업의 특성을 조사하고, 이전상장에 대한 주식... \n", + "181820 사회과학 본 연구는 유아가 성장함에 따라 그들과 주로 많은 시간을 보내고 이들의 성역할 개념... \n", + "152400 인문학 이 글은 불안 4부작 가운데 세 번째 논문이다. 현존재에게 비본래적실존의 빌미를 허... \n", + "122350 인문학 본 논문에서 제안한 제2언어 형태정보처리모형은 복합어에 대한 온라인 재인에서의 구조... \n", + "29303 예술체육 음악은 유아들의 인지적 · 정서적 · 신체적 발달을 돕고(Haines & Gerbe... \n", + "85642 사회과학 후지필름의 비전은 새로운 제품을 개발하는 도전을 두려워 않고, 새로운 가치를 창조함... \n", + "221259 사회과학 ‘지역발전’(regional development)의 개념은 여러 가지 의미로 사용... \n", + "162012 복합학 이 논문은 전라북도를 대표하는 문학유산으로 평가되고 있는 최명희 작 <혼불>의 활용... \n", + "170100 사회과학 본 연구에서는 다중사회정체성 맥락에서 정체성의 특출성과 평가자 집단 유형이 동남아이... \n", + "198422 사회과학 이 연구는 1990년부터 2014년 6월까지 국내 주요 학술지에 게재된 노인교육 관... \n", + "184926 인문학 HEC-RAS모형을 대상으로 유사량공식, 조도계수, 모의시간간격, SPI에 따른 하... \n", + "230847 공학 또한 모드미분은 비선형 문제에서 나타나는 인장-굽힘 연계거동을 효과적으로 표현할 수... \n", + "1391 사회과학 학업 성취도와 노동 시장에 대한 교육과정의 영향을 분석하는 연구는 기존에 많이 진행... \n", + "\n", + " sum \n", + "245262 본고는 국내 문학관에 분산 소장되어 있는 작가의 문학자료에 관한 기록학적 탐구 및 ... \n", + "281212 본 논문에서는 대각 국사 의천이 중국?한국?일본의 동북아시아에서 찬술된 주석서들을 ... \n", + "160811 공익적 목적을 위한 정보수집일지라도 수사목적을 넘어설 가능성이 있는데, 현행법상 정... \n", + "119431 괴델의 불완전성 정리는, 공리화된 산수체계가 산수문장의 증명 또는 반증 여부를 유한... \n", + "17671 학생들은 학교에서 분노조절, 주의산만, 집단따돌림 등의 문제행동을 보이고 있다. 이... \n", + "65162 본 논문은 도박중독자의 자아상태 및 인생태도를 교류분석과 실존주의 측면에서 이해하기... \n", + "211820 이 연구에서는 초등학생을 대상으로 짝 프로그래밍 학습방법을 적용해 창의적 문제해결력... \n", + "153508 코스닥시장에서 유가증권시장으로 이전한 기업의 특성을 조사하고, 이전상장에 대한 주식... \n", + "181820 이 연구는 유아가 성장함에 따라 그들과 주로 많은 시간을 보내고 이들의 성역할 개념... \n", + "152400 불안거리는 불안의 선천적 가능성의 조건답게 현존재에서 불안의 기분을 환기하고 불안의... \n", + "122350 이 논문에서 제안한 제2언어 형태정보처리모형은 복합어에 관한 온라인 재인에서의 구조... \n", + "29303 유아기는 음악적성 발달 및 음악적 감수성을 계발하기 위한 최적기이므로 다양한 음악활... \n", + "85642 후지필름의 비전은 새로운 제품을 개발하는 도전을 두려워 않고, 새로운 가치를 창조함... \n", + "221259 본고에서는 지역발전 관련법 중 ‘지방자치단체를 당사자로 하는 계약에 관한 법률’과 ... \n", + "162012 본고는 전라북도를 대표하는 문학유산으로 평가되는 최명희 작 <혼불>의 활용 현황 및... \n", + "170100 이 연구에서는 다중사회정체성 맥락에서 정체성의 특출성과 평가자 집단 유형이 동남아이... \n", + "198422 본 연구는 1990년부터 2014년 6월까지 국내 주요 학술지에 게재된 노인교육 관... \n", + "184926 HEC-RAS모형을 대상으로 유사량공식과 조도계수, 모의시간간격 그리고 SPI에 따... \n", + "230847 본 논문에서는 기 개발된 비선형 부분구조화 기법 중의 하나인 모드미분(modal d... \n", + "1391 학업 성취도와 노동 시장에 대한 교육과정의 영향을 분석한 기존의 연구는 선택 편의를... " + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_paper = pd.DataFrame(list_paper)\n", + "print(len(df_paper))\n", + "df_paper.sample(20)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "2ed9d3bd-67b9-4de1-9657-cf57554995a7", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "1e6a85dd9f264e879403897da2579593", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Saving the dataset (0/2 shards): 0%| | 0/287982 [00:00\n", + "\n", + "S SNE리서치는 올 1 5월 주요 제조사별 판매 대수는 현대차가 4 396대로 1위를 차지했으며 글로벌 수소전기차 FCEV 시장에서 일본 자동차 기업 도요타와 혼다를 합친 것보다 더 많은 판매량을 기록했으며 2018년 넥쏘 출시 이후 압도적 우위를 지키고 있다고 밝혔다.\n" + ] + } + ], + "source": [ + "idx = 109\n", + "\n", + "print(\"전문\")\n", + "print(dataset_paper_tokenized[\"train\"][idx][\"document\"])\n", + "print()\n", + "print(\"요약\")\n", + "print(dataset_paper_tokenized[\"train\"][idx][\"summary\"])\n", + "print()\n", + "print(tokenizer.decode(dataset_paper_tokenized[\"train\"][idx][\"input_ids\"]))\n", + "print()\n", + "print(tokenizer.decode(dataset_paper_tokenized[\"train\"][idx][\"labels\"]))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "41d2c757-6890-4284-8a40-5bde4520f07f", + "metadata": {}, + "outputs": [], + "source": [ + "rouge = evaluate.load(\"rouge\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "df7358a6-807f-460a-8ab6-2849b4ea2dd9", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_metrics(eval_pred):\n", + " predictions, labels = eval_pred\n", + " print(predictions, labels)\n", + " decoded_preds = tokenizer.batch_decode(predictions, skip_special_tokens=True)\n", + " labels = np.where(labels != -100, labels, tokenizer.pad_token_id)\n", + " decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)\n", + "\n", + " result = rouge.compute(predictions=decoded_preds, references=decoded_labels, use_stemmer=True)\n", + "\n", + " prediction_lens = [np.count_nonzero(pred != tokenizer.pad_token_id) for pred in predictions]\n", + " result[\"gen_len\"] = np.mean(prediction_lens)\n", + "\n", + " return {k: round(v, 4) for k, v in result.items()}" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "e4bd4aea-b113-4a5d-b69b-959868bb4e3e", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.8/site-packages/transformers/optimization.py:411: FutureWarning: This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this warning\n", + " warnings.warn(\n", + "You're using a T5TokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [11100/11100 2:20:33, Epoch 4/4]\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining LossValidation LossRouge1Rouge2RougelRougelsumGen Len
20000.3756000.3226720.2779000.0748000.2741000.27350019.000000
40000.3340000.3041060.2801000.0794000.2767000.27620019.000000
60000.3128000.2969040.2806000.0788000.2778000.27710019.000000
80000.3072000.2899980.2855000.0819000.2824000.28170019.000000
100000.2949000.2883710.2823000.0798000.2794000.27880019.000000

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 23531 17357 ... 222 19594 222]\n", + " [ 0 831 614 ... 222 9907 222]\n", + " [ 0 2534 349 ... 222 2845 274]\n", + " ...\n", + " [ 0 44 40 ... 222 1729 719]\n", + " [ 0 22 349 ... 1909 330 5512]\n", + " [ 0 22 349 ... 2342 311 222]] [[ 635 349 13 ... -100 -100 -100]\n", + " [ 831 614 222 ... -100 -100 -100]\n", + " [ 329 222 29877 ... -100 -100 -100]\n", + " ...\n", + " [ 44 40 1918 ... -100 -100 -100]\n", + " [ 885 1272 222 ... -100 -100 -100]\n", + " [ 7765 589 676 ... -100 -100 -100]]\n", + "[[ 0 23531 17357 ... 222 19594 222]\n", + " [ 0 831 614 ... 222 9907 222]\n", + " [ 0 2534 349 ... 222 2845 274]\n", + " ...\n", + " [ 0 44 40 ... 222 1729 719]\n", + " [ 0 22 349 ... 1909 330 5512]\n", + " [ 0 22 349 ... 2342 311 222]] [[ 635 349 13 ... -100 -100 -100]\n", + " [ 831 614 222 ... -100 -100 -100]\n", + " [ 329 222 29877 ... -100 -100 -100]\n", + " ...\n", + " [ 44 40 1918 ... -100 -100 -100]\n", + " [ 885 1272 222 ... -100 -100 -100]\n", + " [ 7765 589 676 ... -100 -100 -100]]\n", + "[[ 0 23531 17357 ... 222 19594 222]\n", + " [ 0 831 614 ... 222 9907 222]\n", + " [ 0 2534 349 ... 222 2845 274]\n", + " ...\n", + " [ 0 44 40 ... 222 1729 719]\n", + " [ 0 22 349 ... 1909 330 5512]\n", + " [ 0 22 349 ... 2342 311 222]] [[ 635 349 13 ... -100 -100 -100]\n", + " [ 831 614 222 ... -100 -100 -100]\n", + " [ 329 222 29877 ... -100 -100 -100]\n", + " ...\n", + " [ 44 40 1918 ... -100 -100 -100]\n", + " [ 885 1272 222 ... -100 -100 -100]\n", + " [ 7765 589 676 ... -100 -100 -100]]\n", + "[[ 0 23531 17357 ... 222 19594 222]\n", + " [ 0 831 614 ... 222 9907 222]\n", + " [ 0 2534 349 ... 222 2845 274]\n", + " ...\n", + " [ 0 44 40 ... 222 1729 719]\n", + " [ 0 22 349 ... 1909 330 5512]\n", + " [ 0 22 349 ... 2342 311 222]] [[ 635 349 13 ... -100 -100 -100]\n", + " [ 831 614 222 ... -100 -100 -100]\n", + " [ 329 222 29877 ... -100 -100 -100]\n", + " ...\n", + " [ 44 40 1918 ... -100 -100 -100]\n", + " [ 885 1272 222 ... -100 -100 -100]\n", + " [ 7765 589 676 ... -100 -100 -100]]\n", + "[[ 0 23531 17357 ... 222 19594 222]\n", + " [ 0 831 614 ... 222 9907 222]\n", + " [ 0 2534 349 ... 222 2845 274]\n", + " ...\n", + " [ 0 44 40 ... 222 1729 719]\n", + " [ 0 22 349 ... 1909 330 5512]\n", + " [ 0 22 349 ... 2342 311 222]] [[ 635 349 13 ... -100 -100 -100]\n", + " [ 831 614 222 ... -100 -100 -100]\n", + " [ 329 222 29877 ... -100 -100 -100]\n", + " ...\n", + " [ 44 40 1918 ... -100 -100 -100]\n", + " [ 885 1272 222 ... -100 -100 -100]\n", + " [ 7765 589 676 ... -100 -100 -100]]\n" + ] + }, + { + "data": { + "text/plain": [ + "TrainOutput(global_step=11100, training_loss=0.34318919104498785, metrics={'train_runtime': 8434.7954, 'train_samples_per_second': 10.525, 'train_steps_per_second': 1.316, 'total_flos': 1.2572109356544e+17, 'train_loss': 0.34318919104498785, 'epoch': 4.0})" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from transformers import DataCollatorForSeq2Seq\n", + "\n", + "data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=str_model)\n", + "\n", + "training_args = Seq2SeqTrainingArguments(\n", + " output_dir=\"summary_with_news\",\n", + " evaluation_strategy=\"steps\",\n", + " learning_rate=2e-5,\n", + " per_device_train_batch_size=8,\n", + " per_device_eval_batch_size=8,\n", + " # gradient_accumulation_steps=2,\n", + " # eval_accumulation_steps=8,\n", + " weight_decay=0.01,\n", + " save_total_limit=3,\n", + " num_train_epochs=4,\n", + " predict_with_generate=True,\n", + " eval_steps=2000,\n", + " fp16=True,\n", + " resume_from_checkpoint=True,\n", + ")\n", + "\n", + "trainer = Seq2SeqTrainer(\n", + " model=model,\n", + " args=training_args,\n", + " train_dataset=dataset_paper_tokenized[\"train\"],\n", + " eval_dataset=dataset_paper_tokenized[\"test\"],\n", + " tokenizer=tokenizer,\n", + " data_collator=data_collator,\n", + " compute_metrics=compute_metrics,\n", + ")\n", + "\n", + "trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "c6c6833f-fd44-4e48-8ded-64720d223930", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'summary_text': '빅테크 기업이 아닌 일반 기업이나 연구자가 거대 언어'}]" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from transformers import pipeline\n", + "\n", + "summarizer = pipeline(\"summarization\", model=\"./summary_with_news/checkpoint-11000\")\n", + "# summarizer = pipeline(\"text2text-generation\", model=\"./summary/checkpoint-128000\")\n", + "summarizer(\"요약: \" + \"GPT-3를 필두로 하여 거대 파라미터의 모델에 대규모 코퍼스를 학습한 (초)거대 언어모델은 자연스러운 문장을 생성하거나 다양한 태스크를 적은 학습 데이터로 수행하는 등 뛰어난 가능성을 보였다. 하지만 학습에 막대한 자본이 필요한 거대 언어모델은 AI의 독점화 및 권력화, 그리고 데이터 및 컴퓨팅 파워 격차에 따른 기술 격차 심화를 낳을 것이라는 우려도 존재한다. 빅테크 기업이 아닌 일반 기업이나 연구자가 거대 언어 모델을 다루기는 쉽지 않은 것은 엄연한 사실이다.\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "13e7d548-91d4-4783-980a-475db86d42f6", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1209\n" + ] + }, + { + "data": { + "text/plain": [ + "[{'summary_text': 'KT의 지분 7.79%(현대자동차 4.69%, 현대모비스 3.1%)를 보유한 현대자동차그룹이 오는 31일 KT 주주총회에서 KT 사외이사 3명의 재선임안(임기 1년)에 대해 반대하겠다는 뜻을 KT에 전달한 것으로 확인되자, KT 개인주주들이 분노하고 있으며, 현대차 반대해 최종 부결돼도 상법으로 이사 의무 유지하지만, 법조계에 따르면 설사 KT 이사가 한 명도 안 남아도 상법상 이사의 결원 조항으로 인해 새 이사회 구성까지 임무를 담당할 수 있다.\\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\\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\\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\\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\\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\\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\\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\\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\\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\\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\\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\\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\\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\\n\\n\\n\\n\\n\\n'}]" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "full_news = \"\"\"\n", + "뚜렷한 이유는 안밝혀..지난해 사업협력 단순투자로 공시했는데네이버 카페 주주모임, 불매운동하자는 글까지3명 사외이사 재선임 최종 부결돼도상법상 임시주총까지 퇴임이사로 활동 가능[이데일리 김현아 기자]KT의 지분 7.79%(현대자동차 4.69%, 현대모비스 3.1%)를 보유한 현대자동차그룹이 오는 31일 KT 주주총회에서 KT 사외이사 3명의 재선임안(임기 1년)에 대해 반대하겠다는 뜻을 KT에 전달한 것으로 확인되자, KT 개인주주들이 분노하고 있다. 현대차그룹은 강충구 고려대 전기전자공학부 교수, 여은정 중앙대 경영학부 교수, 표현명 한국타이어테크놀로지 사외이사 등 3명에 대해 반대의 뜻을 KT에 전했다. 앞서 현대차그룹은 윤경림 차기 CEO 후보에 대해서도 “이사회가 대주주 의견을 고려해야 한다”는 취지를 밝혀, 사실상 최대 주주인 국민연금과 뜻을 함께 하겠다는 의지를 밝힌 바 있다. 지난해 KT와 현대차는 7500억 규모의 자사주 맞교환을 통해 도심항공모빌리티(UAM) 등 미래 모빌리티 분야의 경쟁력을 키우기로 합의한 바 있다. 현대차 그룹이 KT 지분 4.6%, 현대모비스가 KT 지분 3.1%를, KT가 현대차 지분 1.04%와 현대모비스 지분 1.46%를 갖게 됐다. 당시 양사는 “사업협력을 위한 단순투자”라면서 지분투자 목적을 ‘단순투자’로 공시했다. 하지만, 이 같은 보도가 나오자 개인주주들은 반발하고 있다. 네이버 KT주주모임 카페에서 아이디 알바트로스님은 “현대차가 선을 넘는건가요?”라고 했고, chsu6366님은 “현대차그룹의 양아치 경영에 분노를 표하며 주주들이 불매운동에 적극적으로 동참하시길 당부드린다. KT CFO는 현대차그룹 지분을 매각하시길 바란다”고 했다. 앞서 주주모임 카페 개설자도 이데일리와의 통화에서 “이번 주총에서 현대차, 신한은행이 반대하면, 주주제안으로 미래사업 제휴에서 두 회사를 제외하고 KT와 상호주식교환 등을 한 걸 해지하라고 요구할 예정이다. 카페 안에선 굉장히 좋은 현대차에 대해 불매 운동까지 하자는 글도 있다”고 밝힌 바 있다. 한편 이강철 이사에 이어 어제(28일),김대유 이사(DB생명 사외이사)와 유희열 이사(한국 이산화탄소 포집 및 처리 연구개발센터(KCRC) 이사장) 등 지난 정부 출신 사외이사들이 사퇴하면서 KT 이사회는 사내이사 0명, 사외이사 4명이 남은 상태다. 이중 강충구, 여은정, 표현명 이사가 주총에서 재선임되지 않으면 이사는 1명만 남게 된다. 현대차 반대해 최종 부결돼도 상법으로 이사 의무 유지하지만, 법조계에 따르면 설사 KT 이사가 한 명도 안 남아도 상법상 이사의 결원 조항으로 인해 새 이사회 구성까지 임무를 담당할 수 있다. 퇴임이사 자격으로 가능하다. ESG 자문기관인 서스틴베스트 자문 변호사에 따르면, 상법 386조 1항에 따라, 법률 또는 정관에서 정한 이사의 원수를 결한 경우에는 임기의 만료 또는 사임으로 인하여 퇴임한 이사는 새로 선임된 이사가 취임할 때까지 이사로서의 권리와 의무가 있다고 돼 있다. KT 이사회의 최소 의결 정족 원수는 3명인데, 현대차 주장대로 선임안이 부결되면 이사는 1명 남게 된다. 하지만, 부결돼도 해당 이사들은 이 조항에 근거해 임시주총에서 새로운 이사가 추천돼 선임될 때까지 퇴임이사로 활동할 수 있다. 한편 KT의 주가는 다시 3만 원대 아래로 추락했다. 29일 현재 2만 9200원이 돼 전날보다 2.83% 하락한 채 마감했다.\n", + "\"\"\"\n", + "\n", + "def get_summary(full_news):\n", + " news_tokenized = len(tokenizer(full_news)[\"input_ids\"])\n", + " print(news_tokenized)\n", + " \n", + " return summarizer(full_news, min_length=news_tokenized // 2, max_length=news_tokenized // 2 + (news_tokenized // 4))\n", + "\n", + "get_summary(full_news)\n", + "# 1934\n", + "\n", + "# [{'generated_text': '제주항공에 자금을 지원하기 위해 제주항공 주식을 담보로 돈을 빌리는 AK홀딩스, SK케미칼 주식 공개매수 나서는 SK디스커버리, 하나금융14호스팩으로 본 스팩의 상장폐지 절차와 관련한 이야기 등을 담아봤어요.AK홀딩스 제주항공 유증 참여 위해 교환사채 발행애경그룹 지주회사AK홀딩스가 자회사인 저비용항공사제주항공의 주주배정 유상증자 참여를 위해 1300억원 ) '}]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "3c03de28-85d6-42e8-b246-4fe55d8782e7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "436\n", + "[{'summary_text': 'KT의 지분 7.79%(현대자동차 4.69%, 현대모비스 3.1%)를 보유한 현대자동차그룹이 오는 31일 KT 주주총회에서 KT 사외이사 3명의 재선임안(임기 1년)에 대해 반대하겠다는 뜻을 KT에 전달한 것으로 확인되자, KT 개인주주들이 분노하고 있다. 앞서 현대차그룹은 윤경림 차기 CEO 후보에 대해서도 “이사회가 대주주 의견을 고려해야 한다”는 취지를 밝혀, 사실상 최대 주주인 국민연금과 뜻을 함께 하겠다는 의지를 밝힌 바 있다. 지난해 KT와 현대차는 7500억 규모의 자사주 맞교환을 통해 도심항공모빌리티(UAM) 등 미래 모빌리티 분야의 경쟁력을 키우기로 합의한 바 있다.'}]\n", + "254\n", + "[{'summary_text': '네이버 KT주주모임 카페에서 아이디 알바트로스님은 “현대차가 선을 넘는건가요?”라고 했고, chsu6366님은 “현대차그룹의 양아치 경영에 분노를 표하며 주주들이 불매운동에 적극적으로 동참하시길 당부드린다. KT CFO는 현대차그룹 지분을 매각하시길 바란다”고 했으며, 네이버 KT주주모임 카페에서 아이디 알바트로스님은 “현대차가 선을 넘는건가요?”라고 했고, chsu6366님은 “현대차그룹의 양아치 경영에 분노를 표하며 주주들이 불매운동에 적극적으로 동참하시길 '}]\n", + "265\n", + "[{'summary_text': '지난 정부 출신 사외이사들이 사퇴하면서 KT 이사회는 사내이사 0명, 사외이사 4명이 남은 상태이며 이중 강충구, 여은정, 표현명 이사가 주총에서 재선임되지 않으면 이사는 1명만 남게 되며 현대차 반대해 최종 부결돼도 상법으로 이사 의무 유지하지만, 법조계에 따르면 설사 KT 이사가 한 명도 안 남아도 상법상 이사의 결원 조항으로 인해 새 이사회 구성까지 임무를 담당할 수 있다.'}]\n", + "252\n", + "[{'summary_text': 'KT 이사회의 최소 의결 정족 원수는 3명인데, 현대차 주장대로 선임안이 부결되면 이사는 1명 남게 되고, 부결돼도 해당 이사들은 이 조항에 근거해 임시주총에서 새로운 이사가 추천돼 선임될 때까지 퇴임이사로 활동할 수 있다.\\n\\n\\nKT의 주가는 다시 3만 원대 아래로 추락했다.\\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\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n\\n'}]\n" + ] + } + ], + "source": [ + "list_news = [\"뚜렷한 이유는 안밝혀..지난해 사업협력 단순투자로 공시했는데네이버 카페 주주모임, 불매운동하자는 글까지3명 사외이사 재선임 최종 부결돼도상법상 임시주총까지 퇴임이사로 활동 가능[이데일리 김현아 기자]KT의 지분 7.79%(현대자동차 4.69%, 현대모비스 3.1%)를 보유한 현대자동차그룹이 오는 31일 KT 주주총회에서 KT 사외이사 3명의 재선임안(임기 1년)에 대해 반대하겠다는 뜻을 KT에 전달한 것으로 확인되자, KT 개인주주들이 분노하고 있다. 현대차그룹은 강충구 고려대 전기전자공학부 교수, 여은정 중앙대 경영학부 교수, 표현명 한국타이어테크놀로지 사외이사 등 3명에 대해 반대의 뜻을 KT에 전했다. 앞서 현대차그룹은 윤경림 차기 CEO 후보에 대해서도 “이사회가 대주주 의견을 고려해야 한다”는 취지를 밝혀, 사실상 최대 주주인 국민연금과 뜻을 함께 하겠다는 의지를 밝힌 바 있다. 지난해 KT와 현대차는 7500억 규모의 자사주 맞교환을 통해 도심항공모빌리티(UAM) 등 미래 모빌리티 분야의 경쟁력을 키우기로 합의한 바 있다. 현대차 그룹이 KT 지분 4.6%, 현대모비스가 KT 지분 3.1%를, KT가 현대차 지분 1.04%와 현대모비스 지분 1.46%를 갖게 됐다.\"\n", + ",\n", + "\"당시 양사는 “사업협력을 위한 단순투자”라면서 지분투자 목적을 ‘단순투자’로 공시했다. 하지만, 이 같은 보도가 나오자 개인주주들은 반발하고 있다. 네이버 KT주주모임 카페에서 아이디 알바트로스님은 “현대차가 선을 넘는건가요?”라고 했고, chsu6366님은 “현대차그룹의 양아치 경영에 분노를 표하며 주주들이 불매운동에 적극적으로 동참하시길 당부드린다. KT CFO는 현대차그룹 지분을 매각하시길 바란다”고 했다. 앞서 주주모임 카페 개설자도 이데일리와의 통화에서 “이번 주총에서 현대차, 신한은행이 반대하면, 주주제안으로 미래사업 제휴에서 두 회사를 제외하고 KT와 상호주식교환 등을 한 걸 해지하라고 요구할 예정이다.\"\n", + ",\n", + "\"카페 안에선 굉장히 좋은 현대차에 대해 불매 운동까지 하자는 글도 있다”고 밝힌 바 있다. 한편 이강철 이사에 이어 어제(28일),김대유 이사(DB생명 사외이사)와 유희열 이사(한국 이산화탄소 포집 및 처리 연구개발센터(KCRC) 이사장) 등 지난 정부 출신 사외이사들이 사퇴하면서 KT 이사회는 사내이사 0명, 사외이사 4명이 남은 상태다. 이중 강충구, 여은정, 표현명 이사가 주총에서 재선임되지 않으면 이사는 1명만 남게 된다. 현대차 반대해 최종 부결돼도 상법으로 이사 의무 유지하지만, 법조계에 따르면 설사 KT 이사가 한 명도 안 남아도 상법상 이사의 결원 조항으로 인해 새 이사회 구성까지 임무를 담당할 수 있다. 퇴임이사 자격으로 가능하다.\"\n", + ",\n", + "\"ESG 자문기관인 서스틴베스트 자문 변호사에 따르면, 상법 386조 1항에 따라, 법률 또는 정관에서 정한 이사의 원수를 결한 경우에는 임기의 만료 또는 사임으로 인하여 퇴임한 이사는 새로 선임된 이사가 취임할 때까지 이사로서의 권리와 의무가 있다고 돼 있다. KT 이사회의 최소 의결 정족 원수는 3명인데, 현대차 주장대로 선임안이 부결되면 이사는 1명 남게 된다. 하지만, 부결돼도 해당 이사들은 이 조항에 근거해 임시주총에서 새로운 이사가 추천돼 선임될 때까지 퇴임이사로 활동할 수 있다. 한편 KT의 주가는 다시 3만 원대 아래로 추락했다. 29일 현재 2만 9200원이 돼 전날보다 2.83% 하락한 채 마감했다.\"]\n", + "\n", + "for news in list_news:\n", + " print(get_summary(news))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffc8a358-74c6-4a1b-9cdc-e0dd34119fd1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Notebooks/Summerization/Model/Model_train_with_T5_paper.ipynb b/Notebooks/Summerization/Model/Model_train_with_T5_paper.ipynb new file mode 100644 index 0000000..26415fb --- /dev/null +++ b/Notebooks/Summerization/Model/Model_train_with_T5_paper.ipynb @@ -0,0 +1,1546 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "7a4d6f4e-9af2-4d80-83ca-a704b7839e37", + "metadata": {}, + "outputs": [], + "source": [ + "# from transformers import T5Tokenizer, T5ForConditionalGeneration, pipeline" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "79486004-f07e-4cd1-a061-7edd26b6168b", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ee82085818a14b6791f65ef00e86eed4", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Loading checkpoint shards: 0%| | 0/13 [00:00\n" + ] + } + ], + "source": [ + "print(\"전문\")\n", + "print(dataset_paper_tokenized[\"train\"][100][\"all\"])\n", + "print(\"요약\")\n", + "print(dataset_paper_tokenized[\"train\"][100][\"sum\"])\n", + "print()\n", + "print(tokenizer.decode(dataset_paper_tokenized[\"train\"][100][\"labels\"]))" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "41d2c757-6890-4284-8a40-5bde4520f07f", + "metadata": {}, + "outputs": [], + "source": [ + "rouge = evaluate.load(\"rouge\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "df7358a6-807f-460a-8ab6-2849b4ea2dd9", + "metadata": {}, + "outputs": [], + "source": [ + "def compute_metrics(eval_pred):\n", + " predictions, labels = eval_pred\n", + " print(predictions, labels)\n", + " decoded_preds = tokenizer.batch_decode(predictions, skip_special_tokens=True)\n", + " labels = np.where(labels != -100, labels, tokenizer.pad_token_id)\n", + " decoded_labels = tokenizer.batch_decode(labels, skip_special_tokens=True)\n", + "\n", + " result = rouge.compute(predictions=decoded_preds, references=decoded_labels, use_stemmer=True)\n", + "\n", + " prediction_lens = [np.count_nonzero(pred != tokenizer.pad_token_id) for pred in predictions]\n", + " result[\"gen_len\"] = np.mean(prediction_lens)\n", + "\n", + " return {k: round(v, 4) for k, v in result.items()}" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "e4bd4aea-b113-4a5d-b69b-959868bb4e3e", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [128073/143992 15:30:10 < 1:55:37, 2.29 it/s, Epoch 3.56/4]\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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + " \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", + "
StepTraining LossValidation LossRouge1Rouge2RougelRougelsumGen Len
20000.3219000.3128910.0971000.0262000.0975000.09770018.994800
40000.2793000.2932010.0968000.0254000.0970000.09720019.000000
60000.2715000.2790730.0999000.0280000.1001000.10030019.000000
80000.2699000.2713380.0986000.0272000.0988000.09930019.000000
100000.2711000.2620790.1003000.0254000.1007000.10090019.000000
120000.2620000.2649400.1004000.0262000.1007000.10060019.000000
140000.2664000.2554690.1027000.0264000.1027000.10310019.000000
160000.2574000.2487800.0999000.0254000.1001000.10010019.000000
180000.2415000.2551190.1001000.0258000.1005000.10100019.000000
200000.2427000.2428680.0976000.0264000.0980000.09830019.000000
220000.2523000.2451050.0992000.0272000.0993000.09960018.994800
240000.2429000.2403370.1060000.0266000.1060000.10650019.000000
260000.2431000.2395540.1037000.0261000.1041000.10440018.994800
280000.2380000.2437250.1002000.0259000.1004000.10080018.994800
300000.2489000.2366550.0987000.0232000.0988000.09900018.994800
320000.2454000.2401670.1032000.0258000.1029000.10330018.994800
340000.2345000.2345690.1042000.0258000.1042000.10480018.994800
360000.2476000.2308130.1055000.0272000.1054000.10570019.000000
380000.2283000.2364530.1074000.0273000.1075000.10790018.994800
400000.2278000.2310060.1050000.0272000.1050000.10540018.994800
420000.2252000.2305520.1031000.0272000.1035000.10360018.994800
440000.2173000.2292040.1023000.0272000.1029000.10290018.994800
460000.2149000.2267190.1043000.0273000.1040000.10470018.994800
480000.2243000.2238700.1036000.0267000.1033000.10380018.994800
500000.2254000.2236860.1015000.0258000.1016000.10220018.994800
520000.2179000.2271500.1078000.0277000.1075000.10860018.994800
540000.2130000.2225170.1046000.0291000.1044000.10510019.000000
560000.2266000.2211380.1034000.0278000.1035000.10440018.994800
580000.2195000.2227670.1035000.0276000.1036000.10410019.000000
600000.2227000.2202680.1071000.0296000.1073000.10790018.994800
620000.2141000.2227660.1039000.0284000.1043000.10450019.000000
640000.2110000.2195190.1029000.0281000.1032000.10360018.994800
660000.2123000.2209340.1036000.0281000.1040000.10430019.000000
680000.2051000.2207610.1035000.0278000.1041000.10420018.994800
700000.2156000.2200640.1018000.0286000.1019000.10250019.000000
720000.2162000.2199500.1030000.0281000.1032000.10340018.994800
740000.1992000.2187380.1031000.0284000.1028000.10350019.000000
760000.2043000.2181930.1062000.0286000.1063000.10680018.994800
780000.2074000.2143840.1053000.0281000.1052000.10580018.994800
800000.2049000.2180570.1058000.0284000.1058000.10620018.994800
820000.2053000.2124300.1020000.0278000.1015000.10290019.000000
840000.2045000.2133730.1038000.0281000.1037000.10470019.000000
860000.1962000.2117060.1031000.0278000.1033000.10370019.000000
880000.2118000.2152550.1057000.0284000.1060000.10670019.000000
900000.1989000.2111470.1045000.0278000.1045000.10510018.994800
920000.2026000.2119450.1040000.0278000.1038000.10430019.000000
940000.1971000.2137720.1014000.0278000.1012000.10190019.000000
960000.2033000.2122180.1043000.0278000.1038000.10480019.000000
980000.2058000.2115180.1033000.0284000.1030000.10370019.000000
1000000.2036000.2114630.1080000.0286000.1080000.10830019.000000
1020000.2023000.2106870.1061000.0286000.1064000.10690018.994800
1040000.1949000.2109140.1035000.0286000.1036000.10420019.000000
1060000.2019000.2100240.1035000.0284000.1030000.10420019.000000
1080000.2022000.2096210.1066000.0286000.1064000.10720019.000000
1100000.1908000.2091400.1052000.0286000.1055000.10600019.000000
1120000.1936000.2105310.1066000.0286000.1066000.10700019.000000
1140000.1894000.2099500.1058000.0284000.1057000.10610019.000000
1160000.1931000.2087720.1077000.0284000.1076000.10800019.000000
1180000.1920000.2101690.1051000.0284000.1051000.10550019.000000
1200000.1942000.2088230.1051000.0284000.1051000.10550019.000000
1220000.1904000.2071020.1058000.0284000.1057000.10620019.000000
1240000.2048000.2085450.1059000.0284000.1058000.10620019.000000
1260000.1957000.2095840.1063000.0284000.1060000.10690019.000000
1280000.1902000.2065110.1077000.0284000.1074000.10790019.000000

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 262 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 2739 222 ... 222 1440 333]\n", + " [ 0 1373 222 ... 222 8589 222]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 262 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "IOPub message rate exceeded.\n", + "The Jupyter server will temporarily stop sending output\n", + "to the client in order to avoid crashing it.\n", + "To change this limit, set the config variable\n", + "`--ServerApp.iopub_msg_rate_limit`.\n", + "\n", + "Current values:\n", + "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n", + "ServerApp.rate_limit_window=3.0 (secs)\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "IOPub message rate exceeded.\n", + "The Jupyter server will temporarily stop sending output\n", + "to the client in order to avoid crashing it.\n", + "To change this limit, set the config variable\n", + "`--ServerApp.iopub_msg_rate_limit`.\n", + "\n", + "Current values:\n", + "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n", + "ServerApp.rate_limit_window=3.0 (secs)\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "IOPub message rate exceeded.\n", + "The Jupyter server will temporarily stop sending output\n", + "to the client in order to avoid crashing it.\n", + "To change this limit, set the config variable\n", + "`--ServerApp.iopub_msg_rate_limit`.\n", + "\n", + "Current values:\n", + "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n", + "ServerApp.rate_limit_window=3.0 (secs)\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "IOPub message rate exceeded.\n", + "The Jupyter server will temporarily stop sending output\n", + "to the client in order to avoid crashing it.\n", + "To change this limit, set the config variable\n", + "`--ServerApp.iopub_msg_rate_limit`.\n", + "\n", + "Current values:\n", + "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n", + "ServerApp.rate_limit_window=3.0 (secs)\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n", + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "IOPub message rate exceeded.\n", + "The Jupyter server will temporarily stop sending output\n", + "to the client in order to avoid crashing it.\n", + "To change this limit, set the config variable\n", + "`--ServerApp.iopub_msg_rate_limit`.\n", + "\n", + "Current values:\n", + "ServerApp.iopub_msg_rate_limit=1000.0 (msgs/sec)\n", + "ServerApp.rate_limit_window=3.0 (secs)\n", + "\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0 262 222 ... 6596 476 222]\n", + " [ 0 582 222 ... 1838 389 222]\n", + " [ 0 7717 222 ... 1018 1024 222]\n", + " ...\n", + " [ 0 262 222 ... 1001 2452 279]\n", + " [ 0 43327 972 ... 1085 222 1630]\n", + " [ 0 4376 222 ... 248 8497 302]] [[ 262 222 1271 ... 681 222 1]\n", + " [ 262 222 1271 ... 222 517 1]\n", + " [7717 222 1164 ... -100 -100 -100]\n", + " ...\n", + " [ 262 222 1271 ... -100 -100 -100]\n", + " [ 262 222 6851 ... -100 -100 -100]\n", + " [4376 222 8796 ... 222 657 1]]\n" + ] + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[14], line 31\u001b[0m\n\u001b[1;32m 5\u001b[0m training_args \u001b[38;5;241m=\u001b[39m Seq2SeqTrainingArguments(\n\u001b[1;32m 6\u001b[0m output_dir\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msummary\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[1;32m 7\u001b[0m evaluation_strategy\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msteps\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 18\u001b[0m fp16\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m,\n\u001b[1;32m 19\u001b[0m )\n\u001b[1;32m 21\u001b[0m trainer \u001b[38;5;241m=\u001b[39m Seq2SeqTrainer(\n\u001b[1;32m 22\u001b[0m model\u001b[38;5;241m=\u001b[39mmodel,\n\u001b[1;32m 23\u001b[0m args\u001b[38;5;241m=\u001b[39mtraining_args,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 28\u001b[0m compute_metrics\u001b[38;5;241m=\u001b[39mcompute_metrics,\n\u001b[1;32m 29\u001b[0m )\n\u001b[0;32m---> 31\u001b[0m \u001b[43mtrainer\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 32\u001b[0m model(dataset_paper_tokenized[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mtrain\u001b[39m\u001b[38;5;124m\"\u001b[39m][\u001b[38;5;241m0\u001b[39m][\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124minput_ids\u001b[39m\u001b[38;5;124m\"\u001b[39m])\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/trainer.py:1537\u001b[0m, in \u001b[0;36mTrainer.train\u001b[0;34m(self, resume_from_checkpoint, trial, ignore_keys_for_eval, **kwargs)\u001b[0m\n\u001b[1;32m 1532\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel_wrapped \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mmodel\n\u001b[1;32m 1534\u001b[0m inner_training_loop \u001b[38;5;241m=\u001b[39m find_executable_batch_size(\n\u001b[1;32m 1535\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_inner_training_loop, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_train_batch_size, args\u001b[38;5;241m.\u001b[39mauto_find_batch_size\n\u001b[1;32m 1536\u001b[0m )\n\u001b[0;32m-> 1537\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43minner_training_loop\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1538\u001b[0m \u001b[43m \u001b[49m\u001b[43margs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1539\u001b[0m \u001b[43m \u001b[49m\u001b[43mresume_from_checkpoint\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mresume_from_checkpoint\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1540\u001b[0m \u001b[43m \u001b[49m\u001b[43mtrial\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtrial\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1541\u001b[0m \u001b[43m \u001b[49m\u001b[43mignore_keys_for_eval\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mignore_keys_for_eval\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1542\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/trainer.py:1802\u001b[0m, in \u001b[0;36mTrainer._inner_training_loop\u001b[0;34m(self, batch_size, args, resume_from_checkpoint, trial, ignore_keys_for_eval)\u001b[0m\n\u001b[1;32m 1799\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcontrol \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcallback_handler\u001b[38;5;241m.\u001b[39mon_step_begin(args, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcontrol)\n\u001b[1;32m 1801\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39maccelerator\u001b[38;5;241m.\u001b[39maccumulate(model):\n\u001b[0;32m-> 1802\u001b[0m tr_loss_step \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtraining_step\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1804\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m (\n\u001b[1;32m 1805\u001b[0m args\u001b[38;5;241m.\u001b[39mlogging_nan_inf_filter\n\u001b[1;32m 1806\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m is_torch_tpu_available()\n\u001b[1;32m 1807\u001b[0m \u001b[38;5;129;01mand\u001b[39;00m (torch\u001b[38;5;241m.\u001b[39misnan(tr_loss_step) \u001b[38;5;129;01mor\u001b[39;00m torch\u001b[38;5;241m.\u001b[39misinf(tr_loss_step))\n\u001b[1;32m 1808\u001b[0m ):\n\u001b[1;32m 1809\u001b[0m \u001b[38;5;66;03m# if loss is nan or inf simply add the average of previous logged losses\u001b[39;00m\n\u001b[1;32m 1810\u001b[0m tr_loss \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m tr_loss \u001b[38;5;241m/\u001b[39m (\u001b[38;5;241m1\u001b[39m \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mstate\u001b[38;5;241m.\u001b[39mglobal_step \u001b[38;5;241m-\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_globalstep_last_logged)\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/trainer.py:2647\u001b[0m, in \u001b[0;36mTrainer.training_step\u001b[0;34m(self, model, inputs)\u001b[0m\n\u001b[1;32m 2644\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m loss_mb\u001b[38;5;241m.\u001b[39mreduce_mean()\u001b[38;5;241m.\u001b[39mdetach()\u001b[38;5;241m.\u001b[39mto(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs\u001b[38;5;241m.\u001b[39mdevice)\n\u001b[1;32m 2646\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mcompute_loss_context_manager():\n\u001b[0;32m-> 2647\u001b[0m loss \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcompute_loss\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmodel\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2649\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs\u001b[38;5;241m.\u001b[39mn_gpu \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m:\n\u001b[1;32m 2650\u001b[0m loss \u001b[38;5;241m=\u001b[39m loss\u001b[38;5;241m.\u001b[39mmean() \u001b[38;5;66;03m# mean() to average on multi-gpu parallel training\u001b[39;00m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/trainer.py:2672\u001b[0m, in \u001b[0;36mTrainer.compute_loss\u001b[0;34m(self, model, inputs, return_outputs)\u001b[0m\n\u001b[1;32m 2670\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 2671\u001b[0m labels \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m-> 2672\u001b[0m outputs \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43minputs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2673\u001b[0m \u001b[38;5;66;03m# Save past state if it exists\u001b[39;00m\n\u001b[1;32m 2674\u001b[0m \u001b[38;5;66;03m# TODO: this needs to be fixed and made cleaner later.\u001b[39;00m\n\u001b[1;32m 2675\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39margs\u001b[38;5;241m.\u001b[39mpast_index \u001b[38;5;241m>\u001b[39m\u001b[38;5;241m=\u001b[39m \u001b[38;5;241m0\u001b[39m:\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/accelerate/utils/operations.py:553\u001b[0m, in \u001b[0;36mconvert_outputs_to_fp32..forward\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 552\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmodel_forward\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/accelerate/utils/operations.py:541\u001b[0m, in \u001b[0;36mConvertOutputsToFp32.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 541\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m convert_to_fp32(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmodel_forward\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m)\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/amp/autocast_mode.py:14\u001b[0m, in \u001b[0;36mautocast_decorator..decorate_autocast\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(func)\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdecorate_autocast\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m autocast_instance:\n\u001b[0;32m---> 14\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/accelerate/utils/operations.py:553\u001b[0m, in \u001b[0;36mconvert_outputs_to_fp32..forward\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 552\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmodel_forward\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/accelerate/utils/operations.py:541\u001b[0m, in \u001b[0;36mConvertOutputsToFp32.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 541\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m convert_to_fp32(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmodel_forward\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m)\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/amp/autocast_mode.py:14\u001b[0m, in \u001b[0;36mautocast_decorator..decorate_autocast\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(func)\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdecorate_autocast\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m autocast_instance:\n\u001b[0;32m---> 14\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + " \u001b[0;31m[... skipping similar frames: ConvertOutputsToFp32.__call__ at line 541 (2 times), autocast_decorator..decorate_autocast at line 14 (2 times), convert_outputs_to_fp32..forward at line 553 (2 times)]\u001b[0m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/accelerate/utils/operations.py:553\u001b[0m, in \u001b[0;36mconvert_outputs_to_fp32..forward\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 552\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 553\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mmodel_forward\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/accelerate/utils/operations.py:541\u001b[0m, in \u001b[0;36mConvertOutputsToFp32.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21m__call__\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[0;32m--> 541\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m convert_to_fp32(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmodel_forward\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m)\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/amp/autocast_mode.py:14\u001b[0m, in \u001b[0;36mautocast_decorator..decorate_autocast\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(func)\n\u001b[1;32m 12\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdecorate_autocast\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 13\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m autocast_instance:\n\u001b[0;32m---> 14\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/models/t5/modeling_t5.py:1717\u001b[0m, in \u001b[0;36mT5ForConditionalGeneration.forward\u001b[0;34m(self, input_ids, attention_mask, decoder_input_ids, decoder_attention_mask, head_mask, decoder_head_mask, cross_attn_head_mask, encoder_outputs, past_key_values, inputs_embeds, decoder_inputs_embeds, labels, use_cache, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m 1714\u001b[0m decoder_attention_mask \u001b[38;5;241m=\u001b[39m decoder_attention_mask\u001b[38;5;241m.\u001b[39mto(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdecoder\u001b[38;5;241m.\u001b[39mfirst_device)\n\u001b[1;32m 1716\u001b[0m \u001b[38;5;66;03m# Decode\u001b[39;00m\n\u001b[0;32m-> 1717\u001b[0m decoder_outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mdecoder\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1718\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_ids\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdecoder_input_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1719\u001b[0m \u001b[43m \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdecoder_attention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1720\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs_embeds\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdecoder_inputs_embeds\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1721\u001b[0m \u001b[43m \u001b[49m\u001b[43mpast_key_values\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpast_key_values\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1722\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoder_hidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1723\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoder_attention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1724\u001b[0m \u001b[43m \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mdecoder_head_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1725\u001b[0m \u001b[43m \u001b[49m\u001b[43mcross_attn_head_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcross_attn_head_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1726\u001b[0m \u001b[43m \u001b[49m\u001b[43muse_cache\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43muse_cache\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1727\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1728\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_hidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1729\u001b[0m \u001b[43m \u001b[49m\u001b[43mreturn_dict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreturn_dict\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1730\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1732\u001b[0m sequence_output \u001b[38;5;241m=\u001b[39m decoder_outputs[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 1734\u001b[0m \u001b[38;5;66;03m# Set device for model parallelism\u001b[39;00m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/models/t5/modeling_t5.py:1094\u001b[0m, in \u001b[0;36mT5Stack.forward\u001b[0;34m(self, input_ids, attention_mask, encoder_hidden_states, encoder_attention_mask, inputs_embeds, head_mask, cross_attn_head_mask, past_key_values, use_cache, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m 1081\u001b[0m layer_outputs \u001b[38;5;241m=\u001b[39m checkpoint(\n\u001b[1;32m 1082\u001b[0m create_custom_forward(layer_module),\n\u001b[1;32m 1083\u001b[0m hidden_states,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1091\u001b[0m \u001b[38;5;28;01mNone\u001b[39;00m, \u001b[38;5;66;03m# past_key_value is always None with gradient checkpointing\u001b[39;00m\n\u001b[1;32m 1092\u001b[0m )\n\u001b[1;32m 1093\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m-> 1094\u001b[0m layer_outputs \u001b[38;5;241m=\u001b[39m \u001b[43mlayer_module\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1095\u001b[0m \u001b[43m \u001b[49m\u001b[43mhidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1096\u001b[0m \u001b[43m \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mextended_attention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1097\u001b[0m \u001b[43m \u001b[49m\u001b[43mposition_bias\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mposition_bias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1098\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoder_hidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoder_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1099\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoder_attention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoder_extended_attention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1100\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoder_decoder_position_bias\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoder_decoder_position_bias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1101\u001b[0m \u001b[43m \u001b[49m\u001b[43mlayer_head_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlayer_head_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1102\u001b[0m \u001b[43m \u001b[49m\u001b[43mcross_attn_layer_head_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcross_attn_layer_head_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1103\u001b[0m \u001b[43m \u001b[49m\u001b[43mpast_key_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpast_key_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1104\u001b[0m \u001b[43m \u001b[49m\u001b[43muse_cache\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43muse_cache\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1105\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1106\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1108\u001b[0m \u001b[38;5;66;03m# layer_outputs is a tuple with:\u001b[39;00m\n\u001b[1;32m 1109\u001b[0m \u001b[38;5;66;03m# hidden-states, key-value-states, (self-attention position bias), (self-attention weights), (cross-attention position bias), (cross-attention weights)\u001b[39;00m\n\u001b[1;32m 1110\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m use_cache \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mFalse\u001b[39;00m:\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/models/t5/modeling_t5.py:724\u001b[0m, in \u001b[0;36mT5Block.forward\u001b[0;34m(self, hidden_states, attention_mask, position_bias, encoder_hidden_states, encoder_attention_mask, encoder_decoder_position_bias, layer_head_mask, cross_attn_layer_head_mask, past_key_value, use_cache, output_attentions, return_dict)\u001b[0m\n\u001b[1;32m 721\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 722\u001b[0m query_length \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m--> 724\u001b[0m cross_attention_outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mlayer\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 725\u001b[0m \u001b[43m \u001b[49m\u001b[43mhidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 726\u001b[0m \u001b[43m \u001b[49m\u001b[43mkey_value_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoder_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 727\u001b[0m \u001b[43m \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoder_attention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 728\u001b[0m \u001b[43m \u001b[49m\u001b[43mposition_bias\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mencoder_decoder_position_bias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 729\u001b[0m \u001b[43m \u001b[49m\u001b[43mlayer_head_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcross_attn_layer_head_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 730\u001b[0m \u001b[43m \u001b[49m\u001b[43mpast_key_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mcross_attn_past_key_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 731\u001b[0m \u001b[43m \u001b[49m\u001b[43mquery_length\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquery_length\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 732\u001b[0m \u001b[43m \u001b[49m\u001b[43muse_cache\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43muse_cache\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 733\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 734\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 735\u001b[0m hidden_states \u001b[38;5;241m=\u001b[39m cross_attention_outputs[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 737\u001b[0m \u001b[38;5;66;03m# clamp inf values to enable fp16 training\u001b[39;00m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/models/t5/modeling_t5.py:635\u001b[0m, in \u001b[0;36mT5LayerCrossAttention.forward\u001b[0;34m(self, hidden_states, key_value_states, attention_mask, position_bias, layer_head_mask, past_key_value, use_cache, query_length, output_attentions)\u001b[0m\n\u001b[1;32m 622\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mforward\u001b[39m(\n\u001b[1;32m 623\u001b[0m \u001b[38;5;28mself\u001b[39m,\n\u001b[1;32m 624\u001b[0m hidden_states,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 632\u001b[0m output_attentions\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m,\n\u001b[1;32m 633\u001b[0m ):\n\u001b[1;32m 634\u001b[0m normed_hidden_states \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mlayer_norm(hidden_states)\n\u001b[0;32m--> 635\u001b[0m attention_output \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mEncDecAttention\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 636\u001b[0m \u001b[43m \u001b[49m\u001b[43mnormed_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 637\u001b[0m \u001b[43m \u001b[49m\u001b[43mmask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 638\u001b[0m \u001b[43m \u001b[49m\u001b[43mkey_value_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mkey_value_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 639\u001b[0m \u001b[43m \u001b[49m\u001b[43mposition_bias\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mposition_bias\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 640\u001b[0m \u001b[43m \u001b[49m\u001b[43mlayer_head_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlayer_head_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 641\u001b[0m \u001b[43m \u001b[49m\u001b[43mpast_key_value\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpast_key_value\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 642\u001b[0m \u001b[43m \u001b[49m\u001b[43muse_cache\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43muse_cache\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 643\u001b[0m \u001b[43m \u001b[49m\u001b[43mquery_length\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mquery_length\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 644\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 645\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 646\u001b[0m layer_output \u001b[38;5;241m=\u001b[39m hidden_states \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdropout(attention_output[\u001b[38;5;241m0\u001b[39m])\n\u001b[1;32m 647\u001b[0m outputs \u001b[38;5;241m=\u001b[39m (layer_output,) \u001b[38;5;241m+\u001b[39m attention_output[\u001b[38;5;241m1\u001b[39m:] \u001b[38;5;66;03m# add attentions if we output them\u001b[39;00m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/models/t5/modeling_t5.py:560\u001b[0m, in \u001b[0;36mT5Attention.forward\u001b[0;34m(self, hidden_states, mask, key_value_states, position_bias, past_key_value, layer_head_mask, query_length, use_cache, output_attentions)\u001b[0m\n\u001b[1;32m 557\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 558\u001b[0m position_bias_masked \u001b[38;5;241m=\u001b[39m position_bias\n\u001b[0;32m--> 560\u001b[0m scores \u001b[38;5;241m+\u001b[39m\u001b[38;5;241m=\u001b[39m position_bias_masked\n\u001b[1;32m 561\u001b[0m attn_weights \u001b[38;5;241m=\u001b[39m nn\u001b[38;5;241m.\u001b[39mfunctional\u001b[38;5;241m.\u001b[39msoftmax(scores\u001b[38;5;241m.\u001b[39mfloat(), dim\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m)\u001b[38;5;241m.\u001b[39mtype_as(\n\u001b[1;32m 562\u001b[0m scores\n\u001b[1;32m 563\u001b[0m ) \u001b[38;5;66;03m# (batch_size, n_heads, seq_length, key_length)\u001b[39;00m\n\u001b[1;32m 564\u001b[0m attn_weights \u001b[38;5;241m=\u001b[39m nn\u001b[38;5;241m.\u001b[39mfunctional\u001b[38;5;241m.\u001b[39mdropout(\n\u001b[1;32m 565\u001b[0m attn_weights, p\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mdropout, training\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mtraining\n\u001b[1;32m 566\u001b[0m ) \u001b[38;5;66;03m# (batch_size, n_heads, seq_length, key_length)\u001b[39;00m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "from transformers import DataCollatorForSeq2Seq\n", + "\n", + "data_collator = DataCollatorForSeq2Seq(tokenizer=tokenizer, model=str_model)\n", + "\n", + "training_args = Seq2SeqTrainingArguments(\n", + " output_dir=\"summary\",\n", + " evaluation_strategy=\"steps\",\n", + " learning_rate=2e-5,\n", + " per_device_train_batch_size=8,\n", + " per_device_eval_batch_size=8,\n", + " # gradient_accumulation_steps=2,\n", + " # eval_accumulation_steps=8,\n", + " weight_decay=0.01,\n", + " save_total_limit=3,\n", + " num_train_epochs=4,\n", + " predict_with_generate=True,\n", + " eval_steps=2000,\n", + " fp16=True,\n", + ")\n", + "\n", + "trainer = Seq2SeqTrainer(\n", + " model=model,\n", + " args=training_args,\n", + " train_dataset=dataset_paper_tokenized[\"train\"],\n", + " eval_dataset=dataset_paper_tokenized[\"test\"],\n", + " tokenizer=tokenizer,\n", + " data_collator=data_collator,\n", + " compute_metrics=compute_metrics,\n", + ")\n", + "\n", + "trainer.train()\n", + "model(dataset_paper_tokenized[\"train\"][0][\"input_ids\"])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "c703c4d5-a377-40d2-92fd-c9447f3d3ff1", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "model(tokenizer(\"우아아아아아\", max_length=1024, truncation=True, return_tensors=\"pt\")[\"input_ids\"].to(\"cuda\"))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "03ee9ab2-1326-476f-a472-23d1794c9410", + "metadata": {}, + "outputs": [], + "source": [ + "import accelerate\n", + "accelerate.__version__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "43edf680-b4dc-499a-b4ae-c7b69cae8609", + "metadata": {}, + "outputs": [], + "source": [ + "# export 'PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:512'" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "id": "c6c6833f-fd44-4e48-8ded-64720d223930", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[{'summary_text': '빅테크 기업이 아닌 일반 기업이나 연구자가 거대 언어'}]" + ] + }, + "execution_count": 69, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from transformers import pipeline\n", + "\n", + "summarizer = pipeline(\"summarization\", model=\"./summary/checkpoint-128000\")\n", + "# summarizer = pipeline(\"text2text-generation\", model=\"./summary/checkpoint-128000\")\n", + "summarizer(\"요약: \" + \"GPT-3를 필두로 하여 거대 파라미터의 모델에 대규모 코퍼스를 학습한 (초)거대 언어모델은 자연스러운 문장을 생성하거나 다양한 태스크를 적은 학습 데이터로 수행하는 등 뛰어난 가능성을 보였다. 하지만 학습에 막대한 자본이 필요한 거대 언어모델은 AI의 독점화 및 권력화, 그리고 데이터 및 컴퓨팅 파워 격차에 따른 기술 격차 심화를 낳을 것이라는 우려도 존재한다. 빅테크 기업이 아닌 일반 기업이나 연구자가 거대 언어 모델을 다루기는 쉽지 않은 것은 엄연한 사실이다.\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "id": "13e7d548-91d4-4783-980a-475db86d42f6", + "metadata": {}, + "outputs": [], + "source": [ + "full_news = \"\"\"\n", + "뚜렷한 이유는 안밝혀..지난해 사업협력 단순투자로 공시했는데네이버 카페 주주모임, 불매운동하자는 글까지3명 사외이사 재선임 최종 부결돼도상법상 임시주총까지 퇴임이사로 활동 가능[이데일리 김현아 기자]KT의 지분 7.79%(현대자동차 4.69%, 현대모비스 3.1%)를 보유한 현대자동차그룹이 오는 31일 KT 주주총회에서 KT 사외이사 3명의 재선임안(임기 1년)에 대해 반대하겠다는 뜻을 KT에 전달한 것으로 확인되자, KT 개인주주들이 분노하고 있다. 현대차그룹은 강충구 고려대 전기전자공학부 교수, 여은정 중앙대 경영학부 교수, 표현명 한국타이어테크놀로지 사외이사 등 3명에 대해 반대의 뜻을 KT에 전했다. 앞서 현대차그룹은 윤경림 차기 CEO 후보에 대해서도 “이사회가 대주주 의견을 고려해야 한다”는 취지를 밝혀, 사실상 최대 주주인 국민연금과 뜻을 함께 하겠다는 의지를 밝힌 바 있다. 지난해 KT와 현대차는 7500억 규모의 자사주 맞교환을 통해 도심항공모빌리티(UAM) 등 미래 모빌리티 분야의 경쟁력을 키우기로 합의한 바 있다. 현대차 그룹이 KT 지분 4.6%, 현대모비스가 KT 지분 3.1%를, KT가 현대차 지분 1.04%와 현대모비스 지분 1.46%를 갖게 됐다.\n", + "\"\"\"\n", + "\n", + "def get_summary(full_news):\n", + " news_tokenized = len(tokenizer(full_news)[\"input_ids\"])\n", + " print(news_tokenized)\n", + " \n", + " return summarizer(full_news, min_length=news_tokenized // 2, max_length=news_tokenized // 2 + (news_tokenized // 4))\n", + "\n", + "# 1934\n", + "\n", + "# [{'generated_text': '제주항공에 자금을 지원하기 위해 제주항공 주식을 담보로 돈을 빌리는 AK홀딩스, SK케미칼 주식 공개매수 나서는 SK디스커버리, 하나금융14호스팩으로 본 스팩의 상장폐지 절차와 관련한 이야기 등을 담아봤어요.AK홀딩스 제주항공 유증 참여 위해 교환사채 발행애경그룹 지주회사AK홀딩스가 자회사인 저비용항공사제주항공의 주주배정 유상증자 참여를 위해 1300억원 ) '}]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "3c03de28-85d6-42e8-b246-4fe55d8782e7", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "436\n", + "[{'summary_text': 'KT의 지분 7.79%를 보유한 현대자동차그룹이 오는 31일 KT 주주총회에서 KT 사외이사 3명의 재선임안에 대해 반대하겠다는 뜻을 KT에 전달한 것으로 확인되자, KT 개인주주들이 분노하고 있다. 현대차그룹은 강충구 고려대 전기전자공학부 교수, 여은정 중앙대 경영학부 교수, 표현명 한국타이어테크놀로지 사외이사 등 3명에 대해 '}]\n", + "254\n", + "[{'summary_text': '네이버 KT주주모임 카페에서 아이디 알바트로스님은 “현대차가 선을 넘는건가요?”라고 했고, chsu6366님은 “현대차그룹의 양아치 경영에 분노를 표하며 주주들이 불매운동에 적극적으로 동참하시길 당부드린다. KT CFO는 현대차그룹 지분을 매각하시길 바란다”고 했다. 앞서 주주모임 카페 개설자도 이데일리와의 통화에서 �'}]\n", + "265\n", + "[{'summary_text': '강충구, 여은정, 표현명 이사가 주총에서 재선임되지 않으면 이사는 1명만 남게 된다. 현대차 반대해 최종 부결돼도 상법으로 이사 의무 유지하지만, 법조계에 따르면 설사 KT 이사가 한 명도 안 남아도 상법상 이사의 결원 조항으로 인해 새 이사회 구성까지 임무를 담당할 수 있다. 퇴임이사 자격으로 가능하다.\\n\\n퇴임이사 자격으로 '}]\n", + "252\n", + "[{'summary_text': 'KT 이사회의 최소 의결 정족 원수는 3명인데, 현대차 주장대로 선임안이 부결되면 이사는 1명 남게 된다. 하지만, 부결돼도 해당 이사들은 이 조항에 근거해 임시주총에서 새로운 이사가 추천돼 선임될 때까지 퇴임이사로 활동할 수 있다. 한편 KT의 주가는 다시 3만 원대 아래로 추락했다. 29일 현재 2만 9200원이 '}]\n" + ] + } + ], + "source": [ + "list_news = [\"뚜렷한 이유는 안밝혀..지난해 사업협력 단순투자로 공시했는데네이버 카페 주주모임, 불매운동하자는 글까지3명 사외이사 재선임 최종 부결돼도상법상 임시주총까지 퇴임이사로 활동 가능[이데일리 김현아 기자]KT의 지분 7.79%(현대자동차 4.69%, 현대모비스 3.1%)를 보유한 현대자동차그룹이 오는 31일 KT 주주총회에서 KT 사외이사 3명의 재선임안(임기 1년)에 대해 반대하겠다는 뜻을 KT에 전달한 것으로 확인되자, KT 개인주주들이 분노하고 있다. 현대차그룹은 강충구 고려대 전기전자공학부 교수, 여은정 중앙대 경영학부 교수, 표현명 한국타이어테크놀로지 사외이사 등 3명에 대해 반대의 뜻을 KT에 전했다. 앞서 현대차그룹은 윤경림 차기 CEO 후보에 대해서도 “이사회가 대주주 의견을 고려해야 한다”는 취지를 밝혀, 사실상 최대 주주인 국민연금과 뜻을 함께 하겠다는 의지를 밝힌 바 있다. 지난해 KT와 현대차는 7500억 규모의 자사주 맞교환을 통해 도심항공모빌리티(UAM) 등 미래 모빌리티 분야의 경쟁력을 키우기로 합의한 바 있다. 현대차 그룹이 KT 지분 4.6%, 현대모비스가 KT 지분 3.1%를, KT가 현대차 지분 1.04%와 현대모비스 지분 1.46%를 갖게 됐다.\",\n", + "\"당시 양사는 “사업협력을 위한 단순투자”라면서 지분투자 목적을 ‘단순투자’로 공시했다. 하지만, 이 같은 보도가 나오자 개인주주들은 반발하고 있다. 네이버 KT주주모임 카페에서 아이디 알바트로스님은 “현대차가 선을 넘는건가요?”라고 했고, chsu6366님은 “현대차그룹의 양아치 경영에 분노를 표하며 주주들이 불매운동에 적극적으로 동참하시길 당부드린다. KT CFO는 현대차그룹 지분을 매각하시길 바란다”고 했다. 앞서 주주모임 카페 개설자도 이데일리와의 통화에서 “이번 주총에서 현대차, 신한은행이 반대하면, 주주제안으로 미래사업 제휴에서 두 회사를 제외하고 KT와 상호주식교환 등을 한 걸 해지하라고 요구할 예정이다.\",\n", + "\"카페 안에선 굉장히 좋은 현대차에 대해 불매 운동까지 하자는 글도 있다”고 밝힌 바 있다. 한편 이강철 이사에 이어 어제(28일),김대유 이사(DB생명 사외이사)와 유희열 이사(한국 이산화탄소 포집 및 처리 연구개발센터(KCRC) 이사장) 등 지난 정부 출신 사외이사들이 사퇴하면서 KT 이사회는 사내이사 0명, 사외이사 4명이 남은 상태다. 이중 강충구, 여은정, 표현명 이사가 주총에서 재선임되지 않으면 이사는 1명만 남게 된다. 현대차 반대해 최종 부결돼도 상법으로 이사 의무 유지하지만, 법조계에 따르면 설사 KT 이사가 한 명도 안 남아도 상법상 이사의 결원 조항으로 인해 새 이사회 구성까지 임무를 담당할 수 있다. 퇴임이사 자격으로 가능하다.\",\n", + "\"ESG 자문기관인 서스틴베스트 자문 변호사에 따르면, 상법 386조 1항에 따라, 법률 또는 정관에서 정한 이사의 원수를 결한 경우에는 임기의 만료 또는 사임으로 인하여 퇴임한 이사는 새로 선임된 이사가 취임할 때까지 이사로서의 권리와 의무가 있다고 돼 있다. KT 이사회의 최소 의결 정족 원수는 3명인데, 현대차 주장대로 선임안이 부결되면 이사는 1명 남게 된다. 하지만, 부결돼도 해당 이사들은 이 조항에 근거해 임시주총에서 새로운 이사가 추천돼 선임될 때까지 퇴임이사로 활동할 수 있다. 한편 KT의 주가는 다시 3만 원대 아래로 추락했다. 29일 현재 2만 9200원이 돼 전날보다 2.83% 하락한 채 마감했다.\"]\n", + "\n", + "for news in list_news:\n", + " print(get_summary(news))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "ffc8a358-74c6-4a1b-9cdc-e0dd34119fd1", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Notebooks/Summerization/Model/koGPT_prompt.ipynb b/Notebooks/Summerization/Model/koGPT_prompt.ipynb new file mode 100644 index 0000000..316da9b --- /dev/null +++ b/Notebooks/Summerization/Model/koGPT_prompt.ipynb @@ -0,0 +1,486 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "fe1eb58b-396f-4c33-9218-137c3bf8d26b", + "metadata": {}, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "4a8b90b111ef4117852d0e8394bd027e", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Loading checkpoint shards: 0%| | 0/13 [00:00= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [1,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [2,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [3,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [4,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [5,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [6,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [7,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [8,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [9,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [10,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [11,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [12,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [13,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [14,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [15,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [16,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [17,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [18,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [19,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [20,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [21,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [22,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [23,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [24,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [25,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [26,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [27,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [28,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [29,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [30,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [31,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [32,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [33,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [34,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [35,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [36,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [37,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [38,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [39,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [40,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [41,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [42,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [43,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [44,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [45,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [46,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [47,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [48,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [49,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [50,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [51,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [52,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [53,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [54,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [55,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [56,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [57,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [58,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [59,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [60,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [61,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [62,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n", + "../aten/src/ATen/native/cuda/ScatterGatherKernel.cu:144: operator(): block: [0,0,0], thread: [63,0,0] Assertion `idx_dim >= 0 && idx_dim < index_size && \"index out of bounds\"` failed.\n" + ] + }, + { + "ename": "RuntimeError", + "evalue": "CUDA error: device-side assert triggered\nCUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.\nFor debugging consider passing CUDA_LAUNCH_BLOCKING=1.\nCompile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.\n", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mRuntimeError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[4], line 20\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m torch\u001b[38;5;241m.\u001b[39mno_grad():\n\u001b[1;32m 19\u001b[0m tokens \u001b[38;5;241m=\u001b[39m tokenizer\u001b[38;5;241m.\u001b[39mencode(prompt, return_tensors\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mpt\u001b[39m\u001b[38;5;124m'\u001b[39m)\u001b[38;5;241m.\u001b[39mto(device\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcuda\u001b[39m\u001b[38;5;124m'\u001b[39m, non_blocking\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m---> 20\u001b[0m gen_tokens \u001b[38;5;241m=\u001b[39m \u001b[43mmodel\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mgenerate\u001b[49m\u001b[43m(\u001b[49m\u001b[43mtokens\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdo_sample\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtemperature\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m0.8\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_length\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;241;43m2300\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 21\u001b[0m generated \u001b[38;5;241m=\u001b[39m tokenizer\u001b[38;5;241m.\u001b[39mbatch_decode(gen_tokens)[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 23\u001b[0m \u001b[38;5;28mprint\u001b[39m(generated)\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/utils/_contextlib.py:115\u001b[0m, in \u001b[0;36mcontext_decorator..decorate_context\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 112\u001b[0m \u001b[38;5;129m@functools\u001b[39m\u001b[38;5;241m.\u001b[39mwraps(func)\n\u001b[1;32m 113\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mdecorate_context\u001b[39m(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs):\n\u001b[1;32m 114\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m ctx_factory():\n\u001b[0;32m--> 115\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/generation/utils.py:1582\u001b[0m, in \u001b[0;36mGenerationMixin.generate\u001b[0;34m(self, inputs, generation_config, logits_processor, stopping_criteria, prefix_allowed_tokens_fn, synced_gpus, assistant_model, streamer, **kwargs)\u001b[0m\n\u001b[1;32m 1574\u001b[0m input_ids, model_kwargs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_expand_inputs_for_generation(\n\u001b[1;32m 1575\u001b[0m input_ids\u001b[38;5;241m=\u001b[39minput_ids,\n\u001b[1;32m 1576\u001b[0m expand_size\u001b[38;5;241m=\u001b[39mgeneration_config\u001b[38;5;241m.\u001b[39mnum_return_sequences,\n\u001b[1;32m 1577\u001b[0m is_encoder_decoder\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39mis_encoder_decoder,\n\u001b[1;32m 1578\u001b[0m \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mmodel_kwargs,\n\u001b[1;32m 1579\u001b[0m )\n\u001b[1;32m 1581\u001b[0m \u001b[38;5;66;03m# 13. run sample\u001b[39;00m\n\u001b[0;32m-> 1582\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msample\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1583\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1584\u001b[0m \u001b[43m \u001b[49m\u001b[43mlogits_processor\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlogits_processor\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1585\u001b[0m \u001b[43m \u001b[49m\u001b[43mlogits_warper\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlogits_warper\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1586\u001b[0m \u001b[43m \u001b[49m\u001b[43mstopping_criteria\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstopping_criteria\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1587\u001b[0m \u001b[43m \u001b[49m\u001b[43mpad_token_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgeneration_config\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mpad_token_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1588\u001b[0m \u001b[43m \u001b[49m\u001b[43meos_token_id\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgeneration_config\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43meos_token_id\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1589\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_scores\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgeneration_config\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moutput_scores\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1590\u001b[0m \u001b[43m \u001b[49m\u001b[43mreturn_dict_in_generate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mgeneration_config\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mreturn_dict_in_generate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1591\u001b[0m \u001b[43m \u001b[49m\u001b[43msynced_gpus\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msynced_gpus\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1592\u001b[0m \u001b[43m \u001b[49m\u001b[43mstreamer\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mstreamer\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1593\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mmodel_kwargs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1594\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1596\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m is_beam_gen_mode:\n\u001b[1;32m 1597\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m generation_config\u001b[38;5;241m.\u001b[39mnum_return_sequences \u001b[38;5;241m>\u001b[39m generation_config\u001b[38;5;241m.\u001b[39mnum_beams:\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/generation/utils.py:2636\u001b[0m, in \u001b[0;36mGenerationMixin.sample\u001b[0;34m(self, input_ids, logits_processor, stopping_criteria, logits_warper, max_length, pad_token_id, eos_token_id, output_attentions, output_hidden_states, output_scores, return_dict_in_generate, synced_gpus, streamer, **model_kwargs)\u001b[0m\n\u001b[1;32m 2633\u001b[0m model_inputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mprepare_inputs_for_generation(input_ids, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mmodel_kwargs)\n\u001b[1;32m 2635\u001b[0m \u001b[38;5;66;03m# forward pass to get next token\u001b[39;00m\n\u001b[0;32m-> 2636\u001b[0m outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2637\u001b[0m \u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mmodel_inputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2638\u001b[0m \u001b[43m \u001b[49m\u001b[43mreturn_dict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\n\u001b[1;32m 2639\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2640\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_hidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 2641\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2643\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m synced_gpus \u001b[38;5;129;01mand\u001b[39;00m this_peer_finished:\n\u001b[1;32m 2644\u001b[0m \u001b[38;5;28;01mcontinue\u001b[39;00m \u001b[38;5;66;03m# don't waste resources running the code we don't need\u001b[39;00m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/models/gptj/modeling_gptj.py:854\u001b[0m, in \u001b[0;36mGPTJForCausalLM.forward\u001b[0;34m(self, input_ids, past_key_values, attention_mask, token_type_ids, position_ids, head_mask, inputs_embeds, labels, use_cache, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m 846\u001b[0m \u001b[38;5;124mr\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 847\u001b[0m \u001b[38;5;124;03mlabels (`torch.LongTensor` of shape `(batch_size, sequence_length)`, *optional*):\u001b[39;00m\n\u001b[1;32m 848\u001b[0m \u001b[38;5;124;03m Labels for language modeling. Note that the labels **are shifted** inside the model, i.e. you can set\u001b[39;00m\n\u001b[1;32m 849\u001b[0m \u001b[38;5;124;03m `labels = input_ids` Indices are selected in `[-100, 0, ..., config.vocab_size]` All labels set to `-100`\u001b[39;00m\n\u001b[1;32m 850\u001b[0m \u001b[38;5;124;03m are ignored (masked), the loss is only computed for labels in `[0, ..., config.vocab_size]`\u001b[39;00m\n\u001b[1;32m 851\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 852\u001b[0m return_dict \u001b[38;5;241m=\u001b[39m return_dict \u001b[38;5;28;01mif\u001b[39;00m return_dict \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;28;01melse\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mconfig\u001b[38;5;241m.\u001b[39muse_return_dict\n\u001b[0;32m--> 854\u001b[0m transformer_outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtransformer\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 855\u001b[0m \u001b[43m \u001b[49m\u001b[43minput_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 856\u001b[0m \u001b[43m \u001b[49m\u001b[43mpast_key_values\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mpast_key_values\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 857\u001b[0m \u001b[43m \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 858\u001b[0m \u001b[43m \u001b[49m\u001b[43mtoken_type_ids\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtoken_type_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 859\u001b[0m \u001b[43m \u001b[49m\u001b[43mposition_ids\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mposition_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 860\u001b[0m \u001b[43m \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhead_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 861\u001b[0m \u001b[43m \u001b[49m\u001b[43minputs_embeds\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minputs_embeds\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 862\u001b[0m \u001b[43m \u001b[49m\u001b[43muse_cache\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43muse_cache\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 863\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 864\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_hidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_hidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 865\u001b[0m \u001b[43m \u001b[49m\u001b[43mreturn_dict\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mreturn_dict\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 866\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 867\u001b[0m hidden_states \u001b[38;5;241m=\u001b[39m transformer_outputs[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 869\u001b[0m \u001b[38;5;66;03m# Set device for model parallelism\u001b[39;00m\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/models/gptj/modeling_gptj.py:689\u001b[0m, in \u001b[0;36mGPTJModel.forward\u001b[0;34m(self, input_ids, past_key_values, attention_mask, token_type_ids, position_ids, head_mask, inputs_embeds, use_cache, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m 680\u001b[0m outputs \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mutils\u001b[38;5;241m.\u001b[39mcheckpoint\u001b[38;5;241m.\u001b[39mcheckpoint(\n\u001b[1;32m 681\u001b[0m create_custom_forward(block),\n\u001b[1;32m 682\u001b[0m hidden_states,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 686\u001b[0m head_mask[i],\n\u001b[1;32m 687\u001b[0m )\n\u001b[1;32m 688\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 689\u001b[0m outputs \u001b[38;5;241m=\u001b[39m \u001b[43mblock\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 690\u001b[0m \u001b[43m \u001b[49m\u001b[43mhidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 691\u001b[0m \u001b[43m \u001b[49m\u001b[43mlayer_past\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlayer_past\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 692\u001b[0m \u001b[43m \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 693\u001b[0m \u001b[43m \u001b[49m\u001b[43mposition_ids\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mposition_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 694\u001b[0m \u001b[43m \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhead_mask\u001b[49m\u001b[43m[\u001b[49m\u001b[43mi\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 695\u001b[0m \u001b[43m \u001b[49m\u001b[43muse_cache\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43muse_cache\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 696\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 697\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 699\u001b[0m hidden_states \u001b[38;5;241m=\u001b[39m outputs[\u001b[38;5;241m0\u001b[39m]\n\u001b[1;32m 700\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m use_cache \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mTrue\u001b[39;00m:\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/models/gptj/modeling_gptj.py:309\u001b[0m, in \u001b[0;36mGPTJBlock.forward\u001b[0;34m(self, hidden_states, layer_past, attention_mask, position_ids, head_mask, use_cache, output_attentions)\u001b[0m\n\u001b[1;32m 307\u001b[0m residual \u001b[38;5;241m=\u001b[39m hidden_states\n\u001b[1;32m 308\u001b[0m hidden_states \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mln_1(hidden_states)\n\u001b[0;32m--> 309\u001b[0m attn_outputs \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mattn\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 310\u001b[0m \u001b[43m \u001b[49m\u001b[43mhidden_states\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhidden_states\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 311\u001b[0m \u001b[43m \u001b[49m\u001b[43mlayer_past\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mlayer_past\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 312\u001b[0m \u001b[43m \u001b[49m\u001b[43mattention_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mattention_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 313\u001b[0m \u001b[43m \u001b[49m\u001b[43mposition_ids\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mposition_ids\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 314\u001b[0m \u001b[43m \u001b[49m\u001b[43mhead_mask\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhead_mask\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 315\u001b[0m \u001b[43m \u001b[49m\u001b[43muse_cache\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43muse_cache\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 316\u001b[0m \u001b[43m \u001b[49m\u001b[43moutput_attentions\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43moutput_attentions\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 317\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 318\u001b[0m attn_output \u001b[38;5;241m=\u001b[39m attn_outputs[\u001b[38;5;241m0\u001b[39m] \u001b[38;5;66;03m# output_attn: a, present, (attentions)\u001b[39;00m\n\u001b[1;32m 319\u001b[0m outputs \u001b[38;5;241m=\u001b[39m attn_outputs[\u001b[38;5;241m1\u001b[39m:]\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[38;5;66;03m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[38;5;66;03m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m (\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_backward_pre_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[38;5;129;01mor\u001b[39;00m _global_forward_hooks \u001b[38;5;129;01mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mforward_call\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1502\u001b[0m \u001b[38;5;66;03m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[38;5;241m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/models/gptj/modeling_gptj.py:233\u001b[0m, in \u001b[0;36mGPTJAttention.forward\u001b[0;34m(self, hidden_states, layer_past, attention_mask, position_ids, head_mask, use_cache, output_attentions)\u001b[0m\n\u001b[1;32m 230\u001b[0m q_rot \u001b[38;5;241m=\u001b[39m query[:, :, :, : \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrotary_dim]\n\u001b[1;32m 231\u001b[0m q_pass \u001b[38;5;241m=\u001b[39m query[:, :, :, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mrotary_dim :]\n\u001b[0;32m--> 233\u001b[0m k_rot \u001b[38;5;241m=\u001b[39m \u001b[43mapply_rotary_pos_emb\u001b[49m\u001b[43m(\u001b[49m\u001b[43mk_rot\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msin\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcos\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 234\u001b[0m q_rot \u001b[38;5;241m=\u001b[39m apply_rotary_pos_emb(q_rot, sin, cos)\n\u001b[1;32m 236\u001b[0m key \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mcat([k_rot, k_pass], dim\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m)\n", + "File \u001b[0;32m/opt/conda/lib/python3.8/site-packages/transformers/models/gptj/modeling_gptj.py:77\u001b[0m, in \u001b[0;36mapply_rotary_pos_emb\u001b[0;34m(tensor, sin, cos)\u001b[0m\n\u001b[1;32m 76\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mapply_rotary_pos_emb\u001b[39m(tensor: torch\u001b[38;5;241m.\u001b[39mTensor, sin: torch\u001b[38;5;241m.\u001b[39mTensor, cos: torch\u001b[38;5;241m.\u001b[39mTensor) \u001b[38;5;241m-\u001b[39m\u001b[38;5;241m>\u001b[39m torch\u001b[38;5;241m.\u001b[39mTensor:\n\u001b[0;32m---> 77\u001b[0m sin \u001b[38;5;241m=\u001b[39m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrepeat_interleave\u001b[49m\u001b[43m(\u001b[49m\u001b[43msin\u001b[49m\u001b[43m[\u001b[49m\u001b[43m:\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[43m]\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m2\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m3\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 78\u001b[0m cos \u001b[38;5;241m=\u001b[39m torch\u001b[38;5;241m.\u001b[39mrepeat_interleave(cos[:, :, \u001b[38;5;28;01mNone\u001b[39;00m, :], \u001b[38;5;241m2\u001b[39m, \u001b[38;5;241m3\u001b[39m)\n\u001b[1;32m 79\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m (tensor \u001b[38;5;241m*\u001b[39m cos) \u001b[38;5;241m+\u001b[39m (rotate_every_two(tensor) \u001b[38;5;241m*\u001b[39m sin)\n", + "\u001b[0;31mRuntimeError\u001b[0m: CUDA error: device-side assert triggered\nCUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.\nFor debugging consider passing CUDA_LAUNCH_BLOCKING=1.\nCompile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.\n" + ] + } + ], + "source": [ + "print(\"포르쉐코리아는 최대 598마력의 힘을 발휘하며 정지 상태에서 100km h까지 가속하는 데 단 3.7초가 걸리는 전기 스포츠카 타이칸 GTS 를 국내 공식 출시한다고 7일 밝혔으며 국내 인증 기준 1회 충전 시 주행 거리는 317km이며 급속 충전 네트워크의 직류 DC 에너지를 활용해 단 5분 충전으로 최대 100km까지 주행 가능하다.\")\n", + "print()\n", + "\n", + "prompt = \"\"\"\n", + "아래의 문장을 요약해줘. \n", + "\n", + "앵커 정부가 올해 하반기 우리 경제의 버팀목인 수출 확대를 위해 총력을 기울이기로 했습니다. 특히 수출 중소기업의 물류난 해소를 위해 무역금융 규모를 40조 원 이상 확대하고 물류비 지원과 임시선박 투입 등을 추진하기로 했습니다. 류환홍 기자가 보도합니다. 기자 수출은 최고의 실적을 보였지만 수입액이 급증하면서 올해 상반기 우리나라 무역수지는 역대 최악인 103억 달러 적자를 기록했습니다. 정부가 수출확대에 총력을 기울이기로 한 것은 원자재 가격 상승 등 대외 리스크가 가중되는 상황에서 수출 증가세 지속이야말로 한국경제의 회복을 위한 열쇠라고 본 것입니다. 추경호 경제부총리 겸 기획재정부 장관 정부는 우리 경제의 성장엔진인 수출이 높은 증가세를 지속할 수 있도록 총력을 다하겠습니다. 우선 물류 부담 증가 원자재 가격 상승 등 가중되고 있는 대외 리스크에 대해 적극 대응하겠습니다. 특히 중소기업과 중견기업 수출 지원을 위해 무역금융 규모를 연초 목표보다 40조 원 늘린 301조 원까지 확대하고 물류비 부담을 줄이기 위한 대책도 마련했습니다. 이창양 산업통상자원부 장관 국제 해상운임이 안정될 때까지 월 4척 이상의 임시선박을 지속 투입하는 한편 중소기업 전용 선복 적재 용량 도 현재보다 주당 50TEU 늘려 공급하겠습니다. 하반기에 우리 기업들의 수출 기회를 늘리기 위해 2 500여 개 수출기업을 대상으로 해외 전시회 참가를 지원하는 등 마케팅 지원도 벌이기로 했습니다. 정부는 또 이달 중으로 반도체를 비롯한 첨단 산업 육성 전략을 마련해 수출 증가세를 뒷받침하고 에너지 소비를 줄이기 위한 효율화 방안을 마련해 무역수지 개선에 나서기로 했습니다. YTN 류환홍입니다.\n", + "\n", + "요약:\n", + "올해 상반기 우리나라 무역수지는 역대 최악인 103억 달러 적자를 기록한 가운데, 정부가 하반기에 우리 경제의 버팀목인 수출 확대를 위해 총력을 기울이기로 결정한 가운데, 특히 수출 중소기업의 물류난 해소를 위해 무역금융 규모를 40조 원 이상 확대하고 물류비 지원과 임시선박 투입 등을 추진하기로 했다.\n", + "\n", + "아래의 문장을 요약해줘. \n", + "\n", + "디지털데일리 변재영 기자 포르쉐코리아는 전기 스포츠카 타이칸 GTS 를 국내 공식 출시한다고 7일 밝혔다. 타이칸 GTS는 최대 598마력의 힘을 발휘하며 정지 상태에서 100km h까지 가속하는 데 단 3.7초가 소요된다. 국내 인증 기준 1회 충전 시 주행 거리는 317km이며 급속 충전 네트워크의 직류 DC 에너지를 활용해 단 5분 충전으로 최대 100km까지 주행 가능하다. 타이칸 GTS에는 두 개의 전기 모터가 탑재됐다. 하나는 프런트 액슬 다른 하나는 리어 액슬에 배치해 사륜구동을 완성한다. 포르쉐 액티브 서스펜션 매니지먼트 PASM 를 포함하는 어댑티브 에어 서스펜션 옵션 사양의 리어 액슬 스티어링을 통해 GTS다운 역동성을 강화했으며 포르쉐 일렉트릭 스포츠 사운드는 한층 더 풍부한 사운드 패턴으로 새로운 GTS 모델의 특성을 강조한다. 가격은 1억8030만원이다.\n", + "\n", + "요약:\n", + "\"\"\"\n", + "with torch.no_grad():\n", + " tokens = tokenizer.encode(prompt, return_tensors='pt').to(device='cuda', non_blocking=True)\n", + " gen_tokens = model.generate(tokens, do_sample=True, temperature=0.8, max_length=2300)\n", + " generated = tokenizer.batch_decode(gen_tokens)[0]\n", + " \n", + "print(generated)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "be02a764-2bfd-4be2-85e0-f579bfce92a8", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Notebooks/Summerization/Model/polyglot-ko-3.8b_with_news.ipynb b/Notebooks/Summerization/Model/polyglot-ko-3.8b_with_news.ipynb new file mode 100644 index 0000000..db4719f --- /dev/null +++ b/Notebooks/Summerization/Model/polyglot-ko-3.8b_with_news.ipynb @@ -0,0 +1,2178 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "XIyP_0r6zuVc" + }, + "source": [ + "# `transformers` meets `bitsandbytes` for democratzing Large Language Models (LLMs) through 4bit quantization\n", + "\n", + "

\n", + "\"drawing\"\n", + "
\n", + "\n", + "Welcome to this notebook that goes through the recent `bitsandbytes` integration that includes the work from XXX that introduces no performance degradation 4bit quantization techniques, for democratizing LLMs inference and training.\n", + "\n", + "In this notebook, we will learn together how to load a large model in 4bit (`gpt-neo-x-20b`) and train it using Google Colab and PEFT library from Hugging Face 🤗.\n", + "\n", + "[In the general usage notebook](https://colab.research.google.com/drive/1ge2F1QSK8Q7h0hn3YKuBCOAS0bK8E0wf?usp=sharing), you can learn how to propely load a model in 4bit with all its variants.\n", + "\n", + "If you liked the previous work for integrating [*LLM.int8*](https://arxiv.org/abs/2208.07339), you can have a look at the [introduction blogpost](https://huggingface.co/blog/hf-bitsandbytes-integration) to lean more about that quantization method.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CHX-RCPdkXgP", + "outputId": "d294f833-6f45-4014-e4ed-75ef26141a0b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wed Jul 12 04:45:42 2023 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 Tesla V100-PCIE... Off | 00000000:00:05.0 Off | Off |\n", + "| N/A 42C P0 37W / 250W | 0MiB / 32510MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FuXIFTFapAMI", + "outputId": "340f0ca7-6dfd-4350-b2d2-15f983adfc66" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "# !pip install -q -U bitsandbytes\n", + "# !pip install -q -U git+https://github.com/huggingface/transformers.git\n", + "# !pip install -q -U git+https://github.com/huggingface/peft.git\n", + "# !pip install -q -U git+https://github.com/huggingface/accelerate.git\n", + "# !pip install -q datasets" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MJ-5idQwzvg-" + }, + "source": [ + "First let's load the model we are going to use - GPT-neo-x-20B! Note that the model itself is around 40GB in half precision" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 87, + "referenced_widgets": [ + "278070bfaaac4794a649f11306ad2947", + "5391d6d2385549319099d3bf653c34ee", + "ee696f00718b43989f653dd01391a87d", + "e39e4f5284224bfdbde4359d8593d206", + "0a91d94890634dc1bb43176347c27fec", + "ec9d84f9337948cba5562b7e995bb2ef", + "3473e65596d5455385269f59e6159e38", + "416d78e5558f4019972720c8d52a410b", + "388757e992344b06b2fc7e4573eba77d", + "664f6a3720a446929197650580dd005d", + "92e0594143bd4c2690dc3ddaa0170b17" + ] + }, + "id": "jm4FzCvfeYcK", + "outputId": "bf40f8d2-7603-407d-fba5-6686eddd49aa" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Found cached dataset csv (/opt/ml/.cache/huggingface/datasets/daekeun-ml___csv/daekeun-ml--naver-news-summarization-ko-314b3fce3cddf558/0.0.0/eea64c71ca8b46dd3f537ed218fc9bf495d5707789152eb2764f5c78fa66d59d)\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "8c525e2b77064e4b96344dd471c71156", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/3 [00:00\" }\n", + "# if x['input'] else\n", + "# {'text':f\"### 명령어: {x['instruction']}\\n\\n### 답변: {x['output']}<|endoftext|>\"},\n", + "# )\n", + "# data\n", + "# data = data.map(\n", + "# lambda x: {'text':f\"### 명령어: {x['instruction']}\\n\\n### 답변: {x['output']}<|endoftext|>\"},\n", + "# )\n", + "data = data.map(\n", + " lambda x: {'text': f\"### 질문: 아래의 문서를 요약해줘.\\n\\n###맥락: {x['document']}\\n\\n### 답변: {x['summary']}<|endoftext|>\" }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "E0Nl5mWL0k2T", + "outputId": "e601d45a-99f5-46ff-aecf-497ed8754c24" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "5b20575992c14a6d9506f1292025bc9a", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Downloading (…)okenizer_config.json: 0%| | 0.00/164 [00:00'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tokenizer.decode(data[\"train\"][0][\"input_ids\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "a9EUEDAl0ss3" + }, + "outputs": [], + "source": [ + "from peft import prepare_model_for_kbit_training\n", + "\n", + "model.gradient_checkpointing_enable()\n", + "model = prepare_model_for_kbit_training(model)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "gkIcwsSU01EB" + }, + "outputs": [], + "source": [ + "def print_trainable_parameters(model):\n", + " \"\"\"\n", + " Prints the number of trainable parameters in the model.\n", + " \"\"\"\n", + " trainable_params = 0\n", + " all_param = 0\n", + " for _, param in model.named_parameters():\n", + " all_param += param.numel()\n", + " if param.requires_grad:\n", + " trainable_params += param.numel()\n", + " print(\n", + " f\"trainable params: {trainable_params} || all params: {all_param} || trainable%: {100 * trainable_params / all_param}\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Ybeyl20n3dYH", + "outputId": "327a4a63-db3d-4631-edec-23f8d08d14ac" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "trainable params: 3145728 || all params: 2001180672 || trainable%: 0.15719360295720466\n" + ] + } + ], + "source": [ + "from peft import LoraConfig, get_peft_model\n", + "\n", + "config = LoraConfig(\n", + " r=8,\n", + " lora_alpha=16,\n", + " target_modules=[\"query_key_value\"],\n", + " # target_modules=[\"q_proj\", \"v_proj\"],\n", + " lora_dropout=0.05,\n", + " bias=\"none\",\n", + " task_type=\"CAUSAL_LM\"\n", + ")\n", + "\n", + "model = get_peft_model(model, config)\n", + "print_trainable_parameters(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FCc64bfnmd3j" + }, + "source": [ + "Let's load a common dataset, english quotes, to fine tune our model on famous quotes." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "s6f4z8EYmcJ6", + "outputId": "21c8ba2d-fd89-40f3-f0b6-c73772f06bf2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wed Jul 12 02:00:00 2023 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 Tesla V100-PCIE... Off | 00000000:00:05.0 Off | Off |\n", + "| N/A 46C P0 38W / 250W | 5707MiB / 32510MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_0MOtwf3zdZp" + }, + "source": [ + "Run the cell below to run the training! For the sake of the demo, we just ran it for few steps just to showcase how to use this integration with existing tools on the HF ecosystem." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Filter: 0%| | 0/22194 [00:00\n", + "1 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 한국형 우주발사체 누리호 가 지난 6월 21일 전남 고흥 나로우주센터 발사대에서 날아올라 성공적으로 발사됐다. 한국항공우주연구원 제공 파이낸셜뉴스 한국형 우주발사체 누리호 의 발사 성공에 힘입어 뉴스페이스 시대를 앞당기기 위한 발걸음이 빨라졌다. 우선 누리호를 설계하고 제작 발사하는 기술을 이전받을 기업을 9월까지 선정키로 했다. 또한 민간 우주기업들을 위한 산업단지와 각종 인프라가 들어설 우주산업 클러스터가 조성될 지역을 8월중 선정할 계획이다. 이같은 계획에 앞서 윤석렬 대통령은 지난 6일 한국항공우주연구원에서 우리의 미래가 국가 경쟁력의 핵심 분야인 우주에 달려 있다 며 항공우주산업을 체계적으로 지원하겠다고 밝혔다. 이는 대선후보시절부터 내세웠던 공약을 이행하겠다는 의지를 표명한 것이다. 누리호 기술 민간에 이전 과학기술정보통신부는 7일 이를위해 제42회 우주개발진흥실무위원회를 개최하고 한국형발사체 고도화사업 체계종합기업 선정 계획과 우주산업 클러스터 추진계획을 확정했다. 과기정통부 오태석 제1차관은 이날 우주개발진흥실무위원회에서 누리호 2차 발사 성공을 통한 국민적 지지 확보와 우주개발진흥법 개정을 통한 제도적 기반 마련 국정과제 반영 등 정부의 강력한 정책 의지가 엿보인다 며 지금이 우리나라 우주산업 육성의 골든타임이라고 판단된다 고 말했다. 과기정통부는 지난 6월 국내 우주산업 육성을 위한 우주개발진흥법 개정과 누리호 2차 발사 성공 등에 발맞춰 뉴스페이스 시대를 앞당기겠다는 윤 대통령의 의지를 뒷받침하고 있다. 우선 과기정통부는 한국형발사체 고도화사업의 일환으로 체계종합기업을 선정한다. 한국형발사체 고도화사업은 올해부터 2027년까지 총 6874억원을 투입해 누리호를 4차례 반복 발사하면서 누리호의 신뢰성을 높인다. 이때 발사체 체계종합기업에 선정된 기업은 이 기간동안 한국항공우주연구원으로부터 발사체의 설계와 제작 발사 등 전과정에 참여하면서 기술을 이전받게 된다. 과기정통부는 한국연구재단을 통해 체계종합기업 선정을 위한 기술능력 평가위원회를 꾸려 평가할 계획이다. 우주산업 클러스터 8월중 선정 또한 실무위원회에서는 우주산업 클러스터 추진계획을 확정했다. 이는 뉴스페이스 시대에 대비 민간이 주도하는 우주산업 본격 육성을 목적으로 발사체 특화지구와 위성 특화지구 지정이 주요 골자다. 과기정통부는 계획안에 맞춰 발사체와 위성 특화지구의 최적 후보지를 8월중 국가우주위원회 심의를 거쳐 최종 선정키로 했다. 이를 위해 오는 9월 중 우주산업클러스터 세부 사업의 예비타당성 조사를 신청키로 했다. 예타가 성공적으로 마무리되면 내년에 예산안을 마련해 2024년부터는 본격적으로 클러스터 구축 사업에 착수할 계획이다. 과기정통부가 정한 특화지구 지정원칙에 따르면 지역균형을 고려해 특화지구 지정때 수도권은 후보지에서 제외된다. 또한 관련 인프라가 이미 구축돼 있는 지역을 우선 검토할 예정이다. 우주산업 클러스터는 기존 인프라를 중심으로 조성해 국가 우주자산 활용을 극대화한다느 전략이다. 여기에 산업단지 조성과 연구개발 등의 지원을 통해 산업체 유치와 혁신 역량을 강화한다. 발사체 특화지구에는 발사체 산업단지와 조립·제작 창업 등을 지원하는 종합지원센터가 구축된다. 또 위성 특화지구에는 위성 산업단지와 인공위성과 관련된 시험인증 창업 지원등을 위한 지원종합지원센터가 들어서게 된다.이와함께 궤도나 발사 전자파 등 우주환경 시험 시설까지 확충할 계획이다. 이외에도 지역 대학 등과 연계해 거점별 특화된 전문 인력을 상시 공급하는 계획도 포함돼 있다.\n", + "\n", + "### 답변: 한국형 우주발사체 누리호가 지난 6월 21일 전남 고흥 나로우주센터 발사대에서 성공적으로 발사됨에 따라, 우주산업 클러스터가 조성될 지역을 8월중 선정하는 등 누리호 설계 및 제작 발사하는 기술의 이전으로 뉴스페이스 시대를 앞당기기 위한 계획이 빨라지고 있다.<|endoftext|>\n", + "2 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 닥터둠 루비니 주가 50% 폭락할 것 뉴욕 증시 3대지수 모두 하락 대형주 중심의 미국 스탠더드앤드푸어스 S P 500 지수가 올 상반기 50여년만에 최악의 실적을 기록했다. 30일 이하 미국 현지시간 뉴욕 증시 3대 지수는 모두 하락하며 부진한 상반기 실적으로 마감했다. 일각에서는 경기침체 우려로 인해 추가 하락이 올 수 있다는 경고 메시지가 나오고 있다. 30일 뉴욕 증시에선 이번주 들어 4일 연속 하락장을 기록했다. 뉴욕증권거래소 NYSE 에서 다우존스 산업평균지수는 전장보다 253.88포인트 0.82% 하락한 30 775.43으로 거래를 마쳤다. S P500지수는 전장보다 33.45포인트 0.88% 하락한 3 785.38을 기술주 중심의 나스닥 지수는 전장보다 149.16포인트 1.33% 하락한 11 028.74로 장을 마감했다. 올해 상반기 마지막 거래일인 이날 뉴욕 증시 3대 지수는 모두 크게 저조한 실적을 기록했다. S P500의 경우 연초 기준으로 21.08% 하락했는데 이는 52년 전인 1970년 상반기 이후 가장 낮은 수준이다. 분기 기준으로 보면 다우와 S P500은 지난 2020년 1분기 이후 최저 기술주 중심의 나스닥은 2분기에만 22.4%가 빠졌는데 이는 2008년 이후 최악의 분기 실적이다. 홈리치 버그의 최고투자책임자 스테파니 랭은 우리는 전례없는 전염병으로 인해 세계적인 셧다운을 경험했고 재정과 통화 부문에서 모두 전례없는 결과로 이어졌다 면서 수요와 공급 부문에 퍼펙트 스톰이 불어닥쳤고 이제 수십년만에 다시 찾아오는 인플레이션으로 인해 미국 연방준비제도 연준·Fed 가 금리인상으로 바빠졌다 고 말했다. 이날 개별 종목을 보면 다우에서 약국 월그린 부츠 얼라인어스가 7.2%로 크게 하락했다. 이는 월그린이 주당 이익률을 낮췄기 때문이다. 아울러 경기침체 우려로 인해 여행 관련주들이 연속해서 하락했다. 크루즈 선사 카니발은 2% 이상 로열 캐리비언과 노로웨이 크루즈 라인도 각각 3% 이상씩 빠졌다. 이른바 닥터둠 으로 불리는 비관론자 누리엘 루비니 뉴욕대 교수는 주가가 50% 폭락할 것이라고 예상했다. 루비니 교수는 이날 마켓워치 기고문을 통해 이번에 찾아올 경기침체는 스테그플레이션과 금융위기를 동시에 동반하기 때문에 증시 하락은 50%에 이를 것 이라고 말했다. 그는 경기침체가 강할지 약할지 관계없이 역사적으로 보면 증시가 추락할 여지가 매우 크다 면서 이런 맥락에서 최근 1 2주간 보인 반등은 데드캣 바운스 에 불과하다 고 강조했다. 데드캣 바운스는 주가가 큰 폭으로 떨어지다가 잠깐 반등하는 상황을 비유할 때 쓰이는 말이다. 월가 투자정보는 유튜브 월가월부 에서 확인하세요. 자세한 해외 증시와 기업 분석 정보를 매일경제 해외 특파원들이 생생하게 전달해 드립니다.\n", + "\n", + "### 답변: 대 대형주 중심의 미국 스탠더드앤드푸어스 S P 500 지수가 올 상반기 50여년만에 최악의 실적을 기록하고 30일 이하 미국 현지시간 뉴욕 증시 3대 지수도 모두 하락하며 부진한 상반기 실적으로 마감한 가운데 일각에서는 경기침체 우려로 인해 추가 하락이 올 수 있다는 경고 메시지가 나오고 있다.<|endoftext|>\n", + "3 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 파이낸셜뉴스 풀무원식품은 알래스카 청정해역의 신선한 명태살로 만든 연육을 바삭하게 튀겨낸 ‘볼카츠’를 출시했다고 5일 밝혔다. 신제품 ‘볼카츠’ 2종 통통새우 에그포테이토 은 깨끗한 자연환경으로 잘 알려진 알래스카에서 자란 고품질의 명태 연육을 동그랗게 빚은 후 빵가루를 묻혀 튀겨 내 차별화한 프리미엄 간편식이다. 7㎜ 크기 입자의 습식 빵가루를 사용해 겉은 바삭하고 속은 촉촉한 식감을 살렸다. 여기에 건강한 바다 단백질을 함유한 명태살과 잘 어울리는 새우 계란 감자 등을 더했다. ‘통통새우 볼카츠’는 큼직하고 통통한 흰다리새우를 명태 연육과 함께 빚어 쫄깃한 식감이 특징이다. 흔히 사용되는 작은 새우 대신 71 90미 크기의 흰다리새우를 사용해 쉽게 부서지지 않고 탱탱하게 씹히는 식감을 살렸다. ‘에그포테이토 볼카츠’는 삶은 달걀을 큼직하게 썰고 감자 샐러드를 섞어 만든 스프레드로 명태 연육을 감싸 고소하고 담백한 맛을 살린 제품이다. 고로케를 연상시키는 듯한 맛과 식감으로 든든한 간식은 물론 간편 안주 메뉴로 제격이다. 신제품 ‘볼카츠’는 냉동 가정간편식 HMR 으로 보관과 조리가 편리하다. 에어프라이어 8분이면 가정에서도 손쉽게 바삭한 튀김을 완성할 수 있다. 풀무원식품 박정욱 어묵PM은 “볶음이나 탕 요리를 위한 사각형 또는 봉 형태 제품이 대부분이던 어묵 시장에 새로운 카테고리를 제시하기 위해 이번 프리미엄 신제품을 기획하게 됐다”며 “맛과 영양은 물론 조리 방법도 간단한 만큼 보다 많은 소비자들이 집에서도 간편하게 맛있는 ‘볼카츠’를 맛보길 바란다”라고 말했다.\n", + "\n", + "### 답변: 5일 5일 풀무원식품은 알래스카 청정해역의 신선한 명태살로 만든 연육을 동그랗게 빚은 후 빵가루를 묻혀 튀겨낸 '볼카츠'와 명태 연육을 감싸 고소하고 담백한 맛을 살린 '에그포테이토 볼카츠'를 출시했다고 밝혔다.<|endoftext|>\n", + "4 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 강덕원 일동제약 생산본부장. 일동제약 제공 일동제약은 생산본부장으로 강덕원 부사장을 영입했다고 지난 1일 밝혔다. 강덕원 본부장은 서울대학교와 서던캘리포니아대학교 USC 를 졸업하고 동대학원에서 생화학 및 분자생물학 석사학위를 취득했다. 이후 캘리포니아에 위치한 스태슨제약 지그프리트컴퍼니의 얼라이언스 메디컬 프로덕트 삼성바이오에피스 GC녹십자 등에서 QC와 GMP 등의 업무를 담당했다. 일동제약 관계자는 강 본부장은 다년간의 글로벌 GMP 근무경력과 전문지식을 바탕으로 생산과 품질체계를 더욱 강화하고 특히 cGMP 기준의 생산시설 구축도 추진하게 될 것 이라고 말했다.\n", + "\n", + "### 답변: 일동제약은 생산본부장으로 강덕원 부사장을 영입했다고 지난 1일 밝혔으며 강덕원 본부장은 서울대학교와 서던캘리포니아대학교 USC 를 졸업하고 동대학원에서 생화학 및 분자생물학 석사학위를 취득했으며 이후 글로벌 GMP 근무경력과 전문지식을 바탕으로 생산과 품질체계를 더욱 강화하고 cGMP 기준의 생산시설 구축도 추진하게 될 것이라고 말했다.<|endoftext|>\n", + "5 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: KIST강릉천연물연구소 등 5일 기업 지원·경제활성화 앞장 약속 한국과학기술연구원 KIST 로고 한국과학기술연구원 제공 한국과학기술연구원 KIST 로고 강릉 연합뉴스 유형재 기자 한국과학기술연구원 이하 KIST 강릉천연물연구소 한국생산기술연구원 강원본부 한국기초과학지원연구원 춘천센터 농업회사법인 커피커퍼가 5일 커피 산업 발전을 위한 업무협약을 체결한다. KIST 강릉천연물연구소에서 열릴 협약식에서 참석 기관들은 힘을 모아 애로 기술 해결 및 지역경제 활성화에 앞장서기로 약속할 예정이다. 그간 커피 산업 발전을 위해 많은 중소기업이 연합해 커피협회를 구성하고 매년 커피축제를 진행하고 있으나 대부분 소규모 기업으로 구성돼 소비자의 이해를 돕기 위한 제품 간 특성 표시 및 제품 품질 표준화에 대한 과학적 근거가 부족했다. 또 커피 품질을 높이기 위한 기술 개발도 절실한 상황이다. 아세안 카페 산업 세미나 연합뉴스 자료사진 이들 기관은 이러한 문제를 해결하기 위해 보유한 기술을 활용하고 나아가 커피 부산물 활용방안을 제시해 이를 기반으로 하는 친환경 소재 개발에 힘쓸 예정이다. 각 기관의 협력으로 기업매출 확대 일자리 창출뿐만 아니라 기업의 애로 기술 해결을 위한 산·연 협력 모델 구축으로 강원지역의 더 많은 기업의 애로 기술을 효율적으로 해결하고 지역경제 활성화에 일익을 담당할 것으로 전망한다. 장준연 KIST 강릉천연물연구소 분원장은 4일 이번 협약으로 지역 커피 관련 기업 지원에 시너지 효과를 높일 기회가 될 것으로 기대한다 고 말했다.\n", + "\n", + "### 답변: 5일 기술회사인 커피커퍼가 KIST 강릉천연물연구소와 5일 커피 산업 발전을 위한 업무협약을 체결함에 따라 기업매출 확대 일자리 창출뿐만 아니라 더 많은 기업의 애로 기술 해결을 위한 산·연 협력 모델 구축으로 지역경제 활성화에 일익을 담당할 것으로 예상된다.<|endoftext|>\n", + "6 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 매매 수수료 절감 목적도 펀드에서 주식을 매매하는 빈도를 뜻하는 매매 회전율이 5년 만에 최저치를 기록했다. 연초부터 이어진 약세장에 기관투자자들이 상품을 방어적으로 운용하고 나선 영향으로 풀이된다. 6일 한국펀드평가에 따르면 지난 2분기 기준 국내 공모펀드의 연평균 매매 회전율은 141.48%였다. 코로나19 이후 주식시장이 강세를 보였던 2020년 200%대까지 치솟았던 회전율은 지난해까지만 해도 180 190%대에서 움직였다. 전년 동기 회전율은 184.77% 수준이었다. 그러나 올해 들어 수치가 급락했다. 140%대까지 떨어진 것은 2017년 이후 5년 만이다. 매매 회전율은 펀드 내 주식 거래대금을 운용자산으로 나눈 값이다. 예컨대 운용자금이 100억원인 펀드 A에서 연 200%의 회전율을 보였다면 1년 새 200억원의 주식이 손바뀜됐다는 뜻이다. 표면적으로 회전율은 펀드 수익률과 직접적인 연관성은 없으나 매매가 잦을수록 수수료 등 펀드 내 비용이 올라가 성과를 갉아먹을 위험도 있다. 전문가들은 올해 회전율이 떨어진 것은 공모펀드 침체 영향이 크다고 진단했다. 김도형 삼성자산운용 ETF컨설팅팀장은 올해 주식시장이 약세장으로 접어들면서 공모펀드 설정액 자체가 줄어드는 양상을 보이고 있다 며 펀드에 들어오는 자금이 부족할 경우 알파 수익을 추구할 만큼의 매매 여력이 떨어질 수 있다 고 말했다. 김후정 유안타증권 연구원은 아무래도 액티브펀드에서 더 적극적인 매매가 일어난다 며 상장지수펀드 ETF 등 패시브펀드의 성장으로 액티브펀드 비중이 줄어들면서 매매율이 하락한 경향도 있을 것 이라고 설명했다. 김 연구원에 따르면 국내 액티브펀드의 순자산 규모는 현재 17조원이다. 이는 2015년 36조원에 비해 절반 이상 줄어든 수치다.\n", + "\n", + "### 답변: 매매에서 주식을 매매하는 빈도를 뜻하는 매매 회전율이 5년 만에 140%까지 떨어진 것은 연초부터 이어진 약세장에 기관투자자들이 상품을 방어적으로 운용하고 나선 영향으로 풀이된다.<|endoftext|>\n", + "7 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: ‘코오롱 H2 플랫폼’ 밸류체인 플랫폼 발표 계열사간 역량 결집과 동시에 대외 파트너십 구축 6일 동대문 DDP에서 열린 코리아 H2서밋 인베스터데이에 참석한 코오롱인더스트리 장희구 사장 왼쪽에서 네번째 ⓒ코오롱그룹 데일리안 조인영 기자 코오롱그룹이 수소산업의 밸류체인 전반을 고도화하는 플랫폼 구축에 나선다. 코오롱그룹은 6일 동대문 디자인플라자에서 열린 ‘코리아 H2 비즈니스 서밋 2022 인베스터데이’에 참가해 코오롱인더스트리와 코오롱글로벌 코오롱글로텍 코오롱플라스틱 등 그룹이 보유한 첨단기술을 바탕으로 수소 생산부터 운송 저장 발전사업까지 아우르는 코오롱 H2 플랫폼을 구축한다고 밝혔다. 코오롱인더스트리 장희구 사장은 국내외 수소산업 관련 투자자들을 대상으로 ‘코오롱 H2 플랫폼’의 산업적 가치와 의미를 설명하고 그룹의 역량을 집중하겠다고 발표했다. 최근 세계적인 탄소중립 기조에 발맞춰 수소로 대표되는 청정에너지 사업을 그룹의 지속 가능한 미래를 만들 수 있는 핵심 사업으로 성장시키겠다는 전략이다. 코오롱그룹은 수소연료전지를 중심으로 전개해 온 사업 분야를 확대 재편해 청정수소 생산부터 운송과 저장 이를 이용한 전력생산까지 원스톱 서비스가 가능한 플랫폼을 마련해 나간다. 수소 생산분야는 국내 풍력발전 시장을 선도하고 있는 코오롱글로벌과 협업해 진행한다. 풍력발전은 특성상 야간 및 유휴전력이 발생하게 되는데 이를 활용해 물을 전기 분해하는 수전해방식으로 청정수소를 생산할 예정이다. 경주와 태백 풍력단지를 비롯해 현재 추진 중인 완도 해상풍력단지에 이르기까지 수소생산을 위한 중요한 기반 시설로 활용할 계획이다. 코오롱인더스트리의 수분제어장치 및 전해질 분리막 기술 PEM MEA 이 국내에서 선두를 달리고 있고 상용화도 가능해 사업화에 속도를 낼 수 있을 것으로 보고 있다. 코오롱글로벌은 이와 동시에 천연가스 기반의 블루수소 생산사업도 추진 중에 있다. 천연가스를 개질해 수소를 발생시키는 블루수소 생산플랜트 사업은 물을 분리해 수소를 생산하는 그린수소 생산방식과는 달리 탄소배출이 일부 발생할 수 있으나 청정수소 생태계로 가기 위해 거쳐야 할 단계로 보고 사업영역을 순차적으로 확대해 나갈 계획이다. 코오롱이 직접 생산한 청정수소는 코오롱글로텍과 코오롱플라스틱이 개발하고 있는 수소저장용 고압 저장탱크와 수소탱크의 내부 지지재인 수소탱크 라이너 등으로 운송 저장된다. 6일 동대문 DDP에서 열린 코리아 H2서밋 인베스터데이에 참석한 코오롱인더스트리 장희구 사장 왼쪽에서 네번째 ⓒ코오롱그룹 코오롱글로텍은 수소 압력용기에 필수적인 드라이 와인딩 대형 수소탱크 성형기술 및 토우프레그 드라이 와인딩에 사용되는 탄소섬유 중간재 기술력을 보유 중이며 코오롱플라스틱은 수소차 하우징 부품 소재와 수소압력용기 소재 개발 기술력을 보유하고 있어 수소의 운송 저장 분야를 담당할 예정이다. 코오롱이 생산한 수소는 발전사업의 원료로도 활용한다. 코오롱인더스트리는 전국의 각 사업장에 수소발전설비를 구축하고 수소를 활용한 전력을 자체 생산해 제조설비 운영에 활용한다. 이미 상용화된 코오롱인더스트리의 고분자전해질막인 PEM을 적용한 PEMFC 고분자전해질 연료전지 기반의 연료전지 발전소가 만들어지면 수소 기반의 전력생산이 가능해져 2040년까지 탄소배출 제로 목표인 RE100 달성에도 한 발 다가서게 될 것으로 보고 있다. 이를 위해 수소산업을 함께 영위하는 기술 기업과의 긴밀한 파트너십 구축을 위한 Open Innovation 오픈 이노베이션 시스템도 전개한다. 코오롱이 추진하는 오픈 이노베이션은 수소의 생산 운송 저장 발전 등 ‘코오롱 H2 플랫폼’ 사업에 누구라도 함께할 수 있는 협력 시스템이다. 뿐만 아니라 탄소중립 연료전지용 소재 운송 저장 사업 발전사업 기술 등 다양한 분야에서 유기적 협력을 모색하고 파트너와의 상생협력으로 수소 생태계의 Total Solution Provider 종합 솔루션 공급자 로 성장하는 것을 목표로 하고 있다. 코오롱그룹 관계자는 “코오롱은 2000년대 초부터 대한민국 수소산업의 미래를 내다보고 핵심소재 개발과 수소경제 저변 확대를 위해 꾸준히 준비해왔다”며 “코오롱 H2 플랫폼의 실현을 위해 그룹이 가진 수소사업 소재 기술력과 외부 파트너들과의 Open Innovation 협력체를 통해 수소산업 생태계 전반에 핵심 Provider로 자리매김해 나갈 것”이라고 말했다. 한편 코리아 H2 비즈니스 서밋은 수소경제를 조기에 확산하고 대한민국 기업들의 수소 경쟁력을 강화할 목적으로 지난해 9월 출범했다. 코오롱그룹을 비롯해 현대차그룹 SK그룹 포스코그룹 등 총 17개 기업이 참여하고 있으며 2022 인베스터 데이 는 현대차그룹 SK그룹 등 17개 국내 회원사와 해외 에너지 기업 및 투자·금융사 임원들이 행사에 참석해 한국 수소 사업의 현황과 비전을 논의한다.\n", + "\n", + "### 답변: 코오롱그룹은 6일 동대문 디자인플라자에서 열린 ‘코리아 H2 비즈니스 서밋 2022 인베스터데이’에 참가해 그룹이 보유한 첨단기술을 바탕으로 수소 생산부터 운송 저장 발전사업까지 아우르는 코오롱 H2 플랫폼을 구축한다고 밝히고, 장희구 사장은 국내외 수소산업 관련 투자자들을 대상으로 ‘코오롱 H2 플랫폼’의 산업적 가치와 의미를 설명하고 그룹의 역량을 집중하겠다고 발표했다.<|endoftext|>\n", + "8 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 뉴스데스크 앵커 정부가 새 에너지 정책 방향을 오늘 국무회의에서 의결했습니다. 예상대로 원자력 발전의 비중을 더 늘리겠다고 했는데요 탄소 감축의 핵심인 석탄 화력발전소를 어떻게 줄일지 재생에너지를 어떻게 늘릴 지에 대해서는 발표하지 않았습니다. 먼저 배주환 기자가 보도합니다. 리포트 지난해 우리나라 발전에서 가장 큰 비중을 차지한 건 여전히 석탄화력발전입니다. 3분의 1이 넘습니다. 2위는 천연가스 29% 3위는 원전 27%입니다. 재생에너지의 비중은 7%에 불과합니다. 윤석열 정부는 원전의 비중을 2030년까지 30% 이상으로 늘리기로 했습니다. 문재인 정부가 24%로 낮추기로 한 것과 정반대입니다. 문재인 정부가 30%로 끌어올리겠다고 했던 재생에너지 비중에 대해서는 발표하지 않았습니다. 원전 비중을 30%까지 끌어올리는 방법은 수명연장입니다. 8년 뒤인 2030년 이전에 수명이 끝나는 원전은 10기. 정부는 이 10기의 수명을 모두 연장하기로 했습니다. 현재 건설 중인 신한울 1 2호기 신고리 5 6호기까지 더하면 2030년에 원전 28기를 돌리겠다는 겁니다. 김진 산업통상자원부 에너지전환정책과장 관련 산업의 경쟁력이나 생태계가 그래도 잘 구축돼 있으니 계속 강화를 하겠다는 게 정책 기조라고 보시면 될 것 같습니다. 히지만 이렇게 수명을 연장하고 가동률을 높이면 안전에 대한 우려가 생길 수 있습니다. 석광훈 에너지전환포럼 전문위원 물론 수명 연장을 위해서 설비 교체를 하겠지만 전반적인 설비의 노후화가 지금 진행이 되고 있기 때문에… 반면 탄소 배출 주범으로 꼽히는 석탄화력발전소를 어떻게 줄일지 신재생에너지는 얼마나 늘릴지에 대한 계획은 발표하지 않았습니다. 석탄화력은 합리적 감축 유도 재생에너지는 합리적 수준으로 조정 한다는 말이 전부였습니다. MBC뉴스 배주환입니다. 영상취재 박종일 영상편집 박병근 MBC 뉴스는 24시간 여러분의 제보를 기다립니다.\n", + "\n", + "### 답변: 정부가 정부가 오늘 국무회의에서 의결한 새 에너지 정책 방향의 주요 내용인 원자력 발전의 비중을 더 늘리겠다는 계획과 탄소 감축의 핵심인 석탄 화력발전소를 어떻게 줄일지, 재생에너지는 얼마나 늘릴 지에 대한 내용은 발표하지 않았으며, 석탄화력은 합리적 감축 유도 재생에너지는 얼마나 늘릴지에 관한 내용은 발표하지 않은 것으로 알려졌다.<|endoftext|>\n", + "9 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 연내 첫 번째 종합계획 수립해 지원사업 본격 추진 이데일리 김형욱 기자 정부가 3년마다 종합계획을 수립해 산업계의 디지털 전환을 지원하는 산업디지털전환촉진법이 5일부터 시행한다. 산업통상자원부는 연내 첫 번째 종합계획을 수립해 기업 간 데이터 연결과 활용 환경 조성 등 다양한 지원사업을 펼칠 계획이다. 장영진 산업통상자원부 제1차관 앞줄 가운데 을 비롯한 관계자가 4일 충북 청주 LS일렉트릭 제1공장에서 산업 디지털 전환 기업 간담회에서 기념촬영하고 있다. 산업부는 5일 산업디지털전환촉진법 시행에 맞춰 연내 첫 번째 종합계획을 수립해 시행할 계획이다. 사진 산업부 장영진 산업부 제1차관은 산업디지털전환촉진법 시행을 하루 앞둔 지난 4일 충북 청주 LS일렉트릭 제1공장에서 산업 디지털 전환 기업 간담회를 열고 올 하반기 수립할 산업 디지털 전환 종합계획 의견수렴 작업에 본격 착수했다. 이날 행사엔 LS일렉트릭 외 포스코 LG전자 센트랄 한국야금 SK텔레콤 네이버클라우드 등 기업 관계자가 참석했다. 정부는 우리 산업의 경쟁력을 유지하기 위해선 디지털 전환을 필수라고 보고 이 법 제정을 추진해 왔다. 이 법은 지난해 12월 국회 의결 절차를 거쳐 7월5일부터 정식 시행하게 됐다. 산업부는 또 앞선 2020년 10월 22개 산업 업종별 협회·단체로 이뤄진 디지털전환 네트워크를 출범해 기업이 당장 필요로 하는 디지털 전환 수요 조사에 나섰다. 산업부는 이를 통해 약 300개 추진 과제를 축적했고 이를 기본계획에 따른 각종 지원사업 추진 과정에서 참조한다는 계획이다. 이미 일부 과제는 산업부 연구개발 사업과 연계해 지원사업을 추진 중이다. 산업부는 첫 기본계획에 개별 기업의 디지털화를 넘어 가치사슬로 얽힌 기업 간 데이터의 연결과 활용 환경을 조성한다는 내용을 담을 계획이다. 제조 분야의 디지털 전문가 공급 개별 중소기업에 대한 인식 개선 계획도 포함한다. 장영진 차관은 “올 하반기 산업계 의견을 최대한 반영한 종합계획을 수립해 기업 간 협업 프로젝트 지원을 강화하고 인력 공급과 중소기업 인식 개선에 나설 것”이라며 “대기업도 중견·중소기업과의 데이터 공유·활용과 우수사례 전파 등 선도적 역할을 해달라”고 전했다.\n", + "\n", + "### 답변: 산업디지털전환촉진법 시행을 하루 앞둔 지난 4일 산업부 장영진 제1차관은 산업 디지털 전환 기업 간담회를 열고 올 하반기 수립할 산업 디지털 전환 종합계획 의견수렴 작업에 본격 착수했으며 첫 기본계획에 개별 기업의 디지털화를 넘어 가치사슬로 얽힌 기업 간 데이터의 연결과 활용 환경을 조성한다는 내용을 담을 계획이다.<|endoftext|>\n", + "10 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 사진 한국동서발전 한국동서발전은 다음달 31일까지 울산시민과 함께하는 생활 속 걷기 챌린지 탄소중립 건강걷기 누비GO 초록발자국 챌린지 를 진행한다고 1일 밝혔다. 울산숲사랑운동과 함께 하는 이번 챌린지는 코로나19로 지친 시민들이 일상 속 걷기 운동을 통해 건강을 증진하고 자가용 대신 대중교통을 이용해 탄소중립 사회를 실현하기 위해 마련됐다. 울산시민 누구나 구글플레이 또는 앱스토어에서 스마트폰 어플 워크온 을 내려받아 회원가입 후 참여할 수 있다. 챌린지 목표인 10만보·20만보·30만보를 기간 내 달성하면 추첨을 통해 교통카드 등 소정의 기념품을 증정한다. 김태규 동서발전 탄소중립실장은 초록발자국 챌린지를 통해 코로나19로 지친 울산시민들이 활력을 되찾고 대중교통 활성화로 탄소중립 실천에 기여하길 바란다 며 앞으로도 다양한 탄소중립·환경 프로젝트를 추진하여 더 많은 시민이 참여할 수 있도록 최선을 다하겠다 고 말했다.\n", + "\n", + "### 답변: 한국동서발전은 다음달 31일까지 울산숲사랑운동과 함께 코로나19로 지친 시민들이 일상 속 걷기 운동을 통해 건강을 증진하고 자가용 대신 대중교통을 이용해 탄소중립 사회를 실현하기 위한 챌린지 탄소중립 건강걷기 누비GO 초록발자국 챌린지 를 진행한다고 1일 밝혔다.<|endoftext|>\n", + "11 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 앵커 고공행진하는 물가에 주머니 사정도 빠듯해지고 있습니다. 소비자들은 한푼이라도 아끼기 위해 짠물 소비 에 나서고 있는데요 고물가 시대 달라진 소비행태를 전효성 기자가 살펴봤습니다. 기자 50대 주부 임동순 씨는 대형마트 마감 시간대를 주로 이용해 장을 보고 있습니다. 이 시간대에 육류나 신선제품을 구매하면 정가의 최대 70% 수준에 상품을 구매할 수 있기 때문입니다. 임동순 서울 관악구 자주 와요 마감 시간에 신선식품이나 생선 같은 경우는 30% 정도 세일 하거든요 그럴 때 엄청 덕을 많이 보죠. 실제 한 대형마트에 따르면 마감세일 시작 시간인 오후 7시 이후 매출액이 지난해보다 20% 이상 늘어난 것으로 집계됐습니다. 그나마도 오이 1개 고기 200g처럼 한 두끼 식사에 쓰일 소포장 판매가 주를 이룹니다. 밀키트 제품도 다시금 소비자의 관심을 받고 있습니다. 외식 배달 물가가 고공행진하면서 집에서 간단히 조리해 먹을 수 있는 밀키트 제품이 대체재로 떠오른 겁니다. 기자 물가가 고공행진 하면서 달라진 소비 패턴이 있다면 어떤 게 있을까요. 이기현 서울 중구 외식 안 해요 외식하는 것보다 밀키트 사서 끓여먹는 게 훨씬 경제적이죠. 양도 많고 제가 넣고 싶은 건 더 넣을 수도 있고… 엔데믹에 접어들며 주춤할 것으로 예상됐던 밀키트는 20% 넘는 성장세를 보이는 반면 배달앱 이용자 수는 매달 연중 최저치를 경신하고 있습니다 3 532만명 → 3 209만명 . 편의점 앱에서 유통 기한이 얼마 남지 않은 제품을 저렴하게 구매하는 것도 알뜰 쇼핑족이 애용하는 방법입니다 CU 그린세이브 21.5% GS25 라스트오더 254% 이처럼 짠물소비가 늘면서 유통업계는 물가 구원투수를 자처하며 최저가 경쟁에 나섰습니다. 이마트는 계란 김치 우유 등 40대 필수 상품군을 다른 업체보다 무조건 싸게 팔겠다 고 선언했고 롯데마트는 물가안정TF 를 꾸려 생필품 500여종의 가격을 집중적으로 관리하겠다는 계획을 발표한 상황. 인플레이션이 당분간 계속될 것으로 보이는 만큼 올해 연말까지는 최저가 경쟁을 이어간다는 방침입니다. 김태희 이마트 부장 고객들의 생활비 부담을 조금이라도 덜어드리기 위해 매일 40대 필수 상품에 대한 가격관리를 통해 항상 최저가로 제공해 드리려고 하고 있고… 사상 초유의 6%대 물가 상승률이 현실화된 가운데 눈물나는 짠물 소비 소비자들을 잡기 위한 유통업계의 경쟁이 더욱 치열해지고 있습니다. 한국경제TV 전효성입니다.\n", + "\n", + "### 답변: 소비물가 상승률이 현실화된 가운데 소비자들은 한푼이라도 아끼기 위해 짠물 소비 에 나서고 있는데다 밀키트 제품도 다시금 소비자의 관심을 받고 있어 유통업계는 물가 구원투수를 자처하며 최저가 경쟁에 나섰다.<|endoftext|>\n", + "12 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 주파수 추가 할당 확보 유력 정부 심사 통과 가능성 높아 3사 100㎒ 폭씩 균등 배분 LG유플러스가 5세대 5G 이동통신 주파수 3.4 3.42㎓ 대역 할당을 단독 신청했다. SK텔레콤과 KT는 고심 끝에 할당 신청을 하지 않기로 했다. 경매가 아닌 정부 심사 할당 절차를 거쳐 LG유플러스의 20㎒ 폭 추가주파수 단독 확보가 유력해졌다. 과학기술정보통신부는 4일 오후 6시 3.4 3.42㎓ 대역 주파수할당 신청 접수를 마감한 결과 LG유플러스만 신청한 것으로 확인했다. LG유플러스는 서비스 제공 시기와 제공 지역 무선국 구축 계획 등에 관한 사항을 담은 주파수 이용계획서를 제출했다. 과기정통부 이동통신 IMT 용 주파수할당 공고 에 의거해 할당을 신청한 법인이 1개로 신청 절차가 종결됐다. 이에 따라 경매 대신 정부 심사로 할당 적격 여부를 평가하는 대가산정 주파수할당 방식이 적용된다. LG유플러스가 심사를 통과할 경우 과기정통부가 경매 최저경쟁가격으로 제시한 총 1521억원에 2022년 11월 1일부터 2028년 11월 30일까지 6년간 사용권을 확보하게 된다. 과기정통부는 할당 조건으로 △2025년까지 누적 5G 무선국 15만국 구축 △5G 농어촌 공동망 2023년 12월 조기 구축 △인접 대역 사업자는 신규 1만5000국 5G 무선국 구축 이후 할당 주파수 사용 △농어촌 지역에 한해 할당 즉시 주파수 이용 등 조건을 부과했다. LG유플러스가 직접 추가주파수 할당을 신청해서 진행하는 할당 절차인 만큼 심사를 통과하지 못할 공산은 극히 낮다는 게 업계의 일반적인 관측이다. 김윤호 LG유플러스 공정경쟁담당은 “5G 주파수를 추가로 확보해 서비스 품질을 개선하고 고객의 편익을 증진하는데 기여하겠다”고 말했다. 과기정통부는 주파수 할당으로 인한 투자 효과가 1조원 이상이 될 것으로 예상했다. 이통 3사가 5G 황금주파수로 꼽히는 3.5㎓ 대역에서 균등하게 100㎒ 폭을 보유하게 됐다. 3사 간 차별화된 네트워크 품질 확보를 위한 투자 경쟁이 순조롭게 진행될 경우 예상되는 투자 효과다. 과기정통부 관계자는 “LG유플러스를 대상으로 한 할당신청 적격여부 검토에 착수할 예정이며 7월 중으로 심사위원회를 구성해 할당심사를 진행할 것”이라고 밝혔다. 경쟁사는 주파수 할당 신청을 하지 않았다고 공식확인했다. SK텔레콤은 기존 신청한 3.7 3.72㎓ 주파수 대역과 관련해 정부와 계속 협의하겠다는 입장을 피력했다. KT는 정부에 LG유플러스에 대해 주파수를 할당하더라도 철저한 이행점검이 필요하다는 입장을 밝혔다.\n", + "\n", + "### 답변: 과학기술정보통신부는 4일 LG유플러스가 단독으로 5G 이동통신 주파수 3.4 3.42GHz 대역 할당을 신청했다고 밝혔으며 이로 인해 SK텔레콤과 KT는 할당 신청을 하지 않기로 했고 정부 심사 할당 절차를 통해 LG유플러스의 20MHz 폭 추가주파수 단독 확보가 유력하다.<|endoftext|>\n", + "13 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 스포츠조선이 주최하는 제1회 청룡시리즈어워즈 시상식 Blue Dragon Series Awards 이하 BSA 에 대한 관심과 반응이 매우 뜨겁다. 오는 19일 오후 7시 인천 파라다이스시티에서 개최되는 청룡시리즈어워즈는 국내 최초 스트리밍 시리즈 콘텐츠들을 대상으로 한 시상식으로 급변하는 영상 시장 속 오리지널 콘텐츠들에 대한 높은 관심과 전 세계적으로 높아진 K 콘텐츠의 위상을 공고히 하기 위해 만들어졌다. 수상 후보 선정을 위한 청룡시리즈어워즈 후보작 자 선정 투표에 이어 지난 6일부터 시작된 후보작 자 최종 투표는 8일 오후 기준 총 투표 수 230만을 가뿐히 넘어섰다. 청룡 이라는 두 글자가 주는 공정성과 권위 속에 이번 시상식에 대한 팬들의 뜨거운 관심과 업계 기대를 엿볼 수 있는 대목이다. ◇ LG유플러스가 진행하는 청룡시리즈어워즈 레드카펫 1열 직관 이벤트. 사진제공 LG유플러스 한편 K 콘텐츠를 사랑하는 찐팬 이라면 한 번쯤 밟아보고 싶을 만한 이번 시상식 레드카펫 이벤트에 대한 관심도 매우 높다. LG유플러스는 최근 제1회 청룡시리즈어워즈 시상식 공식 후원을 결정하고 U tv 레드카펫 1열 직관 이벤트 를 진행하고 있다. 콘텐츠 마니아들에게 레드카펫 1열에서 직접 K 콘텐츠 스타들을 직접 두 눈에 담을 수 있는 기회를 제공하기로 한 것. 연예·엔터 분야로 입지를 넓히는 한편 K 콘텐츠 산업의 진흥과 발전을 돕기 위함이라고 관계자는 설명했다. LG U tv의 공식 유튜브 채널인 U tv 이모티콘 이 세상 모든 콘텐츠 담당자들이 직접 기획과 촬영 제작한 시상식 현장 스케치 영상은 공개 직후 조회수가 70만회 이상을 기록하기도 했다. LG유플러스는 이번 시상식 레드카펫과 본 시상식 생중계에도 직접 나선다. 생생한 시상식 현장을 안방 1열 로 전달하기 준비에도 한창이다. 이번 시상식과 관련된 다양한 콘텐츠 생산에도 열을 올릴 계획이다. LG유플러스 IPTV 서비스를 이용하는 고객이라면 제1회 청룡시리즈어워즈 시상식을 U tv 채널 234번과 모바일tv를 통해 시청할 수 있다. LG U tv 관계자는 13일까지 U tv 이모티콘 유튜브 채널 커뮤니티 탭에서 신청 가능한 레드카펫 1열 직관 이벤트 에 대해 많은 관심 가져주시기 바란다 고 말했다.\n", + "\n", + "### 답변: 스포츠조선이 주최하는 제1회 청룡시리즈어워즈 시상식 Blue Dragon Series Awards 이하 BSA 에 대한 관심과 반응이 매우 뜨거운 가운데 오는 19일 오후 7시 인천 파라다이스시티에서 개최되는 청룡시리즈어워즈는 국내 최초 스트리밍 시리즈 콘텐츠들을 대상으로 한 시상식으로 급변하는 영상 시장 속 오리지널 콘텐츠들에 대한 높은 관심과 전 세계적으로 높아진 K 콘텐츠의 위상을 공고히 하기 위해 만들어졌고.K콘텐츠 사랑하는 찐팬 이라면 한 번쯤 밟아보고 싶을 만한 이번 시상식 레드카펫 이벤트에 대한 관심도 매우 높아<|endoftext|>\n", + "14 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 5월 소비자물가 상승률 5.4%… 6월엔 6% 직영주유소 1일부터 유류세 37% 즉시 인하 정부 3일 수출 애로 해소·지원 대책 논의 방기선 1차관 비상경제차관회의 주재 방기선 기획재정부 1차관이 1일 정부서울청사에서 열린 비상경제차관회의를 주재하고 있다. 2022.7.1. 연합뉴스 정부가 6월 소비자물가 상승률이 5월보다 더 높아진다고 예고했다. 5월 물가 상승률이 5.4%였던 점을 고려하면 6월 상승률은 5%대 후반에서 6% 초반 사이가 될 것으로 보인다. 방기선 기획재정부 1차관은 1일 정부서울청사에서 열린 제2차 비상경제차관회의에서 “5월 5.4%에 이어 6월에는 소비자물가 상승률이 더욱 높아질 전망”이라면서 “앞으로도 상당 기간 인플레이션 압력이 지속될 것”이라고 말했다. 정부는 이런 고물가 상황을 조금이라도 완화하고자 이날부터 유류세를 법적 최대한도인 37%까지 낮춘다. 유류세 인하율이 오롯이 반영되면 휘발유는 ℓ당 57원 경유는 38원씩 내려가는 효과가 나타난다. MobileAdNew center 정유사 직영주유소는 이날부터 즉시 가격을 인하했다. 정부는 자영주유소에도 가격이 인하된 물량이 최대한 빨리 공급될 수 있도록 비상 운송에 나설 계획이다. 7월 첫째 주부터는 관계 기관이 석유시장 점검단을 꾸려 주 2회 이상 전국 주유소를 현장 방문해 물가 상승기에 편승한 주유소의 가격 담합과 가짜석유 유통 등 불법행위를 적발할 예정이다. 방 차관은 이날 발표된 상반기 수출입 통계에 대해 “무역수지 적자 폭은 지난달보다 다소 확대됐지만 6월 하순 들어 수출이 빠르게 회복하면서 적자 폭을 상당히 줄일 수 있었다”고 설명했다. 이어 “수출 애로 해소와 하반기 수출 활성화를 위해 당장 추진할 필요가 있는 지원 대책을 검토 중”이라면서 “이번 주 일요일 3일 비상경제장관회의에서 논의할 계획”이라고 말했다. 산업통상자원부는 올해 상반기 무역수지 적자가 103억 달러를 기록했다고 밝혔다. 이는 상반기 기준 역대 최대 규모다.\n", + "\n", + "### 답변: 정 6월 소비자물가 상승률이 5.4%에 이어 6월에도 소비자물가 상승률이 5%대 후반에서 6% 초반 사이가 될 것으로 예상되면서 정부는 고물가 상황을 조금이라도 완화하고자 유류세를 법적 최대한도인 37%까지 낮춤과 동시에 직영주유소에도 가격이 인하된 물량이 최대한 빨리 공급될 수 있도록 비상 운송에 나설 계획이다.<|endoftext|>\n", + "15 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: LG전자가 지난 1일 서울시 강남구에 위치한 초 超 프리미엄 빌트인 가전 브랜드 시그니처 키친 스위트 청담 쇼룸 1층 카페에서 유명 피아니스트 겸 작곡가인 이루마 사진 왼쪽 의 피아노 콘서트와 유명 셰프인 오스틴강의 쿠킹쇼를 진행했다. 사진제공 LG전자 LG전자가 피아니스트 이루마 셰프 오스틴강과 함께 프리미엄 빌트인 가전 브랜드 시그니처 키친 스위트 의 차별화된 고객가치를 알리는 콘서트를 열었다. 이루마가 피아노를 연주하고 오스틴강이 쿠킹쇼를 진행했다. LG전자는 지난 1일 서울시 강남구 시그니처 키친 스위트 청담 쇼룸 1층 카페에서 시그니처 키친 스위트 콘서트를 개최했다고 3일 밝혔다. 공연엔 시그니처 키친 스위트 구매고객과 인플루언서 등 총 40여명이 참석했다. 이날 이루마는 자신의 곡 가운데 공간을 작품으로 삶을 예술로 라는 시그니처 키친 스위트의 브랜드 철학과 어울리는 13곡을 엄선해 연주했다. 해당 곡은 공연 후에도 청담 쇼룸 카페에서 들을 수 있다. 피아노 콘서트 뒤에는 오스틴강의 쿠킹쇼가 이어졌다. 고객들은 △다양한 용량의 제품을 목적에 맞게 선택해 조합할 수 있는 컬럼형 냉장·냉동고 △상·중·하칸의 온도를 각각 조절할 수 있는 컬럼형 와인셀러 △5개 화구를 갖춘 전기레인지 △원바디 블랙글라스 디자인의 스팀오븐과 광파오븐 등 시그니처 키친 스위트 제품을 활용해 오스틴강이 대표 레시피로 만든 요리를 즐겼다. LG전자는 2017년 국내 최초 초프리미엄 빌트인 가전 브랜드 전시관인 시그니처 키친 스위트 논현 쇼룸을 개관한 데 이어 지난해 복합문화공간인 청담 쇼룸을 선보였다. 이곳에서는 가전과 가구가 조화를 이루는 공간을 직접 체험하고 공간별 구성제품을 패키지로 구입할 수 있다. 오승진 LG전자 한국영업본부 한국전략담당은 더 많은 고객이 초프리미엄 브랜드가 선사하는 차원이 다른 가치를 경험할 수 있도록 다양한 분야에서의 마케팅 활동을 전개할 것 이라고 말했다.\n", + "\n", + "### 답변: LG전자는 지난 1일 서울시 강남구 시그니처 키친 스위트 청담 쇼룸 1층 카페에서 시그니처 키친 스위트 콘서트를 열어 구매고객과 인플루언서 등 총 40여명과 함께 시그니처 키친 스위트의 브랜드 철학과 어울리는 13곡을 엄선해 연주하고 피아니스트 이루마와 오스틴강의 쿠킹쇼를 진행했다고 3일 밝혔다.<|endoftext|>\n", + "16 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 여야 저금리 갈아타는 원스톱 플랫폼 한목소리 요구 지난해 은행ㆍ핀테크 간 이견으로 추진 중단돼 금융위 의견 조율 나서...시중은행 여전히 반대 이데일리 전선형 최훈길 박기주 기자 지난해 8월 이후 논의가 중단된 ‘대환대출 플랫폼’ 구축이 다시 재논의된다. 대출금리 고공 비행으로 차주들의 이자 부담이 커지면서 이번엔 정치권에서 ‘카드’를 들이밀었다. 하지만 과거에도 은행들과 빅테크 간 이견이 컸던 만큼 이번에도 플랫폼 구축이 쉽지는 않을 것이란 관측이다. ‘대환대출’ 고금리 부담 줄여줄 수 있어 6일 금융당국에 따르면 금융위원회는 금융사들에게 ‘대환대출플랫폼’ 구축에 대한 의견을 조율 중이다. 특히 은행과 빅테크사를 중심으로 대환대출 플랫폼 구축 및 이용 방식에 대한 의견을 물은 것으로 전해진다. 금융결제원 망에 핀테크가 운영 중인 대출금리 비교 서비스를 연동하면 대출 갈아타기가 가능하다. 모든 가계대출을 모바일로 법무사 비용 없이 쉽게 갈아타는 것이다. 사진은 지난해 금융위원회가 추진하려다 무산된 비대면 대환대출 플랫폼 설명 내용이다. 자료 금융위원회 대환대출플랫폼은 모바일 등 비대면으로 여러 금융사 대출 상품의 금리를 조회하고 그중 낮은 금리로 갈아탈 수 있도록 하는 시스템을 말한다. 지난해 8월 금융당국이 빅테크가 운영 중인 대출금리 비교 서비스를 활용해 은행ㆍ카드사ㆍ저축은행 등의 대출상품을 갈아탈 수 있도록 하는 방식으로 사업을 추진했다. 망은 금융결제원 망을 이용하기로 했다. 하지만 당시 은행권은 고객을 빼앗길 우려를 내비치면서 강한 반발을 했고 결국 사업은 중단됐다. 그렇게 잊혔던 대환대출플랫폼이 1년 만에 다시 고개를 든 건 정치권의 압박이 있었기 때문이다. 기준금리 인상 물가 인상 등으로 차주들의 부담이 커지면서 금리 부담을 줄이기 위해서는 ‘대환대출 플랫폼이 반드시 필요하다’는 게 정치권의 생각이다. 특히 이번에는 여야 할 것 없이 한목소리를 내고 있다. 실제 국민의 힘은 지난 5일 금융당국에 대환대출 플랫폼 사업을 신속하게 추진할 것을 요구했다. 성일종 국민의힘 정책위의장은 원내대책회의를 통해 “대환대출 플랫폼이 지난해 추진됐으나 금융권 상황으로 중단됐다”며 “하지만 당시보다 상황이 더 악화된 지금과 같은 금리 상승기에 무엇보다 필요한 사업“이라고 강조했다. 국민의힘은 김주현 금융위원장 후보자가 위원장으로 임명되는 즉시 당정 간담회를 열고 대환대출 플랫폼 등 서민 금융 지원 방안을 1순위로 논의하겠다는 입장이다. 더불어민주당도 6일 오전 ‘상환부담 완화를 위한 원스톱 대출 이동제 도입 간담회’를 열고 대환대출 플랫폼에 대한 구체적인 논의를 했다. 박홍근 더불어민주당 원내대표는 “낮은 금리의 대출로 갈아타는 대환대출도 서민들의 부담 줄이기 위해 고려할 선택지”라며 “당사자 간의 이해충돌로 현재는 추진이 중단됐지만 급격한 고금리로 국민들의 부담이 가중되는 비상 상황인 만큼 원스톱 대출 이동제를 시급히 도입해야 한다”고 말했다. 은행권 우려 여전해...반면 빅테크는 적극적 다만 금융권이 이를 받아들일 지는 미지수다. 특히 빅테크들의 금융권 진출로 고유 영역 예금ㆍ대출 을 빼앗긴 시중은행들의 반발은 여전히 거세다. 지난해에도 금융당국의 대환대출 플랫폼 추진 과정에서 시중은행들이 빅테크 종속·수수료 지급 등을 이유로 불참을 선언하면서 결국 도입이 무산됐다. 더욱이 당시 은행끼리 모여 추진했던 자체 플랫폼 구축 사업도 시중은행ㆍ지방은행ㆍ인터넷은행 간에 의견이 갈리면서 현재 중단된 상태다. 반면 빅테크ㆍ핀테크사들은 적극적으로 움직이고 있다. 토스도 대환대출 플랫폼 사업 진출 채비에 나섰다. 특히 토스는 금융당국 주도의 대환대출플랫폼에 참여 요청이 있다면 적극적으로 검토하겠다는 입장이다. 60개 금융사 대출 비교가 가능한 ‘핀다’ SK텔레콤 017670 과 하나금융그룹이 투자한 ‘핀크’도 대환대출 플랫폼에 참여할 예정이다. 현재 양사 모두 대출 비교는 가능하나 앱으로 실시간 대출 갈아타기는 불가능하다. 한 금융권 관계자는 “금융결제원의 망을 이용하고 플랫폼 서비스를 그대로 활용하면 되니까 사실 시스템적으로 문제 될 것은 없다”며 “하지만 각 금융사마다 신용등급을 산정하는 기준이 달라 직접적인 비교가 불가능하고 기존 금융권의 경우 빅테크 플랫폼 이용 시 수수료까지 지불해야 하는 불합리성이 있어 해당 사업이 달갑지 않은 건 사실”이라고 말했다.\n", + "\n", + "### 답변: 6금리 인상 물가 인상 등으로 차주들의 이자 부담이 커지면서 금리 부담을 줄이기 위해 대환대출 플랫폼 구축이 다시 재논의되나 과거에도 은행들과 빅테크 간 이견이 컸던 만큼 이번에도 플랫폼 구축이 쉽지는 않을 전망이다.<|endoftext|>\n", + "17 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 노조 운송료 27% 인상 vs 제조사 9%대 인상 차주 8 200명 파업 참가로 150여 공장 가동 중단 건설업계 연이은 파업에 공기 연장 등 피해 우려 수도권의 레미콘 운송 차주들이 파업에 돌입한 1일 오후 경기도 안양시의 한 레미콘 업체에 레미콘 차량이 세워져 있다. 연합뉴스 수도권 레미콘 제조사들과 운송료 인상 협상이 결렬되면서 수도권 레미콘운송노조 조합원들이 1일부터 파업에 돌입했다. 양측은 협상을 이어간다지만 간극이 커 파업이 장기화할 가능성도 배제할 수 없는 상황이다. 건설현장에 미칠 파장도 만만찮을 전망이다. 레미콘운송노조에 따르면 수도권 레미콘운송노조는 주요 레미콘 제조사들과 운송료 인상 관련 협상 결렬을 이유로 이날부터 운송 거부에 들어갔다. 파업에 참가하는 차주는 8 200여 명에 달한다. 노조는 수도권 내 158곳에 달하는 레미콘 공장이 가동을 멈춘 것으로 파악했다. 양측은 지난달 29일과 30일에 걸쳐 운송료 협상을 진행했지만 합의에 이르지 못했다. 수도권 레미콘운송조합원들은 운송료를 회당 5만6 000원에서 7만1 000원으로 약 27% 인상을 요구하고 있다. 또 △명절상여금 100만 원 △근로시간 면제수당 △성과급 1인당 100만 원 △요소수 100% 지급 등도 요구하고 있다. 이에 반해 레미콘 제조사들은 운송료는 9%대 중반 이상의 인상은 어렵다고 맞서고 있다. 운송노조 관계자는 제조업체는 레미콘 납품가격을 인상했지만 레미콘가격에 포함된 운송비는 올려주지 않고 있다 고 주장했다. 이어 지방은 운송료가 올랐지만 수도권만 합의가 미진해 형평성에 어긋난다 고 덧붙였다. 다만 노조 측은 제조사들과의 협상은 이어간다는 방침이다. 노조 파업으로 건설업계가 직격탄을 맞게 됐다. 지난달 화물연대 파업에 이어 레미콘 운송 거부까지 이어지면서 작업 중단 등 또다시 피해를 입게 됐다. 파업이 장기화할 경우 공기가 늘어나고 아파트 입주 일정도 미뤄질 수밖에 없어 손실 규모는 더욱 커질 전망이다. 한 대형건설사 관계자는 화물연대 파업 때도 콘크리트 타설 골조공사가 중단됐었다 며 파업이 끝난 지 얼마 안 됐는데 또다시 레미콘운송조합 파업이 이어져 난감하다 고 토로했다.\n", + "\n", + "### 답변: 수도체 레미콘운송노조는 주요 레미콘 제조사들과 운송료 인상 관련 협상 결렬을 이유로 1일부터 파업에 돌입하여 건설업계가 직격탄을 맞게 됐으며 지난달 화물연대 파업에 이어 레미콘 운송 거부까지 이어지면서 작업 중단 등 또다시 피해를 입게 됐다.<|endoftext|>\n", + "18 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 일본 신문 니케이엠제이가 한국 프랜차이즈 업계에서 이례적으로 윤홍근 제너시스BBQ그룹 회장을 다룬 기사를 냈다. 사진은 BBQ의 치킨대학 전경. 사진제공 제너시스BBQ 윤홍근 제너시스BBQ그룹 회장이 한국 프랜차이즈 대표로는 이례적으로 일본 경제지와 인터뷰를 진행했다. 지난 1일 니케이엠제이는 윤 회장 인터뷰가 포함된 BBQ 취재 기사를 보도했다. 일본 매체로는 처음으로 치킨대학을 탐방했다는 점이 의미 있다. 니케이엠제이는 일본 주요 경제신문인 니혼게이자이신문의 유통·마케팅 전문지다. 해당 매체는 윤 회장에 대해 프랜차이즈 세계 1등의 야망을 품은 경영인 이라는 평가와 함께 BBQ가 라이벌로 미국 맥도날드를 꼽고 있는 점을 조명했다. 윤 회장은 세계 5만여개의 점포를 열고 맥도날드를 추격하고 싶다 고 전했다. 일본에서는 치킨 프랜차이즈가 라이벌로 KFC가 아닌 맥도날드를 꼽는 데 의아함을 나타냈다. 이에 윤 회장은 외식 산업 에 초점을 맞추고 있다고 답변했다. BBQ는 현재 58개국에서 약 2250개의 점포를 운영 중이다. 일본에는 21개 점포가 있다. 올해 말 100개까지 늘릴 계획이다. 레스토랑 타입 베이커리 타입 배달 전문점 등 다양한 사업체로 개점한다는 전략이다. 치킨대학 탐방 내용도 비중 있게 다뤄졌다. BBQ 매장을 운영할 수 있는 실력을 양성하는 최초의 치킨대학이라는 점을 강조했다. BBQ 점포를 내기 전 최소 2명이 2주간의 과정을 수료해야 하며 조리 방법 회계 마케팅 등의 교육이 진행된다. BBQ 관계자는 해외를 중심으로 점포망을 늘려 신종 코로나바이러스 감염증 코로나19 이후도 대비하고 있다 며 영어 중국어 일본어로 쓰여진 교과서를 마련하는 등 유학생 대응도 준비 중 이라고 말했다.\n", + "\n", + "### 답변: 지난홍근 BBQ그룹 회장이 한국 프랜차이즈 대표로는 이례적으로 일본 경제지와 인터뷰를 진행했는데 프랜차이즈 세계 1등의 야망을 품은 경영인 이라는 평가와 함께 BBQ가 라이벌로 미국 맥도날드를 꼽고 있는 점을 조명했고 윤 회장은 외식 산업 에 초점을 맞추고 있다고 답변했다.<|endoftext|>\n", + "19 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 지난 4일 오후 1시30분께 서울시의회 앞에서 노원구 공릉동 서울태릉골프장 일대 공공주택지구 지정 을 반대하는 시민들이 기자회견을 가졌다 사진 황서율 기자 문 정부의 8·4대책에 포함돼 6800가구가 공급될 계획이었던 서울 노원구 공릉동 태릉골프장 CC 일대의 공공주택지구 지정에 주민들이 반대하고 나서면서 사업에 차질을 빚을 것으로 예상된다. 3080 도심복합사업 역시 아직 사업진행이 더딘 상황으로 파악되면서 공공주도 공급물량에 변화가 생기는 것이 아니냐는 목소리도 나온다. 5일 서울시의회는 전날 서울시의회 1호 청원으로 ‘노원구 공릉동 서울태릉골프장 일대 공공주택지구 지정 반대에 관한 청원’이 접수됐다고 밝혔다. 1호 청원을 접수한 박환희 시의원 노원2 에 따르면 청원 접수에는 공릉동 주민 등 3000명이 서명한 것으로 알려졌다. 태릉골프장 일대의 공공주택지구 지정은 2020년 문재인 정부의 주택공급정책인 8.4대책의 일환으로 이야기 됐다. 발표 당시 해당 부지에 1만호가 공급될 예정이었으나 녹지확보 저밀개발 교통문제 등에 부딪혀 6800가구 공급으로 사업계획을 변경했다. 이에 따라 수락산역 역세권 도심복합사업 노원구 내 도시재생사업 등을 통해 총 3100가구의 대체물량을 확보했다. 이번 주민들의 반발로 태릉지구 6800가구 공급정책은 차질이 생길 것으로 예상된다. 주민들은 태릉·강릉 세계문화유산 지정 취소 가능성 생태공원조성계획 희망 교통정체 등을 이유로 반대하고 있다. 이미 올해 상반기 안에 지구 지정을 하겠다던 목표는 지방선거 등으로 주민 설명회나 공청회 등의 절차가 미뤄지면서 하반기로 조정됐다. 이러한 상황에서 지난달 17일 열릴 예정이었던 1차 공청회까지 주민들의 반발로 무산되면서 사업 진행이 더욱 느려진 것이다. 2차 공청회는 오는 11일 열릴 계획이다. 국토부 관계자는 “환경연합평가를 충분히 했고 태릉·강릉 경관에 영향이 없도록 준비하고 있다”며 “법적으로 없는 절차지만 유네스코 유산 영향 평가 역시 준비 중이기 때문에 부정적인 영향을 최소화해 사업을 추진할 계획”이라고 밝혔다. 한편 문 정부의 또다른 공공주도 공급정책인 3080 도심복합사업 역시 아직 진행이 더딘 상황으로 파악됐다. 총 19만6000호 공급을 목적으로 하는 이 사업은 현재 76곳 총 10만호 의 후보지를 발표한 상황이지만 후보지 중 지구지정까지 완료한 곳은 8곳 약 1만3000호 뿐이다. 지난 5월23일 원희룡 국토부장관이 “주민 호응도가 떨어지는 사업은 덜어내겠다”는 입장을 밝혀 일각에서는 해당 사업을 통한 공급 물량이 조정되는 것이 아니냐는 분석도 나온다.\n", + "\n", + "### 답변: 노릉골프장 CC 일대의 공공주택지구 지정과 문 정부의 공공주도 공급정책인 3080 도심복합사업의 진행이 더딘 상황으로 주민들이 반대하고 나서면서 사업에 차질을 빚을 것으로 예상된다.<|endoftext|>\n", + "20 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 쌍용자동차가 5일 인천 중구 네스트호텔에서 개최한 개발자와 함께하는 Q A 간담회 에서 토레스 신차 개발에 참여한 김범석 마케팅담당이 기자 질의에 답하고 있다.\n", + "\n", + "### 답변: 쌍 쌍용자동차가 5일 인천 중구 네스트호텔에서 개최한 개발자와 함께하는 개발자와 함께하는 간담회에서 쌍용자동차 <|endoftext|>\n", + "21 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: GS25 메이플스토리빵 18일만에 100만개 판매 돌파 GS리테일이 운영하는 편의점 GS25가 지난달 17일 선보인 메이플스토리 빵 5종. 사진 GS리테일 편의점 GS25가 온라인게임 메이플스토리 와 손잡고 선보인 메이플스토리 빵이 흥행 돌풍을 이어가고 있다. 출시 첫 날 초도물량 10만개가 완판된 데 이어 18일 만에 누적 100만개가 팔렸다. 6일 GS리테일에 따르면 편의점 GS25가 지난달 17일부터 선보인 메이플스토리빵 5종이 출시 18일 만에 판매량 100만개를 돌파했다. GS25는 꾸준히 이어진 굿즈 상품 마케팅의 일환으로 전 세계 1억9000만명의 사용자를 보유한 온라인 게임 메이플스토리에 주목했다. 이에 GS25는 메이플스토리빵에 메이플스토리의 인기 몬스터 캐릭터 80종의 스티커를 상품 1개당 1장씩 동봉했다. GS리테일 관계자는 메이플스토리빵이 매일 전 GS25매장에 입고되는 즉시 품절이 될 정도로 큰 인기를 끌고 있다 고 전했다. 메이플스토리빵의 인기는 GS25의 자체브랜드 PB 브레디크 상품의 매출에도 영향을 미쳤다. 메이플빵 출시 후 브레디크 매출이 전월 동기보다 64% 뛴 것. 모델이 GS25에서 월간 브레디크 소금버터롤케익 상품을 바라보고 있는 모습. 사진 GS리테일 GS25 측은 메이플스토리빵을 구매하러 오는 소비자들이 빵 진열 매대를 자주 살펴보는 기회가 늘어나며 브레디크 등 다른 빵도 경험하게 되고 재구매로 연결되는 선순환 효과가 나타나고 있다 고 풀이했다.\n", + "\n", + "### 답변: 6점 GS리테일에 따르면 편의점 GS25가 온라인게임 메이플스토리'와 손잡고 지난달 17일부터 선보인 메이플스토리빵 5종이 출시 18일 만에 판매량 100만개를 돌파하여 흥행 돌풍을 이어가고 있다고 밝혔다.<|endoftext|>\n", + "22 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 앱장터 ‘인앱결제’를 둘러싼 구글 카카오의 갈등이 가열되고 있는 가운데 한상혁 방송통신위원장이 7일 양측 관계자를 불러 의견을 듣기로 했다. 한 위원장은 6일 방통위 전체회의 직후 “담당 행정청으로서 이용자들의 불편을 해소하기 위해 노력하는 것은 당연한 의무”라며 “지금 벌어지고 있는 일에 대한 조율은 정책적인 방향에서 해야 할 일이라고 생각한다”고 말했다. 안드로이드용 카카오톡에서는 이모티콘플러스 정기구독 웹결제 안내 링크가 제공된다. 앞서 구글은 지난 1일 부로 자사 앱 장터인 구글플레이 스토어에서 카카오톡 앱 최신 업데이트 버전 제공을 중단했다. 인앱결제 시스템을 도입하지 않는 구글플레이스토어 내 앱에 대해 4월부터 업데이트를 금지하기로 한 자체 방침에 다른 조치다. 카카오가 그동안 구글플레이 스토어에서 ‘이곳을 클릭해서 결제하면 저렴한 가격에 이모티콘 구독 서비스를 이용할 수 있다’며 외부 결제 링크를 홍보해왔는데 이점을 문제 삼은 것이다. 이에 카카오는 안드로이드 사용자들을 대상으로 지난 1일부터 APK 설치파일 형태로 카카오톡 앱을 배포하고 있다. 최신 카카오톡 버전은 다음 포털을 통해 제공하기로 했다. IT업계에서는 구글과 카카오의 기싸움이 계속될 경우 구글플레이 스토어에서 카카오톡 앱이 삭제될 가능성도 배제할 수 없다고 보고 있다. 이용자 5000만명의 국민 메신저 ‘카카오톡’을 앞세운 카카오가 국내 IT업계를 대리해 국내 앱 장터 점유율 70%가 넘는 구글에 맞서는 형국이다. 앞서 구글은 지난달 1일부터 앱 내 결제 시 수수료 최대 30%를 받는 인앱결제 강제 정책을 본격 시작했다. 구글 결제나 구글이 허용한 제3자 결제를 이용하지 않는 앱은 장터에서 퇴출하기로 한 것이다. 더 나아가 다른 결제 수단을 홍보하는 문구나 아웃링크도 넣지 못하게 했다.\n", + "\n", + "### 답변: 한상장터 ‘인앱결제’를 둘러싼 구글 카카오와 국내 앱 장터 점유율 70%가 넘는 카카오의 갈등이 가열되고 있는 가운데 한상혁 방송통신위원장이 7일 양측 관계자를 불러 의견을 듣기로 했으며, 한 위원장은 6일 방통위 전체회의 직후 이용자들의 불편을 해소하기 위해 노력하는 것은 당연한 의무”라며 “지금 벌어지고 있는 일에 대한 조율은 정책적인 방향에서 해야 할 일이라고 생각한다”고 말했다.<|endoftext|>\n", + "23 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 윤석열 대통령은 경제 위기 상황에 대응해 매주 비상경제 민생회의를 여는 등 직접 민생 현안을 챙기겠다고 밝혔습니다. 윤 대통령은 오늘 5일 용산 대통령실에서 열린 국무회의에서 공급망 재편과 코로나 팬데믹이 겹치면서 전 세계가 70년대 오일쇼크 이후 가장 심각한 물가 충격을 받고 있다 며 이같이 말했습니다. 또 민생의 어려움을 덜기 위해 공공 부문이 앞장설 것이라며 과감한 지출 구조조정과 공공기관 경영 효율화로 허리띠를 졸라맬 것이라고 강조했습니다.\n", + "\n", + "### 답변: 윤석열 대통령은 경제 위기 상황에 대응해 매주 비상경제 민생회의를 여는 등 직접 민생 현안을 챙기겠다고 밝힌 가운데 오늘 5일 용산 대통령실에서 열린 국무회의에서 전 세계가 70년대 오일쇼크 이후 가장 심각한 물가 충격을 받고 있다 며 전 세계가 70년대 오일쇼크 이후 가장 심각한 물가 충격을 받고 있다 고 말했고 또 민생의 어려움을 덜기 위해 과감한 지출 구조조정과 공공기관 경영 효율화로 허리띠를 졸라맬 것이라고 강조했다.<|endoftext|>\n", + "24 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 앵커 새 정부 출범 이후 처음으로 고위급 당정협의회가 열렸지만 물가와 민생 안정이 시급하다는 원론적 언급만 확인했을 뿐 뾰족한 대책은 나오지 않았습니다. 이준석 국민의 힘 대표는 윤석열 정부가 약속한 많은 공약들이 국민들에게 제대로 전달되지 않고 있다 고 쓴 소리를 했습니다. 김주영 기자가 취재했습니다. 리포트 윤석열 정부 한마음 한덕수 총리의 건배사로 시작된 첫 고위급 당정협의회. 당정은 물가 등 민생 안정을 최우선 과제로 꼽았습니다. 권성동 원내대표는 예산과 기금의 적극적 활용을 당부했고 권성동 국민의힘 원내대표 국민들은 새 정부 기대도 잠시 치솟는 장바구니 물가와 기름값 높아진 이자 부담 가스 전기요금 등 생활물가 상승에 답답한 나날 보내고 있습니다. 이준석 대표는 대선 당시 약속한 정책들이 제대로 이행되고 있지 않다고 꼬집었습니다. 이준석 국민의힘 대표 많은 정책이 지금 정책 수요자들에게 아주 효율적으로 전달되고 있지 않습니다 김대기 비서실장은 국회 차원의 협력을 요청했습니다. 김대기 대통령 비서실장 이제는 정치의 힘이 너무 강해진 것 같습니다. 경제가 정치의 핵심이 돼 있기 때문에 어쩔 수 없는 현상이라고 보고… 당정은 수입 물가를 잡기 위한 할당관세 확대 원자재 가격 상승분을 납품가에 반영하는 납품단가 연동제 등을 논의했습니다. 또 취약 계층 지원을 위해 추경 예산의 신속한 집행에 나설 방침입니다. 하지만 그동안 언급돼온 대책의 되풀이에 그쳤을 뿐 심각해지는 경제 위기를 타개할 눈에 띄는 대책은 없었다는 평가입니다. TV조선 김주영입니다.\n", + "\n", + "### 답변: 새 정부 출범 이후 처음으로 열린 고위급 당정협의회에서 새 정부 기대도 잠시 치솟는 물가와 생활물가 상승에 답답한 나날날을 보내고 있는 가운데 이준석 국민의 힘 대표는 윤석열 정부가 약속한 많은 공약들이 국민들에게 제대로 전달되지 않고 있다면서 원론적 언급만 확인했을 뿐 경제 위기를 타개할 실질적인 대책이 나오지 않아 우려를 자아내고 있다.<|endoftext|>\n", + "25 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 대구 뉴시스 이무열 기자 홍준표 왼쪽 대구시장이 5일 오전 대구국제공항 계류장에서 열린 ‘대구경북통합신공항 성공적 건설을 위한 주 티웨이항공 본사 대구이전 MOU체결’ 행사에서 인사말을 하고 있다. 2022.07.05. lmy newsis.com 사진 영상 제보받습니다 공감언론 뉴시스가 독자 여러분의 소중한 제보를 기다립니다. 뉴스 가치나 화제성이 있다고 판단되는 사진 또는 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠습니다.\n", + "\n", + "### 답변: 5일 오전 대구국제공항 계류장에서 열린 ‘대구경북통합신공항 성공적 건설을 위한 주 티웨이항공 본사 대구이전 MOU체결’ 행사에서 홍준표 왼쪽 대구시장이 인사말을 했으며 뉴시스 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 뉴스 가치나 화제성이 있다고 판단되는 사진이나 뉴스 가치성이 있다고 판단되는 사진 또는 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 2022.07.05. lmy newsis.com 사진 영상 제보받습니다 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 기자 가치 가치나 화제성이 있다고 판단되는 사진이나 화제성이 있다고 판단되는 사진 또는 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 뉴시스 뉴시스 사진영상부 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 뉴시스 사진영상부 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다고 밝혔다.<|endoftext|>\n", + "26 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 수도권의 레미콘 운송 차주들이 오늘 1일 부터 파업에 들어갔습니다. 레미콘운송노동조합은 유진기업·삼표산업 등 수도권 주요 레미콘 제조사들과 운송료 인상 관련 협상을 벌였지만 최종 합의에 이르지 못해 오늘부터 운송 거부에 들어간다고 밝혔습니다. 레미콘운송조합은 약 27%의 운송료 인상을 요구하는 반면 제조사들은 9%대 이상 인상은 어렵다는 입장을 고수했습니다. 건설업계는 이달 초 화물연대 파업이 일주일 넘게 이어진 데 이어 레미콘 차량의 운행 중단이 장기화할 경우 건설 현장에 타격이 발생할 수 있다며 우려하고 있습니다.\n", + "\n", + "### 답변: 수도권의 레미콘 운송 차주들이 제조사들과 운송료 인상 관련 협상을 벌였지만 최종 합의에 이르지 못해 오늘부터 운송 거부에 들어간다고 밝혔으며, 건설업계는 이달 초 화물연대 파업이 일주일 넘게 이어진 데 이어 레미콘 차량의 운행 중단이 장기화할 경우 건설 현장에 타격이 발생할 경우 건설 현장에 타격이 발생할 수 있다며 우려하고 있습니다.<|endoftext|>\n", + "27 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 삼성바이오로직스가 미국 제약사 MSD와 2768억원 규모 위탁생산 계약을 체결했다. 사진 삼성바이오로직스 삼성바이오로직스가 미국 제약사 MSD와 위탁생산 계약을 체결했다. 삼성바이오로직스는 MSD MSD International Business GmbH 와 2768억2938만원 규모의 의약품 위탁생산 공급계약을 체결했다고 4일 공시했다. 계약금액은 2768억원으로 최근 매출액 대비 17.65% 규모다. 계약기간은 2022년 7월1일부터 2028년 12월31일이다. 삼성바이오로직스 관계자는 해당 계약은 지난해 9월29일에 공시된 투자판단 관련 주요경영사항에 대한 본 계약 체결 건 이라며 계약금액은 고객사의 수요증가에 따라 4942억원으로 증가할 수 있다 고 말했다.\n", + "\n", + "### 답변: 삼성바이오로직스는 4일 미국 제약사 MSD와 2768억2938만원 규모의 의약품 위탁생산 공급계약을 체결했다고 공시하고 2022년 7월1일부터 2028년 12월31일까지 계약기간은 2022년 7월1일부터 2028년 12월31일이라고 밝혔다.<|endoftext|>\n", + "28 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 3일 협상 타임오프 이견 커…노조 인정도 평행선 운반비 인상은 공감대 형성…올해 7500원·내년 6000원 수도권 공장 일제히 중단할 듯…하루 피해 224억 예상 이데일리 함지현 기자 레미콘 제조사와 운송사업자 간 협상이 또다시 결렬됐다. 이에 따라 전국레미콘운송총연합회가 본격적인 단체 행동에 돌입할 예정이다. 사태가 이어질 경우 수도권 레미콘 공장 ‘셧다운’ 장기화가 불가피할 전망이다. 1일 오전 서울 종로구 동화면세점 앞에서 열린 레미콘운송노동자 생존권사수 결의대회에서 참가자들이 구호를 외치고 있다. 사진 연합뉴스 3일 관련 업계에 따르면 양측은 이날 오전부터 협상을 실시했지만 접점을 찾지 못했다. 이번에 발목을 잡은 부분은 ‘타임오프’ 근로시간 면제수당 와 ‘노조’ 인정 여부였던 것으로 알려졌다. 우선 운송사업자 측은 자신들을 노조로 인정해 달라고 요청했다. 하지만 레미콘 제조사들은 이를 수용할 수 없다고 맞섰다. 지입계약을 맺은 개인사업자로서 단체협상 대상이 아니라는 입장에 변화가 없었던 것이다. 특히 명칭을 놓고 ‘수도권 레미콘 운송연대’와 같이 절충안이 제시되기도 했지만 결국 협상은 결렬됐다. 특히 운송사업자 측은 타임오프 수당도 강력히 요청했다. 타임오프는 제조사별 노조 대표자가 근무를 하지 않아도 상생기금 등을 통한 혜택을 제공하는 것을 말한다. 이에 대해 레미콘 제조사들은 특정 대표자들만 수혜를 주는 게 타당하지 않다며 거부 의사를 밝혔다. 이와 함께 운송사업자들이 그동안 요구해 온 △명절 상여금 100만원 △요소수 100% 지급 △타설 후 폐수 비용으로 레미콘 운송료 50% 지급 등은 논의가 이뤄지지 못했다. 운반비 부분에 대해서는 어느 정도 접점을 찾은 모습이다. 2년에 걸쳐 올해 7500원 내년 6000원씩 총 1만3500원을 올리는 형태다. 앞서 운송사업자들은 현재 5만6000원인 운반비를 7만1000원으로 27% 인상해줄 것을 요구했다. 양측은 이번 협상 결렬 이후 추가적인 협의 진행 여부는 아직 정하지 않았다. 지난 1일 생존권사수결의대회를 진행하면서 파업 신호탄을 쏘아 올린 운송노동자들은 이번 협상 결렬에 따라 4일부터 총파업에 돌입할 계획이다. 이에 따라 이미 지난 1일 95%가량 운영을 멈춰 섰던 수도권 공장은 모두 문을 닫을 것으로 예상된다. 사태 장기화로 셧다운이 길어질 경우 레미콘 제조사들이 큰 타격을 입을 전망이다. 수도권 14개 권역의 158개 레미콘 제조사 공장을 운영하지 못하면 하루 추정 피해액만 224억원 규모에 달한다. 아파트 등 건설 현장 공급 차질도 예상된다. 운송사업자들이 독점적 지위를 가질 수밖에 없는 구조가 변하지 않으면 시장이 왜곡되면서 업계가 경쟁력을 잃을 수 있다는 우려도 나온다. 레미콘 업계 관계자는 “레미콘 운반사업자의 집단적 운송 거부로 인해 레미콘 공장이 멈춰선다면 이는 곧바로 건설 현장 차질까지 이어질 것”이라며 “일부 기득권의 이득을 위해 수많은 소비자들이 피해를 떠안게 되는 셈”이라고 말했다.\n", + "\n", + "### 답변: 지난 레미콘 제조사와 운송사업자 간 협상이 또다시 결렬되어 전국레미콘운송총연합회가 본격적인 단체 행동에 돌입할 예정이며 사태가 이어질 경우 수도권 레미콘 공장 ‘셧다운’ 장기화가 불가피할 전망이다.<|endoftext|>\n", + "29 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: KT 외국인 맞춤 서비스 강화 KT는 최근 입국이 늘고 있는 외국인 고객을 위한 케어서비스를 강화한다고 3일 밝혔다. 국내 거주 외국인 중 비중이 가장 높은 중국인 고객은 위챗 중국 최대 메신저 앱 내 KT 미니프로그램을 통해 KT 유무선 서비스에 대한 중국어 실시간 채팅 상담 통신 상품 사용량 조회 등을 할 수 있다. 사진은 국내 거주 중국인이 이날 실제 위챗 KT 미니프로그램을 이용하는 모습.KT 제공 KT는 최근 입국이 늘고 있는 외국인 고객을 위한 케어서비스를 강화한다고 3일 밝혔다. 국내 거주 외국인 중 비중이 가장 높은 중국인 고객은 위챗 중국 최대 메신저 앱 내 KT 미니프로그램을 통해 KT 유무선 서비스에 대한 중국어 실시간 채팅 상담 통신 상품 사용량 조회 등을 할 수 있다.\n", + "\n", + "### 답변: K 3일 KT는 최근 입국이 늘고 있는 외국인 고객을 위한 케어서비스를 강화한다고 밝힌 가운데 국내 거주 외국인 중 비중이 가장 높은 중국인 고객은 위챗 중국 최대 메신저 앱 내 KT 미니프로그램을 통해 KT 유무선 서비스에 대한 중국어 실시간 채팅 상담 통신 상품 사용량 조회 등을 할 수 있으며 국내 거주 외국인 중 비중이 가장 높은 중국인 고객은 위챗 중국 최대 메신저 앱 내 KT 미니프로그램을 통해 KT 유무선 서비스에 대한 중국어 실시간 채팅 상담 통신 상품 사용량 조회 등을 할 수 있다.<|endoftext|>\n", + "30 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 대전조차장역 인근서 탈선…경상 7명 포함 총 11명 부상 최대 110분 지연…원희룡 SR·코레일 등 혁신 만전 1일 오후 서울 강남구 SRT수서역 매표소 앞에 열차 탈선사고로 인한 열차 지연과 배상 안내문이 걸려있다. 이날 부산에서 수서역으로 향하던 SRT 열차가 대전조창역 인근에서 탈선하는 사고가 발생해 11명이 부상을 입었다. 국토부와 한국철도공사는 복구 작업과 함께 사고 원인을 조사중이다. 2022.7.1 뉴스1 © News1 박세연 기자 서울 뉴스1 김진 기자 1일 오후 부산역을 출발해 서울 수서역을 향하던 SRT 열차가 탈선해 총 11명이 다쳤다. 열차 운행이 지연되는 가운데 한국철도공사 코레일 는 심야 임시전동열차 운영을 결정했다. 코레일은 이날 오후 KTX 및 일반열차들이 상당 시간 지연 운행되고 있다 며 수도권 전동열차 이용객들의 편의를 위해 기존 막차 시간보다 약 1시간 19분 연장 운행한다 고 밝혔다. 연장운행 노선은 경인선과 경부선 총 2개 노선이다. 인천을 향하는 경인선 하행 막차는 2일 새벽 1시10분 서울역 지상 에서 출발한다. 구로를 향하는 경부선 상행 은 같은 날 0시55분 병점역에서 출발할 예정이다. 앞서 수서행 SRT 338호 열차는 이날 오후 3시21분쯤 대전조차장역 인근에서 탈선했다. 열차의 1호차와 맨 후부 동력차 총 2량이 궤도를 이탈했다. 오후 1시45분 부산역에서 출발한열차는 4시8분 수서역에 도착할 예정이었다. 해당 열차에는 380명이 탑승해 있었고 사고로 11명이 다쳤다. 4명은 귀가 조치됐고 7명은 인근 병원으로 이송됐으나 경상으로 파악됐다. 나머지 승객들은 인근 역까지 도보로 이동한 뒤 연계버스로 환승 조치됐다. 사고로 인해 KTX·SRT 열차 운행은 모두 지연됐다. 서울행 상행 KTX 열차는 대전 서울 간 일반선으로 우회 운행되고 있으며 수서행 상행 SRT 열차는 대전 신탄진 간 하행 고속선로를 이용되고 있다. 상행선은 최대 110분가량 지연 운행 중으로 6개 열차는 운행을 중지한 상태다. 부산행 하행 KTX·SRT 열차는 정상 운행 중이나 열차 운행 조정 등으로 최대 40분 지연 운행 되고 있다. 사고 복구는 열차 운행이 종료되는 밤 11시부터 본격적으로 시작될 예정이다. 코레일은 첫 열차 오전 5시5분 서울역 출발 운행을 목표로 복구 작업을 진행할 방침이다. 코레일은 현장에는 차량 시설 전기 등 300여명의 복구인력과 기중기 모터카 등 가용할 수 있는 모든 장비를 투입해 작업할 예정 이라고 설명했다. 1일 부산에서 수서역으로 향하던 SRT 열차가 대전조창역 인근에서 탈선하는 사고가 발생해 관계자들이 사고를 수습하고 있다. 2022.7.1 뉴스1 © News1 김기태 기자 주무부처인 국토교통부는 관계기관과 정확한 사고 원인을 파악 중이다. 주요 탈선 원인으로는 폭염이 거론된다. 30도를 웃도는 무더위에 레일이 팽창하면서 선로에 뒤틀림 현상이 발생했을 가능성이다. 사고 발생 열차는 바퀴가 빠진 것으로 알려졌다. 원인 조사는 국토부 항공철도사고조사위원회가 맡게 된다. 국토부는 사고 발생 직후 철도안전감독관·철도경찰 및 사고조사반을 현장에 투입하고 대책 매뉴얼에 따라 철도재난상황반을 구성해 대응에 나섰다. 긴급대책회의 및 장관 보고도 이뤄졌다. 원희룡 국토부 장관은 관련 보고를 받고 철도 등 교통을 총괄하는 장관으로서 이번 사고로 인해 피해를 입은 승객과 불편을 겪고 있는 국민께 진심으로 송구하다 며 신속한 복구 작업을 지시했다. 특히 원 장관은 이번 사고와 관련해 공공기관 혁신 을 재차 언급했다. 원 장관은 사고 차량을 운행한 SR과 차량정비·유지보수 등을 담당하는 코레일 직원들이 자신의 가족이 열차를 이용한다고 생각하고 긴장감을 갖고 업무에 임했으면 이러한 사고가 발생하지 않을 것 이라고 강조했다. 이어 정확한 사고조사를 바탕으로 철저한 안전관리체계를 구축하는 것은 물론이고 사소한 사고도 재발하지 않도록 코레일 SR 등 공공기관 스스로 혁신하는 데 만전을 기할 것 이라고 덧붙였다. 1일 부산에서 수서역으로 향하던 SRT 열차가 대전조창역 인근에서 탈선하는 사고가 발생 열차의 바퀴가 선로에서 이탈해 있다.\n", + "\n", + "### 답변: 1일 오후 부산역을 출발해 서울 수서역을 향하던 SRT 열차가 대전조차장역 인근에서 탈선하는 사고가 발생해 11명이 부상을 입었는데, 코레일은 수도권 전동열차 이용객들의 편의를 위해 기존 막차 시간보다 약 1시간 19분 연장 운행하고, 사고 복구는 열차 운행이 종료되는 밤 11시부터 본격적으로 시작될 예정이다.<|endoftext|>\n", + "31 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 이창용 한국은행 총재 사진 이기범 기자 leekb 인플레이션 상황이 심각해지면서 한국은행이 사상 첫 빅스텝 기준금리 0.5%포인트 인상 에 나설 가능성도 높아진다. 증권가에서는 한은의 빅스텝을 예상하면서도 하반기 경기 상황에 따라 금리 인상에 속도 조절을 할 가능성이 있다고 보고 있다. 5일 금융투자업계에 따르면 국내 증권사들은 오는 14일 열리는 금융통화위원회에서 기준금리 50bp 1bp 0.01%포인트 인상이 결정될 것으로 전망한다. 우리나라에서 기준금리 50bp 인상은 유례가 없는 일이다. 실제 빅스텝을 단행할 경우 기준금리는 현재 1.75%에서 2.25%로 오른다. 빅스텝 전망의 가장 큰 이유는 급격한 물가상승이다. 이날 통계청이 발표한 6월 국내 소비자물가지수는 108.22로 전년 동월대비 6% 상승했다. 외환위기였던 1998년11월 6.8% 이후 가장 높은 수치다. 2 3%를 오가던 물가상승률은 지난 3월 4.1%를 기록한 이후 4월 4.8% 5월 5.4%로 갈수록 높아지는 추세다. 러시아 우크라이나 전쟁으로 인한 에너지와 원자재 곡물 가격 상승 원화 약세로 인한 수입물가 상승 등이 주요 원인으로 꼽힌다. 심각한 물가를 잡기 위해선 금리 인상이 불가피하다는 분석이다. 임재균 KB증권 연구원은 6월 소비자물가가 고점을 기록했지만 하반기에는 공공요금 인상 등으로 물가 상승 압력이 더 높아질 수 있다 며 7월 금통위에서 50bp 인상을 단행할 것 이라고 설명했다. 미국 연방준비제도의 2연속 자이언트스텝 75bp 인상 가능성으로 인한 한미 금리차 역전도 우리나라 기준금리 인상 압력을 높이는 요인이다. 신흥국으로 분류되는 한국은 통상 미국보다 금리를 높게 유지해 왔다. 하지만 최근 미국이 연달아 금리를 높이면서 현재 한국과 미국의 금리는 같은 수준 1.75% 으로 올라왔다. 페드워치 FedWatch 에 따르면 오는 26 27일 열리는 FOMC 미국 연방공개시장위원회 에서 75bp 인상할 확률은 95.1%다. 이 경우 미국 기준금리는 2.25 2.5%가 된다. 한은이 빅스텝을 하더라도 미국 금리가 더 높아진다. 금리가 더 높은 곳으로 이동하는 자본의 특성을 고려할 때 한미 금리차 역전은 한국에서의 자본 유출을 심화시키는 요인으로 지적된다. 이를 최소화하기 위해서라도 한국은 미국의 금리 인상 속도에 어느정도 발을 맞출 수밖에 없다. 민지희 미래에셋증권 연구원은 외국인 자본 유출은 단순 금리차 외에도 국내 펀더멘털 기초체력 둔화 속도의 영향을 받을 가능성이 높다 며 미국 연준의 75bp 인상 가능성이 높은 만큼 우리나라도 빅스텝 가능성이 크다 고 전망했다. 급격한 금리 인상은 소비를 위축시키고 경기 침체 우려를 불러온다. 지금 인플레이션이 수요 때문이 아닌 공급의 문제라는 점에서 각국 중앙은행들의 긴축 조치가 적절한 것이냐는 의문도 제기된다. 하지만 시장 거품을 진정시키기 위해선 경기 침체를 감내해서라도 금리 인상하는 수단을 써야 한다는 시각도 존재한다. 강승원 NH투자증권 연구원은 미국은 경기 침체 가능성을 용인하면서까지 물가와 싸우고 있다 며 한국은 수출 국가이자 인플레이션 압력을 강제로 수입하고 있는 국가라는 점에서 딜레마가 더 크다 고 지적했다. 그러면서 당장 7월 금통위에서 50bp 인상을 피할 수 없을 것 이라며 8월 금통위에서도 25bp 추가 인상을 통해 연말 기준금리 전망치인 2.5%에 도달할 것 이라고 분석했다. 글로벌 긴축이 진행될 수록 증시 변동성도 높아진다. 금리 인상으로 채권 가격이 하락할뿐 아니라 할인율 상승으로 주식의 상대적 매력이 떨어진다. 실질적으론 기업의 자금조달 압력이 커지면서 실적에도 부담이 될 수 있다. 급격한 긴축으로 인한 경기 침체 가능성이 커지면서 연말로 갈수록 긴축 강도는 약해질 수 있다는 분석도 나온다. 민 연구원은 최근 국내 경기에 대한 우려가 높아지면서 하반기 예정된 두 번의 금통위 10월 11월 중 한 번 25bp 올리거나 두 차례 모두 동결할 가능성이 있다 며 연말 우리나라 기준금리 전망은 2.5% 혹은 2.75%가 될 것 이라고 전망했다. 이어 시장은 미국 연준이 4분기에도 빅스텝을 가져갈 것으로 예상하지만 그 보단 인상 속도가 좀 낮아질 수도 있다 며 미국이 긴축 속도를 조절하면 한국도 조절할 가능성이 있다 고 말했다.\n", + "\n", + "### 답변: 인플레이션 상황이 심각해지면서 한국은행이 사상 첫 빅스텝 기준금리 0.5%포인트 인상 에 나설 가능성도 높아져, 증권가에서는 한은의 빅스텝을 예상하면서도 하반기 경기 상황에 따라 금리 인상에 속도 조절을 할 가능성이 있다고 보고, 오는 14일 열리는 금융통화위원회에서 기준금리 50bp 1bp 0.01%포인트 인상이 결정될 것으로 전망하고 있다.<|endoftext|>\n", + "32 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 뉴시스 이재준 기자 오미크론 변이를 중심으로 코로나19가 기승을 부리는 대만에서 4일 신규환자는 2만3118명으로 2개월 만에 2만명대로 줄었지만 추가 사망자는 69명 나왔다. 중앙통신과 연합보 聯合報 중국시보 中國時報 등에 따르면 코로나19 대책본부인 중앙유행병 지휘센터는 이날 확진자 가운데 대만 안에서 2만3045명 생기고 외국에선 73명이 들어왔다고 발표했다. 전날 감염자는 3만2681명 2일 3만4827명 7월1일 3만5800명 6월30일 3만8942명 29일 4만2204명 28일 4만4428명 27일 2만8530명 26일 3만9646명 25일 4만398명 24일 4만5767명 23일 4만8356명 22일 5만2246명 21일 5만6404명 20일 경우 3만5632명으로 1개월 2주일 만에 3만명대로 떨어졌다. 19일은 5만636명 18일 5만3707명 17일 5만5261명 16일 6만3221명 15일 6만8939명 14일 6만6189명 13일 4만5110명 12일 5만657명 11일 7만9663명 10일 6만8347명 9일 7만2967명 8일 8만223명 7일 8만3027명 6일 5만3023명 5일 6만2110명 4일 6만8151명 3일 7만6564명 2일 7만6986명 6월1일 8만8293명 5월31일 8만705명 6일 3만6213명 4일 2만8487명 2일 1만7858명 1일 1만7085명 4월30일 1만5149명이다. 대만 내 새 감염자는 22개 현시에서 발생했으며 남성 1만929명 여성 1만2087명 29명은 확인하고 있다. 나이는 5세 미만에서 90대 사이다. 신베이시에서 3438명 타이중시 3217명 가오슝시 2719명 타오위안시 2411명 타이베이시 1992명 타이난시 1842명 장화현 1336명 핑둥현 921명 먀오리현 619명 윈린현 609명 신주현 599명 신주시 491명 이란현 491명 난터우현 472명 자이현 439명 화롄현 436명 타이둥현 254명 지룽시 246명 자이시 213명 펑후현 157명 진먼현 125명 롄장현 18명이다. 외부 유입 감염자는 남성 42명 여성 31명이다. 나이는 5세 미만에서 80대까지다. 미국에서 3명 베트남 2명 독일과 터키 스페인 1명씩 유입했고 65명은 출발 국가를 조사하고 있다. 이로써 대만 코로나 감염자는 총 389만3643명에 달했다. 대만 안에서 387만8594명이고 국외 유입이 1만4995명 친선함대 36명 항공기 2명 불명 1명 조사 중 14명이다. 코로나19 환자는 작년 5월10일 100명 미만이다가 이후 1년1개월24일 동안 크게 증대하면서 이날까지 389만3550명 가까이 늘어났다. 지휘센터는 코로나19 환자 가운데 이날 전날 88명에서 19명 줄어든 69명이 새로 사망했다고 전했다. 남성 36명 여성 33명으로 연령이 5세 미만에서 90대 사이다. 64명이 만성질환자이고 48명은 백신을 3차까지 맞지 않았다. 이제껏 코로나19 감염자 중 7025명이 숨졌다. 이중 15명은 국외 유입자다. 대만 내에서 숨진 환자 7010명 분포를 보면 신베이시 1726명 수도 타이베이 905명 타이중시 656명 가오슝시 598명 타오위안시 557명 타이난시 457명 장화현 362명 핑둥현 289명 윈린현 182명 난터우현 179명 지룽시 173명 이란현 159명 먀오리현 137명 자이현 128명 화롄현 114명 신주현 111명 자이시 109명 타이둥현 89명 신주시 67명 진먼현과 펑후현 각 9명이다.\n", + "\n", + "### 답변: 오통신과 연합보 聯合報 중국시보 中國時報 등에 따르면 코로나19 대책본부인 중앙유행병 지휘센터는 이날 오미크론 변이를 중심으로 코로나19가 기승을 부리는 대만에서 4일 신규환자는 2만3118명으로 2개월 만에 2만명대로 줄었지만 추가 사망자는 69명 나와 대책본부인 중앙유행병 지휘센터는 이날 확진자 가운데 대만 안에서 2만3045명 생기고 외국에선 73명이 들어왔다고 발표했고 대만 내 새 감염자는 22개 현시에서 발생했으며 남성 1만929명 여성 1만2087명 확인하고 있다.<|endoftext|>\n", + "33 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하분이 적용된 휘발유 및 경유를 주유하고 있다.\n", + "\n", + "### 답변: 1일 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하분이 적용된 휘발유 및 경유를 주유하고 있으며 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하분이 적용된 휘발유 및 경유를 주유하고 있고, 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰뜰주유소를 찾은 시민들이 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하분이 적용된 휘발유 및 경유를 주유하고 있다.<|endoftext|>\n", + "34 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 뉴시스 1사 1인 장애인 채용 1호 기업 인 한국후꼬꾸에서 김동석 IBK기업은행 기업지원부장 오른쪽 과 이동일 한국장애인고용공단 부장 왼쪽 이 지난달 23일 회사 관계자들과 기념촬영을 하고 있다. 2022.7.4 사진 IBK기업은행 제공 photo newsis.com 서울 뉴시스 정옥주 기자 IBK기업은행은 한국장애인고용공단과 1사 1인 장애인 채용 캠페인 을 추진한다고 4일 밝혔다. 이는 지난해 10월 체결한 중소기업 장애인 채용 지원을 위한 업무협약 의 후속사업이다. 이번 캠페인을 통해 두 기관은 장애인 채용 희망 중소기업에게 장애인 구인서비스를 밀착 지원한다. 장애인공단의 장애인 고용컨설팅과 기업은행의 경영 컨설팅도 무료로 제공한다. 또 장애인 채용 시 기업은행은 일자리 채움펀드를 통해 1인당 100만원의 금융비용을 지원하고 장애인 고용 우수기업으로 선정될 경우 금리 우대 대출상품도 활용할 수 있다. 참여 신청방법은 기업은행이 운영하는 중소기업 전문 취업포털 아이원 잡 i ONE JOB 홈페이지에서 가능하며 참여 기업을 상시 모집한다. 기업은행 관계자는 이번 캠페인을 통해 중소기업의 장애인 채용에 많은 관심을 기대한다 고 말했다.\n", + "\n", + "### 답변: IBK기업은행은 한국장애인고용공단과 중소기업 장애인 채용 지원을 위한 업무협약 의 후속 사업으로 지난해 10월 중소기업 장애인 채용 지원을 위한 업무협약 의 후속 사업으로 1사 1인 장애인 채용 캠페인 을 추진한다고 4일 밝혔다.<|endoftext|>\n", + "35 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 은평·서대문구 경기 고양시 등지에 이른바 러브 버그 라 불리는 벌레떼가 출몰해 주민들이 불편을 겪고 있다. 사진은 러브 버그 모습. 사진 연합뉴스 최근 서울 서북권과 경기 고양시 등에 떼로 나타난 일명 러브버그 사랑벌레 . 벌레를 싫어하는 사람에게 혐오감을 줄지언정 해충은 아니라는 것이 중론입니다. 오늘 5일 환경부 국립생물자원관 등에 따르면 최근 출몰한 러브버그는 계피우단털파리 로 추정되며 유전자 분석이 아직 진행 중이긴 하지만 외래종보다는 자생종일 가능성에 무게가 실립니다. 유전자 분석 결과는 이번 주 내 나올 전망입니다. 자원관 관계자는 국내에 털파리 전공자가 없어 이번에 나타난 러브버그가 언제부터 국내에 있었는지 등을 추적하기 어려운 상황 이라고 설명했습니다. 같은 털파리과에 속하며 미국에서 러브버그로 불리는 플리시아 니악티카 는 플로리다주 등 멕시코만에 접한 미국 남부지역 등에서 여름철 단골손님이다. 코스타리카 온두라스 멕시코 등에도 서식합니다. 국내 러브버그와 플리시아 니악티카는 특성이 비슷할 것으로 추측됩니다. 플로리다대 식품 및 농업과학연구소 IFAS 가 펴낸 책 등을 보면 플리시아 니악티카는 몸길이가 수컷은 6㎜ 정도이고 암컷은 8㎜가량으로 작으며 생존시간은 실험실 환경에선 수컷과 암컷 각각 92시간과 72시간 정도인데 자연에서는 짝을 찾아 교미하고 알을 낳는 데 필요한 만큼 만 삽니다. 주로 낮에 기온이 20도 이상일 때만 날아다니고 밤에는 낮은 초목에 숨어서 쉽니다. 플리시아 니악티카는 통상 연중 4 5월과 8 9월 두 차례 번성하며 고속도로 주변에 떼로 살면서 차에 부딪혀 자국을 남기는 터라 미국에서도 골칫거리 로 취급받기도 합니다. 암컷 플리시아 니악티카는 썩어가는 식물이나 잔해 밑에 100 350개 알을 낳으며 알에서 애벌레가 태어나는 데는 약 20일이 걸립니다. 그간에도 우리나라 생태계 일원으로 살아온 러브버그가 이번에 화제의 중심에 오른 이유는 도심에 떼로 나타났기 때문입니다. 털파리류 애벌레가 성체로 우화 羽化 하려면 고온다습해야 하는데 지난달까지는 가뭄으로 이런 환경이 나타나지 않다가 최근 장마철에 들어서면서 한꺼번에 성체가 됐다는 분석이 나옵니다. 지방자치단체들이 민원에 러브버그 방역에 나섰지만 전문가들은 그럴 필요가 있는지 의문을 제기합니다. 대기가 건조해지면 금방 죽기 때문인데 당국은 장마가 끝나고 2주 정도 지나면 러브버그들이 자연히 소멸할 것으로 예상합니다. 더구나 러브버그는 굳이 따지자면 해충보다는 익충에 가깝습니다. 국립생물자원관 관계자는 사람에게 질병을 옮기거나 농작물을 해쳐 농사를 망치지 않는다 라고 말했습니다. 플리시아 니악티카는 사람을 물거나 쏘지 않아 위협이 되지 않고 다양한 식물의 화밀 花蜜 을 먹기에 수분에는 도움을 줍니다. 애벌레의 경우 썩은 식물을 유기물로 바꿔 땅을 옥토로 바꾸는 역할을 하는 것으로 알려졌습니다. 러브버그를 피하고 싶다면 어떻게 해야 할까. 지난 2015년 학술지 Florida Entomologist 에 실린 논문에 따르면 플리시아 니악티카는 수컷이든 암컷이든 꽃에서 유래된 페닐아세트알데히드 PAA 에 후각적으로 끌리고 노란색과 흰색에 시각적으로 끌리는 것으로 나타났습니다. 러브버그를 멀리하려면 꽃향기가 나는 향수와 노란옷이나 흰옷을 입지 않는 것이 좋다는 의미입니다.\n", + "\n", + "### 답변: 5일 환경부 국립생물자원관 등에 따르면 최근 서울 서북권과 경기 고양시 등에 떼로 나타난 이른바 러브 버그 라 불리는 벌레떼가 계피우단털파리로 추정되며 유전자 분석이 아직 진행 중이긴 하지만 외래종보다는 자생종일 가능성에 무게가 실리고 있어 국내 러브버그와 플리시아 니악티카는 특성이 비슷할 것으로 추측된다.<|endoftext|>\n", + "36 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 화학연·안전성평가연구소 등과 시너지 제고 신·변종 감염병·원숭이두창 등 연구 박차 최영기 왼쪽 한국바이러스기초연구소장과 신의철 바이러스면역연구센터장이 5일 오후 기초과학연구원 과학문화센터에서 출범1주년 간담회를 열고 연구성과에 대해 설명하고 있다. 사진 IBS 제공 신·변종 감염병 등을 연구하는 한국바이러스기초연구소 바이러스연 가 출범 1주년을 맞았다. 코로나19와 원숭이두창 등 주요 감염병을 대응하는 기초연구는 물론 국내에 부족한 바이러스 분야 인재를 육성하는 데 역량을 집중하고 있다. 올해는 주요 정부출연연구기관 등과 바이러스 연구협력 협의체 를 구축 연구기관간 시너지를 내는 데도 주력하고 있다. 5일 기초과학연구원 IBS 에 따르면 바이러스연은 IBS 산하 조직으로 지난해 7월 1일 설립한 후 바이러스 기초원천역량을 확보해 국내 감염병 안보에 공헌하는 것이 목표다. 바이러스연은 현재 신·변종 바이러스 연구센터 와 바이러스 면역 연구센터 2개 센터로 구성돼 있다. 각각 신·변종 바이러스의 이해를 통한 바이러스성 질병 극복 연구와 면역병리 기전 연구 등을 수행한다. 출범 후 고연령 코로나19 감염자의 중증도와 전파율이 저연령 감염자 보다 높다는 사실을 동물실험으로 입증하는 등 신종 감염병 연구에 매진하고 있다. 이르면 내년 바이러스 구조분석 플랫폼 연구센터도 추가 설립해 연구 역량을 확대할 예정이다. 바이러스연은 현재 한국화학연구원 안전성평가연구소 등과 함께 바이러스 연구협력 협의체 를 구축해 기초·응용연구간 시너지 효과도 제고하고 있다. 최영기 바이러스연구소장은 협력체를 통해 국가방역에 도움이 될 수 있는 기반 연구를 수행하겠다 며 좀더 빠르게 국민들에게 옳은 정보와 바이러스를 대처할 수 있는 좋은 방향을 제시할 수 있는 연구를 하도록 노력하겠다 고 말했다. 신의철 바이러스면역연구센터장은 바이러스를 빠르게 대응하는 연구 외에도 향후 발생할 신종 바이러스를 미리 대비하는 연구도 수행하고 있다 며 어떤 바이러스가 오더라도 대응할 수 있도록 연구에 최선을 다하겠다 고 강조했다. 한편 이날부터 6일까지 대전 IBS 과학문화센터에서 바이러스연 출범 1주년을 기념하는 바이러스 연구 포럼 이 열린다. 5일에는 바이러스 면역 연구센터를 포함해 한국생명공학연구원 한국과학기술원 KAIST 등이 6일에는 신변종 바이러스 연구센터를 필두로 한국화학연구원 등이 대표 연구성과를 발표한다. 포럼은 IBS 유튜브 채널에 생중계되며 자세한 정보는 포럼 누리집을 참고하면 된다.\n", + "\n", + "### 답변: 한국바이러스기초연구소 바이러스연은 코로나19와 원숭이두창 등 주요 감염병을 대응하는 기초연구는 물론 국내에 부족한 바이러스 분야 인재를 육성하고, 올해는 주요 정부출연연구기관 등과 바이러스 연구협력 협의체 를 구축 연구기관간 시너지를 내는 데도 주력하고 있으며 출범 1주년을 맞았다.<|endoftext|>\n", + "37 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 머니S리포트 물가·금리에 환율까지 3高 ④ 매매 차익·이자 수익 톡톡 편집자주 물가와 환율 금리가 모두 상승하는 3중고 로 인해 대한민국 경제에 비상이 걸렸다. 2년 넘게 이어진 팬데믹 세계적 감염병 대유행 상황에서 물가 상승 지속 러시아·우크라이나 전쟁 장기화 미국 연방준비제도 Fed 연준 의 기준금리 인상 중국의 봉쇄 조치까지 대외 불확실성이 커지면서 대다수 기업들이 실적 둔화를 겪을 것이란 전망이다. 원 달러 환율이 약 13년 만에 최고 수준으로 치솟으면서 외국인 투자금 이탈이 가속화되고 있다는 점도 국내 증시엔 부담이다. 현재 코스피의 외국인 보유 비중은 30% 정도로 2009년 이후 가장 낮은 수준이다. 반면 섬유의복·제약바이오 등 일부 업종은 환율 상승에 따른 수혜가 기대되기도 한다. 증시를 떠난 투자자들은 고환율을 이용 달러에 투자하는 상장지수펀드 ETF 와 달러예금 달러보험 등으로 눈을 돌리고 있다. 안전자산으로 분류되는 채권 역시 개인의 순매수 금액이 1년 간 2배 가까이 증가하는 등 자금이 몰리고 있다. 글로벌 금리 인상 기조가 지속되고 채권금리 또한 상승하면서 채권으로 손을 뻗은 투자자들이 급증한 것으로 나타났다. 사진 이미지투데이 기사 게재 순서 ① 또 커지는 불확실성 대한민국 경제 비상 ② 强달러에 돈 몰린다… 달러 예금·보험부터 ETF까지 ③ 원화 약세에 셀코리아 ... 한미 금리 역전 우려에 하반기도 답없다 ④ 투자 암흑기... 채권 저가매수 기회 6월 한 달 새 코스피지수가 연중 최저점을 일곱 차례 경신하고 비트코인을 비롯한 암호화폐 가상화폐 가 급락하는 등 금융 자산이 휘청이면서 채권으로 눈을 돌리는 투자자들이 늘고 있다. 저가 매수와 이자 수익에 대한 기대감 등에 주목하고 있는 것이다. 러시아와 우크라이나 전쟁 장기화 미국의 강한 긴축 기조 지속적인 물가 상승 우려 중국의 신종 코로나바이러스 감염증 코로나19 봉쇄 조치 등 많은 매크로 거시경제 불확실성이 지속되면서 주식 등 위험자산에 대한 회피 심리가 강해졌다. 반대로 안전자산으로 분류되는 채권은 환영을 받는 분위기다. 개인의 채권 순매수 금액은 1년 간 2배 가까이 증가했다. ━ 채권금리 상승에 채권 투자 매력↑ ━ 그래픽 김은옥 기자 글로벌 금리 인상 기조가 지속되고 채권금리 또한 상승하면서 채권으로 손을 뻗은 투자자들이 급증한 것으로 나타났다. 금융투자협회 채권정보센터에 따르면 6월 17일 3년 만기 국고채 금리는 전거래일 대비 1.7bp 1bp 0.01%포인트 오른 연 3.745%로 마감했다. 2011년 8월 4일 연 3.770% 이후 최고치였다. 이후 3.5 3.6%대를 등락하고 있다. 채권 투자 방법은 만기 보유 와 트레이딩 거래 등 크게 두 가지 방식으로 나뉜다. 만기 보유는 만기가 도래할 때까지 채권을 팔지 않고 이자를 받은 후 만기에 원금을 돌려 받는 방법 트레이딩은 채권을 사고팔며 매매차익을 거두는 방법이다. 통상 시장 금리가 오르면 시장에서 거래되는 채권 가격은 하락해 이미 발행돼 거래되는 채권을 저가에 매수 매매 차익을 기대할 수 있다. 새롭게 발행되는 채권은 발행 금리가 높기 때문에 이자 수익을 노려볼 수 있다. 황세운 자본시장연구원 선임연구위원은 채권금리 상승은 평가 손실이 발생할 수 있는 위험이 있어 금리 상승기가 채권 투자에 부담스러운 시기로 여겨질 수도 있으나 만기까지 보유한다면 얘기가 달라진다 며 중간에 발생하는 이자를 지급받으면서 만기까지 보유하면 평가 손실에 대한 걱정은 하지 않아도 되기 때문 이라고 설명했다. 이어 올해 채권금리는 추가 상승이 가능할 것이란 전망이 나오는 만큼 연말까지 더 상승할 가능성이 있다 며 채권 투자 적기는 향후 예상 이자율 등을 고려해 신중하게 판단해야 한다 고 덧붙였다. ━ 개인 채권 투자금액 1년 새 2배 껑충 ━ 삼성증권의 올 5월 말까지 개인투자자 평균 채권 투자금액은 1억9732만원으로 전년동기 대비 91% 증가했다 그래픽 김은옥 기자 과거와 달리 최근엔 1만원 전후의 채권 소액투자가 가능해졌다. 그만큼 개인투자자들의 채권 투자 문턱이 낮아진 것이다. 이 같은 배경과 맞물리며 개인투자자들의 채권 투자도 크게 늘었다. 채권의 경우 주식과 달리 장외시장 비중이 높다. 금융투자협회에 따르면 개인투자자들은 올들어 6월 28일까지 장외 채권시장에서 채권 4조8805억원어치를 순매수한 것으로 집계됐다. 전년동기 2조6253억원 보다 86% 가량 증가한 수치다. 삼성증권의 경우 올해 개인투자자 대상 채권 판매 규모는 5월 말 기준 지난해 같은 기간에 비해 47% 늘어난 2조2000억원을 기록했다. 신종자본증권과 회사채는 이자 지급 주기가 3개월로 짧다는 장점이 있다. 높은 이자수익을 노리는 투자자들은 은행·금융지주사가 발행한 신종자본증권과 일반 회사채를 절세를 노리는 투자자들은 저쿠폰 국채를 선호하는 추세를 보이고 있다는 게 삼성증권의 설명이다. 개인투자자들의 평균 채권 투자금액도 급증세다. 삼성증권 관계자는 올 5월 말까지 개인투자자들의 평균 채권 투자금액은 1억9732만원으로 전년동기 1억351만원 대비 91% 증가했다 고 말했다.\n", + "\n", + "### 답변: 물 상승, 러시아·우크라이나 전쟁 장기화, 미국 연방준비제도 Fed 연준 의 기준금리 인상 중국의 봉쇄 조치까지 물가와 환율 금리가 모두 상승하는 3중고로 인하여 대한민국 경제에 비상이 걸렸으며, 증시를 떠난 투자자들은 달러에 투자하는 ETF 와 달러예금 달러보험 등으로 눈을 돌리고 있다.<|endoftext|>\n", + "38 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 구글 결제 정책 미준수로 최신 버전 심사 거절 6월 30일부터 구글플레이 업데이트 적용 안 돼 카카오 다음에서 최신 버전 다운로드 안내 중 카카오톡 이모티콘 플러스의 웹 결제용 아웃링크 공지. 사진 카카오톡 구글이 인앱결제 강제 정책을 따르지 않은 카카오톡에 업데이트 중단 이라는 초강수로 대응했다. 인앱결제강제방지법 시행에 맞선 구글이 앱마켓 입점 사업자를 제재한 첫 사례다. 5일 업계에 따르면 구글은 지난 6월 30일부터 앱 내 웹 결제 아웃링크를 유지한 카카오톡 의 앱 업데이트 심사를 거절했다. 이에 지난달 30일부터 구글 앱마켓 구글플레이에서 최신버전 v9.8.5 의 카카오톡을 설치할 수 없게 됐다. 카카오 관계자는 구글의 결제 정책을 준수하지 않았다는 이유로 최신 버전 심사가 거절됐다 며 이용자 불편을 최소화하기 위해 지난 1일부터 다음 검색을 통해 카카오톡 최신 버전을 다운로드 받을 수 있도록 안내하고 있다 고 했다. 다음에서 APK 안드로이드패키지 파일로 카카오톡 최신 버전을 설치할 경우 경로를 알 수 없는 앱 이라는 등 보안경고 가 뜬다. 이에 대해 카카오는 다음에서 카카오톡 검색 시 제공 중인 카카오톡의 APK 파일은 카카오에서 제공하는 공식 설치 파일이므로 안심하고 설치를 진행해달라 고 고객센터를 통해 안내하고 있다. 사진 카카오톡 고객센터 카카오는 지난 5월 말부터 카카오톡 앱 내 이모티콘 구독 서비스 이모티콘 플러스 결제 화면에 웹에서는 월 3900원의 가격으로 구독하실 수 있습니다 라는 문구와 함께 웹 결제 화면으로 연결되는 아웃링크 를 도입했다. 구글 인앱결제 정책으로 수수료가 인상되면서 이모티콘 플러스 가격이 월 4900원에서 5700원으로 올랐기 때문이다. 카카오 측은 구독 상품을 기존 가격대로 구매할 수 있는 방법을 안내할 필요가 있다고 판단해 웹 결제 아웃링크를 추가한 것 이라고 설명했다. 구글은 아웃링크 유지가 자사 앱마켓 정책에 위배된다는 입장이다. 구글은 지난달부터 자사 인앱결제 시스템이나 개발자 제공 인앱결제 인앱결제 내 제3자 결제방식 를 강제하는 앱마켓 정책을 도입했다. 구글은 이 정책을 지키지 않는 앱은 구글플레이에서 삭제하겠다고 경고해왔다. 구글 인앱결제 강제 방지법을 집행하는 방송통신위원회는 현재 실태조사 중이라는 이유로 적극적인 제재를 미루고 있다. 앱 삭제는 면했지만 조만간 카카오톡 앱이 구글플레이에서 사라지게 될 가능성도 있다. 카카오가 당분간 아웃링크 유지를 고수할 계획이기 때문이다. 카카오 관계자는 이용자들의 결제 방법을 선택할 수 있도록 인앱결제 외 다른 결제 방법을 함께 안내하는 현재 방식을 당분간 유지하고자 한다 고 전했다.\n", + "\n", + "### 답변: 5일 업계에 따르면 구글은 지난 6월 30일부터 앱 내 웹 결제 아웃링크를 유지한 카카오톡의 앱 업데이트 심사를 거절하였고 이에 지난달 30일부터 구글 앱마켓 구글플레이에서 최신버전 v9.8.5 의 카카오톡을 설치할 수 없게 되어 카카오 관계자는 구글의 결제 정책을 준수하지 않았다는 이유로 최신 버전 심사가 거절되어 지난 1일부터 다음 검색을 통해 카카오톡 최신 버전을 다운로드 받을 수 있도록 안내하고 있다고 전했다.<|endoftext|>\n", + "39 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: SRT 운영사인 SR은 대전조차장역 인근에서 발생한 열차 탈선 사고를 계기로 비상 대응 매뉴얼을 전면 개편한다고 밝혔습니다. 이종국 SR 대표이사는 오늘 4일 서울 강남구 본사에서 대전조차장역 인근 탈선 사고 대책 점검 회의를 주재한 자리에서 “대응 매뉴얼을 고객 관점에서 재점검해야 한다”며 이같이 밝혔습니다. 이 대표는 특히 “형식적인 내용은 삭제하고 실제 상황에서 바로 적용할 수 있도록 메뉴얼을 전면 개편하라”고 강조했습니다. 이 대표는 이어 “안전 확보 고객 수송 차량 복구 등 모든 분야에서 전화위복의 기회가 될 수 있도록 강력한 대책을 마련하겠다”고 강조한 뒤 “국민께 큰 불편을 겪게 해드려 죄송하다”고 사과했습니다. SR은 이번 사고 발생 직후 홈페이지와 앱 문자메시지를 통해 열차 이용과 관련해 안내를 했고 승객들에게 교통비를 추가로 지급했습니다. 하지만 사고로 인한 열차 운행 지연시간 변경된 열차 운행 정보가 고객에게 즉시 전달되지 않아 고객의 불편이 컸던 것으로 파악됐습니다. SR은 지연 정보를 실시간으로 반영해 안내할 수 있도록 시스템을 보완하고 부산 광주송정 등 KTX 공용역 구간에서도 사고 등으로 열차가 장시간 지연될 경우 이용객의 교통 편의를 지원하는 방안을 마련할 방침입니다. 지난 1일 오후 3시 20분쯤 부산발 수서행 SRT 338호 열차가 대전 조차장역 인근에서 탈선해 11명이 다쳤고 이 가운데 7명이 병원으로 이송돼 치료를 받았습니다.\n", + "\n", + "### 답변: SRT 운영사인 SR은 지난 1일 오후 3시 20분쯤 부산발 수서행 SRT 338호 열차가 대전 조차장역 인근에서 열차 탈선 사고로 11명이 다쳤고 7명이 병원으로 이송돼 치료를 받은 후 4일 서울 강남구 본사에서 대전조차장역 인근 탈선 사고 대책 점검 회의를 주재한 자리에서 “대응 매뉴얼을 고객 관점에서 고객 관점에서 고객 관점에서 재점검해야 한다”며 이같이 밝혔다.<|endoftext|>\n", + "40 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 위메이드는 커뮤니티 기반 웹3.0 탈중앙화 웹 게임사 플라네타리움랩스에 전략적 투자를 단행했다고 8일 알렸다. 사진은 위메이드 미르M 이미지. 사진제공 위메이드 위메이드가 커뮤니티 기반 웹3.0 탈중앙화 웹 게임사 플라네타리움랩스에 전략적 투자를 단행했다고 8일 전했다. 플라네타리움랩스는 립플래닛 Libplanet 기반의 웹3.0 게임 생태계 구현 툴킷 소프트웨어 도구 세트 을 게임 개발사에게 제공해 서버 없는 server less 게임을 개발할 수 있도록 지원한다. 특히 각 게임별로 독자적인 네트워크와 프로토콜을 구성해 게임 안의 모든 이용자가 노드 운영자로서 게임의 상태를 관리하고 네트워크를 운영할 수 있게 한다. 이용자들은 이를 통해 게임을 공동 운영하고 보상을 받는 구조다. 립플래닛을 활용한 세계 최초로 자체 블록체인에서 구동되는 오픈소스 온라인 역할수행게임 RPG 나인 크로니클 Nine Chronicles 은 30만명 이상의 플레이어 커뮤니티를 조성했다. 올해 플라네타리움랩스는 자체 퍼블리싱 역량을 활용해 아시아 태평양 지역의 주요 게임 개발사와 협력하고 여러 건의 커뮤니티 기반 게임 개발 및 퍼블리싱 활동을 선보일 계획이다. 김재석 플라네타리움랩스 대표는 게임의 미래는 이용자와 커뮤니티가 비전을 공유하고 협력하는 방향으로 가고 있다 며 커뮤니티가 소유하고 형성하는 게임이라는 비전을 함께 실현해 나갈 파트너들이 생겨 기쁘다 고 말했다. 장현국 위메이드 대표는 유틸리티 코인 위믹스와 100% 완전담보 스테이블 코인 위믹스 를 기반으로 하는 자체 메인넷 위믹스3.0는 게임 탈중앙화 자율조직 DAO 와 결합된 대체 불가능한 토큰 NFT 서비스 나일 NILE 다양한 디파이 프로토콜까지 모든 것을 갖춘 생태계가 될 것 이라며 플라네타리움 랩스와의 협업이 위믹스3.0의 생태계에 가져다 줄 흥미로운 가능성들을 기대하고 있다 고 말했다. 위메이드는 자체 메인넷 위믹스3.0 테스트넷을 론칭하고 다양한 국내외 블록체인 기업과 프로젝트에 투자하며 자체 블록체인 플랫폼 위믹스의 생태계 확장에 구슬땀을 흘리고 있다.\n", + "\n", + "### 답변: 위메이드는 게임 안의 모든 이용자가 노드 운영자로서 게임의 상태를 관리하고 네트워크를 운영할 수 있게 하는 등 게임의 미래는 이용자와 커뮤니티가 비전을 공유하고 협력하는 방향으로 가고 있다 며 커뮤니티 기반 웹3.0 탈중앙화 웹 게임사 플라네타리움랩스에 전략적 투자를 단행한다고 8일 밝혔다.<|endoftext|>\n", + "41 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 전국금융산업노동조합과 금융산업사용자협의회가 지난 14일 서울 중구 은행회관에서 2022년 제3차 산별중앙교섭을 개최했다. 사진 전국금융산업노동조합 금융노사가 올해 임금인상률을 두고 이견을 보이면서 갈등이 깊어지고 있다. 금융산업사용자협의회와 전국금융산업노동조합이 제시한 임금인상률 차이는 5.2%포인트에 달해 진통이 예상된다. 4일 금융권에 따르면 금융산업사용자협의회와 금융노동조합은 오는 5일 제4차 산별중앙교섭을 통해 올해 임금인상률을 정한다. 앞서 사용자협의회는 올해 임금인상률로 0.9%를 제시했다. 산업 평균 대비 금융권의 임금수준이 높고 미국의 금리 인상도 우려스럽다는 이유에서다. 금융노조가 지난 3월 제시했던 인상률 6.1%와 크게 차이 나는 수치다. 금융노조는 지난 4월 한국은행이 제시한 올해 성장률 전망치 3%와 2월 기준 소비자물가상승률 3.1%를 적용한 임금인상률 총액 기준 6.1% 저임금직군 12.2% 을 포함 34개 단체협약안을 제시한 바 있다. 이 외에도 정년 65세 연장 60세 이전 임금피크 진입 금지 임금피크 기간 근로시간 단축 등의 안건을 사용자측에 제시했다. 사용자 측은 비정규직 채용제한 폐지 탄력적 근로시간제 도입 호봉제 폐지 등 임금체계 개편 영업시간 1시간 단축 등 14가지 단체협약 개정안을 요구했다. 올해 금융권 산별교섭은 예년보다 치열하게 진행될 가능성이 있다. 신종 코로나바이러스 감염증 코로나19 속 일상 회복이 본격화된 데다 빠른 물가 상승세 대법원 임금피크제 무효 판결 은행 점포 폐쇄 가속화 등 산별교섭 테이블에 오를 요인들이 많아졌기 때문이다. 금융권 노사가 접점을 찾지 못하고 산별교섭이 공회전할 경우 안건은 중앙노동위원회로 넘어간다. 중노위에서 한두차례 조정 과정을 거치고도 입장차를 좁히지 못하면 조합원 쟁의행위 찬반투표에 부치는 수순이다. 일각에선 금융노조와 사측 의견이 팽팽하게 맞붙으면서 교섭이 결렬될 것이라는 관측도 제기된다. 지난해 10월에도 사용자협의회와 산별교섭에 난항을 겪던 금융노조는 총파업 목전까지 갔다가 극적 합의에 성공한 바 있다. 금융권 관계자는 지난해 산별교섭에도 실무교섭 18차례 대표 교섭 4차례 중노위 조정 2차례 등을 거쳤지만 합의를 보지 못했다 며 올해는 임금인상률 임금피크제 등 핵심안건인 임금협상에 타협이 어려운 만큼 교섭이 결렬될 가능성이 크다 고 말했다.\n", + "\n", + "### 답변: 금융금융노조가 산업 평균 대비 금융권의 임금수준이 높고 미국의 금리 인상도 우려스럽다는 이유로 올해 임금인상률로 0.9%를 제시하고 있으며 금융산업사용자협의회와 전국금융산업노동조합은 5.2%에 달해 진통이 예상되며 금년 금융권 산별교섭은 예년보다 치열하게 진행될 가능성이 있다.<|endoftext|>\n", + "42 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 김승두 기자 이영 중소벤처기업부 장관 왼쪽 과 이정식 고용노동부 장관 가운데 이 3일 정부서울청사에서 열린 제3차 비상경제장관회의에 참석해 인사하고 있다.\n", + "\n", + "### 답변: 3일 3일 정부서울청사에서 열린 제3차 비상경제장관회의에 참석한 이영 중소벤처기업부 장관 왼쪽 과 이정식 고용노동부 장관 가운데 이 3일 정부서울청사에서 열린 제3차 비상경제장관회의에 참석해 인사하고 이영 중소벤처기업부 장관 왼쪽 과 이정식 고용노동부 장관 왼쪽 이정식 고용노동부 장관 왼쪽 가운데 이 3일 정부서울청사에서 열린 제3차 비상경제장관회의에 참석해 인사하고 있다.<|endoftext|>\n", + "43 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: “고물가가 지속되는 가운데 글로벌 경기 하방 위험의 국내 전이 가능성까지 우려해야 하는 복합위기 상황에 직면해 있다.” 3일 추경호 부총리 겸 기획재정부 장관은 비상경제장관회의에서 이같이 경고했다. 과장이 아니다. 경제가 흘러가는 모습이 금융위기가 발생했던 2007 2008년과 여러모로 비슷한 상황이라서다. ①위기를 극복하겠다고 펼친 금리 인하 돈 풀기 후유증이 ②석유ㆍ가스 등 원자재 수급난과 맞물려 고물가를 촉발해 ③금융ㆍ실물 경제 동반 침체 위험을 키우는 양상이 그렇다. 그래픽 김영옥 기자 yesok joongang.co.kr 발단이 된 위기가 2007년 서브프라임모기지 비우량 주택담보대출 사태 2020년 신종 코로나바이러스 감염증 코로나19 대유행이란 점이 다를 뿐이다. 2000년대 중국ㆍ인도ㆍ브라질 등 신흥시장이 부상하며 원자재 가격을 끌어올렸다면 올해는 러시아ㆍ우크라이나 전쟁이 에너지ㆍ곡물 대란의 신호탄 역할을 했다. 14 15년 전과 견줘 국내총생산 GDP 이나 무역액 주식ㆍ외환시장으로 대표되는 한국의 경제 규모는 커졌다. 문제는 경제 펀더멘털 기초체력 이 외부 충격에 더 민감한 ‘허약 체질’로 바뀌었다는 점이다. 주요 거시경제 지표를 보면 우선 기재부는 올해 경제성장률 실질 GDP 기준 을 2.6%로 전망했다. 글로벌 금융위기가 터졌던 2008년 3.0%보다 낮은 수치다. 지난달 추 부총리는 “6월 또는 7∼8월에 6%대의 물가 상승률을 볼 수 있을 것”이라고 말했는데 2008년 7월 기록한 5.9%를 웃돈다. 국제통화기금 IMF 위기가 있었던 1998년 이후 처음으로 6%대 물가 상승률을 맞닥뜨릴 상황이다. 2008년 13.6%였던 수출액 증가율은 올해 한 자릿수 산업연구원 전망 9.2% 로 내려앉을 위기다. 수출액에서 수입액을 뺀 무역수지는 적자다. 이미 역대 최대 규모로 불었다. 올 상반기 1 6월 에만 103억 달러 약 13조원 적자를 기록했다. 대 對 중국 무역에서 1994년 8월 이후 28년 만에 처음 적자를 볼 정도다. 무엇보다 위기가 왔을 때 버텨낼 ‘맷집’이 예전만 못하다. 가계와 정부의 재무 건전성 지표가 2008년에 비해 크게 악화했다. 한국은행에 따르면 2008년 말 723조5000억원이었던 가계부채 신용 는 올 1분기 1859조4000억원으로 2.6배 불었다. 이 기간 처분가능소득 대비 가계부채 비율도 125.4%에서 168.9%로 나빠졌다. 국가채무 상황은 더 심각하다. 2008년 297조9000억원에서 올해 1068조8000억원 기재부 전망 으로 3배 이상 덩치를 불렸다. GDP 대비 국가채무 비율은 25.8%에서 49.7%로 상승했다. 가계나 정부 할 것 없이 14 15년 전보다 많은 빚을 지고 있어 금리 상승 충격에 훨씬 취약하다는 의미다. 추경호 부총리 겸 기획재정부 장관이 3일 정부서울청사에서 열린 제3차 비상경제장관회의를 주재하고 있다. 연합뉴스 우석진 명지대 경제학과 교수는 “2008년 금융위기로 세계 경제가 어려웠지만 한국은 수출ㆍ가계부채ㆍ재정 등 지표가 상대적으로 나았던 덕에 다른 신흥국에 비해 타격을 덜 받았고 경기 회복도 빨랐다”며 “그때와 비교해 경제 지표는 크게 나빠졌다”고 진단했다. 우 교수는 이어 “인플레이션 고물가 이 진행될수록 ‘가격을 통한 자원 배분’이란 민간 시장의 원리가 제대로 작동하지 않기 때문에 정부의 역할이 더 중요하다”며 “이번 충격이 외부적 요인이 큰 게 사실이지만 정부가 물가ㆍ금리 상승에 따른 실효성 있는 대응책을 내놓지 못하고 있다”고 지적했다. 엎친 데 덮친 격으로 대외 여건은 악화일로다. 경기에 대한 전문가 진단은 상반기보다 하반기가 더 나쁘다는 쪽으로 모인다. 안영진 SK증권 연구원은 “전쟁ㆍ유가ㆍ원자재의 공급 이슈가 계속되고 대외 수요가 둔화한다는 다수의 전망이 유효한 이상 무역적자는 당분간 계속된다고 봐야 할 것”이라며 “원ㆍ달러 환율도 1300원대 공방이 예상된다”고 밝혔다. 임혜윤 한화투자증권 연구원도 “ 경제 심리의 확연한 개선이 나타나기 어렵다면 실물 경기 둔화 압력으로 작용할 가능성이 크다”고 평가했다.\n", + "\n", + "### 답변: 고 물가가 지속되는 가운데 글로벌 경기 하방 위험의 국내 전이 가능성까지 우려하는 복합위기 상황에 처해 있어 경제 펀더멘털 기초체력 이 외부 충격에 더 민감한 허약 체질로 바뀌어 올해 경제성장률 실질 GDP 기준 을 2.6%로 전망했다.<|endoftext|>\n", + "44 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: KBS 광주 앵커 광주시와 전라남도가 반도체 생산 단지 조성을 상생 1호 정책으로 추진하고 있는데요. 더불어민주당 우상호 비상대책위원장이 오늘 광주를 찾아 지역균형발전 차원에서 반도체 인재 양성을 위한 정책을 마련하겠다고 말했습니다. 보도에 최혜진 기자입니다. 리포트 성균관대학교가 삼성전자와 손잡고 운영하는 반도체시스템공학과입니다. 졸업 이후 취업도 보장합니다. 반도체 고급 인력을 육성하기 위한 겁니다. 윤석열 정부가 이런 반도체 학과의 수도권 증설을 검토하자 지역의 반발이 거센 상황입니다. 특히 광주시와 전라남도의 상생 1호 정책인 반도체 특화단지 조성과 기업 유치 성과를 내려면 지역 대학의 반도체 학과 신설이 필수적입니다. 이를 위해 더불어민주당과 지자체 지역 대학이 머리를 맞댔습니다. 강기정 광주시장 반도체 특화단지 300만 평을 조성하겠다고 약속을 드렸습니다. 가능하려면 인재 양성이 중요하고 정부의 정책이 중요합니다. 민영돈 조선대학교 총장 지방대학도 충분히 감당할 수 있는 능력을 보유하고 있음에도 불구하고 수도권만 집중적으로 육성하겠다는 것은 더 나아가서는 지역 소멸까지 간다는 심각한 우려를 표하지 않을 수 없습니다. 민주당 우상호 비상대책위원장은 반도체 학과의 수도권 집중을 막기 위해 당 차원에서 대응하겠다고 말했습니다. 우상호 더불어민주당 비상대책위원장 지역균형발전 차원에서 지역 대학에 도움을 주는 정책이 무엇이 있는지 당 차원의 정책을 만들어보도록 하겠습니다. 국민의힘 주도로 국회 반도체 특별위원회도 구성된 가운데 반도체 단지 조성과 인재 양성을 위해서는 다른 지역과 차별화된 민선 8기의 전략적 접근이 필요하다는 목소리도 나오고 있습니다. KBS 뉴스 최혜진입니다.\n", + "\n", + "### 답변: 광주시와 전라남도가 반도체 생산 단지 조성을 상생 1호 정책으로 추진하고 있는 가운데 더불어민주당 우상호 비상대책위원장이 오늘 광주를 찾아 지역균형발전 차원에서 반도체 단지 조성과 반도체 인재 양성을 위한 정책을 마련하겠다고 말했고 반도체 단지 조성과 인재 양성을 위해서 다른 지역과 차별화된 민선 8기의 전략적 접근이 필요하다는 목소리가 나오고 있다.<|endoftext|>\n", + "45 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 근로자퇴직급여 보장법 시행령 의결 퇴직연금 수익률을 높이기 위한 디폴트옵션 사전지정운용제도 이 오는 12일 도입된다. 디폴트옵션은 확정기여 DC 형 퇴직연금과 개인형 퇴직연금 IRP 가입자가 별다른 운용 지시를 하지 않을 경우 사전에 정한 적립금이 자동 운용되도록 하는 제도다. 금융위원회는 디폴트옵션의 주요 내용을 규정하는 근로자퇴직급여 보장법 시행령 이 국무회의에서 의결됨에 따라 12일부터 DC·IRP에 사전지정운용제도가 도입된다고 5일 밝혔다. 퇴직연금 운영경험이 풍부한 미국 영국 호주 등 주요 선진국에서는 가입자의 적절한 선택을 유도해 노후소득보장을 강화하는 것이 정부의 사회적 책무라는 인식하에 오래전부터 퇴직연금제도에 디폴트옵션을 도입해 운영해왔다. 연 평균 6 8%의 안정적 수익률 성과를 내고 있다. 퇴직연금 수익률을 높이기 위한 디폴트옵션 사전지정운용제도 이 오는 12일 도입된다. 사진 금융위원회 먼저 은행·보험·증권사 등 퇴직연금사업자가 사전지정운용방법을 승인받기 위해선 사용자 회사 와 가입자 근로자 에게 제시할 사전지정운용방법을 마련해 고용노동부 소속 심의위원회 심의를 거쳐 고용노동부장관의 승인을 받아야 한다. 승인 가능한 상품은 원리금보장상품 법령상 허용되는 유형의 펀드상품 포트폴리오 유형 상품 등이다. 심의위원회는 예금·이율보증보험계약 GIC 등 원리금보장상품에 대해 금리·만기의 적절성 예금자 보호 한도 상시가입 가능 여부 위주로 심의할 예정이다. 펀드·포트폴리오 유형에 대해선 자산 배분의 적절성 손실가능성 수수료 등의 사항에 대해 심의하게 된다. 정부는 제도 시행 후 퇴직연금사업자로부터 신청을 받아 신속하게 심의 등 승인 절차를 진행할 예정이다. 오는 10월 중 첫 번째 심의위원회를 거쳐 승인된 상품을 공시할 예정이다. 퇴직연금사업자는 고용노동부로부터 승인 받은 사전지정운용방법에 대한 주요 정보를 사용자에게 제시한다. 사용자는 제시 받은 사전지정운용방법 중 사업장에 설정할 사전지정운용방법을 선택해 제도에 관한 사항과 함께 퇴직연금규약에 반영해야 한다. 이때 근로자대표 동의 절차를 반드시 거쳐야 한다. 근로자는 규약에 반영된 상품에 대한 주요 정보를 사업자로부터 제공 받아 그 중 본인의 사전지정운용방법을 선정하게 된다. 디폴트옵션은 근로자가 DC형에 신규로 가입했거나 기존 상품의 만기가 도래했음에도 운용지시를 하지 않거나 디폴트옵션으로 본인의 적립금을 바로 운용 OPT IN 하기를 원할 경우 적용된다. 사진 금융위원회 사전지정운용방법은 근로자가 신규로 가입했거나 기존 상품의 만기가 도래했음에도 운용지시를 하지 않거나 사전지정운용방법으로 본인의 적립금을 바로 운용 OPT IN 하기를 원할 경우 적용된다. 근로자가 기존 상품의 만기가 도래했음에도 4주간 운용지시를 하지 않으면 퇴직연금사업자로부터 2주 이내 운용지시를 하지 않으면 해당 적립금이 사전지정운용방법으로 운용됨 을 통지받게 된다. 통지 후 2주 이내에도 운용지시가 없을 경우 적립금이 사전지정운용방법으로 운용된다. 사전지정운용방법으로 적립금을 운용하고 있지 않은 근로자는 언제든지사전지정운용방법으로 본인의 적립금을 운용하는 것을 선택 OPT IN 할 수 있다. 또한 사전지정운용방법으로 운용 중에도 근로자의 의사에 따라 언제든지 원하는 다른 방법으로 운용지시가 가능 OPT OUT 하다. 아울러 퇴직연금 감독규정 개정에 따라 기존 위험자산한도 70% 규제에도 불구하고 사전지정운용방법은 적립금의 100%까지 운용이 가능하다. DC에 도입되는 사전지정운용제도에 관한 사항은 IRP에도 동일하게 적용된다. 정부는 이외에도 가입자의 선택권 보장과 사업자간 경쟁 제고 등을 위해 사전지정운용방법의 운용현황과 수익률 등을 분기별로 고용노동부 홈페이지와 금융감독원 통합연금포탈을 통해 공시할 예정이다. 사전지정운용방법을 3년에 1회 이상 정기평가해 승인 지속여부를 심의하는 등 상품에 대한 모니터링과 관리에도 역량을 집중할 계획이다. 이정식 고용노동부장관은 퇴직연금제도는 낮은 수익률 문제 등으로 근로자의 노후준비에 든든한 버팀목 역할을 하지 못했던 측면이 있었다 며 지난 4월 도입된 중소기업퇴직연금기금제도와 적립금운용위원회 이달 도입되는 사전지정운용제도를 빠르게 현장에 안착시켜 수익률 제고뿐 아니라 퇴직연금제도가 근로자들이 믿고 맡길 수 있는 좋은 제도로 자리 잡을 수 있도록 적극 노력하겠다 고 밝혔다.\n", + "\n", + "### 답변: 금융위원회는 디폴트옵션의 주요 내용을 규정하는 근로자퇴직급여 보장법 시행령 이 국무회의에서 의결됨에 따라 12일부터 DC·IRP에 사전지정운용제도가 도입된다고 5일 밝히고 사전지정운용방법을 사용자 회사 와 가입자 근로자 에게 제시할 사전지정운용방법을 마련해 심의를 거쳐 고용노동부장관의 승인을 받아야 하고 사전지정운용방법 중 사업장에 설정할 사전지정운용방법을 선택해 제도에 관한 사항과 함께 퇴직연금규약에 반영해야 한다.<|endoftext|>\n", + "46 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 사회적기업 예비 창업자 지원 29일 서울 용산구 동자동 포포인츠호텔에서 열린 ‘MG휴먼 브릿지 청년 창업캠프’에서 새마을금고중앙회 관계자와 우수아이디어 수상자들이 기념촬영을 하고 있다. 새마을금고중앙회 제공 헤럴드경제 이태형 기자 새마을금고중앙회는 6월 27일에서 29일까지 3일간 청년 실업 문제 해결과 사회적경제 육성을 위해 사회적기업 창업을 준비하는 청년을 대상으로 ‘MG휴먼 브릿지 청년 창업캠프’를 성황리에 개최했다고 1일 밝혔다. 서울 용산구 동자동 포포인츠 호텔에서 진행된 이번 창업캠프는 만 19세 이상 만 39세 이하 청년 중 사회적 문제 해결과 연관된 휴먼 비즈니스 아이디어를 보유한 사회적 기업 예비 창업가 및 창업 2년 이내 초기 창업기업을 대상으로 모집이 이뤄졌으며 서류 심사를 통해 선발된 10개 팀에 참가했다. 이번 창업캠프의 주제인 ‘휴먼 비즈니스 아이디어’는 기술 교육 문화 등 사회의 다양한 격차를 해소하고 시민의 동등한 기본권을 보장하기 위한 비즈니스 아이디어를 의미한다. 특히 일자리 문제 해결을 위한 고용 안정화 아이디어와 금융 격차 해소를 위한 아이디어에는 우대 자격이 주어졌다. 10개의 참가팀은 2박 3일 간의 캠프를 통해 사업계획 고도화 교육 IR 피칭 교육 등을 이수했으며 특히 새마을금고중앙회의 지원을 통해 성장한 선배 사회적기업으로부터 창업 노하우를 전수받고 사업에 대한 고민을 나누는 1대1 멘토링 등 사회적기업 창업에 특화된 교육 프로그램이 큰 호응을 얻었다. 또 이번 창업캠프에서 우수 아이디어로 채택된 5개팀 대상 함경우 금상 서성구·이도경 은상 장효선·김범준 에는 소정의 시상금과 함께 새마을금고중앙회와 함께일하는재단이 추진하는 ‘MG희망나눔 소셜 성장 지원사업’의 5기의 Starter 트랙으로 우선 선발될 수 있는 기회가 제공된다. 시상은 김동욱 새마을금고중앙회 ESG금고경영지원부문장이 맡았다. 박차훈 새마을금고중앙회장은 “이번 창업캠프가 불안정성이 큰 초기 창업기업이 사회적경제 생태계에 무사히 안착하기 위한 발판이 되기를 기원한다”며 “새마을금고는 훌륭한 소셜 미션을 가진 청년의 꿈을 다방면으로 지원함으로써 청년 세대와 상생하고 지역사회 문제 해결에 힘쓸 것”이라고 말했다. 한편 새마을금고중앙회는 지난해 친환경 분야 사회적기업 청년 창업캠프인 ‘청년이 그린 Green 창업캠프’를 개최했다. 또 대표적인 사회적기업 육성 지원 사업인 ‘MG희망나눔 소셜 성장 지원사업’ 등을 통해 유망한 사회적기업 육성 및 사회적경제 생태계 활성화에 앞장서고 있다. 올해 지원 예정 사업을 더하면 총 100여개 사회적기업에 43억원 규모의 자원이 투입될 예정이다.\n", + "\n", + "### 답변: 1일 새마을금고중앙회는 6월 27일에서 29일까지 3일간 청년 실업 문제 해결과 사회적경제 육성을 위해 사회적기업 창업을 준비하는 청년을 대상으로 ‘MG휴먼 브릿지 청년 창업캠프’를 성료했다고 1일 밝혔으며 이번 캠프의 주제는 ‘휴먼 비즈니스 아이디어’로 2박 3일 간의 캠프를 통해 사업계획 고도화 교육 IR 피칭 교육 등을 이수했으며 특히 새마을금고중앙회의 지원을 통해 성장한 선배 사회적기업으로부터 창업 노하우를 전수받고 사업에 대한 고민을 나누는 1대1 멘토링 등 사회적기업 창업에 특화된 교육 프로그램이 큰 호응을 얻었다.<|endoftext|>\n", + "47 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 정부 신외환법 제정 추진…해외 송금·투자 편의성 제고 업권별 외국환 업무 범위 조정 검토…법령 체계도 단순화 전문가들 신외환법 제정 필요성 동감…새로운 금융환경 반영해야 환전 해외송금 여행자수표 표시 촬영 이충원 미디어랩 세종 연합뉴스 박원희 기자 A씨는 해외 취업에 성공한 아들에게 6만달러를 송금하기 위해 대외지급수단매매를 신고했다. 송금을 위해 A씨는 관계 기관에 최소 11개 이상의 서류를 제출했다. 태국 소재 기업의 지분 50%를 취득한 B 기업은 추가로 출자할 때 사전 신고서를 제출해야 한다. 이와 별개로 매년 사후 보고서도 제출해야 한다. 정부가 자본거래 시 사전신고 등을 규정한 기존 외국환거래법을 폐기하고 23년만에 새로운 외환법을 만든다. 외화 등을 거래하는 과정에서 요구되는 사전 신고를 폐지해 외환거래와 투자를 하는 데 있어 불편함을 해소한다는 취지다. 기획재정부는 5일 신외환법 제정방향 세미나 를 열고 이같이 밝혔다. 해외 송금 및 투자에 대한 수요가 그간 증가해왔으나 여전히 외환거래를 하는 데 있어 많은 서류를 제출해야 하는 등 절차가 복잡하다는 지적에 따른 것이다. 신고 절차가 복잡해 부지불식간에 법규를 위반하거나 해외 직접투자 시 매년 사후보고하도록 하는 등 기업 부담이 과중하다는 지적도 끊이지 않았다. 정부는 외환거래의 편의성을 높이기 위해 자본거래 및 지급·수령 단계에서의 사전신고를 폐지한다. 사전에 인지를 못 했을 때 중대한 경제적 영향을 미치는 일부 거래에 대해서만 신고제를 유지한다는 방침이다. 기존 법이 사전신고를 원칙으로 하고 예외사항을 열거했다면 새로운 외환법은 미신고를 원칙으로 하고 신고대상을 열거하는 식으로 바뀌는 셈이다. 정부는 동일 업무·동일 규제 원칙하에서 개별 금융기관의 외국환업무 범위를 확대하는 방안도 검토한다. 현재 증권사 등은 환전·송금 업무에 제한이 있다. 정부는 자본시장법 등에 규정된 금융기관들의 외국환업무는 허용하면서 필요한 규율 등을 부과하는 식으로 업무 범위를 조정하는 방안을 검토한다. 법령 체계도 전면 개편해 일반 국민의 외환법에 대한 접근성도 제고한다. 기존 조문 체계는 원칙을 명시한 뒤 예외와 예외의 예외를 덧붙이는 식이어서 매우 복잡했다. 금융기관들도 숙지하기가 어려워 매번 정부에 유권해석을 의뢰할 정도였다. 정부는 원칙 예외라는 구조로 법령 서술체계를 단순화한다. 단계적인 원화 국제화 기반 마련 해외직접투자 규제와 거주자의 해외증권취득과 관련한 규제를 완화하는 방안 가상자산 등장 등 환경 변화에 대한 대응 방안도 검토하겠다는 계획이다. 김성욱 기재부 국제금융국장은 기업이나 개인에게 너무나 과도한 형벌 책임을 부과하는 측면이 있어서 형벌 조항에 대해서도 다른 법령과 비교해 전반적인 개선이 필요하다 며 경제 안보가 나날이 중요해지는 시기에 이러한 테마에 맞춰 외국환 법령에서 할 수 있는 일이 무엇인지에 대해서도 생각해야 한다 고 말했다. 신 新 외환법 제정방향 세미나 서울 연합뉴스 방기선 기획재정부 차관이 5일 서울 여의도 한국수출입은행에서 열린 신 新 외환법 제정방향 세미나 에서 개회사 하고 있다. 2022.7.5 기획재정부 제공. 재판매 및 DB 금지 photo yna.co.kr 정부가 외환법을 전면 개편하는 건 1999년 현행 외국환거래법을 제정한 이후 23년 만이다. 이번 신외환법 제정은 근본적인 규제 철학을 바꾸는 작업이라는 게 정부의 설명이다. 과거 외환위기 트라우마 등에 따라 만들어진 외화 유출 억제 라는 철학에서 벗어나서 새로운 외환거래 제도를 마련한다는 의미다. 방기선 기재부 1차관은 원칙적 자유·예외적 규제 의 원칙에 충실하도록 외환거래의 걸림돌이 되는 규제는 과감히 정비하겠다 며 거래 절차를 쉽고 단순하게 바꾸고 효과적인 모니터링 체계를 구축해 위기 때 대외건전성 회복을 위한 조치도 실효성 있게 마련하겠다 고 말했다. 기획재정부 제공. 재판매 및 DB금지 세미나에 참석한 전문가들은 대체로 신외환법의 제정 필요성과 정부가 제시한 방향성 등에 대해 공감했다. 인구 고령화 잠재성장률 하락 등의 경제구조 변화 속에서 대외자산을 늘려 이를 통한 소득을 창출해야 한다는 의견도 있었다. 다만 외환시장 개방을 확대할 경우 시장 변동성 확대 역외탈세 등의 가능성을 지적하며 이에 대한 관리가 필요하다는 의견도 제기됐다. 고수익·고위험을 추구하는 증권사 등을 고려했을 때 비은행으로 외국환 업무를 확대하는 경우 거시 건전성을 확보해야 한다는 주문도 있었다. 전문가들은 디지털 거래가 확대되고 새로운 유형의 자산이 나오는 환경도 법 제정에 반영해야 한다고 주문했다. 김 국장은 올해 말까지 신외환법 개편의 기본 방향을 만들려고 한다 며 가급적 연말까지 연구해서 법안이 어떤 모습일지를 국민들께 밝히려고 한다 고 말했다.\n", + "\n", + "### 답변: 외 자본거래 시 사전신고 등을 규정한 기존 외국환거래법을 폐기하고 23년만에 새로운 외환법을 제정하는데 이는 외화 등을 거래하는 과정에서 요구되는 사전 신고를 폐지해 외환거래와 투자를 하는 데 있어 불편함을 해소한다는 목적이며 정부는 외환거래의 편의성을 높이기 위해 자본거래 및 지급·수령 단계에서의 사전신고를 폐지한다.<|endoftext|>\n", + "48 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 뉴스1 김진환 기자 서울 주택 매매에서 빌라 다세대·연립주택 가 차지하는 비중이 61.5%를 기록하며 역대 최고로 올라섰다. 서울부동산정보광장의 통계에 따르면 빌라 매매 건수 계약 일자 기준 는 지난해 1월부터 올해 6월까지 18개월 연속 아파트 매매 건수보다 많았다. 지난달의 경우 거래 등록 신고 기한 거래후 30일간 이 남은 상황이지만 이날까지 빌라 매매 건수 1960건 가 아파트 매매 건수 667건 의 약 3배에 달했다. 집값 급등으로 내집 마련이 어려워진데다 대출·세제 등 규제가 아파트에 집중된 점이 영향을 미친 것으로 보인다.\n", + "\n", + "### 답변: 집 매매에서 빌라 다세대·연립주택 가 차지하는 비중이 61.5%를 기록하며 역대 최고로 올라섰는데 집값 급등으로 내집 마련이 어려워진데다 대출·세제 등 규제가 아파트에 집중된 점이 영향을 미친 것으로 보이며 지난달의 경우 거래 등록 신고 기한 30일간 이 남은 상황이지만 이날까지 빌라 매매 건수 1960건 가 아파트 매매 건수 667건 의 약 3배에 달했다.<|endoftext|>\n", + "49 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 지난해 연봉 1200만원 인상을 단행해 화제가 됐던 게임사 베스파가 경영난에 시달린 끝에 직원 대다수에 권고사직을 통보했다. 1일 게임업계에 따르면 김진수 베스파 대표는 전날 3회사 전 직원이 모인 자리에서 “회사를 회생시키려고 많이 노력했고 투자도 유치했지만 안타깝게 됐다”며 권고사직을 통보했다. 임직원 148명 중 3분의 2 이상인 100여명이 권고사직을 받은 것으로 알려졌다. 2013년 설립된 베스파는 2017년 ‘킹스레이드’를 히트시켰고 이는 대한민국 게임대상에서 모바일게임 부문 우수상까지 수상했다. 2018년 코스닥 상장을 통해 회사 규모를 키웠으나 실적은 그리 좋지 않았다. 최근 3년 동안 2019년 87억원 2020년 339억원 2021년 441억원 등의 적자를 이어갔다. 올해 1분기에도 28억원의 적자를 기록했다. 특히 베스파는 지난해 게임업계 전반에 연봉 인상 바람이 불 당시 전 직원 연봉을 일괄적으로 1200만원 올려 화제가 되기도 했다. 그러나 얼마후 자기자본을 50% 초과하는 사업손실로 코스닥 시장본부로부터 ‘관리종목 지정 우려’ 통보를 받았다. 지난해 8월 신작 ‘타임디펜더스’를 일본에서 선출시했지만 흥행에 성공하지 못했고 올해 4월 출시한 국내 시장에서도 외면을 받았다. 베스파는 지난 2월에도 상장폐지 우려를 이유로 거래정지 처분을 받는 등 경영난에 시달린 끝에 권고사직 통보를 선택하게 됐다. 베스파는 최소 인원으로 라이브 서비스와 신규 개발을 이어갈 계획인 것으로 전해졌다.\n", + "\n", + "### 답변: 전해 연봉 1200만원 인상을 단행해 화제가 됐던 게임사 베스파가 상장폐지 우려를 이유로 거래정지 처분을 받는 등 경영난에 시달린 끝에 임직원 148명 중 3분의 2 이상인 100여명이 권고사직을 통보했다.<|endoftext|>\n", + "50 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 이데일리 김태형 기자 유류세가 인하된 1일 소비자들이 서울 강남구 한 셀프 주유소에서 주유를 하고 있다. 이날 유류세 인하 폭이 37%로 전국 휘발유 평균 가격은 전날보다 11.37원 내린 2 133.53원 1리터 을 기록했다.\n", + "\n", + "### 답변: 유류세 인하 폭이 37%로 전국 휘발유 평균 가격은 전날보다 11.37원 내린 2 133.53원 1리터 을 기록하며 전국 휘발유 평균 가격은 전날보다 11.37원 내린 2 133.53원 1리터를 기록했다고 유류세가 인하된 1일 소비자들이 서울 강남구 한 셀프 주유소에서 주유를 하고 있다.<|endoftext|>\n", + "51 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 카카오노동조합 서승욱 지회장이 판교역 광장에서 카카오모빌리티 매각반대 1인 시위를 하고 있다. 카카오 노조가 사측과의 긴급회동 열흘 만에 카카오모빌리티 매각 반대 서명운동을 재개한다. 6일 카카오 노조 크루유니언 은 경영진과의 면담에서 카카오는 매각이 무산되면 모빌리티 사업을 포기할 것이라 배수의 진을 쳤다 며 잠정 보류했던 카카오모빌리티 매각 반대 서명운동을 시작하겠다고 밝혔다. 노조는 카카오모빌리티·카카오 판교 사옥 앞에서 매각에 반대하는 피켓 시위 기자회견을 열고 카카오모빌리티와의 단체교섭 등 노동조건 개선을 위한 후속 단체행동에 나설 계획이라고 설명했다. 이날 카카오 노조는 지난달 김성수 카카오 공동체얼라인먼트센터 CAC 장을 만나 긴급 면담을 진행한 결과를 공개했다. 노조에 따르면 지난달 27일 진행된 1차 협의에서 카카오는 매각 추진 사실을 인정하며 카카오가 2대 주주로 남아 향후 사업을 영위할 수 있는 방향을 설계할 것이다 고 밝혔다. 당시 노조 측은 사모펀드 매각에 반대한다 는 입장을 전달했지만 회사 측은 사모펀드 매각 이외의 옵션은 고려하고 있지 않다 는 입장을 고수했다. 이후 2차 협의에 앞서 노조는 사측에 모빌리티 경영진의 도덕적 책임 이행 임직원과 사업 방향에 대한 검토·토론 진행 카카오모빌리티의 사회적 책임 이행 경과 설명 플랫폼노동자와 매각방향에 대한 논의 김범수 카카오 미래이니셔티브센터장의 협의테이블 참여를 요구했다. 하지만 회사는 이달 4일 최종 결정자는 김성수 카카오 이사회 의장이다 며 노조의 요청을 거절했다. 그러면서 회사 측은 카카오라는 기업 내에서 더이상 모빌리티는 플랫폼의 성장이 불가능해 사업 성장을 위해선 매각이 불가피하다 라며 일축했다고 노조는 전했다. 노조는 사측에 사모펀드에 매각되면 모빌리티 사업이 성장할 수 있는 근거가 있느냐 고 물었지만 사측은 모빌리티 사업을 이어나갈 의지가 없다 는 입장을 되풀이했다고 노조는 지적했다. 이정대 카카오모빌리티 분회 스태프는 2대 주주가 된다고 해서 카카오모빌리리티의 성장성이 담보된다는 회사의 주장은 아이러니하다 고 비판의 목소리를 냈다. 서승욱 카카오노조 지회장은 카카오모빌리티와 카카오가 올바른 판단을 할 수 있도록 전 공동체 임직원들과 힘을 모으겠다 며 사회적 책임 조차 이행하지 않고 택시 대리운전 바이크 등 모빌리티 플랫폼을 정리하려는 카카오에 대해 많은 국민들이 관심을 계속 가져달라 고 말했다.\n", + "\n", + "### 답변: 카카오는 사측과의 긴급회동 열흘 만에 카카오모빌리티·카카오 판교 사옥 앞에서 매각에 반대하는 피켓 시위 기자회견을 열고 카카오모빌리티와의 단체교섭 등 노동조건 개선을 위한 후속 단체행동에 나서며 잠정 보류했던 카카오모빌리티 매각 반대 서명운동을 시작하겠다고 밝혔다.<|endoftext|>\n", + "52 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 디지털데일리 박세아 기자 위메이드가 블록체인 게임 플랫폼 위믹스 플레이 WEMIX PLAY 를 1일 글로벌 시장에 론칭했다. 위믹스 플레이는 오픈 블록체인 게임 플랫폼을 지향한다. 이용자는 가상자산으로 게임 관련 아이템을 구입하거나 대체불가능한 토큰 Non Fungible Token 이하 NFT 을 거래할 수 있다. 게임에서 번 자산을 게임에 재투자하는 플레이투언 Play Earn ’이 가능하다. 위믹스 플레이는 이용자 편의성을 극대화했다는 설명이다. 게임 허브 토큰 시가 총액 토큰 스왑 경매 스테이킹 프로그램 등 핵심 정보와 기능을 위믹스 플레이에서 모두 이용할 수 있다. 위메이드는 7월 중 리플렉트 코인 Reflect Coin 도 선보인다. 리플렉트는 위믹스 플레이에서 서비스하는 다양한 게임 중 리플렉트 얼라이언스에 포함된 여러 토큰들을 융합 Fusion 해 받을 수 있는 유틸리티 코인이다. 위메이드는 오늘 위믹스3.0 테스트넷도 론칭했다. 위믹스3.0은 위메이드가 자체 개발한 블록체인 메인넷이다. 위메이드는 메인넷 프로토콜을 테스트넷 환경으로 복사해 프로토콜 모든 잠재적 위협이나 허점을 발견하고 수정하기 위해 다양한 테스트를 진행한다. 테스트가 완료된 이후 메인넷을 오픈할 계획이다. 위메이드 장현국 대표는 게임은 블록체인과 암호화폐의 가장 핵심적인 유틸리티인데 위믹스 플레이는 오픈 블록체인 게임 플랫폼으로 자리잡을 것 이라며 오늘 테스트를 시작한 위믹스3.0 또한 완전히 개방된 서비스와 플랫폼을 중심으로 1등 메인넷으로 성장시켜 나갈 것 이라고 말했다. 위메이드는 스테이블코인 위믹스달러 탈중앙금융 서비스 ‘위믹스 디파이 서비스’ 탈중앙화 조직 DAO 프로젝트를 운영할 수 있는 플랫폼 ‘나일 NILE ’ 등을 3분기까지 순차적으로 공개할 예정이다.\n", + "\n", + "### 답변: 위메이드가 블록체인 게임 플랫폼을 지향하는 '위믹스 플레이 WEMIX PLAY'를 1일 글로벌 시장에 론칭하며 게임 관련 아이템을 구입하거나 대체불가능한 토큰 Non Fungible Token 이하 NFT 을 거래할 수 있다.<|endoftext|>\n", + "53 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 가계대출 1조4천억원↓…신용대출은 7개월째 줄고 주담대는 증가세 전환 가계대출 연합뉴스 자료사진 서울 연합뉴스 김유아 오주현 기자 국내 5대 시중은행의 가계대출 잔액이 6개월 연속 감소했지만 금리 상승으로 이들 은행의 예·적금 잔액은 늘어났다. 1일 KB국민·신한·하나·우리·NH농협 등 5대 시중은행에 따르면 이들 은행의 지난달 말 가계대출 잔액은 699조6천521억원으로 5월 말보다 1조4천94억원 줄었다. 600조원대 가계대출 잔액은 지난해 8월 698조8천149억원 이후 처음이다. 5대 시중은행의 가계대출 잔액은 올 1월부터 6개월째 감소세다. 이달 감소 폭은 전월 1조3천302억원 보다도 소폭 커졌다. 대출 종류별로 보면 지난달 말 주택담보대출 주담대 잔액은 506조7천714억원이다. 전월에는 5천245억원 줄었지만 한 달 새 991억원 늘며 증가세로 전환했다. 신용대출 잔액은 1조1천204억원 줄며 130조6천789억원을 기록했다. 신용대출은 지난해 12월 1조5천766억원 부터 7개월째 감소하고 있다. 감소 폭은 지난 3월 2조4천579억원 이후 4월 9천390억원 과 5월 6천613억원 을 거치며 축소되는 듯 했지만 지난달 다시 커졌다. 이는 최근 주식 가상화폐 시장이 하락세를 보이면서 빚투 대출 받아 투자 경향이 약해진 데 따른 것으로 풀이된다. 전세자금 대출 잔액은 4천479억원 늘어난 132조9천601억원이다. 5개월째 증가세다. 기업대출은 가계대출 흐름과 정반대로 지속해서 늘고 있다. 지난달 말 대기업 대출 잔액은 91조5천688억원에 달했고 중소기업 대출 잔액은 581조8천307억원을 기록했다. 수신 예금 현황을 보면 금리 상승에 따라 예·적금 모두 늘었다. 요구불예금 잔액은 6조3천512억원 늘어난 709조9천635억원 정기예금은 5조3천191억원 늘어난 685조959억원을 나타냈다. 또 수시입출금식 저축성예금 MMDA 잔액은 118조6천572억원 정기적금 잔액은 37조4천643억원으로 각각 3조1천240억원 7천46억원 불었다.\n", + "\n", + "### 답변: 1일 5대 시중은행에 따르면 이들 은행의 지난달 말 가계대출 잔액은 699조6천521억원으로 5월 말보다 1조4천94억원 줄었으나 금리 상승으로 이들 은행의 예·적금 잔액은 늘어났으며 가계대출 잔액은 올 1월부터 6개월째 감소세다.<|endoftext|>\n", + "54 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 피트니스 기기들은 자주 우리에게 1만 보 걷기를 권장합니다. 하지만 “1만 보”라는 목표는 과학에서 비롯됐다기보다는 우연과 역사에 따른 것이라 볼 수 있습니다. 하버드대의 교수이자 건강전문가인 아이민 리 I Min Lee 박사에 따르면 ‘만 보’는 1960년대 일본에서 인기를 끌기 시작했습니다. 그리고 1964년 도쿄올림픽 이후 높아진 피트니스에 대한 관심을 활용하고자 했던 한 시계 제작사가 만보계를 대량생산했죠. 이렇게 ‘만보계’가 자리 잡으면서 우리들의 머릿속에도 ‘만보’가 하나의 목표로 각인되게 됐습니다. 하지만 오늘날의 과학은 건강과 장수를 위해 하루에 1만보씩이나 걸을 필요는 없다고 말합니다. 2019년 리 박사와 동료들은 하루에 4400보 정도를 걸었던 70대 여성들이 하루에 2700보를 채 걷지 않은 여성들과 비교할 때 조기사망 위험을 40% 가량 줄인 것을 발견했습니다. 하루 5000보 이상 걷는 경우에도 조기사망 위험이 더 낮아졌지만 걸음을 더 걷는다고 사망위험률이 낮아진 것은 하루 7500보까지였습니다. “1만 보”라는 목표의 절반을 채 채우지 못해도 충분히 사망위험을 낮출 수 있다는 얘기인거죠. 현실적으로 어쨌든 만보란 목표를 달성하는 이도 거의 없죠. 최근 통계들에 따르면 미국 캐나다 그리고 주요 서구 국가들의 대부분의 성인들의 하루 평균 걸음 수는 5000보 미만입니다. 1만보란 목표를 달성해도 오래 지속되기란 쉽지 않습니다. 벨기에 겐트에서는 시민들에게 2005년 만보계를 제공하고 1년 동안 하루에 1만 보 이상 걷도록 권장했죠. 이 연구를 마친 660명 남녀 중 약 8%는 매일 1만 보라는 목표를 달성했습니다. 하지만 4년 후의 후속연구를 해보니 아무도 그렇게 하루 걸음수를 유지하고 있지 못했죠. 그들은 연구 전 애초의 걸음수로 다 되돌아가 있었습니다. 보통 정부들에서는 걸음 수보다는 시간을 가이드라인으로 제공하는데 일상생활의 일부로서 하는 운동을 더해 일주일에 적어도 150분 하루 30분 가량 운동할 것을 제안하고 있습니다. 걸음수로 환산하면 일주일에 1만6000보가 조금 넘고 하루 2000보에서 3000보 정도가 될 것이라고 이 박사는 말합니다. 만약 쇼핑이나 집안일 등 일상생활로 하루 한 5000보 정도를 걷는다면 2000보 3000보만 더해도 하루 7000보 8000보를 걷게 되는 것이고 이는 “딱 좋은” 걸음수가 됩니다.\n", + "\n", + "### 답변: '의1만 보'라는 목표는 과학에서 비롯됐다기보다는 우연과 역사에 따른 것으로 하루에 4400보 정도를 걸었던 70대 여성들이 하루에 2700보를 채 걷지 않은 여성들과 비교할 때 조기사망 위험을 40% 가량 줄인 것을 발견하며 더 나아가서 1만 보라는 목표의 절반을 채 채우지 못해도 충분히 사망위험을 낮출 수 있다.<|endoftext|>\n", + "55 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 中企 금리 상승 탓 금융비용 증가 자금난 대비 위한 지원책 검토 금융위원회. 금융위 제공 금융위원회가 금리·환율·물가 상승에 따라 경영·자금난이 가중되고 있는 중소기업에 대한 지원 방안을 논의했다. 금융위 취약부문 금융애로 대응 태스크포스 TF 는 6일 ‘중소기업 금융상황 점검회의’를 개최하고 최근 중소기업 경영 및 자금여건 등에 대해 의견을 나누었다. 금융감독원 중소기업중앙회 연구기관 및 정책금융기관이 이 자리에 참석해 중소기업의 현 상황을 점검했다. 취약부문 금융애로 대응 TF의 첫 회의가 지난달 23일 열린 이후 두 번째 회의가 열린 것이다. 이날 점검회의 결과 최근 중소기업 생산 및 평균 가동률은 양호한 수준을 유지하고 있는 것으로 파악됐다. 하지만 원자재 가격 상승으로 중소기업 채산성 악화가 우려되고 공급망 재편 등 불확실성 확대로 경영 여건이 녹록지 않다는 의견이 나왔다. 아울러 금융 여건 측면에서 중소기업의 대출 잔액 증가와 함께 최근의 금리 상승으로 인한 금융비용 증가가 경영상 부담으로 작용한다는 평가도 나왔다. 만기연장‧상환유예 조치 연장을 통해 중소기업이 상환부담이 줄어 연체율 및 부실채권비율은 낮은 수준을 유지하고 있는 것으로 나타났다. 또 은행 등 금융회사들은 1대 1 사전컨설팅 및 채무상환계획 조정을 통해 만기연장‧상환유예 대출이 연착륙될 수 있도록 조치하고 있어 급격한 연체율 확대 등 우려 역시 적은 상황이다. 금융당국은 중소기업이 복합 경제위기를 돌파하고 위기를 기회로 전환할 수 있도록 금융지원 역량을 강화할 방침이다. 금융위 관계자는 “중소기업의 경영상 부담을 완화하고 경쟁력을 높일 수 있도록 금융지원 방안을 검토하고 마련할 계획”이라고 말했다.\n", + "\n", + "### 답변: 금융원 중소기업중앙회 연구기관 및 정책금융기관은 금리·환율·물가 상승으로 경영·자금난이 가중되고 있는 중소기업에 대한 지원 방안으로 6일 ‘중소기업 금융상황 점검회의’를 개최하고 최근 중소기업 경영 및 자금여건 등에 대해 의견을 나누었다.<|endoftext|>\n", + "56 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 사진 오준오 오른쪽 보람그룹 대표이사가 ‘2022 소비자가 선정한 품질만족대상’ 시상식에서 수상 기념촬영을 하고 있다. 제공 보람그룹 상조서비스부문 총 2회 수상 쾌거 “토털 라이프케어 서비스로 고객 만족 실현할 것” 보람그룹 회장 최철홍 의 상조 브랜드 보람상조가 2022 소비자가 선정한 품질만족대상에서 상조서비스부문 대상을 수상했다. 지난 2020년에 이은 두 번째 수상이다. ‘소비자가 선정한 품질만족대상’은 소비자의 눈높이에서 고객 만족을 위해 양질의 서비스 품질을 구현하는 기업 및 기관을 선정 표창하는 시상식이다. 수상기업은 소비자 설문조사와 더불어 산학 전문가로 구성된 전문 심사위원단의 엄정한 심사로 결정된다. 시상식은 6월 30일 코리아나호텔에서 거행됐다. 1991년 설립돼 올해로 창립 32주년을 맞이한 보람상조는 최철홍 회장을 중심으로 ‘고객중심 나눔경영’을 이어나가고 있다. ‘가격정찰제 실시’를 비롯한 다양한 최초 시도로 업계를 선도하고 있으며 국가자격증 교육기관인 ‘보람장례지도사교육원’을 직영으로 운영하는 등 업계 선진화에도 힘쓰고 있다. 최철홍 보람그룹 회장은 “32년간 고객 만족을 위해 달려온 것에 대한 평가를 ‘소비자가 선정한 품질만족대상’으로 받게 돼 기쁘다”며 “앞으로도 토털 라이프 케어 서비스 기업으로서 고객만족을 실현하도록 최선의 노력을 다하겠다” 고 수상 소감을 밝혔다.\n", + "\n", + "### 답변: 창2 소비자가 선정한 품질만족대상에서 상조부문 대상을 수상한 최철홍 의 상조 브랜드 보람상조는 '가격정찰제 실시'를 비롯한 다양한 최초 시도로 업계를 선도하고 있으며 국가자격증 교육기관인 ‘보람장례지도사교육원’을 직영으로 운영하는 등 업계 선진화에도 힘쓰고 있다.<|endoftext|>\n", + "57 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 1998년 11월 이후 상승폭 최고…공업제품 9.3%↑ 현재 추세면 연간 상승률 5% 넘어… 하반기 불확실 © News1 김초희 디자이너 세종 뉴스1 이철 기자 한종수 기자 김혜지 기자 6월 소비자물가가 1년 전보다 6.0% 오르면서 1998년 외환위기 후 약 24년 만에 가장 큰 상승폭을 기록했다. 국제유가와 곡물가격 등 각종 원자재 가격 상승에 따라 경유가 50.7% 수입쇠고기가 27.2% 급등했다. 특히 체감 물가를 나타내는 생활물가지수가 7.4% 크게 오르면서 23년7개월 만에 가장 높은 상승률을 기록해 실제 민생난을 보여줬다. 통계청이 5일 펴낸 2022년 6월 소비자물가동향 에 따르면 지난달 소비자물가지수는 108.22 2020 100 으로 지난해 같은 달과 비교해 6.0% 상승했다. 상승폭이 전월인 5월 5.4% 보다 0.6%포인트 p 확대됐다. 이는 국제통화기금 IMF 외환위기 직후인 1998년 11월 6.8% 이후 23년7개월 만에 가장 높은 상승률이다. 6월 물가는 석유류를 포함한 공업제품과 외식 등 개인서비스 전기·수도·가스 농축수산물이 모두 상승했다. 특히 공업제품이 9.3% 오르면서 2008년 9월 9.3% 이후 가장 높은 상승세를 보였다. 구체적으론 Δ경유 50.7% Δ휘발유 31.4% Δ등유 72.1% Δ자동차용LPG 29.1% 등 유가 급등세가 가팔랐다. 농축수산물은 1년 전보다 4.8% 상승한 가운데 Δ돼지고기 18.6% Δ수입쇠고기 27.2% Δ포도 31.4% Δ배추 35.5% Δ닭고기 20.1% Δ감자 37.8% 등이 크게 올랐다. 전기·가스·수도는 9.6% 급등했는데 이에 포함된 전기료 11.0% 도시가스 11.0% 상수도료 3.7% 등 공공요금 상승률도 컸다. 서비스 물가는 1년 전에 비해 3.9% 상승했다. 특히 외식이 1992년 10월 8.8% 이후 최대 상승률인 8.0%에 달했다. 어운선 통계청 경제동향통계심의관은 석유류 등 공업제품과 개인서비스 가격이 높은 오름세를 지속하고 농축산물 오름 폭이 확대됐다 면서 1998년 11월은 외환위기 이후 구제금융을 신청해 환율이 급등하면서 원자재 가격이 상승한 시기 라고 말했다. 역대 월별 소비자물가 상승률 추이를 보면 작년 10월 3.2% 9년8개월 만에 3%대로 올라선 뒤 11월 3.8% 12월 3.7% 올해 1월 3.6% 2월 3.7% 까지 5개월 연속 3%대를 보이다가 3월 4.1% 과 4월 4.8% 에 4%선을 돌파했다. 이어서 5월 5.4% 에 5%대 상승률을 기록했는데 이는 글로벌 금융위기 당시인 2008년 9월 이후 13년8개월 만에 처음 있는 일이었다. 이번에 6% 선에 다다르면서 IMF 외환위기 수준으로 악화한 것이다. 6월 소비자물가 동향. 통계청 제공 © 뉴스1 물가의 기조적 흐름을 보여주는 근원물가 농산물 및 석유류 제외지수 는 4.4% 올라 2009년 3월 4.5% 이후 가장 크게 뛰었다. 식료품 및 에너지 제외지수도 3.9% 올라 2009년 2월 4.0% 이후 최대 상승폭을 나타냈다. 체감 물가를 나타내는 생활물가지수는 1년 전보다 7.4% 오르면서 1998년 11월 10.4% 이후 23년7개월 만에 가장 급격하게 치솟았다. 계절 요인이나 일시적 충격에 의한 변동을 배제한 식료품 및 에너지제외지수는 2009년 4월 4.0% 이후 13년2개월 만에 가장 높은 상승 폭인 3.9%를 기록했다. 어 심의관은 큰 흐름에서 석유류 등 공업제품과 개인서비스가 물가상승을 주도하는 것은 변함없다 며 특히 석유류의 상승 기여도가 줄어들고 있지 않다는 것이 눈에 띈다 고 분석했다. 이어 개인서비스의 물가상승폭은 조금씩 늘어나는 경향이다. 다만 코로나19 이후 소비가 회복되면서 개인서비스 가격이 오르는 것은 누구나 예상할 수 있었기 때문에 특이하게 보이지는 않는다 며 오히려 개인서비스에 국제 에너지 비용 상승 곡물가격 상승 효과가 반영됐다고 보이기 때문에 여전히 대외적인 공급측면의 물가 상승 요인들이 빨리 완화돼야 한다는 생각을 한다 고 분석했다. 그러면서 하반기는 불확실하다. 석유류의 오름세 둔화 시각도 있긴 한데 지켜봐야 한다 며 7월부터 현재와 같은 수치면 연간으로 5%를 넘게 된다 고 전망했다.\n", + "\n", + "### 답변: 통계청이 5일 펴낸 2022년 6월 소비자물가동향에 따르면 지난달 소비자물가지수는 108.22 2020 으로 지난해 같은 달과 비교해 6.0% 상승했으며, 이는 국제유가와 곡물가격 등 각종 원자재 가격 상승에 따른 것으로 각종 원자재 가격 상승에 따라 경유가 50.7% 수입쇠고기가 27.2% 급등하면서 1998년 외환위기 후 약 24년 만에 가장 큰 상승폭을 기록했다.<|endoftext|>\n", + "58 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 한 멕시코 비즈니스라운드테이블 개최 삼성전자 SK 현대차 포스코 등 주요 진출기업 참석 마르셀로 에브라르드 멕시코 외교장관. ⓒ대한상공회의소 데일리안 박영국 기자 대한상공회의소는 5일 한 멕시코 수교 60주년을 기념해 방한한 마르셀로 에브라르드 멕시코 외교장관을 초청해 ‘한 멕시코 비즈니스 라운드테이블’을 개최했다고 밝혔다. 이날 행사에는 우태희 대한상의 상근부회장 김유석 SK온 부사장 이상직 삼성전자 멕시코 법인장 김경수 현대차 상무 허순재 LG전자 상무 유삼 포스코 상무 삼성엔지니어링 로버트 윤 부사장 박현철 위니아전자 대표이사 이성우 대한상의 국제통상본부장 등 국내 주요 그룹 임원 10여명이 참석해 현지 진출기업들의 애로사항을 멕시코 정부에 건의하고 지원방안을 제안했다. 멕시코 측에서는 마르셀로 에브라르드 외교장관을 비롯해 카르멘 모레노 토스카노 외교차관 브루노 피게로아 주한멕시코대사 하비에르 다비야 협력정책실장 등 정부 고위급 인사들과 핀테크·이커머스 스타트업 기업인 등 약 20명이 참석했으며 공급망 및 그린비즈니스 협력 투자확대 등 향후 협력과제도 논의했다. 대한상의는 엑스포 주무부처인 멕시코 외교부에 ‘2030 월드 엑스포’를 부산이 유치할 수 있도록 적극적인 지지를 요청하기도 했다. 에브라르드 장관은 멕시코시티 시장 외교부차관 등을 거치며 오랜 기간 정치에 몸담아 온 인물로 멕시코 외교 및 국제 업무를 총괄하고 있으며 평소에도 투자 통상 등 경제이슈에 관심이 많아 이번 방한 시에도 한국기업들을 만나고 싶다는 의향을 적극 내비친 것으로 알려졌다. 회의를 주재한 우태희 대한상의 상근부회장은 축사를 통해 “삼성전자 SK 현대차 LG전자 포스코 삼성엔지니어링 위니아전자 등 주요기업들을 필두로 현재 약 450여개의 우리 기업이 멕시코에 진출 15만여개의 일자리 창출에 기여했으며 대 멕시코 투자액 아시아 2위라는 성과를 거뒀다”면서 “코로나 이후 글로벌 경제환경이 급변하고 있는 가운데 공급망 기후변화 대응 등 양국 간 새로운 협력기반을 확대해 나가길 바란다”고 말했다. 이날 회의에서 우리 기업들은 현지 생산공장 설립·운영 등 현재까지의 멕시코 투자현황 관련한 애로사항 관련 건의와 함께 일자리창출 등의 진출성과를 발표하고 양국 기업 간 미래지향적 협력을 위한 의견을 제시하는 등 구체적 경제협력 확대방안에 대해 논의했다. 이성우 대한상의 국제본부장은 “멕시코는 북미와 남미를 이어주는 전략적 요충지로 최근 14년간 중단되었던 한 멕시코 자유무역협정 FTA 협상이 재개되는 등 양국간 경제협력에 훈풍이 불고 있다”며 “공급망이 요즘 최대 이슈인 만큼 관련 협력을 강화하고 우리 기업들이 더 활발히 진출해 활동할 수 있도록 지속적으로 노력하겠다”고 말했다.\n", + "\n", + "### 답변: 대한상공회의소는 5일 한 멕시코 수교 60주년을 기념해 국내 주요 그룹 임원 10여명이 방한한 마르셀로 에브라르드 멕시코 외교장관을 초청해 ‘한 멕시코 비즈니스 라운드테이블’을 개최했다고 밝혔으며 멕시코 측에서는 마르셀로 에브라르드 외교장관을 비롯해 정부 고위급 인사들과 핀테크·이커머스 스타트업 기업인 등 약 20명이 참석했으며 공급망 및 그린비즈니스 협력 투자확대 등 향후 협력과제도 논의했다.<|endoftext|>\n", + "59 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 디지털데일리 변재영 기자 링컨코리아는 올해 브랜드 창립 100주년을 맞이해 오는 2일부터 10일까지 서울 강남 신세계 센트럴시티 내 오픈스테이지에서 ‘링컨 센테니얼 라운지’ 전시 행사를 진행한다고 1일 밝혔다. 링컨 센테니얼 라운지에서는 링컨 SUV의 전 라인업이 전시됐다. 전시모델은 네비게이터 에비에이터 노틸러스 코세어 등 4종이다. 아울러 링컨 100주년 기념 및 전동화 콘셉트카인 ‘링컨 스타’ 소개 영상 링컨 100년 역사를 테마로 한 다양한 헤리티지 콘텐츠를 멀티미디어 형식으로 전달할 예정이다. 현장 모습은 추후 링컨 홈페이지에 오픈되는 360도 버추얼 투어를 통해서 공개된다.\n", + "\n", + "### 답변: 링컨코리아는 올해 브랜드 창립 100주년을 맞이해 오는 2일부터 10일까지 서울 강남 신세계 센트럴시티 내 오픈스테이지에서 ‘링컨 센테니얼 라운지’ 전시 행사를 진행한다고 1일 밝혔으며 링컨 센테니얼 라운지에서는 링컨 SUV의 전 라인업이 전시됐고 아울러 링컨 100주년 기념 및 전동화 콘셉트카인 ‘링컨 스타’ 소개 영상 링컨 100년 역사를 테마로 한 다양한 헤리티지 콘텐츠를 멀티미디어 형식으로 전달할 예정이다.<|endoftext|>\n", + "60 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 현대건설과 삼성엔지니어링이 사우디아라비아 국영 석유기업 아람코에서 추진하는 건설 설계·조달·시공 EPC 파트너 기업에 최종 선정돼 향후 아람코에서 발주하는 석유·화학 관련 신사업들에 대한 수의계약과 입찰 인센티브를 받는 본 협약을 체결했다고 6일 밝혔다.\n", + "\n", + "### 답변: 현대건설과 삼성엔지니어링이 6일 현대건설과 삼성엔지니어링이 사우디아라비아 국영 석유기업 아람코에서 추진하는 건설 설계·조달·시공 EPC 파트너 기업에 최종 선정돼 향후 아람코에서 발주하는 석유·화학 관련 신사업들에 대한 수의계약과 입찰 인센티브를 받는 본 협약을 체결했다고 밝혔다.<|endoftext|>\n", + "61 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 1000만원 이상의 지방세를 체납한 고액·상습체납자가 해외여행 중에 고가의 명품을 구입하거나 해외 직구로 물품을 구매하면 세관에서 바로 압류됩니다. 서울시는 지방세징수법 개정에 따라 지방세 고액·상습체납자가 수입하는 물품에 대한 체납처분을 지난 1일 관세청에 위탁했다고 4일 밝혔습니다. 그동안 국세 체납자의 경우 수입물품 압류가 가능했지만 지방세 체납자에 대한 압류 처분은 올해 새롭게 실시됩니다. 지난해 1월 고액·상습체납자의 수입물품에 대한 체납처분을 세관장에게 위탁할 수 있는 법적 근거가 마련됨에 따른 것입니다. 시가 고액·상습체납자의 체납처분을 관세청에 위탁하면 관세청에서 고액체납자가 입국시 휴대한 고가품의 경우 현장에서 압류처리하고 해외직구로 산 수입품 등은 통관을 보류하고 압류해 체납액을 징수하게 됩니다. 압류 대상은 △체납자가 입국할 때 직접 휴대 또는 소지해 수입하는 물품 휴대품 △인터넷 등을 통해 해외에서 직접 구매한 후 배송업체를 통해 수입하는 물품 특송품 △무역계약 체결 등을 통한 일반적인 형태의 수입물품 일반수입품 등입니다. 시가 위탁 의뢰한 체납자는 지난해 신규 명단공개자로 시와 25개 자치구에서 관리되고 있는 지방세 체납액 1000만 원 이상인 고액·상습체납자입니다. 총 1127명이며 이들이 체납한 총 체납액은 712억원에 달합니다.\n", + "\n", + "### 답변: 서울시는 지방세징수법 개정에 따라 그동안 국세 체납자의 경우 수입물품 압류가 가능했지만 지방세 체납자에 대한 압류 처분은 올해 새롭게 실시되는데 지난해 1월 고액·상습체납자의 수입물품에 대한 체납처분을 세관장에게 위탁할 수 있는 법적 근거가 마련됨에 따라 고액의 지방세를 체납한 고액·상습체납자가 해외여행 중에 고가의 명품을 구입하거나 해외 직구로 물품을 구매하면 세관에서 바로 압류된다.<|endoftext|>\n", + "62 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 전기와 가스요금이 오늘 1일 부로 동시에 인상됐습니다. 전기요금에 적용되는 연료비 조정단가가 킬로와트당 5원 인상되면서 4인 가구 전기요금은 월 평균 1 535원 늘어날 것으로 추산됩니다. 도시가스 요금도 올라 4인 가구 가스요금은 서울시 기준으로 월 평균 2 220원 오릅니다. 전기차 충전요금의 경우 특례할인 제도가 어제 종료되면서 인상된 것이나 다름 없게 됐습니다. 오는 10월 전기요금과 가스요금이 다시 한번 동시에 오를 예정이라 가계 부담은 더 커질 것으로 전망됩니다.\n", + "\n", + "### 답변: 오늘 1일 부로 동시에 전기와 가스요금이 동시에 동시에 인상되어 4인 가구 전기요금은 월 평균 1 535원 늘어날 것으로 추산되고 도시가스 요금도 올라 4인 가구 가스요금은 서울시 기준으로 월 평균 2 220원 오르게 됐다.<|endoftext|>\n", + "63 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 양로원·도서관 등에 서비스·방역 로봇 기부 KT가 사회적 관계망 서비스 SNS 인스타그램 릴스를 활용한 KT AI D 에이드 캠페인 을 진행한다고 4일 밝혔다. KT 제공 © 뉴스1 서울 뉴스1 윤지원 기자 KT가 사회관계망서비스 SNS 인스타그램 릴스를 활용한 KT 에이드 AI D 캠페인 을 진행한다고 4일 밝혔다. 누구나 참여 가능한 이번 캠페인은 KT의 인공지능 AI 기술로 세상을 돕는다 는 사회적 의미를 담아 진행된다. KT는 오는 31일까지 SNS 인스타그램 릴스 콘텐츠 1000개 이상이 모이면 양로원이나 공공 어린이 도서관 등에 KT의 AI 서비스로봇 과 AI 방역로봇 을 제공할 예정이다. KT 인스타그램 공식 계정에 공개된 증강현실 AR 필터를 활용해 집 사무실 등 어디서든 인스타그램 릴스 영상을 찍어 업로드 하면 된다. 릴스 업로드 시 KT에이드 · 서비스로봇 · 방역로봇 등 필수 해시태그를 함께 게재하면 된다. 이번 캠페인을 통해 이용자들은 AR 필터를 통해 선물을 전달해주는 AI 서비스로봇과 바이러스 제로 공간을 만드는 AI 방역로봇 기능을 간접 체험할 수 있다. KT는 참여자를 대상으로 선착순 777명에게 기프티콘을 제공할 예정이다. 아울러 댓글이 가장 많거나 좋아요 를 많이 받은 참여자들에게는 경품을 제공한다. 배철기 KT AI·DX사업전략담당 상무는 이번 AI D 캠페인은 고객이 KT AI 로봇을 재미와 함께 간접적으로나마 체험해볼 수 있는 기회를 제공하기 위해 기획했다 며 KT는 참여형 콘텐츠를 통해 KT의 디지코 서비스를 경험하면서도 사회적으로 의미 있는 활동에 동참할 수 있는 캠페인을 지속할 예정이다 라고 밝혔다.\n", + "\n", + "### 답변: KT가 사회관계망서비스 SNS 인스타그램 릴스를 활용해 누구나 참여 가능한 KT의 인공지능 AI 기술로 세상을 돕는다는 사회적 의미를 담아 진행한 'KT AI D 캠페인'을 통해 이용자들은 AI 서비스로봇과 바이러스 제로 공간을 만드는 AI 방역로봇 기능을 간접 체험할 수 있다.<|endoftext|>\n", + "64 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 강민지 기자 7일 오후 서울 종로구 연합뉴스 사옥에서 열린 연합뉴스 세계한류학회 업무협약식에서 성기홍 연합뉴스 사장과 문시연 세계한류학회 회장이 협약서를 들고 있다.\n", + "\n", + "### 답변: 7일 오후 서울 종로구 연합뉴스 사옥에서 열린 세계한류학회 업무협약식에서 세계한류학회 회장이 협약서를 들고 세계한류학회 업무협약식을 진행했다.<|endoftext|>\n", + "65 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: CJ ENM 스튜디오 센터 르포 파주에 최첨단 ‘콘테크’ 전진기지 버추얼 프로덕션 스테이지 압권 벽면·천장까지 대형 LED 스크린 환상적인 배경 CG로 구현 가능 스크린·세트장 유기적 연결 탄성 5일 처음 공개된 경기 파주 CJ ENM 스튜디오 센터 내 ‘버추얼 프로덕션 스테이지’에서 제작진이 천장과 벽면을 360도로 둘러싼 메인 LED월에 펼쳐진 설산을 배경으로 자동차를 촬영하고 있다.CJ ENM 제공 차디찬 바람이 불어오는 웅장한 설산이 거대한 타원형 스크린에 펼쳐졌다. 스크린 앞 세트장에 올라선 배우를 촬영하니 정말 그가 설산의 품에 안긴 듯한 영상이 모니터에 출력됐다. 이윽고 스크린은 아름다운 노을이 드리운 해변가로 검붉은 낙엽이 흐트러진 숲속으로 엠파이어스테이트빌딩이 내려다보이는 미국 뉴욕으로 어느 소도시의 낭만적인 밤거리로 계속 전환됐다. 그때마다 영상 속 배우도 각각의 공간에 실제로 가 있는 것처럼 다채롭게 녹아들어 갔다. 5일 기자가 찾은 경기 파주 CJ ENM의 스튜디오 센터는 국내 최대 규모인 약 6만 4000평 21만 1570㎡ 의 문화 콘텐츠와 최첨단 기술이 융합된 ‘콘테크’ 콘텐츠 기술 전진 기지로 구성돼 있었다. 특히 높은 해상도의 삼성전자 마이크로 발광다이오드 LED ‘더 월’을 심은 ‘버추얼 프로덕션 VP 스테이지’ 500평·1652㎡ 는 콘테크의 집약체였다. VP 스테이지의 가장 큰 특징은 지름 20m 높이 7.3m의 말굽형 구조로 이뤄진 ‘메인 LED월’이다. 벽면 360도와 천장까지 모두 대형 LED 스크린으로 채워진 이 공간은 다양한 배경 영상을 틀어 촬영할 수 있다. 사막 영상을 띄운 LED월 앞에 모래와 바위 등을 가져다 놓으면 배우들이 실제로 황막한 사막을 거니는 듯한 영상을 찍을 수 있다. 막대한 비용과 시간이 소요되는 해외 로케이션을 갈 필요가 없어 제작비를 줄일 수 있고 촬영이 힘든 공간을 구현하고 싶을 때도 효율을 극대화할 수 있다. 5일 처음 공개된 경기 파주 CJ ENM 스튜디오 센터 내 ‘버추얼 프로덕션 스테이지’에서 울창한 숲속을 배경으로 연기하는 배우를 촬영하는 모습.CJ ENM 제공 현실에 존재하지 않는 환상적인 배경도 컴퓨터그래픽 CG 으로 구현할 수 있다. 마블 시네마틱 유니버스 MCU 시리즈 등 화려한 CG로 이뤄진 영화를 찍을 땐 아무것도 없는 합성용 녹색 스크린 앞에서 배우들이 연기하는 것이 일반적이다. 하지만 메인 LED월에 CG 배경을 띄우면 배우들도 더욱 몰입감 있게 연기할 수 있게 된다. MobileAdNew center 기자가 직접 VP 스테이지에 들어가서 확인해 보니 촬영된 영상이 배경과 이질감 없이 매우 실감나게 느껴졌다. 단순히 배경만 띄워 놓는 것이 아니라 배경 속 사물이 카메라 촬영 각도에 따라 달라지는 등 스크린과 세트장이 유기적으로 연결되는 모습도 인상적이었다. VP 스테이지엔 메인 LED월 외에 길이 20m 높이 3.6m의 ‘일자형 월’도 마련돼 있어 다양한 형태의 영상 촬영이 가능했다. CJ ENM VP 스테이지에서 밤거리를 배경으로 촬영하고 있다. CJ ENM 제공 이국적인 밤거리를 배경으로 촬영한 결과물. 배경과 배우 세트장이 자연스럽게 녹아들어 있다. CJ ENM은 앞으로 드라마와 영화는 물론 예능 공연 등 다양한 콘텐츠를 찍을 때 VP 스테이지를 활용한다. 특히 가상현실 VR ·증강현실 AR ·확장현실 XR 과 메타버스 등의 첨단 기술을 접목한 콘텐츠 제작도 가능하다. 서정필 CJ ENM 테크 아트 사업부장은 “글로벌 무대에서 신드롬을 일으킬 K콘텐츠 탄생의 메카로 만들겠다”고 말했다.\n", + "\n", + "### 답변: 경기 최대 규모의 문화 콘텐츠와 최첨단 기술이 융합된 콘테크 콘텐츠 전진 기지로 구성된 경기 파주 CJ ENM의 스튜디오 센터는 대형 LED 스크린으로 채워진 공간은 다양한 배경 영상을 틀어 촬영할 수 있고, 막대한 비용과 시간이 소요되는 해외 로케이션을 갈 필요가 없어 제작비를 줄일 수 있는 등 효율을 극대화 할 수 있는 것으로 알려졌다.<|endoftext|>\n", + "66 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 금리인상 우려에 매물적체 영향…매수심리도 갈수록 위축 노원·강북·강동 등 하락폭 확대…인천·수원도 찬바람 서울 남산에서 바라본 아파트단지. © News1 박세연 기자 서울 뉴스1 박승주 기자 서울 집값이 5주 연속 하락하고 외곽지역을 위주로 낙폭도 커진다. 매물은 늘어나는 추세지만 잇따른 금리인상 등의 영향으로 매수심리는 점점 위축된다. 서울을 포함한 수도권 전체에서 찬바람이 불고 있다. 2일 한국부동산원에 따르면 이번주 서울 아파트값 변동률은 지난주와 같은 0.03%를 기록했다. 서울 아파트값은 5월 다섯째주 0.01%로 하락 전환한 뒤 6월 첫째주 0.01% 둘째주 0.02% 셋째주 0.03% 이번주 0.03% 등 하락폭이 느는 추세다. 추가 금리인상 우려와 매물 적체 영향 등으로 관망세가 계속됐다. 부동산 빅데이터 업체 아실의 통계를 보면 6월말 기준 아파트 매물은 6만4977건으로 지난달 10일 5만6568건 양도소득세 중과 한시 배제 조치 시행 이후 14.8% 늘었다. 그러나 서울 아파트 거래는 가뭄 상태고 아파트 매수 심리도 8주째 하락하고 있다. 서울 아파트 매매수급지수는 87.0로 지난주 88.1 보다 1.1포인트 하락했다. 수급지수는 0 100사이면 매도세가 100 200사이면 매수세가 더 크다는 의미다. 서울 25개 자치구 중 서초구 0.02% 만 올랐고 3개 구는 보합 나머지 21개 구는 하락을 기록했다. 특히 노도강 노원·도봉·강북 등 외곽지역이 하락폭을 키웠다. 강북구와 노원구는 각각 지난주 0.05%에서 이번주 0.07%를 기록했다. 동대문구와 서대문구도 각각 0.05%를 나타냈다. 강남4구에서는 서초구의 강세가 이어졌고 강남구는 4주째 보합을 기록했다. 다만 송파구 0.02% 는 마천·석촌동 중저가 위주로 하락했고 강동구 0.04% 도 내렸다. 경기 수원시내 아파트 단지 모습. © News1 조태형 기자 특히 수도권은 거래 침체가 길어지면서 가격 하락 지역이 늘고 있다. 2기 신도시의 내림세가 지속됐고 인천 수원 등 입주물량이 집중된 지역은 약세를 나타냈다. 인천은 0.06%에서 0.08%로 낙폭이 커졌다. 연수구의 경우 지난해 상승 피로감이 있는 옥련·송도동 위주로 하락하며 일주일새 0.23% 하락했다. 경기도 0.04%에서 0.05%로 내림폭이 확대됐다. 전셋값 하락 영향이 있는 수원 영통구 0.18% 권선구 0.13% 양주시 0.05% 등에서 하락폭이 늘어났다. 민간 통계인 부동산R114 조사에서도 신도시는 0.03% 내렸고 경기·인천은 0.05% 하락하면서 두 지역 모두 지난주 대비 낙폭이 늘었다. 인천은 용현동 SK스카이뷰 중산동 신명스카이뷰주얼리 송도동 송도더샵센트럴시티 등 대단지에서 1000만 2000만원 내렸다. 수원은 세류동 수원역센트럴어반시티 수원역해모로 등이 1000만 2 000만원 하락했다. 평택은 청북읍 사랑으로부영1차 평택청북지구EGthe1이 1000만원가량 내렸다. 수도권의 하락세는 당분간 이어질 것이란 관측이다. 국토교통부는 주거정책심의위원회를 열고 미분양이 누적되고 집값 하락세를 보인 17개 시군구에 대한 규제지역 해제를 결정했다. 다만 수도권의 경우 여전히 상승세인 지역이 있고 미분양이 많지 않다는 이유 등으로 규제지역 지정이 유지됐다. 여경희 부동산R114 수석연구원은 금리 추가 인상 경기 불확실성 계절적 비수기 등으로 매수심리가 풀리기 어려운 상황 이라며 거래시장의 부진한 흐름은 한동안 계속될 전망 이라고 밝혔다.\n", + "\n", + "### 답변: 서울물가지난주 집값이 5주 연속 하락하고 외곽지역을 위주로 낙폭도 커지는데 매물은 늘어나는 추세지만 잇따른 금리인상 등의 영향으로 매수심리는 점점 위축되어 서울을 포함한 수도권 전체에서 찬바람이 불고 있다고 2일 한국부동산원에 따르면 이번주 서울 아파트값 변동률은 지난주와 같은 0.03%를 기록했다.<|endoftext|>\n", + "67 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 디지털데일리 변재영 기자 신한금융투자는 가산 데이터센터 개발사업 관련 PF대출 단독주관에 성공했다고 7일 밝혔다. 가산 데이터센터 개발사업은 금천구 가산동에 지하 5층 지상 10층 규모의 데이터센터를 개발하는 사업이다. 신한금융투자 주관 사업을 시행하는 가산아이윌의 조달 금액은 총 3700억원이다. 케이티에서 분사한 케이티클라우드가 마스터리스 Master Lease 할 예정이며 시공은 DL건설과 케이티가 공동으로 맡는다. 이번 개발로 서울 서남부권의 신축 데이터센터가 완성된다. 가산 데이터센터는 서울 전역의 글로벌IT업체 및 대기업 등 다양한 고객군을 대상으로 트래픽 수요에 즉시 대응할 수 있는 데이터센터가 될 것으로 평가된다.\n", + "\n", + "### 답변: 신한금융투자는 금천구 가산동에 지하 5층 지상 10층 규모의 데이터센터를 개발하는 가산 데이터센터 개발사업 관련 PF대출 단독주관에 성공했다고 7일 밝혔으며 이를 통해 서울 전역의 글로벌IT업체 및 대기업 등 다양한 고객군을 대상으로 트래픽 수요에 즉시 대응할 수 있는 데이터센터가 될 것으로 평가된다.<|endoftext|>\n", + "68 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 포스코홀딩스 포스코홀딩스 제공. 재판매 및 DB 금지 서울 연합뉴스 박상돈 기자 포스코홀딩스는 최근 테라사이언스와 실리콘음극재 생산기술을 보유한 테라테크노스 지분 100%를 인수하는 계약을 체결했다고 5일 밝혔다. 테라테크노스는 2017년 설립된 실리콘음극재 스타트업으로 열전달이 우수한 고온 액상 방식의 생산 기술을 보유하고 있다. 포스코홀딩스는 실리콘음극재는 현재 리튬이온전지에 대부분 사용되고 있는 흑연음극재보다 에너지 밀도를 4배 정도 높일 수 있어 전기차 주행거리 향상은 물론 충전 시간도 단축할 수 있는 차세대 음극재 라고 소개했다. 포스코홀딩스는 테라테크노스 인수 후 연내 증설을 시작해 2024년 상반기 제품을 양산·판매할 계획이다. 포스코그룹은 리튬과 니켈 등 원료부터 양극재까지 이차전지소재 공급망 가치사슬을 구축한 데 이어 이번 테라테크노스 인수로 음극재 분야에서도 포트폴리오를 확대해 향후 이차전지소재 분야의 높은 중국 의존도를 낮출 수 있을 것으로 기대했다.\n", + "\n", + "### 답변: 포스코홀딩스는 고온 액상 방식의 생산 기술을 보유한 실리콘음극재 스타트업으로 열전달이 우수한 고온 액상 방식의 생산 기술을 보유하고 있는 테라사이언스와 생산기술을 보유한 테라테크노스 지분 100%를 인수하는 계약을 체결했다고 5일 밝혔다.<|endoftext|>\n", + "69 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 인천공항 뉴스1 유승관 기자 수학계의 노벨상 으로 불리는 필즈상을 수상한 허준이 미국 프린스턴대학교 교수 한국 고등과학원 석학교수 가 8일 인천국제공항을 통해 귀국하고 있다. 필즈상 Fields Medal 은 국제수학연맹 IMU 이 4년마다 개최하는 세계수학자대회 ICM 에서 만 40세 미만의 수학자에게 수여하는 수학계 최고의 상이다.\n", + "\n", + "### 답변: 8계의 노벨상이라 불리며 수학계의 노벨상 으로 불리는 필즈상을 수상한 허준이 미국 프린스턴대학교 교수 한국 고등과학원 석학교수가 8일 인천국제공항을 통해 귀국하였으며 필즈상 Fields Medal은 국제수학연맹 IMU 이 4년마다 개최하는 세계수학자대회 ICM 에서 만 40세 미만의 수학자에게 수여하는 수학계 최고의 상이고 필즈상을 수상한 허준이 미국 프린스턴대학교 교수 한국 고등과학원 석학교수 가 8일 인천국제공항을 통해 귀국하고 있다.<|endoftext|>\n", + "70 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 가와사키 AP 뉴시스 일본 스바루 자동차가 만든 수출용 승용차들이 지난 9월7일 도쿄 부근 가와사키항에서 선적을 위해 야적장에 도열해 있다. 2021.10.08 서울 뉴시스 이재준 기자 2022년 1 6월 일본 국내 신차 판매량은 208만대로 전년 동기 대비 15%나 줄었다고 닛케이 신문 등이 1일 보도했다. 매체는 이날 일본자동차판매협회 연합회와 전국경자동차협회 연합회가 정리한 통계를 인용해 이같이 전하며 동일본 대지진이 있던 2011년 상반기 191만9000대 이래 11년 만에 적은 수준이라고 지적했다. 반도체 부족과 중국 상하이 등 봉쇄 여파로 일본에서 자동차 생산이 지체되면서 올해 상반기 신차 판매가 코로나19 확대로 외출자제에 따른 영향이 컸던 2020년 상반기 220만대까지 밑돌았다. 내역을 보면 배기량 660cc 이상 등록차가 지난해 같은 기간보다 16% 감소한 128만5760대에 그쳤다. 경자동차도 작년 동기에 비해 15% 줄어든 80만418대에 머물렀다. 승용차 브랜드별로는 도요타 자동차 렉서스 제외 가 19% 감소한 63만8050대 SUBARU도 21% 크게 준 4만6008대로 주저앉았다. 6월 한달간 신차 판매 대수는 경자동차를 포함해 전년 동월 대비 10% 줄어든 32만7896대로 떨어졌다. 2021년 7월 이래 12개월 연속 전년 동월 실적을 밑돌았다. 등록차는 16% 적은 19만7530대로 1968년 관련 통계 시작 이래 6월로는 최저를 기록했다. 경자동차는 0.4% 감소한 13만366대다. 중국 록다운에 따른 일본공장에서 감산 때문에 도요타의 일본 판매량이 25% 다이하쓰 공업도 18% 각각 줄었다.\n", + "\n", + "### 답변: 닛 닛케이 신문은 일본자동차판매협회 연합회와 전국경자동차협회 연합회가 정리한 통계를 인용해 동일본 대지진이 있던 2011년 상반기 191만9000대 이래 11년 만에 일본 6월 일본 국내 신차 판매량은 208만대로 전년 동기 대비 15%나 줄었다고 1일 보도하며 일본 국내 신차 판매량은 208만대로 전년 동기 대비 15%나 줄었다고 전했다.<|endoftext|>\n", + "71 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 중소벤처기업진흥공단 제공 파이낸셜뉴스 중소벤처기업진흥공단은 제조 소기업 경쟁력 제고를 위한 2022년 중소기업 혁신바우처 사업 2차 참여기업을 모집한다고 4일 밝혔다. 중소기업 혁신바우처는 컨설팅 기술지원 마케팅 서비스를 맞춤형 패키지 형태로 제공해 제조 중소기업의 경영 혁신을 지원하는 사업이다. 지원대상은 3개년 평균 매출액 120억원 이하 제조 소기업 중 지역별 개별사업공고상 참여 요건에 해당하는 기업이다. 올해 1차 공고에선 총 498억원 규모로 일반 및 재기컨설팅 탄소중립 경영혁신 바우처를 지원했다. 이번 2차 모집에는 기업 특성별 맞춤형 지원을 위해 고도화 서비스 바우처 20억원 와 지역단위 자율형 바우처 100억원 를 신설해 총 120억원을 지원할 계획이다. 구체적으로 고도화 서비스 바우처는 2020년 2021년 혁신바우처 사업을 통해 시제품 제작 프로그램에 참여 완료한 기업을 대상으로 한다. 전문가가 현장진단을 바탕으로 맞춤형 프로그램을 추천해 서비스 고도화 및 기업 사업화 역량 강화를 뒷받침할 계획이다. 선정기업에게는 매출 규모에 따라 최대 5000만원 한도로 바우처 발급 금액의 50 90%를 차등 지원한다. 지역단위 자율형 바우처는 지역별 육성 필요산업과 경제현안 등을 고려해 13개 지방중소벤처기업청이 자율적으로 프로그램을 설계·지원한다. 지역산업 성장을 위한 지원주제에 따라 서비스 분야 및 프로그램 한도 등을 정할 예정이다. 김학도 중진공 이사장은 중진공은 성장 가능성이 높은 중소벤처기업의 경쟁력 강화를 위해 혁신 바우처 사업을 비롯한 다양한 사업을 지원해오고 있다 며 앞으로도 제조 소기업의 혁신성장을 통해 지역 균형발전을 이룰 수 있도록 수요자 맞춤형 지원을 확대할 것 이라고 말했다. 한편 사업 공고는 지역별 지원대상 업종과 시기를 고려해 지방중소벤처기업청에서 순차적으로 진행한다. 공고문 확인 및 사업참가 신청은 혁신바우처플랫폼에서 할 수 있고 자세한 문의는 중진공 통합콜센터 1357 또는 지역본·지부로 하면 된다.\n", + "\n", + "### 답변: 중소벤처기업진흥공단이 3개년 평균 매출액 120억원 이하 제조 소기업 중 지역별 개별사업공고상 참여 요건에 해당하는 기업을 대상으로 제조 소기업 경쟁력 제고를 위한 2022년 중소기업 혁신바우처 사업 2차 참여기업을 모집한다고 4일 밝혔으며, 이번 2차 모집에는 고도화 서비스 바우처 20억원와 지역단위 자율형 바우처 100억원을 신설해 총 120억원을 지원할 예정이다.<|endoftext|>\n", + "72 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 김세연 초록뱀미디어 부회장 사진 퍼즐랩 과거 주몽·올인·불새부터 최근 나의아저씨·펜트하우스·나의 해방일지까지 지난 24년의 역사 동안 수많은 히트작을 포함한 총 70여편의 드라마를 제작한 국내 대표 드라마 제작사 초록뱀미디어가 NFT 대체불가능토큰 사업에 도전장을 내밀었다. 초록뱀미디어는 자체 메타버스 세계관이자 초록뱀 소속 아티스트 및 작품 IP 지식재산권 기반 NFT 브랜드 CRB 오리지널 CRB Original 을 앞서 지난달 공개했다. CRB 오리지널 의 첫 프로젝트인 1호 NFT 출시를 앞두고 김세연 초록뱀미디어 부회장을 만나봤다. ◇ 초록뱀의 자체 IP와 블록체인 기술의 만남 김세연 초록뱀미디어 부회장 사진 퍼즐랩 김 부회장은 4일 블루밍비트와의 인터뷰에서 CRB 오리지널 의 출범 배경으로 디지털 콘텐츠 산업의 변화와 블록체인 및 메타버스 등 새로운 시장의 출현을 꼽았다. 그는 드라마 콘텐츠 산업은 2020년 이전까지 공중파 3사가 주도하던 구조에서 최근 종편 및 OTT 서비스의 급격한 성장으로 인해 셀러즈 마켓 으로 산업이 재편됐다 면서 제작사 입장에서는 긍정적인 변화로 IP를 제작사가 소유·판매하는 방향으로 바뀌면서 제작 콘텐츠 수도 크게 늘어나고 있다 고 말했다. 셀러즈 마켓 은 구매자보다 판매자의 의사가 더 중요한 시장으로 그와 반대되는 바이어즈 마켓과 대조되는 의미다. 초록뱀은 OTT 시장 활성화 이후로 매년 1 2편 제작하던 콘텐츠 수를 6 9편으로 늘렸다고 전했다. 무엇보다 IP를 방송사에 넘기는 것이 아니라 제작사가 직접 소유할 수 있게 되면서 이를 활용할 수 있는 분야가 다양해졌다. 즉 IP로 인한 부가가치 창출이 가능해진 가운데 메타버스와 블록체인 산업이 떠오르면서 이를 결합한 CRB 오리지널 이 탄생하게 된 것이다. ◇ 드라마 콘텐츠 IP·소속 연예인 기반 NFT 구축 초록뱀은 지난해 말 블록체인 신사업 TF 태스크포스 팀을 꾸리고 내외부 인재들을 영입해 CRB 오리지널 의 구축과 자체 NFT 제작에 착수했다. NFT 마켓을 운영하는 글로벌 가상자산 거래소 등 해외 유명 기업들이 NFT 사업 협업을 목적으로 먼저 회사 측에 손을 건네기도 했다. 초록뱀이 보유한 IP 강점 덕분이다. 초록뱀은 자체 콘텐츠 IP 뿐만 아니라 스카이이앤엠 YG케이플러스 후크엔터 등 매니지먼트 세 곳을 보유하고 있다. 3사의 소속 연예인은 총 400여명에 달해 이들을 통한 NFT 사업 확장에도 유리한 상황이다. 회사가 조만간 공개를 계획 중인 1호 NFT 역시 소속 연예인 중 한 명을 통해 만들어진 프로젝트다. 단순한 소장가치를 넘어 팬덤 기반 혜택과 멤버십 기능 등 다양한 장점을 부여했다. 김세연 부회장은 초록뱀미디어의 콘텐츠는 크게 드라마와 연예인으로 나눌 수 있다 라며 드라마 속 일부 콘텐츠나 드라마 자체를 NFT화하거나 예능 연기자 가수 모델 등 소속 연예인들의 팬덤을 만족시킬 수 있는 NFT를 개발하는 방안을 고민하고 있다 고 말했다. ◇ 거대한 스토리 형성...SF·판타지 등 요소 투입 물론 단순히 NFT를 출시하는 데서 끝나는 것이 아니다. 향후 내놓을 NFT 프로젝트들은 서로 유기적인 관계로 CRB 오리지널 이라는 초록뱀의 메타버스 세계관 속에서 하나의 스토리를 형성한다. 김 부회장은 예를 들면 마블 세계관처럼 거대한 초록뱀 월드를 만들고자 하는 게 CRB 오리지널 이다 라면서 조만간 출시할 1호 NFT는 CRB 오리지널 로 진입하는 첫 단계가 될 것 이라고 설명했다. 하나의 NFT로 그치는 것이 아니라 지속적으로 CRB 오리지널 NFT 시리즈 를 내놓고 연속성과 연계성을 부여해 구매자들도 꾸준한 혜택을 누릴 수 있도록 한다는 방침이다. 김 부회장은 향후에는 초록뱀 세계관을 바탕으로 드라마 영화 뿐만 아니라 웹툰 웹소설 등 새로운 콘텐츠 제작도 가능할 것 이라며 SF나 판타지 등 흥미로운 장르의 스토리를 구성하는 방안을 마련 중 이라고 말했다. 초록뱀은 첫 번째 NFT 프로젝트를 완성시켜 당초 지난 달 공개할 예정이었으나 현재 글로벌 블록체인 시장의 상황을 고려해 출시 시점을 미루기로 했다. 김세연 부회장은 해당 NFT 연예인의 팬은 물론 구매자 혹은 투자자에 대한 보호와 안정성 제고를 위해 1호 NFT 출시 연기를 결정했다 며 작품의 가치를 오롯이 전달할 수 있는 머지않은 시점에 다시 정식 론칭을 알릴 것 이라고 전했다.\n", + "\n", + "### 답변: 총 70여편의 드라마를 제작한 국내 대표 드라마 제작사 초록뱀미디어가 4일 블루밍비트와의 인터뷰에서 CRB 오리지널의 첫 프로젝트인 1호 NFT 출시를 앞두고 디지털 콘텐츠 산업의 변화와 블록체인 및 메타버스 등 새로운 시장의 출현을 꼽으며 NFT 대체불가능토큰 사업에 도전장을 내밀었다.<|endoftext|>\n", + "73 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 발행액 14.5조원 상환액 9조원 작년말 퇴직연금 기저효과로 발행 감소 …금융감독원 제공 홍콩H지수 등 주요 주가지수가 하락해 파생결합증권 DLS·ELS 조기상환 규모가 감소함에 따라 올해 1분기 파생결합증권 발행잔액이 지난해 같은 기간보다 증가한 것으로 나타났다. 금융감독원이 1일 발표한 ‘2022년 1분기 중 증권회사 파생결합증권 발행·운용 현황’에 따르면 1분기 파생결합증권 발행잔액은 89조4000억원으로 전년 동기 대비 4조6000억원 증가했다. 1분기중 파생결합증권 발행액은 14조5000억원 상환액은 9조원으로 전년 동기 발행액 24조1000억원 과 상환액 29조3000억원 대비 모두 감소했다. 종류별로 보면 ELS 발행액은 12조원으로 전년 동기 대비 6조8000억원 36.0% 감소했다. 작년 말과 비교하면 13조원 51.8% 줄어든 수치다. 금감원은 “퇴직연금에 편입되는 원금보장형 ELS의 상환‧발행이 연말에 집중되면서 작년 말 발행액이 일시적으로 크게 증가한 영향”이라며 “지난해 홍콩H지수 약세와 1분기 글로벌 증시하락 등으로 투자수요가 감소하며 원금비보장형 ELS 발행액이 지속 감소했다”고 설명했다. ELS 상환액은 6조8000억원으로 지난해 1분기 대비 17조원 71.4% 감소했다. 이에 따라 3월말 ELS 발행잔액은 61조9000억원으로 전년 동기 대비 6조1000억원 11.0% 증가했다. 1분기 중 DLS 발행액은 2조5000억원으로 전년 동기 대비 2조8000억원 52.5% 감소했다. 퇴직연금에 편입되는 원금보장형 DLS의 상환‧발행이 연말에 집중되면서 작년말 발행액이 일시적으로 증가했으나 원금비보장형 DLS의 일괄신고서 금지방안과 대내외 금리 상승 등의 영향으로 전체 발행액이 감소한 것으로 나타났다. DLS 상환액은 2조2000억원으로 전년 동기 대비 3조3000억원 59.8% 감소했다. 3월말 DLS 발행잔액은 4000억원 증가한 27조5000억원으로 집계됐다. 1분기 ELS 투자수익률은 연 3.7% DLS 투자수익률은 연 1.5%로 전년 동기 대비 각각 0.8%p 1.1%p 높아졌다. 금감원은 금융시장 변동성 확대에 따른 투자자 손실위험을 모니터링하고 증권회사 리스크관리를 강화할 방침이다. 금감원 관계자는 “원금비보장형 ELS에서 변동성이 높은 종목형 상품이 증가하고 미국 금리 상승 경기침체 우려로 금융시장 변동성이 확대되는 상황”이라며 “투자자 손실위험에 대한 모니터링을 지속하고 증권회사의 헤지운용에 따른 예상손실을 상시 점검해 잠재적 리스크에 선제적으로 대응할 계획”이라고 밝혔다.\n", + "\n", + "### 답변: 1일감동원은 1분기 파생결합증권 발행잔액은 89조4000억원으로 전년 동기 대비 4조6000억원 증가, 주요 주가지수가 하락해 파생결합증권 DLS·ELS 조기상환 규모가 감소함에 따라 올해 1분기 파생결합증권 발행잔액이 지난해 같은 기간보다 증가한 것으로 나타나 금감원은 금융시장 변동성 확대에 따른 투자자 손실위험을 모니터링하고 증권회사 리스크관리를 강화할 방침이다.<|endoftext|>\n", + "74 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: DC IRP에 디폴트옵션 도입...적립금 자동 운용 운용지시 없다면 최대 6주 대기 후 디폴트옵션 운용 10월중 첫 승인상품...분기별로 수익률 공시 …고용노동부 제공 이달 12일부터 확정기여형 퇴직연금 DC 과 개인형퇴직연금 IRP 에 사전지정운용제도 디폴트옵션 가 도입된다. 고용노동부·금융위원회·금융감독원은 디폴트옵션 도입을 위한 근로자퇴직급여보장법 근퇴법 시행령이 국무회의에서 의결됐다고 5일 밝혔다. 앞서 정부는 지난해 12월 근퇴법 개정안이 국회에서 통과됨에 따라 시행규칙 퇴직연금감독규정을 개정했다. 사전지정운용제도 디폴트옵션 는 근로자가 본인의 퇴직연금 적립금을 운용할 금융상품을 결정하지 않을 경우 사전에 정해둔 운용방법으로 적립금이 자동 운용되도록 하는 제도를 말한다. 상품 유형은 예금 이율보증보험계약 GIC 등 원리금보장상품 100% 타깃데이트펀드 TDF 밸런스펀드 BF 스테이블밸류펀드 SVF 사회간접자본펀드 SOC 등 펀드상품 100% 원리금보장상품과 펀드상품을 혼합한 포트폴리오 상품 모두 가능하다. 퇴직연금사업자는 사용자와 근로자에게 제시할 디폴트옵션을 마련해 고용노동부 소속 심의위원회 심의를 거쳐 고용노동부장관의 승인을 받아야 한다. 심의위원회는 원리금보장상품의 금리 만기 예금자 보호 한도 상시가입 가능 여부 펀드 포트폴리오 상품의 수수료 수익률 손실 가능성 자산 배분의 적절성을 위주로 심사한다. …고용노동부 제공 최대 6 주 대기 후 디폴트옵션 운용 ... 언제든 변경 가능 근로자는 퇴직연금규약에 반영된 디폴트옵션 주요정보를 퇴직연금사업자로부터 제공받아 그중 하나의 상품을 본인의 디폴트옵션으로 선정한다. 기존 운용하던 상품의 만기가 도래한 후 운용지시 없이 4주 경과 시 ‘향후 2주 이내 운용지시가 없을 경우 적립금이 디폴트옵션으로 운용됨’을 통지받게 된다. 통지 이후에도 운용지시 없이 2주가 지나면 디폴트옵션으로 운용된다. 신규가입 후 운용지시가 없는 경우에는 4주 대기 없이 바로 통지를 받게 되며 통지 후 2주 이내에 운용지시 없을 경우 적립금이 디폴트옵션으로 운용된다. 디폴트옵션으로 적립금을 운용하고 있지 않은 근로자는 언제든지 디폴트옵션으로 본인의 적립금을 운용하는 것을 선택 OPT IN 할 수 있다. 또 디폴트옵션으로 운용 중에도 언제든지 원하는 다른 상품으로 운용지시가 가능 OPT OUT 하다. 적립금 100% 까지 운용 ...IRP 도 동일 퇴직연금 감독규정 개정에 따라 기존 위험자산 한도 70% 규제에도 불구하고 디폴트옵션은 적립금의 100%까지 운용할 수 있다. 확정기여형 퇴직연금 DC 에 도입되는 디폴트옵션에 관한 사항은 개인형퇴직연금 IRP 에도 동일하게 적용된다. 퇴직연금사업자가 승인받은 상품을 가입자에게 바로 제공하고 가입자는 그중 본인의 디폴트옵션을 선정하면 된다. 정부는 제도 시행 후 퇴직연금사업자로부터 신청을 받아 신속하게 승인 절차를 진행할 예정이며 10월 중에는 첫 번째 심의위원회를 거쳐 승인된 상품을 공시할 예정이다. 아울러 가입자의 선택권 보장과 사업자 간 경쟁 제고를 위해 디폴트옵션의 운용현황 수익률 등을 분기별로 고용노동부와 금융감독원 홈페이지에 공시한다. 또 3년에 1회 이상 정기평가해 승인 지속 여부를 심의해 모니터링 및 관리를 강화할 방침이다. 이정식 고용노동부장관은 “그간 퇴직연금제도는 낮은 수익률 문제로 근로자의 노후준비에 든든한 버팀목 역할을 하지 못했던 측면이 있었다”며 “지난 4월 도입된 중소기업퇴직연금기금제도와 적립금운용위원회 이달 도입되는 디폴트옵션을 빠르게 현장에 안착시키도록 적극 노력하겠다”고 밝혔다.\n", + "\n", + "### 답변: 이달 12일부터 확정기여형 퇴직연금 DC과 개인형퇴직연금 IRP에 사전지정운용제도 디폴트옵션이 도입되어 근로자가 본인의 퇴직연금 적립금을 운용할 금융상품을 결정하지 않을 경우 사전에 정해둔 운용방법으로 적립금이 자동 운용되도록 하며 특정 상품 유형은 예금 이율보증보험계약 GIC 등 원리금보장상품 100% 타깃데이트펀드 TDF 밸런스펀드 BF 스테이블밸류펀드 SVF 사회간접자본펀드 SOC 등 펀드상품 100% 원리금보장상품과 펀드상품을 혼합한 포트폴리오 상품 모두 가능하다.<|endoftext|>\n", + "75 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 핵심요약 23일 우리은행 이어 30일 신한은행서도 거액 외환 이상 거래 발생 금감원 현장 수시검사 나서며 타은행에도 점검 후 보고 지시 실수요 자금인지 위조나 가상자산 통한 차익 거래인지 여부에 주목 연합뉴스 우리은행에 이어 신한은행에서도 거액의 외환 이상 거래가 발견되면서 금융감독원이 타 시중 은행에 대해서도 외환 거래 운용 상황을 보고하도록 했다. 3일 금융권에 따르면 금감원은 지난 30일 신한은행 지점에서 발생한 거액의 외환 이상 거래에 대해 수시 검사에 나서며 나머지 은행들에 대해서도 외환 거래 이상 여부를 확인해 보고하도록 했다. 일부 은행은 금감원 지시 전인 우리은행 지점 사건 직후 자체 점검에 나서거나 금감원에 관련 사안을 문의한 것으로 전해졌다. 금감원은 이번 수시 검사를 통해 자금세탁 방지법과 외환 거래법 위반 여부를 집중 점검할 방침이다. 수입 대금 결제 명목으로 이뤄진 거래에 대한 실수요 자금 여부 서류 위조나 가상 자산과 연루된 차익 거래 여부 중국계 불법성 자본 등과의 연루 여부 자금세탁 목적 여부 등이다. 우리은행은 내부감사를 통해 서울의 한 지점에서 최근 1년 동안 8천억원에 달하는 비정상적인 외환거래가 이뤄진 사실을 알아내고 금감원에 보고했다. 금감원은 지난달 23일 이 지점에 대한 현장 검사를 시작했으며 신한은행으로부터도 이상 거래 현황을 보고 받고 지난달 30일 해당 지점에 대한 현장 검사에 착수했다. 이복현 금감원장은 최근 시중은행장들과의 간담회에서 횡령 등 금융 사고가 반복되는 점과 관련해 내부 통제 강화 를 촉구하면서 개선방안을 추진하겠다고 말했다. ※CBS노컷뉴스는 여러분의 제보로 함께 세상을 바꿉니다.\n", + "\n", + "### 답변: 3일은행에 이어 신한은행에서도 거액의 외환 이상 거래가 발견되면서 금융감독원이 타 시중 은행에 대해서도 외환 거래 운용 상황을 보고하도록 했는데, 3일 금융권에 따르면 금감원은 지난 30일 신한은행 지점에서 발생한 거액의 외환 이상 거래에 대해 수시 검사에 나서며 나머지 은행들에 대해서도 외환 거래 이상 여부를 확인해 보고하도록 했다고 전했으며, 일부 은행은 금감원 지시 전인 우리은행 지점 사건 직후 자체 점검에 나서거나 금감원에 관련 사안을 문의한 것으로 있다고 밝혔다.<|endoftext|>\n", + "76 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 뉴시스 김근수기자 비트코인이 경기 침체와 고금리에 대한 우려로 가상화폐 가격이 등락을 거듭한 1일 오후 서울 서초구 빗썸 고객센터 전광판에 암호화폐 시세가 나타나고 있다. 2022.07.01. ks newsis.com 사진 영상 제보받습니다 공감언론 뉴시스가 독자 여러분의 소중한 제보를 기다립니다. 뉴스 가치나 화제성이 있다고 판단되는 사진 또는 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠습니다.\n", + "\n", + "### 답변: 경기 침체와 고금리에 대한 우려로 가상화폐 가격이 등락을 거듭한 1일 오후 서울 서초구 빗썸 고객센터 전광판에 암호화폐 시세가 나타나고 있으며, 뉴시스 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 뉴스 가치나 화제성이 있다고 판단되는 사진이나 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다고 밝혔다.<|endoftext|>\n", + "77 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 모아데이타가 무상증자 발표 이후 상한가를 기록했다. 5일 오후 1시20분 현재 모아데이타는 전거래일대비 가격제한폭 29.70% 까지 오른 1만9650원을 나타내고 있다. 이날 모아데이타는 보통주 1주당 신주 5주를 배정하는 무상증자를 결정했다고 5일 공시했다. 신주 배정기준일은 오는 20일이며 신주의 상장예정일은 8월10일이다.\n", + "\n", + "### 답변: 모아데이타가 무상증자 발표 이후 상한가를 기록했다고 5일 날렸는데 5일 오후 1시20분 현재 모아데이타는 전거래일대비 가격제한폭 29.70% 까지 오른 1만9650원을 나타내고 있으며 이날 모아데이타는 보통주 1주당 신주 5주를 배정하는 무상증자를 결정했다고 5일 공시했다.<|endoftext|>\n", + "78 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 우리·신한 이상거래 후속조치 가상자산·불법자금세탁 조사 우리은행에 이어 신한은행에서도 거액의 외환 이상 거래가 발견되자 금융감독원이 모든 은행에 외환 거래 운용 상황을 점검하고 그 결과를 보고하도록 했다. 3일 금융권에 따르면 금감원은 지난달 23일 우리은행에 이어 30일 신한은행 지점에서 발생한 거액의 외환 이상 거래에 대해 수시 검사를 시작했으며 나머지 은행들에도 자체적으로 점검한 뒤 외환 거래 이상 여부를 보고하도록 했다. 일부 은행은 최근 우리은행 지점에서 문제가 발생하자 자체 점검에 착수하고 금감원에 관련 사안을 문의한 것으로 전해졌다. 금융당국 관계자는 우리은행 등에서 거액의 외환 이상 거래가 드러나는 등 문제가 있다고 판단돼 모든 은행에 공식적으로 자체 점검을 진행하도록 했다 고 말했다. 금감원은 우리은행 신한은행 지점의 거액의 외환 이상 거래와 관련한 수시 검사에서 자금세탁방지법과 외환거래법 위반 여부를 집중적으로 들여다보고 있다. 수입 대금 결제 명목으로 이뤄진 거래가 실수요 자금인지 서류를 위조하거나 가상자산과 연루돼 차익 거래를 했는지 중국계 불법성 자본 등과 연루됐는지 자금세탁 목적이 있는지 등을 살펴볼 계획이다. 금융당국 관계자는 거액의 송금 거래가 해당 업체의 무역 거래에 맞는 규모인지 의심을 가질 수 있어 여러 가능성을 보고 있다 고 전했다. 우리은행은 서울의 한 지점에서 최근 1년 동안 8000억원에 달하는 비정상적인 외환 거래가 이뤄진 사실을 내부 감사를 통해 포착해 금감원에 보고했다. 이에 금감원은 지난달 23일 이 지점에 대한 현장 검사에 착수했다. 이어 금감원은 신한은행으로부터 외환 이상 거래 현황을 보고받고 지난달 30일 해당 지점에 대한 현장 검사에 나섰다.\n", + "\n", + "### 답변: 3일 금융권에 따르면 금감원은 지난달 23일 우리은행에 이어 30일 신한은행 지점에서 발생한 거액의 외환 이상 거래에 대해 수시 검사를 시작했으며 나머지 은행들에도 자체적으로 점검한 뒤 외환 거래 이상 여부를 보고하도록 했다고 밝혔으며 일부 은행은 최근 우리은행 지점에서 문제가 발생하자 자체 점검에 착수하고 금감원에 관련 사안을 문의한 것으로 전해졌다.<|endoftext|>\n", + "79 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: KDDI 사고 원인 검증·재발방지책 마련할 계획 일본의 대형 이동통신사 KDDI가 통신사고 발생 약 86시간만에 서비스를 복구했다고 밝혔다. 5일 아사히뉴스네트워크 등 다수의 외신에 따르면 KDDI는 이날 오후 3시36분에 서비스 이용 상황과 네트워크 트래픽에 문제가 없음을 최종 확인했다. KDDI는 원인을 검증하고 최대한 빠른 시일 내에 재발 방지책을 마련한다는 계획이다. KDDI는 설비 고장으로 인해 VoLTE 교환기에 트래픽이 급증하며 통신망 과부하가 발생한 것을 사고 발생 원인으로 보고 있다. 2일 오전 1시35분 도쿄에 위치한 타마네트워크센터에서 모바일 코어망 라우터를 교환하던 중 KDDI는 음성 트래픽 경로가 변경되지 않고 VoLTE 통신에 문제가 생긴 것을 처음 확인했다. 타카하시 마코토 KDDI 사장 오른쪽 과 요시무라 카즈유키 KDDI 기술 총괄 본부장이 지난 3일 통신 장애에 대해 사과하고 있다. 사진 지디넷재팬 라우터 변경 작업 중 신규 라우터에 엑세스가 집중되며 VoLTE 교환기에 폭주가 발생했다. KDDI는 트래픽을 줄이기 위해 오전 3시부터 약 12시간 동안 액세스 요구를 제한하는 작업을 진행했지만 오후 3시 22분부터 가입자 데이터베이스 처리 부하가 발생했다. 오후 5시22분에는 가입자 데이터베이스에서 데이터 불일치가 발생하면서 장애 복구가 정상적으로 이뤄지지 않았다. 사고를 수습하는 과정에서도 18대의 VoLTE 교환기 중 6대에서 가입자 데이터베이스에 대한 신호를 과도하게 송출하고 있는 것을 발견했다. KDDI는 이번 통신장애가 지난 2월에 발생한 NTT도코모 사고와 비슷하다고 보고 있다. KDDI 측은 전날 진행된 기자회견에서 이번 사고는 단말기에 트래픽이 급증해 발생했다는 점에서 NTT도코모와 같은 현상이라고 볼 수 있다 고 설명했다. 복구가 늦어진 이유에 대해서는 복구 절차를 착실하게 준비하고 있었지만 처리에 문제가 있었다 며 지금부터 확실히 검증할 계획 이라고 말했다. KDDI는 이번 사고로 최소 3천915만 회선이 피해를 입은 것으로 추정하고 있다. 요시무라 본부장은 사용자 보상에 대해 원인 규명과 재발 방지를 우선적으로 고려하고 있으며 보상은 추후 별도로 안내할 예정 이라고 말했다.\n", + "\n", + "### 답변: 5일 아사히뉴스네트워크 등 다수의 외신에 따르면 일본의 대형 이동통신사 KDDI가 통신사고 발생 약 86시간만에 서비스를 복구했다고 밝혔는데, KDDI는 설비 고장으로 인해 VoLTE 교환기에 트래픽이 급증하며 통신망 과부하가 발생한 것을 사고 발생 원인으로 보고 있으며 KDDI는 원인을 검증하고 최대한 빠른 시일 내에 재발 방지책을 마련할 계획이다.<|endoftext|>\n", + "80 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 날짜미상의 사진에서 카타르 북부에서 운반선에 액화천연가스 LNG 가 실리고 있다.AP뉴시스 우크라이나의 전쟁으로 인한 천연가스의 가격 상승과 공급 우려로 향후 몇년 동안 천연가스에 대한 수요 증가가 둔화시킬 것으로 국제에너지기구 IEA 가 전망했다. 5일 현지시간 온라인 에너지전문매체 오일프라이스닷컴에 따르면 IEA는 이날 공개한 3·4분기 보고서에서 2021∼25년 사이 천연가스에 대한 세계 수요가 1400억㎥ 증가할 것으로 예측했다. 이는 코로나19 대유행으로 인한 경기침체를 포함한 직전 5년 간 2016∼20년 의 3700억㎥ 증가의 절반에도 못미치는 것이다. 이같은 수요 감소 전망은 우크라이나 전쟁으로 인한 천연가스의 높은 가격과 공급 불안 때문인 것으로 분석됐다. 또 구매자들이 천연가스에 대한 수요를 석탄이나 석유 또는 재생 가능한 에너지로 전환하기보다는 경제성장이 더 둔화될 것이라는 예측 때문이다. IEA는 러시아산 가스 구매를 줄이려는 유럽연합 EU 국가들의 노력으로 러시아에서 EU로의 천연가스 수출은 55∼75% 감소할 것으로 예상했다. 대신 EU는 아시아 같은 다른 지역으로부터 액화천연가스 LNG 구매를 늘릴 것으로 예상되는데 2025년 아시아로부터의 구매는 EU 수요의 절반을 차지할 것으로 예상됐다. 오일프라이스닷컴은 LNG 수출을 위한 시설 확충이 수요 증가세에 비해 느린 점도 수요를 둔화시키게 만들 것이라고 전했다. 이 매체는 지난 2010년대 중반 유가 폭락으로 취소된 에너지 인프라 프로젝트가 많고 지난 2020 21년 코로나19 봉쇄령으로 건설도 늦어지면서 시설 확충 속도가 느릴 것으로 전망했다.\n", + "\n", + "### 답변: 국제에너지기구 IEA가 우크라이나의 전쟁으로 인한 천연가스의 가격 상승과 공급 우려로 향후 몇년 동안 천연가스에 대한 수요 증가가 둔화시킬 것으로 예측한 가운데 5일 온라인 에너지전문매체 오일프라이스닷컴에 따르면 IEA는 이날 공개한 3·4분기 보고서에서 2021∼25년 사이 천연가스에 대한 세계 수요가 1400억m3 증가할 것으로, 이는 코로나19 대유행으로 인한 경기침체를 포함한 경기침체를 포함한 직전 5년 간 2016∼20년 의 3700억m3 증가의 절반에도 못미치는 것이다.<|endoftext|>\n", + "81 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 웨이브 독점 HBO 다큐멘터리 세기의 범죄 지난해 미국에서 약물 과다 복용으로 인한 사망자 수가 처음으로 10만명을 넘었다. 마약성 진통제 오피오이드 중독 문제 심각성이 커지자 도널드 트럼프 당시 미국 대통령이 이를 공중보건 비상사태로 규정했고 조 바이든 대통령 또한 불법 마약 거래 관련 국가 비상사태를 선포했다. HBO 다큐멘터리 세기의 범죄 는 이 같은 중독 사태 원인에 대해 집중 조명한다. 실제 제약산업에 종사했던 사람 의사 판매원 생생한 증언으로 사건 이면을 고발한다. 마약성 진통제 이른바 오피오이드는 양귀비의 꼬투리에서 채취한 아편을 원료로 한다. 양귀비에서 직접 추출한 천연 알칼로이드 천연 알칼로이드에서 유도한 반합성 알칼로이드 그리고 처음부터 화학 약품에서 합성한 성분 모두를 총칭한다. 마약성 진통제는 인간 고통을 덜어주기 위한 목적으로 등장했다. 진통제는 중추신경계 오피오이드 수용체에 작용해 통증 자극을 전달하는 신경전달물질 분비를 억제한다. 진통 효과로 주로 말기 암 환자나 수술 직후 환자 등에 한해 처방한다. 하지만 2000년대 이후 이 약은 미국에서 만병통치약으로 과용되기 시작한다. 오피오이드 사태 배후에는 미국의 제약회사 의사 정부의 철저한 계획이 있었다. 1952년 작은 제약회사 퍼듀 프레데릭 을 인수한 새클러 가문은 홍보와 사기를 넘나드는 영업 방식으로 안정제 시장을 선점했다. 이익 창출을 위해 기존에 판매하던 모르핀 계열 진통제보다 더욱 강력한 옥시코돈 에 주목했다. 그렇게 합성 마약제 옥시코돈 에 약물의 지속력을 높이는 코팅 기술이 더해져 마약성 진통제 옥시콘틴 이 탄생했다. 퍼듀 제약회사는 약물 부작용을 축소해 공표했다. 퍼듀로부터 뇌물을 약속 받은 식품의약국은 승인했다. 국가에서 인증한 이 약은 흡수를 지연시켜 오용 가능성을 줄인다 는 설명서 한 줄을 근거로 많은 판매원은 의사에게 마약을 권장했고 의사 역시 대중에 적극적으로 진통제를 처방했다. 약물 오남용 가능성을 알면서 저지른 행동이었다. 가장 큰 부작용은 중독이다. 환각 기억 상실 등 부작용과 투여 중지 시 금단 현상을 일으키며 모르는 사이 중독 과정을 겪게 된다. 환자들은 더 강한 효과를 위해 불법 마약 구매를 하기 시작했다. 멈출 수 없는 중독은 오피오이드 과다 복용으로 이어졌고 미국 질병통제예방센터 CDC 는 1999년부터 2019년까지 약 50만명 미국인이 이로 인해 숨졌다고 발표했다. 지방 정부는 관련 업체들을 상대로 소송을 제기하며 죽음에 대한 책임을 물었다. 제약사 존슨앤드존슨을 포함한 미국 3대 유통업체는 약 30조원이라는 합의금을 지불키로 했으며 퍼듀 파마 역시 지역 사회에 마약성 진통제를 유통한 유죄를 인정했다. 약물 중독과의 전쟁은 진행 중이다. 인간 통증을 인질로 탄생한 합법적 마약 이를 판매했던 장사꾼들의 민낯을 고발하는 HBO 다큐멘터리 세기의 범죄 는 온라인동영상서비스 OTT 웨이브에서 시청할 수 있다.\n", + "\n", + "### 답변: 지난해 미국에서 약물 과다 복용으로 인한 사망자 수가 처음으로 10만명을 넘기고, 미국에서 약물 과다 복용으로 인한 사망자 수가 처음으로 10만명을 넘어서면서 도널드 트럼프 당시 도널드 트럼프 당시 미국 대통령이 이를 공중보건 비상사태로 규정했고 조 바이든 대통령 또한 불법 마약 거래 관련 국가 비상사태를 선포한 가운데, HBO 다큐멘터리 세기의 범죄는 중독 사태 원인에 대해 집중 조명하고 제약산업에 종사했던 사람 의사 판매원 생생한 증언으로 사건 이면을 고발한다.<|endoftext|>\n", + "82 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 다음 블로그가 운영 17년 만에 서비스를 종료한다. 5일 정보기술 IT 업계에 따르면 카카오는 다음 블로그와 티스토리로 나뉘어 운영하던 블로그 플랫폼을 티스토리로 통합하기로 했다. 서비스 통합 예정일은 9월 30일이다. 기존 다음 블로그 이용자들은 콘텐츠를 티스토리로 이관해 활동을 이어나갈 수 있다. 카카오는 서비스 품질 향상을 위해서라고 통합 이유를 설명했다. 서비스 통합에 앞서 카카오는 지난 4일부터 다음 블로그 신규 개설을 중단됐다. 다음 블로그는 블로그 열풍이 불던 2005년 2월 서비스를 시작했다. 2007년 다음이 티스토리를 인수했으며 2020년 5월 전면 리뉴얼 이후 디자인·구조 측면에서 티스토리와 유사하다는 평가가 나왔다.\n", + "\n", + "### 답변: 5일 카카오는 다음 블로그와 티스토리로 나뉘어 운영하던 블로그 플랫폼을 티스토리로 통합하기로 했다고 밝혔으며 다음 블로그가 운영 17년 만에 서비스를 종료하고 기존 다음 블로그 이용자들은 콘텐츠를 티스토리로 이관해 활동을 이어나갈 수 있게 되었다.<|endoftext|>\n", + "83 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 게티이미지뱅크 인터넷전문은행이 대환대출 시장에 본격 진출하면서 카드·저축은행 등 제2금융권에 비상이 걸렸다. 제2금융권 대출을 이용하면서 상대적으로 신용이 우량한 고객 중심으로 이탈이 불가피해졌다. 향후 출혈경쟁으로 업권 자체 건전성까지 해칠 수 있다는 우려도 나온다. 3일 업계에 따르면 토스뱅크가 삼성카드를 시작으로 이달부터 복수 카드사 대상 카드론 장기카드대출 대환대출 서비스를 확대할 예정이어서 카드업계 우려가 커졌다. 카드사 고위 관계자는 “토스뱅크가 하겠다는 서비스가 사실상 카드론 고객 정보를 긁어다가 자사로 유입하겠다는 의도”라면서 “일부 고객에겐 금리인하 등 편익이 있을 수 있지만 산업 종사자로서 산업 생태계 자체가 위협을 받을 가능성이 짙어 우려스럽다”고 설명했다. 토스뱅크가 선보인 카드론 대환대출 서비스 는 이용자가 개인정보 열람에 동의하고 인증서 정보를 입력하면 기존 카드사에서 받은 카드론 금리 등을 안내하고 토스뱅크 대출로 갈아탈 수 있도록 해준다. 실제 1일 기준 토스뱅크 신용대출 금리는 연 4.18 15.00%로 6개 카드사 신한·KB국민·삼성·하나·우리·롯데카드 카드론 금리 5월 31일 기준 연 6.95 19.10%보다 낮다. 토스뱅크에 따르면 카드론 대환대출 서비스 이용자가 해당 서비스를 이용하면 평균금리가 연 6.83% 연이자상환액이 연평균 약 47만원 각각 감소하는 효과를 낸다고 설명했다. 카드업계는 우량 고객 이탈이 불가피하다고 우려한다. 최근 카드채 금리가 급등하면서 자금을 조달하기 어려워진데다 토스뱅크로 상대적으로 신용이 우량한 고객이 이탈하면 자체 대출 사업이 위축될 수 있다고 보고 있다. 이렇다 보니 토스뱅크의 서비스 구현 방식에 대해 볼멘소리도 나온다. 현재 토스뱅크는 카드론 정보를 수집하는 과정에서 웹사이트 콘텐츠를 수집·저장하는 웹 스크래핑 방식을 사용한다. 일각에서는 마이데이터 사업자인 토스와 토스뱅크가 같은 앱에서 서비스를 제공하는데도 토스뱅크가 사업자가 아니라는 이유로 스크래핑을 사용하는 것이 형평성에 어긋난다고 지적한다. 하지만 전체 신용정보를 스크래핑으로 통합 조회한 것이 아니기 때문에 규정을 어긴 것은 아니다. 저축은행도 인터넷은행의 대환대출 확대에 부정적인 견해를 내비쳤다. 현재 토스뱅크 카카오뱅크 등은 자사 플랫폼에서 기존 사용자가 받은 대출을 저축은행 등으로 대환해주는 서비스를 제공하고 있다. 인터넷은행보다 플랫폼 접근성이 현저히 낮은 저축은행 사정상 울며 겨자먹기로 수수료를 내면서 이들 대환대출 서비스에 탑승한 것이다. 다만 초기 예상과 달리 현재 저축은행들은 대환대출에 적극적이지 않다. 인터넷은행이 플랫폼에 들어온 우량 고객은 자사로 유입하고 상대적으로 신용이 취약한 고객만 저축은행으로 대환하고 있다는 주장이다. 한 저축은행 관계자는 “현장에서 인터넷은행의 대환대출 서비스 제공에 대한 우려가 크다”며 “신용이 우량한 고객은 인터넷은행으로 유입하고 상대적으로 신용이 취약한 고객만 저축은행으로 보내다 보니 이 부분에 대한 마케팅도 저절로 줄어드는 상황”이라고 토로했다.\n", + "\n", + "### 답변: 토전문은행이 대환대출 시장에 본격 진출하면서 상대적으로 신용이 우량한 고객 중심으로 이탈이 불가피해져 카드·저축은행 등 제2금융권에 비상이 걸렸으며 향후 출혈경쟁으로 업권 자체 건전성까지 해칠 수 있다는 우려도 나온다.<|endoftext|>\n", + "84 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: ‘시장형 일자리’ 식당 가보니 저렴한 식대 고령 손님 증가 일만 늘고 현상유지 어려워 “자생 위한 중장기 지원해야” 지난 23일 오후 서울 시내 한 반찬 전문점에서 시민들이 반찬을 구입하고 있다. 연합뉴스 “돼지고기 가격이 30%는 올랐어요. 제육볶음에 딸려 나가는 공깃밥값을 추가로 받아야 하나 고민됩니다.” 충북 청주에서 ‘노인일자리’ 식당을 운영하고 있는 담당자 김주현씨 가명 의 말이다. 김씨에게 ‘물가가 더 오를 것’이라는 정부 전망을 전하자 한숨을 크게 내쉬었다. 노인일자리 사업장이 고물가에 흔들리고 있다. 노인이 일하는 식당과 카페 반찬가게는 대표적인 시장형 노인일자리 사업장이다. 시장형 일자리는 정부가 민간 사업체에 인건비 일부를 지원해 만든 취업 자리다. 민간이 주도하는 수익 추구형 일자리사업으로 정부·지방자치단체가 직접 노인을 고용해 인건비를 지원하는 방식과 다르다. 다만 직접 일자리는 아니지만 노인일자리 창출을 위한 정부 지원 사업이기 때문에 공익 성격도 짙다. 노인일자리 사업장에서 판매하는 상품 가격은 비교적 낮은 수준이다. 지난 4일 찾은 청주의 ‘노인 보리밥집’도 정부가 지정한 착한가격업소다. 대표 메뉴인 시래기장 정식은 5500원으로 주변 식당 평균 백반 가격보다 저렴하다. 그나마도 코로나19를 거치면서 수년간 유지한 5000원에서 500원을 올린 가격이다. 코로나19 터널을 빠져나온 뒤 매출은 증가했는데 적자가 더 늘었다. 식자재 가격이 큰 폭으로 올랐기 때문이다. 음식을 팔면 팔수록 손해다. 5일 통계청이 발표한 6월 물가동향을 보면 돼지고기와 닭고기 가격은 1년 전보다 각각 18.6% 20.1% 올랐다. 같은 기간 배추는 35.5% 감자는 37.8% 상승했다. 김씨는 “코로나 때 300만원 적자였다면 올해는 장사가 나아졌으니까 적자가 200만원으로 줄어야 하는데 그게 안 된다”며 “일이 많아져서 어르신들만 더 고생한다”고 했다. 지역공동체를 기반으로 하는 식당 특성상 음식 가격을 올리기도 어렵다. 손님 대부분이 형편이 어려운 고령층이다. 저렴한 가격 때문에 이곳을 찾는 노인도 많다. 김씨는 “지금보다 식자재 가격이 더 오르면 현상 유지도 어려워질 수 있다”며 “뾰족한 방법이 없는 상황”이라고 말했다. 노인일자리 카페도 같은 처지다. 노인 10명이 돌아가며 일하는 청주 A카페도 고물가에 운영난을 겪고 있다. 노인들이 시간당 최저임금을 받으며 일해도 카페 운영이 쉽지 않다. A카페의 수박주스 가격은 4000원으로 다른 프랜차이즈 카페보다 20% 가까이 싸다. 수박 가격 6월 기준 은 1년 전보다 22.2% 올랐다. 카페 관계자는 “일하는 노인분들의 급여를 정산하면 남는 게 거의 없다”고 했다. 김문정 한국노인인력개발원 연구조사센터 부연구위원은 “시장형 노인일자리는 지역사회에 공헌하는 바가 크고 공익성이 있는 일자리”라며 “일자리사업이 중단되지 않고 중장기적으로 자생할 수 있도록 지원할 필요가 있다”고 말했다.\n", + "\n", + "### 답변: 5일 통계청이 발표한 6월 물가동향에 따르면 돼지고기와 닭고기 가격은 1년 전보다 각각 18.6% 20.1% 올랐고 노인일자리 사업장에서 판매하는 상품 가격은 비교적 낮은 수준으로 노인일자리 사업장이 고물가에 흔들리고 있다.<|endoftext|>\n", + "85 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 톰 레이턴 아카마이 대표 해킹 규모 커지고 횟수도 늘어 컴퓨팅 등 全분야 솔루션 제공 24시간 탐지로 피해 예방 가능 클라우드 이용땐 특히 더 필요 우크라이나·러시아 전쟁으로 새로운 종류의 해킹 위협이 많이 늘어날 줄 알았는데 그보다는 전통적인 해킹 악성코드·디도스 이 급증했습니다. 특히 랜섬웨어 피해가 올해 극심합니다. 톰 레이턴 아카마이 최고경영자 CEO·사진 가 최근 매일경제와 인터뷰에서 이 같은 사이버 동향을 전했다. 레이턴 CEO는 지난달 15 16일 한국에 머물며 국내 유수 대기업 관계자와 미팅을 했다. 콘텐츠 전송 네트워크 CDN 분야 글로벌 1위 기업인 아카마이는 보안 솔루션과 클라우드라는 신산업 을 개척하며 New 아카마이 로 탈바꿈하고 있는 기업이다. 지난해 한 해에만 약 34억달러의 매출을 기록했는데 보안 분야 매출액만 13억달러에 이른다. 레이턴 CEO는 컴퓨팅·콘텐츠 전송까지 아우르며 전 세계에 걸쳐 보안 솔루션을 제공할 수 있다는 게 아카마이 보안의 장점 이라고 강조했다. 그는 상시화되고 규모가 커진 해킹 위협에 대응해 사이버 복원력 resiliency 을 가져야 한다고 조언했다. 레이턴 CEO는 해킹 공격은 언젠가는 들어오는데 이를 미리 감지하고 확산이 되지 않게끔 하는 게 사이버 복원력의 핵심 이라며 아카마이는 마이크로세그멘테이션 부문 Microsegmentation 보안에서 강점을 가지고 있다 고 설명했다. 마이크로세그멘테이션이란 기관 내부 시스템에 내재된 악성코드를 미리 감지하고 통신 네트워크를 통해 해당 악성코드가 확산되는 것을 방지하는 솔루션을 말한다. 워낙 촘촘하게 기기와 네트워크가 연결되다 보니 해킹에 노출되는 취약점도 덩달아 많아지게 되는데 마이크로세그멘테이션 보안이 도입되면 24시간 실시간으로 이를 탐지하고 큰 피해를 예방할 수 있다. 아카마이는 지난해 보안업체 가디코어를 인수하고 마이크로세그멘테이션 역량을 확장한 바 있다. 레이턴 CEO는 향후 가장 성장할 분야로 클라우드 보안 을 꼽았다. 자체 서버를 구축하는 것이 아니라 사용한 만큼 구독료를 내며 언제 어디서든 접속이 가능한 클라우드를 도입하는 기업이 점차 늘면서 이에 대한 보안 위협도 증가하고 있다. 레이턴 CEO는 이를 두고 복수 층위에서 보안에 신경을 써야 한다 고 조언했다. 클라우드와 연결되는 주변 기기 휴대폰 PC 등 클라우드에 접근 권한이 있는 임직원 기업 내 여러 서비스와 이와 연관된 통신 단계 애플리케이션 레이어 등이 모두 해커의 타깃이 될 수 있다. 각 단계에 따른 해킹 수법도 모두 다르다. 디도스 공격처럼 한 번에 트래픽을 많이 보내서 시스템을 무력화시키는 해킹이 활용되는 경우도 있지만 애플리케이션 레이어를 해킹할 때는 트래픽을 많이 발생시키지 않고 몰래 악성코드를 심어넣는 해킹 방식이 선호된다. 해킹의 목적도 단순히 시스템을 무력화시키는 것부터 데이터 유출 금품 갈취 등 다양하다. 레이턴 CEO는 이 모든 복수의 층위를 모두 신경 쓰면서 해킹으로 인한 피해를 막고 복원력을 기르는 것이 클라우드 보안의 핵심 이라고 강조했다. 레이턴 CEO는 지난 1분기 매출액을 살펴보면 보안과 컴퓨터 분야 매출이 이미 CDN 매출을 앞질렀다 며 보안 분야 매출이 급성장하고 있어서 앞으로 가장 큰 회사의 수익원이 될 것 이라고 밝혔다.\n", + "\n", + "### 답변: CC 톰 레이턴 아카마이 최고경영자 CEO·사진이 최근 매일경제와 인터뷰에서 전통적인 해킹 악성코드·디도스가 급증하고 있는 사이버 동향을 전하며 컴퓨팅·콘텐츠 전송까지 아우르며 전 세계에 걸쳐 보안 솔루션을 제공할 수 있다는 게 아카마이 보안의 장점 이라고 강조했다.<|endoftext|>\n", + "86 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 고승범 금융위원장 연합뉴스 자료사진 서울 연합뉴스 오주현 기자 고승범 금융위원장이 5일 퇴임하는 가운데 후임 김주현 금융위원장 후보자가 곧 임명 수순을 밟을지 관심이 쏠린다. 금융권에 따르면 고 위원장은 이날 오전 정부서울청사 별관에서 이임식을 연다. 지난해 8월 취임한 고 위원장은 재임 기간이 짧았지만 가계부채 급증 문제를 안정시켰다는 평가를 받는다. 금융사들에 가계부채 총량을 전년보다 5% 수준 이상 늘리지 않도록 주문하는 등 강력한 가계부채 총량 규제를 시행하고 총부채원리금상환비율 DSR 규제를 더욱 강화해 가계부채 저승사자 라는 별명을 얻기도 했다. 그는 소상공인 등 취약층에 대한 금융 지원 무질서한 가상자산 가상화폐 시장의 제도화 등에도 적극적인 역할을 했다는 평가를 받는다. 고 위원장은 이임사에서 그간의 소회를 밝히고 후배들에게 금융시장 안정이 훼손되지 않도록 가계부채 관리 등의 소임을 다 해줄 것을 당부할 예정이다. 고 위원장은 새 정부가 출범한 이후인 지난 5월 사의를 표명했으나 원 구성을 두고 여야가 대치하는 상황이 이어지며 사의를 표명한 지 약 두 달 만에 이임식을 하게 됐다. 윤석열 대통령은 전날 국회에 김주현 금융위원장 후보자에 대한 인사 청문보고서 송부를 재요청했다. 송부 기한인 오는 8일까지 인사청문회가 열리지 않으면 대통령 직권으로 임명할 수 있다. 전날 여야 합의로 국회의장단이 구성되면서 국회가 정상화 수순에 접어든 만큼 이르면 이번 주 중 청문회 일정이 확정될 가능성도 있다. 금융당국 관계자는 원 구성이 이번 주 내로 되지 않는다면 최근 교육부총리가 임명되는 등 선례를 볼 때 다음 주 초께 후임 금융위원장이 임명될 가능성이 있을 것으로 예상한다 고 말했다. 고 위원장이 퇴임하면서 금융위는 당분간 김소영 금융위 부위원장 대행 체제로 운영될 예정이다. 질문에 답변하는 김주현 금융위원장 후보자 서울 연합뉴스 김인철 기자 금융위원장 후보자로 지명된 김주현 여신금융협회 회장이 7일 오후 서울 중구 여신금융협회에서 열린 소감 발표 및 출입기자 간담회에서 취재진 질문에 답하고 있다.\n", + "\n", + "### 답변: 5일해 퇴임하는 고승범 금융위원장이 후임 김주현 금융위원장 후보자가 곧 임명 수순을 밟을지 관심이 쏠리는 가운데 금융권에 따르면 고 위원장은 그간의 소회를 밝히고 후배들에게 금융시장 안정이 훼손되지 않도록 가계부채 관리 등의 소임을 다 해줄 것을 당부할 예정이며 금융위는 당분간 김소영 금융위 부위원장 대행 체제로 운영될 예정이다.<|endoftext|>\n", + "87 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: NBA 2K23 에 등장하는 마이클 조던 모습 2K 제공 미국프로농구 NBA 역대 최고 스타인 마이클 조던이 NBA 2K 커버를 다시 장식했다. NBA 2K11 과 NBA 2K12 NBA 2K16 에 이은 네 번째 행보다. 미국 게임업체 2K는 등번호 23번으로 기억되는 마이클 조던이 NBA 2K23 스페셜 에디션인 마이클 조던 에디션과 챔피언십 에디션 커버에 등장한다고 6일 밝혔다. 마이클 조던은 선수 시절 NBA를 세계적인 현상으로 만들고 농구계에 막대한 영향을 끼친 인물이다. NBA 올스타 14회 기아 NBA MVP 5회 NBA 월드 챔피언 6회 기록을 세우며 네이스미스 농구 명예의 전당에 오르기도 했다. 2K는 올해 NBA 2K 24주년을 맞아 진행하는 캠페인 테마 위대함에 응하라 에 걸맞은 인물로 조던을 꼽았다. 엘피 브로디 NBA 2K 글로벌 마케팅 전략 부사장은 23을 스포츠에서 가장 눈에 띄는 숫자로 만든 역사를 생각하면 NBA 2K23에 마이클 조던 에디션을 선보이는 것은 더할 나위 없는 선택 이라고 했다. 2K는 조던의 빛나는 경력 중 15가지 상징적인 순간을 재현할 수 있는 조던 챌린지를 NBA 2K23 에 다시 도입했다. 이를 위해 NBA 2K11 오리지널 챌린지 10개를 모두 처음부터 다시 만들었다. 2K 측은 10년 이상 기술적 도약이 반영된 새로운 게임 플레이로 조던의 업적을 경험할 수 있다 고 했다. 발로 뛰는 더팩트는 24시간 여러분의 제보를 기다립니다.\n", + "\n", + "### 답변: 미국프로농구 NBA 역대 최고 스타인 마이클 조던이 NBA 2K 커버를 다시 장식했는데 선수 시절 NBA를 세계적인 현상으로 만들고 농구계에 막대한 영향을 끼친 인물로 올해 NBA 2K 24주년을 맞아 진행하는 캠페인 테마 위대함에 응하라에 걸맞은 인물로 조던을 꼽았다<|endoftext|>\n", + "88 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 당국 3세대백신 5천명분 계약 중…지자체서 원숭이두창 검사 시행 준비 치료제 물량 초기 대응에 충분…전국민 백신 접종 필요성 없어 국내 첫환자 상태 호전·양호…김남중 교수 사람두창보다 경미 사망률 과장돼 원숭이두창 감염병 주의 인천공항 안내 모니터 연합뉴스 자료사진 서울 연합뉴스 최인영 조민정 기자 원숭이두창 치료제인 테코비리마트 504명분이 오는 9일 국내에 도입될 예정이다. 또 원숭이두창 예방 효과가 있는 3세대 두창 백신 진네오스 5천명분 1만도즈 을 국내 공급하기 위한 계약도 진행 중이다. 중앙방역대책본부는 5일 원숭이두창 대응을 위해 치료제와 백신 도입을 추진하고 있다며 이같이 밝혔다. 당국은 치료제가 국내 도입되면 전국 17개 시도 지정 병원에 공급해 활용할 예정이다. 임숙영 방대본 상황총괄단장은 도입되는 치료제 물량은 초기 대응에 충분한 수준 이라며 향후 발생 양상을 고려하면서 필요하면 추가로 도입하겠다 고 말했다. 원숭이두창은 증상이 경미한 경우가 많아 원숭이두창 전용 치료제를 사용하지 않고도 증상이 호전되는 경우가 많다고 임 단장은 설명했다. 그러면서 국내 1호 원숭이두창 확진자도 전용 치료제 없이 상태가 많이 호전돼 현재 건강 상태가 양호하다고 밝혔다. 1명당 4주 간격으로 2회 접종하는 3세대 백신 진네오스는 현재 해외 제조사 바바리안 노르딕 와 공급 계약을 진행하고 있으며 계약이 완료되면 구체적인 도입 시기 등을 발표할 예정이다. 앞서 질병청은 진네오스 긴급도입을 요청했고 이에 식품의약품안전처는 국가필수의약품 안정공급협의회 심의를 거쳐 지난 1일 국내 긴급도입을 인정했다. 현재는 정부가 비축한 2세대 두창 백신을 활용해 원숭이두창 예방접종을 하고 있다. 임 단장은 원숭이두창의 전파방식과 전파력을 고려했을 때 백신을 일반 국민을 대상으로 광범위하게 접종할 필요성은 없다고 본다고 설명했다. 그러나 밀접접촉자는 14일 이내 접종해야 효과를 볼 수 있기 때문에 밀접접촉자 중심으로 한 포위접종 방식으로 접종을 진행할 예정이라고 밝혔다. 원숭이두창 관련 검역 강화된 공항 공동취재 원숭이두창은 전날 기준으로 59개국에서 6천157명이 확진된 것으로 확인된다. 국내 확진자는 1명이다. 질병청은 원숭이두창 24시간 종합상황실과 즉각대응팀을 설치하는 등 대응체계를 구축했다. 전국 시도에도 지역 방역대책반을 설치하고 지난달 27일과 이달 4일 시도 보건과장 회의를 개최해 중앙 지역 협조 체계를 다졌다. 질병청은 지난달 28일 지역사회 의심 환자 발생에 대비한 대응체계 점검 도상 훈련을 진행하고 지난달 28∼29일에는 의료진 대상 교육을 시행해 추가 원숭이두창 확진자 발생에 대비했다. 또 지자체 17개 보건환경연구원 검사 확대 계획을 수립해 숙련도 평가를 완료했다. 향후 진단검사시약을 배포해 지자체에서도 원숭이두창 검사를 할 수 있도록 준비하고 있다. 또 DUR 의약품안전사용서비스 과 ITS 해외여행력정보제공시스템 를 연계해 원숭이두창 발생 빈발 국가 5개국의 해외 여행력을 의료기관에 제공하도록 했다. 질병청은 이날 브리핑에 대한감염학회 이사장인 김남중 서울대병원 감염내과 교수를 초청해 원숭이두창에 대한 질의응답 시간을 가졌다. 김 교수는 원숭이두창이 코로나19와 같은 대유행을 일으킬 가능성을 묻는 말에 새로운 환자가 유입될 가능성은 충분히 있지만 밀접접촉에 의한 전파이기 때문에 코로나19 유행처럼 대유행을 일으킬 가능성은 아예 없다고 생각한다 고 답했다. 또 원숭이두창의 치명률이 3∼8%로 알려진 것과 관련 비풍토지역에서 5천명 이상의 환자가 발생했지만 사망자가 없다 며 면역이 저하된 분들이 걸릴 경우가 있을 수 있어 사망자가 앞으로도 0 일 것이라고 장담할 수는 없지만 사망률이 3%에 이른다고 하는 것은 과장됐다 고 강조했다. 그러면서 원숭이두창은 두창 사람두창 에 비해서도 경미한 질병으로 회복 후 반흔 흉 을 남기는 두창과 달리 원숭이두창은 회복 후 시간이 지나면서 반흔도 대부분 없어지는 것으로 알려져있다 고 설명했다. 질병청은 원숭이두창 발생 국가를 방문·여행하는 국민들에게는 현지에서 유증상자나 야생동물과 접촉을 피하고 마스크 착용 손 씻기 등 개인 위생수칙을 준수하는 것이 중요하다고 당부했다. 또 귀국 후 3주 이내 발열 오한 수포성 발진 등 의심 증상이 나타나면 동거인을 포함한 주위 사람들과 접촉하지 않도록 주의해야 하며 주소지 관할 보건소로 신속히 신고해야 한다고 강조했다.\n", + "\n", + "### 답변: 중앙방역대책본부는 증상이 경미한 경우가 많아 원숭이두창 전용 치료제를 사용하지 않고도 증상이 호전되는 경우가 많기 때문에 원숭이두창 치료제인 테코비리마트 504명분을 오는 9일 국내에 도입할 예정이며 향후 발생 양상을 고려하면서 필요하면 추가로 도입하겠다고 말했다.<|endoftext|>\n", + "89 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 게임업계 소통 간담회… 중국 판호 발급 확대 노력·주 52시간 근로 합리적 운영 문화체육관광부 장관 게임업계 소통 간담회 서울 연합뉴스 김주환 기자 1일 서울 강남구 한국게임산업협회에서 열린 게임업계 소통 간담회에 참석한 박보균 문화체육관광부 장관과 게임계 관계자들이 기념 촬영을 하고 있다. 2022.7.1 jujuk yna.co.kr 서울 연합뉴스 김주환 기자 박보균 문화체육관광부 문체부 장관이 취임 이후 처음으로 게임 업계 관계자들을 만난 자리에서 게임은 질병이 아니다 라며 업계의 규제를 풀겠다고 약속했다. 박 장관은 1일 서울 강남구 한국게임산업협회에서 열린 간담회 모두발언에서 게임은 늘 편견과 오해에 시달려왔다. 게임 과몰입을 질병으로 몰아가는 시선이 엄존한다 며 이런 뜻을 밝혔다. 이날 간담회에는 강신철 한국게임산업협회장 황성익 한국모바일게임협회장 정석희 한국게임개발자협회장 윤상규 한국VR·AR콘텐츠진흥협회장 게임산업협회 부회장사를 맡은 12개 게임 업체 대표 및 임원급 등이 참석했다. 박 장관은 K 콘텐츠라면 방탄소년단 BTS 이나 오징어 게임 등을 떠올리는데 글로벌 장악력을 따지면 단연 게임이 맨 앞에 있다 고 말했다. 그러면서 세계 게임시장 경쟁에서 필요한 인재를 키우고 기획·제작·유통 전 과정을 문체부에서 지원하겠다. 규제를 선도적으로 혁신하고 풀겠다 고 약속했다. 또 업계에서 요구하는 중국의 판호 발급 확대를 위해 외교부 경제 부처와 협력해 특별한 노력을 기울이겠다 며 주 52시간제의 합리적인 운영을 위해 지혜롭게 대처하겠다 고도 덧붙였다. 1시간가량 열린 이날 간담회는 참가자들이 돌아가며 한국 게임산업 현안과 산업 경쟁력 회복 방안 등을 이야기하는 방식으로 진행됐다. 간담회에서는 현재 게임 업계의 화두인 P2E Play to Earn·플레이로 돈 벌기 게임에 대한 규제를 완화해 달라는 건의가 나온 것으로 전해졌다. 박 장관은 이에 신기술과 사행성이라는 양면성이 있어 종합적 접근이 필요하다 는 원론적 답변을 내놓았다. 또 근무 시간 확대 요구에 대해서는 유연근무제 확장은 필요하나 판교의 등대 크런치 모드 에 대한 우려의 목소리도 있다 며 게임 업계가 선제적으로 대처해 달라고 주문했다. 이날 토론회에서는 현안과 관련한 구체적인 논의는 오가지 않은 것으로 전해졌다. 한 참석자는 토론회가 끝나고 대형 게임사만 참가해 상대적으로 약자인 중소 게임사들의 이야기가 전혀 나오지 않았다 며 아쉬움을 드러내기도 했다.\n", + "\n", + "### 답변: 박 장관은 1일 서울 강남구 한국게임산업협회에서 열린 간담회 모두발언에서 게임은 늘 편견과 오해에 시달려왔다며, 게임은 게임 과몰입을 질병으로 몰아가는 시선이 엄존하다며, 업계의 규제를 풀겠다고 약속했다.<|endoftext|>\n", + "90 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 파르나스 호텔 제주 숙박권 애플워치에어팟 세트 다이슨 에어랩 등 경품 이벤트도 진행 유통사 자체 페이 GS Pay의 론칭 1주년을 맞아 대고객 감사 이벤트가 열린다. GS리테일은 지난해 론칭한 GS Pay의 1주년을 기념하여 7월 한 달간 운영 중인 모든 채널에서 상상 이상의 간편결제 GS Pay 백만초월 페스티벌 행사를 진행한다. GS25는 GS Pay 사용 시 결제 건 당 GS POINT 100포인트 페이백 행사 최대 5천 원 한도 와 시원한 여름을 날 수 있도록 파우치 음료 1 1 행사를 진행한다. GS더프레시는 물가 안정을 위해 주차 별 생필품 위주의 계절과일 초복 상품 공산품 등에 대해 GS Pay 추가 할인 행사를 진행한다. GS샵은 Weekly GS Pay Day 를 통해 매주 1회 GS Pay 결제에 대한 카드 할인을 적용하며 GS프레시몰은 일주일 간 GS Pay로 7만 원 이상 결제 시 1만 점의 더팝 리워즈를 캐시백 하는 행사를 진행한다. 또한 GS리테일은 경품 이벤트도 선보인다. GS리테일 자회사인 파르나스에서 신규 오픈하는 파르나스 호텔 제주 숙박권 디럭스 2박 을 비롯해 애플워치 에어팟 프로 세트 다이슨 에어랩 스타일러 컴플리트 다이슨 슈퍼소닉 헤어드라이어 케니샤프 콜라보 굿즈 패키지 더팝 리워즈 5 000점 등 다양한 경품을 준비했다. 고객들은 GS리테일의 모든 채널에서 GS Pay를 한번 이상 사용한 후 더팝앱 이벤트 페이지를 통해 응모할 수 있다. GS Pay는 GS리테일이 KB국민은행 및 KG이니시스와 손잡고 선보인 간편 결제 시스템이다. 고객은 GS Pay에 신용카드나 결제 연동 계좌를 1회만 등록하면 GS리테일의 모든 채널에서 원클릭 결제만으로 편리한 쇼핑을 할 수 있다. 10만 원 이하 결제 시 비밀번호 입력 없이 원클릭만으로도 결제할 수 있는 서비스와 KB국민은행의 FDS Fraud Detection System이상금융거래탐지시스템 가 적용돼 업계 최고 수준의 편의성과 안전성도 갖췄다. 또한 계좌 연동 후 상시 2% 적립 행사상품 최대 20% 할인 매월 파격 행사 등 고객을 위한 혜택도 다양하다. GS리테일은 편의성 안전성 차별화 고객 혜택 등 GS Pay가 가지고 있는 다양한 강점들과 GS리테일의 온오프 전 채널에서 함께 사용 가능한 통합적 록인 Lock in 효과가 고객들이 GS Pay를 가입해 이용하고 있는 원인으로 분석하고 있다. 앞으로 GS리테일은 자회사 주요 계열사 제3자까지 GS Pay의 제휴 영역을 확대하고 결제 데이터 분석을 통한 고객 맞춤형 쇼핑 정보 제공 및 파격 할인 프로모션 등을 지속 선보여 GS Pay 사용 고객을 더욱 확대하고 더 많은 혜택을 제공할 방침이다. 조광현 GS리테일 전략마케팅팀 팀장은 GS리테일의 통합 및 GS Pay의 1주년을 기념하여 이용해주시는 모든 고객분들께 감사의 의미를 담아 혜택 가득한 GS Pay 백만초월 페스티벌 행사를 준비하게 됐다 라며 앞으로도 제휴 영역 확대 고객 맞춤형 쇼핑 정보 제공 할인 프로모션 등 GS Pay의 차별화 서비스를 강화해 고객에게 더 큰 만족을 드릴 수 있도록 최선의 노력을 다할 것 이라고 말했다.\n", + "\n", + "### 답변: G은행은 GS Pay의 1주년을 맞아 7월 한 달간 모든 채널에서 상상 이상의 간편결제 GS Pay 백만초월 페스티벌 행사를 열고 파르나스 호텔 제주 숙박권 디럭스 2박 등 애플워치 에어팟 프로 세트 다이슨 에어랩 프로 세트 다이슨 에어랩 스타일러 컴플리트 다이슨 슈퍼소닉 헤어드라이어 케니샤프 콜라보 굿즈 패키지 5 000점 등 경품 이벤트도 준비했다.<|endoftext|>\n", + "91 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 배재현 CIO 완전 매각은 루머 서울경제 카카오가 카카오모빌리티 지분 10%대를 매각해 2대 주주로 남는 방안을 검토한다. 매각안이 성사될 경우 MBK파트너스가 1대 주주로 올라서게 된다. 6일 정보기술 IT 업계에 따르면 배재현 카카오 최고투자책임자 CIO 는 이날 사내 공지를 통해 “카카오모빌리티 지분의 상당수를 매각하는 방안은 검토한 적 없다”며 “현재 검토 중인 방안은 지분 10%대를 매각해 2대 주주로 내려오는 지분변경 구조”라고 밝혔다. 당초 카카오는 40%대의 보유 지분을 MBK파트너스에 매각하는 방안을 검토하고 있는 것으로 알려졌으나 이같은 소문을 정면 반박한 것이다. MBK파트너스가 TPG·칼라일 등 재무적투자자 FI 보유 지분과 카카오 보유 지분을 모두 매입해 1대 주주로 올라설 것으로 전망된다. 지난 연말 기준으로 카카오모빌리티 지분은 △카카오 57.55% △TPG 29.04% △칼라일 그룹 6.21% 등 순이다. 카카오가 MBK에 최대 19% 지분을 매각해도 기존 지분 구조대로라면 1대 주주가 된다. 카카오는 자사가 최대주주에서 물러나야 카카오모빌리티의 기존 사업확장 기조를 이어갈 수 있다고 본다. 글로벌 경쟁에서 살아남으려면 본격적인 성장 드라이브가 필요한데 공익적 성격이 강한 카카오 공동체 안에선 이를 실현하기 어렵다는 판단이다. 다만 카카오 관계자는 “매각안이 확정된 것은 아니 라고 전했다. 한편 이날 카카오 노조 크루유니언 은 카카오 경영진과의 면담 결과를 공개하며 전 계열사 임직원을 대상으로 모빌리티 매각 반대 서명운동을 재개하겠다고 선언했다. 카카오 노조는 카카오가 모빌리티 사업을 이어나갈 의지가 없다 며 사회적 책임을 파기한 것 이라고 주장했다.\n", + "\n", + "### 답변: 6카카오는 40%대의 보유 지분을 MBK파트너스에 매각하는 방안을 검토하고 있으나 MBK파트너스가 TPG·칼라일 등 재무적투자자 FI 보유 지분과 카카오 보유 지분을 모두 매입해 1대 주주로 올라설 것으로 전망되며 현재 검토 중인 방안은 지분 10%대를 매각해 2대 주주로 내려오는 지분변경 구조라고 밝혔다.<|endoftext|>\n", + "92 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 네덜란드 ASML 본사 사옥. 로이터 연합뉴스 미국이 중국의 반도체 산업에 대한 제재의 수위를 높이고 있다. 그간의 고강도 제재에도 불구하고 중국의 반도체 굴기 가 오히려 더 속도를 내자 추가 압박을 가하는 것으로 분석된다. 5일 현지시간 블룸버그통신에 따르면 미국은 네덜란드의 대표적 반도체 장비 업체인 ASML에게 EUV 극자외선 노광장비에 이어 구형 장비인 DUV 심자외선 노광장비에 대해서도 중국 판매 금지를 요청했다. 블룸버그는 돈 그레이브스 미국 상무부 부장관이 5월 말부터 지난달 초까지 네덜란드와 벨기에를 방문했을 당시 공급망 이슈를 논의하며 중국 수출 문제를 언급했고 ASML 본사도 방문해 피터 베닝크 ASML CEO 최고경영자 를 만나 이와 같은 내용을 요청했다고 소식통들을 인용해 보도했다. 네덜란드 정부는 미국의 압박으로 ASML이 세계에서 유일하게 생산하는 EUV 장비의 중국 수출 승인을 내주지 않고 있는데 이 조치를 DUV까지 확대하기를 요구한 것이다. ASML은 반도체 웨이퍼 위에 회로 선폭을 새기는 노광 과정에 필요한 장비를 주로 생산한다. 이 중 EUV는 극자외선 파장의 빛을 이용하는 것으로 파장이 짧아 미세한 회로 구현에 용이하다. EUV 장비는 차세대 반도체 공정에 반드시 필요한 장비지만 현재까지는 5나노 이하 초미세공정이 필요한 시스템반도체 생산이나 10나노 초반대의 차세대 D램 등에서만 주로 쓰인다. 20나노 이상의 숙성 공정에서는 여전히 불화아르곤 ArF 을 사용하는 DUV 노광장비가 가장 일반적으로 사용된다. 미국은 일본 니콘에도 DUV 장비를 중국에 판매하지 못하게 금지해줄 것을 요청하고 있는 것으로 알려졌다. 이는 중국이 10나노 이상급 파운드리에서 괄목할 성장을 이어가고 있어서인 것으로 풀이된다. 대만 시장조사업체 트렌드포스에 따르면 중국 파운드리 반도체 위탁생산 를 대표하는 SMIC 화훙 넥스칩의 시장점유율 합계는 올해 1분기 처음으로 10%를 넘어섰다. 이들 3개사의 매출 합계는 33억2900만 달러에 이른다. 최근 국제반도체장비재료협회 SEMI 에 따르면 해외 반도체 생산장비 업체에 대한 중국의 장비 주문은 지난해에만 전년 대비 58% 증가하며 2년 연속 글로벌 1위를 기록했다. 블룸버그는 이 같은 중국의 반도체 자급화 움직임에 미국의 제재가 오히려 중국 반도체의 약진을 도왔다 고 언급하기도 했다.\n", + "\n", + "### 답변: 5일 그레이브스 미국 상무부 부장관이 5월 말부터 지난달 초까지 네덜란드와 벨기에를 방문했을 당시 공급망 이슈를 논의하며 중국 수출 문제를 언급했고 네덜란드의 대표적 반도체 장비 업체인 ASML에게 EUV 극자외선 노광장비에 이어 구형 장비인 DUV 심자외선 노광장비에 대해서도 중국 판매 금지를 요구한 것으로 전해지며, 그간의 고강도 제재에도 불구하고 중국의 반도체 굴기 가 오히려 더 속도를 내자 추가 압박을 가하는 것으로 분석된다.<|endoftext|>\n", + "93 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 박동주 기자 3일 서울의 한 재래시장. 이번 주 발표되는 6월 소비자물가 상승률이 6%대를 넘을 수 있다는 관측이 나온다. 전기·가스요금이 인상되고 추석 9월 10일 성수품 수요가 몰리는 7∼8월에는 물가 상승률이 더 높아질 가능성이 크다. 기저효과를 고려하면 후반기에는 물가 오름세가 다소 완화될 수 있다는 기대가 있지만 공공요금 상승과 러시아·우크라이나 전쟁 장기화 높은 기대인플레이션율 임금 상승 압력 등 물가 상승 요인이 산적해 있어 예단하기 어려운 상황이다.\n", + "\n", + "### 답변: 이요금 상승, 러시아·우크라이나 전쟁 장기화 높은 기대인플레이션율 임금 상승 압력 등 물가 상승 요인이 산적해 있어 예단하기 어려운 상황인데, 이번 주 발표되는 6월 소비자물가 상승률이 6%대를 넘을 수 있다는 관측이 나온다.<|endoftext|>\n", + "94 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 장 그루넨워드 퓨리나 AOA CEO 인터뷰 전세계 75개국과 함께하는 네슬레 퓨리나 반려동물도 가족’ 펫휴머니제이션 확산에 프로플랜 등 영양·면역까지 챙긴 제품 내놔 지속가능성·반려동물 복지 최우선 과제 재활용 포장재 등 2050년까지 탄소배출 ‘0’ 최근 MZ 세대를 중심으로 미닝아웃 트렌드가 빠르게 확산되고 있다. 미닝아웃은 신념을 뜻하는 미닝 과 자신의 정체성을 드러냄을 의미하는 커밍아웃 의 합성어다. 자신의 신념과 가치를 드러내는 소비활동으로 윤리적 소비의 일종이다. 미닝아웃 트렌드의 확산에 따라 기업의 사회적 책임을 요구하는 목소리 역시 커지고 있다. 이를 반영해 기업들도 착한 제품 을 개발해 연일 내놓고있다. 반려동물업계도 이러한 트렌드를 따라가고 있다. 특히 국내에서는 반려인구 1500만 시대를 맞아 양적 성장에서 질적 변화를 위한 시도들이 이어지고 있다. 지속가능한 미래를 위해 반려동물 업계는 재활용 포장재 사용 사료 업사이클링 반려동물 용품 등 다양한 친환경 제품들이 출시하고 있다. 세계적인 반려동물 식품기업 네슬레 퓨리나도 이러한 시장 변화에 맞춰 움직이고 있다. 자신의 신념과 가치를 드러내는 소비활동이 늘어나는 지금 네슬레 퓨리나는 어떤 방향으로 움직이고 있는지 아시아·오세아니아·아프리카 AOA 지역 최고경영자 CEO 인 장 그루넨워드 Jean Grunenwald·사진 의 이야기를 들어봤다. 그루넨워드 CEO는 펫산업계의 미래 키워드로 기업의 사회적 책임감 을 꼽으며 바로 오늘이 반려인과 반려동물 그리고 지구가 공존할 수 있는 지속가능한 시스템이 필요한 때 라고 강조했다. 다음은 그루넨워드 CEO와의 일문일답. ―네슬레 퓨리나는 어느 나라에 진출해 있는가. 국가별로 집중하는 전략과 제품이 다른지. 한국과 일본을 포함해 약 75개 국가에 진출해 있다. 우리의 전략은 제품을 이용하는 소비자들의 반려동물이 건강하고 오랜 시간 행복한 삶을 영위할 수 있도록 돕는 것이다. 역사적으로 펫케어 분야는 미국과 유럽 지역에서 먼저 발달했다. 반면 아시아는 앞으로 발전할 기회가 더 많다. ―코로나19가 반려동물 산업에 미친 영향은 무엇인가. 코로나19에 따른 재택근무 증가로 인해 반려동물을 삶에 들일 수 있는 환경이 조성됐다. 네슬레 퓨리나는 다양한 연구를 통해 사람이 반려동물과 함께 하는 것이 더 좋다는 것을 이야기해 왔다. 네슬레 퓨리나가 진행한 반려동물과 인간간 유대감 연구는 반려동물이 사회적 포용성을 촉진하고 외로움을 완화한다는 것을 보여줬다. 팬데믹 이후 맞춤형 영양 제품인 프로플랜과 퓨리나원의 면역력 증진용 제품 수요도 증가한 것으로 나타났다. ―미래 반려동물 산업은 어떻게 변화할 것이라 생각하는가. 반려동물 산업은 꾸준히 성장할 것이다. 펫 휴머니제이션 의 가속화에 따라 MZ세대를 비롯한 새로운 세대의 반려인들은 반려동물의 건강과 지속가능성 상호작용에 더 주의를 기울일 것으로 생각된다. 소비자들은 지속가능성을 검증하기 위해 더 많은 사료 제품을 검토하고 있다. 또 원료와 원료 공급의 투명성에 대한 기대를 품고 있다. 전세계 천연자원이 감소하면서 지속적으로 대체 자원을 찾는 노력이 필요해지고 있는 상황이다. 우리 데이터에 따르면 최근 소비자들 사이에서 대체식품과 대체단백질에 대한 선호도가 증가하고 있다. 퓨리나는 이러한 부분들을 고려하고 반영해 펫푸드 분야에서 지속적인 혁신을 이어 나갈 계획이다. 네슬레 퓨리나의 스마트 연계형 사료 용기 CHEKR ―글로벌 펫 시장의 주요 트렌드는 무엇인가. 특히 관심 가는 부분이 있다면. 반려동물이 중요한 가족 구성원으로 인식되고 있는 만큼 △반려동물이 섭취하는 음식 △건강 문제 △반려인의 경험과 같은 펫케어 부분이 트렌드를 주도할 것이다. 기술적인 관점에서 △오믹스 omics 기술 △빅데이터 △예측 지능의 사용과 △분자 영양학에 대해 집중 연구가 식품영양학을 빠르게 발전하게 했다. 그리고 △활력징후 관찰 △반려동물의 마이크로바이옴 분석 △고양이 배변 상태 분석과 같은 건강 필요에 맞춘 반려동물 기기들이 증가하는 추세다. 모두 반려동물들이 더 오래 더 건강하게 사는데 도움을 주고 있다. 반려인을 도와주는 기술의 한 가지 예시로 네슬레 퓨리나 펫케어 호주가 지난해 론칭한 스마트사료 용기인 체커 CHEKR 를 소개하고 싶다. 앱과 연동이 가능한 체커엔 벼룩 예방을 비롯 반려동물 치료 알림 기능이 내장됐다. 반려인들이 반려동물의 건강을 손쉽게 관리할 수 있도록 도움을 준다. ―네슬레 퓨리나가 주목하고 있는 펫푸드 트렌드가 있다면. 대부분의 반려인들은 제품을 구입시 각각 다른 특성의 사료를 찾는다. 네슬레 퓨리나의 포트폴리오는 반려동물에게 요리식 식사 경험부터 특정 영양분이 필요한 반려동물을 위한 수의사의 처방 식단에 이르기까지 다양하다. 반려동물을 사람처럼 대하는 펫 휴머니제이션의 시대의 영향으로 반려동물을 만족시킬 수 있는 고급 펫푸드 제품 시장이 성장하고 있다. 또한 반려동물이 더 오래 그리고 건강하게 삶을 살 수 있도록 건강학적 이점이 입증된 영양학적 솔루션에 대한 수요도 증가하고 있다. ―네슬레 퓨리나는 성장을 위해 어떤 면에 집중하고 있는가. 우리의 기본은 반려동물 제품을 생산하는 회사다. 항상 최고의 품질과 안전 기준을 갖춘 회사가 되고자 노력하고 있다. 또 건강과 맛 그리고 영양을 모두 챙긴 사료를 제공하기 위해 노력 중이다. 반려동물 복지가 네슬레 퓨리나의 최우선 관심사이자 과제다. 소비자들은 기업에게 투명성 정보공개 을 요구하고 있다. 자신의 구매 결정이 환경에 미칠 영향과 동물 복지 측면에 소비자들의 관심이 높아지고 있다. 그래서 지속가능성을 강조하고 있다. ―지속가능성을 위해 네슬레 퓨리나가는 어떤 노력을 하는지. 네슬레 퓨리나는 2030년까지 온실가스 배출량을 절반으로 줄이고 2050년까지 순배출 제로 0 에 도달하는 순배출 제로 와 2025년까지 포장재의 100%를 재활용 또는 새 플라스틱 사용을 3분의 1까지 줄이는 지속가능한 포장 2025년까지 지속 가능한 방법으로 모든 반려동물 사료의 재료를 조달할 것을 보장하는 지속가능한 소싱 공장 전체의 연간 물 사용량 감소를 목표로 하는 수자원 보호 등 4가지 분야에 힘쓰고 있다. 현재까지 포장재의 29.6%를 재활용 또는 재사용이 가능한 재질로 도입해 생산 중이며 올해까지는 포장재의 69%를 재활용 또는 재사용이 가능한 재질로 전환하는 것을 목표로 하고 있다.\n", + "\n", + "### 답변: 반 MZ 세대를 중심으로 신념과 가치를 드러내는 소비활동인 미닝아웃(신념을 뜻하는 미닝과 자신의 정체성을 드러냄을 의미하는 커밍아웃의 합성어)이 빠르게 확산되고 있으며 자신의 신념과 가치를 드러내는 소비활동이 늘어나는 지금 네슬레 퓨리나는 어떤 방향으로 움직이고 있는지 아시아·오세아니아·아프리카 AOA 지역 최고경영자 CEO 인 장 그루넨워드 Jean Grunenwald·사진 의 이야기를 들어봤다.<|endoftext|>\n", + "95 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 올해 연말 종료될 예정이었던 전기차와 수소차의 고속도로 통행료 감면 제도가 2년 연장됩니다. 국토교통부는 이 같은 내용이 담긴 유료도로법 시행령 개정안을 다음 달 11일까지 입법 예고한다고 밝혔습니다. 정부는 지난 2017년부터 미세먼지 저감과 친환경차 보급을 위해 전기차와 수소차의 고속도로 통행료를 절반 깎아주고 있습니다. 국토부는 또 밤 9시부터 다음 날 아침 6시까지 사업용 화물차와 건설기계의 통행료를 30∼50% 감면해주는 제도도 유가 상승으로 어려움을 겪는 화물업계를 지원하기 위해 연장했습니다.\n", + "\n", + "### 답변: 국차년 연말 종료 예정이었던 전기차와 수소차의 고속도로 통행료 감면 제도가 2년 연장되어 올해 연말 종료될 예정 이었던 전기차와 수소차의 고속도로 통행료 감면 제도가 올해 연말 종료 되며, 국토교통부는 이 같은 내용이 담긴 유료도로법 시행령 개정안을 다음 달 11일까지 입법 예고한다고 밝혔다.<|endoftext|>\n", + "96 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 사진 나이벡 펩타이드 융합 바이오 전문기업 나이벡 주가가 강세다. 4일 오후 1시10분 나이벡은 전 거래일 대비 700원 3.08% 오른 2만3400원에 거래되고 있다. 이날 나이벡은 펩타이드 기반 조직재생 바이오 소재 가 하반기 본격적인 임상에 진입할 계획이라고 밝혔다. 이번 임상은 4차 혁명 및 미래의료 선도과제 를 골자로 하는 범부처사업단 범부처 전주기 의료기기 연구개발 사업단 과 1·2차에 이어 3차년도 협약에 선정된 결과다. 나이벡은 50억원 규모의 정부출연금을 지원받아 서울대 치과병원 한국광기술연구원과 함께 조직재생 기능성 바이오 소재에 대한 연구개발을 진행해 왔다. 나이벡 관계자는 범부처사업단으로부터 3차년도 협약에 성공하지 못한 기업들도 상당하기 때문에 이번 조직재생 바이오 소재에 대한 3차년도 협약성공은 기술이전을 비롯한 제품 상용화에 있어 큰 의미가 있다 며 이미 글로벌 판매처로부터 기술이전을 비롯한 구매의사 확인을 받은 상태로 올해 하반기 임상 시험에 진입해 빠른 상용화를 위해 노력하겠다 고 말했다.\n", + "\n", + "### 답변: 펩타이드 기반 조직재생 바이오 소재가 하반기 본격적인 임상에 진입할 계획이라고 밝히자 펩타이드 융합 바이오 전문기업 나이벡의 주가가 강세여서 4일 오후 1시10분 나이벡은 전 거래일 대비 700원 3.08% 오른 2만3400원에 거래되고 있다.<|endoftext|>\n", + "97 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 앵커 코로나19 장기화로 가장 타격을 입은 분들이 바로 소상공인들이죠. 줄어든 매출을 회복하고 경영 환경을 개선해보려 해도 기반이 부족하다보니 어려움이 따르는 경우가 많습니다. 최근엔 소상공인들이 빅데이터와 SNS 등을 활용해 디지털 전환에 나서고 있다고 하는데요. 신현욱 기자가 취재했습니다. 리포트 서울의 한 아파트 단지 앞 호두과자 가게. 가게 주변의 유동인구 등 각종 자료를 바탕으로 상권을 분석해 봤습니다. 박수현 한국외대 경영학과 데이터를 봐도 퇴근 시간대에 2030 여성분들이 많이 지나가셔서. 그리고 저희가 현장조사 통해서도 혼자 많이 찾아서 오시는 분들이 많으셨는데... 그 결과를 바탕으로 제품을 소포장으로 바꾸고 개점 시간도 앞당기자 매출이 늘었습니다. 장 호 호두과자 가게 사장 영업시간을 당기면 어떻겠느냐 해서 여덟 시 반으로 당겼는데 의외로 출근하시는 분들이 많이 들러서... 이 상권 분석 플랫폼은 전국을 대상으로 한 무료 서비스인데 자료도 매일 갱신됩니다. 이종헌 KT 잘나가게 담당 상무 철저하게 소상공인한테 필요한 상권 입장에서 가장 적합한 것들을 저희가 이 플랫폼에 담으려고 기획을 했고요. 오늘 바나나 한 송이 천 원 드리고... 수십 년간 한 자리에서 장사를 이어온 전통시장 상인들. 갈수록 치열해지는 온라인 마케팅 적응이 쉽지 않습니다. 김수자 상인 온라인에 모르는 게 너무 많았어요. 이럴 때 전문가가 누군가가 좀 나를 도와줬으면 내가 이렇게 저렇게 치고 나갈텐데 하는 아쉬움이 많았어요. 이런 상인들에게도 최근 새로운 창구가 생겼습니다. 모바일 SNS를 통해 쉽게 홍보할 수 있는 채널 을 개설해 고객과 소통할 수 있게 된 겁니다. 육심나 카카오 ESG 사업실장 상인과 고객을 단골 개념으로 묶는 방법에 대해서 고민을 했습니다. 오늘 싸게 팔아요 그런 정보로 다가간다면 고객들한테도 되게 좋은 정보인 거고... 디지털 기술에 대한 소상공인들의 수요가 커지는 만큼 좀 더 체계적인 정부 지원이 필요하다는 지적이 나오고 있습니다. KBS 뉴스 신현욱입니다.\n", + "\n", + "### 답변: 최근로 소상공인들이 빅데이터와 SNS 등을 활용해 디지털 전환에 나서고 있지만 기반이 부족하다보니 어려움이 따르는 경우가 많아 디지털 기술에 대한 소상공인들의 수요가 커지는 만큼 좀 더 체계적인 정부 지원이 필요하다는 지적이 나오고 있다.<|endoftext|>\n", + "98 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 구미 사업장에 2023년까지 총 1조4000억원 투자 투자금 FC BGA와 카메라모듈 생산시설 구축에 활용 LG이노텍 구미사업장 전경 LG이노텍이 반도체기판 FC BGA 및 카메라모듈 생산기지 확대에 나선다. LG이노텍은 6일 구미시청에서 경상북도 및 구미시와 1조4000억원 규모의 투자협약 MOU 을 체결했다고 밝혔다. LG이노텍은 연면적 약 23만㎡에 달하는 구미 4공장 구 LG전자 A3 공장 인수를 포함해 구미 사업장에 2023년까지 총 1조4000억원을 투자한다. 투자금액은 FC BGA와 카메라모듈 생산을 위한 제조시설 구축에 쓰인다. LG이노텍은 내년 양산을 목표로 구미 4공장에 FC BGA 신규 생산라인을 구축해 나갈 방침이다. 지난 2월 시장 진출을 공식화한 FC BGA는 LG이노텍이 미래 성장동력으로 육성하는 분야다. FC BGA는 PC 서버 네트워크 등의 반도체칩을 메인기판과 연결해주는 반도체용 기판으로 글로벌 수요가 급증하는데 비해 기술력을 보유한 업체가 적어 공급 부족 현상이 지속되고 있다. 카메라모듈 생산시설 확대로 스마트폰용 카메라모듈 세계 1위 입지도 더욱 확고히 할 수 있게됐다. 카메라모듈은 LG이노텍의 매출을 이끄는 대표 사업분야다. 카메라모듈을 생산하는 광학솔루션사업부 매출은 지난해 기준 11조8000억원에 달한다. 특히 지난해에는 전년 대비 매출이 68%가량 늘었다. 6일 구미시청에서 LG이노텍이 경상북도 및 구미시와 투자 협약 MOU 을 체결했다. LG이노텍은 구미 4공장 인수를 포함해 구미 사업장에 2023년까지 총 1.4조원을 투자할 계획이다. 사진 왼쪽부터 이철우 경상북도 도지사 정철동 LG이노텍 사장 김장호 구미시장 LG이노텍은 기존에 운영중인 구미 1A 1 2 3공장에 이어 구미 4공장을 추가로 확보하며 총 5개 공장을 갖추게 됐다. LG이노텍 구미 사업장은 총 대지면적이 약 37만㎡로 축구장 52개를 합한 규모다. 이번 구미 투자로 인한 직·간접 고용 창출 효과는 총 1000여명에 이를 것으로 예상된다. 정철동 사장은 “이번 투자는 LG이노텍과 구미 지역사회 협력회사들이 동반성장 할 수 있는 좋은 기회”라며 “고객경험 혁신을 위한 적극적인 투자를 이어 나갈 것”이라고 말했다.\n", + "\n", + "### 답변: LG이노텍은 6일 구미시청에서 경상북도 및 구미시와 1조4000억원 규모의 투자협약 MOU 을 체결하여 구미 4공장 구 LG전자 A3 공장 인수를 포함해 구미 사업장에 2023년까지 총 1조4000억원을 투자하여 FC BGA 및 카메라모듈 생산기지 확대에 나선다.<|endoftext|>\n", + "99 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 산업부·조달청 정책설명회 정부가 중견기업을 우리 산업의 새로운 성장 엔진으로 육성하기 위해 이들이 생산하는 제품을 공공조달을 통해 적극적으로 활용·육성하기로 했다. 중견기업은 우리나라 전체 공공조달 계약 규모 184조원 중 26조3000억원을 담당하고 있다. 산업통상자원부는 조달청과 함께 1일 서울 마포구 한국중견기업연합회에서 중견기업을 대상으로 공공조달 정책설명회를 개최하고 중견기업 제품의 공공조달 강화방안을 논의했다고 밝혔다. 이날 설명회는 중견기업 지원에 대한 정부인식 제고를 위해 마련된 가운데 조달청은 새 정부의 공공조달 정책방향을 설명했고 참석자들은 중견기업의 공공조달 관련 애로 및 건의 사항을 전달했다. 이종욱 조달청장은 “중견기업은 공공조달 시장 전체 기업 수의 0.7% 3487개 에 불과하지만 우리나라 전체 공공조달 계약 규모 184조원 중 26조3000억원을 담당한다”며 “중견기업이 공공조달 시장에 보다 활발하게 참여하고 국내를 넘어 해외조달시장으로 뻗어나갈 수 있도록 다각적인 지원방안을 강구하겠다”고 말했다. 장영진 사진 산업부 제1차관은 “우리 경제 역동성·활력을 제고하기 위해서는 기업 성장사다리의 핵심 연결고리인 중견기업에 대한 정부 지원체계 강화가 필수적”이라며 “이번 설명회를 시작으로 향후 중견기업계의 주요 애로사항과 관련된 부처를 대상으로 지속적인 소통을 하겠다”고 말했다.\n", + "\n", + "### 답변: 우리통상자원부는 조달청과 함께 1일 서울 마포구 한국중견기업연합회에서 중견기업을 대상으로 공공조달 정책설명회를 개최해 새 정부의 공공조달 정책방향과 중견기업 제품의 공공조달 강화방안을 논의하며 공공조달을 통해 이들이 생산하는 제품을 공공조달을 통해 적극적으로 활용·육성하기로 했다.<|endoftext|>\n" + ] + } + ], + "source": [ + "# Input 길이가 2048이 넘어가는 경우 학습 불가로 인하여, 학습 전 제거. \n", + "\n", + "data = data.filter(lambda example: len(example[\"input_ids\"]) < 2048)\n", + "\n", + "for i in range(100):\n", + " print(i, data[\"test\"][i][\"text\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "jq0nX33BmfaC", + "outputId": "769fb34e-acd0-4a56-ac87-40db98dabd78" + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [516/516 11:46:33, Epoch 2/3]\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", + " \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", + " \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", + " \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", + "
StepTraining Loss
102.229200
202.079300
301.949600
401.910000
501.868200
601.839200
701.833700
801.816600
901.804500
1001.804700
1101.782000
1201.803200
1301.791400
1401.793100
1501.767300
1601.760000
1701.763900
1801.749000
1901.769100
2001.771400
2101.761100
2201.758400
2301.729500
2401.744700
2501.747400
2601.753500
2701.729000
2801.749100
2901.719400
3001.719500
3101.732600
3201.727000
3301.691300
3401.723000
3501.696300
3601.713600
3701.706200
3801.698000
3901.716800
4001.692400
4101.707800
4201.711800
4301.712400
4401.718600
4501.709600
4601.691500
4701.713000
4801.692000
4901.689300
5001.701500
5101.711500

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "TrainOutput(global_step=516, training_loss=1.7668058317761088, metrics={'train_runtime': 42472.8827, 'train_samples_per_second': 1.555, 'train_steps_per_second': 0.012, 'total_flos': 6.949269797826724e+17, 'train_loss': 1.7668058317761088, 'epoch': 3.0})" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import transformers\n", + "\n", + "# needed for gpt-neo-x tokenizer\n", + "tokenizer.pad_token = tokenizer.eos_token\n", + "\n", + "# For LLaMA\n", + "# tokenizer.pad_token_id = (\n", + "# 0 # unk. we want this to be different from the eos token\n", + "# )\n", + "\n", + "trainer = transformers.Trainer(\n", + " model=model,\n", + " train_dataset=data[\"train\"],\n", + " args=transformers.TrainingArguments(\n", + " per_device_train_batch_size=4,\n", + " gradient_accumulation_steps=32,\n", + " # warmup_steps=200,\n", + " # max_steps=500, ## 초소형만 학습: 10 step = 20개 샘플만 학습.\n", + " learning_rate=2e-4,\n", + " fp16=True,\n", + " logging_steps=10,\n", + " save_total_limit=3,\n", + " output_dir=\"outputs\",\n", + " optim=\"paged_adamw_8bit\"\n", + " ),\n", + " data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),\n", + ")\n", + "model.config.use_cache = False # silence the warnings. Please re-enable for inference!\n", + "trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "TvP11yUbhzWP", + "outputId": "96eb0cfe-e22f-4642-9fba-796942c62540" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "wow\n" + ] + } + ], + "source": [ + "print(\"wow\")" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "id": "a-jauOEv9XVe" + }, + "outputs": [], + "source": [ + "model.eval()\n", + "model.config.use_cache = True # silence the warnings. Please re-enable for inference!" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "r4ITTiXfp-2r", + "outputId": "e6376ea8-f293-4ca4-f9f3-13f231f5de07" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.8/site-packages/transformers/generation/utils.py:1264: UserWarning: You have modified the pretrained model configuration to control generation. This is a deprecated strategy to control generation and will be removed soon, in a future version. Please use a generation configuration file (see https://huggingface.co/docs/transformers/main_classes/text_generation )\n", + " warnings.warn(\n", + "/opt/conda/lib/python3.8/site-packages/transformers/generation/utils.py:1363: UserWarning: Using `max_length`'s default (20) to control the generation length. This behaviour is deprecated and will be removed from the config in v5 of Transformers -- we recommend using `max_new_tokens` to control the maximum length of the generation.\n", + " warnings.warn(\n", + "Input length of input_ids is 20, but `max_length` is set to 20. This can lead to unexpected behavior. You should consider increasing `max_new_tokens`.\n", + "/opt/conda/lib/python3.8/site-packages/transformers/generation/utils.py:1462: UserWarning: You are calling .generate() with the `input_ids` being on a device type different than your model's device. `input_ids` is on cpu, whereas the model is on cuda. You may experience unexpected behaviors or slower generation. Please make sure that you have put `input_ids` to the correct device by calling for example input_ids = input_ids.to('cuda') before running `.generate()`.\n", + " warnings.warn(\n", + "/opt/conda/lib/python3.8/site-packages/torch/utils/checkpoint.py:31: UserWarning: None of the inputs have requires_grad=True. Gradients will be None\n", + " warnings.warn(\"None of the inputs have requires_grad=True. Gradients will be None\")\n" + ] + }, + { + "data": { + "text/plain": [ + "tensor([[ 0, 835, 29871, 239, 170, 139, 31406, 29901, 29871, 31346,\n", + " 238, 141, 155, 29871, 238, 133, 163, 31781, 31081, 29973,\n", + " 29871]])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.generate(**tokenizer(\"### 질문: 오늘 날씨는?\", return_tensors='pt', return_token_type_ids=False))" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "id": "oDp9W-Gmp5Mb" + }, + "outputs": [], + "source": [ + "def gen(contents):\n", + " gened = model.generate(\n", + " **tokenizer(\n", + " f\"\"\"### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: {contents}\n", + "\n", + "### 답변:\"\"\",\n", + " return_tensors='pt',\n", + " return_token_type_ids=False\n", + " ),\n", + " max_new_tokens=256,\n", + " early_stopping=True,\n", + " do_sample=True,\n", + " eos_token_id=2,\n", + " no_repeat_ngram_size=8,\n", + " )\n", + " print(tokenizer.decode(gened[0]))" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 128 + }, + "id": "iIbK1GaipZd9", + "outputId": "46537a15-3bce-4959-860a-80706a8b3693" + }, + "outputs": [ + { + "ename": "NameError", + "evalue": "name 'gen' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[43mgen\u001b[49m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m네덜란드 ASML 본사 사옥. 로이터 연합뉴스 미국이 중국의 반도체 산업에 대한 제재의 수위를 높이고 있다. 그간의 고강도 제재에도 불구하고 중국의 반도체 굴기 가 오히려 더 속도를 내자 추가 압박을 가하는 것으로 분석된다. 5일 현지시간 블룸버그통신에 따르면 미국은 네덜란드의 대표적 반도체 장비 업체인 ASML에게 EUV 극자외선 노광장비에 이어 구형 장비인 DUV 심자외선 노광장비에 대해서도 중국 판매 금지를 요청했다. 블룸버그는 돈 그레이브스 미국 상무부 부장관이 5월 말부터 지난달 초까지 네덜란드와 벨기에를 방문했을 당시 공급망 이슈를 논의하며 중국 수출 문제를 언급했고 ASML 본사도 방문해 피터 베닝크 ASML CEO 최고경영자 를 만나 이와 같은 내용을 요청했다고 소식통들을 인용해 보도했다. 네덜란드 정부는 미국의 압박으로 ASML이 세계에서 유일하게 생산하는 EUV 장비의 중국 수출 승인을 내주지 않고 있는데 이 조치를 DUV까지 확대하기를 요구한 것이다. ASML은 반도체 웨이퍼 위에 회로 선폭을 새기는 노광 과정에 필요한 장비를 주로 생산한다. 이 중 EUV는 극자외선 파장의 빛을 이용하는 것으로 파장이 짧아 미세한 회로 구현에 용이하다. EUV 장비는 차세대 반도체 공정에 반드시 필요한 장비지만 현재까지는 5나노 이하 초미세공정이 필요한 시스템반도체 생산이나 10나노 초반대의 차세대 D램 등에서만 주로 쓰인다. 20나노 이상의 숙성 공정에서는 여전히 불화아르곤 ArF 을 사용하는 DUV 노광장비가 가장 일반적으로 사용된다. 미국은 일본 니콘에도 DUV 장비를 중국에 판매하지 못하게 금지해줄 것을 요청하고 있는 것으로 알려졌다. 이는 중국이 10나노 이상급 파운드리에서 괄목할 성장을 이어가고 있어서인 것으로 풀이된다. 대만 시장조사업체 트렌드포스에 따르면 중국 파운드리 반도체 위탁생산 를 대표하는 SMIC 화훙 넥스칩의 시장점유율 합계는 올해 1분기 처음으로 10\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124m를 넘어섰다. 이들 3개사의 매출 합계는 33억2900만 달러에 이른다. 최근 국제반도체장비재료협회 SEMI 에 따르면 해외 반도체 생산장비 업체에 대한 중국의 장비 주문은 지난해에만 전년 대비 58\u001b[39m\u001b[38;5;124m%\u001b[39m\u001b[38;5;124m 증가하며 2년 연속 글로벌 1위를 기록했다. 블룸버그는 이 같은 중국의 반도체 자급화 움직임에 미국의 제재가 오히려 중국 반도체의 약진을 도왔다 고 언급하기도 했다.\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", + "\u001b[0;31mNameError\u001b[0m: name 'gen' is not defined" + ] + } + ], + "source": [ + "gen('뉴스데스크 앵커 정부가 새 에너지 정책 방향을 오늘 국무회의에서 의결했습니다. 예상대로 원자력 발전의 비중을 더 늘리겠다고 했는데요 탄소 감축의 핵심인 석탄 화력발전소를 어떻게 줄일지 재생에너지를 어떻게 늘릴 지에 대해서는 발표하지 않았습니다. 먼저 배주환 기자가 보도합니다. 리포트 지난해 우리나라 발전에서 가장 큰 비중을 차지한 건 여전히 석탄화력발전입니다. 3분의 1이 넘습니다. 2위는 천연가스 29% 3위는 원전 27%입니다. 재생에너지의 비중은 7%에 불과합니다. 윤석열 정부는 원전의 비중을 2030년까지 30% 이상으로 늘리기로 했습니다. 문재인 정부가 24%로 낮추기로 한 것과 정반대입니다. 문재인 정부가 30%로 끌어올리겠다고 했던 재생에너지 비중에 대해서는 발표하지 않았습니다. 원전 비중을 30%까지 끌어올리는 방법은 수명연장입니다. 8년 뒤인 2030년 이전에 수명이 끝나는 원전은 10기. 정부는 이 10기의 수명을 모두 연장하기로 했습니다. 현재 건설 중인 신한울 1 2호기 신고리 5 6호기까지 더하면 2030년에 원전 28기를 돌리겠다는 겁니다. 김진 산업통상자원부 에너지전환정책과장 관련 산업의 경쟁력이나 생태계가 그래도 잘 구축돼 있으니 계속 강화를 하겠다는 게 정책 기조라고 보시면 될 것 같습니다. 히지만 이렇게 수명을 연장하고 가동률을 높이면 안전에 대한 우려가 생길 수 있습니다. 석광훈 에너지전환포럼 전문위원 물론 수명 연장을 위해서 설비 교체를 하겠지만 전반적인 설비의 노후화가 지금 진행이 되고 있기 때문에… 반면 탄소 배출 주범으로 꼽히는 석탄화력발전소를 어떻게 줄일지 신재생에너지는 얼마나 늘릴지에 대한 계획은 발표하지 않았습니다. 석탄화력은 합리적 감축 유도 재생에너지는 합리적 수준으로 조정 한다는 말이 전부였습니다. MBC뉴스 배주환입니다. 영상취재 박종일 영상편집 박병근 MBC 뉴스는 24시간 여러분의 제보를 기다립니다.')" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [], + "source": [ + "trainer.save_model(\"polyglot-ko_3.8b_news_3ep\")" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2.0.1+cu117'" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import torch\n", + "torch.__version__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "machine_shape": "hm", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.5" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "0a91d94890634dc1bb43176347c27fec": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "278070bfaaac4794a649f11306ad2947": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_5391d6d2385549319099d3bf653c34ee", + "IPY_MODEL_ee696f00718b43989f653dd01391a87d", + "IPY_MODEL_e39e4f5284224bfdbde4359d8593d206" + ], + "layout": "IPY_MODEL_0a91d94890634dc1bb43176347c27fec" + } + }, + "3473e65596d5455385269f59e6159e38": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "388757e992344b06b2fc7e4573eba77d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "416d78e5558f4019972720c8d52a410b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5391d6d2385549319099d3bf653c34ee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ec9d84f9337948cba5562b7e995bb2ef", + "placeholder": "​", + "style": "IPY_MODEL_3473e65596d5455385269f59e6159e38", + "value": "100%" + } + }, + "664f6a3720a446929197650580dd005d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "92e0594143bd4c2690dc3ddaa0170b17": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e39e4f5284224bfdbde4359d8593d206": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_664f6a3720a446929197650580dd005d", + "placeholder": "​", + "style": "IPY_MODEL_92e0594143bd4c2690dc3ddaa0170b17", + "value": " 1/1 [00:00<00:00, 9.41it/s]" + } + }, + "ec9d84f9337948cba5562b7e995bb2ef": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ee696f00718b43989f653dd01391a87d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_416d78e5558f4019972720c8d52a410b", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_388757e992344b06b2fc7e4573eba77d", + "value": 1 + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/Notebooks/Summerization/Model/polyglot-ko-5.8b_with_news.ipynb b/Notebooks/Summerization/Model/polyglot-ko-5.8b_with_news.ipynb new file mode 100644 index 0000000..7a22d8a --- /dev/null +++ b/Notebooks/Summerization/Model/polyglot-ko-5.8b_with_news.ipynb @@ -0,0 +1,1884 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "XIyP_0r6zuVc" + }, + "source": [ + "# `transformers` meets `bitsandbytes` for democratzing Large Language Models (LLMs) through 4bit quantization\n", + "\n", + "

\n", + "\"drawing\"\n", + "
\n", + "\n", + "Welcome to this notebook that goes through the recent `bitsandbytes` integration that includes the work from XXX that introduces no performance degradation 4bit quantization techniques, for democratizing LLMs inference and training.\n", + "\n", + "In this notebook, we will learn together how to load a large model in 4bit (`gpt-neo-x-20b`) and train it using Google Colab and PEFT library from Hugging Face 🤗.\n", + "\n", + "[In the general usage notebook](https://colab.research.google.com/drive/1ge2F1QSK8Q7h0hn3YKuBCOAS0bK8E0wf?usp=sharing), you can learn how to propely load a model in 4bit with all its variants.\n", + "\n", + "If you liked the previous work for integrating [*LLM.int8*](https://arxiv.org/abs/2208.07339), you can have a look at the [introduction blogpost](https://huggingface.co/blog/hf-bitsandbytes-integration) to lean more about that quantization method.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CHX-RCPdkXgP", + "outputId": "d294f833-6f45-4014-e4ed-75ef26141a0b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Sun Jul 16 12:52:16 2023 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 Tesla V100-PCIE... Off | 00000000:00:05.0 Off | Off |\n", + "| N/A 43C P0 37W / 250W | 0MiB / 32510MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FuXIFTFapAMI", + "outputId": "340f0ca7-6dfd-4350-b2d2-15f983adfc66" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.1.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.1.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.1.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.1.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n", + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m23.1.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m23.2\u001b[0m\n", + "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip install --upgrade pip\u001b[0m\n" + ] + } + ], + "source": [ + "# !pip install -q -U bitsandbytes\n", + "# !pip install -q -U git+https://github.com/huggingface/transformers.git\n", + "# !pip install -q -U git+https://github.com/huggingface/peft.git\n", + "# !pip install -q -U git+https://github.com/huggingface/accelerate.git\n", + "# !pip install -q datasets" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MJ-5idQwzvg-" + }, + "source": [ + "First let's load the model we are going to use - GPT-neo-x-20B! Note that the model itself is around 40GB in half precision" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 87, + "referenced_widgets": [ + "278070bfaaac4794a649f11306ad2947", + "5391d6d2385549319099d3bf653c34ee", + "ee696f00718b43989f653dd01391a87d", + "e39e4f5284224bfdbde4359d8593d206", + "0a91d94890634dc1bb43176347c27fec", + "ec9d84f9337948cba5562b7e995bb2ef", + "3473e65596d5455385269f59e6159e38", + "416d78e5558f4019972720c8d52a410b", + "388757e992344b06b2fc7e4573eba77d", + "664f6a3720a446929197650580dd005d", + "92e0594143bd4c2690dc3ddaa0170b17" + ] + }, + "id": "jm4FzCvfeYcK", + "outputId": "bf40f8d2-7603-407d-fba5-6686eddd49aa" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Found cached dataset csv (/opt/ml/.cache/huggingface/datasets/daekeun-ml___csv/daekeun-ml--naver-news-summarization-ko-314b3fce3cddf558/0.0.0/eea64c71ca8b46dd3f537ed218fc9bf495d5707789152eb2764f5c78fa66d59d)\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "ea67a0b47e32417fa4f28fff99a80cff", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/3 [00:00\" }\n", + "# if x['input'] else\n", + "# {'text':f\"### 명령어: {x['instruction']}\\n\\n### 답변: {x['output']}<|endoftext|>\"},\n", + "# )\n", + "# data\n", + "# data = data.map(\n", + "# lambda x: {'text':f\"### 명령어: {x['instruction']}\\n\\n### 답변: {x['output']}<|endoftext|>\"},\n", + "# )\n", + "data = data.map(\n", + " lambda x: {'text': f\"### 질문: 아래의 문서를 요약해줘.\\n\\n###맥락: {x['document']}\\n\\n### 답변: {x['summary']}<|endoftext|>\" }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "E0Nl5mWL0k2T", + "outputId": "e601d45a-99f5-46ff-aecf-497ed8754c24", + "scrolled": true + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "448ae43419324273bcb34c35f037eb9c", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Loading checkpoint shards: 0%| | 0/13 [00:00'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tokenizer.decode(data[\"train\"][0][\"input_ids\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "a9EUEDAl0ss3" + }, + "outputs": [], + "source": [ + "from peft import prepare_model_for_kbit_training\n", + "\n", + "model.gradient_checkpointing_enable()\n", + "model = prepare_model_for_kbit_training(model)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "gkIcwsSU01EB" + }, + "outputs": [], + "source": [ + "def print_trainable_parameters(model):\n", + " \"\"\"\n", + " Prints the number of trainable parameters in the model.\n", + " \"\"\"\n", + " trainable_params = 0\n", + " all_param = 0\n", + " for _, param in model.named_parameters():\n", + " all_param += param.numel()\n", + " if param.requires_grad:\n", + " trainable_params += param.numel()\n", + " print(\n", + " f\"trainable params: {trainable_params} || all params: {all_param} || trainable%: {100 * trainable_params / all_param}\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Ybeyl20n3dYH", + "outputId": "327a4a63-db3d-4631-edec-23f8d08d14ac" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "trainable params: 3670016 || all params: 3070156800 || trainable%: 0.11953838970048696\n" + ] + } + ], + "source": [ + "from peft import LoraConfig, get_peft_model\n", + "\n", + "config = LoraConfig(\n", + " r=8,\n", + " lora_alpha=16,\n", + " target_modules=[\"query_key_value\"],\n", + " # target_modules=[\"q_proj\", \"v_proj\"],\n", + " lora_dropout=0.05,\n", + " bias=\"none\",\n", + " task_type=\"CAUSAL_LM\"\n", + ")\n", + "\n", + "model = get_peft_model(model, config)\n", + "print_trainable_parameters(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FCc64bfnmd3j" + }, + "source": [ + "Let's load a common dataset, english quotes, to fine tune our model on famous quotes." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "s6f4z8EYmcJ6", + "outputId": "21c8ba2d-fd89-40f3-f0b6-c73772f06bf2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", + "To disable this warning, you can either:\n", + "\t- Avoid using `tokenizers` before the fork if possible\n", + "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", + "Sun Jul 16 05:33:59 2023 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 Tesla V100-PCIE... Off | 00000000:00:05.0 Off | Off |\n", + "| N/A 42C P0 36W / 250W | 8969MiB / 32510MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_0MOtwf3zdZp" + }, + "source": [ + "Run the cell below to run the training! For the sake of the demo, we just ran it for few steps just to showcase how to use this integration with existing tools on the HF ecosystem." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Loading cached processed dataset at /opt/ml/.cache/huggingface/datasets/daekeun-ml___csv/daekeun-ml--naver-news-summarization-ko-314b3fce3cddf558/0.0.0/eea64c71ca8b46dd3f537ed218fc9bf495d5707789152eb2764f5c78fa66d59d/cache-47034d0ac73651fd.arrow\n", + "Loading cached processed dataset at /opt/ml/.cache/huggingface/datasets/daekeun-ml___csv/daekeun-ml--naver-news-summarization-ko-314b3fce3cddf558/0.0.0/eea64c71ca8b46dd3f537ed218fc9bf495d5707789152eb2764f5c78fa66d59d/cache-aacfee1ed30f286a.arrow\n", + "Loading cached processed dataset at /opt/ml/.cache/huggingface/datasets/daekeun-ml___csv/daekeun-ml--naver-news-summarization-ko-314b3fce3cddf558/0.0.0/eea64c71ca8b46dd3f537ed218fc9bf495d5707789152eb2764f5c78fa66d59d/cache-3df8271a95a9ab8f.arrow\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 아이엘사이언스의 자회사 아이트로닉스는 차량용 복합기능형 졸음 방지 단말기 특허를 출원했다고 4일 밝혔다. 신규 특허는 자동차 주행 중 운전자의 졸음운전을 방지하는 상태 검출 기술에 관한 것이다. 해당 단말기는 가시광선 및 근적외선 광원을 조사하는 광원 모듈 운전자의 얼굴 영상을 촬영하는 가시광선 및 근적외선 카메라 차량 실내의 이산화탄소 농도를 측정하는 이산화탄소 센서로 구성됐다. 단말기는 광원에 반응하는 운전자의 얼굴 촬영 영상을 기반으로 심박 데이터와 눈의 깜빡임 횟수 눈을 감은 시간 등을 측정한다. 여기에 차내 졸음을 유발하는 이산화탄소 농도까지 종합적으로 분석해 운전자의 졸음 상태를 판단하고 결과값에 따라 경보 신호를 송출하도록 설계됐다. 아이트로닉스는 이번 특허기술을 차세대 지능형 교통체계 C ITS 시스템 설비에 적용할 예정이다. 회사 관계자는 이번 특허는 대표적인 차량 내적 사고 요인인 졸음운전 방지 차원에서 당사의 혁신 기술력을 집약해 정확도를 높이는 데 집중했다 며 완전 자율주행 단계에 이르기 전까지 지속될 운전자 안전사고 예방에 있어 해당 기술의 가시적인 성과를 기대하고 있다 고 말했다.\n", + "\n", + "### 답변: 아이일, 아이트로닉스는 차량용 복합기능형 졸음 방지 단말기 특허를 출원했다고 4일 밝혔으며 신규 특허는 자동차 주행 중 운전자의 졸음운전을 방지하는 상태 검출 기술에 관한 것으로, 해당 단말기는 가시광선 및 근적외선 광원을 조사하는 광원 모듈 운전자의 얼굴 영상을 촬영하는 가시광선 및 근적외선 카메라 차량 실내의 이산화탄소 농도를 측정하는 이산화탄소 센서로 구성됐다.<|endoftext|>\n", + "1 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 한국형 우주발사체 누리호 가 지난 6월 21일 전남 고흥 나로우주센터 발사대에서 날아올라 성공적으로 발사됐다. 한국항공우주연구원 제공 파이낸셜뉴스 한국형 우주발사체 누리호 의 발사 성공에 힘입어 뉴스페이스 시대를 앞당기기 위한 발걸음이 빨라졌다. 우선 누리호를 설계하고 제작 발사하는 기술을 이전받을 기업을 9월까지 선정키로 했다. 또한 민간 우주기업들을 위한 산업단지와 각종 인프라가 들어설 우주산업 클러스터가 조성될 지역을 8월중 선정할 계획이다. 이같은 계획에 앞서 윤석렬 대통령은 지난 6일 한국항공우주연구원에서 우리의 미래가 국가 경쟁력의 핵심 분야인 우주에 달려 있다 며 항공우주산업을 체계적으로 지원하겠다고 밝혔다. 이는 대선후보시절부터 내세웠던 공약을 이행하겠다는 의지를 표명한 것이다. 누리호 기술 민간에 이전 과학기술정보통신부는 7일 이를위해 제42회 우주개발진흥실무위원회를 개최하고 한국형발사체 고도화사업 체계종합기업 선정 계획과 우주산업 클러스터 추진계획을 확정했다. 과기정통부 오태석 제1차관은 이날 우주개발진흥실무위원회에서 누리호 2차 발사 성공을 통한 국민적 지지 확보와 우주개발진흥법 개정을 통한 제도적 기반 마련 국정과제 반영 등 정부의 강력한 정책 의지가 엿보인다 며 지금이 우리나라 우주산업 육성의 골든타임이라고 판단된다 고 말했다. 과기정통부는 지난 6월 국내 우주산업 육성을 위한 우주개발진흥법 개정과 누리호 2차 발사 성공 등에 발맞춰 뉴스페이스 시대를 앞당기겠다는 윤 대통령의 의지를 뒷받침하고 있다. 우선 과기정통부는 한국형발사체 고도화사업의 일환으로 체계종합기업을 선정한다. 한국형발사체 고도화사업은 올해부터 2027년까지 총 6874억원을 투입해 누리호를 4차례 반복 발사하면서 누리호의 신뢰성을 높인다. 이때 발사체 체계종합기업에 선정된 기업은 이 기간동안 한국항공우주연구원으로부터 발사체의 설계와 제작 발사 등 전과정에 참여하면서 기술을 이전받게 된다. 과기정통부는 한국연구재단을 통해 체계종합기업 선정을 위한 기술능력 평가위원회를 꾸려 평가할 계획이다. 우주산업 클러스터 8월중 선정 또한 실무위원회에서는 우주산업 클러스터 추진계획을 확정했다. 이는 뉴스페이스 시대에 대비 민간이 주도하는 우주산업 본격 육성을 목적으로 발사체 특화지구와 위성 특화지구 지정이 주요 골자다. 과기정통부는 계획안에 맞춰 발사체와 위성 특화지구의 최적 후보지를 8월중 국가우주위원회 심의를 거쳐 최종 선정키로 했다. 이를 위해 오는 9월 중 우주산업클러스터 세부 사업의 예비타당성 조사를 신청키로 했다. 예타가 성공적으로 마무리되면 내년에 예산안을 마련해 2024년부터는 본격적으로 클러스터 구축 사업에 착수할 계획이다. 과기정통부가 정한 특화지구 지정원칙에 따르면 지역균형을 고려해 특화지구 지정때 수도권은 후보지에서 제외된다. 또한 관련 인프라가 이미 구축돼 있는 지역을 우선 검토할 예정이다. 우주산업 클러스터는 기존 인프라를 중심으로 조성해 국가 우주자산 활용을 극대화한다느 전략이다. 여기에 산업단지 조성과 연구개발 등의 지원을 통해 산업체 유치와 혁신 역량을 강화한다. 발사체 특화지구에는 발사체 산업단지와 조립·제작 창업 등을 지원하는 종합지원센터가 구축된다. 또 위성 특화지구에는 위성 산업단지와 인공위성과 관련된 시험인증 창업 지원등을 위한 지원종합지원센터가 들어서게 된다.이와함께 궤도나 발사 전자파 등 우주환경 시험 시설까지 확충할 계획이다. 이외에도 지역 대학 등과 연계해 거점별 특화된 전문 인력을 상시 공급하는 계획도 포함돼 있다.\n", + "\n", + "### 답변: 한국형 우주발사체 누리호가 지난 6월 21일 전남 고흥 나로우주센터 발사대에서 성공적으로 발사됨에 따라, 우주산업 클러스터가 조성될 지역을 8월중 선정하는 등 누리호 설계 및 제작 발사하는 기술의 이전으로 뉴스페이스 시대를 앞당기기 위한 계획이 빨라지고 있다.<|endoftext|>\n", + "2 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 닥터둠 루비니 주가 50% 폭락할 것 뉴욕 증시 3대지수 모두 하락 대형주 중심의 미국 스탠더드앤드푸어스 S P 500 지수가 올 상반기 50여년만에 최악의 실적을 기록했다. 30일 이하 미국 현지시간 뉴욕 증시 3대 지수는 모두 하락하며 부진한 상반기 실적으로 마감했다. 일각에서는 경기침체 우려로 인해 추가 하락이 올 수 있다는 경고 메시지가 나오고 있다. 30일 뉴욕 증시에선 이번주 들어 4일 연속 하락장을 기록했다. 뉴욕증권거래소 NYSE 에서 다우존스 산업평균지수는 전장보다 253.88포인트 0.82% 하락한 30 775.43으로 거래를 마쳤다. S P500지수는 전장보다 33.45포인트 0.88% 하락한 3 785.38을 기술주 중심의 나스닥 지수는 전장보다 149.16포인트 1.33% 하락한 11 028.74로 장을 마감했다. 올해 상반기 마지막 거래일인 이날 뉴욕 증시 3대 지수는 모두 크게 저조한 실적을 기록했다. S P500의 경우 연초 기준으로 21.08% 하락했는데 이는 52년 전인 1970년 상반기 이후 가장 낮은 수준이다. 분기 기준으로 보면 다우와 S P500은 지난 2020년 1분기 이후 최저 기술주 중심의 나스닥은 2분기에만 22.4%가 빠졌는데 이는 2008년 이후 최악의 분기 실적이다. 홈리치 버그의 최고투자책임자 스테파니 랭은 우리는 전례없는 전염병으로 인해 세계적인 셧다운을 경험했고 재정과 통화 부문에서 모두 전례없는 결과로 이어졌다 면서 수요와 공급 부문에 퍼펙트 스톰이 불어닥쳤고 이제 수십년만에 다시 찾아오는 인플레이션으로 인해 미국 연방준비제도 연준·Fed 가 금리인상으로 바빠졌다 고 말했다. 이날 개별 종목을 보면 다우에서 약국 월그린 부츠 얼라인어스가 7.2%로 크게 하락했다. 이는 월그린이 주당 이익률을 낮췄기 때문이다. 아울러 경기침체 우려로 인해 여행 관련주들이 연속해서 하락했다. 크루즈 선사 카니발은 2% 이상 로열 캐리비언과 노로웨이 크루즈 라인도 각각 3% 이상씩 빠졌다. 이른바 닥터둠 으로 불리는 비관론자 누리엘 루비니 뉴욕대 교수는 주가가 50% 폭락할 것이라고 예상했다. 루비니 교수는 이날 마켓워치 기고문을 통해 이번에 찾아올 경기침체는 스테그플레이션과 금융위기를 동시에 동반하기 때문에 증시 하락은 50%에 이를 것 이라고 말했다. 그는 경기침체가 강할지 약할지 관계없이 역사적으로 보면 증시가 추락할 여지가 매우 크다 면서 이런 맥락에서 최근 1 2주간 보인 반등은 데드캣 바운스 에 불과하다 고 강조했다. 데드캣 바운스는 주가가 큰 폭으로 떨어지다가 잠깐 반등하는 상황을 비유할 때 쓰이는 말이다. 월가 투자정보는 유튜브 월가월부 에서 확인하세요. 자세한 해외 증시와 기업 분석 정보를 매일경제 해외 특파원들이 생생하게 전달해 드립니다.\n", + "\n", + "### 답변: 대 대형주 중심의 미국 스탠더드앤드푸어스 S P 500 지수가 올 상반기 50여년만에 최악의 실적을 기록하고 30일 이하 미국 현지시간 뉴욕 증시 3대 지수도 모두 하락하며 부진한 상반기 실적으로 마감한 가운데 일각에서는 경기침체 우려로 인해 추가 하락이 올 수 있다는 경고 메시지가 나오고 있다.<|endoftext|>\n", + "3 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 파이낸셜뉴스 풀무원식품은 알래스카 청정해역의 신선한 명태살로 만든 연육을 바삭하게 튀겨낸 ‘볼카츠’를 출시했다고 5일 밝혔다. 신제품 ‘볼카츠’ 2종 통통새우 에그포테이토 은 깨끗한 자연환경으로 잘 알려진 알래스카에서 자란 고품질의 명태 연육을 동그랗게 빚은 후 빵가루를 묻혀 튀겨 내 차별화한 프리미엄 간편식이다. 7㎜ 크기 입자의 습식 빵가루를 사용해 겉은 바삭하고 속은 촉촉한 식감을 살렸다. 여기에 건강한 바다 단백질을 함유한 명태살과 잘 어울리는 새우 계란 감자 등을 더했다. ‘통통새우 볼카츠’는 큼직하고 통통한 흰다리새우를 명태 연육과 함께 빚어 쫄깃한 식감이 특징이다. 흔히 사용되는 작은 새우 대신 71 90미 크기의 흰다리새우를 사용해 쉽게 부서지지 않고 탱탱하게 씹히는 식감을 살렸다. ‘에그포테이토 볼카츠’는 삶은 달걀을 큼직하게 썰고 감자 샐러드를 섞어 만든 스프레드로 명태 연육을 감싸 고소하고 담백한 맛을 살린 제품이다. 고로케를 연상시키는 듯한 맛과 식감으로 든든한 간식은 물론 간편 안주 메뉴로 제격이다. 신제품 ‘볼카츠’는 냉동 가정간편식 HMR 으로 보관과 조리가 편리하다. 에어프라이어 8분이면 가정에서도 손쉽게 바삭한 튀김을 완성할 수 있다. 풀무원식품 박정욱 어묵PM은 “볶음이나 탕 요리를 위한 사각형 또는 봉 형태 제품이 대부분이던 어묵 시장에 새로운 카테고리를 제시하기 위해 이번 프리미엄 신제품을 기획하게 됐다”며 “맛과 영양은 물론 조리 방법도 간단한 만큼 보다 많은 소비자들이 집에서도 간편하게 맛있는 ‘볼카츠’를 맛보길 바란다”라고 말했다.\n", + "\n", + "### 답변: 5일 5일 풀무원식품은 알래스카 청정해역의 신선한 명태살로 만든 연육을 동그랗게 빚은 후 빵가루를 묻혀 튀겨낸 '볼카츠'와 명태 연육을 감싸 고소하고 담백한 맛을 살린 '에그포테이토 볼카츠'를 출시했다고 밝혔다.<|endoftext|>\n", + "4 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 강덕원 일동제약 생산본부장. 일동제약 제공 일동제약은 생산본부장으로 강덕원 부사장을 영입했다고 지난 1일 밝혔다. 강덕원 본부장은 서울대학교와 서던캘리포니아대학교 USC 를 졸업하고 동대학원에서 생화학 및 분자생물학 석사학위를 취득했다. 이후 캘리포니아에 위치한 스태슨제약 지그프리트컴퍼니의 얼라이언스 메디컬 프로덕트 삼성바이오에피스 GC녹십자 등에서 QC와 GMP 등의 업무를 담당했다. 일동제약 관계자는 강 본부장은 다년간의 글로벌 GMP 근무경력과 전문지식을 바탕으로 생산과 품질체계를 더욱 강화하고 특히 cGMP 기준의 생산시설 구축도 추진하게 될 것 이라고 말했다.\n", + "\n", + "### 답변: 일동제약은 생산본부장으로 강덕원 부사장을 영입했다고 지난 1일 밝혔으며 강덕원 본부장은 서울대학교와 서던캘리포니아대학교 USC 를 졸업하고 동대학원에서 생화학 및 분자생물학 석사학위를 취득했으며 이후 글로벌 GMP 근무경력과 전문지식을 바탕으로 생산과 품질체계를 더욱 강화하고 cGMP 기준의 생산시설 구축도 추진하게 될 것이라고 말했다.<|endoftext|>\n", + "5 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: KIST강릉천연물연구소 등 5일 기업 지원·경제활성화 앞장 약속 한국과학기술연구원 KIST 로고 한국과학기술연구원 제공 한국과학기술연구원 KIST 로고 강릉 연합뉴스 유형재 기자 한국과학기술연구원 이하 KIST 강릉천연물연구소 한국생산기술연구원 강원본부 한국기초과학지원연구원 춘천센터 농업회사법인 커피커퍼가 5일 커피 산업 발전을 위한 업무협약을 체결한다. KIST 강릉천연물연구소에서 열릴 협약식에서 참석 기관들은 힘을 모아 애로 기술 해결 및 지역경제 활성화에 앞장서기로 약속할 예정이다. 그간 커피 산업 발전을 위해 많은 중소기업이 연합해 커피협회를 구성하고 매년 커피축제를 진행하고 있으나 대부분 소규모 기업으로 구성돼 소비자의 이해를 돕기 위한 제품 간 특성 표시 및 제품 품질 표준화에 대한 과학적 근거가 부족했다. 또 커피 품질을 높이기 위한 기술 개발도 절실한 상황이다. 아세안 카페 산업 세미나 연합뉴스 자료사진 이들 기관은 이러한 문제를 해결하기 위해 보유한 기술을 활용하고 나아가 커피 부산물 활용방안을 제시해 이를 기반으로 하는 친환경 소재 개발에 힘쓸 예정이다. 각 기관의 협력으로 기업매출 확대 일자리 창출뿐만 아니라 기업의 애로 기술 해결을 위한 산·연 협력 모델 구축으로 강원지역의 더 많은 기업의 애로 기술을 효율적으로 해결하고 지역경제 활성화에 일익을 담당할 것으로 전망한다. 장준연 KIST 강릉천연물연구소 분원장은 4일 이번 협약으로 지역 커피 관련 기업 지원에 시너지 효과를 높일 기회가 될 것으로 기대한다 고 말했다.\n", + "\n", + "### 답변: 5일 기술회사인 커피커퍼가 KIST 강릉천연물연구소와 5일 커피 산업 발전을 위한 업무협약을 체결함에 따라 기업매출 확대 일자리 창출뿐만 아니라 더 많은 기업의 애로 기술 해결을 위한 산·연 협력 모델 구축으로 지역경제 활성화에 일익을 담당할 것으로 예상된다.<|endoftext|>\n", + "6 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 매매 수수료 절감 목적도 펀드에서 주식을 매매하는 빈도를 뜻하는 매매 회전율이 5년 만에 최저치를 기록했다. 연초부터 이어진 약세장에 기관투자자들이 상품을 방어적으로 운용하고 나선 영향으로 풀이된다. 6일 한국펀드평가에 따르면 지난 2분기 기준 국내 공모펀드의 연평균 매매 회전율은 141.48%였다. 코로나19 이후 주식시장이 강세를 보였던 2020년 200%대까지 치솟았던 회전율은 지난해까지만 해도 180 190%대에서 움직였다. 전년 동기 회전율은 184.77% 수준이었다. 그러나 올해 들어 수치가 급락했다. 140%대까지 떨어진 것은 2017년 이후 5년 만이다. 매매 회전율은 펀드 내 주식 거래대금을 운용자산으로 나눈 값이다. 예컨대 운용자금이 100억원인 펀드 A에서 연 200%의 회전율을 보였다면 1년 새 200억원의 주식이 손바뀜됐다는 뜻이다. 표면적으로 회전율은 펀드 수익률과 직접적인 연관성은 없으나 매매가 잦을수록 수수료 등 펀드 내 비용이 올라가 성과를 갉아먹을 위험도 있다. 전문가들은 올해 회전율이 떨어진 것은 공모펀드 침체 영향이 크다고 진단했다. 김도형 삼성자산운용 ETF컨설팅팀장은 올해 주식시장이 약세장으로 접어들면서 공모펀드 설정액 자체가 줄어드는 양상을 보이고 있다 며 펀드에 들어오는 자금이 부족할 경우 알파 수익을 추구할 만큼의 매매 여력이 떨어질 수 있다 고 말했다. 김후정 유안타증권 연구원은 아무래도 액티브펀드에서 더 적극적인 매매가 일어난다 며 상장지수펀드 ETF 등 패시브펀드의 성장으로 액티브펀드 비중이 줄어들면서 매매율이 하락한 경향도 있을 것 이라고 설명했다. 김 연구원에 따르면 국내 액티브펀드의 순자산 규모는 현재 17조원이다. 이는 2015년 36조원에 비해 절반 이상 줄어든 수치다.\n", + "\n", + "### 답변: 매매에서 주식을 매매하는 빈도를 뜻하는 매매 회전율이 5년 만에 140%까지 떨어진 것은 연초부터 이어진 약세장에 기관투자자들이 상품을 방어적으로 운용하고 나선 영향으로 풀이된다.<|endoftext|>\n", + "7 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: ‘코오롱 H2 플랫폼’ 밸류체인 플랫폼 발표 계열사간 역량 결집과 동시에 대외 파트너십 구축 6일 동대문 DDP에서 열린 코리아 H2서밋 인베스터데이에 참석한 코오롱인더스트리 장희구 사장 왼쪽에서 네번째 ⓒ코오롱그룹 데일리안 조인영 기자 코오롱그룹이 수소산업의 밸류체인 전반을 고도화하는 플랫폼 구축에 나선다. 코오롱그룹은 6일 동대문 디자인플라자에서 열린 ‘코리아 H2 비즈니스 서밋 2022 인베스터데이’에 참가해 코오롱인더스트리와 코오롱글로벌 코오롱글로텍 코오롱플라스틱 등 그룹이 보유한 첨단기술을 바탕으로 수소 생산부터 운송 저장 발전사업까지 아우르는 코오롱 H2 플랫폼을 구축한다고 밝혔다. 코오롱인더스트리 장희구 사장은 국내외 수소산업 관련 투자자들을 대상으로 ‘코오롱 H2 플랫폼’의 산업적 가치와 의미를 설명하고 그룹의 역량을 집중하겠다고 발표했다. 최근 세계적인 탄소중립 기조에 발맞춰 수소로 대표되는 청정에너지 사업을 그룹의 지속 가능한 미래를 만들 수 있는 핵심 사업으로 성장시키겠다는 전략이다. 코오롱그룹은 수소연료전지를 중심으로 전개해 온 사업 분야를 확대 재편해 청정수소 생산부터 운송과 저장 이를 이용한 전력생산까지 원스톱 서비스가 가능한 플랫폼을 마련해 나간다. 수소 생산분야는 국내 풍력발전 시장을 선도하고 있는 코오롱글로벌과 협업해 진행한다. 풍력발전은 특성상 야간 및 유휴전력이 발생하게 되는데 이를 활용해 물을 전기 분해하는 수전해방식으로 청정수소를 생산할 예정이다. 경주와 태백 풍력단지를 비롯해 현재 추진 중인 완도 해상풍력단지에 이르기까지 수소생산을 위한 중요한 기반 시설로 활용할 계획이다. 코오롱인더스트리의 수분제어장치 및 전해질 분리막 기술 PEM MEA 이 국내에서 선두를 달리고 있고 상용화도 가능해 사업화에 속도를 낼 수 있을 것으로 보고 있다. 코오롱글로벌은 이와 동시에 천연가스 기반의 블루수소 생산사업도 추진 중에 있다. 천연가스를 개질해 수소를 발생시키는 블루수소 생산플랜트 사업은 물을 분리해 수소를 생산하는 그린수소 생산방식과는 달리 탄소배출이 일부 발생할 수 있으나 청정수소 생태계로 가기 위해 거쳐야 할 단계로 보고 사업영역을 순차적으로 확대해 나갈 계획이다. 코오롱이 직접 생산한 청정수소는 코오롱글로텍과 코오롱플라스틱이 개발하고 있는 수소저장용 고압 저장탱크와 수소탱크의 내부 지지재인 수소탱크 라이너 등으로 운송 저장된다. 6일 동대문 DDP에서 열린 코리아 H2서밋 인베스터데이에 참석한 코오롱인더스트리 장희구 사장 왼쪽에서 네번째 ⓒ코오롱그룹 코오롱글로텍은 수소 압력용기에 필수적인 드라이 와인딩 대형 수소탱크 성형기술 및 토우프레그 드라이 와인딩에 사용되는 탄소섬유 중간재 기술력을 보유 중이며 코오롱플라스틱은 수소차 하우징 부품 소재와 수소압력용기 소재 개발 기술력을 보유하고 있어 수소의 운송 저장 분야를 담당할 예정이다. 코오롱이 생산한 수소는 발전사업의 원료로도 활용한다. 코오롱인더스트리는 전국의 각 사업장에 수소발전설비를 구축하고 수소를 활용한 전력을 자체 생산해 제조설비 운영에 활용한다. 이미 상용화된 코오롱인더스트리의 고분자전해질막인 PEM을 적용한 PEMFC 고분자전해질 연료전지 기반의 연료전지 발전소가 만들어지면 수소 기반의 전력생산이 가능해져 2040년까지 탄소배출 제로 목표인 RE100 달성에도 한 발 다가서게 될 것으로 보고 있다. 이를 위해 수소산업을 함께 영위하는 기술 기업과의 긴밀한 파트너십 구축을 위한 Open Innovation 오픈 이노베이션 시스템도 전개한다. 코오롱이 추진하는 오픈 이노베이션은 수소의 생산 운송 저장 발전 등 ‘코오롱 H2 플랫폼’ 사업에 누구라도 함께할 수 있는 협력 시스템이다. 뿐만 아니라 탄소중립 연료전지용 소재 운송 저장 사업 발전사업 기술 등 다양한 분야에서 유기적 협력을 모색하고 파트너와의 상생협력으로 수소 생태계의 Total Solution Provider 종합 솔루션 공급자 로 성장하는 것을 목표로 하고 있다. 코오롱그룹 관계자는 “코오롱은 2000년대 초부터 대한민국 수소산업의 미래를 내다보고 핵심소재 개발과 수소경제 저변 확대를 위해 꾸준히 준비해왔다”며 “코오롱 H2 플랫폼의 실현을 위해 그룹이 가진 수소사업 소재 기술력과 외부 파트너들과의 Open Innovation 협력체를 통해 수소산업 생태계 전반에 핵심 Provider로 자리매김해 나갈 것”이라고 말했다. 한편 코리아 H2 비즈니스 서밋은 수소경제를 조기에 확산하고 대한민국 기업들의 수소 경쟁력을 강화할 목적으로 지난해 9월 출범했다. 코오롱그룹을 비롯해 현대차그룹 SK그룹 포스코그룹 등 총 17개 기업이 참여하고 있으며 2022 인베스터 데이 는 현대차그룹 SK그룹 등 17개 국내 회원사와 해외 에너지 기업 및 투자·금융사 임원들이 행사에 참석해 한국 수소 사업의 현황과 비전을 논의한다.\n", + "\n", + "### 답변: 코오롱그룹은 6일 동대문 디자인플라자에서 열린 ‘코리아 H2 비즈니스 서밋 2022 인베스터데이’에 참가해 그룹이 보유한 첨단기술을 바탕으로 수소 생산부터 운송 저장 발전사업까지 아우르는 코오롱 H2 플랫폼을 구축한다고 밝히고, 장희구 사장은 국내외 수소산업 관련 투자자들을 대상으로 ‘코오롱 H2 플랫폼’의 산업적 가치와 의미를 설명하고 그룹의 역량을 집중하겠다고 발표했다.<|endoftext|>\n", + "8 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 뉴스데스크 앵커 정부가 새 에너지 정책 방향을 오늘 국무회의에서 의결했습니다. 예상대로 원자력 발전의 비중을 더 늘리겠다고 했는데요 탄소 감축의 핵심인 석탄 화력발전소를 어떻게 줄일지 재생에너지를 어떻게 늘릴 지에 대해서는 발표하지 않았습니다. 먼저 배주환 기자가 보도합니다. 리포트 지난해 우리나라 발전에서 가장 큰 비중을 차지한 건 여전히 석탄화력발전입니다. 3분의 1이 넘습니다. 2위는 천연가스 29% 3위는 원전 27%입니다. 재생에너지의 비중은 7%에 불과합니다. 윤석열 정부는 원전의 비중을 2030년까지 30% 이상으로 늘리기로 했습니다. 문재인 정부가 24%로 낮추기로 한 것과 정반대입니다. 문재인 정부가 30%로 끌어올리겠다고 했던 재생에너지 비중에 대해서는 발표하지 않았습니다. 원전 비중을 30%까지 끌어올리는 방법은 수명연장입니다. 8년 뒤인 2030년 이전에 수명이 끝나는 원전은 10기. 정부는 이 10기의 수명을 모두 연장하기로 했습니다. 현재 건설 중인 신한울 1 2호기 신고리 5 6호기까지 더하면 2030년에 원전 28기를 돌리겠다는 겁니다. 김진 산업통상자원부 에너지전환정책과장 관련 산업의 경쟁력이나 생태계가 그래도 잘 구축돼 있으니 계속 강화를 하겠다는 게 정책 기조라고 보시면 될 것 같습니다. 히지만 이렇게 수명을 연장하고 가동률을 높이면 안전에 대한 우려가 생길 수 있습니다. 석광훈 에너지전환포럼 전문위원 물론 수명 연장을 위해서 설비 교체를 하겠지만 전반적인 설비의 노후화가 지금 진행이 되고 있기 때문에… 반면 탄소 배출 주범으로 꼽히는 석탄화력발전소를 어떻게 줄일지 신재생에너지는 얼마나 늘릴지에 대한 계획은 발표하지 않았습니다. 석탄화력은 합리적 감축 유도 재생에너지는 합리적 수준으로 조정 한다는 말이 전부였습니다. MBC뉴스 배주환입니다. 영상취재 박종일 영상편집 박병근 MBC 뉴스는 24시간 여러분의 제보를 기다립니다.\n", + "\n", + "### 답변: 정부가 정부가 오늘 국무회의에서 의결한 새 에너지 정책 방향의 주요 내용인 원자력 발전의 비중을 더 늘리겠다는 계획과 탄소 감축의 핵심인 석탄 화력발전소를 어떻게 줄일지, 재생에너지는 얼마나 늘릴 지에 대한 내용은 발표하지 않았으며, 석탄화력은 합리적 감축 유도 재생에너지는 얼마나 늘릴지에 관한 내용은 발표하지 않은 것으로 알려졌다.<|endoftext|>\n", + "9 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 연내 첫 번째 종합계획 수립해 지원사업 본격 추진 이데일리 김형욱 기자 정부가 3년마다 종합계획을 수립해 산업계의 디지털 전환을 지원하는 산업디지털전환촉진법이 5일부터 시행한다. 산업통상자원부는 연내 첫 번째 종합계획을 수립해 기업 간 데이터 연결과 활용 환경 조성 등 다양한 지원사업을 펼칠 계획이다. 장영진 산업통상자원부 제1차관 앞줄 가운데 을 비롯한 관계자가 4일 충북 청주 LS일렉트릭 제1공장에서 산업 디지털 전환 기업 간담회에서 기념촬영하고 있다. 산업부는 5일 산업디지털전환촉진법 시행에 맞춰 연내 첫 번째 종합계획을 수립해 시행할 계획이다. 사진 산업부 장영진 산업부 제1차관은 산업디지털전환촉진법 시행을 하루 앞둔 지난 4일 충북 청주 LS일렉트릭 제1공장에서 산업 디지털 전환 기업 간담회를 열고 올 하반기 수립할 산업 디지털 전환 종합계획 의견수렴 작업에 본격 착수했다. 이날 행사엔 LS일렉트릭 외 포스코 LG전자 센트랄 한국야금 SK텔레콤 네이버클라우드 등 기업 관계자가 참석했다. 정부는 우리 산업의 경쟁력을 유지하기 위해선 디지털 전환을 필수라고 보고 이 법 제정을 추진해 왔다. 이 법은 지난해 12월 국회 의결 절차를 거쳐 7월5일부터 정식 시행하게 됐다. 산업부는 또 앞선 2020년 10월 22개 산업 업종별 협회·단체로 이뤄진 디지털전환 네트워크를 출범해 기업이 당장 필요로 하는 디지털 전환 수요 조사에 나섰다. 산업부는 이를 통해 약 300개 추진 과제를 축적했고 이를 기본계획에 따른 각종 지원사업 추진 과정에서 참조한다는 계획이다. 이미 일부 과제는 산업부 연구개발 사업과 연계해 지원사업을 추진 중이다. 산업부는 첫 기본계획에 개별 기업의 디지털화를 넘어 가치사슬로 얽힌 기업 간 데이터의 연결과 활용 환경을 조성한다는 내용을 담을 계획이다. 제조 분야의 디지털 전문가 공급 개별 중소기업에 대한 인식 개선 계획도 포함한다. 장영진 차관은 “올 하반기 산업계 의견을 최대한 반영한 종합계획을 수립해 기업 간 협업 프로젝트 지원을 강화하고 인력 공급과 중소기업 인식 개선에 나설 것”이라며 “대기업도 중견·중소기업과의 데이터 공유·활용과 우수사례 전파 등 선도적 역할을 해달라”고 전했다.\n", + "\n", + "### 답변: 산업디지털전환촉진법 시행을 하루 앞둔 지난 4일 산업부 장영진 제1차관은 산업 디지털 전환 기업 간담회를 열고 올 하반기 수립할 산업 디지털 전환 종합계획 의견수렴 작업에 본격 착수했으며 첫 기본계획에 개별 기업의 디지털화를 넘어 가치사슬로 얽힌 기업 간 데이터의 연결과 활용 환경을 조성한다는 내용을 담을 계획이다.<|endoftext|>\n", + "10 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 사진 한국동서발전 한국동서발전은 다음달 31일까지 울산시민과 함께하는 생활 속 걷기 챌린지 탄소중립 건강걷기 누비GO 초록발자국 챌린지 를 진행한다고 1일 밝혔다. 울산숲사랑운동과 함께 하는 이번 챌린지는 코로나19로 지친 시민들이 일상 속 걷기 운동을 통해 건강을 증진하고 자가용 대신 대중교통을 이용해 탄소중립 사회를 실현하기 위해 마련됐다. 울산시민 누구나 구글플레이 또는 앱스토어에서 스마트폰 어플 워크온 을 내려받아 회원가입 후 참여할 수 있다. 챌린지 목표인 10만보·20만보·30만보를 기간 내 달성하면 추첨을 통해 교통카드 등 소정의 기념품을 증정한다. 김태규 동서발전 탄소중립실장은 초록발자국 챌린지를 통해 코로나19로 지친 울산시민들이 활력을 되찾고 대중교통 활성화로 탄소중립 실천에 기여하길 바란다 며 앞으로도 다양한 탄소중립·환경 프로젝트를 추진하여 더 많은 시민이 참여할 수 있도록 최선을 다하겠다 고 말했다.\n", + "\n", + "### 답변: 한국동서발전은 다음달 31일까지 울산숲사랑운동과 함께 코로나19로 지친 시민들이 일상 속 걷기 운동을 통해 건강을 증진하고 자가용 대신 대중교통을 이용해 탄소중립 사회를 실현하기 위한 챌린지 탄소중립 건강걷기 누비GO 초록발자국 챌린지 를 진행한다고 1일 밝혔다.<|endoftext|>\n", + "11 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 앵커 고공행진하는 물가에 주머니 사정도 빠듯해지고 있습니다. 소비자들은 한푼이라도 아끼기 위해 짠물 소비 에 나서고 있는데요 고물가 시대 달라진 소비행태를 전효성 기자가 살펴봤습니다. 기자 50대 주부 임동순 씨는 대형마트 마감 시간대를 주로 이용해 장을 보고 있습니다. 이 시간대에 육류나 신선제품을 구매하면 정가의 최대 70% 수준에 상품을 구매할 수 있기 때문입니다. 임동순 서울 관악구 자주 와요 마감 시간에 신선식품이나 생선 같은 경우는 30% 정도 세일 하거든요 그럴 때 엄청 덕을 많이 보죠. 실제 한 대형마트에 따르면 마감세일 시작 시간인 오후 7시 이후 매출액이 지난해보다 20% 이상 늘어난 것으로 집계됐습니다. 그나마도 오이 1개 고기 200g처럼 한 두끼 식사에 쓰일 소포장 판매가 주를 이룹니다. 밀키트 제품도 다시금 소비자의 관심을 받고 있습니다. 외식 배달 물가가 고공행진하면서 집에서 간단히 조리해 먹을 수 있는 밀키트 제품이 대체재로 떠오른 겁니다. 기자 물가가 고공행진 하면서 달라진 소비 패턴이 있다면 어떤 게 있을까요. 이기현 서울 중구 외식 안 해요 외식하는 것보다 밀키트 사서 끓여먹는 게 훨씬 경제적이죠. 양도 많고 제가 넣고 싶은 건 더 넣을 수도 있고… 엔데믹에 접어들며 주춤할 것으로 예상됐던 밀키트는 20% 넘는 성장세를 보이는 반면 배달앱 이용자 수는 매달 연중 최저치를 경신하고 있습니다 3 532만명 → 3 209만명 . 편의점 앱에서 유통 기한이 얼마 남지 않은 제품을 저렴하게 구매하는 것도 알뜰 쇼핑족이 애용하는 방법입니다 CU 그린세이브 21.5% GS25 라스트오더 254% 이처럼 짠물소비가 늘면서 유통업계는 물가 구원투수를 자처하며 최저가 경쟁에 나섰습니다. 이마트는 계란 김치 우유 등 40대 필수 상품군을 다른 업체보다 무조건 싸게 팔겠다 고 선언했고 롯데마트는 물가안정TF 를 꾸려 생필품 500여종의 가격을 집중적으로 관리하겠다는 계획을 발표한 상황. 인플레이션이 당분간 계속될 것으로 보이는 만큼 올해 연말까지는 최저가 경쟁을 이어간다는 방침입니다. 김태희 이마트 부장 고객들의 생활비 부담을 조금이라도 덜어드리기 위해 매일 40대 필수 상품에 대한 가격관리를 통해 항상 최저가로 제공해 드리려고 하고 있고… 사상 초유의 6%대 물가 상승률이 현실화된 가운데 눈물나는 짠물 소비 소비자들을 잡기 위한 유통업계의 경쟁이 더욱 치열해지고 있습니다. 한국경제TV 전효성입니다.\n", + "\n", + "### 답변: 소비물가 상승률이 현실화된 가운데 소비자들은 한푼이라도 아끼기 위해 짠물 소비 에 나서고 있는데다 밀키트 제품도 다시금 소비자의 관심을 받고 있어 유통업계는 물가 구원투수를 자처하며 최저가 경쟁에 나섰다.<|endoftext|>\n", + "12 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 주파수 추가 할당 확보 유력 정부 심사 통과 가능성 높아 3사 100㎒ 폭씩 균등 배분 LG유플러스가 5세대 5G 이동통신 주파수 3.4 3.42㎓ 대역 할당을 단독 신청했다. SK텔레콤과 KT는 고심 끝에 할당 신청을 하지 않기로 했다. 경매가 아닌 정부 심사 할당 절차를 거쳐 LG유플러스의 20㎒ 폭 추가주파수 단독 확보가 유력해졌다. 과학기술정보통신부는 4일 오후 6시 3.4 3.42㎓ 대역 주파수할당 신청 접수를 마감한 결과 LG유플러스만 신청한 것으로 확인했다. LG유플러스는 서비스 제공 시기와 제공 지역 무선국 구축 계획 등에 관한 사항을 담은 주파수 이용계획서를 제출했다. 과기정통부 이동통신 IMT 용 주파수할당 공고 에 의거해 할당을 신청한 법인이 1개로 신청 절차가 종결됐다. 이에 따라 경매 대신 정부 심사로 할당 적격 여부를 평가하는 대가산정 주파수할당 방식이 적용된다. LG유플러스가 심사를 통과할 경우 과기정통부가 경매 최저경쟁가격으로 제시한 총 1521억원에 2022년 11월 1일부터 2028년 11월 30일까지 6년간 사용권을 확보하게 된다. 과기정통부는 할당 조건으로 △2025년까지 누적 5G 무선국 15만국 구축 △5G 농어촌 공동망 2023년 12월 조기 구축 △인접 대역 사업자는 신규 1만5000국 5G 무선국 구축 이후 할당 주파수 사용 △농어촌 지역에 한해 할당 즉시 주파수 이용 등 조건을 부과했다. LG유플러스가 직접 추가주파수 할당을 신청해서 진행하는 할당 절차인 만큼 심사를 통과하지 못할 공산은 극히 낮다는 게 업계의 일반적인 관측이다. 김윤호 LG유플러스 공정경쟁담당은 “5G 주파수를 추가로 확보해 서비스 품질을 개선하고 고객의 편익을 증진하는데 기여하겠다”고 말했다. 과기정통부는 주파수 할당으로 인한 투자 효과가 1조원 이상이 될 것으로 예상했다. 이통 3사가 5G 황금주파수로 꼽히는 3.5㎓ 대역에서 균등하게 100㎒ 폭을 보유하게 됐다. 3사 간 차별화된 네트워크 품질 확보를 위한 투자 경쟁이 순조롭게 진행될 경우 예상되는 투자 효과다. 과기정통부 관계자는 “LG유플러스를 대상으로 한 할당신청 적격여부 검토에 착수할 예정이며 7월 중으로 심사위원회를 구성해 할당심사를 진행할 것”이라고 밝혔다. 경쟁사는 주파수 할당 신청을 하지 않았다고 공식확인했다. SK텔레콤은 기존 신청한 3.7 3.72㎓ 주파수 대역과 관련해 정부와 계속 협의하겠다는 입장을 피력했다. KT는 정부에 LG유플러스에 대해 주파수를 할당하더라도 철저한 이행점검이 필요하다는 입장을 밝혔다.\n", + "\n", + "### 답변: 과학기술정보통신부는 4일 LG유플러스가 단독으로 5G 이동통신 주파수 3.4 3.42GHz 대역 할당을 신청했다고 밝혔으며 이로 인해 SK텔레콤과 KT는 할당 신청을 하지 않기로 했고 정부 심사 할당 절차를 통해 LG유플러스의 20MHz 폭 추가주파수 단독 확보가 유력하다.<|endoftext|>\n", + "13 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 스포츠조선이 주최하는 제1회 청룡시리즈어워즈 시상식 Blue Dragon Series Awards 이하 BSA 에 대한 관심과 반응이 매우 뜨겁다. 오는 19일 오후 7시 인천 파라다이스시티에서 개최되는 청룡시리즈어워즈는 국내 최초 스트리밍 시리즈 콘텐츠들을 대상으로 한 시상식으로 급변하는 영상 시장 속 오리지널 콘텐츠들에 대한 높은 관심과 전 세계적으로 높아진 K 콘텐츠의 위상을 공고히 하기 위해 만들어졌다. 수상 후보 선정을 위한 청룡시리즈어워즈 후보작 자 선정 투표에 이어 지난 6일부터 시작된 후보작 자 최종 투표는 8일 오후 기준 총 투표 수 230만을 가뿐히 넘어섰다. 청룡 이라는 두 글자가 주는 공정성과 권위 속에 이번 시상식에 대한 팬들의 뜨거운 관심과 업계 기대를 엿볼 수 있는 대목이다. ◇ LG유플러스가 진행하는 청룡시리즈어워즈 레드카펫 1열 직관 이벤트. 사진제공 LG유플러스 한편 K 콘텐츠를 사랑하는 찐팬 이라면 한 번쯤 밟아보고 싶을 만한 이번 시상식 레드카펫 이벤트에 대한 관심도 매우 높다. LG유플러스는 최근 제1회 청룡시리즈어워즈 시상식 공식 후원을 결정하고 U tv 레드카펫 1열 직관 이벤트 를 진행하고 있다. 콘텐츠 마니아들에게 레드카펫 1열에서 직접 K 콘텐츠 스타들을 직접 두 눈에 담을 수 있는 기회를 제공하기로 한 것. 연예·엔터 분야로 입지를 넓히는 한편 K 콘텐츠 산업의 진흥과 발전을 돕기 위함이라고 관계자는 설명했다. LG U tv의 공식 유튜브 채널인 U tv 이모티콘 이 세상 모든 콘텐츠 담당자들이 직접 기획과 촬영 제작한 시상식 현장 스케치 영상은 공개 직후 조회수가 70만회 이상을 기록하기도 했다. LG유플러스는 이번 시상식 레드카펫과 본 시상식 생중계에도 직접 나선다. 생생한 시상식 현장을 안방 1열 로 전달하기 준비에도 한창이다. 이번 시상식과 관련된 다양한 콘텐츠 생산에도 열을 올릴 계획이다. LG유플러스 IPTV 서비스를 이용하는 고객이라면 제1회 청룡시리즈어워즈 시상식을 U tv 채널 234번과 모바일tv를 통해 시청할 수 있다. LG U tv 관계자는 13일까지 U tv 이모티콘 유튜브 채널 커뮤니티 탭에서 신청 가능한 레드카펫 1열 직관 이벤트 에 대해 많은 관심 가져주시기 바란다 고 말했다.\n", + "\n", + "### 답변: 스포츠조선이 주최하는 제1회 청룡시리즈어워즈 시상식 Blue Dragon Series Awards 이하 BSA 에 대한 관심과 반응이 매우 뜨거운 가운데 오는 19일 오후 7시 인천 파라다이스시티에서 개최되는 청룡시리즈어워즈는 국내 최초 스트리밍 시리즈 콘텐츠들을 대상으로 한 시상식으로 급변하는 영상 시장 속 오리지널 콘텐츠들에 대한 높은 관심과 전 세계적으로 높아진 K 콘텐츠의 위상을 공고히 하기 위해 만들어졌고.K콘텐츠 사랑하는 찐팬 이라면 한 번쯤 밟아보고 싶을 만한 이번 시상식 레드카펫 이벤트에 대한 관심도 매우 높아<|endoftext|>\n", + "14 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 5월 소비자물가 상승률 5.4%… 6월엔 6% 직영주유소 1일부터 유류세 37% 즉시 인하 정부 3일 수출 애로 해소·지원 대책 논의 방기선 1차관 비상경제차관회의 주재 방기선 기획재정부 1차관이 1일 정부서울청사에서 열린 비상경제차관회의를 주재하고 있다. 2022.7.1. 연합뉴스 정부가 6월 소비자물가 상승률이 5월보다 더 높아진다고 예고했다. 5월 물가 상승률이 5.4%였던 점을 고려하면 6월 상승률은 5%대 후반에서 6% 초반 사이가 될 것으로 보인다. 방기선 기획재정부 1차관은 1일 정부서울청사에서 열린 제2차 비상경제차관회의에서 “5월 5.4%에 이어 6월에는 소비자물가 상승률이 더욱 높아질 전망”이라면서 “앞으로도 상당 기간 인플레이션 압력이 지속될 것”이라고 말했다. 정부는 이런 고물가 상황을 조금이라도 완화하고자 이날부터 유류세를 법적 최대한도인 37%까지 낮춘다. 유류세 인하율이 오롯이 반영되면 휘발유는 ℓ당 57원 경유는 38원씩 내려가는 효과가 나타난다. MobileAdNew center 정유사 직영주유소는 이날부터 즉시 가격을 인하했다. 정부는 자영주유소에도 가격이 인하된 물량이 최대한 빨리 공급될 수 있도록 비상 운송에 나설 계획이다. 7월 첫째 주부터는 관계 기관이 석유시장 점검단을 꾸려 주 2회 이상 전국 주유소를 현장 방문해 물가 상승기에 편승한 주유소의 가격 담합과 가짜석유 유통 등 불법행위를 적발할 예정이다. 방 차관은 이날 발표된 상반기 수출입 통계에 대해 “무역수지 적자 폭은 지난달보다 다소 확대됐지만 6월 하순 들어 수출이 빠르게 회복하면서 적자 폭을 상당히 줄일 수 있었다”고 설명했다. 이어 “수출 애로 해소와 하반기 수출 활성화를 위해 당장 추진할 필요가 있는 지원 대책을 검토 중”이라면서 “이번 주 일요일 3일 비상경제장관회의에서 논의할 계획”이라고 말했다. 산업통상자원부는 올해 상반기 무역수지 적자가 103억 달러를 기록했다고 밝혔다. 이는 상반기 기준 역대 최대 규모다.\n", + "\n", + "### 답변: 정 6월 소비자물가 상승률이 5.4%에 이어 6월에도 소비자물가 상승률이 5%대 후반에서 6% 초반 사이가 될 것으로 예상되면서 정부는 고물가 상황을 조금이라도 완화하고자 유류세를 법적 최대한도인 37%까지 낮춤과 동시에 직영주유소에도 가격이 인하된 물량이 최대한 빨리 공급될 수 있도록 비상 운송에 나설 계획이다.<|endoftext|>\n", + "15 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: LG전자가 지난 1일 서울시 강남구에 위치한 초 超 프리미엄 빌트인 가전 브랜드 시그니처 키친 스위트 청담 쇼룸 1층 카페에서 유명 피아니스트 겸 작곡가인 이루마 사진 왼쪽 의 피아노 콘서트와 유명 셰프인 오스틴강의 쿠킹쇼를 진행했다. 사진제공 LG전자 LG전자가 피아니스트 이루마 셰프 오스틴강과 함께 프리미엄 빌트인 가전 브랜드 시그니처 키친 스위트 의 차별화된 고객가치를 알리는 콘서트를 열었다. 이루마가 피아노를 연주하고 오스틴강이 쿠킹쇼를 진행했다. LG전자는 지난 1일 서울시 강남구 시그니처 키친 스위트 청담 쇼룸 1층 카페에서 시그니처 키친 스위트 콘서트를 개최했다고 3일 밝혔다. 공연엔 시그니처 키친 스위트 구매고객과 인플루언서 등 총 40여명이 참석했다. 이날 이루마는 자신의 곡 가운데 공간을 작품으로 삶을 예술로 라는 시그니처 키친 스위트의 브랜드 철학과 어울리는 13곡을 엄선해 연주했다. 해당 곡은 공연 후에도 청담 쇼룸 카페에서 들을 수 있다. 피아노 콘서트 뒤에는 오스틴강의 쿠킹쇼가 이어졌다. 고객들은 △다양한 용량의 제품을 목적에 맞게 선택해 조합할 수 있는 컬럼형 냉장·냉동고 △상·중·하칸의 온도를 각각 조절할 수 있는 컬럼형 와인셀러 △5개 화구를 갖춘 전기레인지 △원바디 블랙글라스 디자인의 스팀오븐과 광파오븐 등 시그니처 키친 스위트 제품을 활용해 오스틴강이 대표 레시피로 만든 요리를 즐겼다. LG전자는 2017년 국내 최초 초프리미엄 빌트인 가전 브랜드 전시관인 시그니처 키친 스위트 논현 쇼룸을 개관한 데 이어 지난해 복합문화공간인 청담 쇼룸을 선보였다. 이곳에서는 가전과 가구가 조화를 이루는 공간을 직접 체험하고 공간별 구성제품을 패키지로 구입할 수 있다. 오승진 LG전자 한국영업본부 한국전략담당은 더 많은 고객이 초프리미엄 브랜드가 선사하는 차원이 다른 가치를 경험할 수 있도록 다양한 분야에서의 마케팅 활동을 전개할 것 이라고 말했다.\n", + "\n", + "### 답변: LG전자는 지난 1일 서울시 강남구 시그니처 키친 스위트 청담 쇼룸 1층 카페에서 시그니처 키친 스위트 콘서트를 열어 구매고객과 인플루언서 등 총 40여명과 함께 시그니처 키친 스위트의 브랜드 철학과 어울리는 13곡을 엄선해 연주하고 피아니스트 이루마와 오스틴강의 쿠킹쇼를 진행했다고 3일 밝혔다.<|endoftext|>\n", + "16 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 여야 저금리 갈아타는 원스톱 플랫폼 한목소리 요구 지난해 은행ㆍ핀테크 간 이견으로 추진 중단돼 금융위 의견 조율 나서...시중은행 여전히 반대 이데일리 전선형 최훈길 박기주 기자 지난해 8월 이후 논의가 중단된 ‘대환대출 플랫폼’ 구축이 다시 재논의된다. 대출금리 고공 비행으로 차주들의 이자 부담이 커지면서 이번엔 정치권에서 ‘카드’를 들이밀었다. 하지만 과거에도 은행들과 빅테크 간 이견이 컸던 만큼 이번에도 플랫폼 구축이 쉽지는 않을 것이란 관측이다. ‘대환대출’ 고금리 부담 줄여줄 수 있어 6일 금융당국에 따르면 금융위원회는 금융사들에게 ‘대환대출플랫폼’ 구축에 대한 의견을 조율 중이다. 특히 은행과 빅테크사를 중심으로 대환대출 플랫폼 구축 및 이용 방식에 대한 의견을 물은 것으로 전해진다. 금융결제원 망에 핀테크가 운영 중인 대출금리 비교 서비스를 연동하면 대출 갈아타기가 가능하다. 모든 가계대출을 모바일로 법무사 비용 없이 쉽게 갈아타는 것이다. 사진은 지난해 금융위원회가 추진하려다 무산된 비대면 대환대출 플랫폼 설명 내용이다. 자료 금융위원회 대환대출플랫폼은 모바일 등 비대면으로 여러 금융사 대출 상품의 금리를 조회하고 그중 낮은 금리로 갈아탈 수 있도록 하는 시스템을 말한다. 지난해 8월 금융당국이 빅테크가 운영 중인 대출금리 비교 서비스를 활용해 은행ㆍ카드사ㆍ저축은행 등의 대출상품을 갈아탈 수 있도록 하는 방식으로 사업을 추진했다. 망은 금융결제원 망을 이용하기로 했다. 하지만 당시 은행권은 고객을 빼앗길 우려를 내비치면서 강한 반발을 했고 결국 사업은 중단됐다. 그렇게 잊혔던 대환대출플랫폼이 1년 만에 다시 고개를 든 건 정치권의 압박이 있었기 때문이다. 기준금리 인상 물가 인상 등으로 차주들의 부담이 커지면서 금리 부담을 줄이기 위해서는 ‘대환대출 플랫폼이 반드시 필요하다’는 게 정치권의 생각이다. 특히 이번에는 여야 할 것 없이 한목소리를 내고 있다. 실제 국민의 힘은 지난 5일 금융당국에 대환대출 플랫폼 사업을 신속하게 추진할 것을 요구했다. 성일종 국민의힘 정책위의장은 원내대책회의를 통해 “대환대출 플랫폼이 지난해 추진됐으나 금융권 상황으로 중단됐다”며 “하지만 당시보다 상황이 더 악화된 지금과 같은 금리 상승기에 무엇보다 필요한 사업“이라고 강조했다. 국민의힘은 김주현 금융위원장 후보자가 위원장으로 임명되는 즉시 당정 간담회를 열고 대환대출 플랫폼 등 서민 금융 지원 방안을 1순위로 논의하겠다는 입장이다. 더불어민주당도 6일 오전 ‘상환부담 완화를 위한 원스톱 대출 이동제 도입 간담회’를 열고 대환대출 플랫폼에 대한 구체적인 논의를 했다. 박홍근 더불어민주당 원내대표는 “낮은 금리의 대출로 갈아타는 대환대출도 서민들의 부담 줄이기 위해 고려할 선택지”라며 “당사자 간의 이해충돌로 현재는 추진이 중단됐지만 급격한 고금리로 국민들의 부담이 가중되는 비상 상황인 만큼 원스톱 대출 이동제를 시급히 도입해야 한다”고 말했다. 은행권 우려 여전해...반면 빅테크는 적극적 다만 금융권이 이를 받아들일 지는 미지수다. 특히 빅테크들의 금융권 진출로 고유 영역 예금ㆍ대출 을 빼앗긴 시중은행들의 반발은 여전히 거세다. 지난해에도 금융당국의 대환대출 플랫폼 추진 과정에서 시중은행들이 빅테크 종속·수수료 지급 등을 이유로 불참을 선언하면서 결국 도입이 무산됐다. 더욱이 당시 은행끼리 모여 추진했던 자체 플랫폼 구축 사업도 시중은행ㆍ지방은행ㆍ인터넷은행 간에 의견이 갈리면서 현재 중단된 상태다. 반면 빅테크ㆍ핀테크사들은 적극적으로 움직이고 있다. 토스도 대환대출 플랫폼 사업 진출 채비에 나섰다. 특히 토스는 금융당국 주도의 대환대출플랫폼에 참여 요청이 있다면 적극적으로 검토하겠다는 입장이다. 60개 금융사 대출 비교가 가능한 ‘핀다’ SK텔레콤 017670 과 하나금융그룹이 투자한 ‘핀크’도 대환대출 플랫폼에 참여할 예정이다. 현재 양사 모두 대출 비교는 가능하나 앱으로 실시간 대출 갈아타기는 불가능하다. 한 금융권 관계자는 “금융결제원의 망을 이용하고 플랫폼 서비스를 그대로 활용하면 되니까 사실 시스템적으로 문제 될 것은 없다”며 “하지만 각 금융사마다 신용등급을 산정하는 기준이 달라 직접적인 비교가 불가능하고 기존 금융권의 경우 빅테크 플랫폼 이용 시 수수료까지 지불해야 하는 불합리성이 있어 해당 사업이 달갑지 않은 건 사실”이라고 말했다.\n", + "\n", + "### 답변: 6금리 인상 물가 인상 등으로 차주들의 이자 부담이 커지면서 금리 부담을 줄이기 위해 대환대출 플랫폼 구축이 다시 재논의되나 과거에도 은행들과 빅테크 간 이견이 컸던 만큼 이번에도 플랫폼 구축이 쉽지는 않을 전망이다.<|endoftext|>\n", + "17 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 노조 운송료 27% 인상 vs 제조사 9%대 인상 차주 8 200명 파업 참가로 150여 공장 가동 중단 건설업계 연이은 파업에 공기 연장 등 피해 우려 수도권의 레미콘 운송 차주들이 파업에 돌입한 1일 오후 경기도 안양시의 한 레미콘 업체에 레미콘 차량이 세워져 있다. 연합뉴스 수도권 레미콘 제조사들과 운송료 인상 협상이 결렬되면서 수도권 레미콘운송노조 조합원들이 1일부터 파업에 돌입했다. 양측은 협상을 이어간다지만 간극이 커 파업이 장기화할 가능성도 배제할 수 없는 상황이다. 건설현장에 미칠 파장도 만만찮을 전망이다. 레미콘운송노조에 따르면 수도권 레미콘운송노조는 주요 레미콘 제조사들과 운송료 인상 관련 협상 결렬을 이유로 이날부터 운송 거부에 들어갔다. 파업에 참가하는 차주는 8 200여 명에 달한다. 노조는 수도권 내 158곳에 달하는 레미콘 공장이 가동을 멈춘 것으로 파악했다. 양측은 지난달 29일과 30일에 걸쳐 운송료 협상을 진행했지만 합의에 이르지 못했다. 수도권 레미콘운송조합원들은 운송료를 회당 5만6 000원에서 7만1 000원으로 약 27% 인상을 요구하고 있다. 또 △명절상여금 100만 원 △근로시간 면제수당 △성과급 1인당 100만 원 △요소수 100% 지급 등도 요구하고 있다. 이에 반해 레미콘 제조사들은 운송료는 9%대 중반 이상의 인상은 어렵다고 맞서고 있다. 운송노조 관계자는 제조업체는 레미콘 납품가격을 인상했지만 레미콘가격에 포함된 운송비는 올려주지 않고 있다 고 주장했다. 이어 지방은 운송료가 올랐지만 수도권만 합의가 미진해 형평성에 어긋난다 고 덧붙였다. 다만 노조 측은 제조사들과의 협상은 이어간다는 방침이다. 노조 파업으로 건설업계가 직격탄을 맞게 됐다. 지난달 화물연대 파업에 이어 레미콘 운송 거부까지 이어지면서 작업 중단 등 또다시 피해를 입게 됐다. 파업이 장기화할 경우 공기가 늘어나고 아파트 입주 일정도 미뤄질 수밖에 없어 손실 규모는 더욱 커질 전망이다. 한 대형건설사 관계자는 화물연대 파업 때도 콘크리트 타설 골조공사가 중단됐었다 며 파업이 끝난 지 얼마 안 됐는데 또다시 레미콘운송조합 파업이 이어져 난감하다 고 토로했다.\n", + "\n", + "### 답변: 수도체 레미콘운송노조는 주요 레미콘 제조사들과 운송료 인상 관련 협상 결렬을 이유로 1일부터 파업에 돌입하여 건설업계가 직격탄을 맞게 됐으며 지난달 화물연대 파업에 이어 레미콘 운송 거부까지 이어지면서 작업 중단 등 또다시 피해를 입게 됐다.<|endoftext|>\n", + "18 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 일본 신문 니케이엠제이가 한국 프랜차이즈 업계에서 이례적으로 윤홍근 제너시스BBQ그룹 회장을 다룬 기사를 냈다. 사진은 BBQ의 치킨대학 전경. 사진제공 제너시스BBQ 윤홍근 제너시스BBQ그룹 회장이 한국 프랜차이즈 대표로는 이례적으로 일본 경제지와 인터뷰를 진행했다. 지난 1일 니케이엠제이는 윤 회장 인터뷰가 포함된 BBQ 취재 기사를 보도했다. 일본 매체로는 처음으로 치킨대학을 탐방했다는 점이 의미 있다. 니케이엠제이는 일본 주요 경제신문인 니혼게이자이신문의 유통·마케팅 전문지다. 해당 매체는 윤 회장에 대해 프랜차이즈 세계 1등의 야망을 품은 경영인 이라는 평가와 함께 BBQ가 라이벌로 미국 맥도날드를 꼽고 있는 점을 조명했다. 윤 회장은 세계 5만여개의 점포를 열고 맥도날드를 추격하고 싶다 고 전했다. 일본에서는 치킨 프랜차이즈가 라이벌로 KFC가 아닌 맥도날드를 꼽는 데 의아함을 나타냈다. 이에 윤 회장은 외식 산업 에 초점을 맞추고 있다고 답변했다. BBQ는 현재 58개국에서 약 2250개의 점포를 운영 중이다. 일본에는 21개 점포가 있다. 올해 말 100개까지 늘릴 계획이다. 레스토랑 타입 베이커리 타입 배달 전문점 등 다양한 사업체로 개점한다는 전략이다. 치킨대학 탐방 내용도 비중 있게 다뤄졌다. BBQ 매장을 운영할 수 있는 실력을 양성하는 최초의 치킨대학이라는 점을 강조했다. BBQ 점포를 내기 전 최소 2명이 2주간의 과정을 수료해야 하며 조리 방법 회계 마케팅 등의 교육이 진행된다. BBQ 관계자는 해외를 중심으로 점포망을 늘려 신종 코로나바이러스 감염증 코로나19 이후도 대비하고 있다 며 영어 중국어 일본어로 쓰여진 교과서를 마련하는 등 유학생 대응도 준비 중 이라고 말했다.\n", + "\n", + "### 답변: 지난홍근 BBQ그룹 회장이 한국 프랜차이즈 대표로는 이례적으로 일본 경제지와 인터뷰를 진행했는데 프랜차이즈 세계 1등의 야망을 품은 경영인 이라는 평가와 함께 BBQ가 라이벌로 미국 맥도날드를 꼽고 있는 점을 조명했고 윤 회장은 외식 산업 에 초점을 맞추고 있다고 답변했다.<|endoftext|>\n", + "19 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 지난 4일 오후 1시30분께 서울시의회 앞에서 노원구 공릉동 서울태릉골프장 일대 공공주택지구 지정 을 반대하는 시민들이 기자회견을 가졌다 사진 황서율 기자 문 정부의 8·4대책에 포함돼 6800가구가 공급될 계획이었던 서울 노원구 공릉동 태릉골프장 CC 일대의 공공주택지구 지정에 주민들이 반대하고 나서면서 사업에 차질을 빚을 것으로 예상된다. 3080 도심복합사업 역시 아직 사업진행이 더딘 상황으로 파악되면서 공공주도 공급물량에 변화가 생기는 것이 아니냐는 목소리도 나온다. 5일 서울시의회는 전날 서울시의회 1호 청원으로 ‘노원구 공릉동 서울태릉골프장 일대 공공주택지구 지정 반대에 관한 청원’이 접수됐다고 밝혔다. 1호 청원을 접수한 박환희 시의원 노원2 에 따르면 청원 접수에는 공릉동 주민 등 3000명이 서명한 것으로 알려졌다. 태릉골프장 일대의 공공주택지구 지정은 2020년 문재인 정부의 주택공급정책인 8.4대책의 일환으로 이야기 됐다. 발표 당시 해당 부지에 1만호가 공급될 예정이었으나 녹지확보 저밀개발 교통문제 등에 부딪혀 6800가구 공급으로 사업계획을 변경했다. 이에 따라 수락산역 역세권 도심복합사업 노원구 내 도시재생사업 등을 통해 총 3100가구의 대체물량을 확보했다. 이번 주민들의 반발로 태릉지구 6800가구 공급정책은 차질이 생길 것으로 예상된다. 주민들은 태릉·강릉 세계문화유산 지정 취소 가능성 생태공원조성계획 희망 교통정체 등을 이유로 반대하고 있다. 이미 올해 상반기 안에 지구 지정을 하겠다던 목표는 지방선거 등으로 주민 설명회나 공청회 등의 절차가 미뤄지면서 하반기로 조정됐다. 이러한 상황에서 지난달 17일 열릴 예정이었던 1차 공청회까지 주민들의 반발로 무산되면서 사업 진행이 더욱 느려진 것이다. 2차 공청회는 오는 11일 열릴 계획이다. 국토부 관계자는 “환경연합평가를 충분히 했고 태릉·강릉 경관에 영향이 없도록 준비하고 있다”며 “법적으로 없는 절차지만 유네스코 유산 영향 평가 역시 준비 중이기 때문에 부정적인 영향을 최소화해 사업을 추진할 계획”이라고 밝혔다. 한편 문 정부의 또다른 공공주도 공급정책인 3080 도심복합사업 역시 아직 진행이 더딘 상황으로 파악됐다. 총 19만6000호 공급을 목적으로 하는 이 사업은 현재 76곳 총 10만호 의 후보지를 발표한 상황이지만 후보지 중 지구지정까지 완료한 곳은 8곳 약 1만3000호 뿐이다. 지난 5월23일 원희룡 국토부장관이 “주민 호응도가 떨어지는 사업은 덜어내겠다”는 입장을 밝혀 일각에서는 해당 사업을 통한 공급 물량이 조정되는 것이 아니냐는 분석도 나온다.\n", + "\n", + "### 답변: 노릉골프장 CC 일대의 공공주택지구 지정과 문 정부의 공공주도 공급정책인 3080 도심복합사업의 진행이 더딘 상황으로 주민들이 반대하고 나서면서 사업에 차질을 빚을 것으로 예상된다.<|endoftext|>\n", + "20 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 쌍용자동차가 5일 인천 중구 네스트호텔에서 개최한 개발자와 함께하는 Q A 간담회 에서 토레스 신차 개발에 참여한 김범석 마케팅담당이 기자 질의에 답하고 있다.\n", + "\n", + "### 답변: 쌍 쌍용자동차가 5일 인천 중구 네스트호텔에서 개최한 개발자와 함께하는 개발자와 함께하는 간담회에서 쌍용자동차 <|endoftext|>\n", + "21 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: GS25 메이플스토리빵 18일만에 100만개 판매 돌파 GS리테일이 운영하는 편의점 GS25가 지난달 17일 선보인 메이플스토리 빵 5종. 사진 GS리테일 편의점 GS25가 온라인게임 메이플스토리 와 손잡고 선보인 메이플스토리 빵이 흥행 돌풍을 이어가고 있다. 출시 첫 날 초도물량 10만개가 완판된 데 이어 18일 만에 누적 100만개가 팔렸다. 6일 GS리테일에 따르면 편의점 GS25가 지난달 17일부터 선보인 메이플스토리빵 5종이 출시 18일 만에 판매량 100만개를 돌파했다. GS25는 꾸준히 이어진 굿즈 상품 마케팅의 일환으로 전 세계 1억9000만명의 사용자를 보유한 온라인 게임 메이플스토리에 주목했다. 이에 GS25는 메이플스토리빵에 메이플스토리의 인기 몬스터 캐릭터 80종의 스티커를 상품 1개당 1장씩 동봉했다. GS리테일 관계자는 메이플스토리빵이 매일 전 GS25매장에 입고되는 즉시 품절이 될 정도로 큰 인기를 끌고 있다 고 전했다. 메이플스토리빵의 인기는 GS25의 자체브랜드 PB 브레디크 상품의 매출에도 영향을 미쳤다. 메이플빵 출시 후 브레디크 매출이 전월 동기보다 64% 뛴 것. 모델이 GS25에서 월간 브레디크 소금버터롤케익 상품을 바라보고 있는 모습. 사진 GS리테일 GS25 측은 메이플스토리빵을 구매하러 오는 소비자들이 빵 진열 매대를 자주 살펴보는 기회가 늘어나며 브레디크 등 다른 빵도 경험하게 되고 재구매로 연결되는 선순환 효과가 나타나고 있다 고 풀이했다.\n", + "\n", + "### 답변: 6점 GS리테일에 따르면 편의점 GS25가 온라인게임 메이플스토리'와 손잡고 지난달 17일부터 선보인 메이플스토리빵 5종이 출시 18일 만에 판매량 100만개를 돌파하여 흥행 돌풍을 이어가고 있다고 밝혔다.<|endoftext|>\n", + "22 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 앱장터 ‘인앱결제’를 둘러싼 구글 카카오의 갈등이 가열되고 있는 가운데 한상혁 방송통신위원장이 7일 양측 관계자를 불러 의견을 듣기로 했다. 한 위원장은 6일 방통위 전체회의 직후 “담당 행정청으로서 이용자들의 불편을 해소하기 위해 노력하는 것은 당연한 의무”라며 “지금 벌어지고 있는 일에 대한 조율은 정책적인 방향에서 해야 할 일이라고 생각한다”고 말했다. 안드로이드용 카카오톡에서는 이모티콘플러스 정기구독 웹결제 안내 링크가 제공된다. 앞서 구글은 지난 1일 부로 자사 앱 장터인 구글플레이 스토어에서 카카오톡 앱 최신 업데이트 버전 제공을 중단했다. 인앱결제 시스템을 도입하지 않는 구글플레이스토어 내 앱에 대해 4월부터 업데이트를 금지하기로 한 자체 방침에 다른 조치다. 카카오가 그동안 구글플레이 스토어에서 ‘이곳을 클릭해서 결제하면 저렴한 가격에 이모티콘 구독 서비스를 이용할 수 있다’며 외부 결제 링크를 홍보해왔는데 이점을 문제 삼은 것이다. 이에 카카오는 안드로이드 사용자들을 대상으로 지난 1일부터 APK 설치파일 형태로 카카오톡 앱을 배포하고 있다. 최신 카카오톡 버전은 다음 포털을 통해 제공하기로 했다. IT업계에서는 구글과 카카오의 기싸움이 계속될 경우 구글플레이 스토어에서 카카오톡 앱이 삭제될 가능성도 배제할 수 없다고 보고 있다. 이용자 5000만명의 국민 메신저 ‘카카오톡’을 앞세운 카카오가 국내 IT업계를 대리해 국내 앱 장터 점유율 70%가 넘는 구글에 맞서는 형국이다. 앞서 구글은 지난달 1일부터 앱 내 결제 시 수수료 최대 30%를 받는 인앱결제 강제 정책을 본격 시작했다. 구글 결제나 구글이 허용한 제3자 결제를 이용하지 않는 앱은 장터에서 퇴출하기로 한 것이다. 더 나아가 다른 결제 수단을 홍보하는 문구나 아웃링크도 넣지 못하게 했다.\n", + "\n", + "### 답변: 한상장터 ‘인앱결제’를 둘러싼 구글 카카오와 국내 앱 장터 점유율 70%가 넘는 카카오의 갈등이 가열되고 있는 가운데 한상혁 방송통신위원장이 7일 양측 관계자를 불러 의견을 듣기로 했으며, 한 위원장은 6일 방통위 전체회의 직후 이용자들의 불편을 해소하기 위해 노력하는 것은 당연한 의무”라며 “지금 벌어지고 있는 일에 대한 조율은 정책적인 방향에서 해야 할 일이라고 생각한다”고 말했다.<|endoftext|>\n", + "23 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 윤석열 대통령은 경제 위기 상황에 대응해 매주 비상경제 민생회의를 여는 등 직접 민생 현안을 챙기겠다고 밝혔습니다. 윤 대통령은 오늘 5일 용산 대통령실에서 열린 국무회의에서 공급망 재편과 코로나 팬데믹이 겹치면서 전 세계가 70년대 오일쇼크 이후 가장 심각한 물가 충격을 받고 있다 며 이같이 말했습니다. 또 민생의 어려움을 덜기 위해 공공 부문이 앞장설 것이라며 과감한 지출 구조조정과 공공기관 경영 효율화로 허리띠를 졸라맬 것이라고 강조했습니다.\n", + "\n", + "### 답변: 윤석열 대통령은 경제 위기 상황에 대응해 매주 비상경제 민생회의를 여는 등 직접 민생 현안을 챙기겠다고 밝힌 가운데 오늘 5일 용산 대통령실에서 열린 국무회의에서 전 세계가 70년대 오일쇼크 이후 가장 심각한 물가 충격을 받고 있다 며 전 세계가 70년대 오일쇼크 이후 가장 심각한 물가 충격을 받고 있다 고 말했고 또 민생의 어려움을 덜기 위해 과감한 지출 구조조정과 공공기관 경영 효율화로 허리띠를 졸라맬 것이라고 강조했다.<|endoftext|>\n", + "24 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 앵커 새 정부 출범 이후 처음으로 고위급 당정협의회가 열렸지만 물가와 민생 안정이 시급하다는 원론적 언급만 확인했을 뿐 뾰족한 대책은 나오지 않았습니다. 이준석 국민의 힘 대표는 윤석열 정부가 약속한 많은 공약들이 국민들에게 제대로 전달되지 않고 있다 고 쓴 소리를 했습니다. 김주영 기자가 취재했습니다. 리포트 윤석열 정부 한마음 한덕수 총리의 건배사로 시작된 첫 고위급 당정협의회. 당정은 물가 등 민생 안정을 최우선 과제로 꼽았습니다. 권성동 원내대표는 예산과 기금의 적극적 활용을 당부했고 권성동 국민의힘 원내대표 국민들은 새 정부 기대도 잠시 치솟는 장바구니 물가와 기름값 높아진 이자 부담 가스 전기요금 등 생활물가 상승에 답답한 나날 보내고 있습니다. 이준석 대표는 대선 당시 약속한 정책들이 제대로 이행되고 있지 않다고 꼬집었습니다. 이준석 국민의힘 대표 많은 정책이 지금 정책 수요자들에게 아주 효율적으로 전달되고 있지 않습니다 김대기 비서실장은 국회 차원의 협력을 요청했습니다. 김대기 대통령 비서실장 이제는 정치의 힘이 너무 강해진 것 같습니다. 경제가 정치의 핵심이 돼 있기 때문에 어쩔 수 없는 현상이라고 보고… 당정은 수입 물가를 잡기 위한 할당관세 확대 원자재 가격 상승분을 납품가에 반영하는 납품단가 연동제 등을 논의했습니다. 또 취약 계층 지원을 위해 추경 예산의 신속한 집행에 나설 방침입니다. 하지만 그동안 언급돼온 대책의 되풀이에 그쳤을 뿐 심각해지는 경제 위기를 타개할 눈에 띄는 대책은 없었다는 평가입니다. TV조선 김주영입니다.\n", + "\n", + "### 답변: 새 정부 출범 이후 처음으로 열린 고위급 당정협의회에서 새 정부 기대도 잠시 치솟는 물가와 생활물가 상승에 답답한 나날날을 보내고 있는 가운데 이준석 국민의 힘 대표는 윤석열 정부가 약속한 많은 공약들이 국민들에게 제대로 전달되지 않고 있다면서 원론적 언급만 확인했을 뿐 경제 위기를 타개할 실질적인 대책이 나오지 않아 우려를 자아내고 있다.<|endoftext|>\n", + "25 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 대구 뉴시스 이무열 기자 홍준표 왼쪽 대구시장이 5일 오전 대구국제공항 계류장에서 열린 ‘대구경북통합신공항 성공적 건설을 위한 주 티웨이항공 본사 대구이전 MOU체결’ 행사에서 인사말을 하고 있다. 2022.07.05. lmy newsis.com 사진 영상 제보받습니다 공감언론 뉴시스가 독자 여러분의 소중한 제보를 기다립니다. 뉴스 가치나 화제성이 있다고 판단되는 사진 또는 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠습니다.\n", + "\n", + "### 답변: 5일 오전 대구국제공항 계류장에서 열린 ‘대구경북통합신공항 성공적 건설을 위한 주 티웨이항공 본사 대구이전 MOU체결’ 행사에서 홍준표 왼쪽 대구시장이 인사말을 했으며 뉴시스 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 뉴스 가치나 화제성이 있다고 판단되는 사진이나 뉴스 가치성이 있다고 판단되는 사진 또는 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 2022.07.05. lmy newsis.com 사진 영상 제보받습니다 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 기자 가치 가치나 화제성이 있다고 판단되는 사진이나 화제성이 있다고 판단되는 사진 또는 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 뉴시스 뉴시스 사진영상부 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 뉴시스 사진영상부 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다고 밝혔다.<|endoftext|>\n", + "26 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 수도권의 레미콘 운송 차주들이 오늘 1일 부터 파업에 들어갔습니다. 레미콘운송노동조합은 유진기업·삼표산업 등 수도권 주요 레미콘 제조사들과 운송료 인상 관련 협상을 벌였지만 최종 합의에 이르지 못해 오늘부터 운송 거부에 들어간다고 밝혔습니다. 레미콘운송조합은 약 27%의 운송료 인상을 요구하는 반면 제조사들은 9%대 이상 인상은 어렵다는 입장을 고수했습니다. 건설업계는 이달 초 화물연대 파업이 일주일 넘게 이어진 데 이어 레미콘 차량의 운행 중단이 장기화할 경우 건설 현장에 타격이 발생할 수 있다며 우려하고 있습니다.\n", + "\n", + "### 답변: 수도권의 레미콘 운송 차주들이 제조사들과 운송료 인상 관련 협상을 벌였지만 최종 합의에 이르지 못해 오늘부터 운송 거부에 들어간다고 밝혔으며, 건설업계는 이달 초 화물연대 파업이 일주일 넘게 이어진 데 이어 레미콘 차량의 운행 중단이 장기화할 경우 건설 현장에 타격이 발생할 경우 건설 현장에 타격이 발생할 수 있다며 우려하고 있습니다.<|endoftext|>\n", + "27 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 삼성바이오로직스가 미국 제약사 MSD와 2768억원 규모 위탁생산 계약을 체결했다. 사진 삼성바이오로직스 삼성바이오로직스가 미국 제약사 MSD와 위탁생산 계약을 체결했다. 삼성바이오로직스는 MSD MSD International Business GmbH 와 2768억2938만원 규모의 의약품 위탁생산 공급계약을 체결했다고 4일 공시했다. 계약금액은 2768억원으로 최근 매출액 대비 17.65% 규모다. 계약기간은 2022년 7월1일부터 2028년 12월31일이다. 삼성바이오로직스 관계자는 해당 계약은 지난해 9월29일에 공시된 투자판단 관련 주요경영사항에 대한 본 계약 체결 건 이라며 계약금액은 고객사의 수요증가에 따라 4942억원으로 증가할 수 있다 고 말했다.\n", + "\n", + "### 답변: 삼성바이오로직스는 4일 미국 제약사 MSD와 2768억2938만원 규모의 의약품 위탁생산 공급계약을 체결했다고 공시하고 2022년 7월1일부터 2028년 12월31일까지 계약기간은 2022년 7월1일부터 2028년 12월31일이라고 밝혔다.<|endoftext|>\n", + "28 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 3일 협상 타임오프 이견 커…노조 인정도 평행선 운반비 인상은 공감대 형성…올해 7500원·내년 6000원 수도권 공장 일제히 중단할 듯…하루 피해 224억 예상 이데일리 함지현 기자 레미콘 제조사와 운송사업자 간 협상이 또다시 결렬됐다. 이에 따라 전국레미콘운송총연합회가 본격적인 단체 행동에 돌입할 예정이다. 사태가 이어질 경우 수도권 레미콘 공장 ‘셧다운’ 장기화가 불가피할 전망이다. 1일 오전 서울 종로구 동화면세점 앞에서 열린 레미콘운송노동자 생존권사수 결의대회에서 참가자들이 구호를 외치고 있다. 사진 연합뉴스 3일 관련 업계에 따르면 양측은 이날 오전부터 협상을 실시했지만 접점을 찾지 못했다. 이번에 발목을 잡은 부분은 ‘타임오프’ 근로시간 면제수당 와 ‘노조’ 인정 여부였던 것으로 알려졌다. 우선 운송사업자 측은 자신들을 노조로 인정해 달라고 요청했다. 하지만 레미콘 제조사들은 이를 수용할 수 없다고 맞섰다. 지입계약을 맺은 개인사업자로서 단체협상 대상이 아니라는 입장에 변화가 없었던 것이다. 특히 명칭을 놓고 ‘수도권 레미콘 운송연대’와 같이 절충안이 제시되기도 했지만 결국 협상은 결렬됐다. 특히 운송사업자 측은 타임오프 수당도 강력히 요청했다. 타임오프는 제조사별 노조 대표자가 근무를 하지 않아도 상생기금 등을 통한 혜택을 제공하는 것을 말한다. 이에 대해 레미콘 제조사들은 특정 대표자들만 수혜를 주는 게 타당하지 않다며 거부 의사를 밝혔다. 이와 함께 운송사업자들이 그동안 요구해 온 △명절 상여금 100만원 △요소수 100% 지급 △타설 후 폐수 비용으로 레미콘 운송료 50% 지급 등은 논의가 이뤄지지 못했다. 운반비 부분에 대해서는 어느 정도 접점을 찾은 모습이다. 2년에 걸쳐 올해 7500원 내년 6000원씩 총 1만3500원을 올리는 형태다. 앞서 운송사업자들은 현재 5만6000원인 운반비를 7만1000원으로 27% 인상해줄 것을 요구했다. 양측은 이번 협상 결렬 이후 추가적인 협의 진행 여부는 아직 정하지 않았다. 지난 1일 생존권사수결의대회를 진행하면서 파업 신호탄을 쏘아 올린 운송노동자들은 이번 협상 결렬에 따라 4일부터 총파업에 돌입할 계획이다. 이에 따라 이미 지난 1일 95%가량 운영을 멈춰 섰던 수도권 공장은 모두 문을 닫을 것으로 예상된다. 사태 장기화로 셧다운이 길어질 경우 레미콘 제조사들이 큰 타격을 입을 전망이다. 수도권 14개 권역의 158개 레미콘 제조사 공장을 운영하지 못하면 하루 추정 피해액만 224억원 규모에 달한다. 아파트 등 건설 현장 공급 차질도 예상된다. 운송사업자들이 독점적 지위를 가질 수밖에 없는 구조가 변하지 않으면 시장이 왜곡되면서 업계가 경쟁력을 잃을 수 있다는 우려도 나온다. 레미콘 업계 관계자는 “레미콘 운반사업자의 집단적 운송 거부로 인해 레미콘 공장이 멈춰선다면 이는 곧바로 건설 현장 차질까지 이어질 것”이라며 “일부 기득권의 이득을 위해 수많은 소비자들이 피해를 떠안게 되는 셈”이라고 말했다.\n", + "\n", + "### 답변: 지난 레미콘 제조사와 운송사업자 간 협상이 또다시 결렬되어 전국레미콘운송총연합회가 본격적인 단체 행동에 돌입할 예정이며 사태가 이어질 경우 수도권 레미콘 공장 ‘셧다운’ 장기화가 불가피할 전망이다.<|endoftext|>\n", + "29 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: KT 외국인 맞춤 서비스 강화 KT는 최근 입국이 늘고 있는 외국인 고객을 위한 케어서비스를 강화한다고 3일 밝혔다. 국내 거주 외국인 중 비중이 가장 높은 중국인 고객은 위챗 중국 최대 메신저 앱 내 KT 미니프로그램을 통해 KT 유무선 서비스에 대한 중국어 실시간 채팅 상담 통신 상품 사용량 조회 등을 할 수 있다. 사진은 국내 거주 중국인이 이날 실제 위챗 KT 미니프로그램을 이용하는 모습.KT 제공 KT는 최근 입국이 늘고 있는 외국인 고객을 위한 케어서비스를 강화한다고 3일 밝혔다. 국내 거주 외국인 중 비중이 가장 높은 중국인 고객은 위챗 중국 최대 메신저 앱 내 KT 미니프로그램을 통해 KT 유무선 서비스에 대한 중국어 실시간 채팅 상담 통신 상품 사용량 조회 등을 할 수 있다.\n", + "\n", + "### 답변: K 3일 KT는 최근 입국이 늘고 있는 외국인 고객을 위한 케어서비스를 강화한다고 밝힌 가운데 국내 거주 외국인 중 비중이 가장 높은 중국인 고객은 위챗 중국 최대 메신저 앱 내 KT 미니프로그램을 통해 KT 유무선 서비스에 대한 중국어 실시간 채팅 상담 통신 상품 사용량 조회 등을 할 수 있으며 국내 거주 외국인 중 비중이 가장 높은 중국인 고객은 위챗 중국 최대 메신저 앱 내 KT 미니프로그램을 통해 KT 유무선 서비스에 대한 중국어 실시간 채팅 상담 통신 상품 사용량 조회 등을 할 수 있다.<|endoftext|>\n", + "30 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 대전조차장역 인근서 탈선…경상 7명 포함 총 11명 부상 최대 110분 지연…원희룡 SR·코레일 등 혁신 만전 1일 오후 서울 강남구 SRT수서역 매표소 앞에 열차 탈선사고로 인한 열차 지연과 배상 안내문이 걸려있다. 이날 부산에서 수서역으로 향하던 SRT 열차가 대전조창역 인근에서 탈선하는 사고가 발생해 11명이 부상을 입었다. 국토부와 한국철도공사는 복구 작업과 함께 사고 원인을 조사중이다. 2022.7.1 뉴스1 © News1 박세연 기자 서울 뉴스1 김진 기자 1일 오후 부산역을 출발해 서울 수서역을 향하던 SRT 열차가 탈선해 총 11명이 다쳤다. 열차 운행이 지연되는 가운데 한국철도공사 코레일 는 심야 임시전동열차 운영을 결정했다. 코레일은 이날 오후 KTX 및 일반열차들이 상당 시간 지연 운행되고 있다 며 수도권 전동열차 이용객들의 편의를 위해 기존 막차 시간보다 약 1시간 19분 연장 운행한다 고 밝혔다. 연장운행 노선은 경인선과 경부선 총 2개 노선이다. 인천을 향하는 경인선 하행 막차는 2일 새벽 1시10분 서울역 지상 에서 출발한다. 구로를 향하는 경부선 상행 은 같은 날 0시55분 병점역에서 출발할 예정이다. 앞서 수서행 SRT 338호 열차는 이날 오후 3시21분쯤 대전조차장역 인근에서 탈선했다. 열차의 1호차와 맨 후부 동력차 총 2량이 궤도를 이탈했다. 오후 1시45분 부산역에서 출발한열차는 4시8분 수서역에 도착할 예정이었다. 해당 열차에는 380명이 탑승해 있었고 사고로 11명이 다쳤다. 4명은 귀가 조치됐고 7명은 인근 병원으로 이송됐으나 경상으로 파악됐다. 나머지 승객들은 인근 역까지 도보로 이동한 뒤 연계버스로 환승 조치됐다. 사고로 인해 KTX·SRT 열차 운행은 모두 지연됐다. 서울행 상행 KTX 열차는 대전 서울 간 일반선으로 우회 운행되고 있으며 수서행 상행 SRT 열차는 대전 신탄진 간 하행 고속선로를 이용되고 있다. 상행선은 최대 110분가량 지연 운행 중으로 6개 열차는 운행을 중지한 상태다. 부산행 하행 KTX·SRT 열차는 정상 운행 중이나 열차 운행 조정 등으로 최대 40분 지연 운행 되고 있다. 사고 복구는 열차 운행이 종료되는 밤 11시부터 본격적으로 시작될 예정이다. 코레일은 첫 열차 오전 5시5분 서울역 출발 운행을 목표로 복구 작업을 진행할 방침이다. 코레일은 현장에는 차량 시설 전기 등 300여명의 복구인력과 기중기 모터카 등 가용할 수 있는 모든 장비를 투입해 작업할 예정 이라고 설명했다. 1일 부산에서 수서역으로 향하던 SRT 열차가 대전조창역 인근에서 탈선하는 사고가 발생해 관계자들이 사고를 수습하고 있다. 2022.7.1 뉴스1 © News1 김기태 기자 주무부처인 국토교통부는 관계기관과 정확한 사고 원인을 파악 중이다. 주요 탈선 원인으로는 폭염이 거론된다. 30도를 웃도는 무더위에 레일이 팽창하면서 선로에 뒤틀림 현상이 발생했을 가능성이다. 사고 발생 열차는 바퀴가 빠진 것으로 알려졌다. 원인 조사는 국토부 항공철도사고조사위원회가 맡게 된다. 국토부는 사고 발생 직후 철도안전감독관·철도경찰 및 사고조사반을 현장에 투입하고 대책 매뉴얼에 따라 철도재난상황반을 구성해 대응에 나섰다. 긴급대책회의 및 장관 보고도 이뤄졌다. 원희룡 국토부 장관은 관련 보고를 받고 철도 등 교통을 총괄하는 장관으로서 이번 사고로 인해 피해를 입은 승객과 불편을 겪고 있는 국민께 진심으로 송구하다 며 신속한 복구 작업을 지시했다. 특히 원 장관은 이번 사고와 관련해 공공기관 혁신 을 재차 언급했다. 원 장관은 사고 차량을 운행한 SR과 차량정비·유지보수 등을 담당하는 코레일 직원들이 자신의 가족이 열차를 이용한다고 생각하고 긴장감을 갖고 업무에 임했으면 이러한 사고가 발생하지 않을 것 이라고 강조했다. 이어 정확한 사고조사를 바탕으로 철저한 안전관리체계를 구축하는 것은 물론이고 사소한 사고도 재발하지 않도록 코레일 SR 등 공공기관 스스로 혁신하는 데 만전을 기할 것 이라고 덧붙였다. 1일 부산에서 수서역으로 향하던 SRT 열차가 대전조창역 인근에서 탈선하는 사고가 발생 열차의 바퀴가 선로에서 이탈해 있다.\n", + "\n", + "### 답변: 1일 오후 부산역을 출발해 서울 수서역을 향하던 SRT 열차가 대전조차장역 인근에서 탈선하는 사고가 발생해 11명이 부상을 입었는데, 코레일은 수도권 전동열차 이용객들의 편의를 위해 기존 막차 시간보다 약 1시간 19분 연장 운행하고, 사고 복구는 열차 운행이 종료되는 밤 11시부터 본격적으로 시작될 예정이다.<|endoftext|>\n", + "31 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 이창용 한국은행 총재 사진 이기범 기자 leekb 인플레이션 상황이 심각해지면서 한국은행이 사상 첫 빅스텝 기준금리 0.5%포인트 인상 에 나설 가능성도 높아진다. 증권가에서는 한은의 빅스텝을 예상하면서도 하반기 경기 상황에 따라 금리 인상에 속도 조절을 할 가능성이 있다고 보고 있다. 5일 금융투자업계에 따르면 국내 증권사들은 오는 14일 열리는 금융통화위원회에서 기준금리 50bp 1bp 0.01%포인트 인상이 결정될 것으로 전망한다. 우리나라에서 기준금리 50bp 인상은 유례가 없는 일이다. 실제 빅스텝을 단행할 경우 기준금리는 현재 1.75%에서 2.25%로 오른다. 빅스텝 전망의 가장 큰 이유는 급격한 물가상승이다. 이날 통계청이 발표한 6월 국내 소비자물가지수는 108.22로 전년 동월대비 6% 상승했다. 외환위기였던 1998년11월 6.8% 이후 가장 높은 수치다. 2 3%를 오가던 물가상승률은 지난 3월 4.1%를 기록한 이후 4월 4.8% 5월 5.4%로 갈수록 높아지는 추세다. 러시아 우크라이나 전쟁으로 인한 에너지와 원자재 곡물 가격 상승 원화 약세로 인한 수입물가 상승 등이 주요 원인으로 꼽힌다. 심각한 물가를 잡기 위해선 금리 인상이 불가피하다는 분석이다. 임재균 KB증권 연구원은 6월 소비자물가가 고점을 기록했지만 하반기에는 공공요금 인상 등으로 물가 상승 압력이 더 높아질 수 있다 며 7월 금통위에서 50bp 인상을 단행할 것 이라고 설명했다. 미국 연방준비제도의 2연속 자이언트스텝 75bp 인상 가능성으로 인한 한미 금리차 역전도 우리나라 기준금리 인상 압력을 높이는 요인이다. 신흥국으로 분류되는 한국은 통상 미국보다 금리를 높게 유지해 왔다. 하지만 최근 미국이 연달아 금리를 높이면서 현재 한국과 미국의 금리는 같은 수준 1.75% 으로 올라왔다. 페드워치 FedWatch 에 따르면 오는 26 27일 열리는 FOMC 미국 연방공개시장위원회 에서 75bp 인상할 확률은 95.1%다. 이 경우 미국 기준금리는 2.25 2.5%가 된다. 한은이 빅스텝을 하더라도 미국 금리가 더 높아진다. 금리가 더 높은 곳으로 이동하는 자본의 특성을 고려할 때 한미 금리차 역전은 한국에서의 자본 유출을 심화시키는 요인으로 지적된다. 이를 최소화하기 위해서라도 한국은 미국의 금리 인상 속도에 어느정도 발을 맞출 수밖에 없다. 민지희 미래에셋증권 연구원은 외국인 자본 유출은 단순 금리차 외에도 국내 펀더멘털 기초체력 둔화 속도의 영향을 받을 가능성이 높다 며 미국 연준의 75bp 인상 가능성이 높은 만큼 우리나라도 빅스텝 가능성이 크다 고 전망했다. 급격한 금리 인상은 소비를 위축시키고 경기 침체 우려를 불러온다. 지금 인플레이션이 수요 때문이 아닌 공급의 문제라는 점에서 각국 중앙은행들의 긴축 조치가 적절한 것이냐는 의문도 제기된다. 하지만 시장 거품을 진정시키기 위해선 경기 침체를 감내해서라도 금리 인상하는 수단을 써야 한다는 시각도 존재한다. 강승원 NH투자증권 연구원은 미국은 경기 침체 가능성을 용인하면서까지 물가와 싸우고 있다 며 한국은 수출 국가이자 인플레이션 압력을 강제로 수입하고 있는 국가라는 점에서 딜레마가 더 크다 고 지적했다. 그러면서 당장 7월 금통위에서 50bp 인상을 피할 수 없을 것 이라며 8월 금통위에서도 25bp 추가 인상을 통해 연말 기준금리 전망치인 2.5%에 도달할 것 이라고 분석했다. 글로벌 긴축이 진행될 수록 증시 변동성도 높아진다. 금리 인상으로 채권 가격이 하락할뿐 아니라 할인율 상승으로 주식의 상대적 매력이 떨어진다. 실질적으론 기업의 자금조달 압력이 커지면서 실적에도 부담이 될 수 있다. 급격한 긴축으로 인한 경기 침체 가능성이 커지면서 연말로 갈수록 긴축 강도는 약해질 수 있다는 분석도 나온다. 민 연구원은 최근 국내 경기에 대한 우려가 높아지면서 하반기 예정된 두 번의 금통위 10월 11월 중 한 번 25bp 올리거나 두 차례 모두 동결할 가능성이 있다 며 연말 우리나라 기준금리 전망은 2.5% 혹은 2.75%가 될 것 이라고 전망했다. 이어 시장은 미국 연준이 4분기에도 빅스텝을 가져갈 것으로 예상하지만 그 보단 인상 속도가 좀 낮아질 수도 있다 며 미국이 긴축 속도를 조절하면 한국도 조절할 가능성이 있다 고 말했다.\n", + "\n", + "### 답변: 인플레이션 상황이 심각해지면서 한국은행이 사상 첫 빅스텝 기준금리 0.5%포인트 인상 에 나설 가능성도 높아져, 증권가에서는 한은의 빅스텝을 예상하면서도 하반기 경기 상황에 따라 금리 인상에 속도 조절을 할 가능성이 있다고 보고, 오는 14일 열리는 금융통화위원회에서 기준금리 50bp 1bp 0.01%포인트 인상이 결정될 것으로 전망하고 있다.<|endoftext|>\n", + "32 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 뉴시스 이재준 기자 오미크론 변이를 중심으로 코로나19가 기승을 부리는 대만에서 4일 신규환자는 2만3118명으로 2개월 만에 2만명대로 줄었지만 추가 사망자는 69명 나왔다. 중앙통신과 연합보 聯合報 중국시보 中國時報 등에 따르면 코로나19 대책본부인 중앙유행병 지휘센터는 이날 확진자 가운데 대만 안에서 2만3045명 생기고 외국에선 73명이 들어왔다고 발표했다. 전날 감염자는 3만2681명 2일 3만4827명 7월1일 3만5800명 6월30일 3만8942명 29일 4만2204명 28일 4만4428명 27일 2만8530명 26일 3만9646명 25일 4만398명 24일 4만5767명 23일 4만8356명 22일 5만2246명 21일 5만6404명 20일 경우 3만5632명으로 1개월 2주일 만에 3만명대로 떨어졌다. 19일은 5만636명 18일 5만3707명 17일 5만5261명 16일 6만3221명 15일 6만8939명 14일 6만6189명 13일 4만5110명 12일 5만657명 11일 7만9663명 10일 6만8347명 9일 7만2967명 8일 8만223명 7일 8만3027명 6일 5만3023명 5일 6만2110명 4일 6만8151명 3일 7만6564명 2일 7만6986명 6월1일 8만8293명 5월31일 8만705명 6일 3만6213명 4일 2만8487명 2일 1만7858명 1일 1만7085명 4월30일 1만5149명이다. 대만 내 새 감염자는 22개 현시에서 발생했으며 남성 1만929명 여성 1만2087명 29명은 확인하고 있다. 나이는 5세 미만에서 90대 사이다. 신베이시에서 3438명 타이중시 3217명 가오슝시 2719명 타오위안시 2411명 타이베이시 1992명 타이난시 1842명 장화현 1336명 핑둥현 921명 먀오리현 619명 윈린현 609명 신주현 599명 신주시 491명 이란현 491명 난터우현 472명 자이현 439명 화롄현 436명 타이둥현 254명 지룽시 246명 자이시 213명 펑후현 157명 진먼현 125명 롄장현 18명이다. 외부 유입 감염자는 남성 42명 여성 31명이다. 나이는 5세 미만에서 80대까지다. 미국에서 3명 베트남 2명 독일과 터키 스페인 1명씩 유입했고 65명은 출발 국가를 조사하고 있다. 이로써 대만 코로나 감염자는 총 389만3643명에 달했다. 대만 안에서 387만8594명이고 국외 유입이 1만4995명 친선함대 36명 항공기 2명 불명 1명 조사 중 14명이다. 코로나19 환자는 작년 5월10일 100명 미만이다가 이후 1년1개월24일 동안 크게 증대하면서 이날까지 389만3550명 가까이 늘어났다. 지휘센터는 코로나19 환자 가운데 이날 전날 88명에서 19명 줄어든 69명이 새로 사망했다고 전했다. 남성 36명 여성 33명으로 연령이 5세 미만에서 90대 사이다. 64명이 만성질환자이고 48명은 백신을 3차까지 맞지 않았다. 이제껏 코로나19 감염자 중 7025명이 숨졌다. 이중 15명은 국외 유입자다. 대만 내에서 숨진 환자 7010명 분포를 보면 신베이시 1726명 수도 타이베이 905명 타이중시 656명 가오슝시 598명 타오위안시 557명 타이난시 457명 장화현 362명 핑둥현 289명 윈린현 182명 난터우현 179명 지룽시 173명 이란현 159명 먀오리현 137명 자이현 128명 화롄현 114명 신주현 111명 자이시 109명 타이둥현 89명 신주시 67명 진먼현과 펑후현 각 9명이다.\n", + "\n", + "### 답변: 오통신과 연합보 聯合報 중국시보 中國時報 등에 따르면 코로나19 대책본부인 중앙유행병 지휘센터는 이날 오미크론 변이를 중심으로 코로나19가 기승을 부리는 대만에서 4일 신규환자는 2만3118명으로 2개월 만에 2만명대로 줄었지만 추가 사망자는 69명 나와 대책본부인 중앙유행병 지휘센터는 이날 확진자 가운데 대만 안에서 2만3045명 생기고 외국에선 73명이 들어왔다고 발표했고 대만 내 새 감염자는 22개 현시에서 발생했으며 남성 1만929명 여성 1만2087명 확인하고 있다.<|endoftext|>\n", + "33 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하분이 적용된 휘발유 및 경유를 주유하고 있다.\n", + "\n", + "### 답변: 1일 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하분이 적용된 휘발유 및 경유를 주유하고 있으며 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하분이 적용된 휘발유 및 경유를 주유하고 있고, 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰뜰주유소를 찾은 시민들이 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하분이 적용된 휘발유 및 경유를 주유하고 있다.<|endoftext|>\n", + "34 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 뉴시스 1사 1인 장애인 채용 1호 기업 인 한국후꼬꾸에서 김동석 IBK기업은행 기업지원부장 오른쪽 과 이동일 한국장애인고용공단 부장 왼쪽 이 지난달 23일 회사 관계자들과 기념촬영을 하고 있다. 2022.7.4 사진 IBK기업은행 제공 photo newsis.com 서울 뉴시스 정옥주 기자 IBK기업은행은 한국장애인고용공단과 1사 1인 장애인 채용 캠페인 을 추진한다고 4일 밝혔다. 이는 지난해 10월 체결한 중소기업 장애인 채용 지원을 위한 업무협약 의 후속사업이다. 이번 캠페인을 통해 두 기관은 장애인 채용 희망 중소기업에게 장애인 구인서비스를 밀착 지원한다. 장애인공단의 장애인 고용컨설팅과 기업은행의 경영 컨설팅도 무료로 제공한다. 또 장애인 채용 시 기업은행은 일자리 채움펀드를 통해 1인당 100만원의 금융비용을 지원하고 장애인 고용 우수기업으로 선정될 경우 금리 우대 대출상품도 활용할 수 있다. 참여 신청방법은 기업은행이 운영하는 중소기업 전문 취업포털 아이원 잡 i ONE JOB 홈페이지에서 가능하며 참여 기업을 상시 모집한다. 기업은행 관계자는 이번 캠페인을 통해 중소기업의 장애인 채용에 많은 관심을 기대한다 고 말했다.\n", + "\n", + "### 답변: IBK기업은행은 한국장애인고용공단과 중소기업 장애인 채용 지원을 위한 업무협약 의 후속 사업으로 지난해 10월 중소기업 장애인 채용 지원을 위한 업무협약 의 후속 사업으로 1사 1인 장애인 채용 캠페인 을 추진한다고 4일 밝혔다.<|endoftext|>\n", + "35 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 은평·서대문구 경기 고양시 등지에 이른바 러브 버그 라 불리는 벌레떼가 출몰해 주민들이 불편을 겪고 있다. 사진은 러브 버그 모습. 사진 연합뉴스 최근 서울 서북권과 경기 고양시 등에 떼로 나타난 일명 러브버그 사랑벌레 . 벌레를 싫어하는 사람에게 혐오감을 줄지언정 해충은 아니라는 것이 중론입니다. 오늘 5일 환경부 국립생물자원관 등에 따르면 최근 출몰한 러브버그는 계피우단털파리 로 추정되며 유전자 분석이 아직 진행 중이긴 하지만 외래종보다는 자생종일 가능성에 무게가 실립니다. 유전자 분석 결과는 이번 주 내 나올 전망입니다. 자원관 관계자는 국내에 털파리 전공자가 없어 이번에 나타난 러브버그가 언제부터 국내에 있었는지 등을 추적하기 어려운 상황 이라고 설명했습니다. 같은 털파리과에 속하며 미국에서 러브버그로 불리는 플리시아 니악티카 는 플로리다주 등 멕시코만에 접한 미국 남부지역 등에서 여름철 단골손님이다. 코스타리카 온두라스 멕시코 등에도 서식합니다. 국내 러브버그와 플리시아 니악티카는 특성이 비슷할 것으로 추측됩니다. 플로리다대 식품 및 농업과학연구소 IFAS 가 펴낸 책 등을 보면 플리시아 니악티카는 몸길이가 수컷은 6㎜ 정도이고 암컷은 8㎜가량으로 작으며 생존시간은 실험실 환경에선 수컷과 암컷 각각 92시간과 72시간 정도인데 자연에서는 짝을 찾아 교미하고 알을 낳는 데 필요한 만큼 만 삽니다. 주로 낮에 기온이 20도 이상일 때만 날아다니고 밤에는 낮은 초목에 숨어서 쉽니다. 플리시아 니악티카는 통상 연중 4 5월과 8 9월 두 차례 번성하며 고속도로 주변에 떼로 살면서 차에 부딪혀 자국을 남기는 터라 미국에서도 골칫거리 로 취급받기도 합니다. 암컷 플리시아 니악티카는 썩어가는 식물이나 잔해 밑에 100 350개 알을 낳으며 알에서 애벌레가 태어나는 데는 약 20일이 걸립니다. 그간에도 우리나라 생태계 일원으로 살아온 러브버그가 이번에 화제의 중심에 오른 이유는 도심에 떼로 나타났기 때문입니다. 털파리류 애벌레가 성체로 우화 羽化 하려면 고온다습해야 하는데 지난달까지는 가뭄으로 이런 환경이 나타나지 않다가 최근 장마철에 들어서면서 한꺼번에 성체가 됐다는 분석이 나옵니다. 지방자치단체들이 민원에 러브버그 방역에 나섰지만 전문가들은 그럴 필요가 있는지 의문을 제기합니다. 대기가 건조해지면 금방 죽기 때문인데 당국은 장마가 끝나고 2주 정도 지나면 러브버그들이 자연히 소멸할 것으로 예상합니다. 더구나 러브버그는 굳이 따지자면 해충보다는 익충에 가깝습니다. 국립생물자원관 관계자는 사람에게 질병을 옮기거나 농작물을 해쳐 농사를 망치지 않는다 라고 말했습니다. 플리시아 니악티카는 사람을 물거나 쏘지 않아 위협이 되지 않고 다양한 식물의 화밀 花蜜 을 먹기에 수분에는 도움을 줍니다. 애벌레의 경우 썩은 식물을 유기물로 바꿔 땅을 옥토로 바꾸는 역할을 하는 것으로 알려졌습니다. 러브버그를 피하고 싶다면 어떻게 해야 할까. 지난 2015년 학술지 Florida Entomologist 에 실린 논문에 따르면 플리시아 니악티카는 수컷이든 암컷이든 꽃에서 유래된 페닐아세트알데히드 PAA 에 후각적으로 끌리고 노란색과 흰색에 시각적으로 끌리는 것으로 나타났습니다. 러브버그를 멀리하려면 꽃향기가 나는 향수와 노란옷이나 흰옷을 입지 않는 것이 좋다는 의미입니다.\n", + "\n", + "### 답변: 5일 환경부 국립생물자원관 등에 따르면 최근 서울 서북권과 경기 고양시 등에 떼로 나타난 이른바 러브 버그 라 불리는 벌레떼가 계피우단털파리로 추정되며 유전자 분석이 아직 진행 중이긴 하지만 외래종보다는 자생종일 가능성에 무게가 실리고 있어 국내 러브버그와 플리시아 니악티카는 특성이 비슷할 것으로 추측된다.<|endoftext|>\n", + "36 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 화학연·안전성평가연구소 등과 시너지 제고 신·변종 감염병·원숭이두창 등 연구 박차 최영기 왼쪽 한국바이러스기초연구소장과 신의철 바이러스면역연구센터장이 5일 오후 기초과학연구원 과학문화센터에서 출범1주년 간담회를 열고 연구성과에 대해 설명하고 있다. 사진 IBS 제공 신·변종 감염병 등을 연구하는 한국바이러스기초연구소 바이러스연 가 출범 1주년을 맞았다. 코로나19와 원숭이두창 등 주요 감염병을 대응하는 기초연구는 물론 국내에 부족한 바이러스 분야 인재를 육성하는 데 역량을 집중하고 있다. 올해는 주요 정부출연연구기관 등과 바이러스 연구협력 협의체 를 구축 연구기관간 시너지를 내는 데도 주력하고 있다. 5일 기초과학연구원 IBS 에 따르면 바이러스연은 IBS 산하 조직으로 지난해 7월 1일 설립한 후 바이러스 기초원천역량을 확보해 국내 감염병 안보에 공헌하는 것이 목표다. 바이러스연은 현재 신·변종 바이러스 연구센터 와 바이러스 면역 연구센터 2개 센터로 구성돼 있다. 각각 신·변종 바이러스의 이해를 통한 바이러스성 질병 극복 연구와 면역병리 기전 연구 등을 수행한다. 출범 후 고연령 코로나19 감염자의 중증도와 전파율이 저연령 감염자 보다 높다는 사실을 동물실험으로 입증하는 등 신종 감염병 연구에 매진하고 있다. 이르면 내년 바이러스 구조분석 플랫폼 연구센터도 추가 설립해 연구 역량을 확대할 예정이다. 바이러스연은 현재 한국화학연구원 안전성평가연구소 등과 함께 바이러스 연구협력 협의체 를 구축해 기초·응용연구간 시너지 효과도 제고하고 있다. 최영기 바이러스연구소장은 협력체를 통해 국가방역에 도움이 될 수 있는 기반 연구를 수행하겠다 며 좀더 빠르게 국민들에게 옳은 정보와 바이러스를 대처할 수 있는 좋은 방향을 제시할 수 있는 연구를 하도록 노력하겠다 고 말했다. 신의철 바이러스면역연구센터장은 바이러스를 빠르게 대응하는 연구 외에도 향후 발생할 신종 바이러스를 미리 대비하는 연구도 수행하고 있다 며 어떤 바이러스가 오더라도 대응할 수 있도록 연구에 최선을 다하겠다 고 강조했다. 한편 이날부터 6일까지 대전 IBS 과학문화센터에서 바이러스연 출범 1주년을 기념하는 바이러스 연구 포럼 이 열린다. 5일에는 바이러스 면역 연구센터를 포함해 한국생명공학연구원 한국과학기술원 KAIST 등이 6일에는 신변종 바이러스 연구센터를 필두로 한국화학연구원 등이 대표 연구성과를 발표한다. 포럼은 IBS 유튜브 채널에 생중계되며 자세한 정보는 포럼 누리집을 참고하면 된다.\n", + "\n", + "### 답변: 한국바이러스기초연구소 바이러스연은 코로나19와 원숭이두창 등 주요 감염병을 대응하는 기초연구는 물론 국내에 부족한 바이러스 분야 인재를 육성하고, 올해는 주요 정부출연연구기관 등과 바이러스 연구협력 협의체 를 구축 연구기관간 시너지를 내는 데도 주력하고 있으며 출범 1주년을 맞았다.<|endoftext|>\n", + "37 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 머니S리포트 물가·금리에 환율까지 3高 ④ 매매 차익·이자 수익 톡톡 편집자주 물가와 환율 금리가 모두 상승하는 3중고 로 인해 대한민국 경제에 비상이 걸렸다. 2년 넘게 이어진 팬데믹 세계적 감염병 대유행 상황에서 물가 상승 지속 러시아·우크라이나 전쟁 장기화 미국 연방준비제도 Fed 연준 의 기준금리 인상 중국의 봉쇄 조치까지 대외 불확실성이 커지면서 대다수 기업들이 실적 둔화를 겪을 것이란 전망이다. 원 달러 환율이 약 13년 만에 최고 수준으로 치솟으면서 외국인 투자금 이탈이 가속화되고 있다는 점도 국내 증시엔 부담이다. 현재 코스피의 외국인 보유 비중은 30% 정도로 2009년 이후 가장 낮은 수준이다. 반면 섬유의복·제약바이오 등 일부 업종은 환율 상승에 따른 수혜가 기대되기도 한다. 증시를 떠난 투자자들은 고환율을 이용 달러에 투자하는 상장지수펀드 ETF 와 달러예금 달러보험 등으로 눈을 돌리고 있다. 안전자산으로 분류되는 채권 역시 개인의 순매수 금액이 1년 간 2배 가까이 증가하는 등 자금이 몰리고 있다. 글로벌 금리 인상 기조가 지속되고 채권금리 또한 상승하면서 채권으로 손을 뻗은 투자자들이 급증한 것으로 나타났다. 사진 이미지투데이 기사 게재 순서 ① 또 커지는 불확실성 대한민국 경제 비상 ② 强달러에 돈 몰린다… 달러 예금·보험부터 ETF까지 ③ 원화 약세에 셀코리아 ... 한미 금리 역전 우려에 하반기도 답없다 ④ 투자 암흑기... 채권 저가매수 기회 6월 한 달 새 코스피지수가 연중 최저점을 일곱 차례 경신하고 비트코인을 비롯한 암호화폐 가상화폐 가 급락하는 등 금융 자산이 휘청이면서 채권으로 눈을 돌리는 투자자들이 늘고 있다. 저가 매수와 이자 수익에 대한 기대감 등에 주목하고 있는 것이다. 러시아와 우크라이나 전쟁 장기화 미국의 강한 긴축 기조 지속적인 물가 상승 우려 중국의 신종 코로나바이러스 감염증 코로나19 봉쇄 조치 등 많은 매크로 거시경제 불확실성이 지속되면서 주식 등 위험자산에 대한 회피 심리가 강해졌다. 반대로 안전자산으로 분류되는 채권은 환영을 받는 분위기다. 개인의 채권 순매수 금액은 1년 간 2배 가까이 증가했다. ━ 채권금리 상승에 채권 투자 매력↑ ━ 그래픽 김은옥 기자 글로벌 금리 인상 기조가 지속되고 채권금리 또한 상승하면서 채권으로 손을 뻗은 투자자들이 급증한 것으로 나타났다. 금융투자협회 채권정보센터에 따르면 6월 17일 3년 만기 국고채 금리는 전거래일 대비 1.7bp 1bp 0.01%포인트 오른 연 3.745%로 마감했다. 2011년 8월 4일 연 3.770% 이후 최고치였다. 이후 3.5 3.6%대를 등락하고 있다. 채권 투자 방법은 만기 보유 와 트레이딩 거래 등 크게 두 가지 방식으로 나뉜다. 만기 보유는 만기가 도래할 때까지 채권을 팔지 않고 이자를 받은 후 만기에 원금을 돌려 받는 방법 트레이딩은 채권을 사고팔며 매매차익을 거두는 방법이다. 통상 시장 금리가 오르면 시장에서 거래되는 채권 가격은 하락해 이미 발행돼 거래되는 채권을 저가에 매수 매매 차익을 기대할 수 있다. 새롭게 발행되는 채권은 발행 금리가 높기 때문에 이자 수익을 노려볼 수 있다. 황세운 자본시장연구원 선임연구위원은 채권금리 상승은 평가 손실이 발생할 수 있는 위험이 있어 금리 상승기가 채권 투자에 부담스러운 시기로 여겨질 수도 있으나 만기까지 보유한다면 얘기가 달라진다 며 중간에 발생하는 이자를 지급받으면서 만기까지 보유하면 평가 손실에 대한 걱정은 하지 않아도 되기 때문 이라고 설명했다. 이어 올해 채권금리는 추가 상승이 가능할 것이란 전망이 나오는 만큼 연말까지 더 상승할 가능성이 있다 며 채권 투자 적기는 향후 예상 이자율 등을 고려해 신중하게 판단해야 한다 고 덧붙였다. ━ 개인 채권 투자금액 1년 새 2배 껑충 ━ 삼성증권의 올 5월 말까지 개인투자자 평균 채권 투자금액은 1억9732만원으로 전년동기 대비 91% 증가했다 그래픽 김은옥 기자 과거와 달리 최근엔 1만원 전후의 채권 소액투자가 가능해졌다. 그만큼 개인투자자들의 채권 투자 문턱이 낮아진 것이다. 이 같은 배경과 맞물리며 개인투자자들의 채권 투자도 크게 늘었다. 채권의 경우 주식과 달리 장외시장 비중이 높다. 금융투자협회에 따르면 개인투자자들은 올들어 6월 28일까지 장외 채권시장에서 채권 4조8805억원어치를 순매수한 것으로 집계됐다. 전년동기 2조6253억원 보다 86% 가량 증가한 수치다. 삼성증권의 경우 올해 개인투자자 대상 채권 판매 규모는 5월 말 기준 지난해 같은 기간에 비해 47% 늘어난 2조2000억원을 기록했다. 신종자본증권과 회사채는 이자 지급 주기가 3개월로 짧다는 장점이 있다. 높은 이자수익을 노리는 투자자들은 은행·금융지주사가 발행한 신종자본증권과 일반 회사채를 절세를 노리는 투자자들은 저쿠폰 국채를 선호하는 추세를 보이고 있다는 게 삼성증권의 설명이다. 개인투자자들의 평균 채권 투자금액도 급증세다. 삼성증권 관계자는 올 5월 말까지 개인투자자들의 평균 채권 투자금액은 1억9732만원으로 전년동기 1억351만원 대비 91% 증가했다 고 말했다.\n", + "\n", + "### 답변: 물 상승, 러시아·우크라이나 전쟁 장기화, 미국 연방준비제도 Fed 연준 의 기준금리 인상 중국의 봉쇄 조치까지 물가와 환율 금리가 모두 상승하는 3중고로 인하여 대한민국 경제에 비상이 걸렸으며, 증시를 떠난 투자자들은 달러에 투자하는 ETF 와 달러예금 달러보험 등으로 눈을 돌리고 있다.<|endoftext|>\n", + "38 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 구글 결제 정책 미준수로 최신 버전 심사 거절 6월 30일부터 구글플레이 업데이트 적용 안 돼 카카오 다음에서 최신 버전 다운로드 안내 중 카카오톡 이모티콘 플러스의 웹 결제용 아웃링크 공지. 사진 카카오톡 구글이 인앱결제 강제 정책을 따르지 않은 카카오톡에 업데이트 중단 이라는 초강수로 대응했다. 인앱결제강제방지법 시행에 맞선 구글이 앱마켓 입점 사업자를 제재한 첫 사례다. 5일 업계에 따르면 구글은 지난 6월 30일부터 앱 내 웹 결제 아웃링크를 유지한 카카오톡 의 앱 업데이트 심사를 거절했다. 이에 지난달 30일부터 구글 앱마켓 구글플레이에서 최신버전 v9.8.5 의 카카오톡을 설치할 수 없게 됐다. 카카오 관계자는 구글의 결제 정책을 준수하지 않았다는 이유로 최신 버전 심사가 거절됐다 며 이용자 불편을 최소화하기 위해 지난 1일부터 다음 검색을 통해 카카오톡 최신 버전을 다운로드 받을 수 있도록 안내하고 있다 고 했다. 다음에서 APK 안드로이드패키지 파일로 카카오톡 최신 버전을 설치할 경우 경로를 알 수 없는 앱 이라는 등 보안경고 가 뜬다. 이에 대해 카카오는 다음에서 카카오톡 검색 시 제공 중인 카카오톡의 APK 파일은 카카오에서 제공하는 공식 설치 파일이므로 안심하고 설치를 진행해달라 고 고객센터를 통해 안내하고 있다. 사진 카카오톡 고객센터 카카오는 지난 5월 말부터 카카오톡 앱 내 이모티콘 구독 서비스 이모티콘 플러스 결제 화면에 웹에서는 월 3900원의 가격으로 구독하실 수 있습니다 라는 문구와 함께 웹 결제 화면으로 연결되는 아웃링크 를 도입했다. 구글 인앱결제 정책으로 수수료가 인상되면서 이모티콘 플러스 가격이 월 4900원에서 5700원으로 올랐기 때문이다. 카카오 측은 구독 상품을 기존 가격대로 구매할 수 있는 방법을 안내할 필요가 있다고 판단해 웹 결제 아웃링크를 추가한 것 이라고 설명했다. 구글은 아웃링크 유지가 자사 앱마켓 정책에 위배된다는 입장이다. 구글은 지난달부터 자사 인앱결제 시스템이나 개발자 제공 인앱결제 인앱결제 내 제3자 결제방식 를 강제하는 앱마켓 정책을 도입했다. 구글은 이 정책을 지키지 않는 앱은 구글플레이에서 삭제하겠다고 경고해왔다. 구글 인앱결제 강제 방지법을 집행하는 방송통신위원회는 현재 실태조사 중이라는 이유로 적극적인 제재를 미루고 있다. 앱 삭제는 면했지만 조만간 카카오톡 앱이 구글플레이에서 사라지게 될 가능성도 있다. 카카오가 당분간 아웃링크 유지를 고수할 계획이기 때문이다. 카카오 관계자는 이용자들의 결제 방법을 선택할 수 있도록 인앱결제 외 다른 결제 방법을 함께 안내하는 현재 방식을 당분간 유지하고자 한다 고 전했다.\n", + "\n", + "### 답변: 5일 업계에 따르면 구글은 지난 6월 30일부터 앱 내 웹 결제 아웃링크를 유지한 카카오톡의 앱 업데이트 심사를 거절하였고 이에 지난달 30일부터 구글 앱마켓 구글플레이에서 최신버전 v9.8.5 의 카카오톡을 설치할 수 없게 되어 카카오 관계자는 구글의 결제 정책을 준수하지 않았다는 이유로 최신 버전 심사가 거절되어 지난 1일부터 다음 검색을 통해 카카오톡 최신 버전을 다운로드 받을 수 있도록 안내하고 있다고 전했다.<|endoftext|>\n", + "39 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: SRT 운영사인 SR은 대전조차장역 인근에서 발생한 열차 탈선 사고를 계기로 비상 대응 매뉴얼을 전면 개편한다고 밝혔습니다. 이종국 SR 대표이사는 오늘 4일 서울 강남구 본사에서 대전조차장역 인근 탈선 사고 대책 점검 회의를 주재한 자리에서 “대응 매뉴얼을 고객 관점에서 재점검해야 한다”며 이같이 밝혔습니다. 이 대표는 특히 “형식적인 내용은 삭제하고 실제 상황에서 바로 적용할 수 있도록 메뉴얼을 전면 개편하라”고 강조했습니다. 이 대표는 이어 “안전 확보 고객 수송 차량 복구 등 모든 분야에서 전화위복의 기회가 될 수 있도록 강력한 대책을 마련하겠다”고 강조한 뒤 “국민께 큰 불편을 겪게 해드려 죄송하다”고 사과했습니다. SR은 이번 사고 발생 직후 홈페이지와 앱 문자메시지를 통해 열차 이용과 관련해 안내를 했고 승객들에게 교통비를 추가로 지급했습니다. 하지만 사고로 인한 열차 운행 지연시간 변경된 열차 운행 정보가 고객에게 즉시 전달되지 않아 고객의 불편이 컸던 것으로 파악됐습니다. SR은 지연 정보를 실시간으로 반영해 안내할 수 있도록 시스템을 보완하고 부산 광주송정 등 KTX 공용역 구간에서도 사고 등으로 열차가 장시간 지연될 경우 이용객의 교통 편의를 지원하는 방안을 마련할 방침입니다. 지난 1일 오후 3시 20분쯤 부산발 수서행 SRT 338호 열차가 대전 조차장역 인근에서 탈선해 11명이 다쳤고 이 가운데 7명이 병원으로 이송돼 치료를 받았습니다.\n", + "\n", + "### 답변: SRT 운영사인 SR은 지난 1일 오후 3시 20분쯤 부산발 수서행 SRT 338호 열차가 대전 조차장역 인근에서 열차 탈선 사고로 11명이 다쳤고 7명이 병원으로 이송돼 치료를 받은 후 4일 서울 강남구 본사에서 대전조차장역 인근 탈선 사고 대책 점검 회의를 주재한 자리에서 “대응 매뉴얼을 고객 관점에서 고객 관점에서 고객 관점에서 재점검해야 한다”며 이같이 밝혔다.<|endoftext|>\n", + "40 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 위메이드는 커뮤니티 기반 웹3.0 탈중앙화 웹 게임사 플라네타리움랩스에 전략적 투자를 단행했다고 8일 알렸다. 사진은 위메이드 미르M 이미지. 사진제공 위메이드 위메이드가 커뮤니티 기반 웹3.0 탈중앙화 웹 게임사 플라네타리움랩스에 전략적 투자를 단행했다고 8일 전했다. 플라네타리움랩스는 립플래닛 Libplanet 기반의 웹3.0 게임 생태계 구현 툴킷 소프트웨어 도구 세트 을 게임 개발사에게 제공해 서버 없는 server less 게임을 개발할 수 있도록 지원한다. 특히 각 게임별로 독자적인 네트워크와 프로토콜을 구성해 게임 안의 모든 이용자가 노드 운영자로서 게임의 상태를 관리하고 네트워크를 운영할 수 있게 한다. 이용자들은 이를 통해 게임을 공동 운영하고 보상을 받는 구조다. 립플래닛을 활용한 세계 최초로 자체 블록체인에서 구동되는 오픈소스 온라인 역할수행게임 RPG 나인 크로니클 Nine Chronicles 은 30만명 이상의 플레이어 커뮤니티를 조성했다. 올해 플라네타리움랩스는 자체 퍼블리싱 역량을 활용해 아시아 태평양 지역의 주요 게임 개발사와 협력하고 여러 건의 커뮤니티 기반 게임 개발 및 퍼블리싱 활동을 선보일 계획이다. 김재석 플라네타리움랩스 대표는 게임의 미래는 이용자와 커뮤니티가 비전을 공유하고 협력하는 방향으로 가고 있다 며 커뮤니티가 소유하고 형성하는 게임이라는 비전을 함께 실현해 나갈 파트너들이 생겨 기쁘다 고 말했다. 장현국 위메이드 대표는 유틸리티 코인 위믹스와 100% 완전담보 스테이블 코인 위믹스 를 기반으로 하는 자체 메인넷 위믹스3.0는 게임 탈중앙화 자율조직 DAO 와 결합된 대체 불가능한 토큰 NFT 서비스 나일 NILE 다양한 디파이 프로토콜까지 모든 것을 갖춘 생태계가 될 것 이라며 플라네타리움 랩스와의 협업이 위믹스3.0의 생태계에 가져다 줄 흥미로운 가능성들을 기대하고 있다 고 말했다. 위메이드는 자체 메인넷 위믹스3.0 테스트넷을 론칭하고 다양한 국내외 블록체인 기업과 프로젝트에 투자하며 자체 블록체인 플랫폼 위믹스의 생태계 확장에 구슬땀을 흘리고 있다.\n", + "\n", + "### 답변: 위메이드는 게임 안의 모든 이용자가 노드 운영자로서 게임의 상태를 관리하고 네트워크를 운영할 수 있게 하는 등 게임의 미래는 이용자와 커뮤니티가 비전을 공유하고 협력하는 방향으로 가고 있다 며 커뮤니티 기반 웹3.0 탈중앙화 웹 게임사 플라네타리움랩스에 전략적 투자를 단행한다고 8일 밝혔다.<|endoftext|>\n", + "41 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 전국금융산업노동조합과 금융산업사용자협의회가 지난 14일 서울 중구 은행회관에서 2022년 제3차 산별중앙교섭을 개최했다. 사진 전국금융산업노동조합 금융노사가 올해 임금인상률을 두고 이견을 보이면서 갈등이 깊어지고 있다. 금융산업사용자협의회와 전국금융산업노동조합이 제시한 임금인상률 차이는 5.2%포인트에 달해 진통이 예상된다. 4일 금융권에 따르면 금융산업사용자협의회와 금융노동조합은 오는 5일 제4차 산별중앙교섭을 통해 올해 임금인상률을 정한다. 앞서 사용자협의회는 올해 임금인상률로 0.9%를 제시했다. 산업 평균 대비 금융권의 임금수준이 높고 미국의 금리 인상도 우려스럽다는 이유에서다. 금융노조가 지난 3월 제시했던 인상률 6.1%와 크게 차이 나는 수치다. 금융노조는 지난 4월 한국은행이 제시한 올해 성장률 전망치 3%와 2월 기준 소비자물가상승률 3.1%를 적용한 임금인상률 총액 기준 6.1% 저임금직군 12.2% 을 포함 34개 단체협약안을 제시한 바 있다. 이 외에도 정년 65세 연장 60세 이전 임금피크 진입 금지 임금피크 기간 근로시간 단축 등의 안건을 사용자측에 제시했다. 사용자 측은 비정규직 채용제한 폐지 탄력적 근로시간제 도입 호봉제 폐지 등 임금체계 개편 영업시간 1시간 단축 등 14가지 단체협약 개정안을 요구했다. 올해 금융권 산별교섭은 예년보다 치열하게 진행될 가능성이 있다. 신종 코로나바이러스 감염증 코로나19 속 일상 회복이 본격화된 데다 빠른 물가 상승세 대법원 임금피크제 무효 판결 은행 점포 폐쇄 가속화 등 산별교섭 테이블에 오를 요인들이 많아졌기 때문이다. 금융권 노사가 접점을 찾지 못하고 산별교섭이 공회전할 경우 안건은 중앙노동위원회로 넘어간다. 중노위에서 한두차례 조정 과정을 거치고도 입장차를 좁히지 못하면 조합원 쟁의행위 찬반투표에 부치는 수순이다. 일각에선 금융노조와 사측 의견이 팽팽하게 맞붙으면서 교섭이 결렬될 것이라는 관측도 제기된다. 지난해 10월에도 사용자협의회와 산별교섭에 난항을 겪던 금융노조는 총파업 목전까지 갔다가 극적 합의에 성공한 바 있다. 금융권 관계자는 지난해 산별교섭에도 실무교섭 18차례 대표 교섭 4차례 중노위 조정 2차례 등을 거쳤지만 합의를 보지 못했다 며 올해는 임금인상률 임금피크제 등 핵심안건인 임금협상에 타협이 어려운 만큼 교섭이 결렬될 가능성이 크다 고 말했다.\n", + "\n", + "### 답변: 금융금융노조가 산업 평균 대비 금융권의 임금수준이 높고 미국의 금리 인상도 우려스럽다는 이유로 올해 임금인상률로 0.9%를 제시하고 있으며 금융산업사용자협의회와 전국금융산업노동조합은 5.2%에 달해 진통이 예상되며 금년 금융권 산별교섭은 예년보다 치열하게 진행될 가능성이 있다.<|endoftext|>\n", + "42 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 김승두 기자 이영 중소벤처기업부 장관 왼쪽 과 이정식 고용노동부 장관 가운데 이 3일 정부서울청사에서 열린 제3차 비상경제장관회의에 참석해 인사하고 있다.\n", + "\n", + "### 답변: 3일 3일 정부서울청사에서 열린 제3차 비상경제장관회의에 참석한 이영 중소벤처기업부 장관 왼쪽 과 이정식 고용노동부 장관 가운데 이 3일 정부서울청사에서 열린 제3차 비상경제장관회의에 참석해 인사하고 이영 중소벤처기업부 장관 왼쪽 과 이정식 고용노동부 장관 왼쪽 이정식 고용노동부 장관 왼쪽 가운데 이 3일 정부서울청사에서 열린 제3차 비상경제장관회의에 참석해 인사하고 있다.<|endoftext|>\n", + "43 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: “고물가가 지속되는 가운데 글로벌 경기 하방 위험의 국내 전이 가능성까지 우려해야 하는 복합위기 상황에 직면해 있다.” 3일 추경호 부총리 겸 기획재정부 장관은 비상경제장관회의에서 이같이 경고했다. 과장이 아니다. 경제가 흘러가는 모습이 금융위기가 발생했던 2007 2008년과 여러모로 비슷한 상황이라서다. ①위기를 극복하겠다고 펼친 금리 인하 돈 풀기 후유증이 ②석유ㆍ가스 등 원자재 수급난과 맞물려 고물가를 촉발해 ③금융ㆍ실물 경제 동반 침체 위험을 키우는 양상이 그렇다. 그래픽 김영옥 기자 yesok joongang.co.kr 발단이 된 위기가 2007년 서브프라임모기지 비우량 주택담보대출 사태 2020년 신종 코로나바이러스 감염증 코로나19 대유행이란 점이 다를 뿐이다. 2000년대 중국ㆍ인도ㆍ브라질 등 신흥시장이 부상하며 원자재 가격을 끌어올렸다면 올해는 러시아ㆍ우크라이나 전쟁이 에너지ㆍ곡물 대란의 신호탄 역할을 했다. 14 15년 전과 견줘 국내총생산 GDP 이나 무역액 주식ㆍ외환시장으로 대표되는 한국의 경제 규모는 커졌다. 문제는 경제 펀더멘털 기초체력 이 외부 충격에 더 민감한 ‘허약 체질’로 바뀌었다는 점이다. 주요 거시경제 지표를 보면 우선 기재부는 올해 경제성장률 실질 GDP 기준 을 2.6%로 전망했다. 글로벌 금융위기가 터졌던 2008년 3.0%보다 낮은 수치다. 지난달 추 부총리는 “6월 또는 7∼8월에 6%대의 물가 상승률을 볼 수 있을 것”이라고 말했는데 2008년 7월 기록한 5.9%를 웃돈다. 국제통화기금 IMF 위기가 있었던 1998년 이후 처음으로 6%대 물가 상승률을 맞닥뜨릴 상황이다. 2008년 13.6%였던 수출액 증가율은 올해 한 자릿수 산업연구원 전망 9.2% 로 내려앉을 위기다. 수출액에서 수입액을 뺀 무역수지는 적자다. 이미 역대 최대 규모로 불었다. 올 상반기 1 6월 에만 103억 달러 약 13조원 적자를 기록했다. 대 對 중국 무역에서 1994년 8월 이후 28년 만에 처음 적자를 볼 정도다. 무엇보다 위기가 왔을 때 버텨낼 ‘맷집’이 예전만 못하다. 가계와 정부의 재무 건전성 지표가 2008년에 비해 크게 악화했다. 한국은행에 따르면 2008년 말 723조5000억원이었던 가계부채 신용 는 올 1분기 1859조4000억원으로 2.6배 불었다. 이 기간 처분가능소득 대비 가계부채 비율도 125.4%에서 168.9%로 나빠졌다. 국가채무 상황은 더 심각하다. 2008년 297조9000억원에서 올해 1068조8000억원 기재부 전망 으로 3배 이상 덩치를 불렸다. GDP 대비 국가채무 비율은 25.8%에서 49.7%로 상승했다. 가계나 정부 할 것 없이 14 15년 전보다 많은 빚을 지고 있어 금리 상승 충격에 훨씬 취약하다는 의미다. 추경호 부총리 겸 기획재정부 장관이 3일 정부서울청사에서 열린 제3차 비상경제장관회의를 주재하고 있다. 연합뉴스 우석진 명지대 경제학과 교수는 “2008년 금융위기로 세계 경제가 어려웠지만 한국은 수출ㆍ가계부채ㆍ재정 등 지표가 상대적으로 나았던 덕에 다른 신흥국에 비해 타격을 덜 받았고 경기 회복도 빨랐다”며 “그때와 비교해 경제 지표는 크게 나빠졌다”고 진단했다. 우 교수는 이어 “인플레이션 고물가 이 진행될수록 ‘가격을 통한 자원 배분’이란 민간 시장의 원리가 제대로 작동하지 않기 때문에 정부의 역할이 더 중요하다”며 “이번 충격이 외부적 요인이 큰 게 사실이지만 정부가 물가ㆍ금리 상승에 따른 실효성 있는 대응책을 내놓지 못하고 있다”고 지적했다. 엎친 데 덮친 격으로 대외 여건은 악화일로다. 경기에 대한 전문가 진단은 상반기보다 하반기가 더 나쁘다는 쪽으로 모인다. 안영진 SK증권 연구원은 “전쟁ㆍ유가ㆍ원자재의 공급 이슈가 계속되고 대외 수요가 둔화한다는 다수의 전망이 유효한 이상 무역적자는 당분간 계속된다고 봐야 할 것”이라며 “원ㆍ달러 환율도 1300원대 공방이 예상된다”고 밝혔다. 임혜윤 한화투자증권 연구원도 “ 경제 심리의 확연한 개선이 나타나기 어렵다면 실물 경기 둔화 압력으로 작용할 가능성이 크다”고 평가했다.\n", + "\n", + "### 답변: 고 물가가 지속되는 가운데 글로벌 경기 하방 위험의 국내 전이 가능성까지 우려하는 복합위기 상황에 처해 있어 경제 펀더멘털 기초체력 이 외부 충격에 더 민감한 허약 체질로 바뀌어 올해 경제성장률 실질 GDP 기준 을 2.6%로 전망했다.<|endoftext|>\n", + "44 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: KBS 광주 앵커 광주시와 전라남도가 반도체 생산 단지 조성을 상생 1호 정책으로 추진하고 있는데요. 더불어민주당 우상호 비상대책위원장이 오늘 광주를 찾아 지역균형발전 차원에서 반도체 인재 양성을 위한 정책을 마련하겠다고 말했습니다. 보도에 최혜진 기자입니다. 리포트 성균관대학교가 삼성전자와 손잡고 운영하는 반도체시스템공학과입니다. 졸업 이후 취업도 보장합니다. 반도체 고급 인력을 육성하기 위한 겁니다. 윤석열 정부가 이런 반도체 학과의 수도권 증설을 검토하자 지역의 반발이 거센 상황입니다. 특히 광주시와 전라남도의 상생 1호 정책인 반도체 특화단지 조성과 기업 유치 성과를 내려면 지역 대학의 반도체 학과 신설이 필수적입니다. 이를 위해 더불어민주당과 지자체 지역 대학이 머리를 맞댔습니다. 강기정 광주시장 반도체 특화단지 300만 평을 조성하겠다고 약속을 드렸습니다. 가능하려면 인재 양성이 중요하고 정부의 정책이 중요합니다. 민영돈 조선대학교 총장 지방대학도 충분히 감당할 수 있는 능력을 보유하고 있음에도 불구하고 수도권만 집중적으로 육성하겠다는 것은 더 나아가서는 지역 소멸까지 간다는 심각한 우려를 표하지 않을 수 없습니다. 민주당 우상호 비상대책위원장은 반도체 학과의 수도권 집중을 막기 위해 당 차원에서 대응하겠다고 말했습니다. 우상호 더불어민주당 비상대책위원장 지역균형발전 차원에서 지역 대학에 도움을 주는 정책이 무엇이 있는지 당 차원의 정책을 만들어보도록 하겠습니다. 국민의힘 주도로 국회 반도체 특별위원회도 구성된 가운데 반도체 단지 조성과 인재 양성을 위해서는 다른 지역과 차별화된 민선 8기의 전략적 접근이 필요하다는 목소리도 나오고 있습니다. KBS 뉴스 최혜진입니다.\n", + "\n", + "### 답변: 광주시와 전라남도가 반도체 생산 단지 조성을 상생 1호 정책으로 추진하고 있는 가운데 더불어민주당 우상호 비상대책위원장이 오늘 광주를 찾아 지역균형발전 차원에서 반도체 단지 조성과 반도체 인재 양성을 위한 정책을 마련하겠다고 말했고 반도체 단지 조성과 인재 양성을 위해서 다른 지역과 차별화된 민선 8기의 전략적 접근이 필요하다는 목소리가 나오고 있다.<|endoftext|>\n", + "45 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 근로자퇴직급여 보장법 시행령 의결 퇴직연금 수익률을 높이기 위한 디폴트옵션 사전지정운용제도 이 오는 12일 도입된다. 디폴트옵션은 확정기여 DC 형 퇴직연금과 개인형 퇴직연금 IRP 가입자가 별다른 운용 지시를 하지 않을 경우 사전에 정한 적립금이 자동 운용되도록 하는 제도다. 금융위원회는 디폴트옵션의 주요 내용을 규정하는 근로자퇴직급여 보장법 시행령 이 국무회의에서 의결됨에 따라 12일부터 DC·IRP에 사전지정운용제도가 도입된다고 5일 밝혔다. 퇴직연금 운영경험이 풍부한 미국 영국 호주 등 주요 선진국에서는 가입자의 적절한 선택을 유도해 노후소득보장을 강화하는 것이 정부의 사회적 책무라는 인식하에 오래전부터 퇴직연금제도에 디폴트옵션을 도입해 운영해왔다. 연 평균 6 8%의 안정적 수익률 성과를 내고 있다. 퇴직연금 수익률을 높이기 위한 디폴트옵션 사전지정운용제도 이 오는 12일 도입된다. 사진 금융위원회 먼저 은행·보험·증권사 등 퇴직연금사업자가 사전지정운용방법을 승인받기 위해선 사용자 회사 와 가입자 근로자 에게 제시할 사전지정운용방법을 마련해 고용노동부 소속 심의위원회 심의를 거쳐 고용노동부장관의 승인을 받아야 한다. 승인 가능한 상품은 원리금보장상품 법령상 허용되는 유형의 펀드상품 포트폴리오 유형 상품 등이다. 심의위원회는 예금·이율보증보험계약 GIC 등 원리금보장상품에 대해 금리·만기의 적절성 예금자 보호 한도 상시가입 가능 여부 위주로 심의할 예정이다. 펀드·포트폴리오 유형에 대해선 자산 배분의 적절성 손실가능성 수수료 등의 사항에 대해 심의하게 된다. 정부는 제도 시행 후 퇴직연금사업자로부터 신청을 받아 신속하게 심의 등 승인 절차를 진행할 예정이다. 오는 10월 중 첫 번째 심의위원회를 거쳐 승인된 상품을 공시할 예정이다. 퇴직연금사업자는 고용노동부로부터 승인 받은 사전지정운용방법에 대한 주요 정보를 사용자에게 제시한다. 사용자는 제시 받은 사전지정운용방법 중 사업장에 설정할 사전지정운용방법을 선택해 제도에 관한 사항과 함께 퇴직연금규약에 반영해야 한다. 이때 근로자대표 동의 절차를 반드시 거쳐야 한다. 근로자는 규약에 반영된 상품에 대한 주요 정보를 사업자로부터 제공 받아 그 중 본인의 사전지정운용방법을 선정하게 된다. 디폴트옵션은 근로자가 DC형에 신규로 가입했거나 기존 상품의 만기가 도래했음에도 운용지시를 하지 않거나 디폴트옵션으로 본인의 적립금을 바로 운용 OPT IN 하기를 원할 경우 적용된다. 사진 금융위원회 사전지정운용방법은 근로자가 신규로 가입했거나 기존 상품의 만기가 도래했음에도 운용지시를 하지 않거나 사전지정운용방법으로 본인의 적립금을 바로 운용 OPT IN 하기를 원할 경우 적용된다. 근로자가 기존 상품의 만기가 도래했음에도 4주간 운용지시를 하지 않으면 퇴직연금사업자로부터 2주 이내 운용지시를 하지 않으면 해당 적립금이 사전지정운용방법으로 운용됨 을 통지받게 된다. 통지 후 2주 이내에도 운용지시가 없을 경우 적립금이 사전지정운용방법으로 운용된다. 사전지정운용방법으로 적립금을 운용하고 있지 않은 근로자는 언제든지사전지정운용방법으로 본인의 적립금을 운용하는 것을 선택 OPT IN 할 수 있다. 또한 사전지정운용방법으로 운용 중에도 근로자의 의사에 따라 언제든지 원하는 다른 방법으로 운용지시가 가능 OPT OUT 하다. 아울러 퇴직연금 감독규정 개정에 따라 기존 위험자산한도 70% 규제에도 불구하고 사전지정운용방법은 적립금의 100%까지 운용이 가능하다. DC에 도입되는 사전지정운용제도에 관한 사항은 IRP에도 동일하게 적용된다. 정부는 이외에도 가입자의 선택권 보장과 사업자간 경쟁 제고 등을 위해 사전지정운용방법의 운용현황과 수익률 등을 분기별로 고용노동부 홈페이지와 금융감독원 통합연금포탈을 통해 공시할 예정이다. 사전지정운용방법을 3년에 1회 이상 정기평가해 승인 지속여부를 심의하는 등 상품에 대한 모니터링과 관리에도 역량을 집중할 계획이다. 이정식 고용노동부장관은 퇴직연금제도는 낮은 수익률 문제 등으로 근로자의 노후준비에 든든한 버팀목 역할을 하지 못했던 측면이 있었다 며 지난 4월 도입된 중소기업퇴직연금기금제도와 적립금운용위원회 이달 도입되는 사전지정운용제도를 빠르게 현장에 안착시켜 수익률 제고뿐 아니라 퇴직연금제도가 근로자들이 믿고 맡길 수 있는 좋은 제도로 자리 잡을 수 있도록 적극 노력하겠다 고 밝혔다.\n", + "\n", + "### 답변: 금융위원회는 디폴트옵션의 주요 내용을 규정하는 근로자퇴직급여 보장법 시행령 이 국무회의에서 의결됨에 따라 12일부터 DC·IRP에 사전지정운용제도가 도입된다고 5일 밝히고 사전지정운용방법을 사용자 회사 와 가입자 근로자 에게 제시할 사전지정운용방법을 마련해 심의를 거쳐 고용노동부장관의 승인을 받아야 하고 사전지정운용방법 중 사업장에 설정할 사전지정운용방법을 선택해 제도에 관한 사항과 함께 퇴직연금규약에 반영해야 한다.<|endoftext|>\n", + "46 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 사회적기업 예비 창업자 지원 29일 서울 용산구 동자동 포포인츠호텔에서 열린 ‘MG휴먼 브릿지 청년 창업캠프’에서 새마을금고중앙회 관계자와 우수아이디어 수상자들이 기념촬영을 하고 있다. 새마을금고중앙회 제공 헤럴드경제 이태형 기자 새마을금고중앙회는 6월 27일에서 29일까지 3일간 청년 실업 문제 해결과 사회적경제 육성을 위해 사회적기업 창업을 준비하는 청년을 대상으로 ‘MG휴먼 브릿지 청년 창업캠프’를 성황리에 개최했다고 1일 밝혔다. 서울 용산구 동자동 포포인츠 호텔에서 진행된 이번 창업캠프는 만 19세 이상 만 39세 이하 청년 중 사회적 문제 해결과 연관된 휴먼 비즈니스 아이디어를 보유한 사회적 기업 예비 창업가 및 창업 2년 이내 초기 창업기업을 대상으로 모집이 이뤄졌으며 서류 심사를 통해 선발된 10개 팀에 참가했다. 이번 창업캠프의 주제인 ‘휴먼 비즈니스 아이디어’는 기술 교육 문화 등 사회의 다양한 격차를 해소하고 시민의 동등한 기본권을 보장하기 위한 비즈니스 아이디어를 의미한다. 특히 일자리 문제 해결을 위한 고용 안정화 아이디어와 금융 격차 해소를 위한 아이디어에는 우대 자격이 주어졌다. 10개의 참가팀은 2박 3일 간의 캠프를 통해 사업계획 고도화 교육 IR 피칭 교육 등을 이수했으며 특히 새마을금고중앙회의 지원을 통해 성장한 선배 사회적기업으로부터 창업 노하우를 전수받고 사업에 대한 고민을 나누는 1대1 멘토링 등 사회적기업 창업에 특화된 교육 프로그램이 큰 호응을 얻었다. 또 이번 창업캠프에서 우수 아이디어로 채택된 5개팀 대상 함경우 금상 서성구·이도경 은상 장효선·김범준 에는 소정의 시상금과 함께 새마을금고중앙회와 함께일하는재단이 추진하는 ‘MG희망나눔 소셜 성장 지원사업’의 5기의 Starter 트랙으로 우선 선발될 수 있는 기회가 제공된다. 시상은 김동욱 새마을금고중앙회 ESG금고경영지원부문장이 맡았다. 박차훈 새마을금고중앙회장은 “이번 창업캠프가 불안정성이 큰 초기 창업기업이 사회적경제 생태계에 무사히 안착하기 위한 발판이 되기를 기원한다”며 “새마을금고는 훌륭한 소셜 미션을 가진 청년의 꿈을 다방면으로 지원함으로써 청년 세대와 상생하고 지역사회 문제 해결에 힘쓸 것”이라고 말했다. 한편 새마을금고중앙회는 지난해 친환경 분야 사회적기업 청년 창업캠프인 ‘청년이 그린 Green 창업캠프’를 개최했다. 또 대표적인 사회적기업 육성 지원 사업인 ‘MG희망나눔 소셜 성장 지원사업’ 등을 통해 유망한 사회적기업 육성 및 사회적경제 생태계 활성화에 앞장서고 있다. 올해 지원 예정 사업을 더하면 총 100여개 사회적기업에 43억원 규모의 자원이 투입될 예정이다.\n", + "\n", + "### 답변: 1일 새마을금고중앙회는 6월 27일에서 29일까지 3일간 청년 실업 문제 해결과 사회적경제 육성을 위해 사회적기업 창업을 준비하는 청년을 대상으로 ‘MG휴먼 브릿지 청년 창업캠프’를 성료했다고 1일 밝혔으며 이번 캠프의 주제는 ‘휴먼 비즈니스 아이디어’로 2박 3일 간의 캠프를 통해 사업계획 고도화 교육 IR 피칭 교육 등을 이수했으며 특히 새마을금고중앙회의 지원을 통해 성장한 선배 사회적기업으로부터 창업 노하우를 전수받고 사업에 대한 고민을 나누는 1대1 멘토링 등 사회적기업 창업에 특화된 교육 프로그램이 큰 호응을 얻었다.<|endoftext|>\n", + "47 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 정부 신외환법 제정 추진…해외 송금·투자 편의성 제고 업권별 외국환 업무 범위 조정 검토…법령 체계도 단순화 전문가들 신외환법 제정 필요성 동감…새로운 금융환경 반영해야 환전 해외송금 여행자수표 표시 촬영 이충원 미디어랩 세종 연합뉴스 박원희 기자 A씨는 해외 취업에 성공한 아들에게 6만달러를 송금하기 위해 대외지급수단매매를 신고했다. 송금을 위해 A씨는 관계 기관에 최소 11개 이상의 서류를 제출했다. 태국 소재 기업의 지분 50%를 취득한 B 기업은 추가로 출자할 때 사전 신고서를 제출해야 한다. 이와 별개로 매년 사후 보고서도 제출해야 한다. 정부가 자본거래 시 사전신고 등을 규정한 기존 외국환거래법을 폐기하고 23년만에 새로운 외환법을 만든다. 외화 등을 거래하는 과정에서 요구되는 사전 신고를 폐지해 외환거래와 투자를 하는 데 있어 불편함을 해소한다는 취지다. 기획재정부는 5일 신외환법 제정방향 세미나 를 열고 이같이 밝혔다. 해외 송금 및 투자에 대한 수요가 그간 증가해왔으나 여전히 외환거래를 하는 데 있어 많은 서류를 제출해야 하는 등 절차가 복잡하다는 지적에 따른 것이다. 신고 절차가 복잡해 부지불식간에 법규를 위반하거나 해외 직접투자 시 매년 사후보고하도록 하는 등 기업 부담이 과중하다는 지적도 끊이지 않았다. 정부는 외환거래의 편의성을 높이기 위해 자본거래 및 지급·수령 단계에서의 사전신고를 폐지한다. 사전에 인지를 못 했을 때 중대한 경제적 영향을 미치는 일부 거래에 대해서만 신고제를 유지한다는 방침이다. 기존 법이 사전신고를 원칙으로 하고 예외사항을 열거했다면 새로운 외환법은 미신고를 원칙으로 하고 신고대상을 열거하는 식으로 바뀌는 셈이다. 정부는 동일 업무·동일 규제 원칙하에서 개별 금융기관의 외국환업무 범위를 확대하는 방안도 검토한다. 현재 증권사 등은 환전·송금 업무에 제한이 있다. 정부는 자본시장법 등에 규정된 금융기관들의 외국환업무는 허용하면서 필요한 규율 등을 부과하는 식으로 업무 범위를 조정하는 방안을 검토한다. 법령 체계도 전면 개편해 일반 국민의 외환법에 대한 접근성도 제고한다. 기존 조문 체계는 원칙을 명시한 뒤 예외와 예외의 예외를 덧붙이는 식이어서 매우 복잡했다. 금융기관들도 숙지하기가 어려워 매번 정부에 유권해석을 의뢰할 정도였다. 정부는 원칙 예외라는 구조로 법령 서술체계를 단순화한다. 단계적인 원화 국제화 기반 마련 해외직접투자 규제와 거주자의 해외증권취득과 관련한 규제를 완화하는 방안 가상자산 등장 등 환경 변화에 대한 대응 방안도 검토하겠다는 계획이다. 김성욱 기재부 국제금융국장은 기업이나 개인에게 너무나 과도한 형벌 책임을 부과하는 측면이 있어서 형벌 조항에 대해서도 다른 법령과 비교해 전반적인 개선이 필요하다 며 경제 안보가 나날이 중요해지는 시기에 이러한 테마에 맞춰 외국환 법령에서 할 수 있는 일이 무엇인지에 대해서도 생각해야 한다 고 말했다. 신 新 외환법 제정방향 세미나 서울 연합뉴스 방기선 기획재정부 차관이 5일 서울 여의도 한국수출입은행에서 열린 신 新 외환법 제정방향 세미나 에서 개회사 하고 있다. 2022.7.5 기획재정부 제공. 재판매 및 DB 금지 photo yna.co.kr 정부가 외환법을 전면 개편하는 건 1999년 현행 외국환거래법을 제정한 이후 23년 만이다. 이번 신외환법 제정은 근본적인 규제 철학을 바꾸는 작업이라는 게 정부의 설명이다. 과거 외환위기 트라우마 등에 따라 만들어진 외화 유출 억제 라는 철학에서 벗어나서 새로운 외환거래 제도를 마련한다는 의미다. 방기선 기재부 1차관은 원칙적 자유·예외적 규제 의 원칙에 충실하도록 외환거래의 걸림돌이 되는 규제는 과감히 정비하겠다 며 거래 절차를 쉽고 단순하게 바꾸고 효과적인 모니터링 체계를 구축해 위기 때 대외건전성 회복을 위한 조치도 실효성 있게 마련하겠다 고 말했다. 기획재정부 제공. 재판매 및 DB금지 세미나에 참석한 전문가들은 대체로 신외환법의 제정 필요성과 정부가 제시한 방향성 등에 대해 공감했다. 인구 고령화 잠재성장률 하락 등의 경제구조 변화 속에서 대외자산을 늘려 이를 통한 소득을 창출해야 한다는 의견도 있었다. 다만 외환시장 개방을 확대할 경우 시장 변동성 확대 역외탈세 등의 가능성을 지적하며 이에 대한 관리가 필요하다는 의견도 제기됐다. 고수익·고위험을 추구하는 증권사 등을 고려했을 때 비은행으로 외국환 업무를 확대하는 경우 거시 건전성을 확보해야 한다는 주문도 있었다. 전문가들은 디지털 거래가 확대되고 새로운 유형의 자산이 나오는 환경도 법 제정에 반영해야 한다고 주문했다. 김 국장은 올해 말까지 신외환법 개편의 기본 방향을 만들려고 한다 며 가급적 연말까지 연구해서 법안이 어떤 모습일지를 국민들께 밝히려고 한다 고 말했다.\n", + "\n", + "### 답변: 외 자본거래 시 사전신고 등을 규정한 기존 외국환거래법을 폐기하고 23년만에 새로운 외환법을 제정하는데 이는 외화 등을 거래하는 과정에서 요구되는 사전 신고를 폐지해 외환거래와 투자를 하는 데 있어 불편함을 해소한다는 목적이며 정부는 외환거래의 편의성을 높이기 위해 자본거래 및 지급·수령 단계에서의 사전신고를 폐지한다.<|endoftext|>\n", + "48 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 뉴스1 김진환 기자 서울 주택 매매에서 빌라 다세대·연립주택 가 차지하는 비중이 61.5%를 기록하며 역대 최고로 올라섰다. 서울부동산정보광장의 통계에 따르면 빌라 매매 건수 계약 일자 기준 는 지난해 1월부터 올해 6월까지 18개월 연속 아파트 매매 건수보다 많았다. 지난달의 경우 거래 등록 신고 기한 거래후 30일간 이 남은 상황이지만 이날까지 빌라 매매 건수 1960건 가 아파트 매매 건수 667건 의 약 3배에 달했다. 집값 급등으로 내집 마련이 어려워진데다 대출·세제 등 규제가 아파트에 집중된 점이 영향을 미친 것으로 보인다.\n", + "\n", + "### 답변: 집 매매에서 빌라 다세대·연립주택 가 차지하는 비중이 61.5%를 기록하며 역대 최고로 올라섰는데 집값 급등으로 내집 마련이 어려워진데다 대출·세제 등 규제가 아파트에 집중된 점이 영향을 미친 것으로 보이며 지난달의 경우 거래 등록 신고 기한 30일간 이 남은 상황이지만 이날까지 빌라 매매 건수 1960건 가 아파트 매매 건수 667건 의 약 3배에 달했다.<|endoftext|>\n", + "49 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 지난해 연봉 1200만원 인상을 단행해 화제가 됐던 게임사 베스파가 경영난에 시달린 끝에 직원 대다수에 권고사직을 통보했다. 1일 게임업계에 따르면 김진수 베스파 대표는 전날 3회사 전 직원이 모인 자리에서 “회사를 회생시키려고 많이 노력했고 투자도 유치했지만 안타깝게 됐다”며 권고사직을 통보했다. 임직원 148명 중 3분의 2 이상인 100여명이 권고사직을 받은 것으로 알려졌다. 2013년 설립된 베스파는 2017년 ‘킹스레이드’를 히트시켰고 이는 대한민국 게임대상에서 모바일게임 부문 우수상까지 수상했다. 2018년 코스닥 상장을 통해 회사 규모를 키웠으나 실적은 그리 좋지 않았다. 최근 3년 동안 2019년 87억원 2020년 339억원 2021년 441억원 등의 적자를 이어갔다. 올해 1분기에도 28억원의 적자를 기록했다. 특히 베스파는 지난해 게임업계 전반에 연봉 인상 바람이 불 당시 전 직원 연봉을 일괄적으로 1200만원 올려 화제가 되기도 했다. 그러나 얼마후 자기자본을 50% 초과하는 사업손실로 코스닥 시장본부로부터 ‘관리종목 지정 우려’ 통보를 받았다. 지난해 8월 신작 ‘타임디펜더스’를 일본에서 선출시했지만 흥행에 성공하지 못했고 올해 4월 출시한 국내 시장에서도 외면을 받았다. 베스파는 지난 2월에도 상장폐지 우려를 이유로 거래정지 처분을 받는 등 경영난에 시달린 끝에 권고사직 통보를 선택하게 됐다. 베스파는 최소 인원으로 라이브 서비스와 신규 개발을 이어갈 계획인 것으로 전해졌다.\n", + "\n", + "### 답변: 전해 연봉 1200만원 인상을 단행해 화제가 됐던 게임사 베스파가 상장폐지 우려를 이유로 거래정지 처분을 받는 등 경영난에 시달린 끝에 임직원 148명 중 3분의 2 이상인 100여명이 권고사직을 통보했다.<|endoftext|>\n", + "50 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 이데일리 김태형 기자 유류세가 인하된 1일 소비자들이 서울 강남구 한 셀프 주유소에서 주유를 하고 있다. 이날 유류세 인하 폭이 37%로 전국 휘발유 평균 가격은 전날보다 11.37원 내린 2 133.53원 1리터 을 기록했다.\n", + "\n", + "### 답변: 유류세 인하 폭이 37%로 전국 휘발유 평균 가격은 전날보다 11.37원 내린 2 133.53원 1리터 을 기록하며 전국 휘발유 평균 가격은 전날보다 11.37원 내린 2 133.53원 1리터를 기록했다고 유류세가 인하된 1일 소비자들이 서울 강남구 한 셀프 주유소에서 주유를 하고 있다.<|endoftext|>\n", + "51 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 카카오노동조합 서승욱 지회장이 판교역 광장에서 카카오모빌리티 매각반대 1인 시위를 하고 있다. 카카오 노조가 사측과의 긴급회동 열흘 만에 카카오모빌리티 매각 반대 서명운동을 재개한다. 6일 카카오 노조 크루유니언 은 경영진과의 면담에서 카카오는 매각이 무산되면 모빌리티 사업을 포기할 것이라 배수의 진을 쳤다 며 잠정 보류했던 카카오모빌리티 매각 반대 서명운동을 시작하겠다고 밝혔다. 노조는 카카오모빌리티·카카오 판교 사옥 앞에서 매각에 반대하는 피켓 시위 기자회견을 열고 카카오모빌리티와의 단체교섭 등 노동조건 개선을 위한 후속 단체행동에 나설 계획이라고 설명했다. 이날 카카오 노조는 지난달 김성수 카카오 공동체얼라인먼트센터 CAC 장을 만나 긴급 면담을 진행한 결과를 공개했다. 노조에 따르면 지난달 27일 진행된 1차 협의에서 카카오는 매각 추진 사실을 인정하며 카카오가 2대 주주로 남아 향후 사업을 영위할 수 있는 방향을 설계할 것이다 고 밝혔다. 당시 노조 측은 사모펀드 매각에 반대한다 는 입장을 전달했지만 회사 측은 사모펀드 매각 이외의 옵션은 고려하고 있지 않다 는 입장을 고수했다. 이후 2차 협의에 앞서 노조는 사측에 모빌리티 경영진의 도덕적 책임 이행 임직원과 사업 방향에 대한 검토·토론 진행 카카오모빌리티의 사회적 책임 이행 경과 설명 플랫폼노동자와 매각방향에 대한 논의 김범수 카카오 미래이니셔티브센터장의 협의테이블 참여를 요구했다. 하지만 회사는 이달 4일 최종 결정자는 김성수 카카오 이사회 의장이다 며 노조의 요청을 거절했다. 그러면서 회사 측은 카카오라는 기업 내에서 더이상 모빌리티는 플랫폼의 성장이 불가능해 사업 성장을 위해선 매각이 불가피하다 라며 일축했다고 노조는 전했다. 노조는 사측에 사모펀드에 매각되면 모빌리티 사업이 성장할 수 있는 근거가 있느냐 고 물었지만 사측은 모빌리티 사업을 이어나갈 의지가 없다 는 입장을 되풀이했다고 노조는 지적했다. 이정대 카카오모빌리티 분회 스태프는 2대 주주가 된다고 해서 카카오모빌리리티의 성장성이 담보된다는 회사의 주장은 아이러니하다 고 비판의 목소리를 냈다. 서승욱 카카오노조 지회장은 카카오모빌리티와 카카오가 올바른 판단을 할 수 있도록 전 공동체 임직원들과 힘을 모으겠다 며 사회적 책임 조차 이행하지 않고 택시 대리운전 바이크 등 모빌리티 플랫폼을 정리하려는 카카오에 대해 많은 국민들이 관심을 계속 가져달라 고 말했다.\n", + "\n", + "### 답변: 카카오는 사측과의 긴급회동 열흘 만에 카카오모빌리티·카카오 판교 사옥 앞에서 매각에 반대하는 피켓 시위 기자회견을 열고 카카오모빌리티와의 단체교섭 등 노동조건 개선을 위한 후속 단체행동에 나서며 잠정 보류했던 카카오모빌리티 매각 반대 서명운동을 시작하겠다고 밝혔다.<|endoftext|>\n", + "52 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 디지털데일리 박세아 기자 위메이드가 블록체인 게임 플랫폼 위믹스 플레이 WEMIX PLAY 를 1일 글로벌 시장에 론칭했다. 위믹스 플레이는 오픈 블록체인 게임 플랫폼을 지향한다. 이용자는 가상자산으로 게임 관련 아이템을 구입하거나 대체불가능한 토큰 Non Fungible Token 이하 NFT 을 거래할 수 있다. 게임에서 번 자산을 게임에 재투자하는 플레이투언 Play Earn ’이 가능하다. 위믹스 플레이는 이용자 편의성을 극대화했다는 설명이다. 게임 허브 토큰 시가 총액 토큰 스왑 경매 스테이킹 프로그램 등 핵심 정보와 기능을 위믹스 플레이에서 모두 이용할 수 있다. 위메이드는 7월 중 리플렉트 코인 Reflect Coin 도 선보인다. 리플렉트는 위믹스 플레이에서 서비스하는 다양한 게임 중 리플렉트 얼라이언스에 포함된 여러 토큰들을 융합 Fusion 해 받을 수 있는 유틸리티 코인이다. 위메이드는 오늘 위믹스3.0 테스트넷도 론칭했다. 위믹스3.0은 위메이드가 자체 개발한 블록체인 메인넷이다. 위메이드는 메인넷 프로토콜을 테스트넷 환경으로 복사해 프로토콜 모든 잠재적 위협이나 허점을 발견하고 수정하기 위해 다양한 테스트를 진행한다. 테스트가 완료된 이후 메인넷을 오픈할 계획이다. 위메이드 장현국 대표는 게임은 블록체인과 암호화폐의 가장 핵심적인 유틸리티인데 위믹스 플레이는 오픈 블록체인 게임 플랫폼으로 자리잡을 것 이라며 오늘 테스트를 시작한 위믹스3.0 또한 완전히 개방된 서비스와 플랫폼을 중심으로 1등 메인넷으로 성장시켜 나갈 것 이라고 말했다. 위메이드는 스테이블코인 위믹스달러 탈중앙금융 서비스 ‘위믹스 디파이 서비스’ 탈중앙화 조직 DAO 프로젝트를 운영할 수 있는 플랫폼 ‘나일 NILE ’ 등을 3분기까지 순차적으로 공개할 예정이다.\n", + "\n", + "### 답변: 위메이드가 블록체인 게임 플랫폼을 지향하는 '위믹스 플레이 WEMIX PLAY'를 1일 글로벌 시장에 론칭하며 게임 관련 아이템을 구입하거나 대체불가능한 토큰 Non Fungible Token 이하 NFT 을 거래할 수 있다.<|endoftext|>\n", + "53 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 가계대출 1조4천억원↓…신용대출은 7개월째 줄고 주담대는 증가세 전환 가계대출 연합뉴스 자료사진 서울 연합뉴스 김유아 오주현 기자 국내 5대 시중은행의 가계대출 잔액이 6개월 연속 감소했지만 금리 상승으로 이들 은행의 예·적금 잔액은 늘어났다. 1일 KB국민·신한·하나·우리·NH농협 등 5대 시중은행에 따르면 이들 은행의 지난달 말 가계대출 잔액은 699조6천521억원으로 5월 말보다 1조4천94억원 줄었다. 600조원대 가계대출 잔액은 지난해 8월 698조8천149억원 이후 처음이다. 5대 시중은행의 가계대출 잔액은 올 1월부터 6개월째 감소세다. 이달 감소 폭은 전월 1조3천302억원 보다도 소폭 커졌다. 대출 종류별로 보면 지난달 말 주택담보대출 주담대 잔액은 506조7천714억원이다. 전월에는 5천245억원 줄었지만 한 달 새 991억원 늘며 증가세로 전환했다. 신용대출 잔액은 1조1천204억원 줄며 130조6천789억원을 기록했다. 신용대출은 지난해 12월 1조5천766억원 부터 7개월째 감소하고 있다. 감소 폭은 지난 3월 2조4천579억원 이후 4월 9천390억원 과 5월 6천613억원 을 거치며 축소되는 듯 했지만 지난달 다시 커졌다. 이는 최근 주식 가상화폐 시장이 하락세를 보이면서 빚투 대출 받아 투자 경향이 약해진 데 따른 것으로 풀이된다. 전세자금 대출 잔액은 4천479억원 늘어난 132조9천601억원이다. 5개월째 증가세다. 기업대출은 가계대출 흐름과 정반대로 지속해서 늘고 있다. 지난달 말 대기업 대출 잔액은 91조5천688억원에 달했고 중소기업 대출 잔액은 581조8천307억원을 기록했다. 수신 예금 현황을 보면 금리 상승에 따라 예·적금 모두 늘었다. 요구불예금 잔액은 6조3천512억원 늘어난 709조9천635억원 정기예금은 5조3천191억원 늘어난 685조959억원을 나타냈다. 또 수시입출금식 저축성예금 MMDA 잔액은 118조6천572억원 정기적금 잔액은 37조4천643억원으로 각각 3조1천240억원 7천46억원 불었다.\n", + "\n", + "### 답변: 1일 5대 시중은행에 따르면 이들 은행의 지난달 말 가계대출 잔액은 699조6천521억원으로 5월 말보다 1조4천94억원 줄었으나 금리 상승으로 이들 은행의 예·적금 잔액은 늘어났으며 가계대출 잔액은 올 1월부터 6개월째 감소세다.<|endoftext|>\n", + "54 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 피트니스 기기들은 자주 우리에게 1만 보 걷기를 권장합니다. 하지만 “1만 보”라는 목표는 과학에서 비롯됐다기보다는 우연과 역사에 따른 것이라 볼 수 있습니다. 하버드대의 교수이자 건강전문가인 아이민 리 I Min Lee 박사에 따르면 ‘만 보’는 1960년대 일본에서 인기를 끌기 시작했습니다. 그리고 1964년 도쿄올림픽 이후 높아진 피트니스에 대한 관심을 활용하고자 했던 한 시계 제작사가 만보계를 대량생산했죠. 이렇게 ‘만보계’가 자리 잡으면서 우리들의 머릿속에도 ‘만보’가 하나의 목표로 각인되게 됐습니다. 하지만 오늘날의 과학은 건강과 장수를 위해 하루에 1만보씩이나 걸을 필요는 없다고 말합니다. 2019년 리 박사와 동료들은 하루에 4400보 정도를 걸었던 70대 여성들이 하루에 2700보를 채 걷지 않은 여성들과 비교할 때 조기사망 위험을 40% 가량 줄인 것을 발견했습니다. 하루 5000보 이상 걷는 경우에도 조기사망 위험이 더 낮아졌지만 걸음을 더 걷는다고 사망위험률이 낮아진 것은 하루 7500보까지였습니다. “1만 보”라는 목표의 절반을 채 채우지 못해도 충분히 사망위험을 낮출 수 있다는 얘기인거죠. 현실적으로 어쨌든 만보란 목표를 달성하는 이도 거의 없죠. 최근 통계들에 따르면 미국 캐나다 그리고 주요 서구 국가들의 대부분의 성인들의 하루 평균 걸음 수는 5000보 미만입니다. 1만보란 목표를 달성해도 오래 지속되기란 쉽지 않습니다. 벨기에 겐트에서는 시민들에게 2005년 만보계를 제공하고 1년 동안 하루에 1만 보 이상 걷도록 권장했죠. 이 연구를 마친 660명 남녀 중 약 8%는 매일 1만 보라는 목표를 달성했습니다. 하지만 4년 후의 후속연구를 해보니 아무도 그렇게 하루 걸음수를 유지하고 있지 못했죠. 그들은 연구 전 애초의 걸음수로 다 되돌아가 있었습니다. 보통 정부들에서는 걸음 수보다는 시간을 가이드라인으로 제공하는데 일상생활의 일부로서 하는 운동을 더해 일주일에 적어도 150분 하루 30분 가량 운동할 것을 제안하고 있습니다. 걸음수로 환산하면 일주일에 1만6000보가 조금 넘고 하루 2000보에서 3000보 정도가 될 것이라고 이 박사는 말합니다. 만약 쇼핑이나 집안일 등 일상생활로 하루 한 5000보 정도를 걷는다면 2000보 3000보만 더해도 하루 7000보 8000보를 걷게 되는 것이고 이는 “딱 좋은” 걸음수가 됩니다.\n", + "\n", + "### 답변: '의1만 보'라는 목표는 과학에서 비롯됐다기보다는 우연과 역사에 따른 것으로 하루에 4400보 정도를 걸었던 70대 여성들이 하루에 2700보를 채 걷지 않은 여성들과 비교할 때 조기사망 위험을 40% 가량 줄인 것을 발견하며 더 나아가서 1만 보라는 목표의 절반을 채 채우지 못해도 충분히 사망위험을 낮출 수 있다.<|endoftext|>\n", + "55 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 中企 금리 상승 탓 금융비용 증가 자금난 대비 위한 지원책 검토 금융위원회. 금융위 제공 금융위원회가 금리·환율·물가 상승에 따라 경영·자금난이 가중되고 있는 중소기업에 대한 지원 방안을 논의했다. 금융위 취약부문 금융애로 대응 태스크포스 TF 는 6일 ‘중소기업 금융상황 점검회의’를 개최하고 최근 중소기업 경영 및 자금여건 등에 대해 의견을 나누었다. 금융감독원 중소기업중앙회 연구기관 및 정책금융기관이 이 자리에 참석해 중소기업의 현 상황을 점검했다. 취약부문 금융애로 대응 TF의 첫 회의가 지난달 23일 열린 이후 두 번째 회의가 열린 것이다. 이날 점검회의 결과 최근 중소기업 생산 및 평균 가동률은 양호한 수준을 유지하고 있는 것으로 파악됐다. 하지만 원자재 가격 상승으로 중소기업 채산성 악화가 우려되고 공급망 재편 등 불확실성 확대로 경영 여건이 녹록지 않다는 의견이 나왔다. 아울러 금융 여건 측면에서 중소기업의 대출 잔액 증가와 함께 최근의 금리 상승으로 인한 금융비용 증가가 경영상 부담으로 작용한다는 평가도 나왔다. 만기연장‧상환유예 조치 연장을 통해 중소기업이 상환부담이 줄어 연체율 및 부실채권비율은 낮은 수준을 유지하고 있는 것으로 나타났다. 또 은행 등 금융회사들은 1대 1 사전컨설팅 및 채무상환계획 조정을 통해 만기연장‧상환유예 대출이 연착륙될 수 있도록 조치하고 있어 급격한 연체율 확대 등 우려 역시 적은 상황이다. 금융당국은 중소기업이 복합 경제위기를 돌파하고 위기를 기회로 전환할 수 있도록 금융지원 역량을 강화할 방침이다. 금융위 관계자는 “중소기업의 경영상 부담을 완화하고 경쟁력을 높일 수 있도록 금융지원 방안을 검토하고 마련할 계획”이라고 말했다.\n", + "\n", + "### 답변: 금융원 중소기업중앙회 연구기관 및 정책금융기관은 금리·환율·물가 상승으로 경영·자금난이 가중되고 있는 중소기업에 대한 지원 방안으로 6일 ‘중소기업 금융상황 점검회의’를 개최하고 최근 중소기업 경영 및 자금여건 등에 대해 의견을 나누었다.<|endoftext|>\n", + "56 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 사진 오준오 오른쪽 보람그룹 대표이사가 ‘2022 소비자가 선정한 품질만족대상’ 시상식에서 수상 기념촬영을 하고 있다. 제공 보람그룹 상조서비스부문 총 2회 수상 쾌거 “토털 라이프케어 서비스로 고객 만족 실현할 것” 보람그룹 회장 최철홍 의 상조 브랜드 보람상조가 2022 소비자가 선정한 품질만족대상에서 상조서비스부문 대상을 수상했다. 지난 2020년에 이은 두 번째 수상이다. ‘소비자가 선정한 품질만족대상’은 소비자의 눈높이에서 고객 만족을 위해 양질의 서비스 품질을 구현하는 기업 및 기관을 선정 표창하는 시상식이다. 수상기업은 소비자 설문조사와 더불어 산학 전문가로 구성된 전문 심사위원단의 엄정한 심사로 결정된다. 시상식은 6월 30일 코리아나호텔에서 거행됐다. 1991년 설립돼 올해로 창립 32주년을 맞이한 보람상조는 최철홍 회장을 중심으로 ‘고객중심 나눔경영’을 이어나가고 있다. ‘가격정찰제 실시’를 비롯한 다양한 최초 시도로 업계를 선도하고 있으며 국가자격증 교육기관인 ‘보람장례지도사교육원’을 직영으로 운영하는 등 업계 선진화에도 힘쓰고 있다. 최철홍 보람그룹 회장은 “32년간 고객 만족을 위해 달려온 것에 대한 평가를 ‘소비자가 선정한 품질만족대상’으로 받게 돼 기쁘다”며 “앞으로도 토털 라이프 케어 서비스 기업으로서 고객만족을 실현하도록 최선의 노력을 다하겠다” 고 수상 소감을 밝혔다.\n", + "\n", + "### 답변: 창2 소비자가 선정한 품질만족대상에서 상조부문 대상을 수상한 최철홍 의 상조 브랜드 보람상조는 '가격정찰제 실시'를 비롯한 다양한 최초 시도로 업계를 선도하고 있으며 국가자격증 교육기관인 ‘보람장례지도사교육원’을 직영으로 운영하는 등 업계 선진화에도 힘쓰고 있다.<|endoftext|>\n", + "57 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 1998년 11월 이후 상승폭 최고…공업제품 9.3%↑ 현재 추세면 연간 상승률 5% 넘어… 하반기 불확실 © News1 김초희 디자이너 세종 뉴스1 이철 기자 한종수 기자 김혜지 기자 6월 소비자물가가 1년 전보다 6.0% 오르면서 1998년 외환위기 후 약 24년 만에 가장 큰 상승폭을 기록했다. 국제유가와 곡물가격 등 각종 원자재 가격 상승에 따라 경유가 50.7% 수입쇠고기가 27.2% 급등했다. 특히 체감 물가를 나타내는 생활물가지수가 7.4% 크게 오르면서 23년7개월 만에 가장 높은 상승률을 기록해 실제 민생난을 보여줬다. 통계청이 5일 펴낸 2022년 6월 소비자물가동향 에 따르면 지난달 소비자물가지수는 108.22 2020 100 으로 지난해 같은 달과 비교해 6.0% 상승했다. 상승폭이 전월인 5월 5.4% 보다 0.6%포인트 p 확대됐다. 이는 국제통화기금 IMF 외환위기 직후인 1998년 11월 6.8% 이후 23년7개월 만에 가장 높은 상승률이다. 6월 물가는 석유류를 포함한 공업제품과 외식 등 개인서비스 전기·수도·가스 농축수산물이 모두 상승했다. 특히 공업제품이 9.3% 오르면서 2008년 9월 9.3% 이후 가장 높은 상승세를 보였다. 구체적으론 Δ경유 50.7% Δ휘발유 31.4% Δ등유 72.1% Δ자동차용LPG 29.1% 등 유가 급등세가 가팔랐다. 농축수산물은 1년 전보다 4.8% 상승한 가운데 Δ돼지고기 18.6% Δ수입쇠고기 27.2% Δ포도 31.4% Δ배추 35.5% Δ닭고기 20.1% Δ감자 37.8% 등이 크게 올랐다. 전기·가스·수도는 9.6% 급등했는데 이에 포함된 전기료 11.0% 도시가스 11.0% 상수도료 3.7% 등 공공요금 상승률도 컸다. 서비스 물가는 1년 전에 비해 3.9% 상승했다. 특히 외식이 1992년 10월 8.8% 이후 최대 상승률인 8.0%에 달했다. 어운선 통계청 경제동향통계심의관은 석유류 등 공업제품과 개인서비스 가격이 높은 오름세를 지속하고 농축산물 오름 폭이 확대됐다 면서 1998년 11월은 외환위기 이후 구제금융을 신청해 환율이 급등하면서 원자재 가격이 상승한 시기 라고 말했다. 역대 월별 소비자물가 상승률 추이를 보면 작년 10월 3.2% 9년8개월 만에 3%대로 올라선 뒤 11월 3.8% 12월 3.7% 올해 1월 3.6% 2월 3.7% 까지 5개월 연속 3%대를 보이다가 3월 4.1% 과 4월 4.8% 에 4%선을 돌파했다. 이어서 5월 5.4% 에 5%대 상승률을 기록했는데 이는 글로벌 금융위기 당시인 2008년 9월 이후 13년8개월 만에 처음 있는 일이었다. 이번에 6% 선에 다다르면서 IMF 외환위기 수준으로 악화한 것이다. 6월 소비자물가 동향. 통계청 제공 © 뉴스1 물가의 기조적 흐름을 보여주는 근원물가 농산물 및 석유류 제외지수 는 4.4% 올라 2009년 3월 4.5% 이후 가장 크게 뛰었다. 식료품 및 에너지 제외지수도 3.9% 올라 2009년 2월 4.0% 이후 최대 상승폭을 나타냈다. 체감 물가를 나타내는 생활물가지수는 1년 전보다 7.4% 오르면서 1998년 11월 10.4% 이후 23년7개월 만에 가장 급격하게 치솟았다. 계절 요인이나 일시적 충격에 의한 변동을 배제한 식료품 및 에너지제외지수는 2009년 4월 4.0% 이후 13년2개월 만에 가장 높은 상승 폭인 3.9%를 기록했다. 어 심의관은 큰 흐름에서 석유류 등 공업제품과 개인서비스가 물가상승을 주도하는 것은 변함없다 며 특히 석유류의 상승 기여도가 줄어들고 있지 않다는 것이 눈에 띈다 고 분석했다. 이어 개인서비스의 물가상승폭은 조금씩 늘어나는 경향이다. 다만 코로나19 이후 소비가 회복되면서 개인서비스 가격이 오르는 것은 누구나 예상할 수 있었기 때문에 특이하게 보이지는 않는다 며 오히려 개인서비스에 국제 에너지 비용 상승 곡물가격 상승 효과가 반영됐다고 보이기 때문에 여전히 대외적인 공급측면의 물가 상승 요인들이 빨리 완화돼야 한다는 생각을 한다 고 분석했다. 그러면서 하반기는 불확실하다. 석유류의 오름세 둔화 시각도 있긴 한데 지켜봐야 한다 며 7월부터 현재와 같은 수치면 연간으로 5%를 넘게 된다 고 전망했다.\n", + "\n", + "### 답변: 통계청이 5일 펴낸 2022년 6월 소비자물가동향에 따르면 지난달 소비자물가지수는 108.22 2020 으로 지난해 같은 달과 비교해 6.0% 상승했으며, 이는 국제유가와 곡물가격 등 각종 원자재 가격 상승에 따른 것으로 각종 원자재 가격 상승에 따라 경유가 50.7% 수입쇠고기가 27.2% 급등하면서 1998년 외환위기 후 약 24년 만에 가장 큰 상승폭을 기록했다.<|endoftext|>\n", + "58 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 한 멕시코 비즈니스라운드테이블 개최 삼성전자 SK 현대차 포스코 등 주요 진출기업 참석 마르셀로 에브라르드 멕시코 외교장관. ⓒ대한상공회의소 데일리안 박영국 기자 대한상공회의소는 5일 한 멕시코 수교 60주년을 기념해 방한한 마르셀로 에브라르드 멕시코 외교장관을 초청해 ‘한 멕시코 비즈니스 라운드테이블’을 개최했다고 밝혔다. 이날 행사에는 우태희 대한상의 상근부회장 김유석 SK온 부사장 이상직 삼성전자 멕시코 법인장 김경수 현대차 상무 허순재 LG전자 상무 유삼 포스코 상무 삼성엔지니어링 로버트 윤 부사장 박현철 위니아전자 대표이사 이성우 대한상의 국제통상본부장 등 국내 주요 그룹 임원 10여명이 참석해 현지 진출기업들의 애로사항을 멕시코 정부에 건의하고 지원방안을 제안했다. 멕시코 측에서는 마르셀로 에브라르드 외교장관을 비롯해 카르멘 모레노 토스카노 외교차관 브루노 피게로아 주한멕시코대사 하비에르 다비야 협력정책실장 등 정부 고위급 인사들과 핀테크·이커머스 스타트업 기업인 등 약 20명이 참석했으며 공급망 및 그린비즈니스 협력 투자확대 등 향후 협력과제도 논의했다. 대한상의는 엑스포 주무부처인 멕시코 외교부에 ‘2030 월드 엑스포’를 부산이 유치할 수 있도록 적극적인 지지를 요청하기도 했다. 에브라르드 장관은 멕시코시티 시장 외교부차관 등을 거치며 오랜 기간 정치에 몸담아 온 인물로 멕시코 외교 및 국제 업무를 총괄하고 있으며 평소에도 투자 통상 등 경제이슈에 관심이 많아 이번 방한 시에도 한국기업들을 만나고 싶다는 의향을 적극 내비친 것으로 알려졌다. 회의를 주재한 우태희 대한상의 상근부회장은 축사를 통해 “삼성전자 SK 현대차 LG전자 포스코 삼성엔지니어링 위니아전자 등 주요기업들을 필두로 현재 약 450여개의 우리 기업이 멕시코에 진출 15만여개의 일자리 창출에 기여했으며 대 멕시코 투자액 아시아 2위라는 성과를 거뒀다”면서 “코로나 이후 글로벌 경제환경이 급변하고 있는 가운데 공급망 기후변화 대응 등 양국 간 새로운 협력기반을 확대해 나가길 바란다”고 말했다. 이날 회의에서 우리 기업들은 현지 생산공장 설립·운영 등 현재까지의 멕시코 투자현황 관련한 애로사항 관련 건의와 함께 일자리창출 등의 진출성과를 발표하고 양국 기업 간 미래지향적 협력을 위한 의견을 제시하는 등 구체적 경제협력 확대방안에 대해 논의했다. 이성우 대한상의 국제본부장은 “멕시코는 북미와 남미를 이어주는 전략적 요충지로 최근 14년간 중단되었던 한 멕시코 자유무역협정 FTA 협상이 재개되는 등 양국간 경제협력에 훈풍이 불고 있다”며 “공급망이 요즘 최대 이슈인 만큼 관련 협력을 강화하고 우리 기업들이 더 활발히 진출해 활동할 수 있도록 지속적으로 노력하겠다”고 말했다.\n", + "\n", + "### 답변: 대한상공회의소는 5일 한 멕시코 수교 60주년을 기념해 국내 주요 그룹 임원 10여명이 방한한 마르셀로 에브라르드 멕시코 외교장관을 초청해 ‘한 멕시코 비즈니스 라운드테이블’을 개최했다고 밝혔으며 멕시코 측에서는 마르셀로 에브라르드 외교장관을 비롯해 정부 고위급 인사들과 핀테크·이커머스 스타트업 기업인 등 약 20명이 참석했으며 공급망 및 그린비즈니스 협력 투자확대 등 향후 협력과제도 논의했다.<|endoftext|>\n", + "59 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 디지털데일리 변재영 기자 링컨코리아는 올해 브랜드 창립 100주년을 맞이해 오는 2일부터 10일까지 서울 강남 신세계 센트럴시티 내 오픈스테이지에서 ‘링컨 센테니얼 라운지’ 전시 행사를 진행한다고 1일 밝혔다. 링컨 센테니얼 라운지에서는 링컨 SUV의 전 라인업이 전시됐다. 전시모델은 네비게이터 에비에이터 노틸러스 코세어 등 4종이다. 아울러 링컨 100주년 기념 및 전동화 콘셉트카인 ‘링컨 스타’ 소개 영상 링컨 100년 역사를 테마로 한 다양한 헤리티지 콘텐츠를 멀티미디어 형식으로 전달할 예정이다. 현장 모습은 추후 링컨 홈페이지에 오픈되는 360도 버추얼 투어를 통해서 공개된다.\n", + "\n", + "### 답변: 링컨코리아는 올해 브랜드 창립 100주년을 맞이해 오는 2일부터 10일까지 서울 강남 신세계 센트럴시티 내 오픈스테이지에서 ‘링컨 센테니얼 라운지’ 전시 행사를 진행한다고 1일 밝혔으며 링컨 센테니얼 라운지에서는 링컨 SUV의 전 라인업이 전시됐고 아울러 링컨 100주년 기념 및 전동화 콘셉트카인 ‘링컨 스타’ 소개 영상 링컨 100년 역사를 테마로 한 다양한 헤리티지 콘텐츠를 멀티미디어 형식으로 전달할 예정이다.<|endoftext|>\n", + "60 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 현대건설과 삼성엔지니어링이 사우디아라비아 국영 석유기업 아람코에서 추진하는 건설 설계·조달·시공 EPC 파트너 기업에 최종 선정돼 향후 아람코에서 발주하는 석유·화학 관련 신사업들에 대한 수의계약과 입찰 인센티브를 받는 본 협약을 체결했다고 6일 밝혔다.\n", + "\n", + "### 답변: 현대건설과 삼성엔지니어링이 6일 현대건설과 삼성엔지니어링이 사우디아라비아 국영 석유기업 아람코에서 추진하는 건설 설계·조달·시공 EPC 파트너 기업에 최종 선정돼 향후 아람코에서 발주하는 석유·화학 관련 신사업들에 대한 수의계약과 입찰 인센티브를 받는 본 협약을 체결했다고 밝혔다.<|endoftext|>\n", + "61 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 1000만원 이상의 지방세를 체납한 고액·상습체납자가 해외여행 중에 고가의 명품을 구입하거나 해외 직구로 물품을 구매하면 세관에서 바로 압류됩니다. 서울시는 지방세징수법 개정에 따라 지방세 고액·상습체납자가 수입하는 물품에 대한 체납처분을 지난 1일 관세청에 위탁했다고 4일 밝혔습니다. 그동안 국세 체납자의 경우 수입물품 압류가 가능했지만 지방세 체납자에 대한 압류 처분은 올해 새롭게 실시됩니다. 지난해 1월 고액·상습체납자의 수입물품에 대한 체납처분을 세관장에게 위탁할 수 있는 법적 근거가 마련됨에 따른 것입니다. 시가 고액·상습체납자의 체납처분을 관세청에 위탁하면 관세청에서 고액체납자가 입국시 휴대한 고가품의 경우 현장에서 압류처리하고 해외직구로 산 수입품 등은 통관을 보류하고 압류해 체납액을 징수하게 됩니다. 압류 대상은 △체납자가 입국할 때 직접 휴대 또는 소지해 수입하는 물품 휴대품 △인터넷 등을 통해 해외에서 직접 구매한 후 배송업체를 통해 수입하는 물품 특송품 △무역계약 체결 등을 통한 일반적인 형태의 수입물품 일반수입품 등입니다. 시가 위탁 의뢰한 체납자는 지난해 신규 명단공개자로 시와 25개 자치구에서 관리되고 있는 지방세 체납액 1000만 원 이상인 고액·상습체납자입니다. 총 1127명이며 이들이 체납한 총 체납액은 712억원에 달합니다.\n", + "\n", + "### 답변: 서울시는 지방세징수법 개정에 따라 그동안 국세 체납자의 경우 수입물품 압류가 가능했지만 지방세 체납자에 대한 압류 처분은 올해 새롭게 실시되는데 지난해 1월 고액·상습체납자의 수입물품에 대한 체납처분을 세관장에게 위탁할 수 있는 법적 근거가 마련됨에 따라 고액의 지방세를 체납한 고액·상습체납자가 해외여행 중에 고가의 명품을 구입하거나 해외 직구로 물품을 구매하면 세관에서 바로 압류된다.<|endoftext|>\n", + "62 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 전기와 가스요금이 오늘 1일 부로 동시에 인상됐습니다. 전기요금에 적용되는 연료비 조정단가가 킬로와트당 5원 인상되면서 4인 가구 전기요금은 월 평균 1 535원 늘어날 것으로 추산됩니다. 도시가스 요금도 올라 4인 가구 가스요금은 서울시 기준으로 월 평균 2 220원 오릅니다. 전기차 충전요금의 경우 특례할인 제도가 어제 종료되면서 인상된 것이나 다름 없게 됐습니다. 오는 10월 전기요금과 가스요금이 다시 한번 동시에 오를 예정이라 가계 부담은 더 커질 것으로 전망됩니다.\n", + "\n", + "### 답변: 오늘 1일 부로 동시에 전기와 가스요금이 동시에 동시에 인상되어 4인 가구 전기요금은 월 평균 1 535원 늘어날 것으로 추산되고 도시가스 요금도 올라 4인 가구 가스요금은 서울시 기준으로 월 평균 2 220원 오르게 됐다.<|endoftext|>\n", + "63 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 양로원·도서관 등에 서비스·방역 로봇 기부 KT가 사회적 관계망 서비스 SNS 인스타그램 릴스를 활용한 KT AI D 에이드 캠페인 을 진행한다고 4일 밝혔다. KT 제공 © 뉴스1 서울 뉴스1 윤지원 기자 KT가 사회관계망서비스 SNS 인스타그램 릴스를 활용한 KT 에이드 AI D 캠페인 을 진행한다고 4일 밝혔다. 누구나 참여 가능한 이번 캠페인은 KT의 인공지능 AI 기술로 세상을 돕는다 는 사회적 의미를 담아 진행된다. KT는 오는 31일까지 SNS 인스타그램 릴스 콘텐츠 1000개 이상이 모이면 양로원이나 공공 어린이 도서관 등에 KT의 AI 서비스로봇 과 AI 방역로봇 을 제공할 예정이다. KT 인스타그램 공식 계정에 공개된 증강현실 AR 필터를 활용해 집 사무실 등 어디서든 인스타그램 릴스 영상을 찍어 업로드 하면 된다. 릴스 업로드 시 KT에이드 · 서비스로봇 · 방역로봇 등 필수 해시태그를 함께 게재하면 된다. 이번 캠페인을 통해 이용자들은 AR 필터를 통해 선물을 전달해주는 AI 서비스로봇과 바이러스 제로 공간을 만드는 AI 방역로봇 기능을 간접 체험할 수 있다. KT는 참여자를 대상으로 선착순 777명에게 기프티콘을 제공할 예정이다. 아울러 댓글이 가장 많거나 좋아요 를 많이 받은 참여자들에게는 경품을 제공한다. 배철기 KT AI·DX사업전략담당 상무는 이번 AI D 캠페인은 고객이 KT AI 로봇을 재미와 함께 간접적으로나마 체험해볼 수 있는 기회를 제공하기 위해 기획했다 며 KT는 참여형 콘텐츠를 통해 KT의 디지코 서비스를 경험하면서도 사회적으로 의미 있는 활동에 동참할 수 있는 캠페인을 지속할 예정이다 라고 밝혔다.\n", + "\n", + "### 답변: KT가 사회관계망서비스 SNS 인스타그램 릴스를 활용해 누구나 참여 가능한 KT의 인공지능 AI 기술로 세상을 돕는다는 사회적 의미를 담아 진행한 'KT AI D 캠페인'을 통해 이용자들은 AI 서비스로봇과 바이러스 제로 공간을 만드는 AI 방역로봇 기능을 간접 체험할 수 있다.<|endoftext|>\n", + "64 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 강민지 기자 7일 오후 서울 종로구 연합뉴스 사옥에서 열린 연합뉴스 세계한류학회 업무협약식에서 성기홍 연합뉴스 사장과 문시연 세계한류학회 회장이 협약서를 들고 있다.\n", + "\n", + "### 답변: 7일 오후 서울 종로구 연합뉴스 사옥에서 열린 세계한류학회 업무협약식에서 세계한류학회 회장이 협약서를 들고 세계한류학회 업무협약식을 진행했다.<|endoftext|>\n", + "65 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: CJ ENM 스튜디오 센터 르포 파주에 최첨단 ‘콘테크’ 전진기지 버추얼 프로덕션 스테이지 압권 벽면·천장까지 대형 LED 스크린 환상적인 배경 CG로 구현 가능 스크린·세트장 유기적 연결 탄성 5일 처음 공개된 경기 파주 CJ ENM 스튜디오 센터 내 ‘버추얼 프로덕션 스테이지’에서 제작진이 천장과 벽면을 360도로 둘러싼 메인 LED월에 펼쳐진 설산을 배경으로 자동차를 촬영하고 있다.CJ ENM 제공 차디찬 바람이 불어오는 웅장한 설산이 거대한 타원형 스크린에 펼쳐졌다. 스크린 앞 세트장에 올라선 배우를 촬영하니 정말 그가 설산의 품에 안긴 듯한 영상이 모니터에 출력됐다. 이윽고 스크린은 아름다운 노을이 드리운 해변가로 검붉은 낙엽이 흐트러진 숲속으로 엠파이어스테이트빌딩이 내려다보이는 미국 뉴욕으로 어느 소도시의 낭만적인 밤거리로 계속 전환됐다. 그때마다 영상 속 배우도 각각의 공간에 실제로 가 있는 것처럼 다채롭게 녹아들어 갔다. 5일 기자가 찾은 경기 파주 CJ ENM의 스튜디오 센터는 국내 최대 규모인 약 6만 4000평 21만 1570㎡ 의 문화 콘텐츠와 최첨단 기술이 융합된 ‘콘테크’ 콘텐츠 기술 전진 기지로 구성돼 있었다. 특히 높은 해상도의 삼성전자 마이크로 발광다이오드 LED ‘더 월’을 심은 ‘버추얼 프로덕션 VP 스테이지’ 500평·1652㎡ 는 콘테크의 집약체였다. VP 스테이지의 가장 큰 특징은 지름 20m 높이 7.3m의 말굽형 구조로 이뤄진 ‘메인 LED월’이다. 벽면 360도와 천장까지 모두 대형 LED 스크린으로 채워진 이 공간은 다양한 배경 영상을 틀어 촬영할 수 있다. 사막 영상을 띄운 LED월 앞에 모래와 바위 등을 가져다 놓으면 배우들이 실제로 황막한 사막을 거니는 듯한 영상을 찍을 수 있다. 막대한 비용과 시간이 소요되는 해외 로케이션을 갈 필요가 없어 제작비를 줄일 수 있고 촬영이 힘든 공간을 구현하고 싶을 때도 효율을 극대화할 수 있다. 5일 처음 공개된 경기 파주 CJ ENM 스튜디오 센터 내 ‘버추얼 프로덕션 스테이지’에서 울창한 숲속을 배경으로 연기하는 배우를 촬영하는 모습.CJ ENM 제공 현실에 존재하지 않는 환상적인 배경도 컴퓨터그래픽 CG 으로 구현할 수 있다. 마블 시네마틱 유니버스 MCU 시리즈 등 화려한 CG로 이뤄진 영화를 찍을 땐 아무것도 없는 합성용 녹색 스크린 앞에서 배우들이 연기하는 것이 일반적이다. 하지만 메인 LED월에 CG 배경을 띄우면 배우들도 더욱 몰입감 있게 연기할 수 있게 된다. MobileAdNew center 기자가 직접 VP 스테이지에 들어가서 확인해 보니 촬영된 영상이 배경과 이질감 없이 매우 실감나게 느껴졌다. 단순히 배경만 띄워 놓는 것이 아니라 배경 속 사물이 카메라 촬영 각도에 따라 달라지는 등 스크린과 세트장이 유기적으로 연결되는 모습도 인상적이었다. VP 스테이지엔 메인 LED월 외에 길이 20m 높이 3.6m의 ‘일자형 월’도 마련돼 있어 다양한 형태의 영상 촬영이 가능했다. CJ ENM VP 스테이지에서 밤거리를 배경으로 촬영하고 있다. CJ ENM 제공 이국적인 밤거리를 배경으로 촬영한 결과물. 배경과 배우 세트장이 자연스럽게 녹아들어 있다. CJ ENM은 앞으로 드라마와 영화는 물론 예능 공연 등 다양한 콘텐츠를 찍을 때 VP 스테이지를 활용한다. 특히 가상현실 VR ·증강현실 AR ·확장현실 XR 과 메타버스 등의 첨단 기술을 접목한 콘텐츠 제작도 가능하다. 서정필 CJ ENM 테크 아트 사업부장은 “글로벌 무대에서 신드롬을 일으킬 K콘텐츠 탄생의 메카로 만들겠다”고 말했다.\n", + "\n", + "### 답변: 경기 최대 규모의 문화 콘텐츠와 최첨단 기술이 융합된 콘테크 콘텐츠 전진 기지로 구성된 경기 파주 CJ ENM의 스튜디오 센터는 대형 LED 스크린으로 채워진 공간은 다양한 배경 영상을 틀어 촬영할 수 있고, 막대한 비용과 시간이 소요되는 해외 로케이션을 갈 필요가 없어 제작비를 줄일 수 있는 등 효율을 극대화 할 수 있는 것으로 알려졌다.<|endoftext|>\n", + "66 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 금리인상 우려에 매물적체 영향…매수심리도 갈수록 위축 노원·강북·강동 등 하락폭 확대…인천·수원도 찬바람 서울 남산에서 바라본 아파트단지. © News1 박세연 기자 서울 뉴스1 박승주 기자 서울 집값이 5주 연속 하락하고 외곽지역을 위주로 낙폭도 커진다. 매물은 늘어나는 추세지만 잇따른 금리인상 등의 영향으로 매수심리는 점점 위축된다. 서울을 포함한 수도권 전체에서 찬바람이 불고 있다. 2일 한국부동산원에 따르면 이번주 서울 아파트값 변동률은 지난주와 같은 0.03%를 기록했다. 서울 아파트값은 5월 다섯째주 0.01%로 하락 전환한 뒤 6월 첫째주 0.01% 둘째주 0.02% 셋째주 0.03% 이번주 0.03% 등 하락폭이 느는 추세다. 추가 금리인상 우려와 매물 적체 영향 등으로 관망세가 계속됐다. 부동산 빅데이터 업체 아실의 통계를 보면 6월말 기준 아파트 매물은 6만4977건으로 지난달 10일 5만6568건 양도소득세 중과 한시 배제 조치 시행 이후 14.8% 늘었다. 그러나 서울 아파트 거래는 가뭄 상태고 아파트 매수 심리도 8주째 하락하고 있다. 서울 아파트 매매수급지수는 87.0로 지난주 88.1 보다 1.1포인트 하락했다. 수급지수는 0 100사이면 매도세가 100 200사이면 매수세가 더 크다는 의미다. 서울 25개 자치구 중 서초구 0.02% 만 올랐고 3개 구는 보합 나머지 21개 구는 하락을 기록했다. 특히 노도강 노원·도봉·강북 등 외곽지역이 하락폭을 키웠다. 강북구와 노원구는 각각 지난주 0.05%에서 이번주 0.07%를 기록했다. 동대문구와 서대문구도 각각 0.05%를 나타냈다. 강남4구에서는 서초구의 강세가 이어졌고 강남구는 4주째 보합을 기록했다. 다만 송파구 0.02% 는 마천·석촌동 중저가 위주로 하락했고 강동구 0.04% 도 내렸다. 경기 수원시내 아파트 단지 모습. © News1 조태형 기자 특히 수도권은 거래 침체가 길어지면서 가격 하락 지역이 늘고 있다. 2기 신도시의 내림세가 지속됐고 인천 수원 등 입주물량이 집중된 지역은 약세를 나타냈다. 인천은 0.06%에서 0.08%로 낙폭이 커졌다. 연수구의 경우 지난해 상승 피로감이 있는 옥련·송도동 위주로 하락하며 일주일새 0.23% 하락했다. 경기도 0.04%에서 0.05%로 내림폭이 확대됐다. 전셋값 하락 영향이 있는 수원 영통구 0.18% 권선구 0.13% 양주시 0.05% 등에서 하락폭이 늘어났다. 민간 통계인 부동산R114 조사에서도 신도시는 0.03% 내렸고 경기·인천은 0.05% 하락하면서 두 지역 모두 지난주 대비 낙폭이 늘었다. 인천은 용현동 SK스카이뷰 중산동 신명스카이뷰주얼리 송도동 송도더샵센트럴시티 등 대단지에서 1000만 2000만원 내렸다. 수원은 세류동 수원역센트럴어반시티 수원역해모로 등이 1000만 2 000만원 하락했다. 평택은 청북읍 사랑으로부영1차 평택청북지구EGthe1이 1000만원가량 내렸다. 수도권의 하락세는 당분간 이어질 것이란 관측이다. 국토교통부는 주거정책심의위원회를 열고 미분양이 누적되고 집값 하락세를 보인 17개 시군구에 대한 규제지역 해제를 결정했다. 다만 수도권의 경우 여전히 상승세인 지역이 있고 미분양이 많지 않다는 이유 등으로 규제지역 지정이 유지됐다. 여경희 부동산R114 수석연구원은 금리 추가 인상 경기 불확실성 계절적 비수기 등으로 매수심리가 풀리기 어려운 상황 이라며 거래시장의 부진한 흐름은 한동안 계속될 전망 이라고 밝혔다.\n", + "\n", + "### 답변: 서울물가지난주 집값이 5주 연속 하락하고 외곽지역을 위주로 낙폭도 커지는데 매물은 늘어나는 추세지만 잇따른 금리인상 등의 영향으로 매수심리는 점점 위축되어 서울을 포함한 수도권 전체에서 찬바람이 불고 있다고 2일 한국부동산원에 따르면 이번주 서울 아파트값 변동률은 지난주와 같은 0.03%를 기록했다.<|endoftext|>\n", + "67 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 디지털데일리 변재영 기자 신한금융투자는 가산 데이터센터 개발사업 관련 PF대출 단독주관에 성공했다고 7일 밝혔다. 가산 데이터센터 개발사업은 금천구 가산동에 지하 5층 지상 10층 규모의 데이터센터를 개발하는 사업이다. 신한금융투자 주관 사업을 시행하는 가산아이윌의 조달 금액은 총 3700억원이다. 케이티에서 분사한 케이티클라우드가 마스터리스 Master Lease 할 예정이며 시공은 DL건설과 케이티가 공동으로 맡는다. 이번 개발로 서울 서남부권의 신축 데이터센터가 완성된다. 가산 데이터센터는 서울 전역의 글로벌IT업체 및 대기업 등 다양한 고객군을 대상으로 트래픽 수요에 즉시 대응할 수 있는 데이터센터가 될 것으로 평가된다.\n", + "\n", + "### 답변: 신한금융투자는 금천구 가산동에 지하 5층 지상 10층 규모의 데이터센터를 개발하는 가산 데이터센터 개발사업 관련 PF대출 단독주관에 성공했다고 7일 밝혔으며 이를 통해 서울 전역의 글로벌IT업체 및 대기업 등 다양한 고객군을 대상으로 트래픽 수요에 즉시 대응할 수 있는 데이터센터가 될 것으로 평가된다.<|endoftext|>\n", + "68 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 포스코홀딩스 포스코홀딩스 제공. 재판매 및 DB 금지 서울 연합뉴스 박상돈 기자 포스코홀딩스는 최근 테라사이언스와 실리콘음극재 생산기술을 보유한 테라테크노스 지분 100%를 인수하는 계약을 체결했다고 5일 밝혔다. 테라테크노스는 2017년 설립된 실리콘음극재 스타트업으로 열전달이 우수한 고온 액상 방식의 생산 기술을 보유하고 있다. 포스코홀딩스는 실리콘음극재는 현재 리튬이온전지에 대부분 사용되고 있는 흑연음극재보다 에너지 밀도를 4배 정도 높일 수 있어 전기차 주행거리 향상은 물론 충전 시간도 단축할 수 있는 차세대 음극재 라고 소개했다. 포스코홀딩스는 테라테크노스 인수 후 연내 증설을 시작해 2024년 상반기 제품을 양산·판매할 계획이다. 포스코그룹은 리튬과 니켈 등 원료부터 양극재까지 이차전지소재 공급망 가치사슬을 구축한 데 이어 이번 테라테크노스 인수로 음극재 분야에서도 포트폴리오를 확대해 향후 이차전지소재 분야의 높은 중국 의존도를 낮출 수 있을 것으로 기대했다.\n", + "\n", + "### 답변: 포스코홀딩스는 고온 액상 방식의 생산 기술을 보유한 실리콘음극재 스타트업으로 열전달이 우수한 고온 액상 방식의 생산 기술을 보유하고 있는 테라사이언스와 생산기술을 보유한 테라테크노스 지분 100%를 인수하는 계약을 체결했다고 5일 밝혔다.<|endoftext|>\n", + "69 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 인천공항 뉴스1 유승관 기자 수학계의 노벨상 으로 불리는 필즈상을 수상한 허준이 미국 프린스턴대학교 교수 한국 고등과학원 석학교수 가 8일 인천국제공항을 통해 귀국하고 있다. 필즈상 Fields Medal 은 국제수학연맹 IMU 이 4년마다 개최하는 세계수학자대회 ICM 에서 만 40세 미만의 수학자에게 수여하는 수학계 최고의 상이다.\n", + "\n", + "### 답변: 8계의 노벨상이라 불리며 수학계의 노벨상 으로 불리는 필즈상을 수상한 허준이 미국 프린스턴대학교 교수 한국 고등과학원 석학교수가 8일 인천국제공항을 통해 귀국하였으며 필즈상 Fields Medal은 국제수학연맹 IMU 이 4년마다 개최하는 세계수학자대회 ICM 에서 만 40세 미만의 수학자에게 수여하는 수학계 최고의 상이고 필즈상을 수상한 허준이 미국 프린스턴대학교 교수 한국 고등과학원 석학교수 가 8일 인천국제공항을 통해 귀국하고 있다.<|endoftext|>\n", + "70 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 가와사키 AP 뉴시스 일본 스바루 자동차가 만든 수출용 승용차들이 지난 9월7일 도쿄 부근 가와사키항에서 선적을 위해 야적장에 도열해 있다. 2021.10.08 서울 뉴시스 이재준 기자 2022년 1 6월 일본 국내 신차 판매량은 208만대로 전년 동기 대비 15%나 줄었다고 닛케이 신문 등이 1일 보도했다. 매체는 이날 일본자동차판매협회 연합회와 전국경자동차협회 연합회가 정리한 통계를 인용해 이같이 전하며 동일본 대지진이 있던 2011년 상반기 191만9000대 이래 11년 만에 적은 수준이라고 지적했다. 반도체 부족과 중국 상하이 등 봉쇄 여파로 일본에서 자동차 생산이 지체되면서 올해 상반기 신차 판매가 코로나19 확대로 외출자제에 따른 영향이 컸던 2020년 상반기 220만대까지 밑돌았다. 내역을 보면 배기량 660cc 이상 등록차가 지난해 같은 기간보다 16% 감소한 128만5760대에 그쳤다. 경자동차도 작년 동기에 비해 15% 줄어든 80만418대에 머물렀다. 승용차 브랜드별로는 도요타 자동차 렉서스 제외 가 19% 감소한 63만8050대 SUBARU도 21% 크게 준 4만6008대로 주저앉았다. 6월 한달간 신차 판매 대수는 경자동차를 포함해 전년 동월 대비 10% 줄어든 32만7896대로 떨어졌다. 2021년 7월 이래 12개월 연속 전년 동월 실적을 밑돌았다. 등록차는 16% 적은 19만7530대로 1968년 관련 통계 시작 이래 6월로는 최저를 기록했다. 경자동차는 0.4% 감소한 13만366대다. 중국 록다운에 따른 일본공장에서 감산 때문에 도요타의 일본 판매량이 25% 다이하쓰 공업도 18% 각각 줄었다.\n", + "\n", + "### 답변: 닛 닛케이 신문은 일본자동차판매협회 연합회와 전국경자동차협회 연합회가 정리한 통계를 인용해 동일본 대지진이 있던 2011년 상반기 191만9000대 이래 11년 만에 일본 6월 일본 국내 신차 판매량은 208만대로 전년 동기 대비 15%나 줄었다고 1일 보도하며 일본 국내 신차 판매량은 208만대로 전년 동기 대비 15%나 줄었다고 전했다.<|endoftext|>\n", + "71 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 중소벤처기업진흥공단 제공 파이낸셜뉴스 중소벤처기업진흥공단은 제조 소기업 경쟁력 제고를 위한 2022년 중소기업 혁신바우처 사업 2차 참여기업을 모집한다고 4일 밝혔다. 중소기업 혁신바우처는 컨설팅 기술지원 마케팅 서비스를 맞춤형 패키지 형태로 제공해 제조 중소기업의 경영 혁신을 지원하는 사업이다. 지원대상은 3개년 평균 매출액 120억원 이하 제조 소기업 중 지역별 개별사업공고상 참여 요건에 해당하는 기업이다. 올해 1차 공고에선 총 498억원 규모로 일반 및 재기컨설팅 탄소중립 경영혁신 바우처를 지원했다. 이번 2차 모집에는 기업 특성별 맞춤형 지원을 위해 고도화 서비스 바우처 20억원 와 지역단위 자율형 바우처 100억원 를 신설해 총 120억원을 지원할 계획이다. 구체적으로 고도화 서비스 바우처는 2020년 2021년 혁신바우처 사업을 통해 시제품 제작 프로그램에 참여 완료한 기업을 대상으로 한다. 전문가가 현장진단을 바탕으로 맞춤형 프로그램을 추천해 서비스 고도화 및 기업 사업화 역량 강화를 뒷받침할 계획이다. 선정기업에게는 매출 규모에 따라 최대 5000만원 한도로 바우처 발급 금액의 50 90%를 차등 지원한다. 지역단위 자율형 바우처는 지역별 육성 필요산업과 경제현안 등을 고려해 13개 지방중소벤처기업청이 자율적으로 프로그램을 설계·지원한다. 지역산업 성장을 위한 지원주제에 따라 서비스 분야 및 프로그램 한도 등을 정할 예정이다. 김학도 중진공 이사장은 중진공은 성장 가능성이 높은 중소벤처기업의 경쟁력 강화를 위해 혁신 바우처 사업을 비롯한 다양한 사업을 지원해오고 있다 며 앞으로도 제조 소기업의 혁신성장을 통해 지역 균형발전을 이룰 수 있도록 수요자 맞춤형 지원을 확대할 것 이라고 말했다. 한편 사업 공고는 지역별 지원대상 업종과 시기를 고려해 지방중소벤처기업청에서 순차적으로 진행한다. 공고문 확인 및 사업참가 신청은 혁신바우처플랫폼에서 할 수 있고 자세한 문의는 중진공 통합콜센터 1357 또는 지역본·지부로 하면 된다.\n", + "\n", + "### 답변: 중소벤처기업진흥공단이 3개년 평균 매출액 120억원 이하 제조 소기업 중 지역별 개별사업공고상 참여 요건에 해당하는 기업을 대상으로 제조 소기업 경쟁력 제고를 위한 2022년 중소기업 혁신바우처 사업 2차 참여기업을 모집한다고 4일 밝혔으며, 이번 2차 모집에는 고도화 서비스 바우처 20억원와 지역단위 자율형 바우처 100억원을 신설해 총 120억원을 지원할 예정이다.<|endoftext|>\n", + "72 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 김세연 초록뱀미디어 부회장 사진 퍼즐랩 과거 주몽·올인·불새부터 최근 나의아저씨·펜트하우스·나의 해방일지까지 지난 24년의 역사 동안 수많은 히트작을 포함한 총 70여편의 드라마를 제작한 국내 대표 드라마 제작사 초록뱀미디어가 NFT 대체불가능토큰 사업에 도전장을 내밀었다. 초록뱀미디어는 자체 메타버스 세계관이자 초록뱀 소속 아티스트 및 작품 IP 지식재산권 기반 NFT 브랜드 CRB 오리지널 CRB Original 을 앞서 지난달 공개했다. CRB 오리지널 의 첫 프로젝트인 1호 NFT 출시를 앞두고 김세연 초록뱀미디어 부회장을 만나봤다. ◇ 초록뱀의 자체 IP와 블록체인 기술의 만남 김세연 초록뱀미디어 부회장 사진 퍼즐랩 김 부회장은 4일 블루밍비트와의 인터뷰에서 CRB 오리지널 의 출범 배경으로 디지털 콘텐츠 산업의 변화와 블록체인 및 메타버스 등 새로운 시장의 출현을 꼽았다. 그는 드라마 콘텐츠 산업은 2020년 이전까지 공중파 3사가 주도하던 구조에서 최근 종편 및 OTT 서비스의 급격한 성장으로 인해 셀러즈 마켓 으로 산업이 재편됐다 면서 제작사 입장에서는 긍정적인 변화로 IP를 제작사가 소유·판매하는 방향으로 바뀌면서 제작 콘텐츠 수도 크게 늘어나고 있다 고 말했다. 셀러즈 마켓 은 구매자보다 판매자의 의사가 더 중요한 시장으로 그와 반대되는 바이어즈 마켓과 대조되는 의미다. 초록뱀은 OTT 시장 활성화 이후로 매년 1 2편 제작하던 콘텐츠 수를 6 9편으로 늘렸다고 전했다. 무엇보다 IP를 방송사에 넘기는 것이 아니라 제작사가 직접 소유할 수 있게 되면서 이를 활용할 수 있는 분야가 다양해졌다. 즉 IP로 인한 부가가치 창출이 가능해진 가운데 메타버스와 블록체인 산업이 떠오르면서 이를 결합한 CRB 오리지널 이 탄생하게 된 것이다. ◇ 드라마 콘텐츠 IP·소속 연예인 기반 NFT 구축 초록뱀은 지난해 말 블록체인 신사업 TF 태스크포스 팀을 꾸리고 내외부 인재들을 영입해 CRB 오리지널 의 구축과 자체 NFT 제작에 착수했다. NFT 마켓을 운영하는 글로벌 가상자산 거래소 등 해외 유명 기업들이 NFT 사업 협업을 목적으로 먼저 회사 측에 손을 건네기도 했다. 초록뱀이 보유한 IP 강점 덕분이다. 초록뱀은 자체 콘텐츠 IP 뿐만 아니라 스카이이앤엠 YG케이플러스 후크엔터 등 매니지먼트 세 곳을 보유하고 있다. 3사의 소속 연예인은 총 400여명에 달해 이들을 통한 NFT 사업 확장에도 유리한 상황이다. 회사가 조만간 공개를 계획 중인 1호 NFT 역시 소속 연예인 중 한 명을 통해 만들어진 프로젝트다. 단순한 소장가치를 넘어 팬덤 기반 혜택과 멤버십 기능 등 다양한 장점을 부여했다. 김세연 부회장은 초록뱀미디어의 콘텐츠는 크게 드라마와 연예인으로 나눌 수 있다 라며 드라마 속 일부 콘텐츠나 드라마 자체를 NFT화하거나 예능 연기자 가수 모델 등 소속 연예인들의 팬덤을 만족시킬 수 있는 NFT를 개발하는 방안을 고민하고 있다 고 말했다. ◇ 거대한 스토리 형성...SF·판타지 등 요소 투입 물론 단순히 NFT를 출시하는 데서 끝나는 것이 아니다. 향후 내놓을 NFT 프로젝트들은 서로 유기적인 관계로 CRB 오리지널 이라는 초록뱀의 메타버스 세계관 속에서 하나의 스토리를 형성한다. 김 부회장은 예를 들면 마블 세계관처럼 거대한 초록뱀 월드를 만들고자 하는 게 CRB 오리지널 이다 라면서 조만간 출시할 1호 NFT는 CRB 오리지널 로 진입하는 첫 단계가 될 것 이라고 설명했다. 하나의 NFT로 그치는 것이 아니라 지속적으로 CRB 오리지널 NFT 시리즈 를 내놓고 연속성과 연계성을 부여해 구매자들도 꾸준한 혜택을 누릴 수 있도록 한다는 방침이다. 김 부회장은 향후에는 초록뱀 세계관을 바탕으로 드라마 영화 뿐만 아니라 웹툰 웹소설 등 새로운 콘텐츠 제작도 가능할 것 이라며 SF나 판타지 등 흥미로운 장르의 스토리를 구성하는 방안을 마련 중 이라고 말했다. 초록뱀은 첫 번째 NFT 프로젝트를 완성시켜 당초 지난 달 공개할 예정이었으나 현재 글로벌 블록체인 시장의 상황을 고려해 출시 시점을 미루기로 했다. 김세연 부회장은 해당 NFT 연예인의 팬은 물론 구매자 혹은 투자자에 대한 보호와 안정성 제고를 위해 1호 NFT 출시 연기를 결정했다 며 작품의 가치를 오롯이 전달할 수 있는 머지않은 시점에 다시 정식 론칭을 알릴 것 이라고 전했다.\n", + "\n", + "### 답변: 총 70여편의 드라마를 제작한 국내 대표 드라마 제작사 초록뱀미디어가 4일 블루밍비트와의 인터뷰에서 CRB 오리지널의 첫 프로젝트인 1호 NFT 출시를 앞두고 디지털 콘텐츠 산업의 변화와 블록체인 및 메타버스 등 새로운 시장의 출현을 꼽으며 NFT 대체불가능토큰 사업에 도전장을 내밀었다.<|endoftext|>\n", + "73 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 발행액 14.5조원 상환액 9조원 작년말 퇴직연금 기저효과로 발행 감소 …금융감독원 제공 홍콩H지수 등 주요 주가지수가 하락해 파생결합증권 DLS·ELS 조기상환 규모가 감소함에 따라 올해 1분기 파생결합증권 발행잔액이 지난해 같은 기간보다 증가한 것으로 나타났다. 금융감독원이 1일 발표한 ‘2022년 1분기 중 증권회사 파생결합증권 발행·운용 현황’에 따르면 1분기 파생결합증권 발행잔액은 89조4000억원으로 전년 동기 대비 4조6000억원 증가했다. 1분기중 파생결합증권 발행액은 14조5000억원 상환액은 9조원으로 전년 동기 발행액 24조1000억원 과 상환액 29조3000억원 대비 모두 감소했다. 종류별로 보면 ELS 발행액은 12조원으로 전년 동기 대비 6조8000억원 36.0% 감소했다. 작년 말과 비교하면 13조원 51.8% 줄어든 수치다. 금감원은 “퇴직연금에 편입되는 원금보장형 ELS의 상환‧발행이 연말에 집중되면서 작년 말 발행액이 일시적으로 크게 증가한 영향”이라며 “지난해 홍콩H지수 약세와 1분기 글로벌 증시하락 등으로 투자수요가 감소하며 원금비보장형 ELS 발행액이 지속 감소했다”고 설명했다. ELS 상환액은 6조8000억원으로 지난해 1분기 대비 17조원 71.4% 감소했다. 이에 따라 3월말 ELS 발행잔액은 61조9000억원으로 전년 동기 대비 6조1000억원 11.0% 증가했다. 1분기 중 DLS 발행액은 2조5000억원으로 전년 동기 대비 2조8000억원 52.5% 감소했다. 퇴직연금에 편입되는 원금보장형 DLS의 상환‧발행이 연말에 집중되면서 작년말 발행액이 일시적으로 증가했으나 원금비보장형 DLS의 일괄신고서 금지방안과 대내외 금리 상승 등의 영향으로 전체 발행액이 감소한 것으로 나타났다. DLS 상환액은 2조2000억원으로 전년 동기 대비 3조3000억원 59.8% 감소했다. 3월말 DLS 발행잔액은 4000억원 증가한 27조5000억원으로 집계됐다. 1분기 ELS 투자수익률은 연 3.7% DLS 투자수익률은 연 1.5%로 전년 동기 대비 각각 0.8%p 1.1%p 높아졌다. 금감원은 금융시장 변동성 확대에 따른 투자자 손실위험을 모니터링하고 증권회사 리스크관리를 강화할 방침이다. 금감원 관계자는 “원금비보장형 ELS에서 변동성이 높은 종목형 상품이 증가하고 미국 금리 상승 경기침체 우려로 금융시장 변동성이 확대되는 상황”이라며 “투자자 손실위험에 대한 모니터링을 지속하고 증권회사의 헤지운용에 따른 예상손실을 상시 점검해 잠재적 리스크에 선제적으로 대응할 계획”이라고 밝혔다.\n", + "\n", + "### 답변: 1일감동원은 1분기 파생결합증권 발행잔액은 89조4000억원으로 전년 동기 대비 4조6000억원 증가, 주요 주가지수가 하락해 파생결합증권 DLS·ELS 조기상환 규모가 감소함에 따라 올해 1분기 파생결합증권 발행잔액이 지난해 같은 기간보다 증가한 것으로 나타나 금감원은 금융시장 변동성 확대에 따른 투자자 손실위험을 모니터링하고 증권회사 리스크관리를 강화할 방침이다.<|endoftext|>\n", + "74 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: DC IRP에 디폴트옵션 도입...적립금 자동 운용 운용지시 없다면 최대 6주 대기 후 디폴트옵션 운용 10월중 첫 승인상품...분기별로 수익률 공시 …고용노동부 제공 이달 12일부터 확정기여형 퇴직연금 DC 과 개인형퇴직연금 IRP 에 사전지정운용제도 디폴트옵션 가 도입된다. 고용노동부·금융위원회·금융감독원은 디폴트옵션 도입을 위한 근로자퇴직급여보장법 근퇴법 시행령이 국무회의에서 의결됐다고 5일 밝혔다. 앞서 정부는 지난해 12월 근퇴법 개정안이 국회에서 통과됨에 따라 시행규칙 퇴직연금감독규정을 개정했다. 사전지정운용제도 디폴트옵션 는 근로자가 본인의 퇴직연금 적립금을 운용할 금융상품을 결정하지 않을 경우 사전에 정해둔 운용방법으로 적립금이 자동 운용되도록 하는 제도를 말한다. 상품 유형은 예금 이율보증보험계약 GIC 등 원리금보장상품 100% 타깃데이트펀드 TDF 밸런스펀드 BF 스테이블밸류펀드 SVF 사회간접자본펀드 SOC 등 펀드상품 100% 원리금보장상품과 펀드상품을 혼합한 포트폴리오 상품 모두 가능하다. 퇴직연금사업자는 사용자와 근로자에게 제시할 디폴트옵션을 마련해 고용노동부 소속 심의위원회 심의를 거쳐 고용노동부장관의 승인을 받아야 한다. 심의위원회는 원리금보장상품의 금리 만기 예금자 보호 한도 상시가입 가능 여부 펀드 포트폴리오 상품의 수수료 수익률 손실 가능성 자산 배분의 적절성을 위주로 심사한다. …고용노동부 제공 최대 6 주 대기 후 디폴트옵션 운용 ... 언제든 변경 가능 근로자는 퇴직연금규약에 반영된 디폴트옵션 주요정보를 퇴직연금사업자로부터 제공받아 그중 하나의 상품을 본인의 디폴트옵션으로 선정한다. 기존 운용하던 상품의 만기가 도래한 후 운용지시 없이 4주 경과 시 ‘향후 2주 이내 운용지시가 없을 경우 적립금이 디폴트옵션으로 운용됨’을 통지받게 된다. 통지 이후에도 운용지시 없이 2주가 지나면 디폴트옵션으로 운용된다. 신규가입 후 운용지시가 없는 경우에는 4주 대기 없이 바로 통지를 받게 되며 통지 후 2주 이내에 운용지시 없을 경우 적립금이 디폴트옵션으로 운용된다. 디폴트옵션으로 적립금을 운용하고 있지 않은 근로자는 언제든지 디폴트옵션으로 본인의 적립금을 운용하는 것을 선택 OPT IN 할 수 있다. 또 디폴트옵션으로 운용 중에도 언제든지 원하는 다른 상품으로 운용지시가 가능 OPT OUT 하다. 적립금 100% 까지 운용 ...IRP 도 동일 퇴직연금 감독규정 개정에 따라 기존 위험자산 한도 70% 규제에도 불구하고 디폴트옵션은 적립금의 100%까지 운용할 수 있다. 확정기여형 퇴직연금 DC 에 도입되는 디폴트옵션에 관한 사항은 개인형퇴직연금 IRP 에도 동일하게 적용된다. 퇴직연금사업자가 승인받은 상품을 가입자에게 바로 제공하고 가입자는 그중 본인의 디폴트옵션을 선정하면 된다. 정부는 제도 시행 후 퇴직연금사업자로부터 신청을 받아 신속하게 승인 절차를 진행할 예정이며 10월 중에는 첫 번째 심의위원회를 거쳐 승인된 상품을 공시할 예정이다. 아울러 가입자의 선택권 보장과 사업자 간 경쟁 제고를 위해 디폴트옵션의 운용현황 수익률 등을 분기별로 고용노동부와 금융감독원 홈페이지에 공시한다. 또 3년에 1회 이상 정기평가해 승인 지속 여부를 심의해 모니터링 및 관리를 강화할 방침이다. 이정식 고용노동부장관은 “그간 퇴직연금제도는 낮은 수익률 문제로 근로자의 노후준비에 든든한 버팀목 역할을 하지 못했던 측면이 있었다”며 “지난 4월 도입된 중소기업퇴직연금기금제도와 적립금운용위원회 이달 도입되는 디폴트옵션을 빠르게 현장에 안착시키도록 적극 노력하겠다”고 밝혔다.\n", + "\n", + "### 답변: 이달 12일부터 확정기여형 퇴직연금 DC과 개인형퇴직연금 IRP에 사전지정운용제도 디폴트옵션이 도입되어 근로자가 본인의 퇴직연금 적립금을 운용할 금융상품을 결정하지 않을 경우 사전에 정해둔 운용방법으로 적립금이 자동 운용되도록 하며 특정 상품 유형은 예금 이율보증보험계약 GIC 등 원리금보장상품 100% 타깃데이트펀드 TDF 밸런스펀드 BF 스테이블밸류펀드 SVF 사회간접자본펀드 SOC 등 펀드상품 100% 원리금보장상품과 펀드상품을 혼합한 포트폴리오 상품 모두 가능하다.<|endoftext|>\n", + "75 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 핵심요약 23일 우리은행 이어 30일 신한은행서도 거액 외환 이상 거래 발생 금감원 현장 수시검사 나서며 타은행에도 점검 후 보고 지시 실수요 자금인지 위조나 가상자산 통한 차익 거래인지 여부에 주목 연합뉴스 우리은행에 이어 신한은행에서도 거액의 외환 이상 거래가 발견되면서 금융감독원이 타 시중 은행에 대해서도 외환 거래 운용 상황을 보고하도록 했다. 3일 금융권에 따르면 금감원은 지난 30일 신한은행 지점에서 발생한 거액의 외환 이상 거래에 대해 수시 검사에 나서며 나머지 은행들에 대해서도 외환 거래 이상 여부를 확인해 보고하도록 했다. 일부 은행은 금감원 지시 전인 우리은행 지점 사건 직후 자체 점검에 나서거나 금감원에 관련 사안을 문의한 것으로 전해졌다. 금감원은 이번 수시 검사를 통해 자금세탁 방지법과 외환 거래법 위반 여부를 집중 점검할 방침이다. 수입 대금 결제 명목으로 이뤄진 거래에 대한 실수요 자금 여부 서류 위조나 가상 자산과 연루된 차익 거래 여부 중국계 불법성 자본 등과의 연루 여부 자금세탁 목적 여부 등이다. 우리은행은 내부감사를 통해 서울의 한 지점에서 최근 1년 동안 8천억원에 달하는 비정상적인 외환거래가 이뤄진 사실을 알아내고 금감원에 보고했다. 금감원은 지난달 23일 이 지점에 대한 현장 검사를 시작했으며 신한은행으로부터도 이상 거래 현황을 보고 받고 지난달 30일 해당 지점에 대한 현장 검사에 착수했다. 이복현 금감원장은 최근 시중은행장들과의 간담회에서 횡령 등 금융 사고가 반복되는 점과 관련해 내부 통제 강화 를 촉구하면서 개선방안을 추진하겠다고 말했다. ※CBS노컷뉴스는 여러분의 제보로 함께 세상을 바꿉니다.\n", + "\n", + "### 답변: 3일은행에 이어 신한은행에서도 거액의 외환 이상 거래가 발견되면서 금융감독원이 타 시중 은행에 대해서도 외환 거래 운용 상황을 보고하도록 했는데, 3일 금융권에 따르면 금감원은 지난 30일 신한은행 지점에서 발생한 거액의 외환 이상 거래에 대해 수시 검사에 나서며 나머지 은행들에 대해서도 외환 거래 이상 여부를 확인해 보고하도록 했다고 전했으며, 일부 은행은 금감원 지시 전인 우리은행 지점 사건 직후 자체 점검에 나서거나 금감원에 관련 사안을 문의한 것으로 있다고 밝혔다.<|endoftext|>\n", + "76 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 뉴시스 김근수기자 비트코인이 경기 침체와 고금리에 대한 우려로 가상화폐 가격이 등락을 거듭한 1일 오후 서울 서초구 빗썸 고객센터 전광판에 암호화폐 시세가 나타나고 있다. 2022.07.01. ks newsis.com 사진 영상 제보받습니다 공감언론 뉴시스가 독자 여러분의 소중한 제보를 기다립니다. 뉴스 가치나 화제성이 있다고 판단되는 사진 또는 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠습니다.\n", + "\n", + "### 답변: 경기 침체와 고금리에 대한 우려로 가상화폐 가격이 등락을 거듭한 1일 오후 서울 서초구 빗썸 고객센터 전광판에 암호화폐 시세가 나타나고 있으며, 뉴시스 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 뉴스 가치나 화제성이 있다고 판단되는 사진이나 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다고 밝혔다.<|endoftext|>\n", + "77 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 모아데이타가 무상증자 발표 이후 상한가를 기록했다. 5일 오후 1시20분 현재 모아데이타는 전거래일대비 가격제한폭 29.70% 까지 오른 1만9650원을 나타내고 있다. 이날 모아데이타는 보통주 1주당 신주 5주를 배정하는 무상증자를 결정했다고 5일 공시했다. 신주 배정기준일은 오는 20일이며 신주의 상장예정일은 8월10일이다.\n", + "\n", + "### 답변: 모아데이타가 무상증자 발표 이후 상한가를 기록했다고 5일 날렸는데 5일 오후 1시20분 현재 모아데이타는 전거래일대비 가격제한폭 29.70% 까지 오른 1만9650원을 나타내고 있으며 이날 모아데이타는 보통주 1주당 신주 5주를 배정하는 무상증자를 결정했다고 5일 공시했다.<|endoftext|>\n", + "78 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 우리·신한 이상거래 후속조치 가상자산·불법자금세탁 조사 우리은행에 이어 신한은행에서도 거액의 외환 이상 거래가 발견되자 금융감독원이 모든 은행에 외환 거래 운용 상황을 점검하고 그 결과를 보고하도록 했다. 3일 금융권에 따르면 금감원은 지난달 23일 우리은행에 이어 30일 신한은행 지점에서 발생한 거액의 외환 이상 거래에 대해 수시 검사를 시작했으며 나머지 은행들에도 자체적으로 점검한 뒤 외환 거래 이상 여부를 보고하도록 했다. 일부 은행은 최근 우리은행 지점에서 문제가 발생하자 자체 점검에 착수하고 금감원에 관련 사안을 문의한 것으로 전해졌다. 금융당국 관계자는 우리은행 등에서 거액의 외환 이상 거래가 드러나는 등 문제가 있다고 판단돼 모든 은행에 공식적으로 자체 점검을 진행하도록 했다 고 말했다. 금감원은 우리은행 신한은행 지점의 거액의 외환 이상 거래와 관련한 수시 검사에서 자금세탁방지법과 외환거래법 위반 여부를 집중적으로 들여다보고 있다. 수입 대금 결제 명목으로 이뤄진 거래가 실수요 자금인지 서류를 위조하거나 가상자산과 연루돼 차익 거래를 했는지 중국계 불법성 자본 등과 연루됐는지 자금세탁 목적이 있는지 등을 살펴볼 계획이다. 금융당국 관계자는 거액의 송금 거래가 해당 업체의 무역 거래에 맞는 규모인지 의심을 가질 수 있어 여러 가능성을 보고 있다 고 전했다. 우리은행은 서울의 한 지점에서 최근 1년 동안 8000억원에 달하는 비정상적인 외환 거래가 이뤄진 사실을 내부 감사를 통해 포착해 금감원에 보고했다. 이에 금감원은 지난달 23일 이 지점에 대한 현장 검사에 착수했다. 이어 금감원은 신한은행으로부터 외환 이상 거래 현황을 보고받고 지난달 30일 해당 지점에 대한 현장 검사에 나섰다.\n", + "\n", + "### 답변: 3일 금융권에 따르면 금감원은 지난달 23일 우리은행에 이어 30일 신한은행 지점에서 발생한 거액의 외환 이상 거래에 대해 수시 검사를 시작했으며 나머지 은행들에도 자체적으로 점검한 뒤 외환 거래 이상 여부를 보고하도록 했다고 밝혔으며 일부 은행은 최근 우리은행 지점에서 문제가 발생하자 자체 점검에 착수하고 금감원에 관련 사안을 문의한 것으로 전해졌다.<|endoftext|>\n", + "79 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: KDDI 사고 원인 검증·재발방지책 마련할 계획 일본의 대형 이동통신사 KDDI가 통신사고 발생 약 86시간만에 서비스를 복구했다고 밝혔다. 5일 아사히뉴스네트워크 등 다수의 외신에 따르면 KDDI는 이날 오후 3시36분에 서비스 이용 상황과 네트워크 트래픽에 문제가 없음을 최종 확인했다. KDDI는 원인을 검증하고 최대한 빠른 시일 내에 재발 방지책을 마련한다는 계획이다. KDDI는 설비 고장으로 인해 VoLTE 교환기에 트래픽이 급증하며 통신망 과부하가 발생한 것을 사고 발생 원인으로 보고 있다. 2일 오전 1시35분 도쿄에 위치한 타마네트워크센터에서 모바일 코어망 라우터를 교환하던 중 KDDI는 음성 트래픽 경로가 변경되지 않고 VoLTE 통신에 문제가 생긴 것을 처음 확인했다. 타카하시 마코토 KDDI 사장 오른쪽 과 요시무라 카즈유키 KDDI 기술 총괄 본부장이 지난 3일 통신 장애에 대해 사과하고 있다. 사진 지디넷재팬 라우터 변경 작업 중 신규 라우터에 엑세스가 집중되며 VoLTE 교환기에 폭주가 발생했다. KDDI는 트래픽을 줄이기 위해 오전 3시부터 약 12시간 동안 액세스 요구를 제한하는 작업을 진행했지만 오후 3시 22분부터 가입자 데이터베이스 처리 부하가 발생했다. 오후 5시22분에는 가입자 데이터베이스에서 데이터 불일치가 발생하면서 장애 복구가 정상적으로 이뤄지지 않았다. 사고를 수습하는 과정에서도 18대의 VoLTE 교환기 중 6대에서 가입자 데이터베이스에 대한 신호를 과도하게 송출하고 있는 것을 발견했다. KDDI는 이번 통신장애가 지난 2월에 발생한 NTT도코모 사고와 비슷하다고 보고 있다. KDDI 측은 전날 진행된 기자회견에서 이번 사고는 단말기에 트래픽이 급증해 발생했다는 점에서 NTT도코모와 같은 현상이라고 볼 수 있다 고 설명했다. 복구가 늦어진 이유에 대해서는 복구 절차를 착실하게 준비하고 있었지만 처리에 문제가 있었다 며 지금부터 확실히 검증할 계획 이라고 말했다. KDDI는 이번 사고로 최소 3천915만 회선이 피해를 입은 것으로 추정하고 있다. 요시무라 본부장은 사용자 보상에 대해 원인 규명과 재발 방지를 우선적으로 고려하고 있으며 보상은 추후 별도로 안내할 예정 이라고 말했다.\n", + "\n", + "### 답변: 5일 아사히뉴스네트워크 등 다수의 외신에 따르면 일본의 대형 이동통신사 KDDI가 통신사고 발생 약 86시간만에 서비스를 복구했다고 밝혔는데, KDDI는 설비 고장으로 인해 VoLTE 교환기에 트래픽이 급증하며 통신망 과부하가 발생한 것을 사고 발생 원인으로 보고 있으며 KDDI는 원인을 검증하고 최대한 빠른 시일 내에 재발 방지책을 마련할 계획이다.<|endoftext|>\n", + "80 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 날짜미상의 사진에서 카타르 북부에서 운반선에 액화천연가스 LNG 가 실리고 있다.AP뉴시스 우크라이나의 전쟁으로 인한 천연가스의 가격 상승과 공급 우려로 향후 몇년 동안 천연가스에 대한 수요 증가가 둔화시킬 것으로 국제에너지기구 IEA 가 전망했다. 5일 현지시간 온라인 에너지전문매체 오일프라이스닷컴에 따르면 IEA는 이날 공개한 3·4분기 보고서에서 2021∼25년 사이 천연가스에 대한 세계 수요가 1400억㎥ 증가할 것으로 예측했다. 이는 코로나19 대유행으로 인한 경기침체를 포함한 직전 5년 간 2016∼20년 의 3700억㎥ 증가의 절반에도 못미치는 것이다. 이같은 수요 감소 전망은 우크라이나 전쟁으로 인한 천연가스의 높은 가격과 공급 불안 때문인 것으로 분석됐다. 또 구매자들이 천연가스에 대한 수요를 석탄이나 석유 또는 재생 가능한 에너지로 전환하기보다는 경제성장이 더 둔화될 것이라는 예측 때문이다. IEA는 러시아산 가스 구매를 줄이려는 유럽연합 EU 국가들의 노력으로 러시아에서 EU로의 천연가스 수출은 55∼75% 감소할 것으로 예상했다. 대신 EU는 아시아 같은 다른 지역으로부터 액화천연가스 LNG 구매를 늘릴 것으로 예상되는데 2025년 아시아로부터의 구매는 EU 수요의 절반을 차지할 것으로 예상됐다. 오일프라이스닷컴은 LNG 수출을 위한 시설 확충이 수요 증가세에 비해 느린 점도 수요를 둔화시키게 만들 것이라고 전했다. 이 매체는 지난 2010년대 중반 유가 폭락으로 취소된 에너지 인프라 프로젝트가 많고 지난 2020 21년 코로나19 봉쇄령으로 건설도 늦어지면서 시설 확충 속도가 느릴 것으로 전망했다.\n", + "\n", + "### 답변: 국제에너지기구 IEA가 우크라이나의 전쟁으로 인한 천연가스의 가격 상승과 공급 우려로 향후 몇년 동안 천연가스에 대한 수요 증가가 둔화시킬 것으로 예측한 가운데 5일 온라인 에너지전문매체 오일프라이스닷컴에 따르면 IEA는 이날 공개한 3·4분기 보고서에서 2021∼25년 사이 천연가스에 대한 세계 수요가 1400억m3 증가할 것으로, 이는 코로나19 대유행으로 인한 경기침체를 포함한 경기침체를 포함한 직전 5년 간 2016∼20년 의 3700억m3 증가의 절반에도 못미치는 것이다.<|endoftext|>\n", + "81 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 웨이브 독점 HBO 다큐멘터리 세기의 범죄 지난해 미국에서 약물 과다 복용으로 인한 사망자 수가 처음으로 10만명을 넘었다. 마약성 진통제 오피오이드 중독 문제 심각성이 커지자 도널드 트럼프 당시 미국 대통령이 이를 공중보건 비상사태로 규정했고 조 바이든 대통령 또한 불법 마약 거래 관련 국가 비상사태를 선포했다. HBO 다큐멘터리 세기의 범죄 는 이 같은 중독 사태 원인에 대해 집중 조명한다. 실제 제약산업에 종사했던 사람 의사 판매원 생생한 증언으로 사건 이면을 고발한다. 마약성 진통제 이른바 오피오이드는 양귀비의 꼬투리에서 채취한 아편을 원료로 한다. 양귀비에서 직접 추출한 천연 알칼로이드 천연 알칼로이드에서 유도한 반합성 알칼로이드 그리고 처음부터 화학 약품에서 합성한 성분 모두를 총칭한다. 마약성 진통제는 인간 고통을 덜어주기 위한 목적으로 등장했다. 진통제는 중추신경계 오피오이드 수용체에 작용해 통증 자극을 전달하는 신경전달물질 분비를 억제한다. 진통 효과로 주로 말기 암 환자나 수술 직후 환자 등에 한해 처방한다. 하지만 2000년대 이후 이 약은 미국에서 만병통치약으로 과용되기 시작한다. 오피오이드 사태 배후에는 미국의 제약회사 의사 정부의 철저한 계획이 있었다. 1952년 작은 제약회사 퍼듀 프레데릭 을 인수한 새클러 가문은 홍보와 사기를 넘나드는 영업 방식으로 안정제 시장을 선점했다. 이익 창출을 위해 기존에 판매하던 모르핀 계열 진통제보다 더욱 강력한 옥시코돈 에 주목했다. 그렇게 합성 마약제 옥시코돈 에 약물의 지속력을 높이는 코팅 기술이 더해져 마약성 진통제 옥시콘틴 이 탄생했다. 퍼듀 제약회사는 약물 부작용을 축소해 공표했다. 퍼듀로부터 뇌물을 약속 받은 식품의약국은 승인했다. 국가에서 인증한 이 약은 흡수를 지연시켜 오용 가능성을 줄인다 는 설명서 한 줄을 근거로 많은 판매원은 의사에게 마약을 권장했고 의사 역시 대중에 적극적으로 진통제를 처방했다. 약물 오남용 가능성을 알면서 저지른 행동이었다. 가장 큰 부작용은 중독이다. 환각 기억 상실 등 부작용과 투여 중지 시 금단 현상을 일으키며 모르는 사이 중독 과정을 겪게 된다. 환자들은 더 강한 효과를 위해 불법 마약 구매를 하기 시작했다. 멈출 수 없는 중독은 오피오이드 과다 복용으로 이어졌고 미국 질병통제예방센터 CDC 는 1999년부터 2019년까지 약 50만명 미국인이 이로 인해 숨졌다고 발표했다. 지방 정부는 관련 업체들을 상대로 소송을 제기하며 죽음에 대한 책임을 물었다. 제약사 존슨앤드존슨을 포함한 미국 3대 유통업체는 약 30조원이라는 합의금을 지불키로 했으며 퍼듀 파마 역시 지역 사회에 마약성 진통제를 유통한 유죄를 인정했다. 약물 중독과의 전쟁은 진행 중이다. 인간 통증을 인질로 탄생한 합법적 마약 이를 판매했던 장사꾼들의 민낯을 고발하는 HBO 다큐멘터리 세기의 범죄 는 온라인동영상서비스 OTT 웨이브에서 시청할 수 있다.\n", + "\n", + "### 답변: 지난해 미국에서 약물 과다 복용으로 인한 사망자 수가 처음으로 10만명을 넘기고, 미국에서 약물 과다 복용으로 인한 사망자 수가 처음으로 10만명을 넘어서면서 도널드 트럼프 당시 도널드 트럼프 당시 미국 대통령이 이를 공중보건 비상사태로 규정했고 조 바이든 대통령 또한 불법 마약 거래 관련 국가 비상사태를 선포한 가운데, HBO 다큐멘터리 세기의 범죄는 중독 사태 원인에 대해 집중 조명하고 제약산업에 종사했던 사람 의사 판매원 생생한 증언으로 사건 이면을 고발한다.<|endoftext|>\n", + "82 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 다음 블로그가 운영 17년 만에 서비스를 종료한다. 5일 정보기술 IT 업계에 따르면 카카오는 다음 블로그와 티스토리로 나뉘어 운영하던 블로그 플랫폼을 티스토리로 통합하기로 했다. 서비스 통합 예정일은 9월 30일이다. 기존 다음 블로그 이용자들은 콘텐츠를 티스토리로 이관해 활동을 이어나갈 수 있다. 카카오는 서비스 품질 향상을 위해서라고 통합 이유를 설명했다. 서비스 통합에 앞서 카카오는 지난 4일부터 다음 블로그 신규 개설을 중단됐다. 다음 블로그는 블로그 열풍이 불던 2005년 2월 서비스를 시작했다. 2007년 다음이 티스토리를 인수했으며 2020년 5월 전면 리뉴얼 이후 디자인·구조 측면에서 티스토리와 유사하다는 평가가 나왔다.\n", + "\n", + "### 답변: 5일 카카오는 다음 블로그와 티스토리로 나뉘어 운영하던 블로그 플랫폼을 티스토리로 통합하기로 했다고 밝혔으며 다음 블로그가 운영 17년 만에 서비스를 종료하고 기존 다음 블로그 이용자들은 콘텐츠를 티스토리로 이관해 활동을 이어나갈 수 있게 되었다.<|endoftext|>\n", + "83 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 게티이미지뱅크 인터넷전문은행이 대환대출 시장에 본격 진출하면서 카드·저축은행 등 제2금융권에 비상이 걸렸다. 제2금융권 대출을 이용하면서 상대적으로 신용이 우량한 고객 중심으로 이탈이 불가피해졌다. 향후 출혈경쟁으로 업권 자체 건전성까지 해칠 수 있다는 우려도 나온다. 3일 업계에 따르면 토스뱅크가 삼성카드를 시작으로 이달부터 복수 카드사 대상 카드론 장기카드대출 대환대출 서비스를 확대할 예정이어서 카드업계 우려가 커졌다. 카드사 고위 관계자는 “토스뱅크가 하겠다는 서비스가 사실상 카드론 고객 정보를 긁어다가 자사로 유입하겠다는 의도”라면서 “일부 고객에겐 금리인하 등 편익이 있을 수 있지만 산업 종사자로서 산업 생태계 자체가 위협을 받을 가능성이 짙어 우려스럽다”고 설명했다. 토스뱅크가 선보인 카드론 대환대출 서비스 는 이용자가 개인정보 열람에 동의하고 인증서 정보를 입력하면 기존 카드사에서 받은 카드론 금리 등을 안내하고 토스뱅크 대출로 갈아탈 수 있도록 해준다. 실제 1일 기준 토스뱅크 신용대출 금리는 연 4.18 15.00%로 6개 카드사 신한·KB국민·삼성·하나·우리·롯데카드 카드론 금리 5월 31일 기준 연 6.95 19.10%보다 낮다. 토스뱅크에 따르면 카드론 대환대출 서비스 이용자가 해당 서비스를 이용하면 평균금리가 연 6.83% 연이자상환액이 연평균 약 47만원 각각 감소하는 효과를 낸다고 설명했다. 카드업계는 우량 고객 이탈이 불가피하다고 우려한다. 최근 카드채 금리가 급등하면서 자금을 조달하기 어려워진데다 토스뱅크로 상대적으로 신용이 우량한 고객이 이탈하면 자체 대출 사업이 위축될 수 있다고 보고 있다. 이렇다 보니 토스뱅크의 서비스 구현 방식에 대해 볼멘소리도 나온다. 현재 토스뱅크는 카드론 정보를 수집하는 과정에서 웹사이트 콘텐츠를 수집·저장하는 웹 스크래핑 방식을 사용한다. 일각에서는 마이데이터 사업자인 토스와 토스뱅크가 같은 앱에서 서비스를 제공하는데도 토스뱅크가 사업자가 아니라는 이유로 스크래핑을 사용하는 것이 형평성에 어긋난다고 지적한다. 하지만 전체 신용정보를 스크래핑으로 통합 조회한 것이 아니기 때문에 규정을 어긴 것은 아니다. 저축은행도 인터넷은행의 대환대출 확대에 부정적인 견해를 내비쳤다. 현재 토스뱅크 카카오뱅크 등은 자사 플랫폼에서 기존 사용자가 받은 대출을 저축은행 등으로 대환해주는 서비스를 제공하고 있다. 인터넷은행보다 플랫폼 접근성이 현저히 낮은 저축은행 사정상 울며 겨자먹기로 수수료를 내면서 이들 대환대출 서비스에 탑승한 것이다. 다만 초기 예상과 달리 현재 저축은행들은 대환대출에 적극적이지 않다. 인터넷은행이 플랫폼에 들어온 우량 고객은 자사로 유입하고 상대적으로 신용이 취약한 고객만 저축은행으로 대환하고 있다는 주장이다. 한 저축은행 관계자는 “현장에서 인터넷은행의 대환대출 서비스 제공에 대한 우려가 크다”며 “신용이 우량한 고객은 인터넷은행으로 유입하고 상대적으로 신용이 취약한 고객만 저축은행으로 보내다 보니 이 부분에 대한 마케팅도 저절로 줄어드는 상황”이라고 토로했다.\n", + "\n", + "### 답변: 토전문은행이 대환대출 시장에 본격 진출하면서 상대적으로 신용이 우량한 고객 중심으로 이탈이 불가피해져 카드·저축은행 등 제2금융권에 비상이 걸렸으며 향후 출혈경쟁으로 업권 자체 건전성까지 해칠 수 있다는 우려도 나온다.<|endoftext|>\n", + "84 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: ‘시장형 일자리’ 식당 가보니 저렴한 식대 고령 손님 증가 일만 늘고 현상유지 어려워 “자생 위한 중장기 지원해야” 지난 23일 오후 서울 시내 한 반찬 전문점에서 시민들이 반찬을 구입하고 있다. 연합뉴스 “돼지고기 가격이 30%는 올랐어요. 제육볶음에 딸려 나가는 공깃밥값을 추가로 받아야 하나 고민됩니다.” 충북 청주에서 ‘노인일자리’ 식당을 운영하고 있는 담당자 김주현씨 가명 의 말이다. 김씨에게 ‘물가가 더 오를 것’이라는 정부 전망을 전하자 한숨을 크게 내쉬었다. 노인일자리 사업장이 고물가에 흔들리고 있다. 노인이 일하는 식당과 카페 반찬가게는 대표적인 시장형 노인일자리 사업장이다. 시장형 일자리는 정부가 민간 사업체에 인건비 일부를 지원해 만든 취업 자리다. 민간이 주도하는 수익 추구형 일자리사업으로 정부·지방자치단체가 직접 노인을 고용해 인건비를 지원하는 방식과 다르다. 다만 직접 일자리는 아니지만 노인일자리 창출을 위한 정부 지원 사업이기 때문에 공익 성격도 짙다. 노인일자리 사업장에서 판매하는 상품 가격은 비교적 낮은 수준이다. 지난 4일 찾은 청주의 ‘노인 보리밥집’도 정부가 지정한 착한가격업소다. 대표 메뉴인 시래기장 정식은 5500원으로 주변 식당 평균 백반 가격보다 저렴하다. 그나마도 코로나19를 거치면서 수년간 유지한 5000원에서 500원을 올린 가격이다. 코로나19 터널을 빠져나온 뒤 매출은 증가했는데 적자가 더 늘었다. 식자재 가격이 큰 폭으로 올랐기 때문이다. 음식을 팔면 팔수록 손해다. 5일 통계청이 발표한 6월 물가동향을 보면 돼지고기와 닭고기 가격은 1년 전보다 각각 18.6% 20.1% 올랐다. 같은 기간 배추는 35.5% 감자는 37.8% 상승했다. 김씨는 “코로나 때 300만원 적자였다면 올해는 장사가 나아졌으니까 적자가 200만원으로 줄어야 하는데 그게 안 된다”며 “일이 많아져서 어르신들만 더 고생한다”고 했다. 지역공동체를 기반으로 하는 식당 특성상 음식 가격을 올리기도 어렵다. 손님 대부분이 형편이 어려운 고령층이다. 저렴한 가격 때문에 이곳을 찾는 노인도 많다. 김씨는 “지금보다 식자재 가격이 더 오르면 현상 유지도 어려워질 수 있다”며 “뾰족한 방법이 없는 상황”이라고 말했다. 노인일자리 카페도 같은 처지다. 노인 10명이 돌아가며 일하는 청주 A카페도 고물가에 운영난을 겪고 있다. 노인들이 시간당 최저임금을 받으며 일해도 카페 운영이 쉽지 않다. A카페의 수박주스 가격은 4000원으로 다른 프랜차이즈 카페보다 20% 가까이 싸다. 수박 가격 6월 기준 은 1년 전보다 22.2% 올랐다. 카페 관계자는 “일하는 노인분들의 급여를 정산하면 남는 게 거의 없다”고 했다. 김문정 한국노인인력개발원 연구조사센터 부연구위원은 “시장형 노인일자리는 지역사회에 공헌하는 바가 크고 공익성이 있는 일자리”라며 “일자리사업이 중단되지 않고 중장기적으로 자생할 수 있도록 지원할 필요가 있다”고 말했다.\n", + "\n", + "### 답변: 5일 통계청이 발표한 6월 물가동향에 따르면 돼지고기와 닭고기 가격은 1년 전보다 각각 18.6% 20.1% 올랐고 노인일자리 사업장에서 판매하는 상품 가격은 비교적 낮은 수준으로 노인일자리 사업장이 고물가에 흔들리고 있다.<|endoftext|>\n", + "85 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 톰 레이턴 아카마이 대표 해킹 규모 커지고 횟수도 늘어 컴퓨팅 등 全분야 솔루션 제공 24시간 탐지로 피해 예방 가능 클라우드 이용땐 특히 더 필요 우크라이나·러시아 전쟁으로 새로운 종류의 해킹 위협이 많이 늘어날 줄 알았는데 그보다는 전통적인 해킹 악성코드·디도스 이 급증했습니다. 특히 랜섬웨어 피해가 올해 극심합니다. 톰 레이턴 아카마이 최고경영자 CEO·사진 가 최근 매일경제와 인터뷰에서 이 같은 사이버 동향을 전했다. 레이턴 CEO는 지난달 15 16일 한국에 머물며 국내 유수 대기업 관계자와 미팅을 했다. 콘텐츠 전송 네트워크 CDN 분야 글로벌 1위 기업인 아카마이는 보안 솔루션과 클라우드라는 신산업 을 개척하며 New 아카마이 로 탈바꿈하고 있는 기업이다. 지난해 한 해에만 약 34억달러의 매출을 기록했는데 보안 분야 매출액만 13억달러에 이른다. 레이턴 CEO는 컴퓨팅·콘텐츠 전송까지 아우르며 전 세계에 걸쳐 보안 솔루션을 제공할 수 있다는 게 아카마이 보안의 장점 이라고 강조했다. 그는 상시화되고 규모가 커진 해킹 위협에 대응해 사이버 복원력 resiliency 을 가져야 한다고 조언했다. 레이턴 CEO는 해킹 공격은 언젠가는 들어오는데 이를 미리 감지하고 확산이 되지 않게끔 하는 게 사이버 복원력의 핵심 이라며 아카마이는 마이크로세그멘테이션 부문 Microsegmentation 보안에서 강점을 가지고 있다 고 설명했다. 마이크로세그멘테이션이란 기관 내부 시스템에 내재된 악성코드를 미리 감지하고 통신 네트워크를 통해 해당 악성코드가 확산되는 것을 방지하는 솔루션을 말한다. 워낙 촘촘하게 기기와 네트워크가 연결되다 보니 해킹에 노출되는 취약점도 덩달아 많아지게 되는데 마이크로세그멘테이션 보안이 도입되면 24시간 실시간으로 이를 탐지하고 큰 피해를 예방할 수 있다. 아카마이는 지난해 보안업체 가디코어를 인수하고 마이크로세그멘테이션 역량을 확장한 바 있다. 레이턴 CEO는 향후 가장 성장할 분야로 클라우드 보안 을 꼽았다. 자체 서버를 구축하는 것이 아니라 사용한 만큼 구독료를 내며 언제 어디서든 접속이 가능한 클라우드를 도입하는 기업이 점차 늘면서 이에 대한 보안 위협도 증가하고 있다. 레이턴 CEO는 이를 두고 복수 층위에서 보안에 신경을 써야 한다 고 조언했다. 클라우드와 연결되는 주변 기기 휴대폰 PC 등 클라우드에 접근 권한이 있는 임직원 기업 내 여러 서비스와 이와 연관된 통신 단계 애플리케이션 레이어 등이 모두 해커의 타깃이 될 수 있다. 각 단계에 따른 해킹 수법도 모두 다르다. 디도스 공격처럼 한 번에 트래픽을 많이 보내서 시스템을 무력화시키는 해킹이 활용되는 경우도 있지만 애플리케이션 레이어를 해킹할 때는 트래픽을 많이 발생시키지 않고 몰래 악성코드를 심어넣는 해킹 방식이 선호된다. 해킹의 목적도 단순히 시스템을 무력화시키는 것부터 데이터 유출 금품 갈취 등 다양하다. 레이턴 CEO는 이 모든 복수의 층위를 모두 신경 쓰면서 해킹으로 인한 피해를 막고 복원력을 기르는 것이 클라우드 보안의 핵심 이라고 강조했다. 레이턴 CEO는 지난 1분기 매출액을 살펴보면 보안과 컴퓨터 분야 매출이 이미 CDN 매출을 앞질렀다 며 보안 분야 매출이 급성장하고 있어서 앞으로 가장 큰 회사의 수익원이 될 것 이라고 밝혔다.\n", + "\n", + "### 답변: CC 톰 레이턴 아카마이 최고경영자 CEO·사진이 최근 매일경제와 인터뷰에서 전통적인 해킹 악성코드·디도스가 급증하고 있는 사이버 동향을 전하며 컴퓨팅·콘텐츠 전송까지 아우르며 전 세계에 걸쳐 보안 솔루션을 제공할 수 있다는 게 아카마이 보안의 장점 이라고 강조했다.<|endoftext|>\n", + "86 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 고승범 금융위원장 연합뉴스 자료사진 서울 연합뉴스 오주현 기자 고승범 금융위원장이 5일 퇴임하는 가운데 후임 김주현 금융위원장 후보자가 곧 임명 수순을 밟을지 관심이 쏠린다. 금융권에 따르면 고 위원장은 이날 오전 정부서울청사 별관에서 이임식을 연다. 지난해 8월 취임한 고 위원장은 재임 기간이 짧았지만 가계부채 급증 문제를 안정시켰다는 평가를 받는다. 금융사들에 가계부채 총량을 전년보다 5% 수준 이상 늘리지 않도록 주문하는 등 강력한 가계부채 총량 규제를 시행하고 총부채원리금상환비율 DSR 규제를 더욱 강화해 가계부채 저승사자 라는 별명을 얻기도 했다. 그는 소상공인 등 취약층에 대한 금융 지원 무질서한 가상자산 가상화폐 시장의 제도화 등에도 적극적인 역할을 했다는 평가를 받는다. 고 위원장은 이임사에서 그간의 소회를 밝히고 후배들에게 금융시장 안정이 훼손되지 않도록 가계부채 관리 등의 소임을 다 해줄 것을 당부할 예정이다. 고 위원장은 새 정부가 출범한 이후인 지난 5월 사의를 표명했으나 원 구성을 두고 여야가 대치하는 상황이 이어지며 사의를 표명한 지 약 두 달 만에 이임식을 하게 됐다. 윤석열 대통령은 전날 국회에 김주현 금융위원장 후보자에 대한 인사 청문보고서 송부를 재요청했다. 송부 기한인 오는 8일까지 인사청문회가 열리지 않으면 대통령 직권으로 임명할 수 있다. 전날 여야 합의로 국회의장단이 구성되면서 국회가 정상화 수순에 접어든 만큼 이르면 이번 주 중 청문회 일정이 확정될 가능성도 있다. 금융당국 관계자는 원 구성이 이번 주 내로 되지 않는다면 최근 교육부총리가 임명되는 등 선례를 볼 때 다음 주 초께 후임 금융위원장이 임명될 가능성이 있을 것으로 예상한다 고 말했다. 고 위원장이 퇴임하면서 금융위는 당분간 김소영 금융위 부위원장 대행 체제로 운영될 예정이다. 질문에 답변하는 김주현 금융위원장 후보자 서울 연합뉴스 김인철 기자 금융위원장 후보자로 지명된 김주현 여신금융협회 회장이 7일 오후 서울 중구 여신금융협회에서 열린 소감 발표 및 출입기자 간담회에서 취재진 질문에 답하고 있다.\n", + "\n", + "### 답변: 5일해 퇴임하는 고승범 금융위원장이 후임 김주현 금융위원장 후보자가 곧 임명 수순을 밟을지 관심이 쏠리는 가운데 금융권에 따르면 고 위원장은 그간의 소회를 밝히고 후배들에게 금융시장 안정이 훼손되지 않도록 가계부채 관리 등의 소임을 다 해줄 것을 당부할 예정이며 금융위는 당분간 김소영 금융위 부위원장 대행 체제로 운영될 예정이다.<|endoftext|>\n", + "87 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: NBA 2K23 에 등장하는 마이클 조던 모습 2K 제공 미국프로농구 NBA 역대 최고 스타인 마이클 조던이 NBA 2K 커버를 다시 장식했다. NBA 2K11 과 NBA 2K12 NBA 2K16 에 이은 네 번째 행보다. 미국 게임업체 2K는 등번호 23번으로 기억되는 마이클 조던이 NBA 2K23 스페셜 에디션인 마이클 조던 에디션과 챔피언십 에디션 커버에 등장한다고 6일 밝혔다. 마이클 조던은 선수 시절 NBA를 세계적인 현상으로 만들고 농구계에 막대한 영향을 끼친 인물이다. NBA 올스타 14회 기아 NBA MVP 5회 NBA 월드 챔피언 6회 기록을 세우며 네이스미스 농구 명예의 전당에 오르기도 했다. 2K는 올해 NBA 2K 24주년을 맞아 진행하는 캠페인 테마 위대함에 응하라 에 걸맞은 인물로 조던을 꼽았다. 엘피 브로디 NBA 2K 글로벌 마케팅 전략 부사장은 23을 스포츠에서 가장 눈에 띄는 숫자로 만든 역사를 생각하면 NBA 2K23에 마이클 조던 에디션을 선보이는 것은 더할 나위 없는 선택 이라고 했다. 2K는 조던의 빛나는 경력 중 15가지 상징적인 순간을 재현할 수 있는 조던 챌린지를 NBA 2K23 에 다시 도입했다. 이를 위해 NBA 2K11 오리지널 챌린지 10개를 모두 처음부터 다시 만들었다. 2K 측은 10년 이상 기술적 도약이 반영된 새로운 게임 플레이로 조던의 업적을 경험할 수 있다 고 했다. 발로 뛰는 더팩트는 24시간 여러분의 제보를 기다립니다.\n", + "\n", + "### 답변: 미국프로농구 NBA 역대 최고 스타인 마이클 조던이 NBA 2K 커버를 다시 장식했는데 선수 시절 NBA를 세계적인 현상으로 만들고 농구계에 막대한 영향을 끼친 인물로 올해 NBA 2K 24주년을 맞아 진행하는 캠페인 테마 위대함에 응하라에 걸맞은 인물로 조던을 꼽았다<|endoftext|>\n", + "88 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 당국 3세대백신 5천명분 계약 중…지자체서 원숭이두창 검사 시행 준비 치료제 물량 초기 대응에 충분…전국민 백신 접종 필요성 없어 국내 첫환자 상태 호전·양호…김남중 교수 사람두창보다 경미 사망률 과장돼 원숭이두창 감염병 주의 인천공항 안내 모니터 연합뉴스 자료사진 서울 연합뉴스 최인영 조민정 기자 원숭이두창 치료제인 테코비리마트 504명분이 오는 9일 국내에 도입될 예정이다. 또 원숭이두창 예방 효과가 있는 3세대 두창 백신 진네오스 5천명분 1만도즈 을 국내 공급하기 위한 계약도 진행 중이다. 중앙방역대책본부는 5일 원숭이두창 대응을 위해 치료제와 백신 도입을 추진하고 있다며 이같이 밝혔다. 당국은 치료제가 국내 도입되면 전국 17개 시도 지정 병원에 공급해 활용할 예정이다. 임숙영 방대본 상황총괄단장은 도입되는 치료제 물량은 초기 대응에 충분한 수준 이라며 향후 발생 양상을 고려하면서 필요하면 추가로 도입하겠다 고 말했다. 원숭이두창은 증상이 경미한 경우가 많아 원숭이두창 전용 치료제를 사용하지 않고도 증상이 호전되는 경우가 많다고 임 단장은 설명했다. 그러면서 국내 1호 원숭이두창 확진자도 전용 치료제 없이 상태가 많이 호전돼 현재 건강 상태가 양호하다고 밝혔다. 1명당 4주 간격으로 2회 접종하는 3세대 백신 진네오스는 현재 해외 제조사 바바리안 노르딕 와 공급 계약을 진행하고 있으며 계약이 완료되면 구체적인 도입 시기 등을 발표할 예정이다. 앞서 질병청은 진네오스 긴급도입을 요청했고 이에 식품의약품안전처는 국가필수의약품 안정공급협의회 심의를 거쳐 지난 1일 국내 긴급도입을 인정했다. 현재는 정부가 비축한 2세대 두창 백신을 활용해 원숭이두창 예방접종을 하고 있다. 임 단장은 원숭이두창의 전파방식과 전파력을 고려했을 때 백신을 일반 국민을 대상으로 광범위하게 접종할 필요성은 없다고 본다고 설명했다. 그러나 밀접접촉자는 14일 이내 접종해야 효과를 볼 수 있기 때문에 밀접접촉자 중심으로 한 포위접종 방식으로 접종을 진행할 예정이라고 밝혔다. 원숭이두창 관련 검역 강화된 공항 공동취재 원숭이두창은 전날 기준으로 59개국에서 6천157명이 확진된 것으로 확인된다. 국내 확진자는 1명이다. 질병청은 원숭이두창 24시간 종합상황실과 즉각대응팀을 설치하는 등 대응체계를 구축했다. 전국 시도에도 지역 방역대책반을 설치하고 지난달 27일과 이달 4일 시도 보건과장 회의를 개최해 중앙 지역 협조 체계를 다졌다. 질병청은 지난달 28일 지역사회 의심 환자 발생에 대비한 대응체계 점검 도상 훈련을 진행하고 지난달 28∼29일에는 의료진 대상 교육을 시행해 추가 원숭이두창 확진자 발생에 대비했다. 또 지자체 17개 보건환경연구원 검사 확대 계획을 수립해 숙련도 평가를 완료했다. 향후 진단검사시약을 배포해 지자체에서도 원숭이두창 검사를 할 수 있도록 준비하고 있다. 또 DUR 의약품안전사용서비스 과 ITS 해외여행력정보제공시스템 를 연계해 원숭이두창 발생 빈발 국가 5개국의 해외 여행력을 의료기관에 제공하도록 했다. 질병청은 이날 브리핑에 대한감염학회 이사장인 김남중 서울대병원 감염내과 교수를 초청해 원숭이두창에 대한 질의응답 시간을 가졌다. 김 교수는 원숭이두창이 코로나19와 같은 대유행을 일으킬 가능성을 묻는 말에 새로운 환자가 유입될 가능성은 충분히 있지만 밀접접촉에 의한 전파이기 때문에 코로나19 유행처럼 대유행을 일으킬 가능성은 아예 없다고 생각한다 고 답했다. 또 원숭이두창의 치명률이 3∼8%로 알려진 것과 관련 비풍토지역에서 5천명 이상의 환자가 발생했지만 사망자가 없다 며 면역이 저하된 분들이 걸릴 경우가 있을 수 있어 사망자가 앞으로도 0 일 것이라고 장담할 수는 없지만 사망률이 3%에 이른다고 하는 것은 과장됐다 고 강조했다. 그러면서 원숭이두창은 두창 사람두창 에 비해서도 경미한 질병으로 회복 후 반흔 흉 을 남기는 두창과 달리 원숭이두창은 회복 후 시간이 지나면서 반흔도 대부분 없어지는 것으로 알려져있다 고 설명했다. 질병청은 원숭이두창 발생 국가를 방문·여행하는 국민들에게는 현지에서 유증상자나 야생동물과 접촉을 피하고 마스크 착용 손 씻기 등 개인 위생수칙을 준수하는 것이 중요하다고 당부했다. 또 귀국 후 3주 이내 발열 오한 수포성 발진 등 의심 증상이 나타나면 동거인을 포함한 주위 사람들과 접촉하지 않도록 주의해야 하며 주소지 관할 보건소로 신속히 신고해야 한다고 강조했다.\n", + "\n", + "### 답변: 중앙방역대책본부는 증상이 경미한 경우가 많아 원숭이두창 전용 치료제를 사용하지 않고도 증상이 호전되는 경우가 많기 때문에 원숭이두창 치료제인 테코비리마트 504명분을 오는 9일 국내에 도입할 예정이며 향후 발생 양상을 고려하면서 필요하면 추가로 도입하겠다고 말했다.<|endoftext|>\n", + "89 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 게임업계 소통 간담회… 중국 판호 발급 확대 노력·주 52시간 근로 합리적 운영 문화체육관광부 장관 게임업계 소통 간담회 서울 연합뉴스 김주환 기자 1일 서울 강남구 한국게임산업협회에서 열린 게임업계 소통 간담회에 참석한 박보균 문화체육관광부 장관과 게임계 관계자들이 기념 촬영을 하고 있다. 2022.7.1 jujuk yna.co.kr 서울 연합뉴스 김주환 기자 박보균 문화체육관광부 문체부 장관이 취임 이후 처음으로 게임 업계 관계자들을 만난 자리에서 게임은 질병이 아니다 라며 업계의 규제를 풀겠다고 약속했다. 박 장관은 1일 서울 강남구 한국게임산업협회에서 열린 간담회 모두발언에서 게임은 늘 편견과 오해에 시달려왔다. 게임 과몰입을 질병으로 몰아가는 시선이 엄존한다 며 이런 뜻을 밝혔다. 이날 간담회에는 강신철 한국게임산업협회장 황성익 한국모바일게임협회장 정석희 한국게임개발자협회장 윤상규 한국VR·AR콘텐츠진흥협회장 게임산업협회 부회장사를 맡은 12개 게임 업체 대표 및 임원급 등이 참석했다. 박 장관은 K 콘텐츠라면 방탄소년단 BTS 이나 오징어 게임 등을 떠올리는데 글로벌 장악력을 따지면 단연 게임이 맨 앞에 있다 고 말했다. 그러면서 세계 게임시장 경쟁에서 필요한 인재를 키우고 기획·제작·유통 전 과정을 문체부에서 지원하겠다. 규제를 선도적으로 혁신하고 풀겠다 고 약속했다. 또 업계에서 요구하는 중국의 판호 발급 확대를 위해 외교부 경제 부처와 협력해 특별한 노력을 기울이겠다 며 주 52시간제의 합리적인 운영을 위해 지혜롭게 대처하겠다 고도 덧붙였다. 1시간가량 열린 이날 간담회는 참가자들이 돌아가며 한국 게임산업 현안과 산업 경쟁력 회복 방안 등을 이야기하는 방식으로 진행됐다. 간담회에서는 현재 게임 업계의 화두인 P2E Play to Earn·플레이로 돈 벌기 게임에 대한 규제를 완화해 달라는 건의가 나온 것으로 전해졌다. 박 장관은 이에 신기술과 사행성이라는 양면성이 있어 종합적 접근이 필요하다 는 원론적 답변을 내놓았다. 또 근무 시간 확대 요구에 대해서는 유연근무제 확장은 필요하나 판교의 등대 크런치 모드 에 대한 우려의 목소리도 있다 며 게임 업계가 선제적으로 대처해 달라고 주문했다. 이날 토론회에서는 현안과 관련한 구체적인 논의는 오가지 않은 것으로 전해졌다. 한 참석자는 토론회가 끝나고 대형 게임사만 참가해 상대적으로 약자인 중소 게임사들의 이야기가 전혀 나오지 않았다 며 아쉬움을 드러내기도 했다.\n", + "\n", + "### 답변: 박 장관은 1일 서울 강남구 한국게임산업협회에서 열린 간담회 모두발언에서 게임은 늘 편견과 오해에 시달려왔다며, 게임은 게임 과몰입을 질병으로 몰아가는 시선이 엄존하다며, 업계의 규제를 풀겠다고 약속했다.<|endoftext|>\n", + "90 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 파르나스 호텔 제주 숙박권 애플워치에어팟 세트 다이슨 에어랩 등 경품 이벤트도 진행 유통사 자체 페이 GS Pay의 론칭 1주년을 맞아 대고객 감사 이벤트가 열린다. GS리테일은 지난해 론칭한 GS Pay의 1주년을 기념하여 7월 한 달간 운영 중인 모든 채널에서 상상 이상의 간편결제 GS Pay 백만초월 페스티벌 행사를 진행한다. GS25는 GS Pay 사용 시 결제 건 당 GS POINT 100포인트 페이백 행사 최대 5천 원 한도 와 시원한 여름을 날 수 있도록 파우치 음료 1 1 행사를 진행한다. GS더프레시는 물가 안정을 위해 주차 별 생필품 위주의 계절과일 초복 상품 공산품 등에 대해 GS Pay 추가 할인 행사를 진행한다. GS샵은 Weekly GS Pay Day 를 통해 매주 1회 GS Pay 결제에 대한 카드 할인을 적용하며 GS프레시몰은 일주일 간 GS Pay로 7만 원 이상 결제 시 1만 점의 더팝 리워즈를 캐시백 하는 행사를 진행한다. 또한 GS리테일은 경품 이벤트도 선보인다. GS리테일 자회사인 파르나스에서 신규 오픈하는 파르나스 호텔 제주 숙박권 디럭스 2박 을 비롯해 애플워치 에어팟 프로 세트 다이슨 에어랩 스타일러 컴플리트 다이슨 슈퍼소닉 헤어드라이어 케니샤프 콜라보 굿즈 패키지 더팝 리워즈 5 000점 등 다양한 경품을 준비했다. 고객들은 GS리테일의 모든 채널에서 GS Pay를 한번 이상 사용한 후 더팝앱 이벤트 페이지를 통해 응모할 수 있다. GS Pay는 GS리테일이 KB국민은행 및 KG이니시스와 손잡고 선보인 간편 결제 시스템이다. 고객은 GS Pay에 신용카드나 결제 연동 계좌를 1회만 등록하면 GS리테일의 모든 채널에서 원클릭 결제만으로 편리한 쇼핑을 할 수 있다. 10만 원 이하 결제 시 비밀번호 입력 없이 원클릭만으로도 결제할 수 있는 서비스와 KB국민은행의 FDS Fraud Detection System이상금융거래탐지시스템 가 적용돼 업계 최고 수준의 편의성과 안전성도 갖췄다. 또한 계좌 연동 후 상시 2% 적립 행사상품 최대 20% 할인 매월 파격 행사 등 고객을 위한 혜택도 다양하다. GS리테일은 편의성 안전성 차별화 고객 혜택 등 GS Pay가 가지고 있는 다양한 강점들과 GS리테일의 온오프 전 채널에서 함께 사용 가능한 통합적 록인 Lock in 효과가 고객들이 GS Pay를 가입해 이용하고 있는 원인으로 분석하고 있다. 앞으로 GS리테일은 자회사 주요 계열사 제3자까지 GS Pay의 제휴 영역을 확대하고 결제 데이터 분석을 통한 고객 맞춤형 쇼핑 정보 제공 및 파격 할인 프로모션 등을 지속 선보여 GS Pay 사용 고객을 더욱 확대하고 더 많은 혜택을 제공할 방침이다. 조광현 GS리테일 전략마케팅팀 팀장은 GS리테일의 통합 및 GS Pay의 1주년을 기념하여 이용해주시는 모든 고객분들께 감사의 의미를 담아 혜택 가득한 GS Pay 백만초월 페스티벌 행사를 준비하게 됐다 라며 앞으로도 제휴 영역 확대 고객 맞춤형 쇼핑 정보 제공 할인 프로모션 등 GS Pay의 차별화 서비스를 강화해 고객에게 더 큰 만족을 드릴 수 있도록 최선의 노력을 다할 것 이라고 말했다.\n", + "\n", + "### 답변: G은행은 GS Pay의 1주년을 맞아 7월 한 달간 모든 채널에서 상상 이상의 간편결제 GS Pay 백만초월 페스티벌 행사를 열고 파르나스 호텔 제주 숙박권 디럭스 2박 등 애플워치 에어팟 프로 세트 다이슨 에어랩 프로 세트 다이슨 에어랩 스타일러 컴플리트 다이슨 슈퍼소닉 헤어드라이어 케니샤프 콜라보 굿즈 패키지 5 000점 등 경품 이벤트도 준비했다.<|endoftext|>\n", + "91 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 배재현 CIO 완전 매각은 루머 서울경제 카카오가 카카오모빌리티 지분 10%대를 매각해 2대 주주로 남는 방안을 검토한다. 매각안이 성사될 경우 MBK파트너스가 1대 주주로 올라서게 된다. 6일 정보기술 IT 업계에 따르면 배재현 카카오 최고투자책임자 CIO 는 이날 사내 공지를 통해 “카카오모빌리티 지분의 상당수를 매각하는 방안은 검토한 적 없다”며 “현재 검토 중인 방안은 지분 10%대를 매각해 2대 주주로 내려오는 지분변경 구조”라고 밝혔다. 당초 카카오는 40%대의 보유 지분을 MBK파트너스에 매각하는 방안을 검토하고 있는 것으로 알려졌으나 이같은 소문을 정면 반박한 것이다. MBK파트너스가 TPG·칼라일 등 재무적투자자 FI 보유 지분과 카카오 보유 지분을 모두 매입해 1대 주주로 올라설 것으로 전망된다. 지난 연말 기준으로 카카오모빌리티 지분은 △카카오 57.55% △TPG 29.04% △칼라일 그룹 6.21% 등 순이다. 카카오가 MBK에 최대 19% 지분을 매각해도 기존 지분 구조대로라면 1대 주주가 된다. 카카오는 자사가 최대주주에서 물러나야 카카오모빌리티의 기존 사업확장 기조를 이어갈 수 있다고 본다. 글로벌 경쟁에서 살아남으려면 본격적인 성장 드라이브가 필요한데 공익적 성격이 강한 카카오 공동체 안에선 이를 실현하기 어렵다는 판단이다. 다만 카카오 관계자는 “매각안이 확정된 것은 아니 라고 전했다. 한편 이날 카카오 노조 크루유니언 은 카카오 경영진과의 면담 결과를 공개하며 전 계열사 임직원을 대상으로 모빌리티 매각 반대 서명운동을 재개하겠다고 선언했다. 카카오 노조는 카카오가 모빌리티 사업을 이어나갈 의지가 없다 며 사회적 책임을 파기한 것 이라고 주장했다.\n", + "\n", + "### 답변: 6카카오는 40%대의 보유 지분을 MBK파트너스에 매각하는 방안을 검토하고 있으나 MBK파트너스가 TPG·칼라일 등 재무적투자자 FI 보유 지분과 카카오 보유 지분을 모두 매입해 1대 주주로 올라설 것으로 전망되며 현재 검토 중인 방안은 지분 10%대를 매각해 2대 주주로 내려오는 지분변경 구조라고 밝혔다.<|endoftext|>\n", + "92 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 네덜란드 ASML 본사 사옥. 로이터 연합뉴스 미국이 중국의 반도체 산업에 대한 제재의 수위를 높이고 있다. 그간의 고강도 제재에도 불구하고 중국의 반도체 굴기 가 오히려 더 속도를 내자 추가 압박을 가하는 것으로 분석된다. 5일 현지시간 블룸버그통신에 따르면 미국은 네덜란드의 대표적 반도체 장비 업체인 ASML에게 EUV 극자외선 노광장비에 이어 구형 장비인 DUV 심자외선 노광장비에 대해서도 중국 판매 금지를 요청했다. 블룸버그는 돈 그레이브스 미국 상무부 부장관이 5월 말부터 지난달 초까지 네덜란드와 벨기에를 방문했을 당시 공급망 이슈를 논의하며 중국 수출 문제를 언급했고 ASML 본사도 방문해 피터 베닝크 ASML CEO 최고경영자 를 만나 이와 같은 내용을 요청했다고 소식통들을 인용해 보도했다. 네덜란드 정부는 미국의 압박으로 ASML이 세계에서 유일하게 생산하는 EUV 장비의 중국 수출 승인을 내주지 않고 있는데 이 조치를 DUV까지 확대하기를 요구한 것이다. ASML은 반도체 웨이퍼 위에 회로 선폭을 새기는 노광 과정에 필요한 장비를 주로 생산한다. 이 중 EUV는 극자외선 파장의 빛을 이용하는 것으로 파장이 짧아 미세한 회로 구현에 용이하다. EUV 장비는 차세대 반도체 공정에 반드시 필요한 장비지만 현재까지는 5나노 이하 초미세공정이 필요한 시스템반도체 생산이나 10나노 초반대의 차세대 D램 등에서만 주로 쓰인다. 20나노 이상의 숙성 공정에서는 여전히 불화아르곤 ArF 을 사용하는 DUV 노광장비가 가장 일반적으로 사용된다. 미국은 일본 니콘에도 DUV 장비를 중국에 판매하지 못하게 금지해줄 것을 요청하고 있는 것으로 알려졌다. 이는 중국이 10나노 이상급 파운드리에서 괄목할 성장을 이어가고 있어서인 것으로 풀이된다. 대만 시장조사업체 트렌드포스에 따르면 중국 파운드리 반도체 위탁생산 를 대표하는 SMIC 화훙 넥스칩의 시장점유율 합계는 올해 1분기 처음으로 10%를 넘어섰다. 이들 3개사의 매출 합계는 33억2900만 달러에 이른다. 최근 국제반도체장비재료협회 SEMI 에 따르면 해외 반도체 생산장비 업체에 대한 중국의 장비 주문은 지난해에만 전년 대비 58% 증가하며 2년 연속 글로벌 1위를 기록했다. 블룸버그는 이 같은 중국의 반도체 자급화 움직임에 미국의 제재가 오히려 중국 반도체의 약진을 도왔다 고 언급하기도 했다.\n", + "\n", + "### 답변: 5일 그레이브스 미국 상무부 부장관이 5월 말부터 지난달 초까지 네덜란드와 벨기에를 방문했을 당시 공급망 이슈를 논의하며 중국 수출 문제를 언급했고 네덜란드의 대표적 반도체 장비 업체인 ASML에게 EUV 극자외선 노광장비에 이어 구형 장비인 DUV 심자외선 노광장비에 대해서도 중국 판매 금지를 요구한 것으로 전해지며, 그간의 고강도 제재에도 불구하고 중국의 반도체 굴기 가 오히려 더 속도를 내자 추가 압박을 가하는 것으로 분석된다.<|endoftext|>\n", + "93 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 박동주 기자 3일 서울의 한 재래시장. 이번 주 발표되는 6월 소비자물가 상승률이 6%대를 넘을 수 있다는 관측이 나온다. 전기·가스요금이 인상되고 추석 9월 10일 성수품 수요가 몰리는 7∼8월에는 물가 상승률이 더 높아질 가능성이 크다. 기저효과를 고려하면 후반기에는 물가 오름세가 다소 완화될 수 있다는 기대가 있지만 공공요금 상승과 러시아·우크라이나 전쟁 장기화 높은 기대인플레이션율 임금 상승 압력 등 물가 상승 요인이 산적해 있어 예단하기 어려운 상황이다.\n", + "\n", + "### 답변: 이요금 상승, 러시아·우크라이나 전쟁 장기화 높은 기대인플레이션율 임금 상승 압력 등 물가 상승 요인이 산적해 있어 예단하기 어려운 상황인데, 이번 주 발표되는 6월 소비자물가 상승률이 6%대를 넘을 수 있다는 관측이 나온다.<|endoftext|>\n", + "94 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 장 그루넨워드 퓨리나 AOA CEO 인터뷰 전세계 75개국과 함께하는 네슬레 퓨리나 반려동물도 가족’ 펫휴머니제이션 확산에 프로플랜 등 영양·면역까지 챙긴 제품 내놔 지속가능성·반려동물 복지 최우선 과제 재활용 포장재 등 2050년까지 탄소배출 ‘0’ 최근 MZ 세대를 중심으로 미닝아웃 트렌드가 빠르게 확산되고 있다. 미닝아웃은 신념을 뜻하는 미닝 과 자신의 정체성을 드러냄을 의미하는 커밍아웃 의 합성어다. 자신의 신념과 가치를 드러내는 소비활동으로 윤리적 소비의 일종이다. 미닝아웃 트렌드의 확산에 따라 기업의 사회적 책임을 요구하는 목소리 역시 커지고 있다. 이를 반영해 기업들도 착한 제품 을 개발해 연일 내놓고있다. 반려동물업계도 이러한 트렌드를 따라가고 있다. 특히 국내에서는 반려인구 1500만 시대를 맞아 양적 성장에서 질적 변화를 위한 시도들이 이어지고 있다. 지속가능한 미래를 위해 반려동물 업계는 재활용 포장재 사용 사료 업사이클링 반려동물 용품 등 다양한 친환경 제품들이 출시하고 있다. 세계적인 반려동물 식품기업 네슬레 퓨리나도 이러한 시장 변화에 맞춰 움직이고 있다. 자신의 신념과 가치를 드러내는 소비활동이 늘어나는 지금 네슬레 퓨리나는 어떤 방향으로 움직이고 있는지 아시아·오세아니아·아프리카 AOA 지역 최고경영자 CEO 인 장 그루넨워드 Jean Grunenwald·사진 의 이야기를 들어봤다. 그루넨워드 CEO는 펫산업계의 미래 키워드로 기업의 사회적 책임감 을 꼽으며 바로 오늘이 반려인과 반려동물 그리고 지구가 공존할 수 있는 지속가능한 시스템이 필요한 때 라고 강조했다. 다음은 그루넨워드 CEO와의 일문일답. ―네슬레 퓨리나는 어느 나라에 진출해 있는가. 국가별로 집중하는 전략과 제품이 다른지. 한국과 일본을 포함해 약 75개 국가에 진출해 있다. 우리의 전략은 제품을 이용하는 소비자들의 반려동물이 건강하고 오랜 시간 행복한 삶을 영위할 수 있도록 돕는 것이다. 역사적으로 펫케어 분야는 미국과 유럽 지역에서 먼저 발달했다. 반면 아시아는 앞으로 발전할 기회가 더 많다. ―코로나19가 반려동물 산업에 미친 영향은 무엇인가. 코로나19에 따른 재택근무 증가로 인해 반려동물을 삶에 들일 수 있는 환경이 조성됐다. 네슬레 퓨리나는 다양한 연구를 통해 사람이 반려동물과 함께 하는 것이 더 좋다는 것을 이야기해 왔다. 네슬레 퓨리나가 진행한 반려동물과 인간간 유대감 연구는 반려동물이 사회적 포용성을 촉진하고 외로움을 완화한다는 것을 보여줬다. 팬데믹 이후 맞춤형 영양 제품인 프로플랜과 퓨리나원의 면역력 증진용 제품 수요도 증가한 것으로 나타났다. ―미래 반려동물 산업은 어떻게 변화할 것이라 생각하는가. 반려동물 산업은 꾸준히 성장할 것이다. 펫 휴머니제이션 의 가속화에 따라 MZ세대를 비롯한 새로운 세대의 반려인들은 반려동물의 건강과 지속가능성 상호작용에 더 주의를 기울일 것으로 생각된다. 소비자들은 지속가능성을 검증하기 위해 더 많은 사료 제품을 검토하고 있다. 또 원료와 원료 공급의 투명성에 대한 기대를 품고 있다. 전세계 천연자원이 감소하면서 지속적으로 대체 자원을 찾는 노력이 필요해지고 있는 상황이다. 우리 데이터에 따르면 최근 소비자들 사이에서 대체식품과 대체단백질에 대한 선호도가 증가하고 있다. 퓨리나는 이러한 부분들을 고려하고 반영해 펫푸드 분야에서 지속적인 혁신을 이어 나갈 계획이다. 네슬레 퓨리나의 스마트 연계형 사료 용기 CHEKR ―글로벌 펫 시장의 주요 트렌드는 무엇인가. 특히 관심 가는 부분이 있다면. 반려동물이 중요한 가족 구성원으로 인식되고 있는 만큼 △반려동물이 섭취하는 음식 △건강 문제 △반려인의 경험과 같은 펫케어 부분이 트렌드를 주도할 것이다. 기술적인 관점에서 △오믹스 omics 기술 △빅데이터 △예측 지능의 사용과 △분자 영양학에 대해 집중 연구가 식품영양학을 빠르게 발전하게 했다. 그리고 △활력징후 관찰 △반려동물의 마이크로바이옴 분석 △고양이 배변 상태 분석과 같은 건강 필요에 맞춘 반려동물 기기들이 증가하는 추세다. 모두 반려동물들이 더 오래 더 건강하게 사는데 도움을 주고 있다. 반려인을 도와주는 기술의 한 가지 예시로 네슬레 퓨리나 펫케어 호주가 지난해 론칭한 스마트사료 용기인 체커 CHEKR 를 소개하고 싶다. 앱과 연동이 가능한 체커엔 벼룩 예방을 비롯 반려동물 치료 알림 기능이 내장됐다. 반려인들이 반려동물의 건강을 손쉽게 관리할 수 있도록 도움을 준다. ―네슬레 퓨리나가 주목하고 있는 펫푸드 트렌드가 있다면. 대부분의 반려인들은 제품을 구입시 각각 다른 특성의 사료를 찾는다. 네슬레 퓨리나의 포트폴리오는 반려동물에게 요리식 식사 경험부터 특정 영양분이 필요한 반려동물을 위한 수의사의 처방 식단에 이르기까지 다양하다. 반려동물을 사람처럼 대하는 펫 휴머니제이션의 시대의 영향으로 반려동물을 만족시킬 수 있는 고급 펫푸드 제품 시장이 성장하고 있다. 또한 반려동물이 더 오래 그리고 건강하게 삶을 살 수 있도록 건강학적 이점이 입증된 영양학적 솔루션에 대한 수요도 증가하고 있다. ―네슬레 퓨리나는 성장을 위해 어떤 면에 집중하고 있는가. 우리의 기본은 반려동물 제품을 생산하는 회사다. 항상 최고의 품질과 안전 기준을 갖춘 회사가 되고자 노력하고 있다. 또 건강과 맛 그리고 영양을 모두 챙긴 사료를 제공하기 위해 노력 중이다. 반려동물 복지가 네슬레 퓨리나의 최우선 관심사이자 과제다. 소비자들은 기업에게 투명성 정보공개 을 요구하고 있다. 자신의 구매 결정이 환경에 미칠 영향과 동물 복지 측면에 소비자들의 관심이 높아지고 있다. 그래서 지속가능성을 강조하고 있다. ―지속가능성을 위해 네슬레 퓨리나가는 어떤 노력을 하는지. 네슬레 퓨리나는 2030년까지 온실가스 배출량을 절반으로 줄이고 2050년까지 순배출 제로 0 에 도달하는 순배출 제로 와 2025년까지 포장재의 100%를 재활용 또는 새 플라스틱 사용을 3분의 1까지 줄이는 지속가능한 포장 2025년까지 지속 가능한 방법으로 모든 반려동물 사료의 재료를 조달할 것을 보장하는 지속가능한 소싱 공장 전체의 연간 물 사용량 감소를 목표로 하는 수자원 보호 등 4가지 분야에 힘쓰고 있다. 현재까지 포장재의 29.6%를 재활용 또는 재사용이 가능한 재질로 도입해 생산 중이며 올해까지는 포장재의 69%를 재활용 또는 재사용이 가능한 재질로 전환하는 것을 목표로 하고 있다.\n", + "\n", + "### 답변: 반 MZ 세대를 중심으로 신념과 가치를 드러내는 소비활동인 미닝아웃(신념을 뜻하는 미닝과 자신의 정체성을 드러냄을 의미하는 커밍아웃의 합성어)이 빠르게 확산되고 있으며 자신의 신념과 가치를 드러내는 소비활동이 늘어나는 지금 네슬레 퓨리나는 어떤 방향으로 움직이고 있는지 아시아·오세아니아·아프리카 AOA 지역 최고경영자 CEO 인 장 그루넨워드 Jean Grunenwald·사진 의 이야기를 들어봤다.<|endoftext|>\n", + "95 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 올해 연말 종료될 예정이었던 전기차와 수소차의 고속도로 통행료 감면 제도가 2년 연장됩니다. 국토교통부는 이 같은 내용이 담긴 유료도로법 시행령 개정안을 다음 달 11일까지 입법 예고한다고 밝혔습니다. 정부는 지난 2017년부터 미세먼지 저감과 친환경차 보급을 위해 전기차와 수소차의 고속도로 통행료를 절반 깎아주고 있습니다. 국토부는 또 밤 9시부터 다음 날 아침 6시까지 사업용 화물차와 건설기계의 통행료를 30∼50% 감면해주는 제도도 유가 상승으로 어려움을 겪는 화물업계를 지원하기 위해 연장했습니다.\n", + "\n", + "### 답변: 국차년 연말 종료 예정이었던 전기차와 수소차의 고속도로 통행료 감면 제도가 2년 연장되어 올해 연말 종료될 예정 이었던 전기차와 수소차의 고속도로 통행료 감면 제도가 올해 연말 종료 되며, 국토교통부는 이 같은 내용이 담긴 유료도로법 시행령 개정안을 다음 달 11일까지 입법 예고한다고 밝혔다.<|endoftext|>\n", + "96 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 사진 나이벡 펩타이드 융합 바이오 전문기업 나이벡 주가가 강세다. 4일 오후 1시10분 나이벡은 전 거래일 대비 700원 3.08% 오른 2만3400원에 거래되고 있다. 이날 나이벡은 펩타이드 기반 조직재생 바이오 소재 가 하반기 본격적인 임상에 진입할 계획이라고 밝혔다. 이번 임상은 4차 혁명 및 미래의료 선도과제 를 골자로 하는 범부처사업단 범부처 전주기 의료기기 연구개발 사업단 과 1·2차에 이어 3차년도 협약에 선정된 결과다. 나이벡은 50억원 규모의 정부출연금을 지원받아 서울대 치과병원 한국광기술연구원과 함께 조직재생 기능성 바이오 소재에 대한 연구개발을 진행해 왔다. 나이벡 관계자는 범부처사업단으로부터 3차년도 협약에 성공하지 못한 기업들도 상당하기 때문에 이번 조직재생 바이오 소재에 대한 3차년도 협약성공은 기술이전을 비롯한 제품 상용화에 있어 큰 의미가 있다 며 이미 글로벌 판매처로부터 기술이전을 비롯한 구매의사 확인을 받은 상태로 올해 하반기 임상 시험에 진입해 빠른 상용화를 위해 노력하겠다 고 말했다.\n", + "\n", + "### 답변: 펩타이드 기반 조직재생 바이오 소재가 하반기 본격적인 임상에 진입할 계획이라고 밝히자 펩타이드 융합 바이오 전문기업 나이벡의 주가가 강세여서 4일 오후 1시10분 나이벡은 전 거래일 대비 700원 3.08% 오른 2만3400원에 거래되고 있다.<|endoftext|>\n", + "97 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 앵커 코로나19 장기화로 가장 타격을 입은 분들이 바로 소상공인들이죠. 줄어든 매출을 회복하고 경영 환경을 개선해보려 해도 기반이 부족하다보니 어려움이 따르는 경우가 많습니다. 최근엔 소상공인들이 빅데이터와 SNS 등을 활용해 디지털 전환에 나서고 있다고 하는데요. 신현욱 기자가 취재했습니다. 리포트 서울의 한 아파트 단지 앞 호두과자 가게. 가게 주변의 유동인구 등 각종 자료를 바탕으로 상권을 분석해 봤습니다. 박수현 한국외대 경영학과 데이터를 봐도 퇴근 시간대에 2030 여성분들이 많이 지나가셔서. 그리고 저희가 현장조사 통해서도 혼자 많이 찾아서 오시는 분들이 많으셨는데... 그 결과를 바탕으로 제품을 소포장으로 바꾸고 개점 시간도 앞당기자 매출이 늘었습니다. 장 호 호두과자 가게 사장 영업시간을 당기면 어떻겠느냐 해서 여덟 시 반으로 당겼는데 의외로 출근하시는 분들이 많이 들러서... 이 상권 분석 플랫폼은 전국을 대상으로 한 무료 서비스인데 자료도 매일 갱신됩니다. 이종헌 KT 잘나가게 담당 상무 철저하게 소상공인한테 필요한 상권 입장에서 가장 적합한 것들을 저희가 이 플랫폼에 담으려고 기획을 했고요. 오늘 바나나 한 송이 천 원 드리고... 수십 년간 한 자리에서 장사를 이어온 전통시장 상인들. 갈수록 치열해지는 온라인 마케팅 적응이 쉽지 않습니다. 김수자 상인 온라인에 모르는 게 너무 많았어요. 이럴 때 전문가가 누군가가 좀 나를 도와줬으면 내가 이렇게 저렇게 치고 나갈텐데 하는 아쉬움이 많았어요. 이런 상인들에게도 최근 새로운 창구가 생겼습니다. 모바일 SNS를 통해 쉽게 홍보할 수 있는 채널 을 개설해 고객과 소통할 수 있게 된 겁니다. 육심나 카카오 ESG 사업실장 상인과 고객을 단골 개념으로 묶는 방법에 대해서 고민을 했습니다. 오늘 싸게 팔아요 그런 정보로 다가간다면 고객들한테도 되게 좋은 정보인 거고... 디지털 기술에 대한 소상공인들의 수요가 커지는 만큼 좀 더 체계적인 정부 지원이 필요하다는 지적이 나오고 있습니다. KBS 뉴스 신현욱입니다.\n", + "\n", + "### 답변: 최근로 소상공인들이 빅데이터와 SNS 등을 활용해 디지털 전환에 나서고 있지만 기반이 부족하다보니 어려움이 따르는 경우가 많아 디지털 기술에 대한 소상공인들의 수요가 커지는 만큼 좀 더 체계적인 정부 지원이 필요하다는 지적이 나오고 있다.<|endoftext|>\n", + "98 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 구미 사업장에 2023년까지 총 1조4000억원 투자 투자금 FC BGA와 카메라모듈 생산시설 구축에 활용 LG이노텍 구미사업장 전경 LG이노텍이 반도체기판 FC BGA 및 카메라모듈 생산기지 확대에 나선다. LG이노텍은 6일 구미시청에서 경상북도 및 구미시와 1조4000억원 규모의 투자협약 MOU 을 체결했다고 밝혔다. LG이노텍은 연면적 약 23만㎡에 달하는 구미 4공장 구 LG전자 A3 공장 인수를 포함해 구미 사업장에 2023년까지 총 1조4000억원을 투자한다. 투자금액은 FC BGA와 카메라모듈 생산을 위한 제조시설 구축에 쓰인다. LG이노텍은 내년 양산을 목표로 구미 4공장에 FC BGA 신규 생산라인을 구축해 나갈 방침이다. 지난 2월 시장 진출을 공식화한 FC BGA는 LG이노텍이 미래 성장동력으로 육성하는 분야다. FC BGA는 PC 서버 네트워크 등의 반도체칩을 메인기판과 연결해주는 반도체용 기판으로 글로벌 수요가 급증하는데 비해 기술력을 보유한 업체가 적어 공급 부족 현상이 지속되고 있다. 카메라모듈 생산시설 확대로 스마트폰용 카메라모듈 세계 1위 입지도 더욱 확고히 할 수 있게됐다. 카메라모듈은 LG이노텍의 매출을 이끄는 대표 사업분야다. 카메라모듈을 생산하는 광학솔루션사업부 매출은 지난해 기준 11조8000억원에 달한다. 특히 지난해에는 전년 대비 매출이 68%가량 늘었다. 6일 구미시청에서 LG이노텍이 경상북도 및 구미시와 투자 협약 MOU 을 체결했다. LG이노텍은 구미 4공장 인수를 포함해 구미 사업장에 2023년까지 총 1.4조원을 투자할 계획이다. 사진 왼쪽부터 이철우 경상북도 도지사 정철동 LG이노텍 사장 김장호 구미시장 LG이노텍은 기존에 운영중인 구미 1A 1 2 3공장에 이어 구미 4공장을 추가로 확보하며 총 5개 공장을 갖추게 됐다. LG이노텍 구미 사업장은 총 대지면적이 약 37만㎡로 축구장 52개를 합한 규모다. 이번 구미 투자로 인한 직·간접 고용 창출 효과는 총 1000여명에 이를 것으로 예상된다. 정철동 사장은 “이번 투자는 LG이노텍과 구미 지역사회 협력회사들이 동반성장 할 수 있는 좋은 기회”라며 “고객경험 혁신을 위한 적극적인 투자를 이어 나갈 것”이라고 말했다.\n", + "\n", + "### 답변: LG이노텍은 6일 구미시청에서 경상북도 및 구미시와 1조4000억원 규모의 투자협약 MOU 을 체결하여 구미 4공장 구 LG전자 A3 공장 인수를 포함해 구미 사업장에 2023년까지 총 1조4000억원을 투자하여 FC BGA 및 카메라모듈 생산기지 확대에 나선다.<|endoftext|>\n", + "99 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 산업부·조달청 정책설명회 정부가 중견기업을 우리 산업의 새로운 성장 엔진으로 육성하기 위해 이들이 생산하는 제품을 공공조달을 통해 적극적으로 활용·육성하기로 했다. 중견기업은 우리나라 전체 공공조달 계약 규모 184조원 중 26조3000억원을 담당하고 있다. 산업통상자원부는 조달청과 함께 1일 서울 마포구 한국중견기업연합회에서 중견기업을 대상으로 공공조달 정책설명회를 개최하고 중견기업 제품의 공공조달 강화방안을 논의했다고 밝혔다. 이날 설명회는 중견기업 지원에 대한 정부인식 제고를 위해 마련된 가운데 조달청은 새 정부의 공공조달 정책방향을 설명했고 참석자들은 중견기업의 공공조달 관련 애로 및 건의 사항을 전달했다. 이종욱 조달청장은 “중견기업은 공공조달 시장 전체 기업 수의 0.7% 3487개 에 불과하지만 우리나라 전체 공공조달 계약 규모 184조원 중 26조3000억원을 담당한다”며 “중견기업이 공공조달 시장에 보다 활발하게 참여하고 국내를 넘어 해외조달시장으로 뻗어나갈 수 있도록 다각적인 지원방안을 강구하겠다”고 말했다. 장영진 사진 산업부 제1차관은 “우리 경제 역동성·활력을 제고하기 위해서는 기업 성장사다리의 핵심 연결고리인 중견기업에 대한 정부 지원체계 강화가 필수적”이라며 “이번 설명회를 시작으로 향후 중견기업계의 주요 애로사항과 관련된 부처를 대상으로 지속적인 소통을 하겠다”고 말했다.\n", + "\n", + "### 답변: 우리통상자원부는 조달청과 함께 1일 서울 마포구 한국중견기업연합회에서 중견기업을 대상으로 공공조달 정책설명회를 개최해 새 정부의 공공조달 정책방향과 중견기업 제품의 공공조달 강화방안을 논의하며 공공조달을 통해 이들이 생산하는 제품을 공공조달을 통해 적극적으로 활용·육성하기로 했다.<|endoftext|>\n" + ] + } + ], + "source": [ + "# Input 길이가 2048이 넘어가는 경우 학습 불가로 인하여, 학습 전 제거. \n", + "\n", + "data = data.filter(lambda example: len(example[\"input_ids\"]) < 2048)\n", + "\n", + "for i in range(100):\n", + " print(i, data[\"test\"][i][\"text\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "jq0nX33BmfaC", + "outputId": "769fb34e-acd0-4a56-ac87-40db98dabd78" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "You're using a PreTrainedTokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [516/516 13:48:21, Epoch 2/3]\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", + " \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", + " \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", + " \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", + "
StepTraining Loss
102.135500
201.934900
301.844900
401.810000
501.802600
601.760600
701.754300
801.747000
901.777200
1001.971500
1101.730300
1201.743000
1301.726800
1401.722800
1501.692400
1601.683200
1701.685500
1801.667500
1901.686700
2001.688700
2101.676500
2201.672900
2301.644600
2401.658700
2501.658700
2601.665100
2701.640800
2801.657800
2901.629400
3001.626300
3101.640100
3201.630800
3301.595200
3401.627800
3501.596300
3601.604800
3701.600300
3801.591500
3901.607900
4001.581000
4101.599500
4201.601700
4301.601400
4401.609800
4501.600400
4601.579800
4701.599500
4801.578400
4901.580000
5001.586900
5101.598400

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "TrainOutput(global_step=516, training_loss=1.679347644480624, metrics={'train_runtime': 49794.8225, 'train_samples_per_second': 1.326, 'train_steps_per_second': 0.01, 'total_flos': 1.0728946816411238e+18, 'train_loss': 1.679347644480624, 'epoch': 3.0})" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import transformers\n", + "\n", + "# needed for gpt-neo-x tokenizer\n", + "tokenizer.pad_token = tokenizer.eos_token\n", + "\n", + "# For LLaMA\n", + "# tokenizer.pad_token_id = (\n", + "# 0 # unk. we want this to be different from the eos token\n", + "# )\n", + "\n", + "trainer = transformers.Trainer(\n", + " model=model,\n", + " train_dataset=data[\"train\"],\n", + " args=transformers.TrainingArguments(\n", + " per_device_train_batch_size=4,\n", + " gradient_accumulation_steps=32,\n", + " # warmup_steps=200,\n", + " # max_steps=500, ## 초소형만 학습: 10 step = 20개 샘플만 학습.\n", + " learning_rate=2e-4,\n", + " fp16=True,\n", + " logging_steps=10,\n", + " save_total_limit=3,\n", + " output_dir=\"outputs\",\n", + " optim=\"paged_adamw_8bit\"\n", + " ),\n", + " data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),\n", + ")\n", + "model.config.use_cache = False # silence the warnings. Please re-enable for inference!\n", + "trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "trainer.save_model(\"polyglot-ko_5.8b_news_3ep\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "TvP11yUbhzWP", + "outputId": "96eb0cfe-e22f-4642-9fba-796942c62540" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "wow\n" + ] + } + ], + "source": [ + "print(\"wow\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": { + "id": "a-jauOEv9XVe" + }, + "outputs": [], + "source": [ + "model.eval()\n", + "model.config.use_cache = True # silence the warnings. Please re-enable for inference!" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "r4ITTiXfp-2r", + "outputId": "e6376ea8-f293-4ca4-f9f3-13f231f5de07" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.8/site-packages/transformers/generation/utils.py:1264: UserWarning: You have modified the pretrained model configuration to control generation. This is a deprecated strategy to control generation and will be removed soon, in a future version. Please use a generation configuration file (see https://huggingface.co/docs/transformers/main_classes/text_generation )\n", + " warnings.warn(\n", + "/opt/conda/lib/python3.8/site-packages/transformers/generation/utils.py:1363: UserWarning: Using `max_length`'s default (20) to control the generation length. This behaviour is deprecated and will be removed from the config in v5 of Transformers -- we recommend using `max_new_tokens` to control the maximum length of the generation.\n", + " warnings.warn(\n", + "Input length of input_ids is 20, but `max_length` is set to 20. This can lead to unexpected behavior. You should consider increasing `max_new_tokens`.\n", + "/opt/conda/lib/python3.8/site-packages/transformers/generation/utils.py:1462: UserWarning: You are calling .generate() with the `input_ids` being on a device type different than your model's device. `input_ids` is on cpu, whereas the model is on cuda. You may experience unexpected behaviors or slower generation. Please make sure that you have put `input_ids` to the correct device by calling for example input_ids = input_ids.to('cuda') before running `.generate()`.\n", + " warnings.warn(\n", + "/opt/conda/lib/python3.8/site-packages/torch/utils/checkpoint.py:31: UserWarning: None of the inputs have requires_grad=True. Gradients will be None\n", + " warnings.warn(\"None of the inputs have requires_grad=True. Gradients will be None\")\n" + ] + }, + { + "data": { + "text/plain": [ + "tensor([[ 0, 835, 29871, 239, 170, 139, 31406, 29901, 29871, 31346,\n", + " 238, 141, 155, 29871, 238, 133, 163, 31781, 31081, 29973,\n", + " 29871]])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.generate(**tokenizer(\"### 질문: 오늘 날씨는?\", return_tensors='pt', return_token_type_ids=False))" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": { + "id": "oDp9W-Gmp5Mb" + }, + "outputs": [], + "source": [ + "def gen(contents):\n", + " gened = model.generate(\n", + " **tokenizer(\n", + " f\"\"\"### 질문: 아래의 문서를 요약해라. 문서의 종류는 기사다. 같은 단어와 문장은 반복하지 않는다. 없는 정보를 붙이지 마라. \n", + "\n", + "###맥락: {contents}\n", + "\n", + "### 답변:\"\"\",\n", + " return_tensors='pt',\n", + " return_token_type_ids=False\n", + " ),\n", + " max_new_tokens=512,\n", + " # early_stopping=True,\n", + " do_sample=True,\n", + " eos_token_id=2,\n", + " no_repeat_ngram_size=8,\n", + " )\n", + " print(tokenizer.decode(gened[0]))" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 128 + }, + "id": "iIbK1GaipZd9", + "outputId": "46537a15-3bce-4959-860a-80706a8b3693" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### 질문: 아래의 문서를 요약해라. 문서의 종류는 기사다. 같은 단어와 문장은 반복하지 않는다. 없는 정보를 붙이지 마라. \n", + "\n", + "###맥락: 네덜란드 ASML 본사 사옥. 로이터 연합뉴스 미국이 중국의 반도체 산업에 대한 제재의 수위를 높이고 있다. 그간의 고강도 제재에도 불구하고 중국의 반도체 굴기 가 오히려 더 속도를 내자 추가 압박을 가하는 것으로 분석된다. 5일 현지시간 블룸버그통신에 따르면 미국은 네덜란드의 대표적 반도체 장비 업체인 ASML에게 EUV 극자외선 노광장비에 이어 구형 장비인 DUV 심자외선 노광장비에 대해서도 중국 판매 금지를 요청했다. 블룸버그는 돈 그레이브스 미국 상무부 부장관이 5월 말부터 지난달 초까지 네덜란드와 벨기에를 방문했을 당시 공급망 이슈를 논의하며 중국 수출 문제를 언급했고 ASML 본사도 방문해 피터 베닝크 ASML CEO 최고경영자 를 만나 이와 같은 내용을 요청했다고 소식통들을 인용해 보도했다. 네덜란드 정부는 미국의 압박으로 ASML이 세계에서 유일하게 생산하는 EUV 장비의 중국 수출 승인을 내주지 않고 있는데 이 조치를 DUV까지 확대하기를 요구한 것이다. ASML은 반도체 웨이퍼 위에 회로 선폭을 새기는 노광 과정에 필요한 장비를 주로 생산한다. 이 중 EUV는 극자외선 파장의 빛을 이용하는 것으로 파장이 짧아 미세한 회로 구현에 용이하다. EUV 장비는 차세대 반도체 공정에 반드시 필요한 장비지만 현재까지는 5나노 이하 초미세공정이 필요한 시스템반도체 생산이나 10나노 초반대의 차세대 D램 등에서만 주로 쓰인다. 20나노 이상의 숙성 공정에서는 여전히 불화아르곤 ArF 을 사용하는 DUV 노광장비가 가장 일반적으로 사용된다. 미국은 일본 니콘에도 DUV 장비를 중국에 판매하지 못하게 금지해줄 것을 요청하고 있는 것으로 알려졌다. 이는 중국이 10나노 이상급 파운드리에서 괄목할 성장을 이어가고 있어서인 것으로 풀이된다. 대만 시장조사업체 트렌드포스에 따르면 중국 파운드리 반도체 위탁생산 를 대표하는 SMIC 화훙 넥스칩의 시장점유율 합계는 올해 1분기 처음으로 10%를 넘어섰다. 이들 3개사의 매출 합계는 33억2900만 달러에 이른다. 최근 국제반도체장비재료협회 SEMI 에 따르면 해외 반도체 생산장비 업체에 대한 중국의 장비 주문은 지난해에만 전년 대비 58% 증가하며 2년 연속 글로벌 1위를 기록했다. 블룸버그는 이 같은 중국의 반도체 자급화 움직임에 미국의 제재가 오히려 중국 반도체의 약진을 도왔다 고 언급하기도 했다.\n", + "\n", + "### 답변: 5일 현지시간 미국이 자국의 반도체 산업에 대한 제재의 강도를 높이고 있는 가운데 네덜란드의 대표적 반도체 장비 업체 ASML에게 EUV 극 자외선 노광장비에 이어 구형 DUV 심자외선 노광 장비에 대해서도 중국 수출 금지를 요청했고 이 조치를 DUV까지 확대해 줄 것을 요구했다. 미국 정부는 지난달 말부터 중국의 반도체 굴기 가 더 속도를 내고 있자 추가 압박을 가하는 것이다. 이와 같은 조치는 미국이 20나노 이상의 숙성 공정에서 여전히 불화아르곤 ArF을 사용하는 DUV 노광 장비를 가장 일반적으로 쓰고 있어 중국의 반도체 성장에 대해서도 부담을 느끼고 있기 때문이다.\n", + "\n", + "\n", + "; ASML 본사 사옥. 로이터연합뉴스 미국 연방정보국 NSA 가 자국의 반도체 산업에 대한 제재를 강화하고 있다.\n", + "\n", + "라이트미국 NSA 국장은 미국의 중국의 반도체 굴기에 대해서도 부담을 느끼고 있다.\n", + "미국 NSA 국장은 미국의 반도체 굴기에 대해서도 부담이 있다고 밝혔다.\n", + "\n", + "미국 NSA 국장은 미국 반도체 굴기에 대해서도 부담이 부담이 크다고 밝혔다.\n", + "\n", + "미국과 ASML 반도체 장비 업체 ASML에게 중국 수출 금지를 요청했다. ASML는 반도체 웨이퍼 위에 회로 선을 새기는 노광 과정에 쓰이는 장비를 주로 생산한다. ASML 장비 업체 ASML에게 중국 판매 금지를 요청하고 있는 것. ASML은 반도체 웨이펴 위에 회로 선을 새기는 과정에 쓰이는 장비를 주로 다루는데 이 중 EUV 장비가 차세대 공정에 반드시 필요한 장비지만 20나노 이상의 숙성 공정에서도 여전히 불화아르곤 ArF 를 사용하는 DUV 노광장치가 일반적으로 쓰인다. 미국 정부는 일본 니콘에도 DUV 장비의 중국 수출 금지해줄 것을 요청하고 일본의 수출 금지로 글로벌 1위를 차지하고 있다. ※관련 기사 : 네덜란드 ASML 장비 회사 ASML에게 첨단 장비인 EUV 노광장비에 이어 구형 장비에 대해서도 중국 판매 금지를 요구했다. 미국 상무부가 5월말부터 지난달초까지 네덜란드와 벨기에를 방문했던 피터 베닝크 ASML 최고경영자 CEO를 만난 뒤 이같은 요청을 한 것으로 알려졌다. ※관련 영상 : ASML 장비사\n" + ] + } + ], + "source": [ + "gen('네덜란드 ASML 본사 사옥. 로이터 연합뉴스 미국이 중국의 반도체 산업에 대한 제재의 수위를 높이고 있다. 그간의 고강도 제재에도 불구하고 중국의 반도체 굴기 가 오히려 더 속도를 내자 추가 압박을 가하는 것으로 분석된다. 5일 현지시간 블룸버그통신에 따르면 미국은 네덜란드의 대표적 반도체 장비 업체인 ASML에게 EUV 극자외선 노광장비에 이어 구형 장비인 DUV 심자외선 노광장비에 대해서도 중국 판매 금지를 요청했다. 블룸버그는 돈 그레이브스 미국 상무부 부장관이 5월 말부터 지난달 초까지 네덜란드와 벨기에를 방문했을 당시 공급망 이슈를 논의하며 중국 수출 문제를 언급했고 ASML 본사도 방문해 피터 베닝크 ASML CEO 최고경영자 를 만나 이와 같은 내용을 요청했다고 소식통들을 인용해 보도했다. 네덜란드 정부는 미국의 압박으로 ASML이 세계에서 유일하게 생산하는 EUV 장비의 중국 수출 승인을 내주지 않고 있는데 이 조치를 DUV까지 확대하기를 요구한 것이다. ASML은 반도체 웨이퍼 위에 회로 선폭을 새기는 노광 과정에 필요한 장비를 주로 생산한다. 이 중 EUV는 극자외선 파장의 빛을 이용하는 것으로 파장이 짧아 미세한 회로 구현에 용이하다. EUV 장비는 차세대 반도체 공정에 반드시 필요한 장비지만 현재까지는 5나노 이하 초미세공정이 필요한 시스템반도체 생산이나 10나노 초반대의 차세대 D램 등에서만 주로 쓰인다. 20나노 이상의 숙성 공정에서는 여전히 불화아르곤 ArF 을 사용하는 DUV 노광장비가 가장 일반적으로 사용된다. 미국은 일본 니콘에도 DUV 장비를 중국에 판매하지 못하게 금지해줄 것을 요청하고 있는 것으로 알려졌다. 이는 중국이 10나노 이상급 파운드리에서 괄목할 성장을 이어가고 있어서인 것으로 풀이된다. 대만 시장조사업체 트렌드포스에 따르면 중국 파운드리 반도체 위탁생산 를 대표하는 SMIC 화훙 넥스칩의 시장점유율 합계는 올해 1분기 처음으로 10%를 넘어섰다. 이들 3개사의 매출 합계는 33억2900만 달러에 이른다. 최근 국제반도체장비재료협회 SEMI 에 따르면 해외 반도체 생산장비 업체에 대한 중국의 장비 주문은 지난해에만 전년 대비 58% 증가하며 2년 연속 글로벌 1위를 기록했다. 블룸버그는 이 같은 중국의 반도체 자급화 움직임에 미국의 제재가 오히려 중국 반도체의 약진을 도왔다 고 언급하기도 했다.')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "machine_shape": "hm", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.5" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "0a91d94890634dc1bb43176347c27fec": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "278070bfaaac4794a649f11306ad2947": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_5391d6d2385549319099d3bf653c34ee", + "IPY_MODEL_ee696f00718b43989f653dd01391a87d", + "IPY_MODEL_e39e4f5284224bfdbde4359d8593d206" + ], + "layout": "IPY_MODEL_0a91d94890634dc1bb43176347c27fec" + } + }, + "3473e65596d5455385269f59e6159e38": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "388757e992344b06b2fc7e4573eba77d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "416d78e5558f4019972720c8d52a410b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5391d6d2385549319099d3bf653c34ee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ec9d84f9337948cba5562b7e995bb2ef", + "placeholder": "​", + "style": "IPY_MODEL_3473e65596d5455385269f59e6159e38", + "value": "100%" + } + }, + "664f6a3720a446929197650580dd005d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "92e0594143bd4c2690dc3ddaa0170b17": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e39e4f5284224bfdbde4359d8593d206": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_664f6a3720a446929197650580dd005d", + "placeholder": "​", + "style": "IPY_MODEL_92e0594143bd4c2690dc3ddaa0170b17", + "value": " 1/1 [00:00<00:00, 9.41it/s]" + } + }, + "ec9d84f9337948cba5562b7e995bb2ef": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ee696f00718b43989f653dd01391a87d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_416d78e5558f4019972720c8d52a410b", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_388757e992344b06b2fc7e4573eba77d", + "value": 1 + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 8cdcac61f7d69879da8f102298e4cef01be60d1a Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Tue, 18 Jul 2023 13:38:02 +0900 Subject: [PATCH 18/63] [Data] EDA notebook for news labeling about length --- Notebooks/Labeling/Label_EDA.ipynb | 479 +++++++++++++++++++++++++++++ 1 file changed, 479 insertions(+) create mode 100644 Notebooks/Labeling/Label_EDA.ipynb diff --git a/Notebooks/Labeling/Label_EDA.ipynb b/Notebooks/Labeling/Label_EDA.ipynb new file mode 100644 index 0000000..cf6b832 --- /dev/null +++ b/Notebooks/Labeling/Label_EDA.ipynb @@ -0,0 +1,479 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "id": "2a3ca4d2-1f75-4a4a-a3b4-c85fb777b7f5", + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "import pandas as pd\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "82d7e485-892c-4269-a685-9147dd89a2d4", + "metadata": {}, + "outputs": [ + { + "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", + " \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", + "
Unnamed: 0titledatecontentcontent_corpus
00데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ...2023.07.10 15:29챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...
11LS일렉트릭, 텍사스 공장 짓는다…현지 삼성·SK·LG 전력 지원2023.07.10 15:08북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ...북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ...
22“삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연2023.07.10 15:07삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...
33SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급2023.07.10 15:05해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (...해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리...
44‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파2023.07.10 14:58북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...
..................
20292029엔비디아 폭등에…삼성전자·SK하이닉스 동반 강세2023.05.26 09:25[서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간...삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간밤 미국 증시에서 엔비디아가 폭등...
20302030\"7만전자 영차\"…삼성전자, 장초반 1% 이상 올라[특징주]2023.05.26 09:19경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김...경기 수원 영통구 삼성전자 본사의 모습. News1 코스피 대장주 삼성전자가 개...
20312031코스피, 외인 순매수 속 강보합…삼전 1%·하이닉스 3% 상승2023.05.26 09:16지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외...지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 외국인의 순매수세 속...
20322032삼전·하이닉스 강세에 코스피도 상승 출발…외인 매수세2023.05.26 09:15/사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강...증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강세가 이어지고 있다. 26...
20332033반도체 반등 시작했나…삼성전자·SK하이닉스 연일 강세2023.05.26 09:12[특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉...삼성전자엔비디아발 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉스가 연일 상승...
\n", + "

2002 rows × 5 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 title \\\n", + "0 0 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... \n", + "1 1 LS일렉트릭, 텍사스 공장 짓는다…현지 삼성·SK·LG 전력 지원 \n", + "2 2 “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 \n", + "3 3 SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 \n", + "4 4 ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 \n", + "... ... ... \n", + "2029 2029 엔비디아 폭등에…삼성전자·SK하이닉스 동반 강세 \n", + "2030 2030 \"7만전자 영차\"…삼성전자, 장초반 1% 이상 올라[특징주] \n", + "2031 2031 코스피, 외인 순매수 속 강보합…삼전 1%·하이닉스 3% 상승 \n", + "2032 2032 삼전·하이닉스 강세에 코스피도 상승 출발…외인 매수세 \n", + "2033 2033 반도체 반등 시작했나…삼성전자·SK하이닉스 연일 강세 \n", + "\n", + " date content \\\n", + "0 2023.07.10 15:29 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... \n", + "1 2023.07.10 15:08 북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ... \n", + "2 2023.07.10 15:07 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... \n", + "3 2023.07.10 15:05 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (... \n", + "4 2023.07.10 14:58 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... \n", + "... ... ... \n", + "2029 2023.05.26 09:25 [서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간... \n", + "2030 2023.05.26 09:19 경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김... \n", + "2031 2023.05.26 09:16 지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외... \n", + "2032 2023.05.26 09:15 /사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강... \n", + "2033 2023.05.26 09:12 [특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉... \n", + "\n", + " content_corpus \n", + "0 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... \n", + "1 북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ... \n", + "2 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... \n", + "3 해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리... \n", + "4 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... \n", + "... ... \n", + "2029 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간밤 미국 증시에서 엔비디아가 폭등... \n", + "2030 경기 수원 영통구 삼성전자 본사의 모습. News1 코스피 대장주 삼성전자가 개... \n", + "2031 지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 외국인의 순매수세 속... \n", + "2032 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강세가 이어지고 있다. 26... \n", + "2033 삼성전자엔비디아발 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉스가 연일 상승... \n", + "\n", + "[2002 rows x 5 columns]" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_news = pd.read_csv(\"./preprocessed_data.csv\")\n", + "df_news = df_news.drop_duplicates([\"title\"])\n", + "df_news = df_news.dropna()\n", + "df_news" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "8f43c57c-3f3a-4641-a352-55bbc6ac5200", + "metadata": {}, + "outputs": [ + { + "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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0titledatecontentcontent_corpuscontent_lencontent_corpus_len
00데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ...2023.07.10 15:29챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...18131651
11LS일렉트릭, 텍사스 공장 짓는다…현지 삼성·SK·LG 전력 지원2023.07.10 15:08북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ...북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ...870816
22“삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연2023.07.10 15:07삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...17491698
33SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급2023.07.10 15:05해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (...해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리...547476
44‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파2023.07.10 14:58북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...10961029
........................
20292029엔비디아 폭등에…삼성전자·SK하이닉스 동반 강세2023.05.26 09:25[서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간...삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간밤 미국 증시에서 엔비디아가 폭등...618572
20302030\"7만전자 영차\"…삼성전자, 장초반 1% 이상 올라[특징주]2023.05.26 09:19경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김...경기 수원 영통구 삼성전자 본사의 모습. News1 코스피 대장주 삼성전자가 개...521468
20312031코스피, 외인 순매수 속 강보합…삼전 1%·하이닉스 3% 상승2023.05.26 09:16지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외...지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 외국인의 순매수세 속...1021928
20322032삼전·하이닉스 강세에 코스피도 상승 출발…외인 매수세2023.05.26 09:15/사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강...증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강세가 이어지고 있다. 26...11271058
20332033반도체 반등 시작했나…삼성전자·SK하이닉스 연일 강세2023.05.26 09:12[특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉...삼성전자엔비디아발 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉스가 연일 상승...683620
\n", + "

2002 rows × 7 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0 title \\\n", + "0 0 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... \n", + "1 1 LS일렉트릭, 텍사스 공장 짓는다…현지 삼성·SK·LG 전력 지원 \n", + "2 2 “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 \n", + "3 3 SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 \n", + "4 4 ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 \n", + "... ... ... \n", + "2029 2029 엔비디아 폭등에…삼성전자·SK하이닉스 동반 강세 \n", + "2030 2030 \"7만전자 영차\"…삼성전자, 장초반 1% 이상 올라[특징주] \n", + "2031 2031 코스피, 외인 순매수 속 강보합…삼전 1%·하이닉스 3% 상승 \n", + "2032 2032 삼전·하이닉스 강세에 코스피도 상승 출발…외인 매수세 \n", + "2033 2033 반도체 반등 시작했나…삼성전자·SK하이닉스 연일 강세 \n", + "\n", + " date content \\\n", + "0 2023.07.10 15:29 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... \n", + "1 2023.07.10 15:08 북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ... \n", + "2 2023.07.10 15:07 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... \n", + "3 2023.07.10 15:05 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (... \n", + "4 2023.07.10 14:58 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... \n", + "... ... ... \n", + "2029 2023.05.26 09:25 [서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간... \n", + "2030 2023.05.26 09:19 경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김... \n", + "2031 2023.05.26 09:16 지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외... \n", + "2032 2023.05.26 09:15 /사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강... \n", + "2033 2023.05.26 09:12 [특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉... \n", + "\n", + " content_corpus content_len \\\n", + "0 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... 1813 \n", + "1 북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ... 870 \n", + "2 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... 1749 \n", + "3 해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리... 547 \n", + "4 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... 1096 \n", + "... ... ... \n", + "2029 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간밤 미국 증시에서 엔비디아가 폭등... 618 \n", + "2030 경기 수원 영통구 삼성전자 본사의 모습. News1 코스피 대장주 삼성전자가 개... 521 \n", + "2031 지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 외국인의 순매수세 속... 1021 \n", + "2032 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강세가 이어지고 있다. 26... 1127 \n", + "2033 삼성전자엔비디아발 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉스가 연일 상승... 683 \n", + "\n", + " content_corpus_len \n", + "0 1651 \n", + "1 816 \n", + "2 1698 \n", + "3 476 \n", + "4 1029 \n", + "... ... \n", + "2029 572 \n", + "2030 468 \n", + "2031 928 \n", + "2032 1058 \n", + "2033 620 \n", + "\n", + "[2002 rows x 7 columns]" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df_news[\"content_len\"] = df_news['content'].str.len()\n", + "df_news[\"content_corpus_len\"] = df_news['content_corpus'].str.len()" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "3801978f-d77f-4ea4-8b7f-488f9a51c793", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAigAAAH9CAYAAAAwFoeEAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAByHklEQVR4nO3dd1gU1/c/8LPLArt0QWlKswJiwYaoUVQMlhhMNFgwaNQQC9FoYkss0ZjYe02MNWrU5GOJPUZRY1cULFgwQrCBMUZQVEQ4vz/8MV/G3dWdEddB36/n2SfZmXvm3jt3dzlOuaNiZiYAAAAABVG/6gYAAAAAPA0JCgAAACgOEhQAAABQHCQoAAAAoDhIUAAAAEBxkKAAAACA4iBBAQAAAMVBggIAAACKo3nVDZCjoKCArl+/Tvb29qRSqV51cwAAAMAEzEx3794lT09PUquffYykRCYo169fJy8vr1fdDAAAAJDhypUrVK5cuWeWKZEJir29PRE96aCDg8Mrbg0AAACYIjs7m7y8vIS/489SIhOUwtM6Dg4OSFAAAABKGFMuz8BFsgAAAKA4SFAAAABAcZCgAAAAgOIgQQEAAADFQYICAAAAioMEBQAAABQHCQoAAAAoDhIUAAAAUBzJCcq+ffuobdu25OnpSSqVijZs2GC0bO/evUmlUtGMGTNEy2/fvk3R0dHk4OBATk5O1LNnT7p3757UpgAAAMBrSnKCkpOTQzVq1KC5c+c+s9z69evp8OHD5OnpqbcuOjqazp49Szt37qTNmzfTvn37KDY2VmpTAAAA4DUlear7Vq1aUatWrZ5Z5tq1a/Tpp5/Sjh07qE2bNqJ1586do+3bt9OxY8eoTp06REQ0e/Zsat26NU2ZMsVgQgMAAABvlmK/BqWgoIA+/PBDGjx4MFWtWlVv/aFDh8jJyUlIToiIwsPDSa1W05EjRwxuMzc3l7Kzs0UvAAAAeH0Ve4IyceJE0mg01L9/f4PrMzIyyNXVVbRMo9GQs7MzZWRkGIwZP348OTo6Ci8vL6/ibjYAAAAoSLEmKAkJCTRz5kxaunSpSU8qNNXw4cMpKytLeF25cqXYtg0AAADKI/kalGf5888/6ebNm+Tt7S0sy8/Pp88//5xmzJhBaWlp5O7uTjdv3hTFPX78mG7fvk3u7u4Gt2ttbU3W1tbF2VQwA99hWwwuT5vQxuByAACAQsWaoHz44YcUHh4uWhYREUEffvghffTRR0REFBoaSnfu3KGEhASqXbs2ERHt3r2bCgoKKCQkpDibAwAAACWU5ATl3r17dOnSJeF9amoqJSYmkrOzM3l7e5OLi4uovKWlJbm7u1OVKlWIiCggIIBatmxJH3/8MS1YsIDy8vIoLi6OOnXqhDt4AAAAgIhkXINy/PhxCg4OpuDgYCIiGjRoEAUHB9OoUaNM3sbKlSvJ39+fmjdvTq1bt6ZGjRrRDz/8ILUpAAAA8JqSfAQlLCyMmNnk8mlpaXrLnJ2dadWqVVKrBgAAgDcEnsUDAAAAioMEBQAAABQHCQoAAAAoDhIUAAAAUBwkKAAAAKA4SFAAAABAcZCgAAAAgOIgQQEAAADFQYICAAAAioMEBQAAABQHCQoAAAAoDhIUAAAAUBwkKAAAAKA4SFAAAABAcZCgAAAAgOIgQQEAAADFQYICAAAAioMEBQAAABQHCQoAAAAoDhIUAAAAUBwkKAAAAKA4SFAAAABAcZCgAAAAgOIgQQEAAADFQYICAAAAioMEBQAAABQHCQoAAAAoDhIUAAAAUBwkKAAAAKA4SFAAAABAcZCgAAAAgOIgQQEAAADFQYICAAAAiqN51Q0AeBG+w7YYXZc2oU2xxQAAgHnhCAoAAAAoDhIUAAAAUBwkKAAAAKA4SFAAAABAcXCRLJgEF5YCAIA5ST6Csm/fPmrbti15enqSSqWiDRs2COvy8vJo6NChVK1aNbK1tSVPT0+KiYmh69evi7Zx+/Ztio6OJgcHB3JycqKePXvSvXv3XrgzAAAA8HqQnKDk5ORQjRo1aO7cuXrr7t+/TydOnKCRI0fSiRMnaN26dXThwgV69913ReWio6Pp7NmztHPnTtq8eTPt27ePYmNj5fcCAAAAXiuST/G0atWKWrVqZXCdo6Mj7dy5U7Rszpw5VK9ePUpPTydvb286d+4cbd++nY4dO0Z16tQhIqLZs2dT69atacqUKeTp6SmjG/C6MHYqCaeRAADeLC/9ItmsrCxSqVTk5ORERESHDh0iJycnITkhIgoPDye1Wk1HjhwxuI3c3FzKzs4WvQAAAOD19VITlIcPH9LQoUOpc+fO5ODgQEREGRkZ5OrqKiqn0WjI2dmZMjIyDG5n/Pjx5OjoKLy8vLxeZrMBAADgFXtpCUpeXh5FRUURM9P8+fNfaFvDhw+nrKws4XXlypViaiUAAAAo0Uu5zbgwOfn7779p9+7dwtETIiJ3d3e6efOmqPzjx4/p9u3b5O7ubnB71tbWZG1t/TKaCgAAAApU7EdQCpOTlJQU+uOPP8jFxUW0PjQ0lO7cuUMJCQnCst27d1NBQQGFhIQUd3MAAACgBJJ8BOXevXt06dIl4X1qaiolJiaSs7MzeXh4UIcOHejEiRO0efNmys/PF64rcXZ2JisrKwoICKCWLVvSxx9/TAsWLKC8vDyKi4ujTp064Q4eAAAAICIZCcrx48epadOmwvtBgwYREVG3bt3o66+/pt9++42IiGrWrCmKi4+Pp7CwMCIiWrlyJcXFxVHz5s1JrVZT+/btadasWTK7AAAAAK8byQlKWFgYMbPR9c9aV8jZ2ZlWrVoltWoAAAB4Q+BhgQAAAKA4SFAAAABAcZCgAAAAgOIgQQEAAADFQYICAAAAioMEBQAAABQHCQoAAAAoDhIUAAAAUBwkKAAAAKA4SFAAAABAcZCgAAAAgOIgQQEAAADFQYICAAAAioMEBQAAABQHCQoAAAAoDhIUAAAAUBwkKAAAAKA4SFAAAABAcZCgAAAAgOIgQQEAAADFQYICAAAAiqN51Q2AV8N32BaDy9MmtDFzSwAAAPThCAoAAAAoDhIUAAAAUByc4gEowXCqDgBeVziCAgAAAIqDBAUAAAAUBwkKAAAAKA4SFAAAAFAcJCgAAACgOEhQAAAAQHGQoAAAAIDiIEEBAAAAxUGCAgAAAIqDBAUAAAAUBwkKAAAAKA4SFAAAAFAcJCgAAACgOEhQAAAAQHGQoAAAAIDiSE5Q9u3bR23btiVPT09SqVS0YcMG0XpmplGjRpGHhwfpdDoKDw+nlJQUUZnbt29TdHQ0OTg4kJOTE/Xs2ZPu3bv3Qh0BAACA14fkBCUnJ4dq1KhBc+fONbh+0qRJNGvWLFqwYAEdOXKEbG1tKSIigh4+fCiUiY6OprNnz9LOnTtp8+bNtG/fPoqNjZXfCwAAAHitaKQGtGrVilq1amVwHTPTjBkzaMSIERQZGUlERMuXLyc3NzfasGEDderUic6dO0fbt2+nY8eOUZ06dYiIaPbs2dS6dWuaMmUKeXp6vkB3AEou32FbjK5Lm9DGjC0BAHj1ivUalNTUVMrIyKDw8HBhmaOjI4WEhNChQ4eIiOjQoUPk5OQkJCdEROHh4aRWq+nIkSMGt5ubm0vZ2dmiFwAAALy+JB9BeZaMjAwiInJzcxMtd3NzE9ZlZGSQq6uruBEaDTk7OwtlnjZ+/HgaM2ZMcTYV4KUzdkQER0MAAJ6vRNzFM3z4cMrKyhJeV65cedVNAgAAgJeoWBMUd3d3IiLKzMwULc/MzBTWubu7082bN0XrHz9+TLdv3xbKPM3a2pocHBxELwAAAHh9FWuC4ufnR+7u7rRr1y5hWXZ2Nh05coRCQ0OJiCg0NJTu3LlDCQkJQpndu3dTQUEBhYSEFGdzAAAAoISSfA3KvXv36NKlS8L71NRUSkxMJGdnZ/L29qbPPvuMxo0bR5UqVSI/Pz8aOXIkeXp6Urt27YiIKCAggFq2bEkff/wxLViwgPLy8iguLo46deqEO3gAAACAiGQkKMePH6emTZsK7wcNGkRERN26daOlS5fSkCFDKCcnh2JjY+nOnTvUqFEj2r59O2m1WiFm5cqVFBcXR82bNye1Wk3t27enWbNmFUN3TIcLGAEAAJRLcoISFhZGzGx0vUqlorFjx9LYsWONlnF2dqZVq1ZJrRoAAADeECXiLh4AAAB4syBBAQAAAMVBggIAAACKgwQFAAAAFAcJCgAAACgOEhQAAABQHCQoAAAAoDhIUAAAAEBxkKAAAACA4iBBAQAAAMVBggIAAACKgwQFAAAAFAcJCgAAACgOEhQAAABQHCQoAAAAoDhIUAAAAEBxNK+6AfDifIdtMbg8bUIbM7cEAACgeOAICgAAACgOEhQAAABQHCQoAAAAoDhIUAAAAEBxcJEswBsGF1UDQEmAIygAAACgOEhQAAAAQHGQoAAAAIDiIEEBAAAAxcFFsgAmwIWlAADmhSMoAAAAoDhIUAAAAEBxkKAAAACA4iBBAQAAAMVBggIAAACKgwQFAAAAFAcJCgAAACgOEhQAAABQHCQoAAAAoDhIUAAAAEBxkKAAAACA4iBBAQAAAMVBggIAAACKU+wJSn5+Po0cOZL8/PxIp9NRhQoV6JtvviFmFsowM40aNYo8PDxIp9NReHg4paSkFHdTAAAAoIQq9gRl4sSJNH/+fJozZw6dO3eOJk6cSJMmTaLZs2cLZSZNmkSzZs2iBQsW0JEjR8jW1pYiIiLo4cOHxd0cAAAAKIE0xb3BgwcPUmRkJLVp04aIiHx9fennn3+mo0ePEtGToyczZsygESNGUGRkJBERLV++nNzc3GjDhg3UqVOn4m4SAAAAlDDFfgSlQYMGtGvXLrp48SIRESUlJdH+/fupVatWRESUmppKGRkZFB4eLsQ4OjpSSEgIHTp0yOA2c3NzKTs7W/QCAACA11exH0EZNmwYZWdnk7+/P1lYWFB+fj59++23FB0dTUREGRkZRETk5uYminNzcxPWPW38+PE0ZsyY4m4qAAAAKFSxH0FZu3YtrVy5klatWkUnTpygZcuW0ZQpU2jZsmWytzl8+HDKysoSXleuXCnGFgMAAIDSFPsRlMGDB9OwYcOEa0mqVatGf//9N40fP566detG7u7uRESUmZlJHh4eQlxmZibVrFnT4Datra3J2tq6uJsKAAAAClXsR1Du379ParV4sxYWFlRQUEBERH5+fuTu7k67du0S1mdnZ9ORI0coNDS0uJsDAAAAJVCxH0Fp27Ytffvtt+Tt7U1Vq1alkydP0rRp06hHjx5ERKRSqeizzz6jcePGUaVKlcjPz49GjhxJnp6e1K5du+JuDgAAAJRAxZ6gzJ49m0aOHEl9+/almzdvkqenJ33yySc0atQoocyQIUMoJyeHYmNj6c6dO9SoUSPavn07abXa4m4OAAAAlEDFnqDY29vTjBkzaMaMGUbLqFQqGjt2LI0dO7a4qwcAAIDXAJ7FAwAAAIqDBAUAAAAUBwkKAAAAKE6xX4MCL8Z32Baj69ImtDFjSwAAAF4dHEEBAAAAxUGCAgAAAIqDBAUAAAAUBwkKAAAAKA4SFAAAAFAcJCgAAACgOEhQAAAAQHGQoAAAAIDiIEEBAAAAxUGCAgAAAIqDBAUAAAAUBwkKAAAAKA4SFAAAAFAcJCgAAACgOEhQAAAAQHGQoAAAAIDiIEEBAAAAxUGCAgAAAIqDBAUAAAAUBwkKAAAAKA4SFAAAAFAcJCgAAACgOEhQAAAAQHGQoAAAAIDiIEEBAAAAxUGCAgAAAIqDBAUAAAAUBwkKAAAAKA4SFAAAAFAcJCgAAACgOEhQAAAAQHGQoAAAAIDiIEEBAAAAxUGCAgAAAIqDBAUAAAAU56UkKNeuXaOuXbuSi4sL6XQ6qlatGh0/flxYz8w0atQo8vDwIJ1OR+Hh4ZSSkvIymgIAAAAlULEnKP/99x81bNiQLC0tadu2bZScnExTp06lUqVKCWUmTZpEs2bNogULFtCRI0fI1taWIiIi6OHDh8XdHAAAACiBNMW9wYkTJ5KXlxctWbJEWObn5yf8PzPTjBkzaMSIERQZGUlERMuXLyc3NzfasGEDderUqbibBAAvwHfYFqPr0ia0MWNLAOBNUuxHUH777TeqU6cOffDBB+Tq6krBwcG0cOFCYX1qaiplZGRQeHi4sMzR0ZFCQkLo0KFDBreZm5tL2dnZohcAAAC8voo9Qbl8+TLNnz+fKlWqRDt27KA+ffpQ//79admyZURElJGRQUREbm5uojg3Nzdh3dPGjx9Pjo6OwsvLy6u4mw0AAAAKUuwJSkFBAdWqVYu+++47Cg4OptjYWPr4449pwYIFsrc5fPhwysrKEl5XrlwpxhYDAACA0hR7guLh4UGBgYGiZQEBAZSenk5ERO7u7kRElJmZKSqTmZkprHuatbU1OTg4iF4AAADw+ir2BKVhw4Z04cIF0bKLFy+Sj48PET25YNbd3Z127dolrM/OzqYjR45QaGhocTcHAAAASqBiv4tn4MCB1KBBA/ruu+8oKiqKjh49Sj/88AP98MMPRESkUqnos88+o3HjxlGlSpXIz8+PRo4cSZ6entSuXbvibg4AAACUQMWeoNStW5fWr19Pw4cPp7Fjx5Kfnx/NmDGDoqOjhTJDhgyhnJwcio2NpTt37lCjRo1o+/btpNVqi7s5AAAAUAIVe4JCRPTOO+/QO++8Y3S9SqWisWPH0tixY19G9QAAAFDC4Vk8AAAAoDhIUAAAAEBxkKAAAACA4iBBAQAAAMVBggIAAACKgwQFAAAAFAcJCgAAACgOEhQAAABQHCQoAAAAoDhIUAAAAEBxkKAAAACA4ryUZ/EAwJvNd9gWo+vSJrQxY0sAoKTCERQAAABQHCQoAAAAoDhIUAAAAEBxkKAAAACA4iBBAQAAAMVBggIAAACKgwQFAAAAFAcJCgAAACgOEhQAAABQHCQoAAAAoDhIUAAAAEBxkKAAAACA4iBBAQAAAMVBggIAAACKgwQFAAAAFAcJCgAAACgOEhQAAABQHCQoAAAAoDhIUAAAAEBxNK+6AQAARES+w7YYXJ42oY2ZWwIASoAjKAAAAKA4SFAAAABAcZCgAAAAgOIgQQEAAADFQYICAAAAioMEBQAAABQHCQoAAAAoDhIUAAAAUJyXnqBMmDCBVCoVffbZZ8Kyhw8fUr9+/cjFxYXs7Oyoffv2lJmZ+bKbAgAAACXES01Qjh07Rt9//z1Vr15dtHzgwIG0adMm+uWXX2jv3r10/fp1ev/9919mUwAAAKAEeWkJyr179yg6OpoWLlxIpUqVEpZnZWXRokWLaNq0adSsWTOqXbs2LVmyhA4ePEiHDx9+Wc0BAACAEuSlJSj9+vWjNm3aUHh4uGh5QkIC5eXliZb7+/uTt7c3HTp0yOC2cnNzKTs7W/QCAACA19dLeVjg6tWr6cSJE3Ts2DG9dRkZGWRlZUVOTk6i5W5ubpSRkWFwe+PHj6cxY8a8jKYCAACAAhX7EZQrV67QgAEDaOXKlaTVaotlm8OHD6esrCzhdeXKlWLZLgAAAChTsScoCQkJdPPmTapVqxZpNBrSaDS0d+9emjVrFmk0GnJzc6NHjx7RnTt3RHGZmZnk7u5ucJvW1tbk4OAgegEAAMDrq9hP8TRv3pxOnz4tWvbRRx+Rv78/DR06lLy8vMjS0pJ27dpF7du3JyKiCxcuUHp6OoWGhhZ3cwAAAKAEKvYExd7enoKCgkTLbG1tycXFRVjes2dPGjRoEDk7O5ODgwN9+umnFBoaSvXr1y/u5gAAAEAJ9FIukn2e6dOnk1qtpvbt21Nubi5FRETQvHnzZG/Pd9gWo+vSJrSRvV0AeL3gtwKg5DBLgrJnzx7Re61WS3PnzqW5c+eao3oAAAAoYfAsHgAAAFAcJCgAAACgOEhQAAAAQHFeyUWybwpckAcAACAPjqAAAACA4iBBAQAAAMXBKR4AKLGMnUbFKVSAkg9HUAAAAEBxcAQFAOAZcJQG4NXAERQAAABQHCQoAAAAoDg4xSMBDvUCAACYB46gAAAAgOIgQQEAAADFQYICAAAAioMEBQAAABQHCQoAAAAoDhIUAAAAUBwkKAAAAKA4SFAAAABAcZCgAAAAgOIgQQEAAADFQYICAAAAioMEBQAAABQHCQoAAAAoDhIUAAAAUBwkKAAAAKA4SFAAAABAcZCgAAAAgOIgQQEAAADFQYICAAAAioMEBQAAABQHCQoAAAAoDhIUAAAAUBwkKAAAAKA4SFAAAABAcZCgAAAAgOIgQQEAAADFQYICAAAAilPsCcr48eOpbt26ZG9vT66urtSuXTu6cOGCqMzDhw+pX79+5OLiQnZ2dtS+fXvKzMws7qYAAABACVXsCcrevXupX79+dPjwYdq5cyfl5eXR22+/TTk5OUKZgQMH0qZNm+iXX36hvXv30vXr1+n9998v7qYAAABACaUp7g1u375d9H7p0qXk6upKCQkJ1LhxY8rKyqJFixbRqlWrqFmzZkREtGTJEgoICKDDhw9T/fr1i7tJAABm5Ttsi8HlaRPavPQ6irsegFflpV+DkpWVRUREzs7ORESUkJBAeXl5FB4eLpTx9/cnb29vOnTo0MtuDgAAAJQAxX4EpaiCggL67LPPqGHDhhQUFERERBkZGWRlZUVOTk6ism5ubpSRkWFwO7m5uZSbmyu8z87OfmltBgAAgFfvpR5B6devH505c4ZWr179QtsZP348OTo6Ci8vL69iaiEAAAAo0UtLUOLi4mjz5s0UHx9P5cqVE5a7u7vTo0eP6M6dO6LymZmZ5O7ubnBbw4cPp6ysLOF15cqVl9VsAAAAUIBiT1CYmeLi4mj9+vW0e/du8vPzE62vXbs2WVpa0q5du4RlFy5coPT0dAoNDTW4TWtra3JwcBC9AAAA4PVV7Neg9OvXj1atWkUbN24ke3t74boSR0dH0ul05OjoSD179qRBgwaRs7MzOTg40KeffkqhoaG4gwcAAACI6CUkKPPnzyciorCwMNHyJUuWUPfu3YmIaPr06aRWq6l9+/aUm5tLERERNG/evOJuCgAAAJRQxZ6gMPNzy2i1Wpo7dy7NnTu3uKsHAACA1wCexQMAAACKgwQFAAAAFAcJCgAAACgOEhQAAABQHCQoAAAAoDhIUAAAAEBxkKAAAACA4iBBAQAAAMVBggIAAACKU+wzyQIAgHS+w7YYXJ42oY2ZWwKgDDiCAgAAAIqDBAUAAAAUBwkKAAAAKA4SFAAAAFAcXCQLAADFxtjFvkS44BekwREUAAAAUBwkKAAAAKA4SFAAAABAcZCgAAAAgOLgIlkAADBKqTPcKrVdUHxwBAUAAAAUBwkKAAAAKA5O8QAAvCFwWgRKEhxBAQAAAMXBERQAAHilcGQHDMERFAAAAFAcJCgAAACgODjFAwAAUExwuqr44AgKAAAAKA4SFAAAAFAcJCgAAACgOEhQAAAAQHGQoAAAAIDiIEEBAAAAxcFtxgAAAFAsivM2axxBAQAAAMVBggIAAACKg1M8AADwRpB6+sFY+WfFKFVJnOEWR1AAAABAcXAEBQAAoAQx15GdV33U5ZUeQZk7dy75+vqSVqulkJAQOnr06KtsDgAAACjEK0tQ1qxZQ4MGDaLRo0fTiRMnqEaNGhQREUE3b958VU0CAAAAhXhlp3imTZtGH3/8MX300UdERLRgwQLasmULLV68mIYNG/aqmgUAAGBWr/pUilK9kgTl0aNHlJCQQMOHDxeWqdVqCg8Pp0OHDumVz83NpdzcXOF9VlYWERFlZ2cTEVFB7n2jdRWWeZqxGGPl5cQUZ7vkxCi1L0ptl5wYpfZFqe2SE6PUvhRnu+TEKLUvSm2XnBil9kWp7TIlpvC/zGx0GwJ+Ba5du8ZExAcPHhQtHzx4MNerV0+v/OjRo5mI8MILL7zwwguv1+B15cqV5+YKJeIunuHDh9OgQYOE9wUFBXT79m1ycXEhlUolLM/OziYvLy+6cuUKOTg4mLRtpcagXejL69AXpbZLTgza9eb2RantkhPzqtvFzHT37l3y9PR87jZeSYJSunRpsrCwoMzMTNHyzMxMcnd31ytvbW1N1tbWomVOTk5Gt+/g4GDyTlR6DNqFvrwOfVFqu+TEoF1vbl+U2i45Ma+yXY6OjibFvpK7eKysrKh27dq0a9cuYVlBQQHt2rWLQkNDX0WTAAAAQEFe2SmeQYMGUbdu3ahOnTpUr149mjFjBuXk5Ah39QAAAMCb65UlKB07dqR//vmHRo0aRRkZGVSzZk3avn07ubm5yd6mtbU1jR49Wu90UEmMQbvQl9ehL0ptl5wYtOvN7YtS2yUnRqntMkTFbMq9PgAAAADmg4cFAgAAgOIgQQEAAADFQYICAAAAioMEBQAAABQHCQoAAAAoTomY6v5p77//vqTyWVlZNGLECHJxcTE5ply5cqTRvNzdk52dLXlWvrS0NMn1PH78WHJfpMbs2bOHvLy8yMLCwuSYkJAQ0ul0ktrl6+srqfydO3fIwcGB1GrTcnGVSkUeHh5kZWVlch0qlYoePXpElpaWLzXm1KlTZGdnJ6kv+fn5Jpd/kZi9e/eSt7e3yTFvvfWWpM+KSqUiV1dXyZ+X3NxcSbc5njp1isLDw8nGxsbkmIcPH5JWq5XULjkxFy9elPS5PHz4MAUHB0vqv9T9RUR06dIlSb8Vly9fptDQUEljKaddcmJcXV0ljf3evXspJCRE0li+yWOvUqnot99+o7Jly5pUvkQmKBs2bKCoqCiTP+Dr16+nPXv2mPb0RHryZOWCggLRc36eR6VSSY4pKCiQ/IegsA45fXmZMcwseX/JiSkoKKAZM2aYNFUyM9NHH31E/fv3pwoVKphUvm/fvpScnEyff/452dnZmRQzYcIEevTo0UuPOXnypOS+PHz4UNL+khtTvXp1yZ/9Xr16Ubly5UyqY8KECXTy5ElJ3/tVq1ZRXl6epJi//vqLHB0dTf6Hw/79+yk/P59CQ0NN/gPyIjFS+nLjxg2qVauWydOKy9lfhTFSPsdjxowhCwsLs7RLToyUcTlx4gQRkVk+L6/D2E+YMIFyc3NN2j5RCZ0HRa1WU0ZGBrm6uppUXqVS0fr16yk4OPi5ZZmZgoKC6P79+/S///2PnJ2dTYpp3bo1PXz4UFJM06ZNad68eRQYGCipjqNHj1KZMmUk9eVlx/j5+dGRI0eoXr16zy1PRGRvb085OTmy9rHUsZfTLil1mCtG6X2R+tlXYl+Uvo9fh74otV2vU1+U2i57e3tKSkqi8uXLm1S+RB5BiY+PN+mHsFBwcDCFhoaaPEtt48aN6cyZM9S4cWOTTwuVL1+esrOzJcVYWlpSw4YNqXr16ibX4eDgQBUrVnzmwxKLaty4MWVlZb30mLJly1KpUqVMKktE1LVrV9q6davkfbxt2zaTvwxEZPIRoEJ3796lv//+26TErFBycjLl5eW99Jj09HSTngBa6O7duyaXfdEYPz8/SWNZqVIlgw8GNSY5OZlSUlIkfe+3bdtGDx48kBTz5Zdfkr+/v8nlv//+e7p3757J/1J9kRhnZ2dJfZk1axZVrVrV5PJy9lfh91HK53jt2rVUo0aNl94uOTHnz5+XNC6ffPIJVaxY0eTyb/rYJycnS/oNK5FHUAAAAOD1ViKPoBSVkZFBR44coYyMDCIicnd3p5CQEEn/OoOXo/Bc44s8i8GYR48e0YYNG+jQoUOisW/QoAFFRkbqnd+VWr7Q0aNH9WJCQ0Ofeej0ZcfI6Yu5YuSQs7/kfO+lxjx+/JjOnj0rKh8YGPjMC5vNFSO1L+bYX0TSx9Jc7ZITI3VcMPbSv8fPxSXUvXv3ODo6mi0sLFij0bCrqyu7urqyRqNhCwsL7tq1K+fk5Ihizp49y3369OGaNWuyu7s7u7u7c82aNblPnz589uxZg/X8888/PHHiRG7Xrh3Xr1+f69evz+3ateNJkybxzZs3iyVGTh1y+mKOmN9//51btWrFTk5OrFarWa1Ws5OTE7dq1Yp37txZLPsrJSWFy5cvz1qtlps0acJRUVEcFRXFTZo0Ya1WyxUrVuSUlBTZ5ZmZMzMzuVGjRqxSqdjHx4fr1avH9erVYx8fH1apVNyoUSPOzMw0e4ycvpgrRupYytlfcr73UmPy8/P5q6++YicnJ1apVKKXk5MTjxgxgvPz80V1mCtGal/Msb/kjKW52iUnRuq4YOylf49NVWITlJ49e3KlSpV4+/bt/PjxY2H548ePeceOHVy5cmXu1auXsHzr1q1sZWXF9evX59GjR/O8efN43rx5PHr0aG7QoAFbW1vz9u3bRXUcPXqUS5UqxWXLluVu3brxkCFDeMiQIdytWzcuV64cOzs787Fjx14oRk4dcvpijpilS5eyRqPhTp068ZIlS3jr1q28detWXrJkCXfu3JktLS15+fLlL7yPw8PDOTIykrOysvQ+F1lZWRwZGclvv/227PLMzO3bt+fQ0FA+f/68Xsz58+e5QYMG3KFDB7PHyOmLuWKkjqWc/SX1ey8nZvDgwVymTBlesGABp6am8v379/n+/fucmprK33//Pbu6uvKQIUNEdZgrRmpfzLG/mKWPpbnaJSdG6rhg7KV/j01VYhMUJycnPnDggNH1+/fvZycnJ+F99erVeeTIkUbLjx49mqtVqyZaFhISwrGxsVxQUKBXvqCggGNjY7l+/fovFCOnDjl9MUdMpUqVeM6cOUbLz507lytWrChaJqf/Op2OT58+bbSeU6dOsU6nk12emdnOzo5PnDhhNOb48eNsZ2dn9hg5fTFXjNSxlLO/pH7v5cS4ubnpJetFbd++nV1dXUXLzBUjtS/m2F/M0sfSXO2SEyN1XDD20r/HpiqxM8kWFBQ88xy4lZUVFRQUCO8vXrxI0dHRRst37tyZUlJSRMuSkpJo4MCBBud3UKlUNHDgQEpMTHyhGDl1yOmLOWLS09MpPDzcaPnmzZvT1atXRcvk9N/JyemZE9alpaWJ7j6SWp7oyXUz2dnZRmPu3r2rd22NOWLk9MVcMVLHUs7+kvq9lxNz9+7dZ95p4OHhQTk5OXptNUeM1L6YY38RSR9Lc7VLTozUccHYS/8em0xWWqMAXbp04eDgYIOZ24kTJ7h27docHR0tLPP39+epU6ca3d7UqVO5SpUqomW+vr68bNkyozHLli1jHx+fF4qRU4ecvpgjplatWjx48GCj5YcMGcK1atUSLZPT/5EjR3KpUqV42rRpnJSUxBkZGZyRkcFJSUk8bdo0dnZ25tGjR8suz8zct29f9vHx4XXr1olOc2RlZfG6devY19eX4+LizB4jpy/mipE6lnL2l9TvvZyY1q1b89tvv83//POPXvl//vmHW7ZsyW3atBEtN1eM1L6YY38xSx9Lc7VLTozUccHYS/8em6rEJii3b9/mli1bskqlYmdnZ/b392d/f392dnZmtVrNrVq14v/++08ov3btWtZoNNy2bVueOXMmr169mlevXs0zZ87kd999l62srPjXX38V1TFnzhy2trbm/v3788aNG/nw4cN8+PBh3rhxI/fv3591Oh3PnTv3hWLk1CGnL+aIiY+PZ1tbW65WrRoPHDiQJ0yYwBMmTOCBAwdy9erV2c7Ojvfu3fvC+5iZecKECezh4cEqlUq4GFelUrGHhwdPnDjxhcs/fPiQe/fuzVZWVqxWq1mr1bJWq2W1Ws1WVlbcp08ffvjw4SuJkdoXc8VIHUs5fZf6vZcTk56ezkFBQazRaDg4OJhbtmzJLVu25ODgYNZoNFy9enVOT08X1WGuGKl9Mcf+kjOW5mqXnBip44Kxl/49NlWJnwfl3LlzdPjwYb1bmwxNtnTw4EGaNWuWwVuhBgwYQKGhoXoxa9asoenTp1NCQgLl5+cTEZGFhQXVrl2bBg0aRFFRUS8cI6cOOX0xR0xaWhrNnz/f4Jj07t3b4LN05PS/0OXLlykzM1Oox8/Pz2hZOeWzs7Pp+PHjopjatWs/c2prc8VI7Ys5YuSMpZy+S/ney4kpKCigHTt2GCz/9ttvG3xEhbli5PT/Ze+vQlLH0lztkhojdVww9vK+x89T4hMUc8nLy6Nbt24REVHp0qVNesib1Bg5dbxO3vT+v04wlgDwokp0giJ3IqmsrCxReVOnHZYz8ZjUGKnl5fTlZcc8PfmQh4cHBQQEmPRHytT+Jycn05w5cwwe2YmLi9N7vpHU8kREt27dosWLFxv8fHXv3t3gFM/miJHTF3PFFGXKWMrZX+aadM7QxFMNGjSgunXrGu2POWLMMUmhnBipY6n0CQeljgvGXtr32CSyTgwpgJyJpBYuXMgBAQGi8+lqtZoDAgL4xx9/NFiPnInHpMbIqUNOX152jJzJh+T0X+r8LEqdA0dOjFLnwJEzlnL2lzkmnVPqJH1y+mKuSfqkjqWSJxyUOi4Ye+nfY1OV2ARF6kRSkyZNYhsbGx42bBjHx8dzcnIyJycnc3x8PA8fPpxtbW158uTJou3ImXhMaoycOuT0xRwxciYfktN/qfOzKHUOHDkxSp0Dh1n6WMrZX+aYdE6pk/TJ6Yu5JumTOpZKnnBQ6rhg7KV/j01VYhMUqRNJeXt785o1a4yWX716NXt5eYmWyZl4TGqMnDrk9MUcMXImH5LTf61Wa/CLXej8+fOs1Wplly+MOXfunNGYc+fOvZIYuX0xR4zUsZSzv8wx6ZxSJ+ljNs8khXJipI6lkicclDouGHvp32NTldiJ2qROJHXz5k2qVq2a0fLVqlUTLuorJGfiMakxcuqQ0xdzxMiZfEhO/319fWnLli1GY7Zs2UI+Pj6yyxM9OX969OhRozFHjx4lNzc3s8fI6Yu5YqSOpZz9ZY5J55Q6SR+ReSYplBMjdSyVPOGg1HHB2Ev/HptMVlqjAFInknrrrbc4JiaG8/Ly9Lb1+PFjjomJ4caNG4uWy5l4TGqMnDrk9MUcMXImH5LTf6nzsyh1Dhw5MUqdA0fOWMrZX+aYdE6pk/TJ6Yu5JumTOpZKnnBQ6rhg7OXNZWWKEpugMEubSCopKYnd3d3ZxcWF33vvPe7duzf37t2b33vvPXZxcWEPDw+9Q1tyJh6TGiOnDjl9MUeMnMmH5PSfmfnAgQPcsWNH9vb2ZisrK7aysmJvb2/u2LEjHzx48IXLMz85hRUSEsIajUa42Fej0XBISIjRU1/miJHTF3PEyBlLOfvrZU86p+RJ+uT031wT+0kdS6VOOCh1XDD28r7HpijRtxkXSk1NFd3aZGwiqbt379KKFSsMTkDTpUsXgxPKyJl4TGqMnDrk9MUcMXImH5LTf3Myxxw4cmOURu5Yyum7qd97uTHZ2dmUkJAgKm/KhHvmiJHaFznl5cZIHUs5kweaoy9SxwVjX/y/Ya9FggKgZHv27KGQkBDS6XQvZfu5ubl09epVKleunPyHcpkoMzOTmJnc3d2Lfdty5hlSOmY2+PBEeP1h7F9cib1I9nmuXLlCPXr0eCnbzszMpPT0dEkxY8aM0bsI9Vny8vJMLvv48WPauXMnLVq0iHbt2iVMMV5UQkKCydsrKj8/ny5fviw8wTI3N5fWrl1Lq1evFv7V87TLly/T8uXLaeLEiTR58mRat27dMy8IK+xDUlIS7dixg3bs2EGnTp2StA+KOnfuHJUvX160bOvWrdSrVy8aMmQInTt3TrTuv//+o2bNmult58cff6Ru3brRkiVLiOjJNO4BAQFUvnx5Gj16tMntefvtt41eeHbz5k3R+8TEROrWrRs1bNiQOnToQHv27BGtX7p0KR06dIiIiB4+fEg9e/YkW1tbqly5MtnZ2VHv3r2FP/SF7O3tqWfPnnTw4EGT23z79m3q0KEDeXt7U58+fSg/P5969epFHh4eVLZsWWrQoAHduHHDaHx6ejodOXKEjh07Rv/++6/Rcjt37qTWrVtTqVKlyMbGhmxsbKhUqVLUunVr+uOPP0xubyFj3/sbN27QihUraOvWrfTo0SPRupycHBo7dqxo2blz52jJkiV0/vx5IiI6f/489enTh3r06EG7d+82uT3W1tZ6nzdjcnJyaMmSJfTVV1/RnDlzDO63EydOUGpqqvD+p59+ooYNG5KXlxc1atSIVq9eLSrftm1b+umnn+jBgwcmt5mIaM6cORQTEyNs76effqLAwEDy9/enL7/8kh4/fqwXk5SURDExMVS+fHnS6XRka2tL1apVo5EjRxr8/icnJ1Pfvn0pODiYPDw8yMPDg4KDg6lv376UnJwsqb1ExTf2RMUz/hh742NvMtknhxQuMTGR1Wq18P7Ro0c8ePBgrlChAtetW5cXLVokKp+RkSEqz8ycnZ3N0dHR7O3tzTExMZybm8t9+/YVzs01btxY737xrKwsvdedO3fY0tKSjxw5IiwrtGbNGs7NzRXez549m729vVmtVrOLiwuPGTNGr29xcXG8adMmZma+cuUK+/v7s4WFBbu5ubGFhQVXq1aNr169KopRqVRcoUIF/vbbb/natWsm7cOkpCT28PBgtVrNQUFBwjUmtra2bGdnx6VKleKjR48K5e/du8cdOnQQzkGq1Wp2d3dnCwsLtrOzM3gLqtzJ3Z7l6bFfuXIlW1hYcJs2bbhRo0as1Wp5xYoVwnpDYz99+nS2tbXl999/nz08PHjcuHHs4uLC48aN4zFjxrCDgwN///33opjg4GCDL5VKxQEBAcL7otRqtTAh04EDB9jS0pKbNGnCgwcP5hYtWrBGoxFdt+Hn58eHDx9mZuYvvviCfX19ed26dXzu3DnesGEDV65cWe9CVZVKxVWrVmWVSsX+/v48ZcoUvnnz5jP3YY8ePTgoKIhnz57NTZo04cjISK5evTrv37+fDx48yHXr1uWYmBi9uLlz5wqf36Kvhg0b8vHjx0Vl5cyB8zxPjz3zk4mknJyc2MHBgXU6HVesWJHPnDkjrH96/Ldt28ZWVlbs7OzMWq2Wt23bxmXKlOHw8HBu1qwZW1hY8K5du0R1DBw40OBLrVZzTEyM8L6ogIAA/vfff5n5yfVbPj4+7OjoyHXr1mVnZ2d2dXXly5cvi2KqV68uTHi3cOFC1ul03L9/f54/fz5/9tlnbGdnJ/ptK7wWwNHRkXv37q03BoZ88803bG9vz+3bt2d3d3eeMGGC8Nn/7rvvuEyZMjxq1ChRzPbt21mn03H79u25a9eubGNjw3FxcTx06FCuWLEiV6hQgW/cuCGUlzsR4LMUx9gzSx9/jL20sZeixCYoGzdufOZr+vTpog/e6NGj2c3NjSdPnsxfffUVOzo6cmxsrLA+IyODVSqVqI64uDj29/fnWbNmcVhYGEdGRnJQUBDv37+f9+7dy4GBgfzll1+KYp7+YX56BtbC/xYtX/gHavHixazVannUqFG8ZcsWHjduHNva2vLChQtFdbi5uQkXp0ZFRXF4eLhw58y///7L77zzjt4kPyqVij/++GN2dXVljUbDbdq04fXr1/Pjx4+N7uOIiAju0KEDnz59mgcMGMABAQH8wQcf8KNHjzgvL4+7du3K4eHhQvnY2Fhu2LAhnz59mlNSUrhDhw48ZMgQzsnJ4UWLFrGNjQ2vXLlSVIecyd2M/SAUvrp27SraxzVr1uSZM2cK79esWcO2trbCTLiGfqT8/f2Ftp44cYI1Go1o5twff/yRa9euLYrRaDTcsmVL/vrrr4XX6NGjWa1Wc9++fYVlT49L4fi3aNGCe/ToIVo/YMAAbtasmfDe2tqa//77b2Zmrly5Mm/btk1Ufu/evezt7W2wjsTERI6Li2NnZ2e2srLi999/n7du3WpwgiUPDw8+cOCAsH9UKhX//vvvwvr9+/dz2bJlRTGTJ09mT09Pnj17tjAD8dixY3nbtm384Ycfso2NjWhGSTlz4Ej93jM/mXzqo48+4vz8fM7OzuY+ffqwi4uLMA/F0+MfGhrKX331FTMz//zzz1yqVCnR93zYsGHcokULvX1cs2ZNDgsLE71UKhXXrVuXw8LCuGnTpnoxhWMfHR3NDRo04Dt37jAz8927dzk8PJw7d+4sitHpdJyWlsbMTxLiH374QbR+5cqVHBgYKKrj7NmzPH36dK5WrRqr1WquUaMGz549m2/fvm1wv1eoUIH/97//MfOTP/oWFhaihH7dunV641KzZk2eP3++8P73339nf39/Zn7yj8PmzZtz9+7dhfVyJgI0x9gzSx9/jL20sZeixCYoRf/gG3sV/eBVrFhROOrA/GRK34oVK3L37t25oKDA4AfVy8uLd+/ezczM165dY5VKJdrG5s2buUqVKqKYsmXLcps2bXj37t28Z88e3rNnD8fHx7OFhQUvWbJEWFa0H4Uf1Hr16vGkSZNE25s3b57ev7q1Wq2QXZcrV46PHDkiWn/69GkuXbq03v7KzMzkvLw8/vXXX7l169bCUZchQ4bwhQsX9PZxqVKlODk5mZmZ79+/zxYWFqK6zpw5wy4uLsL70qVLi7L027dvs1ar5ZycHGZ+cjtazZo1RXXImdxNrVZzrVq19H4QCl916tQRjaWtra3ev0Z2797NdnZ2PH/+fINjr9PphESA+UliUPRfXikpKezk5CSK2b9/P1eoUIFHjRolOuqj0Wj47NmzBvtXdPw9PDz40KFDovVnzpwRjaWPj4/wmSxbtqzeFNLJyclsa2trtA7mJ3cQrFq1ips3b85qtZrLlSun98fCxsZG+DFkZra0tBTdsXX58mW9enx9fXnr1q3C+wsXLrCLi4twm3r//v1FP+zW1taSJ4OT+r1nfvI5fvrzPX78eOEI4NPj7+DgIEznnZ+fzxqNRjSp1unTp9nNzU1ve35+fnpHVkwd+/Lly4sSQOYnR9SenjzRxcVF+I65urpyYmKiaP2lS5dEE2k9PfZHjhzh2NhYdnR0ZJ1Ox507d9Zr89OffUtLS9FnPy0tjW1sbEQxWq2WU1NThfcFBQVsaWnJ169fZ2bmffv2cZkyZUTllTj2zNLHH2MvbeylKLEJiqenJ2/YsMHo+pMnT4o+eDqdTrQTmZmvXr3KlStX5ujoaL527ZreB9Xa2lp0W6yNjY3ow25osP79919u164dN23aVHSaxdiHVaVSCYfbS5cubfBDZ29vL1pWvXp1Xr16NTM/OVT49DNODh48yM7Oznr1PP1sh6tXr/LYsWO5fPnyrFar+a233hKtd3Jy4osXLzLzk0zYwsKCExIShPXnzp3jUqVKGSxfGKPRaIT+Xbx4Ue9Hx8bGhk+dOqW3XwolJSXp/SGsXLky//TTT0Zjnh57Q3/4mZn37NnDdnZ2/NVXX+mNvYuLi5CcMT9JBIv+wU5JSdGb6ZGZ+c6dO9ypUycOCQnhS5cuMfPzf6guXbrEWVlZ7Ofnpze75KVLl0SfsS+//JJDQ0P5v//+42HDhnHbtm357t27zMyck5PDUVFRelNRFz1K97TU1FQeMWKE3o9hjRo1hKMbW7duZXt7e546daqwfv78+RwUFCSKsbGx0fuh0mg0wg9VYmKiaJ/JmQNH6vee+ckfqaSkJL2ykydPZicnJ163bp1eglI4dsxPZv3866+/hPdpaWkGZ8Y8evQoV65cmT///HN+9OgRMz9/7Au/G56ennq3+Ruqp2vXrtyzZ09mZv7ggw94xIgRovXfffed6MiDoe8985PPypIlS7hRo0Z6+8vPz084Mnfx4kVWq9W8du1aYf2WLVvY19dXFFOhQgXRPzRSUlLYwsJCOH19+fJl0R9Pf39/0efpaVOnTtX7x585xp5Z3vhj7E0feylKbILStm3bZx4iTExMFJ2y8fPz4z/++EOv3LVr17hy5crcokULvcHy9PQU/UHu3LmzaMDPnDkj+gNd1Lx589jT05NXrVrFzM9OUJYvX84bN27kcuXK6c0vcebMGXZwcBAtW7JkCZcrV47j4+N5+fLlHBAQwH/88Qdfu3aNd+/ezdWqVeNevXqJYp71R4qZ+Y8//uAuXbqIljVv3px79uzJV69e5TFjxnDFihX5o48+Etb37dtXlNS0aNGC+/XrJ7yfPHkye3h4CO9PnDihd2RHzuRuXbp04c8++8xoX54e+8jISL3zpoUK5+54euwbNmwoJIGGbNq0Se8PdFGLFy9md3d3/v7779nS0vKZP1RFTwM+fdh248aNokOqubm5/O6773KpUqW4RYsWrNVq2cbGhitVqsS2trbs7e2t9y9GYz9URT19mmfFihVsYWHBFStWZGtra/7ll1/Y09OTo6KiuFOnTmxlZaV3eqZmzZqi9u/atYttbGyEbZ8/f16UbMuZN0Xq9575yYSDRQ9BFzVx4kS2trYWjX/16tVFp85Onz4tmqxw37597OfnZ3B7d+/e5ZiYGK5evTqfPn36uWNfrVo1Dg4OZjs7O72J7/bu3at3Gu3atWvs6+vLjRs35kGDBrFOp+NGjRrxxx9/zI0bN2YrKyvesmWLqI7njf3Tn5cRI0ZwmTJluFevXuzn58fDhg1jb29vnj9/Pi9YsIC9vLz0rqkYM2YMlytXjufPn8+LFy/moKAgfu+994T169atE51+kDMRoDnGnln++GPsTRt7KUpsgrJv3z698+9F3bt3T3QqpWfPnnrn9wtdvXqVK1asqPdBbdmyJS9YsMBoHUuWLOEGDRoYXX/27FmuUaMGd+7c+ZkJStHXuHHjROt//PFHvVM8zE/+hWFjY8M6nU6Y7Kfw1a5dO+Ff1UXred6H9WlHjx5lFxcXVqvVXKZMGT5z5gyHhISwu7s7e3p6sk6nEyV9CQkJ7OzszO7u7sLkXj///LOwfs6cOXoXVsqZ3O3GjRuioxnPs2fPHv7uu++Mrt+9e7feOdL9+/fzyZMnjcbMnTuXZ8+e/cx6L168yHXr1hXOBRtrW9HX0z8YM2bM0Dvtx/zkQr6+fftyy5Yt+e233+Zu3brxDz/8wPfu3dMr+/XXXwun2aTYv38/T5kyRbgW5ezZs/zhhx9y+/bteenSpXrl16xZw5aWlhwVFcUxMTFsZ2fHw4YNE9YvWLCAQ0NDRTGpqak8ZMgQbty4MVeuXJkrV67MjRs35qFDh+od8WSW/r1nfnJBYdeuXY3GTJgwQfSvwvnz5/PmzZuNlh8+fLjwL1ljfv75Z3Zzc2O1Wm107Iteq/T111/rner84osvuFOnTnpx//33Hw8dOpQDAwNZq9WylZUV+/j4cJcuXfRO+YWFhfF///33zLY+LT8/n7/99lt+5513+LvvvuOCggL++eef2cvLi11cXLh79+56n7O8vDweMmQIe3p6souLC3fp0kX0j44jR47oJZtSJwI0x9gzv/j4Y+yfP/amemPmQfn777/p/PnzFBERYXD99evXaefOndStWzdh2e3bt0mtVus9e6DQtm3bSKfTUVhYmNF6Hz16RMOGDaP4+Hhat26dSZPdFLV582aytLQ02O47d+7Qzp07hduAPTw8qGHDhlSpUiW9snv37qWGDRuSRqORVH9OTg6dP3+eqlSpQnZ2dvTw4UNauXIlPXjwgFq0aEFVqlQRlb9x4wZt3ryZcnNzqVmzZhQYGPjcOuRM7lZSFBQU0N27d8nBweGNmBNh27ZttGLFCsrNzaWIiAj6+OOPhXWFt066uLi8quaZ1dWrVykhIYHCw8PJ1tb2VTcHzKhw7Js3b052dnavujkl1huToAAY8/jxY7p+/Tp5e3u/6qa8Em96/0E5mJkKCgrIwsLitahHiUrSPi65/zSFN0JOTg7t27dPUkxSUpKkL8XZs2clH9mSWoe5YuTUYa7+P378WG+Cw3nz5lF4eDhFRUXRrl27ROtu3bqlN+FeYd3jxo2jefPm6U1+mJ2dbXCyrqIT9RVOvlXI0ER9cupQaozUvsttl5TJEB8/fkwjRoygJk2aCJMeTp48mezs7MjGxoa6deumN6kakfTJE81Vj5xJHV92jNL3sUlknRgCMBNDky+ZEvP0xXKvug5zxcitw1z9L1rPzJkz2cbGhvv168ddu3ZlKysr0bVChm4B3bFjB1tZWXHVqlXZ29ubXVxchNuujcVInahPTh1KjZEzSaE59vGIESPYzc2NBw0axIGBgdy7d2/28vLiFStW8LJly7hs2bJ6D6aTM3miOeqR0y5zxCh5H5sKCQoomqE/nu+9994zX82aNRPFGJvhtfDl7+//wnWYK0ZOHebqv9SxDAwMFE3cd+DAAS5Tpoxwp4axSbQKJ80qKCjgiRMnsp2dnXDxpKEYqRP1yalDqTFyJik0xz4uX768MKdUSkoKq9Vq0V1za9as0btLTs7kieaoR067zBGj5H1sKlyDAq+Us7PzM9fn5+fTvXv3RM8XsrS0pBYtWpCbm5vBmNu3b9PmzZuFGK1WS506dTJ6GuPGjRu0cOHCF6rDXDFy6jBX/2vVqmWwbKEHDx7QxYsXhRgbGxtKTk4WPeH4zJkzFB4eTh999BF99tln5OnpKarD0dGRTpw4QRUqVBCWrVq1imJjY2n16tVUt25dvRg7Ozs6ffq0qP/x8fH07rvv0uTJk+m9994TxcipQ6kxUvturn2s0+no4sWL5OXlJbw/efIk+fv7E9GTJ+nWqFFD9BwXGxsbOn/+vHCtlFarpYSEBKpatSoREV26dInq1q1L//33nxBjjnrktMscMUrex6aSdktHCbNv3z6qUaMGOTo6vuqmgBG5ubnUp08fqlatmsH1f//9N40ZM0a0LCAggNq3b089e/Y0GJOYmEibN28W3gcFBVFISAj16dPHaPmFCxe+UB3mipFTh7n6n5yc/NxE6OLFi8L70qVL05UrV0QJSlBQEO3evZuaNWtG169f19uGtbU13blzR7SsS5cupFarqWPHjjR16lS9GAcHB8rMzBS1q2nTprR582Z655136OrVqy9ch1JjpPZdbruk1uPo6Eh37twR/qjVqlWL7O3thfW5ubl6d73Z2NhQTk6O8L5MmTJ6d8g8/SA7c9Qjp13miFHyPjaZrOMuJYRKpWJnZ2eeMmWKSeV9fX25R48eJj9Mj5m5adOmPHbsWEnzTEiNMUcdzObp/9N1NGjQgGfMmGG0vKFTPN27d+e+ffsajUlOThbNbdC/f38eMGCA0fKXLl3isLCwF6rDXDFy6jBX/2vXrs3z5s0zGvP0TJ+dO3c2OuHemTNnuEyZMnpj36JFC548ebLBmFWrVrGlpaVejNSJ+uTUodQYOZMUmmMfN23a1OBcOoXWrl2rdypBzuSJ5qhHTrvMEaPkfWyq1zpBSUtL4927dz9zOu2iRo8ezd26ddP74X2Wbt26cZMmTfSmCi/OGHPUwWye/j9dx7fffqv3AL2i0tPT9SZRe/jwoayJx6SQU4c5YszRd7n1SE2EkpKSePHixUbLnz59Wu+zsW7dumfOIrxy5Uq9ZEvqRH1y6lBqjJxJCs2xjy9cuKD3fKyn61izZo1omZzJE81Rj5x2mSNGyfvYVLgGpZhkZ2eTg4PDS40xRx1ymaseAAB4M5T4BOXx48d09uxZ0QykgYGBZGlp+YpbBgAAAHKV2ItkCwoKaNSoUTR37lzKysoSrXN0dKS4uDgaM2aMaJr05ORkmjNnDh06dEhvSvW4uDiD07LfunWLFi9erBfToEED6t69O5UpU+aFY8xRh7n6L6cOAACAp5XYIyhDhgyhpUuX0jfffEMRERHC7ZCZmZn0+++/08iRI6l79+40ceJEInryjJB27dpRrVq19Mrv3LmTEhISaOPGjaJn3hw7dowiIiLIxsaGwsPDRTG7du2i+/fv044dO6hOnTqyY8xRh7n6L6cOAAAAg2RduaIAbm5uek+ALGr79u3s6uoqvK9evfozH9U9evRorlatmmhZSEgIx8bG6j2KnvnJBEaxsbFcv379F4oxRx3M5um/nDoAAAAMKbEJio2NDZ86dcro+qSkJLa1tRXea7VaPn/+vNHy58+fZ61WK1qm1Wr53LlzRmPOnTv3wjHmqKMw5mX3X04dAAAAhpTYhwWGhYXRF198ofcgK6In100MHTqUwsLChGW+vr60ZcsWo9vbsmUL+fj4iJa5u7vT0aNHjcYcPXpUb6ZNqTHmqIPIPP2XU8fL0qNHD/rpp59MLt+sWTP65ptv6P79+y+tDnPFyKnDXP2XSk67xo4dS3/++aekeqT2RU4dSo2RM47m2MdKbZecejD2Mn8rXnWGJFd6ejoHBQWxRqPh4OBgbtmyJbds2ZKDg4NZo9Fw9erVOT09XSi/du1a1mg03LZtW545cyavXr2aV69ezTNnzuR3332Xrays+NdffxXVMWfOHLa2tub+/fvzxo0b+fDhw3z48GHeuHEj9+/fn3U6Hc+dO/eFYsxRh7n6L6cOU8iZQK5Jkybs4+PDNWrUMKm8nHljpNZhrhg5dZir/1In9pPTLl9fX9bpdPzOO++YHCO1L3LqUGqMnHE0xz5Warvk1IOxl14Pcwk+xcPMnJ+fz1u3buVRo0ZxbGwsx8bG8qhRo3jbtm2cn5+vV/7AgQPcsWNH9vb2ZisrK7aysmJvb2/u2LEjHzx40GAdq1ev5pCQENZoNKxSqVilUrFGo+GQkBCjk89IjTFHHebqv5w6nkfOBHKFzp49K6l8VlbWS6/DXDFy6njZ/ZeTcDBLb9f9+/d5y5YtkmKYpfVFTh1KjpH6eTHHPpZT3lztkloPxl56PSX2Lh5zy8vLE04nlS5d2qR5VqTGmKMOucxVD7wZMLEfADxPiUxQ0tPThactmuLatWtUtmxZ4X1WVpZojg5THyaYm5tLRE8epmUqqTHmqMMc/Zdbh6kePXpEGzZsMDg/S2RkJFlZWYnKy5k3Rmod5oqRU4e5+i+VnHYRPbn+ydBcO/Xq1TNYXk5fpNah1Bi54/iy97FS2yW3Hoz9S/itkHyMRgFcXV05NjaWjx49arTMnTt3+IcffuCqVavyzJkzmZl54cKFHBAQwGq1mtVqNatUKlar1RwQEMA//vijwe38/vvv3KpVK3ZychLinJycuFWrVrxz585iiTFHHebqv5w6zp49y3369OGaNWuyu7s7u7u7c82aNblPnz4GDwmmpKRw+fLlWavVcpMmTTgqKoqjoqK4SZMmrNVquWLFipySkiKUP3r0KJcqVYrLli3L3bp14yFDhvCQIUO4W7duXK5cOXZ2duZjx469UB3mipFTh7n6z8z8zz//8MSJE7ldu3Zcv359rl+/Prdr144nTZrEN2/efOF2ZWZmcqNGjVilUrGPjw/Xq1eP69Wrxz4+PqxSqbhRo0acmZn5Qn2RU4dSY+SMozn2sVLbJacejL283wpTlMgE5datWzxw4EB2dHRkNzc3bt26Nffq1Yvj4uI4Ojqag4OD2crKiuvXry+cJ5s0aRLb2NjwsGHDOD4+npOTkzk5OZnj4+N5+PDhbGtrq/cEz6VLl7JGo+FOnTrxkiVLeOvWrbx161ZesmQJd+7cmS0tLXn58uUvFGOOOszVfzl1bN26VRir0aNH87x583jevHk8evRobtCgAVtbW+vNdxMeHs6RkZEGr0vIysriyMhIfvvtt4VlcuaNkVqHuWLk1GGu/ktNOOS0q3379hwaGmrwdvbz589zgwYNuEOHDi/UFzl1KDVGzjiaYx8rtV1y6sHYS6/HVCUyQSl0//59/uWXX3jAgAHcrl07joiI4OjoaJ4yZQqfPn1aVNbb2/uZT1RcvXq13oV7lSpV4jlz5hiNmTt3LlesWPGFYsxRB7N5+i+nDjmTu+l0Or3xLerUqVOs0+mE93LmjZFah7li5NRhrv5LTTjktMvOzo5PnDhhNOb48eNsZ2f3Qn2RU4dSY+SMozn2sVLbJacejL30ekxVYudBISLS6XTUoUMHmjFjBq1fv562b99OK1asoM8//5yCgoJEZW/evEnVqlUzuq1q1arpzamSnp5O4eHhRmOaN29OV69efaEYc9RBZJ7+y6nj4sWLFB0dbTSmc+fOlJKSIlrm5OREaWlpRmPS0tLIyclJeC9n3hipdZgrRk4d5up/UlISDRw4kFQqlV55lUpFAwcOpMTExBdql7W1NWVnZxuNuXv3rt41UlL7IqcOpcbIGUdz7GOltktOPRh76fWYTFZaUwK99dZbHBMTw3l5eXrrHj9+zDExMdy4cWPR8lq1avHgwYONbnPIkCFcq1atF4oxRx3M5um/nDr8/f156tSpRuuYOnUqV6lSRbRs5MiRXKpUKZ42bRonJSVxRkYGZ2RkcFJSEk+bNo2dnZ159OjRQnk588ZIrcNcMXLqMFf/fX19edmyZUbHctmyZezj4/NC7erbty/7+PjwunXrRIeUs7KyeN26dezr68txcXEv1Bc5dSg1Rs44mmMfK7VdcurB2Euvx1RvTIKSlJTE7u7u7OLiwu+99x737t2be/fuze+99x67uLiwh4eH3mGq+Ph4trW15WrVqvHAgQN5woQJPGHCBB44cCBXr16d7ezseO/evS8UY446zNV/OXXIndxtwoQJ7OHhIVyEW3hBroeHB0+cOFGvvJx5Y6TWYa4YOXWYo/9yEg6p7Xr48CH37t2braysWK1Ws1arZa1Wy2q1mq2srLhPnz788OHDF+qLnDqUHCN1HM2xj5XcLqn1YOzl/SaZokTeZizX3bt3acWKFXT48GG926e6dOlicF6GtLQ0mj9/vsGY3r17k6+v7wvHmKMOc/VfTh0HDx6kWbNmGbytbcCAARQaGqoXU+jy5cuUmZkpxPj5+RktSyRvPhepdZgrRk4dL7v/a9asoenTp1NCQgLl5+cTEZGFhQXVrl2bBg0aRFFRUcXSruzsbDp+/LioXbVr137u3CpS+iKnDiXHSP28mGMfK7ldUuvB2Mv7TXqWNypBASCSN9fM68Qc/ZeTCL3p4wIAYkhQ/r+8vDy6ceOGpAngpMjMzKTc3FyTtz9mzBjq168flS5d2uQ68vLyTJ7h9fHjxxQfH0/p6enk6+tLYWFhZGFhISpz69YtSfUTEeXn59Pff/9Nvr6+pFarKTc3lzZu3EgFBQXUtGlTvYsei5IyuVtycjLNmTPH4FGXuLg4CgwMFJXfuXMnTZ8+nQ4dOiRcBObg4EChoaE0aNAggxcDS63DXDFy6jBX/4syJeGQ0y45k7tJ7YucOpQaI2cczbGPldouOfVg7F/st8IYJCj/X1JSEtWqVUs4LF1o3rx5tG7dOnJ2dqZPPvmEmjdvLqy7desW1atXjy5fviwsu3v3LvXp04f+/PNPCgsLo4ULF9LAgQNp/vz5pFKpqFGjRrRp0ybhUJmhK6aZmcqUKUP79+8nf39/IiLRobW1a9dSu3bthNn55syZQ5MnT6arV69SqVKlqH///jRq1CjRNj/99FOKiIigd955h65evUotWrSglJQUKl26NN26dYsCAwNp27Ztohl3LSwsKCwsjHr27Ent27d/7r9sT506RS1btqTMzEwKDAykrVu3UuvWrSk1NZVUKhVZWlrSjh07qG7duqK4H3/8kaZNm0YXLlwQ+q9SqahKlSr0+eefU8+ePUXlt23bRu3ataNatWpRRESEkPRkZmbSzp07KSEhgTZu3EgRERFERLRs2TLq1asXdejQQa/877//Tr/++istWrSIPvzwQ9l1mCtGTh3m6j+RtIRDTruOHTtGERERZGNjQ+Hh4aKYXbt20f3792nHjh1Up04d2X2RU4dSY+SMozn2sVLbJacejL283wqTyL565TWTmJjIarVatGzmzJlsY2PD/fr1465du7KVlRV/9913wvqMjAy9mLi4OPb39+dZs2ZxWFgYR0ZGclBQEO/fv5/37t3LgYGB/OWXXwrlCy8oevpVeLFR4X+LUqvVwmx+ixcvZq1Wy6NGjeItW7bwuHHj2NbWlhcuXCiKcXNzEy5QjYqK4vDwcP7nn3+Ymfnff//ld955R28CHpVKxS1btmQrKysuVaoUx8XF8cmTJ43uw4iICO7QoQOfPn2aBwwYwAEBAfzBBx/wo0ePOC8vj7t27crh4eGiGDmTu0mdO0XOvDFy5mcxR4ycOszVf6kT+8lpl5zJ3aT2RU4dSo2RM47m2MdKbZecejD20usx1RuToAQHBz/z5e/vr5cIBAYG8sqVK4X3Bw4c4DJlygiDYShB8fLy4t27dzMz87Vr11ilUvGmTZuE9Zs3bxbdNlu2bFlu06YN7969m/fs2cN79uzh+Ph4trCw4CVLlgjLilKpVEKCUq9ePZ40aZJo/bx58zg4OFi0TKvV8uXLl5mZuVy5cnzkyBHR+tOnT3Pp0qUN1vPPP//wlClTODAwkNVqNdeqVYvnzZunN3NgqVKlODk5mZmfTKJnYWEhqufMmTPs4uIiipEzuZtWqzU402Gh8+fPiyb4sra2llReTh3mipFTh7n6LzXhkNsuqZO7ydnHcupQYozcz6Q59rES2yWnHoy99HpMVaInapMiOTmZqlevTpGRkQZfTZo00YtJTU2lBg0aCO8bNGhAu3fvph9++IGGDx9usJ6bN29SxYoViYjI09OTdDodVa5cWVgfFBREV65cEd6fOnWKLC0t6ZtvvqGKFStSkyZNKCwsjFQqFdWrV4+aNGlisG2Fk2FdvnyZ3n77bdG6t99+my5duiRaVrlyZWFSLHt7e71TS3fv3qWCggKDfSpdujR9/vnndPbsWdq/fz/VrFmThg4dSh4eHhQTEyOUY2bSaDRERHr/JXpyyujpOuRM7ubr60tbtmwxGrNlyxby8fER3letWpUWLVpktPzixYv1zpFKrcNcMXLqMFf/pU7sJ6ddciZ3k9oXOXUoNUbOOJpjHyu1XXLqwdhLr8dUmucXeT0EBQVRSEgI9enTx+D6xMREWrhwoWhZ6dKl6cqVK6JbaYOCgmj37t3UrFkzun79ut52XFxc6J9//iEvLy8iIoqMjBTNonfv3j3RtRzOzs60fv16mj9/PtWrV4+mTJlCnTt3fm5/tm/fTo6OjqTVaun+/fuidQ8fPtSbzXPgwIH0xRdfkJubGw0fPpz69+9Ps2fPpoCAALpw4QINGDCA3n//fVGMoRlBQ0NDKTQ0lGbNmkWrV6+mxYsXC+tq165NEydOpDFjxtCiRYvIz8+P5syZI5SZPXu23gy/devWpQkTJtCiRYtEyQzRkwtuJ06cqHfNytixY6lLly60Z88eg+dJt2/fTqtWrRLKT506ld555x3avn27wfKXL1/W+4JJrcNcMXLqMFf/CxOOSZMmkSFPJxxy2vXFF19QbGwsJSQkUPPmzfViFi5cSFOmTHmhvsipQ6kxcsbRHPtYqe2SUw/GXno9JpN13KUE6t+/Pw8YMMDo+kuXLnFYWJhoWefOnfmzzz4zWP7MmTNcpkwZvVM8LVu25AULFhitZ8mSJdygQQOD686ePcs1atTgzp07s0ajMfgkX2YWJrQqfI0bN060/scff9Q7xcP8ZFZWGxsb1ul0wkQ8ha927drx3bt39ep5+smVz3L06FF2cXFhtVrNZcqU4TNnznBISAi7u7uzp6cn63Q6/uOPP0QxciZ3Y35yuq1jx47s7e3NVlZWbGVlxd7e3tyxY0c+ePCgXvnU1FQeMmQIN27cmCtXrsyVK1fmxo0b89ChQzk1NdVgf6TWYa4YOXWYo/9yJhCU0y45k85J7YucOpQaI+fzYo59rNR2yakHYy+9HlPgLp5nOHXqFCUkJNBHH31kcP2ZM2fof//7H40ePVpYdvv2bVKr1UafPbBt2zbS6XQUFhZmcP2jR49o2LBhFB8fT+vWrZM10c3mzZvJ0tLS4FXTd+7coZ07d9Lly5epoKCAPDw8qGHDhlSpUiW9ssuWLaNOnTpJmpciJyeHzp8/T1WqVCE7Ozt6+PAhrVy5kh48eEAtWrSgKlWq6MXImdwNlEnOBIJyyZlrxRx1KDlGKnPUIYe52iW1Hox98UKCAiWalLlTXhVmpoKCAr15Zp5l6dKl9N577720/qSkpFB6ejr5+PgI10y9Sunp6XTjxg1Sq9VUvnx5cnFxMSnudZzcbc+ePRQSEkI6ne6lbD83N5euXr1K5cqVe+n7LTMzk5iZ3N3djZbJz8+nW7dukVqtNjjHhjEYe+mUNvbPJfvYSwny999/Syp/9epVs8Q8fSfNy6hDyX0p6t69e7x3715evXo1r127lhMSEgze6lZo4cKFHBAQoHdbdkBAAP/444+S2mLoFnNm5i1btnDPnj158ODBwt1JhW7fvs1NmzYVLcvLy+OvvvqKGzduzKNGjWLm/7uN2srKimNiYjg3N9ekNllaWurVyfxkPz9+/Fh4v2nTJm7cuDF7enpy7dq1DT6s77vvvhNOrd2+fZubNWsmHLpVq9XcsmVL/u+//0QxdnZ23KNHDz5w4IBJ7S2qaPsK23zo0CGDz/CYO3cue3t7691m37BhQz5+/LjB7f/+++/cqlUrdnJyEso7OTlxq1ateOfOnZLbm5yczH5+fqJliYmJ/M033/DcuXOF2/ELZWVl8UcffaS3nYULF3JMTAwvXryYmZ8cKvf392c/Pz/h82AKY2PPzHqnXE+ePMkxMTHcoEEDbt++PcfHx4vWL1myRDjE/uDBA+7RowdbWFiwWq1mjUbDn3zyid64BAUF8dixYzk9Pd3kNv/777/cvn179vLy4t69e/Pjx4+5Z8+ewmcsNDSUr1+/LorZvHkzv/XWW2xtbS2Mo6OjI3ft2tXo7485xp5Z+vhj7KWNvaneiATF1dWVY2Nj+ejRo0bL3Llzh3/44QeuWrUqz5w50ywxdnZ2imyXufrCzJyfn8+DBw9mnU4nSjZUKhX7+Pjwb7/9prcdOXOnPEtiYiKrVCrRspUrV7KFhQW3adOGGzVqxFqtllesWCGsN3SL+YgRI9jNzY0HDRrEgYGB3Lt3b/by8uIVK1bwsmXLuGzZsnoPzipVqpTBl0qlYkdHR+F9oaJz4Pz222+sVqs5JiaG586dy7169WKNRsPr1q0T1VGuXDk+ceIEMzP36tWLg4OD+cSJE/zgwQNOTEzk+vXrc8+ePUUxKpWKq1atyiqViv39/XnKlCl88+bNZ+7HtLQ0rl27NltYWHDLli05KyuLw8PDhfEsX748X7hwQSg/efJk9vT05NmzZwsJ59ixY3nbtm384Ycfso2NDR87dkxUh9S5VkzxdIK6Y8cOtrKy4qpVq7K3tze7uLgIUwcwGx776dOns62tLb///vvs4eHB48aNYxcXFx43bhyPGTOGHRwc+PvvvxfFGJvyQKVScUBAgPC+qKLjf+DAAba0tOQmTZrw4MGDuUWLFqzRaETX+fj5+fHhw4eZmfmLL75gX19fXrduHZ87d443bNjAlStX1ntiuUqlYhcXF7awsOCIiAj+9ddfDT6hvKgePXpwUFAQz549m5s0acKRkZFcvXp13r9/Px88eJDr1q3LMTExQvnly5ezvb09f/755/zVV1+xu7s7Dxs2jOfPn89NmjTh0qVL88WLF0V1mGPsmaWPP8Ze2thL8UYkKLdu3eKBAweyo6Mju7m5cevWrblXr14cFxfH0dHRHBwczFZWVly/fn3esmWL2WKU2i5z9YWZeejQoRwQEMCbNm3inTt3cuPGjXnixIl87tw5HjlyJFtbW/OOHTtE4yl17pT33nvvma9mzZrp/UjVrFlTSKKYmdesWcO2trbC0RlDf6TKly8vzHmTkpLCarWaV69eLdpGUFCQKMbOzo7btGnDS5cuFV5LlixhCwsL/vbbb4VlhYpeuNyoUSMeNmyYaHvffvut3kRK1tbWnJaWxszMvr6+eheqHj9+nD08PETLCutJTEzkuLg4dnZ2ZisrK37//fd569atBo9utW/fnps0acKbNm3iqKgobtiwIYeFhfHVq1f5+vXrHBERwe3atRPK+/r68tatW4X3Fy5cYBcXF+EHsX///tyiRQtRHXImdxs4cOAzX127dhWNZWhoqDCZYkFBAU+cOJHt7Ox427ZtzGx47P39/YU5k06cOMEajUZ0JO/HH3/k2rVri2I0Gg23bNmSv/76a+E1evRoVqvV3LdvX2FZUUXHv0WLFtyjRw/R+gEDBnCzZs2E99bW1sLRiMqVKwt9KLR371729vbWq+PatWu8fv16btu2LWs0Gi5Tpgx//vnnRv917+HhIRxty8jIYJVKxb///ruwfv/+/Vy2bFnR/ir63Th27BiXK1dO+Fx17NiR33vvPVEd5hh7Zunjj7GXNvZSvBEJSqH79+/zL7/8wgMGDOB27dpxREQER0dH85QpUwzeKWKuGKW2yxx98fDw4H379gnvr169ynZ2dsKhx7Fjx3JoaKgoRqvVGv2yMD+5G0qn0wnvNRoNt2rVirt3727w9e677+r9SNna2goT2xXavXs329nZ8fz58w3+kdJqtaJDo09PenT58mW2t7cXxaSkpAj/wih6F5Wxu7iK/ki5urrqnQY5f/48Ozk5iZZVrlyZN2/ezMxP/lX19GmbkydPsoODg9F6mJ88hn3VqlXcvHlzVqvVXK5cOb3ZI8uUKSPMNHznzh1WqVT8559/CusTEhLYzc1NeG9jYyO6U6egoIA1Go1wODgxMZHt7OxEdciZ3K1wcsGwsDCDrzp16ojG0sHBgS9duiTaxsqVK9nW1pY3bdpkcOx1Op3otIS1tTWfOXNGeJ+SkqI3Lvv37+cKFSrwqFGjOD8/X1j+vDv4CsfFw8ODDx06JFp/5swZ0YSLPj4+wr/+y5Ytq3dEKjk5mW1tbY3Wwcx8/fp1/u6777hSpUrCIftFixaJYmxsbIQkmPnJqYqi3/fLly+L6tHpdHp3aWk0Gr527RozPzkt+PT+MsfYM0sff4y9tLGX4o1KUEB57O3t+a+//hLe5+fns0aj4Rs3bjDzk2TDxsZGFPPWW29xTEyMwUOPjx8/5piYGG7cuLGwrFq1as+8LuXkyZN6P1KGfgCYmffs2cN2dnb81Vdf6cW4ubnxqVOnhPcNGjQQXWtz7tw5vUSA+cm1K0OGDOEKFSrw/v37mfnZCUp8fDwnJSWxj4+P3im18+fP6/1Rnzx5MgcEBHBKSgpPnTqVQ0NDhR/gy5cvc1hYmN5jDooeTn5aamoqjxgxQm+GX3t7eyGpKxzHxMREYX1KSoooQatZsyb/8MMPwvtdu3axjY2N8K/o8+fP6yV0tWrV0jssXdSQIUO4Vq1aomWVK1fmn376yWjM0+NfpkwZg9e//Pzzz2xjY8Pz58/XG3sXFxdR0lyuXDnRj3ZKSoreuDA/SeQ6derEISEhwpg874/UpUuXOCsri/38/IRTd4UuXbok+r58+eWXHBoayv/99x8PGzaM27ZtKyTCOTk5HBUVxW+//bZoG88a+/j4eO7ataveH5waNWoIRze2bt3K9vb2PHXqVGH9/PnzRUcPAwIC+JdffhHeJyQksJWVlXD9UkpKil4d5hh7Zunjj7GXNvZSIEGBV6pBgwaieVx+/vln0b82Tp8+LboGg1n63Cndu3fnvn37Gm1DcnIy+/r6ipZFRkYavbitcL6Pp3/YmjZtKjod87S1a9fqHeotateuXezt7c3Dhw9nS0tLowlK0et0pk+fLlr/888/c2BgoF7cp59+ypaWluzv789arZbVarUwF06dOnWEhLBoPc+bA+fp0zz169fnESNGMPOTZ0S5ubmJTkGNHTtW1P81a9awpaUlR0VFcUxMDNvZ2YnKL1iwQO/omZy5Vrp06WJ0PiNm/WuQWrRoYfQaplWrVrGlpaXe2Dds2FB0yuJpmzZteuaP9OLFi9nd3Z2///57o2PP/H/jX/gZKJrgMTNv3LhRdJojNzeX3333XS5VqhS3aNGCtVot29jYcKVKldjW1pa9vb1F1wUV1vG8sX/6MRcrVqxgCwsLrlixIltbW/Mvv/zCnp6eHBUVxZ06dWIrKyvR6Zk5c+awo6MjDxkyhEeNGsWenp6i66BWrFihdw2GOcaeWfr4Y+yljb0UuM0YXqldu3ZRmzZtqEaNGqTVaungwYM0efJk+uyzz4iIaMqUKbRt2zbatWuXKE7K3Cm5ubmUn59PNjY2Jrdr7969dPDgQaOPNIiPj6fly5fTkiVLhGUXL14kS0tLo3PXrFq1ijQaDUVFRRmt999//6WPP/6Y4uPj6fDhw3rzxvz999+i93Z2dqJbcpcvX05EJHoEQaFz587R5s2b9ebACQ8P15s1eMyYMTR48GBJ+2zHjh3Url07KigoILVaTTt27KCPP/6YnJycSK1W07Fjx2jVqlWi/m/bto1WrFhBubm5FBERQR9//LFoXxCR3i3HUudaycjIoNzcXJOn216/fj3t27ePpk+fbnD9qlWraOHChRQfHy8sO3DgANna2lLNmjUNxsybN48KCgooLi7OaL0pKSkUHR1Nx48fpzNnzhh8RP3evXtF7z08PESP0pg5cyY9evSIBg8eLCq3fft22rRpk97Yd+nShWxtbUVlP/roI5o1axbZ29sbbashBw4coMOHD1NoaCg1aNCAkpOTacKECXT//n1q27YtdevWTVR+/vz5orEfOXIkabVaYV/k5+cLT3Mv9LLHnkj6+GPspY+9qZCgwCuXlJREa9euFX6oWrRo8aqbBDKlpaVRQkIC1a5dm3x9fSkzM5Pmzp1L9+/fpzZt2lDTpk1fdRMVraCggO7evUsODg4GHzUBry+MvT4kKPDaycvLoxs3bpC3t7dJ5R8/fkzXr183ubySY+TUIXV/ya1HKnPUASVfZmYm5ebmSvqcmCMG7ZIeo0fWiSGAYiBnAjlTGJt4rbjKKzlGqe1ifnIxsJQxN1bH3LlzuXnz5vzBBx/oPdvpn3/+MTjxltQYc9TxpvdFavns7GyOjo5mb29vYdLDvn37CtdmNG7cWO/6CHPEoF3SY0yllp/aALyYunXr0ieffELHjh0zWiYrK4sWLlxIQUFB9L///c+MrYPidvbsWVnPlipq1qxZNHjwYPL39ydra2tq3bo1jR8/Xlifn5+vd52O1Bhz1PGm90VOHV9++SUlJCTQF198Qenp6RQVFUX79u2jP//8k+Lj4+nWrVs0ceJEs8egXdJjTCYrrQEoBnIndzM2C2Phy9/fX/Qvb6nllRyj1HaZ4ukjInLqCAwMFCbFYn4yo2aZMmWEOVkMzVEiNcYcdbzpfZFTh5eXlzCvx7Vr11ilUgkTIzI/mTq/SpUqZo9Bu6THmEojL60BeHEuLi40bdo0+vbbb2nLli20f/9++vvvv+nBgwdUunRpio6OpoiICAoKChLFJScnU6dOnYz+a/zGjRt08eJF2eWVHKPUdhER1apVy2DZQg8ePHjhOlJTU6lBgwbC+wYNGtDu3bspPDyc8vLyhLu/XiTGHHW86X2RU8fNmzeFB1t6enqSTqcT3cUSFBREV65cMXsM2iU9xlRIUOCV0+l01KFDB+rQoYNJ5YOCgigkJIT69OljcH1iYiItXLhQdnklxyi1XUTSEw45dZQuXZquXLkiup00KCiIdu/eTc2aNaPr16/rbUdqjDnqeNP7IqcOFxcX+ueff8jLy4uIiCIjI8nJyUlYf+/ePb0n9JojBu2SHmMqXIMCJU7Dhg3pwoULRtfb29tT48aNZZdXcoxS20X0fwnH6NGjDb569+79wnU0atSI1q1bp1c2MDCQdu3aRdu2bdNbJzXGHHW86X2RU0f16tVF16utWrWKXF1dhffHjh2jgIAAs8egXdJjTCbrxBAAwFP69+/PAwYMMLr+0qVLHBYW9kJ1JCUlCY+0N+T06dN6D1mTGmOOOswV8zq1699//+X//vvPaMzWrVs5Pj7e7DFol/QYU2EeFAAAAFAcnOKBEiU9PV1S+aNHj0oqf+3aNcl1mCtGyX2RCvv4ze2LUtv1OvVFqe2S+luBBAVKFKlzpzRv3lzyXCty5mcxR4yS+yL1h6p27dqK7IuS9/Hr0heltut16otS2yV1Liuc4oES5d9//6Vvv/2WFi9eTFqtlmrXrk2enp6k1Wrpv//+o+TkZDp79izVqlWLRo4cSSEhIZLKt27dWnId5opRcl/c3NyoXbt21KtXL6pbt67BscvKyqK1a9fSzJkzKTo6mv755x/F9UXJ+/h16YtS2/U69UWp7WrdurWk33skKFAiPXjwwODcKcHBwQbnTpFaXskxSmyX3B8qJfZFye16nfqi1Ha9Tn1RartMhQQFAIrNy/qhAoA3DxIUAAAAUBxcJAsAAACKgwQFAAAAFAcJCgAAACgOEhQAAABQHCQoAADFSKVS0YYNG151MwBKPCQoAG8QX19fmjFjRrFvNy0tjVQqFSUmJhb7tgHgzYQEBQBeC48ePXrVTQCAYoQEBUBBCgoKaNKkSVSxYkWytrYmb29v+vbbb4mI6PTp09SsWTPS6XTk4uJCsbGxdO/ePSG2e/fu1K5dO5oyZQp5eHiQi4sL9evXj/Ly8oiIKCwsjP7++28aOHAgqVQqUqlUQuz+/fvprbfeIp1OR15eXtS/f3/KyckR1vv6+tJ3331HPXr0IHt7e/L29qYffvhBWO/n50dERMHBwaRSqSgsLMyk/i5evJiqVq1K1tbW5OHhQXFxccK69PR0ioyMJDs7O3JwcKCoqCjKzMwU1n/99ddUs2ZN+vHHH8nPz4+0Wq3Qz7i4OIqLiyNHR0cqXbo0jRw5kopO+WToNIyTkxMtXbqUiJ4kO3FxceTh4UFarZZ8fHxo/PjxJvXpaVeuXKGoqChycnIiZ2dnioyMpLS0NGH988YN4E2FBAVAQYYPH04TJkygkSNHUnJyMq1atYrc3NwoJyeHIiIiqFSpUnTs2DH65Zdf6I8//hD9QSciio+Pp7/++ovi4+Np2bJltHTpUuGP7rp166hcuXI0duxYunHjBt24cYOIiP766y9q2bIltW/fnk6dOkVr1qyh/fv362176tSpVKdOHTp58iT17duX+vTpQxcuXCCi/3t66h9//EE3btygdevWPbev8+fPp379+lFsbCydPn2afvvtN6pYsSIRPUnUIiMj6fbt27R3717auXMnXb58mTp27CjaxqVLl+h///sfrVu3TnR6admyZaTRaOjo0aM0c+ZMmjZtGv34448mj8OsWbPot99+o7Vr19KFCxdo5cqV5Ovra3J8oby8PIqIiCB7e3v6888/6cCBA2RnZ0ctW7YUHfF51rgBvLEYABQhOzubra2teeHChXrrfvjhBy5VqhTfu3dPWLZlyxZWq9WckZHBzMzdunVjHx8ffvz4sVDmgw8+4I4dOwrvfXx8ePr06aJt9+zZk2NjY0XL/vzzT1ar1fzgwQMhrmvXrsL6goICdnV15fnz5zMzc2pqKhMRnzx50uT+enp68ldffWVw3e+//84WFhacnp4uLDt79iwTER89epSZmUePHs2WlpZ88+ZNUWyTJk04ICCACwoKhGVDhw7lgIAA4T0R8fr160Vxjo6OvGTJEmZm/vTTT7lZs2aibZiq6LZ/+uknrlKlimg7ubm5rNPpeMeOHcxs2rgBvIlwBAVAIc6dO0e5ubnUvHlzg+tq1KhBtra2wrKGDRtSQUGBcBSDiKhq1apkYWEhvPfw8KCbN28+s96kpCRaunQp2dnZCa+IiAgqKCig1NRUoVz16tWF/1epVOTu7v7cbRtz8+ZNun79usG+Ej3pr5eXF3l5eQnLAgMDycnJic6dOycs8/HxoTJlyujF169fX3QKKzQ0lFJSUig/P9+k9nXv3p0SExOpSpUq1L9/f/r9999N7ZpIUlISXbp0iezt7YV96+zsTA8fPqS//vpLKCdn3ABed5pX3QAAeEKn073wNiwtLUXvVSoVFRQUPDPm3r179Mknn1D//v311nl7e7/Qto0pjr4SkShhk0KlUomuSSEi0TUftWrVotTUVNq2bRv98ccfFBUVReHh4fTrr79KqufevXtUu3ZtWrlypd66oolVce5bgNcFEhQAhahUqRLpdDratWsX9erVS7QuICCAli5dSjk5OcIf5QMHDpBaraYqVaqYXIeVlZXeUYRatWpRcnKycP2HHFZWVkREJh+hsLe3J19fX9q1axc1bdpUb31AQABduXKFrly5IhxFSU5Opjt37lBgYOBzt3/kyBHR+8OHD1OlSpWEoxRlypQRrsEhIkpJSaH79++LYhwcHKhjx47UsWNH6tChA7Vs2ZJu375Nzs7OJvWR6Mm+XbNmDbm6upKDg4PJcQCAi2QBFEOr1dLQoUNpyJAhtHz5cvrrr7/o8OHDtGjRIoqOjiatVkvdunWjM2fOUHx8PH366af04Ycfkpubm8l1+Pr60r59++jatWt069YtIiIaOnQoHTx4kOLi4igxMZFSUlJo48aNehfJPourqyvpdDravn07ZWZmUlZW1nNjvv76a5o6dSrNmjWLUlJS6MSJEzR79mwiIgoPD6dq1apRdHQ0nThxgo4ePUoxMTHUpEkTqlOnznO3nZ6eToMGDaILFy7Qzz//TLNnz6YBAwYI65s1a0Zz5syhkydP0vHjx6l3796ioxjTpk2jn3/+mc6fP08XL16kX375hdzd3cnJycnkfUJEFB0dTaVLl6bIyEj6888/KTU1lfbs2UP9+/enq1evStoWwJsGCQqAgowcOZI+//xzGjVqFAUEBFDHjh3p5s2bZGNjQzt27KDbt29T3bp1qUOHDtS8eXOaM2eOpO2PHTuW0tLSqEKFCsIphurVq9PevXvp4sWL9NZbb1FwcDCNGjWKPD09Td6uRqOhWbNm0ffff0+enp4UGRn53Jhu3brRjBkzaN68eVS1alV65513KCUlhYienOLYuHEjlSpViho3bkzh4eFUvnx5WrNmjUntiYmJoQcPHlC9evWoX79+NGDAAIqNjRXWT506lby8vOitt96iLl260BdffEE2NjbCent7e5o0aRLVqVOH6tatS2lpabR161ZSq6X9ZNrY2NC+ffvI29ub3n//fQoICKCePXvSw4cPcUQF4DlU/PSJWACAEiwsLIxq1qz5UmbMBQDzwREUAAAAUBwkKADwUhS9bfnp159//vmqmyfLypUrjfapatWqr7p5AK8VnOIBgJfi0qVLRteVLVu22G41Nqe7d++KptsvytLSknx8fMzcIoDXFxIUAAAAUByc4gEAAADFQYICAAAAioMEBQAAABQHCQoAAAAoDhIUAAAAUBwkKAAAAKA4SFAAAABAcZCgAAAAgOL8Py6wITwTNsi+AAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "grouped = df_news.groupby(pd.cut(df_news['content_corpus_len'], bins=range(0, 4000, 100))).size()\n", + "grouped.plot(kind='bar')\n", + "plt.show()" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "bc42bd06-2b33-4a37-8f72-53083e84f965", + "metadata": {}, + "outputs": [], + "source": [ + "df_news[df_news[\"content_corpus_len\"] > 2000].to_csv(\"./over_2000.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "767a3d59-ab36-404f-807e-9dce2ae3dc68", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 92bbcca97c92edc6f1a5409c5fdc2f15c9273d64 Mon Sep 17 00:00:00 2001 From: limha Date: Wed, 19 Jul 2023 08:21:58 +0000 Subject: [PATCH 19/63] [Feature] Add title and cut content new file: sentence-sentimental/train.ipynb modified: sentence-sentimental/train.py --- sentence-sentimental/train.ipynb | 815 +++++++++++++++++++++++++++++++ sentence-sentimental/train.py | 152 +++--- 2 files changed, 909 insertions(+), 58 deletions(-) create mode 100644 sentence-sentimental/train.ipynb diff --git a/sentence-sentimental/train.ipynb b/sentence-sentimental/train.ipynb new file mode 100644 index 0000000..c3e15b1 --- /dev/null +++ b/sentence-sentimental/train.ipynb @@ -0,0 +1,815 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/envs/final/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], + "source": [ + "import torch\n", + "import pandas as pd\n", + "import sklearn\n", + "import random\n", + "import numpy as np\n", + "import wandb\n", + "\n", + "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", + "from transformers import TrainingArguments, Trainer\n", + "from transformers import pipeline\n", + "from transformers import DebertaV2ForSequenceClassification\n", + "\n", + "from dataset.datasets import SentimentalDataset\n", + "from metrics.metrics import compute_metrics\n", + "\n", + "from sklearn.datasets import load_iris # 샘플 데이터 로딩\n", + "from sklearn.model_selection import train_test_split\n", + "\n", + "from utils.utils import config_seed" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 설정" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "SEED = 42\n", + "config_seed(SEED)\n", + "device = torch.device(\"cuda\" if torch.cuda.is_available() else 'cpu')" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 모델 및 토크나이저" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "MODEL_NAME = 'klue/roberta-large'\n", + "model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device)\n", + "tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Some weights of the model checkpoint at team-lucid/deberta-v3-base-korean were not used when initializing DebertaV2ForSequenceClassification: ['mask_predictions.LayerNorm.bias', 'mask_predictions.classifier.weight', 'mask_predictions.dense.weight', 'mask_predictions.classifier.bias', 'mask_predictions.dense.bias', 'mask_predictions.LayerNorm.weight']\n", + "- This IS expected if you are initializing DebertaV2ForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n", + "- This IS NOT expected if you are initializing DebertaV2ForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n", + "Some weights of DebertaV2ForSequenceClassification were not initialized from the model checkpoint at team-lucid/deberta-v3-base-korean and are newly initialized: ['classifier.weight', 'classifier.bias', 'pooler.dense.weight', 'pooler.dense.bias']\n", + "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n" + ] + } + ], + "source": [ + "MODEL_NAME = \"team-lucid/deberta-v3-base-korean\"\n", + "\n", + "model = DebertaV2ForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device)\n", + "tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 데이터셋 구성" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 1) 기사 전체 학습" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "data = pd.read_csv('/opt/ml/finance_sentiment_corpus/merged_samsung_filtered.csv')\n", + "\n", + "def extract_label(json_str) :\n", + " data_dict = eval(json_str) # JSON 문자열을 파이썬 딕셔너리로 변환\n", + " return data_dict[\"label\"]\n", + "\n", + "# \"label\" 값을 추출하여 새로운 Series 생성\n", + "data['labels'] = data[\"labels\"].apply(extract_label)\n", + "data['labels'] = data['labels'].map({'부정':0, '긍정':1})" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 2) 기사 앞뒤 학습" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "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", + " \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", + "
Unnamed: 0.3Unnamed: 0.2Unnamed: 0.1Unnamed: 0titledatecontentcontent_corpuscontent_lencontent_corpus_lenlabelsnew_column
00000데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ...2023.07.10 15:29챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...181316511. 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 챗...
12222“삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연2023.07.10 15:07삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...174916980. “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 삼성 가전제품 구매고...
23333SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급2023.07.10 15:05해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (...해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리...5474761. SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 해외 가전 브랜드 공...
34444‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파2023.07.10 14:58북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...109610291. ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 북미·유럽 등...
45555네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다2023.07.10 14:4829년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상...29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상...175916591. 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 29년간 3만6558편...
\n", + "
" + ], + "text/plain": [ + " Unnamed: 0.3 Unnamed: 0.2 Unnamed: 0.1 Unnamed: 0 \\\n", + "0 0 0 0 0 \n", + "1 2 2 2 2 \n", + "2 3 3 3 3 \n", + "3 4 4 4 4 \n", + "4 5 5 5 5 \n", + "\n", + " title date \\\n", + "0 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 2023.07.10 15:29 \n", + "1 “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 2023.07.10 15:07 \n", + "2 SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 2023.07.10 15:05 \n", + "3 ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 2023.07.10 14:58 \n", + "4 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 2023.07.10 14:48 \n", + "\n", + " content \\\n", + "0 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... \n", + "1 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... \n", + "2 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (... \n", + "3 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... \n", + "4 29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상... \n", + "\n", + " content_corpus content_len \\\n", + "0 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... 1813 \n", + "1 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... 1749 \n", + "2 해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리... 547 \n", + "3 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... 1096 \n", + "4 29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상... 1759 \n", + "\n", + " content_corpus_len labels \\\n", + "0 1651 1 \n", + "1 1698 0 \n", + "2 476 1 \n", + "3 1029 1 \n", + "4 1659 1 \n", + "\n", + " new_column \n", + "0 . 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 챗... \n", + "1 . “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 삼성 가전제품 구매고... \n", + "2 . SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 해외 가전 브랜드 공... \n", + "3 . ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 북미·유럽 등... \n", + "4 . 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 29년간 3만6558편... " + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv('/opt/ml/finance_sentiment_corpus/merged_samsung_filtered.csv')\n", + "data = pd.DataFrame(data)\n", + "\n", + "# title과 content_corpus에서 원하는 문장 추출\n", + "def extract_sentences(text):\n", + " sentences = text.split('. ')\n", + " if len(sentences) >= 5 :\n", + " return '. '.join([sentences[0], sentences[1], sentences[-2], sentences[-1]])\n", + " else :\n", + " return '. '+text\n", + " \n", + "def extract_label(json_str) :\n", + " data_dict = eval(json_str) # JSON 문자열을 파이썬 딕셔너리로 변환\n", + " return data_dict[\"label\"]\n", + "\n", + "# \"label\" 값을 추출하여 새로운 Series 생성\n", + "data['labels'] = data[\"labels\"].apply(extract_label)\n", + "data['new_column'] = data.apply(lambda row: extract_sentences(row['title']) + ' ' + extract_sentences(row['content_corpus']), axis=1)\n", + "data['labels'] = data['labels'].map({'부정':0, '긍정':1})\n", + "data.head()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Cross validation" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [], + "source": [ + "# dataset = train_test_split(data['content_corpus'], data['labels'],\n", + "\n", + "dataset = train_test_split(data['new_column'], data['labels'],\n", + " test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리\n", + " random_state=SEED)\n", + " \n", + "sentence_train, sentence_val, label_train, label_val = dataset\n", + "\n", + "max_length=500\n", + "stride=10\n", + "## TODO 임의의 값으로 차후 수정\n", + "train_encoding = tokenizer(sentence_train.tolist(), ## pandas.Series -> list\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True,\n", + " ##\n", + " max_length=max_length,\n", + " stride=stride,\n", + " return_overflowing_tokens=True,\n", + " return_offsets_mapping=False\n", + " )\n", + "\n", + "val_encoding = tokenizer(sentence_val.tolist(),\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True,\n", + " ##\n", + " max_length=max_length,\n", + " stride=stride,\n", + " return_overflowing_tokens=True,\n", + " return_offsets_mapping=False\n", + " )\n", + "\n", + "train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True))\n", + "val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True))" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "pandas.core.series.Series" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "type(sentence_train)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 학습 (huggingface)\n", + "#### hyperparameter\n", + "- max_length\n", + "- stride\n", + "- num_train_epoch\n", + "- learning_rate\n", + "- per_device_train_batch_size\n", + "- per_device_eval_batch_size" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "logging_steps = 200\n", + "num_train_epochs = 2\n", + "per_device_train_batch_size = 4\n", + "per_device_eval_batch_size = 4\n", + "learning_rate = 5e-6" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", + "To disable this warning, you can either:\n", + "\t- Avoid using `tokenizers` before the fork if possible\n", + "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", + "W&B online. Running your script from this directory will now sync to the cloud.\n" + ] + } + ], + "source": [ + "!wandb online" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---train start---\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/envs/final/lib/python3.10/site-packages/transformers/optimization.py:411: FutureWarning: This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this warning\n", + " warnings.warn(\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [ 3/730 00:00 < 01:35, 7.63 it/s, Epoch 0.01/2]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Loss

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "ename": "KeyboardInterrupt", + "evalue": "", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/opt/ml/level3_nlp_finalproject-nlp-04/sentence-sentimental/train.ipynb Cell 18\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 16\u001b[0m trainer \u001b[39m=\u001b[39m Trainer(\n\u001b[1;32m 17\u001b[0m model\u001b[39m=\u001b[39mmodel,\n\u001b[1;32m 18\u001b[0m args\u001b[39m=\u001b[39mtraining_args,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 21\u001b[0m compute_metrics\u001b[39m=\u001b[39mcompute_metrics\n\u001b[1;32m 22\u001b[0m )\n\u001b[1;32m 24\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m'\u001b[39m\u001b[39m---train start---\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m---> 25\u001b[0m trainer\u001b[39m.\u001b[39;49mtrain()\n\u001b[1;32m 26\u001b[0m \u001b[39m# wandb.finish()\u001b[39;00m\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/trainer.py:1645\u001b[0m, in \u001b[0;36mTrainer.train\u001b[0;34m(self, resume_from_checkpoint, trial, ignore_keys_for_eval, **kwargs)\u001b[0m\n\u001b[1;32m 1640\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmodel_wrapped \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmodel\n\u001b[1;32m 1642\u001b[0m inner_training_loop \u001b[39m=\u001b[39m find_executable_batch_size(\n\u001b[1;32m 1643\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_inner_training_loop, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_train_batch_size, args\u001b[39m.\u001b[39mauto_find_batch_size\n\u001b[1;32m 1644\u001b[0m )\n\u001b[0;32m-> 1645\u001b[0m \u001b[39mreturn\u001b[39;00m inner_training_loop(\n\u001b[1;32m 1646\u001b[0m args\u001b[39m=\u001b[39;49margs,\n\u001b[1;32m 1647\u001b[0m resume_from_checkpoint\u001b[39m=\u001b[39;49mresume_from_checkpoint,\n\u001b[1;32m 1648\u001b[0m trial\u001b[39m=\u001b[39;49mtrial,\n\u001b[1;32m 1649\u001b[0m ignore_keys_for_eval\u001b[39m=\u001b[39;49mignore_keys_for_eval,\n\u001b[1;32m 1650\u001b[0m )\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/trainer.py:1938\u001b[0m, in \u001b[0;36mTrainer._inner_training_loop\u001b[0;34m(self, batch_size, args, resume_from_checkpoint, trial, ignore_keys_for_eval)\u001b[0m\n\u001b[1;32m 1935\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcontrol \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallback_handler\u001b[39m.\u001b[39mon_step_begin(args, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstate, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcontrol)\n\u001b[1;32m 1937\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39maccelerator\u001b[39m.\u001b[39maccumulate(model):\n\u001b[0;32m-> 1938\u001b[0m tr_loss_step \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mtraining_step(model, inputs)\n\u001b[1;32m 1940\u001b[0m \u001b[39mif\u001b[39;00m (\n\u001b[1;32m 1941\u001b[0m args\u001b[39m.\u001b[39mlogging_nan_inf_filter\n\u001b[1;32m 1942\u001b[0m \u001b[39mand\u001b[39;00m \u001b[39mnot\u001b[39;00m is_torch_tpu_available()\n\u001b[1;32m 1943\u001b[0m \u001b[39mand\u001b[39;00m (torch\u001b[39m.\u001b[39misnan(tr_loss_step) \u001b[39mor\u001b[39;00m torch\u001b[39m.\u001b[39misinf(tr_loss_step))\n\u001b[1;32m 1944\u001b[0m ):\n\u001b[1;32m 1945\u001b[0m \u001b[39m# if loss is nan or inf simply add the average of previous logged losses\u001b[39;00m\n\u001b[1;32m 1946\u001b[0m tr_loss \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m tr_loss \u001b[39m/\u001b[39m (\u001b[39m1\u001b[39m \u001b[39m+\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstate\u001b[39m.\u001b[39mglobal_step \u001b[39m-\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_globalstep_last_logged)\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/trainer.py:2759\u001b[0m, in \u001b[0;36mTrainer.training_step\u001b[0;34m(self, model, inputs)\u001b[0m\n\u001b[1;32m 2756\u001b[0m \u001b[39mreturn\u001b[39;00m loss_mb\u001b[39m.\u001b[39mreduce_mean()\u001b[39m.\u001b[39mdetach()\u001b[39m.\u001b[39mto(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39margs\u001b[39m.\u001b[39mdevice)\n\u001b[1;32m 2758\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcompute_loss_context_manager():\n\u001b[0;32m-> 2759\u001b[0m loss \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mcompute_loss(model, inputs)\n\u001b[1;32m 2761\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39margs\u001b[39m.\u001b[39mn_gpu \u001b[39m>\u001b[39m \u001b[39m1\u001b[39m:\n\u001b[1;32m 2762\u001b[0m loss \u001b[39m=\u001b[39m loss\u001b[39m.\u001b[39mmean() \u001b[39m# mean() to average on multi-gpu parallel training\u001b[39;00m\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/trainer.py:2784\u001b[0m, in \u001b[0;36mTrainer.compute_loss\u001b[0;34m(self, model, inputs, return_outputs)\u001b[0m\n\u001b[1;32m 2782\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 2783\u001b[0m labels \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[0;32m-> 2784\u001b[0m outputs \u001b[39m=\u001b[39m model(\u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49minputs)\n\u001b[1;32m 2785\u001b[0m \u001b[39m# Save past state if it exists\u001b[39;00m\n\u001b[1;32m 2786\u001b[0m \u001b[39m# TODO: this needs to be fixed and made cleaner later.\u001b[39;00m\n\u001b[1;32m 2787\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39margs\u001b[39m.\u001b[39mpast_index \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m \u001b[39m0\u001b[39m:\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/accelerate/utils/operations.py:553\u001b[0m, in \u001b[0;36mconvert_outputs_to_fp32..forward\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 552\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 553\u001b[0m \u001b[39mreturn\u001b[39;00m model_forward(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/accelerate/utils/operations.py:541\u001b[0m, in \u001b[0;36mConvertOutputsToFp32.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 541\u001b[0m \u001b[39mreturn\u001b[39;00m convert_to_fp32(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mmodel_forward(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs))\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/amp/autocast_mode.py:14\u001b[0m, in \u001b[0;36mautocast_decorator..decorate_autocast\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[39m@functools\u001b[39m\u001b[39m.\u001b[39mwraps(func)\n\u001b[1;32m 12\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdecorate_autocast\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 13\u001b[0m \u001b[39mwith\u001b[39;00m autocast_instance:\n\u001b[0;32m---> 14\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/accelerate/utils/operations.py:553\u001b[0m, in \u001b[0;36mconvert_outputs_to_fp32..forward\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 552\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 553\u001b[0m \u001b[39mreturn\u001b[39;00m model_forward(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/accelerate/utils/operations.py:541\u001b[0m, in \u001b[0;36mConvertOutputsToFp32.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 541\u001b[0m \u001b[39mreturn\u001b[39;00m convert_to_fp32(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mmodel_forward(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs))\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/amp/autocast_mode.py:14\u001b[0m, in \u001b[0;36mautocast_decorator..decorate_autocast\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[39m@functools\u001b[39m\u001b[39m.\u001b[39mwraps(func)\n\u001b[1;32m 12\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdecorate_autocast\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 13\u001b[0m \u001b[39mwith\u001b[39;00m autocast_instance:\n\u001b[0;32m---> 14\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + " \u001b[0;31m[... skipping similar frames: ConvertOutputsToFp32.__call__ at line 541 (1 times), autocast_decorator..decorate_autocast at line 14 (1 times), convert_outputs_to_fp32..forward at line 553 (1 times)]\u001b[0m\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/accelerate/utils/operations.py:553\u001b[0m, in \u001b[0;36mconvert_outputs_to_fp32..forward\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 552\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 553\u001b[0m \u001b[39mreturn\u001b[39;00m model_forward(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/accelerate/utils/operations.py:541\u001b[0m, in \u001b[0;36mConvertOutputsToFp32.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 541\u001b[0m \u001b[39mreturn\u001b[39;00m convert_to_fp32(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mmodel_forward(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs))\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/amp/autocast_mode.py:14\u001b[0m, in \u001b[0;36mautocast_decorator..decorate_autocast\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[39m@functools\u001b[39m\u001b[39m.\u001b[39mwraps(func)\n\u001b[1;32m 12\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdecorate_autocast\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 13\u001b[0m \u001b[39mwith\u001b[39;00m autocast_instance:\n\u001b[0;32m---> 14\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/models/deberta_v2/modeling_deberta_v2.py:1310\u001b[0m, in \u001b[0;36mDebertaV2ForSequenceClassification.forward\u001b[0;34m(self, input_ids, attention_mask, token_type_ids, position_ids, inputs_embeds, labels, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m 1302\u001b[0m \u001b[39m\u001b[39m\u001b[39mr\u001b[39m\u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 1303\u001b[0m \u001b[39mlabels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):\u001b[39;00m\n\u001b[1;32m 1304\u001b[0m \u001b[39m Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,\u001b[39;00m\n\u001b[1;32m 1305\u001b[0m \u001b[39m config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If\u001b[39;00m\n\u001b[1;32m 1306\u001b[0m \u001b[39m `config.num_labels > 1` a classification loss is computed (Cross-Entropy).\u001b[39;00m\n\u001b[1;32m 1307\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 1308\u001b[0m return_dict \u001b[39m=\u001b[39m return_dict \u001b[39mif\u001b[39;00m return_dict \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39melse\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mconfig\u001b[39m.\u001b[39muse_return_dict\n\u001b[0;32m-> 1310\u001b[0m outputs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mdeberta(\n\u001b[1;32m 1311\u001b[0m input_ids,\n\u001b[1;32m 1312\u001b[0m token_type_ids\u001b[39m=\u001b[39;49mtoken_type_ids,\n\u001b[1;32m 1313\u001b[0m attention_mask\u001b[39m=\u001b[39;49mattention_mask,\n\u001b[1;32m 1314\u001b[0m position_ids\u001b[39m=\u001b[39;49mposition_ids,\n\u001b[1;32m 1315\u001b[0m inputs_embeds\u001b[39m=\u001b[39;49minputs_embeds,\n\u001b[1;32m 1316\u001b[0m output_attentions\u001b[39m=\u001b[39;49moutput_attentions,\n\u001b[1;32m 1317\u001b[0m output_hidden_states\u001b[39m=\u001b[39;49moutput_hidden_states,\n\u001b[1;32m 1318\u001b[0m return_dict\u001b[39m=\u001b[39;49mreturn_dict,\n\u001b[1;32m 1319\u001b[0m )\n\u001b[1;32m 1321\u001b[0m encoder_layer \u001b[39m=\u001b[39m outputs[\u001b[39m0\u001b[39m]\n\u001b[1;32m 1322\u001b[0m pooled_output \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpooler(encoder_layer)\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/models/deberta_v2/modeling_deberta_v2.py:1082\u001b[0m, in \u001b[0;36mDebertaV2Model.forward\u001b[0;34m(self, input_ids, attention_mask, token_type_ids, position_ids, inputs_embeds, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m 1072\u001b[0m token_type_ids \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39mzeros(input_shape, dtype\u001b[39m=\u001b[39mtorch\u001b[39m.\u001b[39mlong, device\u001b[39m=\u001b[39mdevice)\n\u001b[1;32m 1074\u001b[0m embedding_output \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39membeddings(\n\u001b[1;32m 1075\u001b[0m input_ids\u001b[39m=\u001b[39minput_ids,\n\u001b[1;32m 1076\u001b[0m token_type_ids\u001b[39m=\u001b[39mtoken_type_ids,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1079\u001b[0m inputs_embeds\u001b[39m=\u001b[39minputs_embeds,\n\u001b[1;32m 1080\u001b[0m )\n\u001b[0;32m-> 1082\u001b[0m encoder_outputs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mencoder(\n\u001b[1;32m 1083\u001b[0m embedding_output,\n\u001b[1;32m 1084\u001b[0m attention_mask,\n\u001b[1;32m 1085\u001b[0m output_hidden_states\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m,\n\u001b[1;32m 1086\u001b[0m output_attentions\u001b[39m=\u001b[39;49moutput_attentions,\n\u001b[1;32m 1087\u001b[0m return_dict\u001b[39m=\u001b[39;49mreturn_dict,\n\u001b[1;32m 1088\u001b[0m )\n\u001b[1;32m 1089\u001b[0m encoded_layers \u001b[39m=\u001b[39m encoder_outputs[\u001b[39m1\u001b[39m]\n\u001b[1;32m 1091\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mz_steps \u001b[39m>\u001b[39m \u001b[39m1\u001b[39m:\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/models/deberta_v2/modeling_deberta_v2.py:520\u001b[0m, in \u001b[0;36mDebertaV2Encoder.forward\u001b[0;34m(self, hidden_states, attention_mask, output_hidden_states, output_attentions, query_states, relative_pos, return_dict)\u001b[0m\n\u001b[1;32m 511\u001b[0m output_states \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39mutils\u001b[39m.\u001b[39mcheckpoint\u001b[39m.\u001b[39mcheckpoint(\n\u001b[1;32m 512\u001b[0m create_custom_forward(layer_module),\n\u001b[1;32m 513\u001b[0m next_kv,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 517\u001b[0m rel_embeddings,\n\u001b[1;32m 518\u001b[0m )\n\u001b[1;32m 519\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m--> 520\u001b[0m output_states \u001b[39m=\u001b[39m layer_module(\n\u001b[1;32m 521\u001b[0m next_kv,\n\u001b[1;32m 522\u001b[0m attention_mask,\n\u001b[1;32m 523\u001b[0m query_states\u001b[39m=\u001b[39;49mquery_states,\n\u001b[1;32m 524\u001b[0m relative_pos\u001b[39m=\u001b[39;49mrelative_pos,\n\u001b[1;32m 525\u001b[0m rel_embeddings\u001b[39m=\u001b[39;49mrel_embeddings,\n\u001b[1;32m 526\u001b[0m output_attentions\u001b[39m=\u001b[39;49moutput_attentions,\n\u001b[1;32m 527\u001b[0m )\n\u001b[1;32m 529\u001b[0m \u001b[39mif\u001b[39;00m output_attentions:\n\u001b[1;32m 530\u001b[0m output_states, att_m \u001b[39m=\u001b[39m output_states\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/models/deberta_v2/modeling_deberta_v2.py:362\u001b[0m, in \u001b[0;36mDebertaV2Layer.forward\u001b[0;34m(self, hidden_states, attention_mask, query_states, relative_pos, rel_embeddings, output_attentions)\u001b[0m\n\u001b[1;32m 353\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\n\u001b[1;32m 354\u001b[0m \u001b[39mself\u001b[39m,\n\u001b[1;32m 355\u001b[0m hidden_states,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 360\u001b[0m output_attentions\u001b[39m=\u001b[39m\u001b[39mFalse\u001b[39;00m,\n\u001b[1;32m 361\u001b[0m ):\n\u001b[0;32m--> 362\u001b[0m attention_output \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mattention(\n\u001b[1;32m 363\u001b[0m hidden_states,\n\u001b[1;32m 364\u001b[0m attention_mask,\n\u001b[1;32m 365\u001b[0m output_attentions\u001b[39m=\u001b[39;49moutput_attentions,\n\u001b[1;32m 366\u001b[0m query_states\u001b[39m=\u001b[39;49mquery_states,\n\u001b[1;32m 367\u001b[0m relative_pos\u001b[39m=\u001b[39;49mrelative_pos,\n\u001b[1;32m 368\u001b[0m rel_embeddings\u001b[39m=\u001b[39;49mrel_embeddings,\n\u001b[1;32m 369\u001b[0m )\n\u001b[1;32m 370\u001b[0m \u001b[39mif\u001b[39;00m output_attentions:\n\u001b[1;32m 371\u001b[0m attention_output, att_matrix \u001b[39m=\u001b[39m attention_output\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/models/deberta_v2/modeling_deberta_v2.py:293\u001b[0m, in \u001b[0;36mDebertaV2Attention.forward\u001b[0;34m(self, hidden_states, attention_mask, output_attentions, query_states, relative_pos, rel_embeddings)\u001b[0m\n\u001b[1;32m 284\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\n\u001b[1;32m 285\u001b[0m \u001b[39mself\u001b[39m,\n\u001b[1;32m 286\u001b[0m hidden_states,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 291\u001b[0m rel_embeddings\u001b[39m=\u001b[39m\u001b[39mNone\u001b[39;00m,\n\u001b[1;32m 292\u001b[0m ):\n\u001b[0;32m--> 293\u001b[0m self_output \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mself(\n\u001b[1;32m 294\u001b[0m hidden_states,\n\u001b[1;32m 295\u001b[0m attention_mask,\n\u001b[1;32m 296\u001b[0m output_attentions,\n\u001b[1;32m 297\u001b[0m query_states\u001b[39m=\u001b[39;49mquery_states,\n\u001b[1;32m 298\u001b[0m relative_pos\u001b[39m=\u001b[39;49mrelative_pos,\n\u001b[1;32m 299\u001b[0m rel_embeddings\u001b[39m=\u001b[39;49mrel_embeddings,\n\u001b[1;32m 300\u001b[0m )\n\u001b[1;32m 301\u001b[0m \u001b[39mif\u001b[39;00m output_attentions:\n\u001b[1;32m 302\u001b[0m self_output, att_matrix \u001b[39m=\u001b[39m self_output\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/models/deberta_v2/modeling_deberta_v2.py:741\u001b[0m, in \u001b[0;36mDisentangledSelfAttention.forward\u001b[0;34m(self, hidden_states, attention_mask, output_attentions, query_states, relative_pos, rel_embeddings)\u001b[0m\n\u001b[1;32m 739\u001b[0m attention_probs \u001b[39m=\u001b[39m XSoftmax\u001b[39m.\u001b[39mapply(attention_scores, attention_mask, \u001b[39m-\u001b[39m\u001b[39m1\u001b[39m)\n\u001b[1;32m 740\u001b[0m attention_probs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdropout(attention_probs)\n\u001b[0;32m--> 741\u001b[0m context_layer \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39;49mbmm(\n\u001b[1;32m 742\u001b[0m attention_probs\u001b[39m.\u001b[39;49mview(\u001b[39m-\u001b[39;49m\u001b[39m1\u001b[39;49m, attention_probs\u001b[39m.\u001b[39;49msize(\u001b[39m-\u001b[39;49m\u001b[39m2\u001b[39;49m), attention_probs\u001b[39m.\u001b[39;49msize(\u001b[39m-\u001b[39;49m\u001b[39m1\u001b[39;49m)), value_layer\n\u001b[1;32m 743\u001b[0m )\n\u001b[1;32m 744\u001b[0m context_layer \u001b[39m=\u001b[39m (\n\u001b[1;32m 745\u001b[0m context_layer\u001b[39m.\u001b[39mview(\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mnum_attention_heads, context_layer\u001b[39m.\u001b[39msize(\u001b[39m-\u001b[39m\u001b[39m2\u001b[39m), context_layer\u001b[39m.\u001b[39msize(\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m))\n\u001b[1;32m 746\u001b[0m \u001b[39m.\u001b[39mpermute(\u001b[39m0\u001b[39m, \u001b[39m2\u001b[39m, \u001b[39m1\u001b[39m, \u001b[39m3\u001b[39m)\n\u001b[1;32m 747\u001b[0m \u001b[39m.\u001b[39mcontiguous()\n\u001b[1;32m 748\u001b[0m )\n\u001b[1;32m 749\u001b[0m new_context_layer_shape \u001b[39m=\u001b[39m context_layer\u001b[39m.\u001b[39msize()[:\u001b[39m-\u001b[39m\u001b[39m2\u001b[39m] \u001b[39m+\u001b[39m (\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m,)\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] + } + ], + "source": [ + "# run = wandb.init(project=\"final_sentimental\", entity=\"nlp-10\")\n", + "\n", + "# run.name = f\"model: {MODEL_NAME} / batch_size: {per_device_train_batch_size} / lr: {learning_rate}\"\n", + "\n", + "training_args = TrainingArguments(\n", + " output_dir = './outputs',\n", + " logging_steps = logging_steps,\n", + " num_train_epochs = num_train_epochs,\n", + " per_device_train_batch_size = per_device_train_batch_size,\n", + " per_device_eval_batch_size = per_device_eval_batch_size,\n", + " learning_rate = learning_rate,\n", + " fp16=True,\n", + " report_to=\"wandb\",\n", + ")\n", + "\n", + "trainer = Trainer(\n", + " model=model,\n", + " args=training_args,\n", + " train_dataset=train_set,\n", + " eval_dataset=val_set,\n", + " compute_metrics=compute_metrics\n", + ")\n", + "\n", + "print('---train start---')\n", + "trainer.train()\n", + "# wandb.finish()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 평가" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "run.finish()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print('---val evaulate start---')\n", + "# wandb.init()\n", + "trainer.evaluate(eval_dataset=val_set, metric_key_prefix='val1')\n", + "# wandb.finish()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 학습(wandb_sweep)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "sweep_config = {'name': f\"{MODEL_NAME}_1\", # name : sweep_name\n", + " 'method': 'grid', # 'grid', 'uniform', 'bayesian'\n", + " 'parameters': {\n", + " 'lr': { # parameter 작성방식 여러개 있으니까, 노션 문서 참고\n", + " 'values': [4e-6, 5e-6, 6e-6]\n", + " },\n", + " 'warmup_step': {\n", + " \"values\": [200]\n", + " },\n", + " 'logging_steps': {\n", + " \"values\": [200]\n", + " },\n", + " \"batch_size\": {\n", + " \"values\": [8]\n", + " },\n", + " \"max_epoch\": {\n", + " \"values\": [2]\n", + " },\n", + " },\n", + " # goal : maximize, minimize\n", + " 'metric': {'name': 'val1_accuracy', 'goal': 'maximize'}\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train mode\n", + "Create sweep with ID: tdlke131\n", + "Sweep URL: https://wandb.ai/nlp-10/final_sentimental/sweeps/tdlke131\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\u001b[34m\u001b[1mwandb\u001b[0m: Ctrl + C detected. Stopping sweep.\n" + ] + } + ], + "source": [ + "# import json\n", + "\n", + "# print(\"Training with sweep mode\")\n", + "\n", + "# sweep_id = wandb.sweep(json.load(open(\"/opt/ml/level3_nlp_finalproject-nlp-04/sentence-sentimental/sweep.json\", \"r\"), object_hook=_decode), project=\"final_sentimental\", entity=\"nlp-10\")\n", + "# wandb.agent(sweep_id, trainWithSweep, count=int(5))\n", + "# wandb.finish()\n", + "from train import sweep_train\n", + "\n", + "print(\"Train mode\")\n", + "sweep_id = wandb.sweep(sweep_config, project=\"final_sentimental\", entity=\"nlp-10\")\n", + "wandb.agent(sweep_id, sweep_train, count=3)\n", + "wandb.finish()" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 평가" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [303/303 00:10]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/ml/level3_nlp_finalproject-nlp-04/sentence-sentimental/metrics/metrics.py:7: FutureWarning: load_metric is deprecated and will be removed in the next major version of datasets. Use 'evaluate.load' instead, from the new library 🤗 Evaluate: https://huggingface.co/docs/evaluate\n", + " acc = load_metric('accuracy').compute(predictions=preds, references=labels)['accuracy']\n" + ] + }, + { + "data": { + "text/plain": [ + "{'val1_loss': 0.5156943798065186,\n", + " 'val1_accuracy': 0.8489475856376393,\n", + " 'val1_f1': 0.8489475856376393,\n", + " 'val1_runtime': 12.6519,\n", + " 'val1_samples_per_second': 191.513,\n", + " 'val1_steps_per_second': 23.949,\n", + " 'epoch': 2.0}" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### inference" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---inference start---\n", + "tensor([2.0495e-01, 9.4348e-05, 7.9496e-01])\n" + ] + } + ], + "source": [ + "print('---inference start---')\n", + "my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯'*10\n", + "model = model.to('cpu')\n", + "model.eval()\n", + "with torch.no_grad() :\n", + " temp = tokenizer(\n", + " my_text,\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True,\n", + " ##\n", + " max_length=max_length,\n", + " stride=stride,\n", + " return_overflowing_tokens=True,\n", + " return_offsets_mapping=False\n", + " )\n", + " temp = {\n", + " 'input_ids':temp['input_ids'],\n", + " 'token_type_ids':temp['token_type_ids'],\n", + " 'attention_mask':temp['attention_mask'],\n", + " }\n", + " predicted_label = model(**temp)\n", + " print(torch.nn.Softmax(dim=-1)(predicted_label.logits).mean(dim=0))\n", + " # tensor([[0.0108, 0.1264, 0.8628]])" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "final", + "language": "python", + "name": "python3" + }, + "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.10.11" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "981f108a204f421f158e0977940335d851edffa6dd3586828a3e1aec045160e4" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py index 40b1c72..9f863f9 100644 --- a/sentence-sentimental/train.py +++ b/sentence-sentimental/train.py @@ -16,7 +16,6 @@ from sklearn.model_selection import train_test_split from utils.utils import config_seed - ''' - git clone https://github.com/ukairia777/finance_sentiment_corpus.git 먼저 실행 - readme.md 작성 예정 @@ -29,24 +28,30 @@ def train() : ## 모델 - MODEL_NAME = 'klue/roberta-base' - model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=3).to(device) + MODEL_NAME = 'klue/roberta-large' + model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device) tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) + ## 데이터 - data = pd.read_csv('/opt/ml/finance_sentiment_corpus/finance_data.csv') - data['labels'] = data['labels'].map({'negative':0, 'neutral':1, 'positive':2}) + data = pd.read_csv('/opt/ml/finance_sentiment_corpus/merged_samsung_filtered.csv') + def extract_label(json_str): + data_dict = eval(json_str) # JSON 문자열을 파이썬 딕셔너리로 변환 + return data_dict["label"] - temp = train_test_split(data['kor_sentence'], data['labels'], + # "label" 값을 추출하여 새로운 Series 생성 + + temp = train_test_split(data['content_corpus'], data['labels'], test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리 random_state=SEED) + sentence_train, sentence_val, label_train, label_val = temp - max_length=30 - stride=0 + max_length=200 + stride=10 ## TODO 임의의 값으로 차후 수정 - train_encoding = tokenizer(sentence_train.tolist(), + train_encoding = tokenizer(sentence_train.tolist(), ## pandas.Series -> list return_tensors='pt', padding=True, truncation=True, @@ -56,6 +61,7 @@ def train() : return_overflowing_tokens=True, return_offsets_mapping=False ) + val_encoding = tokenizer(sentence_val.tolist(), return_tensors='pt', padding=True, @@ -66,11 +72,69 @@ def train() : return_overflowing_tokens=True, return_offsets_mapping=False ) + train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True)) val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True)) + + ## 학습 + training_args = TrainingArguments( + output_dir = './outputs', + logging_steps = 50, + num_train_epochs = 2, + per_device_train_batch_size=8, + per_device_eval_batch_size=8, + learning_rate = 5e-6, + fp16=True, + report_to="wandb", + ) + + trainer = Trainer( + model=model, + args=training_args, + train_dataset=train_set, + eval_dataset=val_set, + compute_metrics=compute_metrics + ) + + print('---train start---') + trainer.train() + + + +def sweep_train(config=None) : + ## wandB + run = wandb.init(config=config) + config = wandb.config + run.name = f"model: klue/roberta-large' / batch_size: {config.batch_size} / lr: {config.lr} / warmup: {config.warmup_step}" + + ## 설정 + SEED = 42 + config_seed(SEED) + device = torch.device("cuda" if torch.cuda.is_available() else 'cpu') + + ## 모델 + MODEL_NAME = 'klue/roberta-large' + model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device) + tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) + + ## 데이터 + data = pd.read_csv('/opt/ml/finance_sentiment_corpus/merged_samsung_filtered.csv') + def extract_label(json_str): + data_dict = eval(json_str) # JSON 문자열을 파이썬 딕셔너리로 변환 + return data_dict["label"] + + # "label" 값을 추출하여 새로운 Series 생성 - data2 = pd.read_csv('/opt/ml/finance_sentiment_corpus/native_korean_news_100.csv') - val2_encoding = tokenizer(data2['kor_sentence'].tolist(), + temp = train_test_split(data['content_corpus'], data['labels'], + test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리 + random_state=SEED) + + sentence_train, sentence_val, label_train, label_val = temp + + max_length=200 + stride=10 + ## TODO 임의의 값으로 차후 수정 + train_encoding = tokenizer(sentence_train.tolist(), ## pandas.Series -> list return_tensors='pt', padding=True, truncation=True, @@ -80,71 +144,43 @@ def train() : return_overflowing_tokens=True, return_offsets_mapping=False ) - val2_set = SentimentalDataset(val2_encoding, data2['labels']) + val_encoding = tokenizer(sentence_val.tolist(), + return_tensors='pt', + padding=True, + truncation=True, + ## + max_length=max_length, + stride=stride, + return_overflowing_tokens=True, + return_offsets_mapping=False + ) + + train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True)) + val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True)) ## 학습 - run = wandb.init(project="final_sentimental", entity="nlp-10") training_args = TrainingArguments( output_dir = './outputs', logging_steps = 50, - num_train_epochs = 1, - per_device_train_batch_size=32, - per_device_eval_batch_size=32, + num_train_epochs = 2, + per_device_train_batch_size=8, + per_device_eval_batch_size=8, + learning_rate = 5e-6, fp16=True, report_to="wandb", ) + trainer = Trainer( model=model, args=training_args, train_dataset=train_set, - eval_dataset=train_set, + eval_dataset=val_set, compute_metrics=compute_metrics ) print('---train start---') trainer.train() - - ## 평가 - print('---val evaulate start---') - trainer.evaluate(eval_dataset=val_set, metric_key_prefix='val1') - - print('---test evaluate start---') - trainer.evaluate(eval_dataset=val2_set, metric_key_prefix='val2') - - # print('---inference start---') ## 추론 방법 1 - # model = model.to('cpu') ## 주의 - # my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' - # classifier = pipeline("sentiment-analysis", model=model, - # tokenizer=tokenizer) - # inference_output = classifier(my_text) - # print(inference_output) - # # [{'label': 'LABEL_2', 'score': 0.8627877831459045}] - - print('---inference start---') ## 추론 방법 2 - my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯'*10 - model = model.to('cpu') - model.eval() - with torch.no_grad() : - temp = tokenizer( - my_text, - return_tensors='pt', - padding=True, - truncation=True, - ## - max_length=max_length, - stride=stride, - return_overflowing_tokens=True, - return_offsets_mapping=False - ) - temp = { - 'input_ids':temp['input_ids'], - 'token_type_ids':temp['token_type_ids'], - 'attention_mask':temp['attention_mask'], - } - predicted_label = model(**temp) - print(torch.nn.Softmax(dim=-1)(predicted_label.logits).mean(dim=0)) - # tensor([[0.0108, 0.1264, 0.8628]]) if __name__ == '__main__': train() From 11d351e349ae08d3724c8a68d90656db4b5aae26 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Thu, 20 Jul 2023 15:46:05 +0900 Subject: [PATCH 20/63] [Experiment] Model train notebook for polyglot-ko 1.3b --- .../Model/polyglot-ko-1.3b_with_news.ipynb | 2070 +++++++++++++++++ 1 file changed, 2070 insertions(+) create mode 100644 Notebooks/Summerization/Model/polyglot-ko-1.3b_with_news.ipynb diff --git a/Notebooks/Summerization/Model/polyglot-ko-1.3b_with_news.ipynb b/Notebooks/Summerization/Model/polyglot-ko-1.3b_with_news.ipynb new file mode 100644 index 0000000..d7d03de --- /dev/null +++ b/Notebooks/Summerization/Model/polyglot-ko-1.3b_with_news.ipynb @@ -0,0 +1,2070 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "id": "XIyP_0r6zuVc" + }, + "source": [ + "# `transformers` meets `bitsandbytes` for democratzing Large Language Models (LLMs) through 4bit quantization\n", + "\n", + "
\n", + "\"drawing\"\n", + "
\n", + "\n", + "Welcome to this notebook that goes through the recent `bitsandbytes` integration that includes the work from XXX that introduces no performance degradation 4bit quantization techniques, for democratizing LLMs inference and training.\n", + "\n", + "In this notebook, we will learn together how to load a large model in 4bit (`gpt-neo-x-20b`) and train it using Google Colab and PEFT library from Hugging Face 🤗.\n", + "\n", + "[In the general usage notebook](https://colab.research.google.com/drive/1ge2F1QSK8Q7h0hn3YKuBCOAS0bK8E0wf?usp=sharing), you can learn how to propely load a model in 4bit with all its variants.\n", + "\n", + "If you liked the previous work for integrating [*LLM.int8*](https://arxiv.org/abs/2208.07339), you can have a look at the [introduction blogpost](https://huggingface.co/blog/hf-bitsandbytes-integration) to lean more about that quantization method.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "CHX-RCPdkXgP", + "outputId": "d294f833-6f45-4014-e4ed-75ef26141a0b" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Tue Jul 18 01:47:13 2023 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 Tesla V100-PCIE... Off | 00000000:00:05.0 Off | Off |\n", + "| N/A 43C P0 37W / 250W | 0MiB / 32510MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "| No running processes found |\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "FuXIFTFapAMI", + "outputId": "340f0ca7-6dfd-4350-b2d2-15f983adfc66" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv\u001b[0m\u001b[33m\n", + "\u001b[0m" + ] + } + ], + "source": [ + "# !pip install -q -U bitsandbytes\n", + "# !pip install -q -U git+https://github.com/huggingface/transformers.git\n", + "# !pip install -q -U git+https://github.com/huggingface/peft.git\n", + "# !pip install -q -U git+https://github.com/huggingface/accelerate.git\n", + "# !pip install -q datasets" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "MJ-5idQwzvg-" + }, + "source": [ + "First let's load the model we are going to use - GPT-neo-x-20B! Note that the model itself is around 40GB in half precision" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 87, + "referenced_widgets": [ + "278070bfaaac4794a649f11306ad2947", + "5391d6d2385549319099d3bf653c34ee", + "ee696f00718b43989f653dd01391a87d", + "e39e4f5284224bfdbde4359d8593d206", + "0a91d94890634dc1bb43176347c27fec", + "ec9d84f9337948cba5562b7e995bb2ef", + "3473e65596d5455385269f59e6159e38", + "416d78e5558f4019972720c8d52a410b", + "388757e992344b06b2fc7e4573eba77d", + "664f6a3720a446929197650580dd005d", + "92e0594143bd4c2690dc3ddaa0170b17" + ] + }, + "id": "jm4FzCvfeYcK", + "outputId": "bf40f8d2-7603-407d-fba5-6686eddd49aa" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Found cached dataset csv (/opt/ml/.cache/huggingface/datasets/daekeun-ml___csv/daekeun-ml--naver-news-summarization-ko-314b3fce3cddf558/0.0.0/eea64c71ca8b46dd3f537ed218fc9bf495d5707789152eb2764f5c78fa66d59d)\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "dec17cc58fc94e80b18865f0c6c4f611", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/3 [00:00\" }\n", + "# if x['input'] else\n", + "# {'text':f\"### 명령어: {x['instruction']}\\n\\n### 답변: {x['output']}<|endoftext|>\"},\n", + "# )\n", + "# data\n", + "# data = data.map(\n", + "# lambda x: {'text':f\"### 명령어: {x['instruction']}\\n\\n### 답변: {x['output']}<|endoftext|>\"},\n", + "# )\n", + "data = data.map(\n", + " lambda x: {'text': f\"### 질문: 아래의 문서를 요약해줘.\\n\\n###맥락: {x['document']}\\n\\n### 답변: {x['summary']}<|endoftext|>\" }\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "E0Nl5mWL0k2T", + "outputId": "e601d45a-99f5-46ff-aecf-497ed8754c24" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "a3b20bfff5cf4f8fb30bfb3f273f3425", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Downloading (…)okenizer_config.json: 0%| | 0.00/164 [00:00'" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tokenizer.decode(data[\"train\"][0][\"input_ids\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "id": "a9EUEDAl0ss3" + }, + "outputs": [], + "source": [ + "from peft import prepare_model_for_kbit_training\n", + "\n", + "model.gradient_checkpointing_enable()\n", + "model = prepare_model_for_kbit_training(model)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "id": "gkIcwsSU01EB" + }, + "outputs": [], + "source": [ + "def print_trainable_parameters(model):\n", + " \"\"\"\n", + " Prints the number of trainable parameters in the model.\n", + " \"\"\"\n", + " trainable_params = 0\n", + " all_param = 0\n", + " for _, param in model.named_parameters():\n", + " all_param += param.numel()\n", + " if param.requires_grad:\n", + " trainable_params += param.numel()\n", + " print(\n", + " f\"trainable params: {trainable_params} || all params: {all_param} || trainable%: {100 * trainable_params / all_param}\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Ybeyl20n3dYH", + "outputId": "327a4a63-db3d-4631-edec-23f8d08d14ac" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "trainable params: 1572864 || all params: 729403392 || trainable%: 0.21563705588032142\n" + ] + } + ], + "source": [ + "from peft import LoraConfig, get_peft_model\n", + "\n", + "config = LoraConfig(\n", + " r=8,\n", + " lora_alpha=16,\n", + " target_modules=[\"query_key_value\"],\n", + " # target_modules=[\"q_proj\", \"v_proj\"],\n", + " lora_dropout=0.05,\n", + " bias=\"none\",\n", + " task_type=\"CAUSAL_LM\"\n", + ")\n", + "\n", + "model = get_peft_model(model, config)\n", + "print_trainable_parameters(model)" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "FCc64bfnmd3j" + }, + "source": [ + "Let's load a common dataset, english quotes, to fine tune our model on famous quotes." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "s6f4z8EYmcJ6", + "outputId": "21c8ba2d-fd89-40f3-f0b6-c73772f06bf2" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wed Jul 12 02:00:00 2023 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 Tesla V100-PCIE... Off | 00000000:00:05.0 Off | Off |\n", + "| N/A 46C P0 38W / 250W | 5707MiB / 32510MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "_0MOtwf3zdZp" + }, + "source": [ + "Run the cell below to run the training! For the sake of the demo, we just ran it for few steps just to showcase how to use this integration with existing tools on the HF ecosystem." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "Filter: 0%| | 0/22194 [00:00\n", + "1 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 한국형 우주발사체 누리호 가 지난 6월 21일 전남 고흥 나로우주센터 발사대에서 날아올라 성공적으로 발사됐다. 한국항공우주연구원 제공 파이낸셜뉴스 한국형 우주발사체 누리호 의 발사 성공에 힘입어 뉴스페이스 시대를 앞당기기 위한 발걸음이 빨라졌다. 우선 누리호를 설계하고 제작 발사하는 기술을 이전받을 기업을 9월까지 선정키로 했다. 또한 민간 우주기업들을 위한 산업단지와 각종 인프라가 들어설 우주산업 클러스터가 조성될 지역을 8월중 선정할 계획이다. 이같은 계획에 앞서 윤석렬 대통령은 지난 6일 한국항공우주연구원에서 우리의 미래가 국가 경쟁력의 핵심 분야인 우주에 달려 있다 며 항공우주산업을 체계적으로 지원하겠다고 밝혔다. 이는 대선후보시절부터 내세웠던 공약을 이행하겠다는 의지를 표명한 것이다. 누리호 기술 민간에 이전 과학기술정보통신부는 7일 이를위해 제42회 우주개발진흥실무위원회를 개최하고 한국형발사체 고도화사업 체계종합기업 선정 계획과 우주산업 클러스터 추진계획을 확정했다. 과기정통부 오태석 제1차관은 이날 우주개발진흥실무위원회에서 누리호 2차 발사 성공을 통한 국민적 지지 확보와 우주개발진흥법 개정을 통한 제도적 기반 마련 국정과제 반영 등 정부의 강력한 정책 의지가 엿보인다 며 지금이 우리나라 우주산업 육성의 골든타임이라고 판단된다 고 말했다. 과기정통부는 지난 6월 국내 우주산업 육성을 위한 우주개발진흥법 개정과 누리호 2차 발사 성공 등에 발맞춰 뉴스페이스 시대를 앞당기겠다는 윤 대통령의 의지를 뒷받침하고 있다. 우선 과기정통부는 한국형발사체 고도화사업의 일환으로 체계종합기업을 선정한다. 한국형발사체 고도화사업은 올해부터 2027년까지 총 6874억원을 투입해 누리호를 4차례 반복 발사하면서 누리호의 신뢰성을 높인다. 이때 발사체 체계종합기업에 선정된 기업은 이 기간동안 한국항공우주연구원으로부터 발사체의 설계와 제작 발사 등 전과정에 참여하면서 기술을 이전받게 된다. 과기정통부는 한국연구재단을 통해 체계종합기업 선정을 위한 기술능력 평가위원회를 꾸려 평가할 계획이다. 우주산업 클러스터 8월중 선정 또한 실무위원회에서는 우주산업 클러스터 추진계획을 확정했다. 이는 뉴스페이스 시대에 대비 민간이 주도하는 우주산업 본격 육성을 목적으로 발사체 특화지구와 위성 특화지구 지정이 주요 골자다. 과기정통부는 계획안에 맞춰 발사체와 위성 특화지구의 최적 후보지를 8월중 국가우주위원회 심의를 거쳐 최종 선정키로 했다. 이를 위해 오는 9월 중 우주산업클러스터 세부 사업의 예비타당성 조사를 신청키로 했다. 예타가 성공적으로 마무리되면 내년에 예산안을 마련해 2024년부터는 본격적으로 클러스터 구축 사업에 착수할 계획이다. 과기정통부가 정한 특화지구 지정원칙에 따르면 지역균형을 고려해 특화지구 지정때 수도권은 후보지에서 제외된다. 또한 관련 인프라가 이미 구축돼 있는 지역을 우선 검토할 예정이다. 우주산업 클러스터는 기존 인프라를 중심으로 조성해 국가 우주자산 활용을 극대화한다느 전략이다. 여기에 산업단지 조성과 연구개발 등의 지원을 통해 산업체 유치와 혁신 역량을 강화한다. 발사체 특화지구에는 발사체 산업단지와 조립·제작 창업 등을 지원하는 종합지원센터가 구축된다. 또 위성 특화지구에는 위성 산업단지와 인공위성과 관련된 시험인증 창업 지원등을 위한 지원종합지원센터가 들어서게 된다.이와함께 궤도나 발사 전자파 등 우주환경 시험 시설까지 확충할 계획이다. 이외에도 지역 대학 등과 연계해 거점별 특화된 전문 인력을 상시 공급하는 계획도 포함돼 있다.\n", + "\n", + "### 답변: 한국형 우주발사체 누리호가 지난 6월 21일 전남 고흥 나로우주센터 발사대에서 성공적으로 발사됨에 따라, 우주산업 클러스터가 조성될 지역을 8월중 선정하는 등 누리호 설계 및 제작 발사하는 기술의 이전으로 뉴스페이스 시대를 앞당기기 위한 계획이 빨라지고 있다.<|endoftext|>\n", + "2 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 닥터둠 루비니 주가 50% 폭락할 것 뉴욕 증시 3대지수 모두 하락 대형주 중심의 미국 스탠더드앤드푸어스 S P 500 지수가 올 상반기 50여년만에 최악의 실적을 기록했다. 30일 이하 미국 현지시간 뉴욕 증시 3대 지수는 모두 하락하며 부진한 상반기 실적으로 마감했다. 일각에서는 경기침체 우려로 인해 추가 하락이 올 수 있다는 경고 메시지가 나오고 있다. 30일 뉴욕 증시에선 이번주 들어 4일 연속 하락장을 기록했다. 뉴욕증권거래소 NYSE 에서 다우존스 산업평균지수는 전장보다 253.88포인트 0.82% 하락한 30 775.43으로 거래를 마쳤다. S P500지수는 전장보다 33.45포인트 0.88% 하락한 3 785.38을 기술주 중심의 나스닥 지수는 전장보다 149.16포인트 1.33% 하락한 11 028.74로 장을 마감했다. 올해 상반기 마지막 거래일인 이날 뉴욕 증시 3대 지수는 모두 크게 저조한 실적을 기록했다. S P500의 경우 연초 기준으로 21.08% 하락했는데 이는 52년 전인 1970년 상반기 이후 가장 낮은 수준이다. 분기 기준으로 보면 다우와 S P500은 지난 2020년 1분기 이후 최저 기술주 중심의 나스닥은 2분기에만 22.4%가 빠졌는데 이는 2008년 이후 최악의 분기 실적이다. 홈리치 버그의 최고투자책임자 스테파니 랭은 우리는 전례없는 전염병으로 인해 세계적인 셧다운을 경험했고 재정과 통화 부문에서 모두 전례없는 결과로 이어졌다 면서 수요와 공급 부문에 퍼펙트 스톰이 불어닥쳤고 이제 수십년만에 다시 찾아오는 인플레이션으로 인해 미국 연방준비제도 연준·Fed 가 금리인상으로 바빠졌다 고 말했다. 이날 개별 종목을 보면 다우에서 약국 월그린 부츠 얼라인어스가 7.2%로 크게 하락했다. 이는 월그린이 주당 이익률을 낮췄기 때문이다. 아울러 경기침체 우려로 인해 여행 관련주들이 연속해서 하락했다. 크루즈 선사 카니발은 2% 이상 로열 캐리비언과 노로웨이 크루즈 라인도 각각 3% 이상씩 빠졌다. 이른바 닥터둠 으로 불리는 비관론자 누리엘 루비니 뉴욕대 교수는 주가가 50% 폭락할 것이라고 예상했다. 루비니 교수는 이날 마켓워치 기고문을 통해 이번에 찾아올 경기침체는 스테그플레이션과 금융위기를 동시에 동반하기 때문에 증시 하락은 50%에 이를 것 이라고 말했다. 그는 경기침체가 강할지 약할지 관계없이 역사적으로 보면 증시가 추락할 여지가 매우 크다 면서 이런 맥락에서 최근 1 2주간 보인 반등은 데드캣 바운스 에 불과하다 고 강조했다. 데드캣 바운스는 주가가 큰 폭으로 떨어지다가 잠깐 반등하는 상황을 비유할 때 쓰이는 말이다. 월가 투자정보는 유튜브 월가월부 에서 확인하세요. 자세한 해외 증시와 기업 분석 정보를 매일경제 해외 특파원들이 생생하게 전달해 드립니다.\n", + "\n", + "### 답변: 대 대형주 중심의 미국 스탠더드앤드푸어스 S P 500 지수가 올 상반기 50여년만에 최악의 실적을 기록하고 30일 이하 미국 현지시간 뉴욕 증시 3대 지수도 모두 하락하며 부진한 상반기 실적으로 마감한 가운데 일각에서는 경기침체 우려로 인해 추가 하락이 올 수 있다는 경고 메시지가 나오고 있다.<|endoftext|>\n", + "3 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 파이낸셜뉴스 풀무원식품은 알래스카 청정해역의 신선한 명태살로 만든 연육을 바삭하게 튀겨낸 ‘볼카츠’를 출시했다고 5일 밝혔다. 신제품 ‘볼카츠’ 2종 통통새우 에그포테이토 은 깨끗한 자연환경으로 잘 알려진 알래스카에서 자란 고품질의 명태 연육을 동그랗게 빚은 후 빵가루를 묻혀 튀겨 내 차별화한 프리미엄 간편식이다. 7㎜ 크기 입자의 습식 빵가루를 사용해 겉은 바삭하고 속은 촉촉한 식감을 살렸다. 여기에 건강한 바다 단백질을 함유한 명태살과 잘 어울리는 새우 계란 감자 등을 더했다. ‘통통새우 볼카츠’는 큼직하고 통통한 흰다리새우를 명태 연육과 함께 빚어 쫄깃한 식감이 특징이다. 흔히 사용되는 작은 새우 대신 71 90미 크기의 흰다리새우를 사용해 쉽게 부서지지 않고 탱탱하게 씹히는 식감을 살렸다. ‘에그포테이토 볼카츠’는 삶은 달걀을 큼직하게 썰고 감자 샐러드를 섞어 만든 스프레드로 명태 연육을 감싸 고소하고 담백한 맛을 살린 제품이다. 고로케를 연상시키는 듯한 맛과 식감으로 든든한 간식은 물론 간편 안주 메뉴로 제격이다. 신제품 ‘볼카츠’는 냉동 가정간편식 HMR 으로 보관과 조리가 편리하다. 에어프라이어 8분이면 가정에서도 손쉽게 바삭한 튀김을 완성할 수 있다. 풀무원식품 박정욱 어묵PM은 “볶음이나 탕 요리를 위한 사각형 또는 봉 형태 제품이 대부분이던 어묵 시장에 새로운 카테고리를 제시하기 위해 이번 프리미엄 신제품을 기획하게 됐다”며 “맛과 영양은 물론 조리 방법도 간단한 만큼 보다 많은 소비자들이 집에서도 간편하게 맛있는 ‘볼카츠’를 맛보길 바란다”라고 말했다.\n", + "\n", + "### 답변: 5일 5일 풀무원식품은 알래스카 청정해역의 신선한 명태살로 만든 연육을 동그랗게 빚은 후 빵가루를 묻혀 튀겨낸 '볼카츠'와 명태 연육을 감싸 고소하고 담백한 맛을 살린 '에그포테이토 볼카츠'를 출시했다고 밝혔다.<|endoftext|>\n", + "4 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 강덕원 일동제약 생산본부장. 일동제약 제공 일동제약은 생산본부장으로 강덕원 부사장을 영입했다고 지난 1일 밝혔다. 강덕원 본부장은 서울대학교와 서던캘리포니아대학교 USC 를 졸업하고 동대학원에서 생화학 및 분자생물학 석사학위를 취득했다. 이후 캘리포니아에 위치한 스태슨제약 지그프리트컴퍼니의 얼라이언스 메디컬 프로덕트 삼성바이오에피스 GC녹십자 등에서 QC와 GMP 등의 업무를 담당했다. 일동제약 관계자는 강 본부장은 다년간의 글로벌 GMP 근무경력과 전문지식을 바탕으로 생산과 품질체계를 더욱 강화하고 특히 cGMP 기준의 생산시설 구축도 추진하게 될 것 이라고 말했다.\n", + "\n", + "### 답변: 일동제약은 생산본부장으로 강덕원 부사장을 영입했다고 지난 1일 밝혔으며 강덕원 본부장은 서울대학교와 서던캘리포니아대학교 USC 를 졸업하고 동대학원에서 생화학 및 분자생물학 석사학위를 취득했으며 이후 글로벌 GMP 근무경력과 전문지식을 바탕으로 생산과 품질체계를 더욱 강화하고 cGMP 기준의 생산시설 구축도 추진하게 될 것이라고 말했다.<|endoftext|>\n", + "5 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: KIST강릉천연물연구소 등 5일 기업 지원·경제활성화 앞장 약속 한국과학기술연구원 KIST 로고 한국과학기술연구원 제공 한국과학기술연구원 KIST 로고 강릉 연합뉴스 유형재 기자 한국과학기술연구원 이하 KIST 강릉천연물연구소 한국생산기술연구원 강원본부 한국기초과학지원연구원 춘천센터 농업회사법인 커피커퍼가 5일 커피 산업 발전을 위한 업무협약을 체결한다. KIST 강릉천연물연구소에서 열릴 협약식에서 참석 기관들은 힘을 모아 애로 기술 해결 및 지역경제 활성화에 앞장서기로 약속할 예정이다. 그간 커피 산업 발전을 위해 많은 중소기업이 연합해 커피협회를 구성하고 매년 커피축제를 진행하고 있으나 대부분 소규모 기업으로 구성돼 소비자의 이해를 돕기 위한 제품 간 특성 표시 및 제품 품질 표준화에 대한 과학적 근거가 부족했다. 또 커피 품질을 높이기 위한 기술 개발도 절실한 상황이다. 아세안 카페 산업 세미나 연합뉴스 자료사진 이들 기관은 이러한 문제를 해결하기 위해 보유한 기술을 활용하고 나아가 커피 부산물 활용방안을 제시해 이를 기반으로 하는 친환경 소재 개발에 힘쓸 예정이다. 각 기관의 협력으로 기업매출 확대 일자리 창출뿐만 아니라 기업의 애로 기술 해결을 위한 산·연 협력 모델 구축으로 강원지역의 더 많은 기업의 애로 기술을 효율적으로 해결하고 지역경제 활성화에 일익을 담당할 것으로 전망한다. 장준연 KIST 강릉천연물연구소 분원장은 4일 이번 협약으로 지역 커피 관련 기업 지원에 시너지 효과를 높일 기회가 될 것으로 기대한다 고 말했다.\n", + "\n", + "### 답변: 5일 기술회사인 커피커퍼가 KIST 강릉천연물연구소와 5일 커피 산업 발전을 위한 업무협약을 체결함에 따라 기업매출 확대 일자리 창출뿐만 아니라 더 많은 기업의 애로 기술 해결을 위한 산·연 협력 모델 구축으로 지역경제 활성화에 일익을 담당할 것으로 예상된다.<|endoftext|>\n", + "6 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 매매 수수료 절감 목적도 펀드에서 주식을 매매하는 빈도를 뜻하는 매매 회전율이 5년 만에 최저치를 기록했다. 연초부터 이어진 약세장에 기관투자자들이 상품을 방어적으로 운용하고 나선 영향으로 풀이된다. 6일 한국펀드평가에 따르면 지난 2분기 기준 국내 공모펀드의 연평균 매매 회전율은 141.48%였다. 코로나19 이후 주식시장이 강세를 보였던 2020년 200%대까지 치솟았던 회전율은 지난해까지만 해도 180 190%대에서 움직였다. 전년 동기 회전율은 184.77% 수준이었다. 그러나 올해 들어 수치가 급락했다. 140%대까지 떨어진 것은 2017년 이후 5년 만이다. 매매 회전율은 펀드 내 주식 거래대금을 운용자산으로 나눈 값이다. 예컨대 운용자금이 100억원인 펀드 A에서 연 200%의 회전율을 보였다면 1년 새 200억원의 주식이 손바뀜됐다는 뜻이다. 표면적으로 회전율은 펀드 수익률과 직접적인 연관성은 없으나 매매가 잦을수록 수수료 등 펀드 내 비용이 올라가 성과를 갉아먹을 위험도 있다. 전문가들은 올해 회전율이 떨어진 것은 공모펀드 침체 영향이 크다고 진단했다. 김도형 삼성자산운용 ETF컨설팅팀장은 올해 주식시장이 약세장으로 접어들면서 공모펀드 설정액 자체가 줄어드는 양상을 보이고 있다 며 펀드에 들어오는 자금이 부족할 경우 알파 수익을 추구할 만큼의 매매 여력이 떨어질 수 있다 고 말했다. 김후정 유안타증권 연구원은 아무래도 액티브펀드에서 더 적극적인 매매가 일어난다 며 상장지수펀드 ETF 등 패시브펀드의 성장으로 액티브펀드 비중이 줄어들면서 매매율이 하락한 경향도 있을 것 이라고 설명했다. 김 연구원에 따르면 국내 액티브펀드의 순자산 규모는 현재 17조원이다. 이는 2015년 36조원에 비해 절반 이상 줄어든 수치다.\n", + "\n", + "### 답변: 매매에서 주식을 매매하는 빈도를 뜻하는 매매 회전율이 5년 만에 140%까지 떨어진 것은 연초부터 이어진 약세장에 기관투자자들이 상품을 방어적으로 운용하고 나선 영향으로 풀이된다.<|endoftext|>\n", + "7 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: ‘코오롱 H2 플랫폼’ 밸류체인 플랫폼 발표 계열사간 역량 결집과 동시에 대외 파트너십 구축 6일 동대문 DDP에서 열린 코리아 H2서밋 인베스터데이에 참석한 코오롱인더스트리 장희구 사장 왼쪽에서 네번째 ⓒ코오롱그룹 데일리안 조인영 기자 코오롱그룹이 수소산업의 밸류체인 전반을 고도화하는 플랫폼 구축에 나선다. 코오롱그룹은 6일 동대문 디자인플라자에서 열린 ‘코리아 H2 비즈니스 서밋 2022 인베스터데이’에 참가해 코오롱인더스트리와 코오롱글로벌 코오롱글로텍 코오롱플라스틱 등 그룹이 보유한 첨단기술을 바탕으로 수소 생산부터 운송 저장 발전사업까지 아우르는 코오롱 H2 플랫폼을 구축한다고 밝혔다. 코오롱인더스트리 장희구 사장은 국내외 수소산업 관련 투자자들을 대상으로 ‘코오롱 H2 플랫폼’의 산업적 가치와 의미를 설명하고 그룹의 역량을 집중하겠다고 발표했다. 최근 세계적인 탄소중립 기조에 발맞춰 수소로 대표되는 청정에너지 사업을 그룹의 지속 가능한 미래를 만들 수 있는 핵심 사업으로 성장시키겠다는 전략이다. 코오롱그룹은 수소연료전지를 중심으로 전개해 온 사업 분야를 확대 재편해 청정수소 생산부터 운송과 저장 이를 이용한 전력생산까지 원스톱 서비스가 가능한 플랫폼을 마련해 나간다. 수소 생산분야는 국내 풍력발전 시장을 선도하고 있는 코오롱글로벌과 협업해 진행한다. 풍력발전은 특성상 야간 및 유휴전력이 발생하게 되는데 이를 활용해 물을 전기 분해하는 수전해방식으로 청정수소를 생산할 예정이다. 경주와 태백 풍력단지를 비롯해 현재 추진 중인 완도 해상풍력단지에 이르기까지 수소생산을 위한 중요한 기반 시설로 활용할 계획이다. 코오롱인더스트리의 수분제어장치 및 전해질 분리막 기술 PEM MEA 이 국내에서 선두를 달리고 있고 상용화도 가능해 사업화에 속도를 낼 수 있을 것으로 보고 있다. 코오롱글로벌은 이와 동시에 천연가스 기반의 블루수소 생산사업도 추진 중에 있다. 천연가스를 개질해 수소를 발생시키는 블루수소 생산플랜트 사업은 물을 분리해 수소를 생산하는 그린수소 생산방식과는 달리 탄소배출이 일부 발생할 수 있으나 청정수소 생태계로 가기 위해 거쳐야 할 단계로 보고 사업영역을 순차적으로 확대해 나갈 계획이다. 코오롱이 직접 생산한 청정수소는 코오롱글로텍과 코오롱플라스틱이 개발하고 있는 수소저장용 고압 저장탱크와 수소탱크의 내부 지지재인 수소탱크 라이너 등으로 운송 저장된다. 6일 동대문 DDP에서 열린 코리아 H2서밋 인베스터데이에 참석한 코오롱인더스트리 장희구 사장 왼쪽에서 네번째 ⓒ코오롱그룹 코오롱글로텍은 수소 압력용기에 필수적인 드라이 와인딩 대형 수소탱크 성형기술 및 토우프레그 드라이 와인딩에 사용되는 탄소섬유 중간재 기술력을 보유 중이며 코오롱플라스틱은 수소차 하우징 부품 소재와 수소압력용기 소재 개발 기술력을 보유하고 있어 수소의 운송 저장 분야를 담당할 예정이다. 코오롱이 생산한 수소는 발전사업의 원료로도 활용한다. 코오롱인더스트리는 전국의 각 사업장에 수소발전설비를 구축하고 수소를 활용한 전력을 자체 생산해 제조설비 운영에 활용한다. 이미 상용화된 코오롱인더스트리의 고분자전해질막인 PEM을 적용한 PEMFC 고분자전해질 연료전지 기반의 연료전지 발전소가 만들어지면 수소 기반의 전력생산이 가능해져 2040년까지 탄소배출 제로 목표인 RE100 달성에도 한 발 다가서게 될 것으로 보고 있다. 이를 위해 수소산업을 함께 영위하는 기술 기업과의 긴밀한 파트너십 구축을 위한 Open Innovation 오픈 이노베이션 시스템도 전개한다. 코오롱이 추진하는 오픈 이노베이션은 수소의 생산 운송 저장 발전 등 ‘코오롱 H2 플랫폼’ 사업에 누구라도 함께할 수 있는 협력 시스템이다. 뿐만 아니라 탄소중립 연료전지용 소재 운송 저장 사업 발전사업 기술 등 다양한 분야에서 유기적 협력을 모색하고 파트너와의 상생협력으로 수소 생태계의 Total Solution Provider 종합 솔루션 공급자 로 성장하는 것을 목표로 하고 있다. 코오롱그룹 관계자는 “코오롱은 2000년대 초부터 대한민국 수소산업의 미래를 내다보고 핵심소재 개발과 수소경제 저변 확대를 위해 꾸준히 준비해왔다”며 “코오롱 H2 플랫폼의 실현을 위해 그룹이 가진 수소사업 소재 기술력과 외부 파트너들과의 Open Innovation 협력체를 통해 수소산업 생태계 전반에 핵심 Provider로 자리매김해 나갈 것”이라고 말했다. 한편 코리아 H2 비즈니스 서밋은 수소경제를 조기에 확산하고 대한민국 기업들의 수소 경쟁력을 강화할 목적으로 지난해 9월 출범했다. 코오롱그룹을 비롯해 현대차그룹 SK그룹 포스코그룹 등 총 17개 기업이 참여하고 있으며 2022 인베스터 데이 는 현대차그룹 SK그룹 등 17개 국내 회원사와 해외 에너지 기업 및 투자·금융사 임원들이 행사에 참석해 한국 수소 사업의 현황과 비전을 논의한다.\n", + "\n", + "### 답변: 코오롱그룹은 6일 동대문 디자인플라자에서 열린 ‘코리아 H2 비즈니스 서밋 2022 인베스터데이’에 참가해 그룹이 보유한 첨단기술을 바탕으로 수소 생산부터 운송 저장 발전사업까지 아우르는 코오롱 H2 플랫폼을 구축한다고 밝히고, 장희구 사장은 국내외 수소산업 관련 투자자들을 대상으로 ‘코오롱 H2 플랫폼’의 산업적 가치와 의미를 설명하고 그룹의 역량을 집중하겠다고 발표했다.<|endoftext|>\n", + "8 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 뉴스데스크 앵커 정부가 새 에너지 정책 방향을 오늘 국무회의에서 의결했습니다. 예상대로 원자력 발전의 비중을 더 늘리겠다고 했는데요 탄소 감축의 핵심인 석탄 화력발전소를 어떻게 줄일지 재생에너지를 어떻게 늘릴 지에 대해서는 발표하지 않았습니다. 먼저 배주환 기자가 보도합니다. 리포트 지난해 우리나라 발전에서 가장 큰 비중을 차지한 건 여전히 석탄화력발전입니다. 3분의 1이 넘습니다. 2위는 천연가스 29% 3위는 원전 27%입니다. 재생에너지의 비중은 7%에 불과합니다. 윤석열 정부는 원전의 비중을 2030년까지 30% 이상으로 늘리기로 했습니다. 문재인 정부가 24%로 낮추기로 한 것과 정반대입니다. 문재인 정부가 30%로 끌어올리겠다고 했던 재생에너지 비중에 대해서는 발표하지 않았습니다. 원전 비중을 30%까지 끌어올리는 방법은 수명연장입니다. 8년 뒤인 2030년 이전에 수명이 끝나는 원전은 10기. 정부는 이 10기의 수명을 모두 연장하기로 했습니다. 현재 건설 중인 신한울 1 2호기 신고리 5 6호기까지 더하면 2030년에 원전 28기를 돌리겠다는 겁니다. 김진 산업통상자원부 에너지전환정책과장 관련 산업의 경쟁력이나 생태계가 그래도 잘 구축돼 있으니 계속 강화를 하겠다는 게 정책 기조라고 보시면 될 것 같습니다. 히지만 이렇게 수명을 연장하고 가동률을 높이면 안전에 대한 우려가 생길 수 있습니다. 석광훈 에너지전환포럼 전문위원 물론 수명 연장을 위해서 설비 교체를 하겠지만 전반적인 설비의 노후화가 지금 진행이 되고 있기 때문에… 반면 탄소 배출 주범으로 꼽히는 석탄화력발전소를 어떻게 줄일지 신재생에너지는 얼마나 늘릴지에 대한 계획은 발표하지 않았습니다. 석탄화력은 합리적 감축 유도 재생에너지는 합리적 수준으로 조정 한다는 말이 전부였습니다. MBC뉴스 배주환입니다. 영상취재 박종일 영상편집 박병근 MBC 뉴스는 24시간 여러분의 제보를 기다립니다.\n", + "\n", + "### 답변: 정부가 정부가 오늘 국무회의에서 의결한 새 에너지 정책 방향의 주요 내용인 원자력 발전의 비중을 더 늘리겠다는 계획과 탄소 감축의 핵심인 석탄 화력발전소를 어떻게 줄일지, 재생에너지는 얼마나 늘릴 지에 대한 내용은 발표하지 않았으며, 석탄화력은 합리적 감축 유도 재생에너지는 얼마나 늘릴지에 관한 내용은 발표하지 않은 것으로 알려졌다.<|endoftext|>\n", + "9 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 연내 첫 번째 종합계획 수립해 지원사업 본격 추진 이데일리 김형욱 기자 정부가 3년마다 종합계획을 수립해 산업계의 디지털 전환을 지원하는 산업디지털전환촉진법이 5일부터 시행한다. 산업통상자원부는 연내 첫 번째 종합계획을 수립해 기업 간 데이터 연결과 활용 환경 조성 등 다양한 지원사업을 펼칠 계획이다. 장영진 산업통상자원부 제1차관 앞줄 가운데 을 비롯한 관계자가 4일 충북 청주 LS일렉트릭 제1공장에서 산업 디지털 전환 기업 간담회에서 기념촬영하고 있다. 산업부는 5일 산업디지털전환촉진법 시행에 맞춰 연내 첫 번째 종합계획을 수립해 시행할 계획이다. 사진 산업부 장영진 산업부 제1차관은 산업디지털전환촉진법 시행을 하루 앞둔 지난 4일 충북 청주 LS일렉트릭 제1공장에서 산업 디지털 전환 기업 간담회를 열고 올 하반기 수립할 산업 디지털 전환 종합계획 의견수렴 작업에 본격 착수했다. 이날 행사엔 LS일렉트릭 외 포스코 LG전자 센트랄 한국야금 SK텔레콤 네이버클라우드 등 기업 관계자가 참석했다. 정부는 우리 산업의 경쟁력을 유지하기 위해선 디지털 전환을 필수라고 보고 이 법 제정을 추진해 왔다. 이 법은 지난해 12월 국회 의결 절차를 거쳐 7월5일부터 정식 시행하게 됐다. 산업부는 또 앞선 2020년 10월 22개 산업 업종별 협회·단체로 이뤄진 디지털전환 네트워크를 출범해 기업이 당장 필요로 하는 디지털 전환 수요 조사에 나섰다. 산업부는 이를 통해 약 300개 추진 과제를 축적했고 이를 기본계획에 따른 각종 지원사업 추진 과정에서 참조한다는 계획이다. 이미 일부 과제는 산업부 연구개발 사업과 연계해 지원사업을 추진 중이다. 산업부는 첫 기본계획에 개별 기업의 디지털화를 넘어 가치사슬로 얽힌 기업 간 데이터의 연결과 활용 환경을 조성한다는 내용을 담을 계획이다. 제조 분야의 디지털 전문가 공급 개별 중소기업에 대한 인식 개선 계획도 포함한다. 장영진 차관은 “올 하반기 산업계 의견을 최대한 반영한 종합계획을 수립해 기업 간 협업 프로젝트 지원을 강화하고 인력 공급과 중소기업 인식 개선에 나설 것”이라며 “대기업도 중견·중소기업과의 데이터 공유·활용과 우수사례 전파 등 선도적 역할을 해달라”고 전했다.\n", + "\n", + "### 답변: 산업디지털전환촉진법 시행을 하루 앞둔 지난 4일 산업부 장영진 제1차관은 산업 디지털 전환 기업 간담회를 열고 올 하반기 수립할 산업 디지털 전환 종합계획 의견수렴 작업에 본격 착수했으며 첫 기본계획에 개별 기업의 디지털화를 넘어 가치사슬로 얽힌 기업 간 데이터의 연결과 활용 환경을 조성한다는 내용을 담을 계획이다.<|endoftext|>\n", + "10 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 사진 한국동서발전 한국동서발전은 다음달 31일까지 울산시민과 함께하는 생활 속 걷기 챌린지 탄소중립 건강걷기 누비GO 초록발자국 챌린지 를 진행한다고 1일 밝혔다. 울산숲사랑운동과 함께 하는 이번 챌린지는 코로나19로 지친 시민들이 일상 속 걷기 운동을 통해 건강을 증진하고 자가용 대신 대중교통을 이용해 탄소중립 사회를 실현하기 위해 마련됐다. 울산시민 누구나 구글플레이 또는 앱스토어에서 스마트폰 어플 워크온 을 내려받아 회원가입 후 참여할 수 있다. 챌린지 목표인 10만보·20만보·30만보를 기간 내 달성하면 추첨을 통해 교통카드 등 소정의 기념품을 증정한다. 김태규 동서발전 탄소중립실장은 초록발자국 챌린지를 통해 코로나19로 지친 울산시민들이 활력을 되찾고 대중교통 활성화로 탄소중립 실천에 기여하길 바란다 며 앞으로도 다양한 탄소중립·환경 프로젝트를 추진하여 더 많은 시민이 참여할 수 있도록 최선을 다하겠다 고 말했다.\n", + "\n", + "### 답변: 한국동서발전은 다음달 31일까지 울산숲사랑운동과 함께 코로나19로 지친 시민들이 일상 속 걷기 운동을 통해 건강을 증진하고 자가용 대신 대중교통을 이용해 탄소중립 사회를 실현하기 위한 챌린지 탄소중립 건강걷기 누비GO 초록발자국 챌린지 를 진행한다고 1일 밝혔다.<|endoftext|>\n", + "11 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 앵커 고공행진하는 물가에 주머니 사정도 빠듯해지고 있습니다. 소비자들은 한푼이라도 아끼기 위해 짠물 소비 에 나서고 있는데요 고물가 시대 달라진 소비행태를 전효성 기자가 살펴봤습니다. 기자 50대 주부 임동순 씨는 대형마트 마감 시간대를 주로 이용해 장을 보고 있습니다. 이 시간대에 육류나 신선제품을 구매하면 정가의 최대 70% 수준에 상품을 구매할 수 있기 때문입니다. 임동순 서울 관악구 자주 와요 마감 시간에 신선식품이나 생선 같은 경우는 30% 정도 세일 하거든요 그럴 때 엄청 덕을 많이 보죠. 실제 한 대형마트에 따르면 마감세일 시작 시간인 오후 7시 이후 매출액이 지난해보다 20% 이상 늘어난 것으로 집계됐습니다. 그나마도 오이 1개 고기 200g처럼 한 두끼 식사에 쓰일 소포장 판매가 주를 이룹니다. 밀키트 제품도 다시금 소비자의 관심을 받고 있습니다. 외식 배달 물가가 고공행진하면서 집에서 간단히 조리해 먹을 수 있는 밀키트 제품이 대체재로 떠오른 겁니다. 기자 물가가 고공행진 하면서 달라진 소비 패턴이 있다면 어떤 게 있을까요. 이기현 서울 중구 외식 안 해요 외식하는 것보다 밀키트 사서 끓여먹는 게 훨씬 경제적이죠. 양도 많고 제가 넣고 싶은 건 더 넣을 수도 있고… 엔데믹에 접어들며 주춤할 것으로 예상됐던 밀키트는 20% 넘는 성장세를 보이는 반면 배달앱 이용자 수는 매달 연중 최저치를 경신하고 있습니다 3 532만명 → 3 209만명 . 편의점 앱에서 유통 기한이 얼마 남지 않은 제품을 저렴하게 구매하는 것도 알뜰 쇼핑족이 애용하는 방법입니다 CU 그린세이브 21.5% GS25 라스트오더 254% 이처럼 짠물소비가 늘면서 유통업계는 물가 구원투수를 자처하며 최저가 경쟁에 나섰습니다. 이마트는 계란 김치 우유 등 40대 필수 상품군을 다른 업체보다 무조건 싸게 팔겠다 고 선언했고 롯데마트는 물가안정TF 를 꾸려 생필품 500여종의 가격을 집중적으로 관리하겠다는 계획을 발표한 상황. 인플레이션이 당분간 계속될 것으로 보이는 만큼 올해 연말까지는 최저가 경쟁을 이어간다는 방침입니다. 김태희 이마트 부장 고객들의 생활비 부담을 조금이라도 덜어드리기 위해 매일 40대 필수 상품에 대한 가격관리를 통해 항상 최저가로 제공해 드리려고 하고 있고… 사상 초유의 6%대 물가 상승률이 현실화된 가운데 눈물나는 짠물 소비 소비자들을 잡기 위한 유통업계의 경쟁이 더욱 치열해지고 있습니다. 한국경제TV 전효성입니다.\n", + "\n", + "### 답변: 소비물가 상승률이 현실화된 가운데 소비자들은 한푼이라도 아끼기 위해 짠물 소비 에 나서고 있는데다 밀키트 제품도 다시금 소비자의 관심을 받고 있어 유통업계는 물가 구원투수를 자처하며 최저가 경쟁에 나섰다.<|endoftext|>\n", + "12 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 주파수 추가 할당 확보 유력 정부 심사 통과 가능성 높아 3사 100㎒ 폭씩 균등 배분 LG유플러스가 5세대 5G 이동통신 주파수 3.4 3.42㎓ 대역 할당을 단독 신청했다. SK텔레콤과 KT는 고심 끝에 할당 신청을 하지 않기로 했다. 경매가 아닌 정부 심사 할당 절차를 거쳐 LG유플러스의 20㎒ 폭 추가주파수 단독 확보가 유력해졌다. 과학기술정보통신부는 4일 오후 6시 3.4 3.42㎓ 대역 주파수할당 신청 접수를 마감한 결과 LG유플러스만 신청한 것으로 확인했다. LG유플러스는 서비스 제공 시기와 제공 지역 무선국 구축 계획 등에 관한 사항을 담은 주파수 이용계획서를 제출했다. 과기정통부 이동통신 IMT 용 주파수할당 공고 에 의거해 할당을 신청한 법인이 1개로 신청 절차가 종결됐다. 이에 따라 경매 대신 정부 심사로 할당 적격 여부를 평가하는 대가산정 주파수할당 방식이 적용된다. LG유플러스가 심사를 통과할 경우 과기정통부가 경매 최저경쟁가격으로 제시한 총 1521억원에 2022년 11월 1일부터 2028년 11월 30일까지 6년간 사용권을 확보하게 된다. 과기정통부는 할당 조건으로 △2025년까지 누적 5G 무선국 15만국 구축 △5G 농어촌 공동망 2023년 12월 조기 구축 △인접 대역 사업자는 신규 1만5000국 5G 무선국 구축 이후 할당 주파수 사용 △농어촌 지역에 한해 할당 즉시 주파수 이용 등 조건을 부과했다. LG유플러스가 직접 추가주파수 할당을 신청해서 진행하는 할당 절차인 만큼 심사를 통과하지 못할 공산은 극히 낮다는 게 업계의 일반적인 관측이다. 김윤호 LG유플러스 공정경쟁담당은 “5G 주파수를 추가로 확보해 서비스 품질을 개선하고 고객의 편익을 증진하는데 기여하겠다”고 말했다. 과기정통부는 주파수 할당으로 인한 투자 효과가 1조원 이상이 될 것으로 예상했다. 이통 3사가 5G 황금주파수로 꼽히는 3.5㎓ 대역에서 균등하게 100㎒ 폭을 보유하게 됐다. 3사 간 차별화된 네트워크 품질 확보를 위한 투자 경쟁이 순조롭게 진행될 경우 예상되는 투자 효과다. 과기정통부 관계자는 “LG유플러스를 대상으로 한 할당신청 적격여부 검토에 착수할 예정이며 7월 중으로 심사위원회를 구성해 할당심사를 진행할 것”이라고 밝혔다. 경쟁사는 주파수 할당 신청을 하지 않았다고 공식확인했다. SK텔레콤은 기존 신청한 3.7 3.72㎓ 주파수 대역과 관련해 정부와 계속 협의하겠다는 입장을 피력했다. KT는 정부에 LG유플러스에 대해 주파수를 할당하더라도 철저한 이행점검이 필요하다는 입장을 밝혔다.\n", + "\n", + "### 답변: 과학기술정보통신부는 4일 LG유플러스가 단독으로 5G 이동통신 주파수 3.4 3.42GHz 대역 할당을 신청했다고 밝혔으며 이로 인해 SK텔레콤과 KT는 할당 신청을 하지 않기로 했고 정부 심사 할당 절차를 통해 LG유플러스의 20MHz 폭 추가주파수 단독 확보가 유력하다.<|endoftext|>\n", + "13 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 스포츠조선이 주최하는 제1회 청룡시리즈어워즈 시상식 Blue Dragon Series Awards 이하 BSA 에 대한 관심과 반응이 매우 뜨겁다. 오는 19일 오후 7시 인천 파라다이스시티에서 개최되는 청룡시리즈어워즈는 국내 최초 스트리밍 시리즈 콘텐츠들을 대상으로 한 시상식으로 급변하는 영상 시장 속 오리지널 콘텐츠들에 대한 높은 관심과 전 세계적으로 높아진 K 콘텐츠의 위상을 공고히 하기 위해 만들어졌다. 수상 후보 선정을 위한 청룡시리즈어워즈 후보작 자 선정 투표에 이어 지난 6일부터 시작된 후보작 자 최종 투표는 8일 오후 기준 총 투표 수 230만을 가뿐히 넘어섰다. 청룡 이라는 두 글자가 주는 공정성과 권위 속에 이번 시상식에 대한 팬들의 뜨거운 관심과 업계 기대를 엿볼 수 있는 대목이다. ◇ LG유플러스가 진행하는 청룡시리즈어워즈 레드카펫 1열 직관 이벤트. 사진제공 LG유플러스 한편 K 콘텐츠를 사랑하는 찐팬 이라면 한 번쯤 밟아보고 싶을 만한 이번 시상식 레드카펫 이벤트에 대한 관심도 매우 높다. LG유플러스는 최근 제1회 청룡시리즈어워즈 시상식 공식 후원을 결정하고 U tv 레드카펫 1열 직관 이벤트 를 진행하고 있다. 콘텐츠 마니아들에게 레드카펫 1열에서 직접 K 콘텐츠 스타들을 직접 두 눈에 담을 수 있는 기회를 제공하기로 한 것. 연예·엔터 분야로 입지를 넓히는 한편 K 콘텐츠 산업의 진흥과 발전을 돕기 위함이라고 관계자는 설명했다. LG U tv의 공식 유튜브 채널인 U tv 이모티콘 이 세상 모든 콘텐츠 담당자들이 직접 기획과 촬영 제작한 시상식 현장 스케치 영상은 공개 직후 조회수가 70만회 이상을 기록하기도 했다. LG유플러스는 이번 시상식 레드카펫과 본 시상식 생중계에도 직접 나선다. 생생한 시상식 현장을 안방 1열 로 전달하기 준비에도 한창이다. 이번 시상식과 관련된 다양한 콘텐츠 생산에도 열을 올릴 계획이다. LG유플러스 IPTV 서비스를 이용하는 고객이라면 제1회 청룡시리즈어워즈 시상식을 U tv 채널 234번과 모바일tv를 통해 시청할 수 있다. LG U tv 관계자는 13일까지 U tv 이모티콘 유튜브 채널 커뮤니티 탭에서 신청 가능한 레드카펫 1열 직관 이벤트 에 대해 많은 관심 가져주시기 바란다 고 말했다.\n", + "\n", + "### 답변: 스포츠조선이 주최하는 제1회 청룡시리즈어워즈 시상식 Blue Dragon Series Awards 이하 BSA 에 대한 관심과 반응이 매우 뜨거운 가운데 오는 19일 오후 7시 인천 파라다이스시티에서 개최되는 청룡시리즈어워즈는 국내 최초 스트리밍 시리즈 콘텐츠들을 대상으로 한 시상식으로 급변하는 영상 시장 속 오리지널 콘텐츠들에 대한 높은 관심과 전 세계적으로 높아진 K 콘텐츠의 위상을 공고히 하기 위해 만들어졌고.K콘텐츠 사랑하는 찐팬 이라면 한 번쯤 밟아보고 싶을 만한 이번 시상식 레드카펫 이벤트에 대한 관심도 매우 높아<|endoftext|>\n", + "14 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 5월 소비자물가 상승률 5.4%… 6월엔 6% 직영주유소 1일부터 유류세 37% 즉시 인하 정부 3일 수출 애로 해소·지원 대책 논의 방기선 1차관 비상경제차관회의 주재 방기선 기획재정부 1차관이 1일 정부서울청사에서 열린 비상경제차관회의를 주재하고 있다. 2022.7.1. 연합뉴스 정부가 6월 소비자물가 상승률이 5월보다 더 높아진다고 예고했다. 5월 물가 상승률이 5.4%였던 점을 고려하면 6월 상승률은 5%대 후반에서 6% 초반 사이가 될 것으로 보인다. 방기선 기획재정부 1차관은 1일 정부서울청사에서 열린 제2차 비상경제차관회의에서 “5월 5.4%에 이어 6월에는 소비자물가 상승률이 더욱 높아질 전망”이라면서 “앞으로도 상당 기간 인플레이션 압력이 지속될 것”이라고 말했다. 정부는 이런 고물가 상황을 조금이라도 완화하고자 이날부터 유류세를 법적 최대한도인 37%까지 낮춘다. 유류세 인하율이 오롯이 반영되면 휘발유는 ℓ당 57원 경유는 38원씩 내려가는 효과가 나타난다. MobileAdNew center 정유사 직영주유소는 이날부터 즉시 가격을 인하했다. 정부는 자영주유소에도 가격이 인하된 물량이 최대한 빨리 공급될 수 있도록 비상 운송에 나설 계획이다. 7월 첫째 주부터는 관계 기관이 석유시장 점검단을 꾸려 주 2회 이상 전국 주유소를 현장 방문해 물가 상승기에 편승한 주유소의 가격 담합과 가짜석유 유통 등 불법행위를 적발할 예정이다. 방 차관은 이날 발표된 상반기 수출입 통계에 대해 “무역수지 적자 폭은 지난달보다 다소 확대됐지만 6월 하순 들어 수출이 빠르게 회복하면서 적자 폭을 상당히 줄일 수 있었다”고 설명했다. 이어 “수출 애로 해소와 하반기 수출 활성화를 위해 당장 추진할 필요가 있는 지원 대책을 검토 중”이라면서 “이번 주 일요일 3일 비상경제장관회의에서 논의할 계획”이라고 말했다. 산업통상자원부는 올해 상반기 무역수지 적자가 103억 달러를 기록했다고 밝혔다. 이는 상반기 기준 역대 최대 규모다.\n", + "\n", + "### 답변: 정 6월 소비자물가 상승률이 5.4%에 이어 6월에도 소비자물가 상승률이 5%대 후반에서 6% 초반 사이가 될 것으로 예상되면서 정부는 고물가 상황을 조금이라도 완화하고자 유류세를 법적 최대한도인 37%까지 낮춤과 동시에 직영주유소에도 가격이 인하된 물량이 최대한 빨리 공급될 수 있도록 비상 운송에 나설 계획이다.<|endoftext|>\n", + "15 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: LG전자가 지난 1일 서울시 강남구에 위치한 초 超 프리미엄 빌트인 가전 브랜드 시그니처 키친 스위트 청담 쇼룸 1층 카페에서 유명 피아니스트 겸 작곡가인 이루마 사진 왼쪽 의 피아노 콘서트와 유명 셰프인 오스틴강의 쿠킹쇼를 진행했다. 사진제공 LG전자 LG전자가 피아니스트 이루마 셰프 오스틴강과 함께 프리미엄 빌트인 가전 브랜드 시그니처 키친 스위트 의 차별화된 고객가치를 알리는 콘서트를 열었다. 이루마가 피아노를 연주하고 오스틴강이 쿠킹쇼를 진행했다. LG전자는 지난 1일 서울시 강남구 시그니처 키친 스위트 청담 쇼룸 1층 카페에서 시그니처 키친 스위트 콘서트를 개최했다고 3일 밝혔다. 공연엔 시그니처 키친 스위트 구매고객과 인플루언서 등 총 40여명이 참석했다. 이날 이루마는 자신의 곡 가운데 공간을 작품으로 삶을 예술로 라는 시그니처 키친 스위트의 브랜드 철학과 어울리는 13곡을 엄선해 연주했다. 해당 곡은 공연 후에도 청담 쇼룸 카페에서 들을 수 있다. 피아노 콘서트 뒤에는 오스틴강의 쿠킹쇼가 이어졌다. 고객들은 △다양한 용량의 제품을 목적에 맞게 선택해 조합할 수 있는 컬럼형 냉장·냉동고 △상·중·하칸의 온도를 각각 조절할 수 있는 컬럼형 와인셀러 △5개 화구를 갖춘 전기레인지 △원바디 블랙글라스 디자인의 스팀오븐과 광파오븐 등 시그니처 키친 스위트 제품을 활용해 오스틴강이 대표 레시피로 만든 요리를 즐겼다. LG전자는 2017년 국내 최초 초프리미엄 빌트인 가전 브랜드 전시관인 시그니처 키친 스위트 논현 쇼룸을 개관한 데 이어 지난해 복합문화공간인 청담 쇼룸을 선보였다. 이곳에서는 가전과 가구가 조화를 이루는 공간을 직접 체험하고 공간별 구성제품을 패키지로 구입할 수 있다. 오승진 LG전자 한국영업본부 한국전략담당은 더 많은 고객이 초프리미엄 브랜드가 선사하는 차원이 다른 가치를 경험할 수 있도록 다양한 분야에서의 마케팅 활동을 전개할 것 이라고 말했다.\n", + "\n", + "### 답변: LG전자는 지난 1일 서울시 강남구 시그니처 키친 스위트 청담 쇼룸 1층 카페에서 시그니처 키친 스위트 콘서트를 열어 구매고객과 인플루언서 등 총 40여명과 함께 시그니처 키친 스위트의 브랜드 철학과 어울리는 13곡을 엄선해 연주하고 피아니스트 이루마와 오스틴강의 쿠킹쇼를 진행했다고 3일 밝혔다.<|endoftext|>\n", + "16 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 여야 저금리 갈아타는 원스톱 플랫폼 한목소리 요구 지난해 은행ㆍ핀테크 간 이견으로 추진 중단돼 금융위 의견 조율 나서...시중은행 여전히 반대 이데일리 전선형 최훈길 박기주 기자 지난해 8월 이후 논의가 중단된 ‘대환대출 플랫폼’ 구축이 다시 재논의된다. 대출금리 고공 비행으로 차주들의 이자 부담이 커지면서 이번엔 정치권에서 ‘카드’를 들이밀었다. 하지만 과거에도 은행들과 빅테크 간 이견이 컸던 만큼 이번에도 플랫폼 구축이 쉽지는 않을 것이란 관측이다. ‘대환대출’ 고금리 부담 줄여줄 수 있어 6일 금융당국에 따르면 금융위원회는 금융사들에게 ‘대환대출플랫폼’ 구축에 대한 의견을 조율 중이다. 특히 은행과 빅테크사를 중심으로 대환대출 플랫폼 구축 및 이용 방식에 대한 의견을 물은 것으로 전해진다. 금융결제원 망에 핀테크가 운영 중인 대출금리 비교 서비스를 연동하면 대출 갈아타기가 가능하다. 모든 가계대출을 모바일로 법무사 비용 없이 쉽게 갈아타는 것이다. 사진은 지난해 금융위원회가 추진하려다 무산된 비대면 대환대출 플랫폼 설명 내용이다. 자료 금융위원회 대환대출플랫폼은 모바일 등 비대면으로 여러 금융사 대출 상품의 금리를 조회하고 그중 낮은 금리로 갈아탈 수 있도록 하는 시스템을 말한다. 지난해 8월 금융당국이 빅테크가 운영 중인 대출금리 비교 서비스를 활용해 은행ㆍ카드사ㆍ저축은행 등의 대출상품을 갈아탈 수 있도록 하는 방식으로 사업을 추진했다. 망은 금융결제원 망을 이용하기로 했다. 하지만 당시 은행권은 고객을 빼앗길 우려를 내비치면서 강한 반발을 했고 결국 사업은 중단됐다. 그렇게 잊혔던 대환대출플랫폼이 1년 만에 다시 고개를 든 건 정치권의 압박이 있었기 때문이다. 기준금리 인상 물가 인상 등으로 차주들의 부담이 커지면서 금리 부담을 줄이기 위해서는 ‘대환대출 플랫폼이 반드시 필요하다’는 게 정치권의 생각이다. 특히 이번에는 여야 할 것 없이 한목소리를 내고 있다. 실제 국민의 힘은 지난 5일 금융당국에 대환대출 플랫폼 사업을 신속하게 추진할 것을 요구했다. 성일종 국민의힘 정책위의장은 원내대책회의를 통해 “대환대출 플랫폼이 지난해 추진됐으나 금융권 상황으로 중단됐다”며 “하지만 당시보다 상황이 더 악화된 지금과 같은 금리 상승기에 무엇보다 필요한 사업“이라고 강조했다. 국민의힘은 김주현 금융위원장 후보자가 위원장으로 임명되는 즉시 당정 간담회를 열고 대환대출 플랫폼 등 서민 금융 지원 방안을 1순위로 논의하겠다는 입장이다. 더불어민주당도 6일 오전 ‘상환부담 완화를 위한 원스톱 대출 이동제 도입 간담회’를 열고 대환대출 플랫폼에 대한 구체적인 논의를 했다. 박홍근 더불어민주당 원내대표는 “낮은 금리의 대출로 갈아타는 대환대출도 서민들의 부담 줄이기 위해 고려할 선택지”라며 “당사자 간의 이해충돌로 현재는 추진이 중단됐지만 급격한 고금리로 국민들의 부담이 가중되는 비상 상황인 만큼 원스톱 대출 이동제를 시급히 도입해야 한다”고 말했다. 은행권 우려 여전해...반면 빅테크는 적극적 다만 금융권이 이를 받아들일 지는 미지수다. 특히 빅테크들의 금융권 진출로 고유 영역 예금ㆍ대출 을 빼앗긴 시중은행들의 반발은 여전히 거세다. 지난해에도 금융당국의 대환대출 플랫폼 추진 과정에서 시중은행들이 빅테크 종속·수수료 지급 등을 이유로 불참을 선언하면서 결국 도입이 무산됐다. 더욱이 당시 은행끼리 모여 추진했던 자체 플랫폼 구축 사업도 시중은행ㆍ지방은행ㆍ인터넷은행 간에 의견이 갈리면서 현재 중단된 상태다. 반면 빅테크ㆍ핀테크사들은 적극적으로 움직이고 있다. 토스도 대환대출 플랫폼 사업 진출 채비에 나섰다. 특히 토스는 금융당국 주도의 대환대출플랫폼에 참여 요청이 있다면 적극적으로 검토하겠다는 입장이다. 60개 금융사 대출 비교가 가능한 ‘핀다’ SK텔레콤 017670 과 하나금융그룹이 투자한 ‘핀크’도 대환대출 플랫폼에 참여할 예정이다. 현재 양사 모두 대출 비교는 가능하나 앱으로 실시간 대출 갈아타기는 불가능하다. 한 금융권 관계자는 “금융결제원의 망을 이용하고 플랫폼 서비스를 그대로 활용하면 되니까 사실 시스템적으로 문제 될 것은 없다”며 “하지만 각 금융사마다 신용등급을 산정하는 기준이 달라 직접적인 비교가 불가능하고 기존 금융권의 경우 빅테크 플랫폼 이용 시 수수료까지 지불해야 하는 불합리성이 있어 해당 사업이 달갑지 않은 건 사실”이라고 말했다.\n", + "\n", + "### 답변: 6금리 인상 물가 인상 등으로 차주들의 이자 부담이 커지면서 금리 부담을 줄이기 위해 대환대출 플랫폼 구축이 다시 재논의되나 과거에도 은행들과 빅테크 간 이견이 컸던 만큼 이번에도 플랫폼 구축이 쉽지는 않을 전망이다.<|endoftext|>\n", + "17 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 노조 운송료 27% 인상 vs 제조사 9%대 인상 차주 8 200명 파업 참가로 150여 공장 가동 중단 건설업계 연이은 파업에 공기 연장 등 피해 우려 수도권의 레미콘 운송 차주들이 파업에 돌입한 1일 오후 경기도 안양시의 한 레미콘 업체에 레미콘 차량이 세워져 있다. 연합뉴스 수도권 레미콘 제조사들과 운송료 인상 협상이 결렬되면서 수도권 레미콘운송노조 조합원들이 1일부터 파업에 돌입했다. 양측은 협상을 이어간다지만 간극이 커 파업이 장기화할 가능성도 배제할 수 없는 상황이다. 건설현장에 미칠 파장도 만만찮을 전망이다. 레미콘운송노조에 따르면 수도권 레미콘운송노조는 주요 레미콘 제조사들과 운송료 인상 관련 협상 결렬을 이유로 이날부터 운송 거부에 들어갔다. 파업에 참가하는 차주는 8 200여 명에 달한다. 노조는 수도권 내 158곳에 달하는 레미콘 공장이 가동을 멈춘 것으로 파악했다. 양측은 지난달 29일과 30일에 걸쳐 운송료 협상을 진행했지만 합의에 이르지 못했다. 수도권 레미콘운송조합원들은 운송료를 회당 5만6 000원에서 7만1 000원으로 약 27% 인상을 요구하고 있다. 또 △명절상여금 100만 원 △근로시간 면제수당 △성과급 1인당 100만 원 △요소수 100% 지급 등도 요구하고 있다. 이에 반해 레미콘 제조사들은 운송료는 9%대 중반 이상의 인상은 어렵다고 맞서고 있다. 운송노조 관계자는 제조업체는 레미콘 납품가격을 인상했지만 레미콘가격에 포함된 운송비는 올려주지 않고 있다 고 주장했다. 이어 지방은 운송료가 올랐지만 수도권만 합의가 미진해 형평성에 어긋난다 고 덧붙였다. 다만 노조 측은 제조사들과의 협상은 이어간다는 방침이다. 노조 파업으로 건설업계가 직격탄을 맞게 됐다. 지난달 화물연대 파업에 이어 레미콘 운송 거부까지 이어지면서 작업 중단 등 또다시 피해를 입게 됐다. 파업이 장기화할 경우 공기가 늘어나고 아파트 입주 일정도 미뤄질 수밖에 없어 손실 규모는 더욱 커질 전망이다. 한 대형건설사 관계자는 화물연대 파업 때도 콘크리트 타설 골조공사가 중단됐었다 며 파업이 끝난 지 얼마 안 됐는데 또다시 레미콘운송조합 파업이 이어져 난감하다 고 토로했다.\n", + "\n", + "### 답변: 수도체 레미콘운송노조는 주요 레미콘 제조사들과 운송료 인상 관련 협상 결렬을 이유로 1일부터 파업에 돌입하여 건설업계가 직격탄을 맞게 됐으며 지난달 화물연대 파업에 이어 레미콘 운송 거부까지 이어지면서 작업 중단 등 또다시 피해를 입게 됐다.<|endoftext|>\n", + "18 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 일본 신문 니케이엠제이가 한국 프랜차이즈 업계에서 이례적으로 윤홍근 제너시스BBQ그룹 회장을 다룬 기사를 냈다. 사진은 BBQ의 치킨대학 전경. 사진제공 제너시스BBQ 윤홍근 제너시스BBQ그룹 회장이 한국 프랜차이즈 대표로는 이례적으로 일본 경제지와 인터뷰를 진행했다. 지난 1일 니케이엠제이는 윤 회장 인터뷰가 포함된 BBQ 취재 기사를 보도했다. 일본 매체로는 처음으로 치킨대학을 탐방했다는 점이 의미 있다. 니케이엠제이는 일본 주요 경제신문인 니혼게이자이신문의 유통·마케팅 전문지다. 해당 매체는 윤 회장에 대해 프랜차이즈 세계 1등의 야망을 품은 경영인 이라는 평가와 함께 BBQ가 라이벌로 미국 맥도날드를 꼽고 있는 점을 조명했다. 윤 회장은 세계 5만여개의 점포를 열고 맥도날드를 추격하고 싶다 고 전했다. 일본에서는 치킨 프랜차이즈가 라이벌로 KFC가 아닌 맥도날드를 꼽는 데 의아함을 나타냈다. 이에 윤 회장은 외식 산업 에 초점을 맞추고 있다고 답변했다. BBQ는 현재 58개국에서 약 2250개의 점포를 운영 중이다. 일본에는 21개 점포가 있다. 올해 말 100개까지 늘릴 계획이다. 레스토랑 타입 베이커리 타입 배달 전문점 등 다양한 사업체로 개점한다는 전략이다. 치킨대학 탐방 내용도 비중 있게 다뤄졌다. BBQ 매장을 운영할 수 있는 실력을 양성하는 최초의 치킨대학이라는 점을 강조했다. BBQ 점포를 내기 전 최소 2명이 2주간의 과정을 수료해야 하며 조리 방법 회계 마케팅 등의 교육이 진행된다. BBQ 관계자는 해외를 중심으로 점포망을 늘려 신종 코로나바이러스 감염증 코로나19 이후도 대비하고 있다 며 영어 중국어 일본어로 쓰여진 교과서를 마련하는 등 유학생 대응도 준비 중 이라고 말했다.\n", + "\n", + "### 답변: 지난홍근 BBQ그룹 회장이 한국 프랜차이즈 대표로는 이례적으로 일본 경제지와 인터뷰를 진행했는데 프랜차이즈 세계 1등의 야망을 품은 경영인 이라는 평가와 함께 BBQ가 라이벌로 미국 맥도날드를 꼽고 있는 점을 조명했고 윤 회장은 외식 산업 에 초점을 맞추고 있다고 답변했다.<|endoftext|>\n", + "19 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 지난 4일 오후 1시30분께 서울시의회 앞에서 노원구 공릉동 서울태릉골프장 일대 공공주택지구 지정 을 반대하는 시민들이 기자회견을 가졌다 사진 황서율 기자 문 정부의 8·4대책에 포함돼 6800가구가 공급될 계획이었던 서울 노원구 공릉동 태릉골프장 CC 일대의 공공주택지구 지정에 주민들이 반대하고 나서면서 사업에 차질을 빚을 것으로 예상된다. 3080 도심복합사업 역시 아직 사업진행이 더딘 상황으로 파악되면서 공공주도 공급물량에 변화가 생기는 것이 아니냐는 목소리도 나온다. 5일 서울시의회는 전날 서울시의회 1호 청원으로 ‘노원구 공릉동 서울태릉골프장 일대 공공주택지구 지정 반대에 관한 청원’이 접수됐다고 밝혔다. 1호 청원을 접수한 박환희 시의원 노원2 에 따르면 청원 접수에는 공릉동 주민 등 3000명이 서명한 것으로 알려졌다. 태릉골프장 일대의 공공주택지구 지정은 2020년 문재인 정부의 주택공급정책인 8.4대책의 일환으로 이야기 됐다. 발표 당시 해당 부지에 1만호가 공급될 예정이었으나 녹지확보 저밀개발 교통문제 등에 부딪혀 6800가구 공급으로 사업계획을 변경했다. 이에 따라 수락산역 역세권 도심복합사업 노원구 내 도시재생사업 등을 통해 총 3100가구의 대체물량을 확보했다. 이번 주민들의 반발로 태릉지구 6800가구 공급정책은 차질이 생길 것으로 예상된다. 주민들은 태릉·강릉 세계문화유산 지정 취소 가능성 생태공원조성계획 희망 교통정체 등을 이유로 반대하고 있다. 이미 올해 상반기 안에 지구 지정을 하겠다던 목표는 지방선거 등으로 주민 설명회나 공청회 등의 절차가 미뤄지면서 하반기로 조정됐다. 이러한 상황에서 지난달 17일 열릴 예정이었던 1차 공청회까지 주민들의 반발로 무산되면서 사업 진행이 더욱 느려진 것이다. 2차 공청회는 오는 11일 열릴 계획이다. 국토부 관계자는 “환경연합평가를 충분히 했고 태릉·강릉 경관에 영향이 없도록 준비하고 있다”며 “법적으로 없는 절차지만 유네스코 유산 영향 평가 역시 준비 중이기 때문에 부정적인 영향을 최소화해 사업을 추진할 계획”이라고 밝혔다. 한편 문 정부의 또다른 공공주도 공급정책인 3080 도심복합사업 역시 아직 진행이 더딘 상황으로 파악됐다. 총 19만6000호 공급을 목적으로 하는 이 사업은 현재 76곳 총 10만호 의 후보지를 발표한 상황이지만 후보지 중 지구지정까지 완료한 곳은 8곳 약 1만3000호 뿐이다. 지난 5월23일 원희룡 국토부장관이 “주민 호응도가 떨어지는 사업은 덜어내겠다”는 입장을 밝혀 일각에서는 해당 사업을 통한 공급 물량이 조정되는 것이 아니냐는 분석도 나온다.\n", + "\n", + "### 답변: 노릉골프장 CC 일대의 공공주택지구 지정과 문 정부의 공공주도 공급정책인 3080 도심복합사업의 진행이 더딘 상황으로 주민들이 반대하고 나서면서 사업에 차질을 빚을 것으로 예상된다.<|endoftext|>\n", + "20 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 쌍용자동차가 5일 인천 중구 네스트호텔에서 개최한 개발자와 함께하는 Q A 간담회 에서 토레스 신차 개발에 참여한 김범석 마케팅담당이 기자 질의에 답하고 있다.\n", + "\n", + "### 답변: 쌍 쌍용자동차가 5일 인천 중구 네스트호텔에서 개최한 개발자와 함께하는 개발자와 함께하는 간담회에서 쌍용자동차 <|endoftext|>\n", + "21 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: GS25 메이플스토리빵 18일만에 100만개 판매 돌파 GS리테일이 운영하는 편의점 GS25가 지난달 17일 선보인 메이플스토리 빵 5종. 사진 GS리테일 편의점 GS25가 온라인게임 메이플스토리 와 손잡고 선보인 메이플스토리 빵이 흥행 돌풍을 이어가고 있다. 출시 첫 날 초도물량 10만개가 완판된 데 이어 18일 만에 누적 100만개가 팔렸다. 6일 GS리테일에 따르면 편의점 GS25가 지난달 17일부터 선보인 메이플스토리빵 5종이 출시 18일 만에 판매량 100만개를 돌파했다. GS25는 꾸준히 이어진 굿즈 상품 마케팅의 일환으로 전 세계 1억9000만명의 사용자를 보유한 온라인 게임 메이플스토리에 주목했다. 이에 GS25는 메이플스토리빵에 메이플스토리의 인기 몬스터 캐릭터 80종의 스티커를 상품 1개당 1장씩 동봉했다. GS리테일 관계자는 메이플스토리빵이 매일 전 GS25매장에 입고되는 즉시 품절이 될 정도로 큰 인기를 끌고 있다 고 전했다. 메이플스토리빵의 인기는 GS25의 자체브랜드 PB 브레디크 상품의 매출에도 영향을 미쳤다. 메이플빵 출시 후 브레디크 매출이 전월 동기보다 64% 뛴 것. 모델이 GS25에서 월간 브레디크 소금버터롤케익 상품을 바라보고 있는 모습. 사진 GS리테일 GS25 측은 메이플스토리빵을 구매하러 오는 소비자들이 빵 진열 매대를 자주 살펴보는 기회가 늘어나며 브레디크 등 다른 빵도 경험하게 되고 재구매로 연결되는 선순환 효과가 나타나고 있다 고 풀이했다.\n", + "\n", + "### 답변: 6점 GS리테일에 따르면 편의점 GS25가 온라인게임 메이플스토리'와 손잡고 지난달 17일부터 선보인 메이플스토리빵 5종이 출시 18일 만에 판매량 100만개를 돌파하여 흥행 돌풍을 이어가고 있다고 밝혔다.<|endoftext|>\n", + "22 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 앱장터 ‘인앱결제’를 둘러싼 구글 카카오의 갈등이 가열되고 있는 가운데 한상혁 방송통신위원장이 7일 양측 관계자를 불러 의견을 듣기로 했다. 한 위원장은 6일 방통위 전체회의 직후 “담당 행정청으로서 이용자들의 불편을 해소하기 위해 노력하는 것은 당연한 의무”라며 “지금 벌어지고 있는 일에 대한 조율은 정책적인 방향에서 해야 할 일이라고 생각한다”고 말했다. 안드로이드용 카카오톡에서는 이모티콘플러스 정기구독 웹결제 안내 링크가 제공된다. 앞서 구글은 지난 1일 부로 자사 앱 장터인 구글플레이 스토어에서 카카오톡 앱 최신 업데이트 버전 제공을 중단했다. 인앱결제 시스템을 도입하지 않는 구글플레이스토어 내 앱에 대해 4월부터 업데이트를 금지하기로 한 자체 방침에 다른 조치다. 카카오가 그동안 구글플레이 스토어에서 ‘이곳을 클릭해서 결제하면 저렴한 가격에 이모티콘 구독 서비스를 이용할 수 있다’며 외부 결제 링크를 홍보해왔는데 이점을 문제 삼은 것이다. 이에 카카오는 안드로이드 사용자들을 대상으로 지난 1일부터 APK 설치파일 형태로 카카오톡 앱을 배포하고 있다. 최신 카카오톡 버전은 다음 포털을 통해 제공하기로 했다. IT업계에서는 구글과 카카오의 기싸움이 계속될 경우 구글플레이 스토어에서 카카오톡 앱이 삭제될 가능성도 배제할 수 없다고 보고 있다. 이용자 5000만명의 국민 메신저 ‘카카오톡’을 앞세운 카카오가 국내 IT업계를 대리해 국내 앱 장터 점유율 70%가 넘는 구글에 맞서는 형국이다. 앞서 구글은 지난달 1일부터 앱 내 결제 시 수수료 최대 30%를 받는 인앱결제 강제 정책을 본격 시작했다. 구글 결제나 구글이 허용한 제3자 결제를 이용하지 않는 앱은 장터에서 퇴출하기로 한 것이다. 더 나아가 다른 결제 수단을 홍보하는 문구나 아웃링크도 넣지 못하게 했다.\n", + "\n", + "### 답변: 한상장터 ‘인앱결제’를 둘러싼 구글 카카오와 국내 앱 장터 점유율 70%가 넘는 카카오의 갈등이 가열되고 있는 가운데 한상혁 방송통신위원장이 7일 양측 관계자를 불러 의견을 듣기로 했으며, 한 위원장은 6일 방통위 전체회의 직후 이용자들의 불편을 해소하기 위해 노력하는 것은 당연한 의무”라며 “지금 벌어지고 있는 일에 대한 조율은 정책적인 방향에서 해야 할 일이라고 생각한다”고 말했다.<|endoftext|>\n", + "23 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 윤석열 대통령은 경제 위기 상황에 대응해 매주 비상경제 민생회의를 여는 등 직접 민생 현안을 챙기겠다고 밝혔습니다. 윤 대통령은 오늘 5일 용산 대통령실에서 열린 국무회의에서 공급망 재편과 코로나 팬데믹이 겹치면서 전 세계가 70년대 오일쇼크 이후 가장 심각한 물가 충격을 받고 있다 며 이같이 말했습니다. 또 민생의 어려움을 덜기 위해 공공 부문이 앞장설 것이라며 과감한 지출 구조조정과 공공기관 경영 효율화로 허리띠를 졸라맬 것이라고 강조했습니다.\n", + "\n", + "### 답변: 윤석열 대통령은 경제 위기 상황에 대응해 매주 비상경제 민생회의를 여는 등 직접 민생 현안을 챙기겠다고 밝힌 가운데 오늘 5일 용산 대통령실에서 열린 국무회의에서 전 세계가 70년대 오일쇼크 이후 가장 심각한 물가 충격을 받고 있다 며 전 세계가 70년대 오일쇼크 이후 가장 심각한 물가 충격을 받고 있다 고 말했고 또 민생의 어려움을 덜기 위해 과감한 지출 구조조정과 공공기관 경영 효율화로 허리띠를 졸라맬 것이라고 강조했다.<|endoftext|>\n", + "24 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 앵커 새 정부 출범 이후 처음으로 고위급 당정협의회가 열렸지만 물가와 민생 안정이 시급하다는 원론적 언급만 확인했을 뿐 뾰족한 대책은 나오지 않았습니다. 이준석 국민의 힘 대표는 윤석열 정부가 약속한 많은 공약들이 국민들에게 제대로 전달되지 않고 있다 고 쓴 소리를 했습니다. 김주영 기자가 취재했습니다. 리포트 윤석열 정부 한마음 한덕수 총리의 건배사로 시작된 첫 고위급 당정협의회. 당정은 물가 등 민생 안정을 최우선 과제로 꼽았습니다. 권성동 원내대표는 예산과 기금의 적극적 활용을 당부했고 권성동 국민의힘 원내대표 국민들은 새 정부 기대도 잠시 치솟는 장바구니 물가와 기름값 높아진 이자 부담 가스 전기요금 등 생활물가 상승에 답답한 나날 보내고 있습니다. 이준석 대표는 대선 당시 약속한 정책들이 제대로 이행되고 있지 않다고 꼬집었습니다. 이준석 국민의힘 대표 많은 정책이 지금 정책 수요자들에게 아주 효율적으로 전달되고 있지 않습니다 김대기 비서실장은 국회 차원의 협력을 요청했습니다. 김대기 대통령 비서실장 이제는 정치의 힘이 너무 강해진 것 같습니다. 경제가 정치의 핵심이 돼 있기 때문에 어쩔 수 없는 현상이라고 보고… 당정은 수입 물가를 잡기 위한 할당관세 확대 원자재 가격 상승분을 납품가에 반영하는 납품단가 연동제 등을 논의했습니다. 또 취약 계층 지원을 위해 추경 예산의 신속한 집행에 나설 방침입니다. 하지만 그동안 언급돼온 대책의 되풀이에 그쳤을 뿐 심각해지는 경제 위기를 타개할 눈에 띄는 대책은 없었다는 평가입니다. TV조선 김주영입니다.\n", + "\n", + "### 답변: 새 정부 출범 이후 처음으로 열린 고위급 당정협의회에서 새 정부 기대도 잠시 치솟는 물가와 생활물가 상승에 답답한 나날날을 보내고 있는 가운데 이준석 국민의 힘 대표는 윤석열 정부가 약속한 많은 공약들이 국민들에게 제대로 전달되지 않고 있다면서 원론적 언급만 확인했을 뿐 경제 위기를 타개할 실질적인 대책이 나오지 않아 우려를 자아내고 있다.<|endoftext|>\n", + "25 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 대구 뉴시스 이무열 기자 홍준표 왼쪽 대구시장이 5일 오전 대구국제공항 계류장에서 열린 ‘대구경북통합신공항 성공적 건설을 위한 주 티웨이항공 본사 대구이전 MOU체결’ 행사에서 인사말을 하고 있다. 2022.07.05. lmy newsis.com 사진 영상 제보받습니다 공감언론 뉴시스가 독자 여러분의 소중한 제보를 기다립니다. 뉴스 가치나 화제성이 있다고 판단되는 사진 또는 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠습니다.\n", + "\n", + "### 답변: 5일 오전 대구국제공항 계류장에서 열린 ‘대구경북통합신공항 성공적 건설을 위한 주 티웨이항공 본사 대구이전 MOU체결’ 행사에서 홍준표 왼쪽 대구시장이 인사말을 했으며 뉴시스 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 뉴스 가치나 화제성이 있다고 판단되는 사진이나 뉴스 가치성이 있다고 판단되는 사진 또는 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 2022.07.05. lmy newsis.com 사진 영상 제보받습니다 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 기자 가치 가치나 화제성이 있다고 판단되는 사진이나 화제성이 있다고 판단되는 사진 또는 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 뉴시스 뉴시스 사진영상부 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 뉴시스 사진영상부 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다고 밝혔다.<|endoftext|>\n", + "26 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 수도권의 레미콘 운송 차주들이 오늘 1일 부터 파업에 들어갔습니다. 레미콘운송노동조합은 유진기업·삼표산업 등 수도권 주요 레미콘 제조사들과 운송료 인상 관련 협상을 벌였지만 최종 합의에 이르지 못해 오늘부터 운송 거부에 들어간다고 밝혔습니다. 레미콘운송조합은 약 27%의 운송료 인상을 요구하는 반면 제조사들은 9%대 이상 인상은 어렵다는 입장을 고수했습니다. 건설업계는 이달 초 화물연대 파업이 일주일 넘게 이어진 데 이어 레미콘 차량의 운행 중단이 장기화할 경우 건설 현장에 타격이 발생할 수 있다며 우려하고 있습니다.\n", + "\n", + "### 답변: 수도권의 레미콘 운송 차주들이 제조사들과 운송료 인상 관련 협상을 벌였지만 최종 합의에 이르지 못해 오늘부터 운송 거부에 들어간다고 밝혔으며, 건설업계는 이달 초 화물연대 파업이 일주일 넘게 이어진 데 이어 레미콘 차량의 운행 중단이 장기화할 경우 건설 현장에 타격이 발생할 경우 건설 현장에 타격이 발생할 수 있다며 우려하고 있습니다.<|endoftext|>\n", + "27 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 삼성바이오로직스가 미국 제약사 MSD와 2768억원 규모 위탁생산 계약을 체결했다. 사진 삼성바이오로직스 삼성바이오로직스가 미국 제약사 MSD와 위탁생산 계약을 체결했다. 삼성바이오로직스는 MSD MSD International Business GmbH 와 2768억2938만원 규모의 의약품 위탁생산 공급계약을 체결했다고 4일 공시했다. 계약금액은 2768억원으로 최근 매출액 대비 17.65% 규모다. 계약기간은 2022년 7월1일부터 2028년 12월31일이다. 삼성바이오로직스 관계자는 해당 계약은 지난해 9월29일에 공시된 투자판단 관련 주요경영사항에 대한 본 계약 체결 건 이라며 계약금액은 고객사의 수요증가에 따라 4942억원으로 증가할 수 있다 고 말했다.\n", + "\n", + "### 답변: 삼성바이오로직스는 4일 미국 제약사 MSD와 2768억2938만원 규모의 의약품 위탁생산 공급계약을 체결했다고 공시하고 2022년 7월1일부터 2028년 12월31일까지 계약기간은 2022년 7월1일부터 2028년 12월31일이라고 밝혔다.<|endoftext|>\n", + "28 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 3일 협상 타임오프 이견 커…노조 인정도 평행선 운반비 인상은 공감대 형성…올해 7500원·내년 6000원 수도권 공장 일제히 중단할 듯…하루 피해 224억 예상 이데일리 함지현 기자 레미콘 제조사와 운송사업자 간 협상이 또다시 결렬됐다. 이에 따라 전국레미콘운송총연합회가 본격적인 단체 행동에 돌입할 예정이다. 사태가 이어질 경우 수도권 레미콘 공장 ‘셧다운’ 장기화가 불가피할 전망이다. 1일 오전 서울 종로구 동화면세점 앞에서 열린 레미콘운송노동자 생존권사수 결의대회에서 참가자들이 구호를 외치고 있다. 사진 연합뉴스 3일 관련 업계에 따르면 양측은 이날 오전부터 협상을 실시했지만 접점을 찾지 못했다. 이번에 발목을 잡은 부분은 ‘타임오프’ 근로시간 면제수당 와 ‘노조’ 인정 여부였던 것으로 알려졌다. 우선 운송사업자 측은 자신들을 노조로 인정해 달라고 요청했다. 하지만 레미콘 제조사들은 이를 수용할 수 없다고 맞섰다. 지입계약을 맺은 개인사업자로서 단체협상 대상이 아니라는 입장에 변화가 없었던 것이다. 특히 명칭을 놓고 ‘수도권 레미콘 운송연대’와 같이 절충안이 제시되기도 했지만 결국 협상은 결렬됐다. 특히 운송사업자 측은 타임오프 수당도 강력히 요청했다. 타임오프는 제조사별 노조 대표자가 근무를 하지 않아도 상생기금 등을 통한 혜택을 제공하는 것을 말한다. 이에 대해 레미콘 제조사들은 특정 대표자들만 수혜를 주는 게 타당하지 않다며 거부 의사를 밝혔다. 이와 함께 운송사업자들이 그동안 요구해 온 △명절 상여금 100만원 △요소수 100% 지급 △타설 후 폐수 비용으로 레미콘 운송료 50% 지급 등은 논의가 이뤄지지 못했다. 운반비 부분에 대해서는 어느 정도 접점을 찾은 모습이다. 2년에 걸쳐 올해 7500원 내년 6000원씩 총 1만3500원을 올리는 형태다. 앞서 운송사업자들은 현재 5만6000원인 운반비를 7만1000원으로 27% 인상해줄 것을 요구했다. 양측은 이번 협상 결렬 이후 추가적인 협의 진행 여부는 아직 정하지 않았다. 지난 1일 생존권사수결의대회를 진행하면서 파업 신호탄을 쏘아 올린 운송노동자들은 이번 협상 결렬에 따라 4일부터 총파업에 돌입할 계획이다. 이에 따라 이미 지난 1일 95%가량 운영을 멈춰 섰던 수도권 공장은 모두 문을 닫을 것으로 예상된다. 사태 장기화로 셧다운이 길어질 경우 레미콘 제조사들이 큰 타격을 입을 전망이다. 수도권 14개 권역의 158개 레미콘 제조사 공장을 운영하지 못하면 하루 추정 피해액만 224억원 규모에 달한다. 아파트 등 건설 현장 공급 차질도 예상된다. 운송사업자들이 독점적 지위를 가질 수밖에 없는 구조가 변하지 않으면 시장이 왜곡되면서 업계가 경쟁력을 잃을 수 있다는 우려도 나온다. 레미콘 업계 관계자는 “레미콘 운반사업자의 집단적 운송 거부로 인해 레미콘 공장이 멈춰선다면 이는 곧바로 건설 현장 차질까지 이어질 것”이라며 “일부 기득권의 이득을 위해 수많은 소비자들이 피해를 떠안게 되는 셈”이라고 말했다.\n", + "\n", + "### 답변: 지난 레미콘 제조사와 운송사업자 간 협상이 또다시 결렬되어 전국레미콘운송총연합회가 본격적인 단체 행동에 돌입할 예정이며 사태가 이어질 경우 수도권 레미콘 공장 ‘셧다운’ 장기화가 불가피할 전망이다.<|endoftext|>\n", + "29 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: KT 외국인 맞춤 서비스 강화 KT는 최근 입국이 늘고 있는 외국인 고객을 위한 케어서비스를 강화한다고 3일 밝혔다. 국내 거주 외국인 중 비중이 가장 높은 중국인 고객은 위챗 중국 최대 메신저 앱 내 KT 미니프로그램을 통해 KT 유무선 서비스에 대한 중국어 실시간 채팅 상담 통신 상품 사용량 조회 등을 할 수 있다. 사진은 국내 거주 중국인이 이날 실제 위챗 KT 미니프로그램을 이용하는 모습.KT 제공 KT는 최근 입국이 늘고 있는 외국인 고객을 위한 케어서비스를 강화한다고 3일 밝혔다. 국내 거주 외국인 중 비중이 가장 높은 중국인 고객은 위챗 중국 최대 메신저 앱 내 KT 미니프로그램을 통해 KT 유무선 서비스에 대한 중국어 실시간 채팅 상담 통신 상품 사용량 조회 등을 할 수 있다.\n", + "\n", + "### 답변: K 3일 KT는 최근 입국이 늘고 있는 외국인 고객을 위한 케어서비스를 강화한다고 밝힌 가운데 국내 거주 외국인 중 비중이 가장 높은 중국인 고객은 위챗 중국 최대 메신저 앱 내 KT 미니프로그램을 통해 KT 유무선 서비스에 대한 중국어 실시간 채팅 상담 통신 상품 사용량 조회 등을 할 수 있으며 국내 거주 외국인 중 비중이 가장 높은 중국인 고객은 위챗 중국 최대 메신저 앱 내 KT 미니프로그램을 통해 KT 유무선 서비스에 대한 중국어 실시간 채팅 상담 통신 상품 사용량 조회 등을 할 수 있다.<|endoftext|>\n", + "30 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 대전조차장역 인근서 탈선…경상 7명 포함 총 11명 부상 최대 110분 지연…원희룡 SR·코레일 등 혁신 만전 1일 오후 서울 강남구 SRT수서역 매표소 앞에 열차 탈선사고로 인한 열차 지연과 배상 안내문이 걸려있다. 이날 부산에서 수서역으로 향하던 SRT 열차가 대전조창역 인근에서 탈선하는 사고가 발생해 11명이 부상을 입었다. 국토부와 한국철도공사는 복구 작업과 함께 사고 원인을 조사중이다. 2022.7.1 뉴스1 © News1 박세연 기자 서울 뉴스1 김진 기자 1일 오후 부산역을 출발해 서울 수서역을 향하던 SRT 열차가 탈선해 총 11명이 다쳤다. 열차 운행이 지연되는 가운데 한국철도공사 코레일 는 심야 임시전동열차 운영을 결정했다. 코레일은 이날 오후 KTX 및 일반열차들이 상당 시간 지연 운행되고 있다 며 수도권 전동열차 이용객들의 편의를 위해 기존 막차 시간보다 약 1시간 19분 연장 운행한다 고 밝혔다. 연장운행 노선은 경인선과 경부선 총 2개 노선이다. 인천을 향하는 경인선 하행 막차는 2일 새벽 1시10분 서울역 지상 에서 출발한다. 구로를 향하는 경부선 상행 은 같은 날 0시55분 병점역에서 출발할 예정이다. 앞서 수서행 SRT 338호 열차는 이날 오후 3시21분쯤 대전조차장역 인근에서 탈선했다. 열차의 1호차와 맨 후부 동력차 총 2량이 궤도를 이탈했다. 오후 1시45분 부산역에서 출발한열차는 4시8분 수서역에 도착할 예정이었다. 해당 열차에는 380명이 탑승해 있었고 사고로 11명이 다쳤다. 4명은 귀가 조치됐고 7명은 인근 병원으로 이송됐으나 경상으로 파악됐다. 나머지 승객들은 인근 역까지 도보로 이동한 뒤 연계버스로 환승 조치됐다. 사고로 인해 KTX·SRT 열차 운행은 모두 지연됐다. 서울행 상행 KTX 열차는 대전 서울 간 일반선으로 우회 운행되고 있으며 수서행 상행 SRT 열차는 대전 신탄진 간 하행 고속선로를 이용되고 있다. 상행선은 최대 110분가량 지연 운행 중으로 6개 열차는 운행을 중지한 상태다. 부산행 하행 KTX·SRT 열차는 정상 운행 중이나 열차 운행 조정 등으로 최대 40분 지연 운행 되고 있다. 사고 복구는 열차 운행이 종료되는 밤 11시부터 본격적으로 시작될 예정이다. 코레일은 첫 열차 오전 5시5분 서울역 출발 운행을 목표로 복구 작업을 진행할 방침이다. 코레일은 현장에는 차량 시설 전기 등 300여명의 복구인력과 기중기 모터카 등 가용할 수 있는 모든 장비를 투입해 작업할 예정 이라고 설명했다. 1일 부산에서 수서역으로 향하던 SRT 열차가 대전조창역 인근에서 탈선하는 사고가 발생해 관계자들이 사고를 수습하고 있다. 2022.7.1 뉴스1 © News1 김기태 기자 주무부처인 국토교통부는 관계기관과 정확한 사고 원인을 파악 중이다. 주요 탈선 원인으로는 폭염이 거론된다. 30도를 웃도는 무더위에 레일이 팽창하면서 선로에 뒤틀림 현상이 발생했을 가능성이다. 사고 발생 열차는 바퀴가 빠진 것으로 알려졌다. 원인 조사는 국토부 항공철도사고조사위원회가 맡게 된다. 국토부는 사고 발생 직후 철도안전감독관·철도경찰 및 사고조사반을 현장에 투입하고 대책 매뉴얼에 따라 철도재난상황반을 구성해 대응에 나섰다. 긴급대책회의 및 장관 보고도 이뤄졌다. 원희룡 국토부 장관은 관련 보고를 받고 철도 등 교통을 총괄하는 장관으로서 이번 사고로 인해 피해를 입은 승객과 불편을 겪고 있는 국민께 진심으로 송구하다 며 신속한 복구 작업을 지시했다. 특히 원 장관은 이번 사고와 관련해 공공기관 혁신 을 재차 언급했다. 원 장관은 사고 차량을 운행한 SR과 차량정비·유지보수 등을 담당하는 코레일 직원들이 자신의 가족이 열차를 이용한다고 생각하고 긴장감을 갖고 업무에 임했으면 이러한 사고가 발생하지 않을 것 이라고 강조했다. 이어 정확한 사고조사를 바탕으로 철저한 안전관리체계를 구축하는 것은 물론이고 사소한 사고도 재발하지 않도록 코레일 SR 등 공공기관 스스로 혁신하는 데 만전을 기할 것 이라고 덧붙였다. 1일 부산에서 수서역으로 향하던 SRT 열차가 대전조창역 인근에서 탈선하는 사고가 발생 열차의 바퀴가 선로에서 이탈해 있다.\n", + "\n", + "### 답변: 1일 오후 부산역을 출발해 서울 수서역을 향하던 SRT 열차가 대전조차장역 인근에서 탈선하는 사고가 발생해 11명이 부상을 입었는데, 코레일은 수도권 전동열차 이용객들의 편의를 위해 기존 막차 시간보다 약 1시간 19분 연장 운행하고, 사고 복구는 열차 운행이 종료되는 밤 11시부터 본격적으로 시작될 예정이다.<|endoftext|>\n", + "31 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 이창용 한국은행 총재 사진 이기범 기자 leekb 인플레이션 상황이 심각해지면서 한국은행이 사상 첫 빅스텝 기준금리 0.5%포인트 인상 에 나설 가능성도 높아진다. 증권가에서는 한은의 빅스텝을 예상하면서도 하반기 경기 상황에 따라 금리 인상에 속도 조절을 할 가능성이 있다고 보고 있다. 5일 금융투자업계에 따르면 국내 증권사들은 오는 14일 열리는 금융통화위원회에서 기준금리 50bp 1bp 0.01%포인트 인상이 결정될 것으로 전망한다. 우리나라에서 기준금리 50bp 인상은 유례가 없는 일이다. 실제 빅스텝을 단행할 경우 기준금리는 현재 1.75%에서 2.25%로 오른다. 빅스텝 전망의 가장 큰 이유는 급격한 물가상승이다. 이날 통계청이 발표한 6월 국내 소비자물가지수는 108.22로 전년 동월대비 6% 상승했다. 외환위기였던 1998년11월 6.8% 이후 가장 높은 수치다. 2 3%를 오가던 물가상승률은 지난 3월 4.1%를 기록한 이후 4월 4.8% 5월 5.4%로 갈수록 높아지는 추세다. 러시아 우크라이나 전쟁으로 인한 에너지와 원자재 곡물 가격 상승 원화 약세로 인한 수입물가 상승 등이 주요 원인으로 꼽힌다. 심각한 물가를 잡기 위해선 금리 인상이 불가피하다는 분석이다. 임재균 KB증권 연구원은 6월 소비자물가가 고점을 기록했지만 하반기에는 공공요금 인상 등으로 물가 상승 압력이 더 높아질 수 있다 며 7월 금통위에서 50bp 인상을 단행할 것 이라고 설명했다. 미국 연방준비제도의 2연속 자이언트스텝 75bp 인상 가능성으로 인한 한미 금리차 역전도 우리나라 기준금리 인상 압력을 높이는 요인이다. 신흥국으로 분류되는 한국은 통상 미국보다 금리를 높게 유지해 왔다. 하지만 최근 미국이 연달아 금리를 높이면서 현재 한국과 미국의 금리는 같은 수준 1.75% 으로 올라왔다. 페드워치 FedWatch 에 따르면 오는 26 27일 열리는 FOMC 미국 연방공개시장위원회 에서 75bp 인상할 확률은 95.1%다. 이 경우 미국 기준금리는 2.25 2.5%가 된다. 한은이 빅스텝을 하더라도 미국 금리가 더 높아진다. 금리가 더 높은 곳으로 이동하는 자본의 특성을 고려할 때 한미 금리차 역전은 한국에서의 자본 유출을 심화시키는 요인으로 지적된다. 이를 최소화하기 위해서라도 한국은 미국의 금리 인상 속도에 어느정도 발을 맞출 수밖에 없다. 민지희 미래에셋증권 연구원은 외국인 자본 유출은 단순 금리차 외에도 국내 펀더멘털 기초체력 둔화 속도의 영향을 받을 가능성이 높다 며 미국 연준의 75bp 인상 가능성이 높은 만큼 우리나라도 빅스텝 가능성이 크다 고 전망했다. 급격한 금리 인상은 소비를 위축시키고 경기 침체 우려를 불러온다. 지금 인플레이션이 수요 때문이 아닌 공급의 문제라는 점에서 각국 중앙은행들의 긴축 조치가 적절한 것이냐는 의문도 제기된다. 하지만 시장 거품을 진정시키기 위해선 경기 침체를 감내해서라도 금리 인상하는 수단을 써야 한다는 시각도 존재한다. 강승원 NH투자증권 연구원은 미국은 경기 침체 가능성을 용인하면서까지 물가와 싸우고 있다 며 한국은 수출 국가이자 인플레이션 압력을 강제로 수입하고 있는 국가라는 점에서 딜레마가 더 크다 고 지적했다. 그러면서 당장 7월 금통위에서 50bp 인상을 피할 수 없을 것 이라며 8월 금통위에서도 25bp 추가 인상을 통해 연말 기준금리 전망치인 2.5%에 도달할 것 이라고 분석했다. 글로벌 긴축이 진행될 수록 증시 변동성도 높아진다. 금리 인상으로 채권 가격이 하락할뿐 아니라 할인율 상승으로 주식의 상대적 매력이 떨어진다. 실질적으론 기업의 자금조달 압력이 커지면서 실적에도 부담이 될 수 있다. 급격한 긴축으로 인한 경기 침체 가능성이 커지면서 연말로 갈수록 긴축 강도는 약해질 수 있다는 분석도 나온다. 민 연구원은 최근 국내 경기에 대한 우려가 높아지면서 하반기 예정된 두 번의 금통위 10월 11월 중 한 번 25bp 올리거나 두 차례 모두 동결할 가능성이 있다 며 연말 우리나라 기준금리 전망은 2.5% 혹은 2.75%가 될 것 이라고 전망했다. 이어 시장은 미국 연준이 4분기에도 빅스텝을 가져갈 것으로 예상하지만 그 보단 인상 속도가 좀 낮아질 수도 있다 며 미국이 긴축 속도를 조절하면 한국도 조절할 가능성이 있다 고 말했다.\n", + "\n", + "### 답변: 인플레이션 상황이 심각해지면서 한국은행이 사상 첫 빅스텝 기준금리 0.5%포인트 인상 에 나설 가능성도 높아져, 증권가에서는 한은의 빅스텝을 예상하면서도 하반기 경기 상황에 따라 금리 인상에 속도 조절을 할 가능성이 있다고 보고, 오는 14일 열리는 금융통화위원회에서 기준금리 50bp 1bp 0.01%포인트 인상이 결정될 것으로 전망하고 있다.<|endoftext|>\n", + "32 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 뉴시스 이재준 기자 오미크론 변이를 중심으로 코로나19가 기승을 부리는 대만에서 4일 신규환자는 2만3118명으로 2개월 만에 2만명대로 줄었지만 추가 사망자는 69명 나왔다. 중앙통신과 연합보 聯合報 중국시보 中國時報 등에 따르면 코로나19 대책본부인 중앙유행병 지휘센터는 이날 확진자 가운데 대만 안에서 2만3045명 생기고 외국에선 73명이 들어왔다고 발표했다. 전날 감염자는 3만2681명 2일 3만4827명 7월1일 3만5800명 6월30일 3만8942명 29일 4만2204명 28일 4만4428명 27일 2만8530명 26일 3만9646명 25일 4만398명 24일 4만5767명 23일 4만8356명 22일 5만2246명 21일 5만6404명 20일 경우 3만5632명으로 1개월 2주일 만에 3만명대로 떨어졌다. 19일은 5만636명 18일 5만3707명 17일 5만5261명 16일 6만3221명 15일 6만8939명 14일 6만6189명 13일 4만5110명 12일 5만657명 11일 7만9663명 10일 6만8347명 9일 7만2967명 8일 8만223명 7일 8만3027명 6일 5만3023명 5일 6만2110명 4일 6만8151명 3일 7만6564명 2일 7만6986명 6월1일 8만8293명 5월31일 8만705명 6일 3만6213명 4일 2만8487명 2일 1만7858명 1일 1만7085명 4월30일 1만5149명이다. 대만 내 새 감염자는 22개 현시에서 발생했으며 남성 1만929명 여성 1만2087명 29명은 확인하고 있다. 나이는 5세 미만에서 90대 사이다. 신베이시에서 3438명 타이중시 3217명 가오슝시 2719명 타오위안시 2411명 타이베이시 1992명 타이난시 1842명 장화현 1336명 핑둥현 921명 먀오리현 619명 윈린현 609명 신주현 599명 신주시 491명 이란현 491명 난터우현 472명 자이현 439명 화롄현 436명 타이둥현 254명 지룽시 246명 자이시 213명 펑후현 157명 진먼현 125명 롄장현 18명이다. 외부 유입 감염자는 남성 42명 여성 31명이다. 나이는 5세 미만에서 80대까지다. 미국에서 3명 베트남 2명 독일과 터키 스페인 1명씩 유입했고 65명은 출발 국가를 조사하고 있다. 이로써 대만 코로나 감염자는 총 389만3643명에 달했다. 대만 안에서 387만8594명이고 국외 유입이 1만4995명 친선함대 36명 항공기 2명 불명 1명 조사 중 14명이다. 코로나19 환자는 작년 5월10일 100명 미만이다가 이후 1년1개월24일 동안 크게 증대하면서 이날까지 389만3550명 가까이 늘어났다. 지휘센터는 코로나19 환자 가운데 이날 전날 88명에서 19명 줄어든 69명이 새로 사망했다고 전했다. 남성 36명 여성 33명으로 연령이 5세 미만에서 90대 사이다. 64명이 만성질환자이고 48명은 백신을 3차까지 맞지 않았다. 이제껏 코로나19 감염자 중 7025명이 숨졌다. 이중 15명은 국외 유입자다. 대만 내에서 숨진 환자 7010명 분포를 보면 신베이시 1726명 수도 타이베이 905명 타이중시 656명 가오슝시 598명 타오위안시 557명 타이난시 457명 장화현 362명 핑둥현 289명 윈린현 182명 난터우현 179명 지룽시 173명 이란현 159명 먀오리현 137명 자이현 128명 화롄현 114명 신주현 111명 자이시 109명 타이둥현 89명 신주시 67명 진먼현과 펑후현 각 9명이다.\n", + "\n", + "### 답변: 오통신과 연합보 聯合報 중국시보 中國時報 등에 따르면 코로나19 대책본부인 중앙유행병 지휘센터는 이날 오미크론 변이를 중심으로 코로나19가 기승을 부리는 대만에서 4일 신규환자는 2만3118명으로 2개월 만에 2만명대로 줄었지만 추가 사망자는 69명 나와 대책본부인 중앙유행병 지휘센터는 이날 확진자 가운데 대만 안에서 2만3045명 생기고 외국에선 73명이 들어왔다고 발표했고 대만 내 새 감염자는 22개 현시에서 발생했으며 남성 1만929명 여성 1만2087명 확인하고 있다.<|endoftext|>\n", + "33 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하분이 적용된 휘발유 및 경유를 주유하고 있다.\n", + "\n", + "### 답변: 1일 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하분이 적용된 휘발유 및 경유를 주유하고 있으며 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하분이 적용된 휘발유 및 경유를 주유하고 있고, 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰뜰주유소를 찾은 시민들이 유류세 인하폭이 37%로 확대된 1일 서울 강서구 목화알뜰주유소를 찾은 시민들이 유류세 인하분이 적용된 휘발유 및 경유를 주유하고 있다.<|endoftext|>\n", + "34 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 뉴시스 1사 1인 장애인 채용 1호 기업 인 한국후꼬꾸에서 김동석 IBK기업은행 기업지원부장 오른쪽 과 이동일 한국장애인고용공단 부장 왼쪽 이 지난달 23일 회사 관계자들과 기념촬영을 하고 있다. 2022.7.4 사진 IBK기업은행 제공 photo newsis.com 서울 뉴시스 정옥주 기자 IBK기업은행은 한국장애인고용공단과 1사 1인 장애인 채용 캠페인 을 추진한다고 4일 밝혔다. 이는 지난해 10월 체결한 중소기업 장애인 채용 지원을 위한 업무협약 의 후속사업이다. 이번 캠페인을 통해 두 기관은 장애인 채용 희망 중소기업에게 장애인 구인서비스를 밀착 지원한다. 장애인공단의 장애인 고용컨설팅과 기업은행의 경영 컨설팅도 무료로 제공한다. 또 장애인 채용 시 기업은행은 일자리 채움펀드를 통해 1인당 100만원의 금융비용을 지원하고 장애인 고용 우수기업으로 선정될 경우 금리 우대 대출상품도 활용할 수 있다. 참여 신청방법은 기업은행이 운영하는 중소기업 전문 취업포털 아이원 잡 i ONE JOB 홈페이지에서 가능하며 참여 기업을 상시 모집한다. 기업은행 관계자는 이번 캠페인을 통해 중소기업의 장애인 채용에 많은 관심을 기대한다 고 말했다.\n", + "\n", + "### 답변: IBK기업은행은 한국장애인고용공단과 중소기업 장애인 채용 지원을 위한 업무협약 의 후속 사업으로 지난해 10월 중소기업 장애인 채용 지원을 위한 업무협약 의 후속 사업으로 1사 1인 장애인 채용 캠페인 을 추진한다고 4일 밝혔다.<|endoftext|>\n", + "35 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 은평·서대문구 경기 고양시 등지에 이른바 러브 버그 라 불리는 벌레떼가 출몰해 주민들이 불편을 겪고 있다. 사진은 러브 버그 모습. 사진 연합뉴스 최근 서울 서북권과 경기 고양시 등에 떼로 나타난 일명 러브버그 사랑벌레 . 벌레를 싫어하는 사람에게 혐오감을 줄지언정 해충은 아니라는 것이 중론입니다. 오늘 5일 환경부 국립생물자원관 등에 따르면 최근 출몰한 러브버그는 계피우단털파리 로 추정되며 유전자 분석이 아직 진행 중이긴 하지만 외래종보다는 자생종일 가능성에 무게가 실립니다. 유전자 분석 결과는 이번 주 내 나올 전망입니다. 자원관 관계자는 국내에 털파리 전공자가 없어 이번에 나타난 러브버그가 언제부터 국내에 있었는지 등을 추적하기 어려운 상황 이라고 설명했습니다. 같은 털파리과에 속하며 미국에서 러브버그로 불리는 플리시아 니악티카 는 플로리다주 등 멕시코만에 접한 미국 남부지역 등에서 여름철 단골손님이다. 코스타리카 온두라스 멕시코 등에도 서식합니다. 국내 러브버그와 플리시아 니악티카는 특성이 비슷할 것으로 추측됩니다. 플로리다대 식품 및 농업과학연구소 IFAS 가 펴낸 책 등을 보면 플리시아 니악티카는 몸길이가 수컷은 6㎜ 정도이고 암컷은 8㎜가량으로 작으며 생존시간은 실험실 환경에선 수컷과 암컷 각각 92시간과 72시간 정도인데 자연에서는 짝을 찾아 교미하고 알을 낳는 데 필요한 만큼 만 삽니다. 주로 낮에 기온이 20도 이상일 때만 날아다니고 밤에는 낮은 초목에 숨어서 쉽니다. 플리시아 니악티카는 통상 연중 4 5월과 8 9월 두 차례 번성하며 고속도로 주변에 떼로 살면서 차에 부딪혀 자국을 남기는 터라 미국에서도 골칫거리 로 취급받기도 합니다. 암컷 플리시아 니악티카는 썩어가는 식물이나 잔해 밑에 100 350개 알을 낳으며 알에서 애벌레가 태어나는 데는 약 20일이 걸립니다. 그간에도 우리나라 생태계 일원으로 살아온 러브버그가 이번에 화제의 중심에 오른 이유는 도심에 떼로 나타났기 때문입니다. 털파리류 애벌레가 성체로 우화 羽化 하려면 고온다습해야 하는데 지난달까지는 가뭄으로 이런 환경이 나타나지 않다가 최근 장마철에 들어서면서 한꺼번에 성체가 됐다는 분석이 나옵니다. 지방자치단체들이 민원에 러브버그 방역에 나섰지만 전문가들은 그럴 필요가 있는지 의문을 제기합니다. 대기가 건조해지면 금방 죽기 때문인데 당국은 장마가 끝나고 2주 정도 지나면 러브버그들이 자연히 소멸할 것으로 예상합니다. 더구나 러브버그는 굳이 따지자면 해충보다는 익충에 가깝습니다. 국립생물자원관 관계자는 사람에게 질병을 옮기거나 농작물을 해쳐 농사를 망치지 않는다 라고 말했습니다. 플리시아 니악티카는 사람을 물거나 쏘지 않아 위협이 되지 않고 다양한 식물의 화밀 花蜜 을 먹기에 수분에는 도움을 줍니다. 애벌레의 경우 썩은 식물을 유기물로 바꿔 땅을 옥토로 바꾸는 역할을 하는 것으로 알려졌습니다. 러브버그를 피하고 싶다면 어떻게 해야 할까. 지난 2015년 학술지 Florida Entomologist 에 실린 논문에 따르면 플리시아 니악티카는 수컷이든 암컷이든 꽃에서 유래된 페닐아세트알데히드 PAA 에 후각적으로 끌리고 노란색과 흰색에 시각적으로 끌리는 것으로 나타났습니다. 러브버그를 멀리하려면 꽃향기가 나는 향수와 노란옷이나 흰옷을 입지 않는 것이 좋다는 의미입니다.\n", + "\n", + "### 답변: 5일 환경부 국립생물자원관 등에 따르면 최근 서울 서북권과 경기 고양시 등에 떼로 나타난 이른바 러브 버그 라 불리는 벌레떼가 계피우단털파리로 추정되며 유전자 분석이 아직 진행 중이긴 하지만 외래종보다는 자생종일 가능성에 무게가 실리고 있어 국내 러브버그와 플리시아 니악티카는 특성이 비슷할 것으로 추측된다.<|endoftext|>\n", + "36 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 화학연·안전성평가연구소 등과 시너지 제고 신·변종 감염병·원숭이두창 등 연구 박차 최영기 왼쪽 한국바이러스기초연구소장과 신의철 바이러스면역연구센터장이 5일 오후 기초과학연구원 과학문화센터에서 출범1주년 간담회를 열고 연구성과에 대해 설명하고 있다. 사진 IBS 제공 신·변종 감염병 등을 연구하는 한국바이러스기초연구소 바이러스연 가 출범 1주년을 맞았다. 코로나19와 원숭이두창 등 주요 감염병을 대응하는 기초연구는 물론 국내에 부족한 바이러스 분야 인재를 육성하는 데 역량을 집중하고 있다. 올해는 주요 정부출연연구기관 등과 바이러스 연구협력 협의체 를 구축 연구기관간 시너지를 내는 데도 주력하고 있다. 5일 기초과학연구원 IBS 에 따르면 바이러스연은 IBS 산하 조직으로 지난해 7월 1일 설립한 후 바이러스 기초원천역량을 확보해 국내 감염병 안보에 공헌하는 것이 목표다. 바이러스연은 현재 신·변종 바이러스 연구센터 와 바이러스 면역 연구센터 2개 센터로 구성돼 있다. 각각 신·변종 바이러스의 이해를 통한 바이러스성 질병 극복 연구와 면역병리 기전 연구 등을 수행한다. 출범 후 고연령 코로나19 감염자의 중증도와 전파율이 저연령 감염자 보다 높다는 사실을 동물실험으로 입증하는 등 신종 감염병 연구에 매진하고 있다. 이르면 내년 바이러스 구조분석 플랫폼 연구센터도 추가 설립해 연구 역량을 확대할 예정이다. 바이러스연은 현재 한국화학연구원 안전성평가연구소 등과 함께 바이러스 연구협력 협의체 를 구축해 기초·응용연구간 시너지 효과도 제고하고 있다. 최영기 바이러스연구소장은 협력체를 통해 국가방역에 도움이 될 수 있는 기반 연구를 수행하겠다 며 좀더 빠르게 국민들에게 옳은 정보와 바이러스를 대처할 수 있는 좋은 방향을 제시할 수 있는 연구를 하도록 노력하겠다 고 말했다. 신의철 바이러스면역연구센터장은 바이러스를 빠르게 대응하는 연구 외에도 향후 발생할 신종 바이러스를 미리 대비하는 연구도 수행하고 있다 며 어떤 바이러스가 오더라도 대응할 수 있도록 연구에 최선을 다하겠다 고 강조했다. 한편 이날부터 6일까지 대전 IBS 과학문화센터에서 바이러스연 출범 1주년을 기념하는 바이러스 연구 포럼 이 열린다. 5일에는 바이러스 면역 연구센터를 포함해 한국생명공학연구원 한국과학기술원 KAIST 등이 6일에는 신변종 바이러스 연구센터를 필두로 한국화학연구원 등이 대표 연구성과를 발표한다. 포럼은 IBS 유튜브 채널에 생중계되며 자세한 정보는 포럼 누리집을 참고하면 된다.\n", + "\n", + "### 답변: 한국바이러스기초연구소 바이러스연은 코로나19와 원숭이두창 등 주요 감염병을 대응하는 기초연구는 물론 국내에 부족한 바이러스 분야 인재를 육성하고, 올해는 주요 정부출연연구기관 등과 바이러스 연구협력 협의체 를 구축 연구기관간 시너지를 내는 데도 주력하고 있으며 출범 1주년을 맞았다.<|endoftext|>\n", + "37 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 머니S리포트 물가·금리에 환율까지 3高 ④ 매매 차익·이자 수익 톡톡 편집자주 물가와 환율 금리가 모두 상승하는 3중고 로 인해 대한민국 경제에 비상이 걸렸다. 2년 넘게 이어진 팬데믹 세계적 감염병 대유행 상황에서 물가 상승 지속 러시아·우크라이나 전쟁 장기화 미국 연방준비제도 Fed 연준 의 기준금리 인상 중국의 봉쇄 조치까지 대외 불확실성이 커지면서 대다수 기업들이 실적 둔화를 겪을 것이란 전망이다. 원 달러 환율이 약 13년 만에 최고 수준으로 치솟으면서 외국인 투자금 이탈이 가속화되고 있다는 점도 국내 증시엔 부담이다. 현재 코스피의 외국인 보유 비중은 30% 정도로 2009년 이후 가장 낮은 수준이다. 반면 섬유의복·제약바이오 등 일부 업종은 환율 상승에 따른 수혜가 기대되기도 한다. 증시를 떠난 투자자들은 고환율을 이용 달러에 투자하는 상장지수펀드 ETF 와 달러예금 달러보험 등으로 눈을 돌리고 있다. 안전자산으로 분류되는 채권 역시 개인의 순매수 금액이 1년 간 2배 가까이 증가하는 등 자금이 몰리고 있다. 글로벌 금리 인상 기조가 지속되고 채권금리 또한 상승하면서 채권으로 손을 뻗은 투자자들이 급증한 것으로 나타났다. 사진 이미지투데이 기사 게재 순서 ① 또 커지는 불확실성 대한민국 경제 비상 ② 强달러에 돈 몰린다… 달러 예금·보험부터 ETF까지 ③ 원화 약세에 셀코리아 ... 한미 금리 역전 우려에 하반기도 답없다 ④ 투자 암흑기... 채권 저가매수 기회 6월 한 달 새 코스피지수가 연중 최저점을 일곱 차례 경신하고 비트코인을 비롯한 암호화폐 가상화폐 가 급락하는 등 금융 자산이 휘청이면서 채권으로 눈을 돌리는 투자자들이 늘고 있다. 저가 매수와 이자 수익에 대한 기대감 등에 주목하고 있는 것이다. 러시아와 우크라이나 전쟁 장기화 미국의 강한 긴축 기조 지속적인 물가 상승 우려 중국의 신종 코로나바이러스 감염증 코로나19 봉쇄 조치 등 많은 매크로 거시경제 불확실성이 지속되면서 주식 등 위험자산에 대한 회피 심리가 강해졌다. 반대로 안전자산으로 분류되는 채권은 환영을 받는 분위기다. 개인의 채권 순매수 금액은 1년 간 2배 가까이 증가했다. ━ 채권금리 상승에 채권 투자 매력↑ ━ 그래픽 김은옥 기자 글로벌 금리 인상 기조가 지속되고 채권금리 또한 상승하면서 채권으로 손을 뻗은 투자자들이 급증한 것으로 나타났다. 금융투자협회 채권정보센터에 따르면 6월 17일 3년 만기 국고채 금리는 전거래일 대비 1.7bp 1bp 0.01%포인트 오른 연 3.745%로 마감했다. 2011년 8월 4일 연 3.770% 이후 최고치였다. 이후 3.5 3.6%대를 등락하고 있다. 채권 투자 방법은 만기 보유 와 트레이딩 거래 등 크게 두 가지 방식으로 나뉜다. 만기 보유는 만기가 도래할 때까지 채권을 팔지 않고 이자를 받은 후 만기에 원금을 돌려 받는 방법 트레이딩은 채권을 사고팔며 매매차익을 거두는 방법이다. 통상 시장 금리가 오르면 시장에서 거래되는 채권 가격은 하락해 이미 발행돼 거래되는 채권을 저가에 매수 매매 차익을 기대할 수 있다. 새롭게 발행되는 채권은 발행 금리가 높기 때문에 이자 수익을 노려볼 수 있다. 황세운 자본시장연구원 선임연구위원은 채권금리 상승은 평가 손실이 발생할 수 있는 위험이 있어 금리 상승기가 채권 투자에 부담스러운 시기로 여겨질 수도 있으나 만기까지 보유한다면 얘기가 달라진다 며 중간에 발생하는 이자를 지급받으면서 만기까지 보유하면 평가 손실에 대한 걱정은 하지 않아도 되기 때문 이라고 설명했다. 이어 올해 채권금리는 추가 상승이 가능할 것이란 전망이 나오는 만큼 연말까지 더 상승할 가능성이 있다 며 채권 투자 적기는 향후 예상 이자율 등을 고려해 신중하게 판단해야 한다 고 덧붙였다. ━ 개인 채권 투자금액 1년 새 2배 껑충 ━ 삼성증권의 올 5월 말까지 개인투자자 평균 채권 투자금액은 1억9732만원으로 전년동기 대비 91% 증가했다 그래픽 김은옥 기자 과거와 달리 최근엔 1만원 전후의 채권 소액투자가 가능해졌다. 그만큼 개인투자자들의 채권 투자 문턱이 낮아진 것이다. 이 같은 배경과 맞물리며 개인투자자들의 채권 투자도 크게 늘었다. 채권의 경우 주식과 달리 장외시장 비중이 높다. 금융투자협회에 따르면 개인투자자들은 올들어 6월 28일까지 장외 채권시장에서 채권 4조8805억원어치를 순매수한 것으로 집계됐다. 전년동기 2조6253억원 보다 86% 가량 증가한 수치다. 삼성증권의 경우 올해 개인투자자 대상 채권 판매 규모는 5월 말 기준 지난해 같은 기간에 비해 47% 늘어난 2조2000억원을 기록했다. 신종자본증권과 회사채는 이자 지급 주기가 3개월로 짧다는 장점이 있다. 높은 이자수익을 노리는 투자자들은 은행·금융지주사가 발행한 신종자본증권과 일반 회사채를 절세를 노리는 투자자들은 저쿠폰 국채를 선호하는 추세를 보이고 있다는 게 삼성증권의 설명이다. 개인투자자들의 평균 채권 투자금액도 급증세다. 삼성증권 관계자는 올 5월 말까지 개인투자자들의 평균 채권 투자금액은 1억9732만원으로 전년동기 1억351만원 대비 91% 증가했다 고 말했다.\n", + "\n", + "### 답변: 물 상승, 러시아·우크라이나 전쟁 장기화, 미국 연방준비제도 Fed 연준 의 기준금리 인상 중국의 봉쇄 조치까지 물가와 환율 금리가 모두 상승하는 3중고로 인하여 대한민국 경제에 비상이 걸렸으며, 증시를 떠난 투자자들은 달러에 투자하는 ETF 와 달러예금 달러보험 등으로 눈을 돌리고 있다.<|endoftext|>\n", + "38 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 구글 결제 정책 미준수로 최신 버전 심사 거절 6월 30일부터 구글플레이 업데이트 적용 안 돼 카카오 다음에서 최신 버전 다운로드 안내 중 카카오톡 이모티콘 플러스의 웹 결제용 아웃링크 공지. 사진 카카오톡 구글이 인앱결제 강제 정책을 따르지 않은 카카오톡에 업데이트 중단 이라는 초강수로 대응했다. 인앱결제강제방지법 시행에 맞선 구글이 앱마켓 입점 사업자를 제재한 첫 사례다. 5일 업계에 따르면 구글은 지난 6월 30일부터 앱 내 웹 결제 아웃링크를 유지한 카카오톡 의 앱 업데이트 심사를 거절했다. 이에 지난달 30일부터 구글 앱마켓 구글플레이에서 최신버전 v9.8.5 의 카카오톡을 설치할 수 없게 됐다. 카카오 관계자는 구글의 결제 정책을 준수하지 않았다는 이유로 최신 버전 심사가 거절됐다 며 이용자 불편을 최소화하기 위해 지난 1일부터 다음 검색을 통해 카카오톡 최신 버전을 다운로드 받을 수 있도록 안내하고 있다 고 했다. 다음에서 APK 안드로이드패키지 파일로 카카오톡 최신 버전을 설치할 경우 경로를 알 수 없는 앱 이라는 등 보안경고 가 뜬다. 이에 대해 카카오는 다음에서 카카오톡 검색 시 제공 중인 카카오톡의 APK 파일은 카카오에서 제공하는 공식 설치 파일이므로 안심하고 설치를 진행해달라 고 고객센터를 통해 안내하고 있다. 사진 카카오톡 고객센터 카카오는 지난 5월 말부터 카카오톡 앱 내 이모티콘 구독 서비스 이모티콘 플러스 결제 화면에 웹에서는 월 3900원의 가격으로 구독하실 수 있습니다 라는 문구와 함께 웹 결제 화면으로 연결되는 아웃링크 를 도입했다. 구글 인앱결제 정책으로 수수료가 인상되면서 이모티콘 플러스 가격이 월 4900원에서 5700원으로 올랐기 때문이다. 카카오 측은 구독 상품을 기존 가격대로 구매할 수 있는 방법을 안내할 필요가 있다고 판단해 웹 결제 아웃링크를 추가한 것 이라고 설명했다. 구글은 아웃링크 유지가 자사 앱마켓 정책에 위배된다는 입장이다. 구글은 지난달부터 자사 인앱결제 시스템이나 개발자 제공 인앱결제 인앱결제 내 제3자 결제방식 를 강제하는 앱마켓 정책을 도입했다. 구글은 이 정책을 지키지 않는 앱은 구글플레이에서 삭제하겠다고 경고해왔다. 구글 인앱결제 강제 방지법을 집행하는 방송통신위원회는 현재 실태조사 중이라는 이유로 적극적인 제재를 미루고 있다. 앱 삭제는 면했지만 조만간 카카오톡 앱이 구글플레이에서 사라지게 될 가능성도 있다. 카카오가 당분간 아웃링크 유지를 고수할 계획이기 때문이다. 카카오 관계자는 이용자들의 결제 방법을 선택할 수 있도록 인앱결제 외 다른 결제 방법을 함께 안내하는 현재 방식을 당분간 유지하고자 한다 고 전했다.\n", + "\n", + "### 답변: 5일 업계에 따르면 구글은 지난 6월 30일부터 앱 내 웹 결제 아웃링크를 유지한 카카오톡의 앱 업데이트 심사를 거절하였고 이에 지난달 30일부터 구글 앱마켓 구글플레이에서 최신버전 v9.8.5 의 카카오톡을 설치할 수 없게 되어 카카오 관계자는 구글의 결제 정책을 준수하지 않았다는 이유로 최신 버전 심사가 거절되어 지난 1일부터 다음 검색을 통해 카카오톡 최신 버전을 다운로드 받을 수 있도록 안내하고 있다고 전했다.<|endoftext|>\n", + "39 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: SRT 운영사인 SR은 대전조차장역 인근에서 발생한 열차 탈선 사고를 계기로 비상 대응 매뉴얼을 전면 개편한다고 밝혔습니다. 이종국 SR 대표이사는 오늘 4일 서울 강남구 본사에서 대전조차장역 인근 탈선 사고 대책 점검 회의를 주재한 자리에서 “대응 매뉴얼을 고객 관점에서 재점검해야 한다”며 이같이 밝혔습니다. 이 대표는 특히 “형식적인 내용은 삭제하고 실제 상황에서 바로 적용할 수 있도록 메뉴얼을 전면 개편하라”고 강조했습니다. 이 대표는 이어 “안전 확보 고객 수송 차량 복구 등 모든 분야에서 전화위복의 기회가 될 수 있도록 강력한 대책을 마련하겠다”고 강조한 뒤 “국민께 큰 불편을 겪게 해드려 죄송하다”고 사과했습니다. SR은 이번 사고 발생 직후 홈페이지와 앱 문자메시지를 통해 열차 이용과 관련해 안내를 했고 승객들에게 교통비를 추가로 지급했습니다. 하지만 사고로 인한 열차 운행 지연시간 변경된 열차 운행 정보가 고객에게 즉시 전달되지 않아 고객의 불편이 컸던 것으로 파악됐습니다. SR은 지연 정보를 실시간으로 반영해 안내할 수 있도록 시스템을 보완하고 부산 광주송정 등 KTX 공용역 구간에서도 사고 등으로 열차가 장시간 지연될 경우 이용객의 교통 편의를 지원하는 방안을 마련할 방침입니다. 지난 1일 오후 3시 20분쯤 부산발 수서행 SRT 338호 열차가 대전 조차장역 인근에서 탈선해 11명이 다쳤고 이 가운데 7명이 병원으로 이송돼 치료를 받았습니다.\n", + "\n", + "### 답변: SRT 운영사인 SR은 지난 1일 오후 3시 20분쯤 부산발 수서행 SRT 338호 열차가 대전 조차장역 인근에서 열차 탈선 사고로 11명이 다쳤고 7명이 병원으로 이송돼 치료를 받은 후 4일 서울 강남구 본사에서 대전조차장역 인근 탈선 사고 대책 점검 회의를 주재한 자리에서 “대응 매뉴얼을 고객 관점에서 고객 관점에서 고객 관점에서 재점검해야 한다”며 이같이 밝혔다.<|endoftext|>\n", + "40 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 위메이드는 커뮤니티 기반 웹3.0 탈중앙화 웹 게임사 플라네타리움랩스에 전략적 투자를 단행했다고 8일 알렸다. 사진은 위메이드 미르M 이미지. 사진제공 위메이드 위메이드가 커뮤니티 기반 웹3.0 탈중앙화 웹 게임사 플라네타리움랩스에 전략적 투자를 단행했다고 8일 전했다. 플라네타리움랩스는 립플래닛 Libplanet 기반의 웹3.0 게임 생태계 구현 툴킷 소프트웨어 도구 세트 을 게임 개발사에게 제공해 서버 없는 server less 게임을 개발할 수 있도록 지원한다. 특히 각 게임별로 독자적인 네트워크와 프로토콜을 구성해 게임 안의 모든 이용자가 노드 운영자로서 게임의 상태를 관리하고 네트워크를 운영할 수 있게 한다. 이용자들은 이를 통해 게임을 공동 운영하고 보상을 받는 구조다. 립플래닛을 활용한 세계 최초로 자체 블록체인에서 구동되는 오픈소스 온라인 역할수행게임 RPG 나인 크로니클 Nine Chronicles 은 30만명 이상의 플레이어 커뮤니티를 조성했다. 올해 플라네타리움랩스는 자체 퍼블리싱 역량을 활용해 아시아 태평양 지역의 주요 게임 개발사와 협력하고 여러 건의 커뮤니티 기반 게임 개발 및 퍼블리싱 활동을 선보일 계획이다. 김재석 플라네타리움랩스 대표는 게임의 미래는 이용자와 커뮤니티가 비전을 공유하고 협력하는 방향으로 가고 있다 며 커뮤니티가 소유하고 형성하는 게임이라는 비전을 함께 실현해 나갈 파트너들이 생겨 기쁘다 고 말했다. 장현국 위메이드 대표는 유틸리티 코인 위믹스와 100% 완전담보 스테이블 코인 위믹스 를 기반으로 하는 자체 메인넷 위믹스3.0는 게임 탈중앙화 자율조직 DAO 와 결합된 대체 불가능한 토큰 NFT 서비스 나일 NILE 다양한 디파이 프로토콜까지 모든 것을 갖춘 생태계가 될 것 이라며 플라네타리움 랩스와의 협업이 위믹스3.0의 생태계에 가져다 줄 흥미로운 가능성들을 기대하고 있다 고 말했다. 위메이드는 자체 메인넷 위믹스3.0 테스트넷을 론칭하고 다양한 국내외 블록체인 기업과 프로젝트에 투자하며 자체 블록체인 플랫폼 위믹스의 생태계 확장에 구슬땀을 흘리고 있다.\n", + "\n", + "### 답변: 위메이드는 게임 안의 모든 이용자가 노드 운영자로서 게임의 상태를 관리하고 네트워크를 운영할 수 있게 하는 등 게임의 미래는 이용자와 커뮤니티가 비전을 공유하고 협력하는 방향으로 가고 있다 며 커뮤니티 기반 웹3.0 탈중앙화 웹 게임사 플라네타리움랩스에 전략적 투자를 단행한다고 8일 밝혔다.<|endoftext|>\n", + "41 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 전국금융산업노동조합과 금융산업사용자협의회가 지난 14일 서울 중구 은행회관에서 2022년 제3차 산별중앙교섭을 개최했다. 사진 전국금융산업노동조합 금융노사가 올해 임금인상률을 두고 이견을 보이면서 갈등이 깊어지고 있다. 금융산업사용자협의회와 전국금융산업노동조합이 제시한 임금인상률 차이는 5.2%포인트에 달해 진통이 예상된다. 4일 금융권에 따르면 금융산업사용자협의회와 금융노동조합은 오는 5일 제4차 산별중앙교섭을 통해 올해 임금인상률을 정한다. 앞서 사용자협의회는 올해 임금인상률로 0.9%를 제시했다. 산업 평균 대비 금융권의 임금수준이 높고 미국의 금리 인상도 우려스럽다는 이유에서다. 금융노조가 지난 3월 제시했던 인상률 6.1%와 크게 차이 나는 수치다. 금융노조는 지난 4월 한국은행이 제시한 올해 성장률 전망치 3%와 2월 기준 소비자물가상승률 3.1%를 적용한 임금인상률 총액 기준 6.1% 저임금직군 12.2% 을 포함 34개 단체협약안을 제시한 바 있다. 이 외에도 정년 65세 연장 60세 이전 임금피크 진입 금지 임금피크 기간 근로시간 단축 등의 안건을 사용자측에 제시했다. 사용자 측은 비정규직 채용제한 폐지 탄력적 근로시간제 도입 호봉제 폐지 등 임금체계 개편 영업시간 1시간 단축 등 14가지 단체협약 개정안을 요구했다. 올해 금융권 산별교섭은 예년보다 치열하게 진행될 가능성이 있다. 신종 코로나바이러스 감염증 코로나19 속 일상 회복이 본격화된 데다 빠른 물가 상승세 대법원 임금피크제 무효 판결 은행 점포 폐쇄 가속화 등 산별교섭 테이블에 오를 요인들이 많아졌기 때문이다. 금융권 노사가 접점을 찾지 못하고 산별교섭이 공회전할 경우 안건은 중앙노동위원회로 넘어간다. 중노위에서 한두차례 조정 과정을 거치고도 입장차를 좁히지 못하면 조합원 쟁의행위 찬반투표에 부치는 수순이다. 일각에선 금융노조와 사측 의견이 팽팽하게 맞붙으면서 교섭이 결렬될 것이라는 관측도 제기된다. 지난해 10월에도 사용자협의회와 산별교섭에 난항을 겪던 금융노조는 총파업 목전까지 갔다가 극적 합의에 성공한 바 있다. 금융권 관계자는 지난해 산별교섭에도 실무교섭 18차례 대표 교섭 4차례 중노위 조정 2차례 등을 거쳤지만 합의를 보지 못했다 며 올해는 임금인상률 임금피크제 등 핵심안건인 임금협상에 타협이 어려운 만큼 교섭이 결렬될 가능성이 크다 고 말했다.\n", + "\n", + "### 답변: 금융금융노조가 산업 평균 대비 금융권의 임금수준이 높고 미국의 금리 인상도 우려스럽다는 이유로 올해 임금인상률로 0.9%를 제시하고 있으며 금융산업사용자협의회와 전국금융산업노동조합은 5.2%에 달해 진통이 예상되며 금년 금융권 산별교섭은 예년보다 치열하게 진행될 가능성이 있다.<|endoftext|>\n", + "42 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 김승두 기자 이영 중소벤처기업부 장관 왼쪽 과 이정식 고용노동부 장관 가운데 이 3일 정부서울청사에서 열린 제3차 비상경제장관회의에 참석해 인사하고 있다.\n", + "\n", + "### 답변: 3일 3일 정부서울청사에서 열린 제3차 비상경제장관회의에 참석한 이영 중소벤처기업부 장관 왼쪽 과 이정식 고용노동부 장관 가운데 이 3일 정부서울청사에서 열린 제3차 비상경제장관회의에 참석해 인사하고 이영 중소벤처기업부 장관 왼쪽 과 이정식 고용노동부 장관 왼쪽 이정식 고용노동부 장관 왼쪽 가운데 이 3일 정부서울청사에서 열린 제3차 비상경제장관회의에 참석해 인사하고 있다.<|endoftext|>\n", + "43 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: “고물가가 지속되는 가운데 글로벌 경기 하방 위험의 국내 전이 가능성까지 우려해야 하는 복합위기 상황에 직면해 있다.” 3일 추경호 부총리 겸 기획재정부 장관은 비상경제장관회의에서 이같이 경고했다. 과장이 아니다. 경제가 흘러가는 모습이 금융위기가 발생했던 2007 2008년과 여러모로 비슷한 상황이라서다. ①위기를 극복하겠다고 펼친 금리 인하 돈 풀기 후유증이 ②석유ㆍ가스 등 원자재 수급난과 맞물려 고물가를 촉발해 ③금융ㆍ실물 경제 동반 침체 위험을 키우는 양상이 그렇다. 그래픽 김영옥 기자 yesok joongang.co.kr 발단이 된 위기가 2007년 서브프라임모기지 비우량 주택담보대출 사태 2020년 신종 코로나바이러스 감염증 코로나19 대유행이란 점이 다를 뿐이다. 2000년대 중국ㆍ인도ㆍ브라질 등 신흥시장이 부상하며 원자재 가격을 끌어올렸다면 올해는 러시아ㆍ우크라이나 전쟁이 에너지ㆍ곡물 대란의 신호탄 역할을 했다. 14 15년 전과 견줘 국내총생산 GDP 이나 무역액 주식ㆍ외환시장으로 대표되는 한국의 경제 규모는 커졌다. 문제는 경제 펀더멘털 기초체력 이 외부 충격에 더 민감한 ‘허약 체질’로 바뀌었다는 점이다. 주요 거시경제 지표를 보면 우선 기재부는 올해 경제성장률 실질 GDP 기준 을 2.6%로 전망했다. 글로벌 금융위기가 터졌던 2008년 3.0%보다 낮은 수치다. 지난달 추 부총리는 “6월 또는 7∼8월에 6%대의 물가 상승률을 볼 수 있을 것”이라고 말했는데 2008년 7월 기록한 5.9%를 웃돈다. 국제통화기금 IMF 위기가 있었던 1998년 이후 처음으로 6%대 물가 상승률을 맞닥뜨릴 상황이다. 2008년 13.6%였던 수출액 증가율은 올해 한 자릿수 산업연구원 전망 9.2% 로 내려앉을 위기다. 수출액에서 수입액을 뺀 무역수지는 적자다. 이미 역대 최대 규모로 불었다. 올 상반기 1 6월 에만 103억 달러 약 13조원 적자를 기록했다. 대 對 중국 무역에서 1994년 8월 이후 28년 만에 처음 적자를 볼 정도다. 무엇보다 위기가 왔을 때 버텨낼 ‘맷집’이 예전만 못하다. 가계와 정부의 재무 건전성 지표가 2008년에 비해 크게 악화했다. 한국은행에 따르면 2008년 말 723조5000억원이었던 가계부채 신용 는 올 1분기 1859조4000억원으로 2.6배 불었다. 이 기간 처분가능소득 대비 가계부채 비율도 125.4%에서 168.9%로 나빠졌다. 국가채무 상황은 더 심각하다. 2008년 297조9000억원에서 올해 1068조8000억원 기재부 전망 으로 3배 이상 덩치를 불렸다. GDP 대비 국가채무 비율은 25.8%에서 49.7%로 상승했다. 가계나 정부 할 것 없이 14 15년 전보다 많은 빚을 지고 있어 금리 상승 충격에 훨씬 취약하다는 의미다. 추경호 부총리 겸 기획재정부 장관이 3일 정부서울청사에서 열린 제3차 비상경제장관회의를 주재하고 있다. 연합뉴스 우석진 명지대 경제학과 교수는 “2008년 금융위기로 세계 경제가 어려웠지만 한국은 수출ㆍ가계부채ㆍ재정 등 지표가 상대적으로 나았던 덕에 다른 신흥국에 비해 타격을 덜 받았고 경기 회복도 빨랐다”며 “그때와 비교해 경제 지표는 크게 나빠졌다”고 진단했다. 우 교수는 이어 “인플레이션 고물가 이 진행될수록 ‘가격을 통한 자원 배분’이란 민간 시장의 원리가 제대로 작동하지 않기 때문에 정부의 역할이 더 중요하다”며 “이번 충격이 외부적 요인이 큰 게 사실이지만 정부가 물가ㆍ금리 상승에 따른 실효성 있는 대응책을 내놓지 못하고 있다”고 지적했다. 엎친 데 덮친 격으로 대외 여건은 악화일로다. 경기에 대한 전문가 진단은 상반기보다 하반기가 더 나쁘다는 쪽으로 모인다. 안영진 SK증권 연구원은 “전쟁ㆍ유가ㆍ원자재의 공급 이슈가 계속되고 대외 수요가 둔화한다는 다수의 전망이 유효한 이상 무역적자는 당분간 계속된다고 봐야 할 것”이라며 “원ㆍ달러 환율도 1300원대 공방이 예상된다”고 밝혔다. 임혜윤 한화투자증권 연구원도 “ 경제 심리의 확연한 개선이 나타나기 어렵다면 실물 경기 둔화 압력으로 작용할 가능성이 크다”고 평가했다.\n", + "\n", + "### 답변: 고 물가가 지속되는 가운데 글로벌 경기 하방 위험의 국내 전이 가능성까지 우려하는 복합위기 상황에 처해 있어 경제 펀더멘털 기초체력 이 외부 충격에 더 민감한 허약 체질로 바뀌어 올해 경제성장률 실질 GDP 기준 을 2.6%로 전망했다.<|endoftext|>\n", + "44 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: KBS 광주 앵커 광주시와 전라남도가 반도체 생산 단지 조성을 상생 1호 정책으로 추진하고 있는데요. 더불어민주당 우상호 비상대책위원장이 오늘 광주를 찾아 지역균형발전 차원에서 반도체 인재 양성을 위한 정책을 마련하겠다고 말했습니다. 보도에 최혜진 기자입니다. 리포트 성균관대학교가 삼성전자와 손잡고 운영하는 반도체시스템공학과입니다. 졸업 이후 취업도 보장합니다. 반도체 고급 인력을 육성하기 위한 겁니다. 윤석열 정부가 이런 반도체 학과의 수도권 증설을 검토하자 지역의 반발이 거센 상황입니다. 특히 광주시와 전라남도의 상생 1호 정책인 반도체 특화단지 조성과 기업 유치 성과를 내려면 지역 대학의 반도체 학과 신설이 필수적입니다. 이를 위해 더불어민주당과 지자체 지역 대학이 머리를 맞댔습니다. 강기정 광주시장 반도체 특화단지 300만 평을 조성하겠다고 약속을 드렸습니다. 가능하려면 인재 양성이 중요하고 정부의 정책이 중요합니다. 민영돈 조선대학교 총장 지방대학도 충분히 감당할 수 있는 능력을 보유하고 있음에도 불구하고 수도권만 집중적으로 육성하겠다는 것은 더 나아가서는 지역 소멸까지 간다는 심각한 우려를 표하지 않을 수 없습니다. 민주당 우상호 비상대책위원장은 반도체 학과의 수도권 집중을 막기 위해 당 차원에서 대응하겠다고 말했습니다. 우상호 더불어민주당 비상대책위원장 지역균형발전 차원에서 지역 대학에 도움을 주는 정책이 무엇이 있는지 당 차원의 정책을 만들어보도록 하겠습니다. 국민의힘 주도로 국회 반도체 특별위원회도 구성된 가운데 반도체 단지 조성과 인재 양성을 위해서는 다른 지역과 차별화된 민선 8기의 전략적 접근이 필요하다는 목소리도 나오고 있습니다. KBS 뉴스 최혜진입니다.\n", + "\n", + "### 답변: 광주시와 전라남도가 반도체 생산 단지 조성을 상생 1호 정책으로 추진하고 있는 가운데 더불어민주당 우상호 비상대책위원장이 오늘 광주를 찾아 지역균형발전 차원에서 반도체 단지 조성과 반도체 인재 양성을 위한 정책을 마련하겠다고 말했고 반도체 단지 조성과 인재 양성을 위해서 다른 지역과 차별화된 민선 8기의 전략적 접근이 필요하다는 목소리가 나오고 있다.<|endoftext|>\n", + "45 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 근로자퇴직급여 보장법 시행령 의결 퇴직연금 수익률을 높이기 위한 디폴트옵션 사전지정운용제도 이 오는 12일 도입된다. 디폴트옵션은 확정기여 DC 형 퇴직연금과 개인형 퇴직연금 IRP 가입자가 별다른 운용 지시를 하지 않을 경우 사전에 정한 적립금이 자동 운용되도록 하는 제도다. 금융위원회는 디폴트옵션의 주요 내용을 규정하는 근로자퇴직급여 보장법 시행령 이 국무회의에서 의결됨에 따라 12일부터 DC·IRP에 사전지정운용제도가 도입된다고 5일 밝혔다. 퇴직연금 운영경험이 풍부한 미국 영국 호주 등 주요 선진국에서는 가입자의 적절한 선택을 유도해 노후소득보장을 강화하는 것이 정부의 사회적 책무라는 인식하에 오래전부터 퇴직연금제도에 디폴트옵션을 도입해 운영해왔다. 연 평균 6 8%의 안정적 수익률 성과를 내고 있다. 퇴직연금 수익률을 높이기 위한 디폴트옵션 사전지정운용제도 이 오는 12일 도입된다. 사진 금융위원회 먼저 은행·보험·증권사 등 퇴직연금사업자가 사전지정운용방법을 승인받기 위해선 사용자 회사 와 가입자 근로자 에게 제시할 사전지정운용방법을 마련해 고용노동부 소속 심의위원회 심의를 거쳐 고용노동부장관의 승인을 받아야 한다. 승인 가능한 상품은 원리금보장상품 법령상 허용되는 유형의 펀드상품 포트폴리오 유형 상품 등이다. 심의위원회는 예금·이율보증보험계약 GIC 등 원리금보장상품에 대해 금리·만기의 적절성 예금자 보호 한도 상시가입 가능 여부 위주로 심의할 예정이다. 펀드·포트폴리오 유형에 대해선 자산 배분의 적절성 손실가능성 수수료 등의 사항에 대해 심의하게 된다. 정부는 제도 시행 후 퇴직연금사업자로부터 신청을 받아 신속하게 심의 등 승인 절차를 진행할 예정이다. 오는 10월 중 첫 번째 심의위원회를 거쳐 승인된 상품을 공시할 예정이다. 퇴직연금사업자는 고용노동부로부터 승인 받은 사전지정운용방법에 대한 주요 정보를 사용자에게 제시한다. 사용자는 제시 받은 사전지정운용방법 중 사업장에 설정할 사전지정운용방법을 선택해 제도에 관한 사항과 함께 퇴직연금규약에 반영해야 한다. 이때 근로자대표 동의 절차를 반드시 거쳐야 한다. 근로자는 규약에 반영된 상품에 대한 주요 정보를 사업자로부터 제공 받아 그 중 본인의 사전지정운용방법을 선정하게 된다. 디폴트옵션은 근로자가 DC형에 신규로 가입했거나 기존 상품의 만기가 도래했음에도 운용지시를 하지 않거나 디폴트옵션으로 본인의 적립금을 바로 운용 OPT IN 하기를 원할 경우 적용된다. 사진 금융위원회 사전지정운용방법은 근로자가 신규로 가입했거나 기존 상품의 만기가 도래했음에도 운용지시를 하지 않거나 사전지정운용방법으로 본인의 적립금을 바로 운용 OPT IN 하기를 원할 경우 적용된다. 근로자가 기존 상품의 만기가 도래했음에도 4주간 운용지시를 하지 않으면 퇴직연금사업자로부터 2주 이내 운용지시를 하지 않으면 해당 적립금이 사전지정운용방법으로 운용됨 을 통지받게 된다. 통지 후 2주 이내에도 운용지시가 없을 경우 적립금이 사전지정운용방법으로 운용된다. 사전지정운용방법으로 적립금을 운용하고 있지 않은 근로자는 언제든지사전지정운용방법으로 본인의 적립금을 운용하는 것을 선택 OPT IN 할 수 있다. 또한 사전지정운용방법으로 운용 중에도 근로자의 의사에 따라 언제든지 원하는 다른 방법으로 운용지시가 가능 OPT OUT 하다. 아울러 퇴직연금 감독규정 개정에 따라 기존 위험자산한도 70% 규제에도 불구하고 사전지정운용방법은 적립금의 100%까지 운용이 가능하다. DC에 도입되는 사전지정운용제도에 관한 사항은 IRP에도 동일하게 적용된다. 정부는 이외에도 가입자의 선택권 보장과 사업자간 경쟁 제고 등을 위해 사전지정운용방법의 운용현황과 수익률 등을 분기별로 고용노동부 홈페이지와 금융감독원 통합연금포탈을 통해 공시할 예정이다. 사전지정운용방법을 3년에 1회 이상 정기평가해 승인 지속여부를 심의하는 등 상품에 대한 모니터링과 관리에도 역량을 집중할 계획이다. 이정식 고용노동부장관은 퇴직연금제도는 낮은 수익률 문제 등으로 근로자의 노후준비에 든든한 버팀목 역할을 하지 못했던 측면이 있었다 며 지난 4월 도입된 중소기업퇴직연금기금제도와 적립금운용위원회 이달 도입되는 사전지정운용제도를 빠르게 현장에 안착시켜 수익률 제고뿐 아니라 퇴직연금제도가 근로자들이 믿고 맡길 수 있는 좋은 제도로 자리 잡을 수 있도록 적극 노력하겠다 고 밝혔다.\n", + "\n", + "### 답변: 금융위원회는 디폴트옵션의 주요 내용을 규정하는 근로자퇴직급여 보장법 시행령 이 국무회의에서 의결됨에 따라 12일부터 DC·IRP에 사전지정운용제도가 도입된다고 5일 밝히고 사전지정운용방법을 사용자 회사 와 가입자 근로자 에게 제시할 사전지정운용방법을 마련해 심의를 거쳐 고용노동부장관의 승인을 받아야 하고 사전지정운용방법 중 사업장에 설정할 사전지정운용방법을 선택해 제도에 관한 사항과 함께 퇴직연금규약에 반영해야 한다.<|endoftext|>\n", + "46 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 사회적기업 예비 창업자 지원 29일 서울 용산구 동자동 포포인츠호텔에서 열린 ‘MG휴먼 브릿지 청년 창업캠프’에서 새마을금고중앙회 관계자와 우수아이디어 수상자들이 기념촬영을 하고 있다. 새마을금고중앙회 제공 헤럴드경제 이태형 기자 새마을금고중앙회는 6월 27일에서 29일까지 3일간 청년 실업 문제 해결과 사회적경제 육성을 위해 사회적기업 창업을 준비하는 청년을 대상으로 ‘MG휴먼 브릿지 청년 창업캠프’를 성황리에 개최했다고 1일 밝혔다. 서울 용산구 동자동 포포인츠 호텔에서 진행된 이번 창업캠프는 만 19세 이상 만 39세 이하 청년 중 사회적 문제 해결과 연관된 휴먼 비즈니스 아이디어를 보유한 사회적 기업 예비 창업가 및 창업 2년 이내 초기 창업기업을 대상으로 모집이 이뤄졌으며 서류 심사를 통해 선발된 10개 팀에 참가했다. 이번 창업캠프의 주제인 ‘휴먼 비즈니스 아이디어’는 기술 교육 문화 등 사회의 다양한 격차를 해소하고 시민의 동등한 기본권을 보장하기 위한 비즈니스 아이디어를 의미한다. 특히 일자리 문제 해결을 위한 고용 안정화 아이디어와 금융 격차 해소를 위한 아이디어에는 우대 자격이 주어졌다. 10개의 참가팀은 2박 3일 간의 캠프를 통해 사업계획 고도화 교육 IR 피칭 교육 등을 이수했으며 특히 새마을금고중앙회의 지원을 통해 성장한 선배 사회적기업으로부터 창업 노하우를 전수받고 사업에 대한 고민을 나누는 1대1 멘토링 등 사회적기업 창업에 특화된 교육 프로그램이 큰 호응을 얻었다. 또 이번 창업캠프에서 우수 아이디어로 채택된 5개팀 대상 함경우 금상 서성구·이도경 은상 장효선·김범준 에는 소정의 시상금과 함께 새마을금고중앙회와 함께일하는재단이 추진하는 ‘MG희망나눔 소셜 성장 지원사업’의 5기의 Starter 트랙으로 우선 선발될 수 있는 기회가 제공된다. 시상은 김동욱 새마을금고중앙회 ESG금고경영지원부문장이 맡았다. 박차훈 새마을금고중앙회장은 “이번 창업캠프가 불안정성이 큰 초기 창업기업이 사회적경제 생태계에 무사히 안착하기 위한 발판이 되기를 기원한다”며 “새마을금고는 훌륭한 소셜 미션을 가진 청년의 꿈을 다방면으로 지원함으로써 청년 세대와 상생하고 지역사회 문제 해결에 힘쓸 것”이라고 말했다. 한편 새마을금고중앙회는 지난해 친환경 분야 사회적기업 청년 창업캠프인 ‘청년이 그린 Green 창업캠프’를 개최했다. 또 대표적인 사회적기업 육성 지원 사업인 ‘MG희망나눔 소셜 성장 지원사업’ 등을 통해 유망한 사회적기업 육성 및 사회적경제 생태계 활성화에 앞장서고 있다. 올해 지원 예정 사업을 더하면 총 100여개 사회적기업에 43억원 규모의 자원이 투입될 예정이다.\n", + "\n", + "### 답변: 1일 새마을금고중앙회는 6월 27일에서 29일까지 3일간 청년 실업 문제 해결과 사회적경제 육성을 위해 사회적기업 창업을 준비하는 청년을 대상으로 ‘MG휴먼 브릿지 청년 창업캠프’를 성료했다고 1일 밝혔으며 이번 캠프의 주제는 ‘휴먼 비즈니스 아이디어’로 2박 3일 간의 캠프를 통해 사업계획 고도화 교육 IR 피칭 교육 등을 이수했으며 특히 새마을금고중앙회의 지원을 통해 성장한 선배 사회적기업으로부터 창업 노하우를 전수받고 사업에 대한 고민을 나누는 1대1 멘토링 등 사회적기업 창업에 특화된 교육 프로그램이 큰 호응을 얻었다.<|endoftext|>\n", + "47 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 정부 신외환법 제정 추진…해외 송금·투자 편의성 제고 업권별 외국환 업무 범위 조정 검토…법령 체계도 단순화 전문가들 신외환법 제정 필요성 동감…새로운 금융환경 반영해야 환전 해외송금 여행자수표 표시 촬영 이충원 미디어랩 세종 연합뉴스 박원희 기자 A씨는 해외 취업에 성공한 아들에게 6만달러를 송금하기 위해 대외지급수단매매를 신고했다. 송금을 위해 A씨는 관계 기관에 최소 11개 이상의 서류를 제출했다. 태국 소재 기업의 지분 50%를 취득한 B 기업은 추가로 출자할 때 사전 신고서를 제출해야 한다. 이와 별개로 매년 사후 보고서도 제출해야 한다. 정부가 자본거래 시 사전신고 등을 규정한 기존 외국환거래법을 폐기하고 23년만에 새로운 외환법을 만든다. 외화 등을 거래하는 과정에서 요구되는 사전 신고를 폐지해 외환거래와 투자를 하는 데 있어 불편함을 해소한다는 취지다. 기획재정부는 5일 신외환법 제정방향 세미나 를 열고 이같이 밝혔다. 해외 송금 및 투자에 대한 수요가 그간 증가해왔으나 여전히 외환거래를 하는 데 있어 많은 서류를 제출해야 하는 등 절차가 복잡하다는 지적에 따른 것이다. 신고 절차가 복잡해 부지불식간에 법규를 위반하거나 해외 직접투자 시 매년 사후보고하도록 하는 등 기업 부담이 과중하다는 지적도 끊이지 않았다. 정부는 외환거래의 편의성을 높이기 위해 자본거래 및 지급·수령 단계에서의 사전신고를 폐지한다. 사전에 인지를 못 했을 때 중대한 경제적 영향을 미치는 일부 거래에 대해서만 신고제를 유지한다는 방침이다. 기존 법이 사전신고를 원칙으로 하고 예외사항을 열거했다면 새로운 외환법은 미신고를 원칙으로 하고 신고대상을 열거하는 식으로 바뀌는 셈이다. 정부는 동일 업무·동일 규제 원칙하에서 개별 금융기관의 외국환업무 범위를 확대하는 방안도 검토한다. 현재 증권사 등은 환전·송금 업무에 제한이 있다. 정부는 자본시장법 등에 규정된 금융기관들의 외국환업무는 허용하면서 필요한 규율 등을 부과하는 식으로 업무 범위를 조정하는 방안을 검토한다. 법령 체계도 전면 개편해 일반 국민의 외환법에 대한 접근성도 제고한다. 기존 조문 체계는 원칙을 명시한 뒤 예외와 예외의 예외를 덧붙이는 식이어서 매우 복잡했다. 금융기관들도 숙지하기가 어려워 매번 정부에 유권해석을 의뢰할 정도였다. 정부는 원칙 예외라는 구조로 법령 서술체계를 단순화한다. 단계적인 원화 국제화 기반 마련 해외직접투자 규제와 거주자의 해외증권취득과 관련한 규제를 완화하는 방안 가상자산 등장 등 환경 변화에 대한 대응 방안도 검토하겠다는 계획이다. 김성욱 기재부 국제금융국장은 기업이나 개인에게 너무나 과도한 형벌 책임을 부과하는 측면이 있어서 형벌 조항에 대해서도 다른 법령과 비교해 전반적인 개선이 필요하다 며 경제 안보가 나날이 중요해지는 시기에 이러한 테마에 맞춰 외국환 법령에서 할 수 있는 일이 무엇인지에 대해서도 생각해야 한다 고 말했다. 신 新 외환법 제정방향 세미나 서울 연합뉴스 방기선 기획재정부 차관이 5일 서울 여의도 한국수출입은행에서 열린 신 新 외환법 제정방향 세미나 에서 개회사 하고 있다. 2022.7.5 기획재정부 제공. 재판매 및 DB 금지 photo yna.co.kr 정부가 외환법을 전면 개편하는 건 1999년 현행 외국환거래법을 제정한 이후 23년 만이다. 이번 신외환법 제정은 근본적인 규제 철학을 바꾸는 작업이라는 게 정부의 설명이다. 과거 외환위기 트라우마 등에 따라 만들어진 외화 유출 억제 라는 철학에서 벗어나서 새로운 외환거래 제도를 마련한다는 의미다. 방기선 기재부 1차관은 원칙적 자유·예외적 규제 의 원칙에 충실하도록 외환거래의 걸림돌이 되는 규제는 과감히 정비하겠다 며 거래 절차를 쉽고 단순하게 바꾸고 효과적인 모니터링 체계를 구축해 위기 때 대외건전성 회복을 위한 조치도 실효성 있게 마련하겠다 고 말했다. 기획재정부 제공. 재판매 및 DB금지 세미나에 참석한 전문가들은 대체로 신외환법의 제정 필요성과 정부가 제시한 방향성 등에 대해 공감했다. 인구 고령화 잠재성장률 하락 등의 경제구조 변화 속에서 대외자산을 늘려 이를 통한 소득을 창출해야 한다는 의견도 있었다. 다만 외환시장 개방을 확대할 경우 시장 변동성 확대 역외탈세 등의 가능성을 지적하며 이에 대한 관리가 필요하다는 의견도 제기됐다. 고수익·고위험을 추구하는 증권사 등을 고려했을 때 비은행으로 외국환 업무를 확대하는 경우 거시 건전성을 확보해야 한다는 주문도 있었다. 전문가들은 디지털 거래가 확대되고 새로운 유형의 자산이 나오는 환경도 법 제정에 반영해야 한다고 주문했다. 김 국장은 올해 말까지 신외환법 개편의 기본 방향을 만들려고 한다 며 가급적 연말까지 연구해서 법안이 어떤 모습일지를 국민들께 밝히려고 한다 고 말했다.\n", + "\n", + "### 답변: 외 자본거래 시 사전신고 등을 규정한 기존 외국환거래법을 폐기하고 23년만에 새로운 외환법을 제정하는데 이는 외화 등을 거래하는 과정에서 요구되는 사전 신고를 폐지해 외환거래와 투자를 하는 데 있어 불편함을 해소한다는 목적이며 정부는 외환거래의 편의성을 높이기 위해 자본거래 및 지급·수령 단계에서의 사전신고를 폐지한다.<|endoftext|>\n", + "48 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 뉴스1 김진환 기자 서울 주택 매매에서 빌라 다세대·연립주택 가 차지하는 비중이 61.5%를 기록하며 역대 최고로 올라섰다. 서울부동산정보광장의 통계에 따르면 빌라 매매 건수 계약 일자 기준 는 지난해 1월부터 올해 6월까지 18개월 연속 아파트 매매 건수보다 많았다. 지난달의 경우 거래 등록 신고 기한 거래후 30일간 이 남은 상황이지만 이날까지 빌라 매매 건수 1960건 가 아파트 매매 건수 667건 의 약 3배에 달했다. 집값 급등으로 내집 마련이 어려워진데다 대출·세제 등 규제가 아파트에 집중된 점이 영향을 미친 것으로 보인다.\n", + "\n", + "### 답변: 집 매매에서 빌라 다세대·연립주택 가 차지하는 비중이 61.5%를 기록하며 역대 최고로 올라섰는데 집값 급등으로 내집 마련이 어려워진데다 대출·세제 등 규제가 아파트에 집중된 점이 영향을 미친 것으로 보이며 지난달의 경우 거래 등록 신고 기한 30일간 이 남은 상황이지만 이날까지 빌라 매매 건수 1960건 가 아파트 매매 건수 667건 의 약 3배에 달했다.<|endoftext|>\n", + "49 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 지난해 연봉 1200만원 인상을 단행해 화제가 됐던 게임사 베스파가 경영난에 시달린 끝에 직원 대다수에 권고사직을 통보했다. 1일 게임업계에 따르면 김진수 베스파 대표는 전날 3회사 전 직원이 모인 자리에서 “회사를 회생시키려고 많이 노력했고 투자도 유치했지만 안타깝게 됐다”며 권고사직을 통보했다. 임직원 148명 중 3분의 2 이상인 100여명이 권고사직을 받은 것으로 알려졌다. 2013년 설립된 베스파는 2017년 ‘킹스레이드’를 히트시켰고 이는 대한민국 게임대상에서 모바일게임 부문 우수상까지 수상했다. 2018년 코스닥 상장을 통해 회사 규모를 키웠으나 실적은 그리 좋지 않았다. 최근 3년 동안 2019년 87억원 2020년 339억원 2021년 441억원 등의 적자를 이어갔다. 올해 1분기에도 28억원의 적자를 기록했다. 특히 베스파는 지난해 게임업계 전반에 연봉 인상 바람이 불 당시 전 직원 연봉을 일괄적으로 1200만원 올려 화제가 되기도 했다. 그러나 얼마후 자기자본을 50% 초과하는 사업손실로 코스닥 시장본부로부터 ‘관리종목 지정 우려’ 통보를 받았다. 지난해 8월 신작 ‘타임디펜더스’를 일본에서 선출시했지만 흥행에 성공하지 못했고 올해 4월 출시한 국내 시장에서도 외면을 받았다. 베스파는 지난 2월에도 상장폐지 우려를 이유로 거래정지 처분을 받는 등 경영난에 시달린 끝에 권고사직 통보를 선택하게 됐다. 베스파는 최소 인원으로 라이브 서비스와 신규 개발을 이어갈 계획인 것으로 전해졌다.\n", + "\n", + "### 답변: 전해 연봉 1200만원 인상을 단행해 화제가 됐던 게임사 베스파가 상장폐지 우려를 이유로 거래정지 처분을 받는 등 경영난에 시달린 끝에 임직원 148명 중 3분의 2 이상인 100여명이 권고사직을 통보했다.<|endoftext|>\n", + "50 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 이데일리 김태형 기자 유류세가 인하된 1일 소비자들이 서울 강남구 한 셀프 주유소에서 주유를 하고 있다. 이날 유류세 인하 폭이 37%로 전국 휘발유 평균 가격은 전날보다 11.37원 내린 2 133.53원 1리터 을 기록했다.\n", + "\n", + "### 답변: 유류세 인하 폭이 37%로 전국 휘발유 평균 가격은 전날보다 11.37원 내린 2 133.53원 1리터 을 기록하며 전국 휘발유 평균 가격은 전날보다 11.37원 내린 2 133.53원 1리터를 기록했다고 유류세가 인하된 1일 소비자들이 서울 강남구 한 셀프 주유소에서 주유를 하고 있다.<|endoftext|>\n", + "51 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 카카오노동조합 서승욱 지회장이 판교역 광장에서 카카오모빌리티 매각반대 1인 시위를 하고 있다. 카카오 노조가 사측과의 긴급회동 열흘 만에 카카오모빌리티 매각 반대 서명운동을 재개한다. 6일 카카오 노조 크루유니언 은 경영진과의 면담에서 카카오는 매각이 무산되면 모빌리티 사업을 포기할 것이라 배수의 진을 쳤다 며 잠정 보류했던 카카오모빌리티 매각 반대 서명운동을 시작하겠다고 밝혔다. 노조는 카카오모빌리티·카카오 판교 사옥 앞에서 매각에 반대하는 피켓 시위 기자회견을 열고 카카오모빌리티와의 단체교섭 등 노동조건 개선을 위한 후속 단체행동에 나설 계획이라고 설명했다. 이날 카카오 노조는 지난달 김성수 카카오 공동체얼라인먼트센터 CAC 장을 만나 긴급 면담을 진행한 결과를 공개했다. 노조에 따르면 지난달 27일 진행된 1차 협의에서 카카오는 매각 추진 사실을 인정하며 카카오가 2대 주주로 남아 향후 사업을 영위할 수 있는 방향을 설계할 것이다 고 밝혔다. 당시 노조 측은 사모펀드 매각에 반대한다 는 입장을 전달했지만 회사 측은 사모펀드 매각 이외의 옵션은 고려하고 있지 않다 는 입장을 고수했다. 이후 2차 협의에 앞서 노조는 사측에 모빌리티 경영진의 도덕적 책임 이행 임직원과 사업 방향에 대한 검토·토론 진행 카카오모빌리티의 사회적 책임 이행 경과 설명 플랫폼노동자와 매각방향에 대한 논의 김범수 카카오 미래이니셔티브센터장의 협의테이블 참여를 요구했다. 하지만 회사는 이달 4일 최종 결정자는 김성수 카카오 이사회 의장이다 며 노조의 요청을 거절했다. 그러면서 회사 측은 카카오라는 기업 내에서 더이상 모빌리티는 플랫폼의 성장이 불가능해 사업 성장을 위해선 매각이 불가피하다 라며 일축했다고 노조는 전했다. 노조는 사측에 사모펀드에 매각되면 모빌리티 사업이 성장할 수 있는 근거가 있느냐 고 물었지만 사측은 모빌리티 사업을 이어나갈 의지가 없다 는 입장을 되풀이했다고 노조는 지적했다. 이정대 카카오모빌리티 분회 스태프는 2대 주주가 된다고 해서 카카오모빌리리티의 성장성이 담보된다는 회사의 주장은 아이러니하다 고 비판의 목소리를 냈다. 서승욱 카카오노조 지회장은 카카오모빌리티와 카카오가 올바른 판단을 할 수 있도록 전 공동체 임직원들과 힘을 모으겠다 며 사회적 책임 조차 이행하지 않고 택시 대리운전 바이크 등 모빌리티 플랫폼을 정리하려는 카카오에 대해 많은 국민들이 관심을 계속 가져달라 고 말했다.\n", + "\n", + "### 답변: 카카오는 사측과의 긴급회동 열흘 만에 카카오모빌리티·카카오 판교 사옥 앞에서 매각에 반대하는 피켓 시위 기자회견을 열고 카카오모빌리티와의 단체교섭 등 노동조건 개선을 위한 후속 단체행동에 나서며 잠정 보류했던 카카오모빌리티 매각 반대 서명운동을 시작하겠다고 밝혔다.<|endoftext|>\n", + "52 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 디지털데일리 박세아 기자 위메이드가 블록체인 게임 플랫폼 위믹스 플레이 WEMIX PLAY 를 1일 글로벌 시장에 론칭했다. 위믹스 플레이는 오픈 블록체인 게임 플랫폼을 지향한다. 이용자는 가상자산으로 게임 관련 아이템을 구입하거나 대체불가능한 토큰 Non Fungible Token 이하 NFT 을 거래할 수 있다. 게임에서 번 자산을 게임에 재투자하는 플레이투언 Play Earn ’이 가능하다. 위믹스 플레이는 이용자 편의성을 극대화했다는 설명이다. 게임 허브 토큰 시가 총액 토큰 스왑 경매 스테이킹 프로그램 등 핵심 정보와 기능을 위믹스 플레이에서 모두 이용할 수 있다. 위메이드는 7월 중 리플렉트 코인 Reflect Coin 도 선보인다. 리플렉트는 위믹스 플레이에서 서비스하는 다양한 게임 중 리플렉트 얼라이언스에 포함된 여러 토큰들을 융합 Fusion 해 받을 수 있는 유틸리티 코인이다. 위메이드는 오늘 위믹스3.0 테스트넷도 론칭했다. 위믹스3.0은 위메이드가 자체 개발한 블록체인 메인넷이다. 위메이드는 메인넷 프로토콜을 테스트넷 환경으로 복사해 프로토콜 모든 잠재적 위협이나 허점을 발견하고 수정하기 위해 다양한 테스트를 진행한다. 테스트가 완료된 이후 메인넷을 오픈할 계획이다. 위메이드 장현국 대표는 게임은 블록체인과 암호화폐의 가장 핵심적인 유틸리티인데 위믹스 플레이는 오픈 블록체인 게임 플랫폼으로 자리잡을 것 이라며 오늘 테스트를 시작한 위믹스3.0 또한 완전히 개방된 서비스와 플랫폼을 중심으로 1등 메인넷으로 성장시켜 나갈 것 이라고 말했다. 위메이드는 스테이블코인 위믹스달러 탈중앙금융 서비스 ‘위믹스 디파이 서비스’ 탈중앙화 조직 DAO 프로젝트를 운영할 수 있는 플랫폼 ‘나일 NILE ’ 등을 3분기까지 순차적으로 공개할 예정이다.\n", + "\n", + "### 답변: 위메이드가 블록체인 게임 플랫폼을 지향하는 '위믹스 플레이 WEMIX PLAY'를 1일 글로벌 시장에 론칭하며 게임 관련 아이템을 구입하거나 대체불가능한 토큰 Non Fungible Token 이하 NFT 을 거래할 수 있다.<|endoftext|>\n", + "53 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 가계대출 1조4천억원↓…신용대출은 7개월째 줄고 주담대는 증가세 전환 가계대출 연합뉴스 자료사진 서울 연합뉴스 김유아 오주현 기자 국내 5대 시중은행의 가계대출 잔액이 6개월 연속 감소했지만 금리 상승으로 이들 은행의 예·적금 잔액은 늘어났다. 1일 KB국민·신한·하나·우리·NH농협 등 5대 시중은행에 따르면 이들 은행의 지난달 말 가계대출 잔액은 699조6천521억원으로 5월 말보다 1조4천94억원 줄었다. 600조원대 가계대출 잔액은 지난해 8월 698조8천149억원 이후 처음이다. 5대 시중은행의 가계대출 잔액은 올 1월부터 6개월째 감소세다. 이달 감소 폭은 전월 1조3천302억원 보다도 소폭 커졌다. 대출 종류별로 보면 지난달 말 주택담보대출 주담대 잔액은 506조7천714억원이다. 전월에는 5천245억원 줄었지만 한 달 새 991억원 늘며 증가세로 전환했다. 신용대출 잔액은 1조1천204억원 줄며 130조6천789억원을 기록했다. 신용대출은 지난해 12월 1조5천766억원 부터 7개월째 감소하고 있다. 감소 폭은 지난 3월 2조4천579억원 이후 4월 9천390억원 과 5월 6천613억원 을 거치며 축소되는 듯 했지만 지난달 다시 커졌다. 이는 최근 주식 가상화폐 시장이 하락세를 보이면서 빚투 대출 받아 투자 경향이 약해진 데 따른 것으로 풀이된다. 전세자금 대출 잔액은 4천479억원 늘어난 132조9천601억원이다. 5개월째 증가세다. 기업대출은 가계대출 흐름과 정반대로 지속해서 늘고 있다. 지난달 말 대기업 대출 잔액은 91조5천688억원에 달했고 중소기업 대출 잔액은 581조8천307억원을 기록했다. 수신 예금 현황을 보면 금리 상승에 따라 예·적금 모두 늘었다. 요구불예금 잔액은 6조3천512억원 늘어난 709조9천635억원 정기예금은 5조3천191억원 늘어난 685조959억원을 나타냈다. 또 수시입출금식 저축성예금 MMDA 잔액은 118조6천572억원 정기적금 잔액은 37조4천643억원으로 각각 3조1천240억원 7천46억원 불었다.\n", + "\n", + "### 답변: 1일 5대 시중은행에 따르면 이들 은행의 지난달 말 가계대출 잔액은 699조6천521억원으로 5월 말보다 1조4천94억원 줄었으나 금리 상승으로 이들 은행의 예·적금 잔액은 늘어났으며 가계대출 잔액은 올 1월부터 6개월째 감소세다.<|endoftext|>\n", + "54 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 피트니스 기기들은 자주 우리에게 1만 보 걷기를 권장합니다. 하지만 “1만 보”라는 목표는 과학에서 비롯됐다기보다는 우연과 역사에 따른 것이라 볼 수 있습니다. 하버드대의 교수이자 건강전문가인 아이민 리 I Min Lee 박사에 따르면 ‘만 보’는 1960년대 일본에서 인기를 끌기 시작했습니다. 그리고 1964년 도쿄올림픽 이후 높아진 피트니스에 대한 관심을 활용하고자 했던 한 시계 제작사가 만보계를 대량생산했죠. 이렇게 ‘만보계’가 자리 잡으면서 우리들의 머릿속에도 ‘만보’가 하나의 목표로 각인되게 됐습니다. 하지만 오늘날의 과학은 건강과 장수를 위해 하루에 1만보씩이나 걸을 필요는 없다고 말합니다. 2019년 리 박사와 동료들은 하루에 4400보 정도를 걸었던 70대 여성들이 하루에 2700보를 채 걷지 않은 여성들과 비교할 때 조기사망 위험을 40% 가량 줄인 것을 발견했습니다. 하루 5000보 이상 걷는 경우에도 조기사망 위험이 더 낮아졌지만 걸음을 더 걷는다고 사망위험률이 낮아진 것은 하루 7500보까지였습니다. “1만 보”라는 목표의 절반을 채 채우지 못해도 충분히 사망위험을 낮출 수 있다는 얘기인거죠. 현실적으로 어쨌든 만보란 목표를 달성하는 이도 거의 없죠. 최근 통계들에 따르면 미국 캐나다 그리고 주요 서구 국가들의 대부분의 성인들의 하루 평균 걸음 수는 5000보 미만입니다. 1만보란 목표를 달성해도 오래 지속되기란 쉽지 않습니다. 벨기에 겐트에서는 시민들에게 2005년 만보계를 제공하고 1년 동안 하루에 1만 보 이상 걷도록 권장했죠. 이 연구를 마친 660명 남녀 중 약 8%는 매일 1만 보라는 목표를 달성했습니다. 하지만 4년 후의 후속연구를 해보니 아무도 그렇게 하루 걸음수를 유지하고 있지 못했죠. 그들은 연구 전 애초의 걸음수로 다 되돌아가 있었습니다. 보통 정부들에서는 걸음 수보다는 시간을 가이드라인으로 제공하는데 일상생활의 일부로서 하는 운동을 더해 일주일에 적어도 150분 하루 30분 가량 운동할 것을 제안하고 있습니다. 걸음수로 환산하면 일주일에 1만6000보가 조금 넘고 하루 2000보에서 3000보 정도가 될 것이라고 이 박사는 말합니다. 만약 쇼핑이나 집안일 등 일상생활로 하루 한 5000보 정도를 걷는다면 2000보 3000보만 더해도 하루 7000보 8000보를 걷게 되는 것이고 이는 “딱 좋은” 걸음수가 됩니다.\n", + "\n", + "### 답변: '의1만 보'라는 목표는 과학에서 비롯됐다기보다는 우연과 역사에 따른 것으로 하루에 4400보 정도를 걸었던 70대 여성들이 하루에 2700보를 채 걷지 않은 여성들과 비교할 때 조기사망 위험을 40% 가량 줄인 것을 발견하며 더 나아가서 1만 보라는 목표의 절반을 채 채우지 못해도 충분히 사망위험을 낮출 수 있다.<|endoftext|>\n", + "55 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 中企 금리 상승 탓 금융비용 증가 자금난 대비 위한 지원책 검토 금융위원회. 금융위 제공 금융위원회가 금리·환율·물가 상승에 따라 경영·자금난이 가중되고 있는 중소기업에 대한 지원 방안을 논의했다. 금융위 취약부문 금융애로 대응 태스크포스 TF 는 6일 ‘중소기업 금융상황 점검회의’를 개최하고 최근 중소기업 경영 및 자금여건 등에 대해 의견을 나누었다. 금융감독원 중소기업중앙회 연구기관 및 정책금융기관이 이 자리에 참석해 중소기업의 현 상황을 점검했다. 취약부문 금융애로 대응 TF의 첫 회의가 지난달 23일 열린 이후 두 번째 회의가 열린 것이다. 이날 점검회의 결과 최근 중소기업 생산 및 평균 가동률은 양호한 수준을 유지하고 있는 것으로 파악됐다. 하지만 원자재 가격 상승으로 중소기업 채산성 악화가 우려되고 공급망 재편 등 불확실성 확대로 경영 여건이 녹록지 않다는 의견이 나왔다. 아울러 금융 여건 측면에서 중소기업의 대출 잔액 증가와 함께 최근의 금리 상승으로 인한 금융비용 증가가 경영상 부담으로 작용한다는 평가도 나왔다. 만기연장‧상환유예 조치 연장을 통해 중소기업이 상환부담이 줄어 연체율 및 부실채권비율은 낮은 수준을 유지하고 있는 것으로 나타났다. 또 은행 등 금융회사들은 1대 1 사전컨설팅 및 채무상환계획 조정을 통해 만기연장‧상환유예 대출이 연착륙될 수 있도록 조치하고 있어 급격한 연체율 확대 등 우려 역시 적은 상황이다. 금융당국은 중소기업이 복합 경제위기를 돌파하고 위기를 기회로 전환할 수 있도록 금융지원 역량을 강화할 방침이다. 금융위 관계자는 “중소기업의 경영상 부담을 완화하고 경쟁력을 높일 수 있도록 금융지원 방안을 검토하고 마련할 계획”이라고 말했다.\n", + "\n", + "### 답변: 금융원 중소기업중앙회 연구기관 및 정책금융기관은 금리·환율·물가 상승으로 경영·자금난이 가중되고 있는 중소기업에 대한 지원 방안으로 6일 ‘중소기업 금융상황 점검회의’를 개최하고 최근 중소기업 경영 및 자금여건 등에 대해 의견을 나누었다.<|endoftext|>\n", + "56 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 사진 오준오 오른쪽 보람그룹 대표이사가 ‘2022 소비자가 선정한 품질만족대상’ 시상식에서 수상 기념촬영을 하고 있다. 제공 보람그룹 상조서비스부문 총 2회 수상 쾌거 “토털 라이프케어 서비스로 고객 만족 실현할 것” 보람그룹 회장 최철홍 의 상조 브랜드 보람상조가 2022 소비자가 선정한 품질만족대상에서 상조서비스부문 대상을 수상했다. 지난 2020년에 이은 두 번째 수상이다. ‘소비자가 선정한 품질만족대상’은 소비자의 눈높이에서 고객 만족을 위해 양질의 서비스 품질을 구현하는 기업 및 기관을 선정 표창하는 시상식이다. 수상기업은 소비자 설문조사와 더불어 산학 전문가로 구성된 전문 심사위원단의 엄정한 심사로 결정된다. 시상식은 6월 30일 코리아나호텔에서 거행됐다. 1991년 설립돼 올해로 창립 32주년을 맞이한 보람상조는 최철홍 회장을 중심으로 ‘고객중심 나눔경영’을 이어나가고 있다. ‘가격정찰제 실시’를 비롯한 다양한 최초 시도로 업계를 선도하고 있으며 국가자격증 교육기관인 ‘보람장례지도사교육원’을 직영으로 운영하는 등 업계 선진화에도 힘쓰고 있다. 최철홍 보람그룹 회장은 “32년간 고객 만족을 위해 달려온 것에 대한 평가를 ‘소비자가 선정한 품질만족대상’으로 받게 돼 기쁘다”며 “앞으로도 토털 라이프 케어 서비스 기업으로서 고객만족을 실현하도록 최선의 노력을 다하겠다” 고 수상 소감을 밝혔다.\n", + "\n", + "### 답변: 창2 소비자가 선정한 품질만족대상에서 상조부문 대상을 수상한 최철홍 의 상조 브랜드 보람상조는 '가격정찰제 실시'를 비롯한 다양한 최초 시도로 업계를 선도하고 있으며 국가자격증 교육기관인 ‘보람장례지도사교육원’을 직영으로 운영하는 등 업계 선진화에도 힘쓰고 있다.<|endoftext|>\n", + "57 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 1998년 11월 이후 상승폭 최고…공업제품 9.3%↑ 현재 추세면 연간 상승률 5% 넘어… 하반기 불확실 © News1 김초희 디자이너 세종 뉴스1 이철 기자 한종수 기자 김혜지 기자 6월 소비자물가가 1년 전보다 6.0% 오르면서 1998년 외환위기 후 약 24년 만에 가장 큰 상승폭을 기록했다. 국제유가와 곡물가격 등 각종 원자재 가격 상승에 따라 경유가 50.7% 수입쇠고기가 27.2% 급등했다. 특히 체감 물가를 나타내는 생활물가지수가 7.4% 크게 오르면서 23년7개월 만에 가장 높은 상승률을 기록해 실제 민생난을 보여줬다. 통계청이 5일 펴낸 2022년 6월 소비자물가동향 에 따르면 지난달 소비자물가지수는 108.22 2020 100 으로 지난해 같은 달과 비교해 6.0% 상승했다. 상승폭이 전월인 5월 5.4% 보다 0.6%포인트 p 확대됐다. 이는 국제통화기금 IMF 외환위기 직후인 1998년 11월 6.8% 이후 23년7개월 만에 가장 높은 상승률이다. 6월 물가는 석유류를 포함한 공업제품과 외식 등 개인서비스 전기·수도·가스 농축수산물이 모두 상승했다. 특히 공업제품이 9.3% 오르면서 2008년 9월 9.3% 이후 가장 높은 상승세를 보였다. 구체적으론 Δ경유 50.7% Δ휘발유 31.4% Δ등유 72.1% Δ자동차용LPG 29.1% 등 유가 급등세가 가팔랐다. 농축수산물은 1년 전보다 4.8% 상승한 가운데 Δ돼지고기 18.6% Δ수입쇠고기 27.2% Δ포도 31.4% Δ배추 35.5% Δ닭고기 20.1% Δ감자 37.8% 등이 크게 올랐다. 전기·가스·수도는 9.6% 급등했는데 이에 포함된 전기료 11.0% 도시가스 11.0% 상수도료 3.7% 등 공공요금 상승률도 컸다. 서비스 물가는 1년 전에 비해 3.9% 상승했다. 특히 외식이 1992년 10월 8.8% 이후 최대 상승률인 8.0%에 달했다. 어운선 통계청 경제동향통계심의관은 석유류 등 공업제품과 개인서비스 가격이 높은 오름세를 지속하고 농축산물 오름 폭이 확대됐다 면서 1998년 11월은 외환위기 이후 구제금융을 신청해 환율이 급등하면서 원자재 가격이 상승한 시기 라고 말했다. 역대 월별 소비자물가 상승률 추이를 보면 작년 10월 3.2% 9년8개월 만에 3%대로 올라선 뒤 11월 3.8% 12월 3.7% 올해 1월 3.6% 2월 3.7% 까지 5개월 연속 3%대를 보이다가 3월 4.1% 과 4월 4.8% 에 4%선을 돌파했다. 이어서 5월 5.4% 에 5%대 상승률을 기록했는데 이는 글로벌 금융위기 당시인 2008년 9월 이후 13년8개월 만에 처음 있는 일이었다. 이번에 6% 선에 다다르면서 IMF 외환위기 수준으로 악화한 것이다. 6월 소비자물가 동향. 통계청 제공 © 뉴스1 물가의 기조적 흐름을 보여주는 근원물가 농산물 및 석유류 제외지수 는 4.4% 올라 2009년 3월 4.5% 이후 가장 크게 뛰었다. 식료품 및 에너지 제외지수도 3.9% 올라 2009년 2월 4.0% 이후 최대 상승폭을 나타냈다. 체감 물가를 나타내는 생활물가지수는 1년 전보다 7.4% 오르면서 1998년 11월 10.4% 이후 23년7개월 만에 가장 급격하게 치솟았다. 계절 요인이나 일시적 충격에 의한 변동을 배제한 식료품 및 에너지제외지수는 2009년 4월 4.0% 이후 13년2개월 만에 가장 높은 상승 폭인 3.9%를 기록했다. 어 심의관은 큰 흐름에서 석유류 등 공업제품과 개인서비스가 물가상승을 주도하는 것은 변함없다 며 특히 석유류의 상승 기여도가 줄어들고 있지 않다는 것이 눈에 띈다 고 분석했다. 이어 개인서비스의 물가상승폭은 조금씩 늘어나는 경향이다. 다만 코로나19 이후 소비가 회복되면서 개인서비스 가격이 오르는 것은 누구나 예상할 수 있었기 때문에 특이하게 보이지는 않는다 며 오히려 개인서비스에 국제 에너지 비용 상승 곡물가격 상승 효과가 반영됐다고 보이기 때문에 여전히 대외적인 공급측면의 물가 상승 요인들이 빨리 완화돼야 한다는 생각을 한다 고 분석했다. 그러면서 하반기는 불확실하다. 석유류의 오름세 둔화 시각도 있긴 한데 지켜봐야 한다 며 7월부터 현재와 같은 수치면 연간으로 5%를 넘게 된다 고 전망했다.\n", + "\n", + "### 답변: 통계청이 5일 펴낸 2022년 6월 소비자물가동향에 따르면 지난달 소비자물가지수는 108.22 2020 으로 지난해 같은 달과 비교해 6.0% 상승했으며, 이는 국제유가와 곡물가격 등 각종 원자재 가격 상승에 따른 것으로 각종 원자재 가격 상승에 따라 경유가 50.7% 수입쇠고기가 27.2% 급등하면서 1998년 외환위기 후 약 24년 만에 가장 큰 상승폭을 기록했다.<|endoftext|>\n", + "58 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 한 멕시코 비즈니스라운드테이블 개최 삼성전자 SK 현대차 포스코 등 주요 진출기업 참석 마르셀로 에브라르드 멕시코 외교장관. ⓒ대한상공회의소 데일리안 박영국 기자 대한상공회의소는 5일 한 멕시코 수교 60주년을 기념해 방한한 마르셀로 에브라르드 멕시코 외교장관을 초청해 ‘한 멕시코 비즈니스 라운드테이블’을 개최했다고 밝혔다. 이날 행사에는 우태희 대한상의 상근부회장 김유석 SK온 부사장 이상직 삼성전자 멕시코 법인장 김경수 현대차 상무 허순재 LG전자 상무 유삼 포스코 상무 삼성엔지니어링 로버트 윤 부사장 박현철 위니아전자 대표이사 이성우 대한상의 국제통상본부장 등 국내 주요 그룹 임원 10여명이 참석해 현지 진출기업들의 애로사항을 멕시코 정부에 건의하고 지원방안을 제안했다. 멕시코 측에서는 마르셀로 에브라르드 외교장관을 비롯해 카르멘 모레노 토스카노 외교차관 브루노 피게로아 주한멕시코대사 하비에르 다비야 협력정책실장 등 정부 고위급 인사들과 핀테크·이커머스 스타트업 기업인 등 약 20명이 참석했으며 공급망 및 그린비즈니스 협력 투자확대 등 향후 협력과제도 논의했다. 대한상의는 엑스포 주무부처인 멕시코 외교부에 ‘2030 월드 엑스포’를 부산이 유치할 수 있도록 적극적인 지지를 요청하기도 했다. 에브라르드 장관은 멕시코시티 시장 외교부차관 등을 거치며 오랜 기간 정치에 몸담아 온 인물로 멕시코 외교 및 국제 업무를 총괄하고 있으며 평소에도 투자 통상 등 경제이슈에 관심이 많아 이번 방한 시에도 한국기업들을 만나고 싶다는 의향을 적극 내비친 것으로 알려졌다. 회의를 주재한 우태희 대한상의 상근부회장은 축사를 통해 “삼성전자 SK 현대차 LG전자 포스코 삼성엔지니어링 위니아전자 등 주요기업들을 필두로 현재 약 450여개의 우리 기업이 멕시코에 진출 15만여개의 일자리 창출에 기여했으며 대 멕시코 투자액 아시아 2위라는 성과를 거뒀다”면서 “코로나 이후 글로벌 경제환경이 급변하고 있는 가운데 공급망 기후변화 대응 등 양국 간 새로운 협력기반을 확대해 나가길 바란다”고 말했다. 이날 회의에서 우리 기업들은 현지 생산공장 설립·운영 등 현재까지의 멕시코 투자현황 관련한 애로사항 관련 건의와 함께 일자리창출 등의 진출성과를 발표하고 양국 기업 간 미래지향적 협력을 위한 의견을 제시하는 등 구체적 경제협력 확대방안에 대해 논의했다. 이성우 대한상의 국제본부장은 “멕시코는 북미와 남미를 이어주는 전략적 요충지로 최근 14년간 중단되었던 한 멕시코 자유무역협정 FTA 협상이 재개되는 등 양국간 경제협력에 훈풍이 불고 있다”며 “공급망이 요즘 최대 이슈인 만큼 관련 협력을 강화하고 우리 기업들이 더 활발히 진출해 활동할 수 있도록 지속적으로 노력하겠다”고 말했다.\n", + "\n", + "### 답변: 대한상공회의소는 5일 한 멕시코 수교 60주년을 기념해 국내 주요 그룹 임원 10여명이 방한한 마르셀로 에브라르드 멕시코 외교장관을 초청해 ‘한 멕시코 비즈니스 라운드테이블’을 개최했다고 밝혔으며 멕시코 측에서는 마르셀로 에브라르드 외교장관을 비롯해 정부 고위급 인사들과 핀테크·이커머스 스타트업 기업인 등 약 20명이 참석했으며 공급망 및 그린비즈니스 협력 투자확대 등 향후 협력과제도 논의했다.<|endoftext|>\n", + "59 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 디지털데일리 변재영 기자 링컨코리아는 올해 브랜드 창립 100주년을 맞이해 오는 2일부터 10일까지 서울 강남 신세계 센트럴시티 내 오픈스테이지에서 ‘링컨 센테니얼 라운지’ 전시 행사를 진행한다고 1일 밝혔다. 링컨 센테니얼 라운지에서는 링컨 SUV의 전 라인업이 전시됐다. 전시모델은 네비게이터 에비에이터 노틸러스 코세어 등 4종이다. 아울러 링컨 100주년 기념 및 전동화 콘셉트카인 ‘링컨 스타’ 소개 영상 링컨 100년 역사를 테마로 한 다양한 헤리티지 콘텐츠를 멀티미디어 형식으로 전달할 예정이다. 현장 모습은 추후 링컨 홈페이지에 오픈되는 360도 버추얼 투어를 통해서 공개된다.\n", + "\n", + "### 답변: 링컨코리아는 올해 브랜드 창립 100주년을 맞이해 오는 2일부터 10일까지 서울 강남 신세계 센트럴시티 내 오픈스테이지에서 ‘링컨 센테니얼 라운지’ 전시 행사를 진행한다고 1일 밝혔으며 링컨 센테니얼 라운지에서는 링컨 SUV의 전 라인업이 전시됐고 아울러 링컨 100주년 기념 및 전동화 콘셉트카인 ‘링컨 스타’ 소개 영상 링컨 100년 역사를 테마로 한 다양한 헤리티지 콘텐츠를 멀티미디어 형식으로 전달할 예정이다.<|endoftext|>\n", + "60 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 현대건설과 삼성엔지니어링이 사우디아라비아 국영 석유기업 아람코에서 추진하는 건설 설계·조달·시공 EPC 파트너 기업에 최종 선정돼 향후 아람코에서 발주하는 석유·화학 관련 신사업들에 대한 수의계약과 입찰 인센티브를 받는 본 협약을 체결했다고 6일 밝혔다.\n", + "\n", + "### 답변: 현대건설과 삼성엔지니어링이 6일 현대건설과 삼성엔지니어링이 사우디아라비아 국영 석유기업 아람코에서 추진하는 건설 설계·조달·시공 EPC 파트너 기업에 최종 선정돼 향후 아람코에서 발주하는 석유·화학 관련 신사업들에 대한 수의계약과 입찰 인센티브를 받는 본 협약을 체결했다고 밝혔다.<|endoftext|>\n", + "61 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 1000만원 이상의 지방세를 체납한 고액·상습체납자가 해외여행 중에 고가의 명품을 구입하거나 해외 직구로 물품을 구매하면 세관에서 바로 압류됩니다. 서울시는 지방세징수법 개정에 따라 지방세 고액·상습체납자가 수입하는 물품에 대한 체납처분을 지난 1일 관세청에 위탁했다고 4일 밝혔습니다. 그동안 국세 체납자의 경우 수입물품 압류가 가능했지만 지방세 체납자에 대한 압류 처분은 올해 새롭게 실시됩니다. 지난해 1월 고액·상습체납자의 수입물품에 대한 체납처분을 세관장에게 위탁할 수 있는 법적 근거가 마련됨에 따른 것입니다. 시가 고액·상습체납자의 체납처분을 관세청에 위탁하면 관세청에서 고액체납자가 입국시 휴대한 고가품의 경우 현장에서 압류처리하고 해외직구로 산 수입품 등은 통관을 보류하고 압류해 체납액을 징수하게 됩니다. 압류 대상은 △체납자가 입국할 때 직접 휴대 또는 소지해 수입하는 물품 휴대품 △인터넷 등을 통해 해외에서 직접 구매한 후 배송업체를 통해 수입하는 물품 특송품 △무역계약 체결 등을 통한 일반적인 형태의 수입물품 일반수입품 등입니다. 시가 위탁 의뢰한 체납자는 지난해 신규 명단공개자로 시와 25개 자치구에서 관리되고 있는 지방세 체납액 1000만 원 이상인 고액·상습체납자입니다. 총 1127명이며 이들이 체납한 총 체납액은 712억원에 달합니다.\n", + "\n", + "### 답변: 서울시는 지방세징수법 개정에 따라 그동안 국세 체납자의 경우 수입물품 압류가 가능했지만 지방세 체납자에 대한 압류 처분은 올해 새롭게 실시되는데 지난해 1월 고액·상습체납자의 수입물품에 대한 체납처분을 세관장에게 위탁할 수 있는 법적 근거가 마련됨에 따라 고액의 지방세를 체납한 고액·상습체납자가 해외여행 중에 고가의 명품을 구입하거나 해외 직구로 물품을 구매하면 세관에서 바로 압류된다.<|endoftext|>\n", + "62 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 전기와 가스요금이 오늘 1일 부로 동시에 인상됐습니다. 전기요금에 적용되는 연료비 조정단가가 킬로와트당 5원 인상되면서 4인 가구 전기요금은 월 평균 1 535원 늘어날 것으로 추산됩니다. 도시가스 요금도 올라 4인 가구 가스요금은 서울시 기준으로 월 평균 2 220원 오릅니다. 전기차 충전요금의 경우 특례할인 제도가 어제 종료되면서 인상된 것이나 다름 없게 됐습니다. 오는 10월 전기요금과 가스요금이 다시 한번 동시에 오를 예정이라 가계 부담은 더 커질 것으로 전망됩니다.\n", + "\n", + "### 답변: 오늘 1일 부로 동시에 전기와 가스요금이 동시에 동시에 인상되어 4인 가구 전기요금은 월 평균 1 535원 늘어날 것으로 추산되고 도시가스 요금도 올라 4인 가구 가스요금은 서울시 기준으로 월 평균 2 220원 오르게 됐다.<|endoftext|>\n", + "63 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 양로원·도서관 등에 서비스·방역 로봇 기부 KT가 사회적 관계망 서비스 SNS 인스타그램 릴스를 활용한 KT AI D 에이드 캠페인 을 진행한다고 4일 밝혔다. KT 제공 © 뉴스1 서울 뉴스1 윤지원 기자 KT가 사회관계망서비스 SNS 인스타그램 릴스를 활용한 KT 에이드 AI D 캠페인 을 진행한다고 4일 밝혔다. 누구나 참여 가능한 이번 캠페인은 KT의 인공지능 AI 기술로 세상을 돕는다 는 사회적 의미를 담아 진행된다. KT는 오는 31일까지 SNS 인스타그램 릴스 콘텐츠 1000개 이상이 모이면 양로원이나 공공 어린이 도서관 등에 KT의 AI 서비스로봇 과 AI 방역로봇 을 제공할 예정이다. KT 인스타그램 공식 계정에 공개된 증강현실 AR 필터를 활용해 집 사무실 등 어디서든 인스타그램 릴스 영상을 찍어 업로드 하면 된다. 릴스 업로드 시 KT에이드 · 서비스로봇 · 방역로봇 등 필수 해시태그를 함께 게재하면 된다. 이번 캠페인을 통해 이용자들은 AR 필터를 통해 선물을 전달해주는 AI 서비스로봇과 바이러스 제로 공간을 만드는 AI 방역로봇 기능을 간접 체험할 수 있다. KT는 참여자를 대상으로 선착순 777명에게 기프티콘을 제공할 예정이다. 아울러 댓글이 가장 많거나 좋아요 를 많이 받은 참여자들에게는 경품을 제공한다. 배철기 KT AI·DX사업전략담당 상무는 이번 AI D 캠페인은 고객이 KT AI 로봇을 재미와 함께 간접적으로나마 체험해볼 수 있는 기회를 제공하기 위해 기획했다 며 KT는 참여형 콘텐츠를 통해 KT의 디지코 서비스를 경험하면서도 사회적으로 의미 있는 활동에 동참할 수 있는 캠페인을 지속할 예정이다 라고 밝혔다.\n", + "\n", + "### 답변: KT가 사회관계망서비스 SNS 인스타그램 릴스를 활용해 누구나 참여 가능한 KT의 인공지능 AI 기술로 세상을 돕는다는 사회적 의미를 담아 진행한 'KT AI D 캠페인'을 통해 이용자들은 AI 서비스로봇과 바이러스 제로 공간을 만드는 AI 방역로봇 기능을 간접 체험할 수 있다.<|endoftext|>\n", + "64 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 강민지 기자 7일 오후 서울 종로구 연합뉴스 사옥에서 열린 연합뉴스 세계한류학회 업무협약식에서 성기홍 연합뉴스 사장과 문시연 세계한류학회 회장이 협약서를 들고 있다.\n", + "\n", + "### 답변: 7일 오후 서울 종로구 연합뉴스 사옥에서 열린 세계한류학회 업무협약식에서 세계한류학회 회장이 협약서를 들고 세계한류학회 업무협약식을 진행했다.<|endoftext|>\n", + "65 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: CJ ENM 스튜디오 센터 르포 파주에 최첨단 ‘콘테크’ 전진기지 버추얼 프로덕션 스테이지 압권 벽면·천장까지 대형 LED 스크린 환상적인 배경 CG로 구현 가능 스크린·세트장 유기적 연결 탄성 5일 처음 공개된 경기 파주 CJ ENM 스튜디오 센터 내 ‘버추얼 프로덕션 스테이지’에서 제작진이 천장과 벽면을 360도로 둘러싼 메인 LED월에 펼쳐진 설산을 배경으로 자동차를 촬영하고 있다.CJ ENM 제공 차디찬 바람이 불어오는 웅장한 설산이 거대한 타원형 스크린에 펼쳐졌다. 스크린 앞 세트장에 올라선 배우를 촬영하니 정말 그가 설산의 품에 안긴 듯한 영상이 모니터에 출력됐다. 이윽고 스크린은 아름다운 노을이 드리운 해변가로 검붉은 낙엽이 흐트러진 숲속으로 엠파이어스테이트빌딩이 내려다보이는 미국 뉴욕으로 어느 소도시의 낭만적인 밤거리로 계속 전환됐다. 그때마다 영상 속 배우도 각각의 공간에 실제로 가 있는 것처럼 다채롭게 녹아들어 갔다. 5일 기자가 찾은 경기 파주 CJ ENM의 스튜디오 센터는 국내 최대 규모인 약 6만 4000평 21만 1570㎡ 의 문화 콘텐츠와 최첨단 기술이 융합된 ‘콘테크’ 콘텐츠 기술 전진 기지로 구성돼 있었다. 특히 높은 해상도의 삼성전자 마이크로 발광다이오드 LED ‘더 월’을 심은 ‘버추얼 프로덕션 VP 스테이지’ 500평·1652㎡ 는 콘테크의 집약체였다. VP 스테이지의 가장 큰 특징은 지름 20m 높이 7.3m의 말굽형 구조로 이뤄진 ‘메인 LED월’이다. 벽면 360도와 천장까지 모두 대형 LED 스크린으로 채워진 이 공간은 다양한 배경 영상을 틀어 촬영할 수 있다. 사막 영상을 띄운 LED월 앞에 모래와 바위 등을 가져다 놓으면 배우들이 실제로 황막한 사막을 거니는 듯한 영상을 찍을 수 있다. 막대한 비용과 시간이 소요되는 해외 로케이션을 갈 필요가 없어 제작비를 줄일 수 있고 촬영이 힘든 공간을 구현하고 싶을 때도 효율을 극대화할 수 있다. 5일 처음 공개된 경기 파주 CJ ENM 스튜디오 센터 내 ‘버추얼 프로덕션 스테이지’에서 울창한 숲속을 배경으로 연기하는 배우를 촬영하는 모습.CJ ENM 제공 현실에 존재하지 않는 환상적인 배경도 컴퓨터그래픽 CG 으로 구현할 수 있다. 마블 시네마틱 유니버스 MCU 시리즈 등 화려한 CG로 이뤄진 영화를 찍을 땐 아무것도 없는 합성용 녹색 스크린 앞에서 배우들이 연기하는 것이 일반적이다. 하지만 메인 LED월에 CG 배경을 띄우면 배우들도 더욱 몰입감 있게 연기할 수 있게 된다. MobileAdNew center 기자가 직접 VP 스테이지에 들어가서 확인해 보니 촬영된 영상이 배경과 이질감 없이 매우 실감나게 느껴졌다. 단순히 배경만 띄워 놓는 것이 아니라 배경 속 사물이 카메라 촬영 각도에 따라 달라지는 등 스크린과 세트장이 유기적으로 연결되는 모습도 인상적이었다. VP 스테이지엔 메인 LED월 외에 길이 20m 높이 3.6m의 ‘일자형 월’도 마련돼 있어 다양한 형태의 영상 촬영이 가능했다. CJ ENM VP 스테이지에서 밤거리를 배경으로 촬영하고 있다. CJ ENM 제공 이국적인 밤거리를 배경으로 촬영한 결과물. 배경과 배우 세트장이 자연스럽게 녹아들어 있다. CJ ENM은 앞으로 드라마와 영화는 물론 예능 공연 등 다양한 콘텐츠를 찍을 때 VP 스테이지를 활용한다. 특히 가상현실 VR ·증강현실 AR ·확장현실 XR 과 메타버스 등의 첨단 기술을 접목한 콘텐츠 제작도 가능하다. 서정필 CJ ENM 테크 아트 사업부장은 “글로벌 무대에서 신드롬을 일으킬 K콘텐츠 탄생의 메카로 만들겠다”고 말했다.\n", + "\n", + "### 답변: 경기 최대 규모의 문화 콘텐츠와 최첨단 기술이 융합된 콘테크 콘텐츠 전진 기지로 구성된 경기 파주 CJ ENM의 스튜디오 센터는 대형 LED 스크린으로 채워진 공간은 다양한 배경 영상을 틀어 촬영할 수 있고, 막대한 비용과 시간이 소요되는 해외 로케이션을 갈 필요가 없어 제작비를 줄일 수 있는 등 효율을 극대화 할 수 있는 것으로 알려졌다.<|endoftext|>\n", + "66 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 금리인상 우려에 매물적체 영향…매수심리도 갈수록 위축 노원·강북·강동 등 하락폭 확대…인천·수원도 찬바람 서울 남산에서 바라본 아파트단지. © News1 박세연 기자 서울 뉴스1 박승주 기자 서울 집값이 5주 연속 하락하고 외곽지역을 위주로 낙폭도 커진다. 매물은 늘어나는 추세지만 잇따른 금리인상 등의 영향으로 매수심리는 점점 위축된다. 서울을 포함한 수도권 전체에서 찬바람이 불고 있다. 2일 한국부동산원에 따르면 이번주 서울 아파트값 변동률은 지난주와 같은 0.03%를 기록했다. 서울 아파트값은 5월 다섯째주 0.01%로 하락 전환한 뒤 6월 첫째주 0.01% 둘째주 0.02% 셋째주 0.03% 이번주 0.03% 등 하락폭이 느는 추세다. 추가 금리인상 우려와 매물 적체 영향 등으로 관망세가 계속됐다. 부동산 빅데이터 업체 아실의 통계를 보면 6월말 기준 아파트 매물은 6만4977건으로 지난달 10일 5만6568건 양도소득세 중과 한시 배제 조치 시행 이후 14.8% 늘었다. 그러나 서울 아파트 거래는 가뭄 상태고 아파트 매수 심리도 8주째 하락하고 있다. 서울 아파트 매매수급지수는 87.0로 지난주 88.1 보다 1.1포인트 하락했다. 수급지수는 0 100사이면 매도세가 100 200사이면 매수세가 더 크다는 의미다. 서울 25개 자치구 중 서초구 0.02% 만 올랐고 3개 구는 보합 나머지 21개 구는 하락을 기록했다. 특히 노도강 노원·도봉·강북 등 외곽지역이 하락폭을 키웠다. 강북구와 노원구는 각각 지난주 0.05%에서 이번주 0.07%를 기록했다. 동대문구와 서대문구도 각각 0.05%를 나타냈다. 강남4구에서는 서초구의 강세가 이어졌고 강남구는 4주째 보합을 기록했다. 다만 송파구 0.02% 는 마천·석촌동 중저가 위주로 하락했고 강동구 0.04% 도 내렸다. 경기 수원시내 아파트 단지 모습. © News1 조태형 기자 특히 수도권은 거래 침체가 길어지면서 가격 하락 지역이 늘고 있다. 2기 신도시의 내림세가 지속됐고 인천 수원 등 입주물량이 집중된 지역은 약세를 나타냈다. 인천은 0.06%에서 0.08%로 낙폭이 커졌다. 연수구의 경우 지난해 상승 피로감이 있는 옥련·송도동 위주로 하락하며 일주일새 0.23% 하락했다. 경기도 0.04%에서 0.05%로 내림폭이 확대됐다. 전셋값 하락 영향이 있는 수원 영통구 0.18% 권선구 0.13% 양주시 0.05% 등에서 하락폭이 늘어났다. 민간 통계인 부동산R114 조사에서도 신도시는 0.03% 내렸고 경기·인천은 0.05% 하락하면서 두 지역 모두 지난주 대비 낙폭이 늘었다. 인천은 용현동 SK스카이뷰 중산동 신명스카이뷰주얼리 송도동 송도더샵센트럴시티 등 대단지에서 1000만 2000만원 내렸다. 수원은 세류동 수원역센트럴어반시티 수원역해모로 등이 1000만 2 000만원 하락했다. 평택은 청북읍 사랑으로부영1차 평택청북지구EGthe1이 1000만원가량 내렸다. 수도권의 하락세는 당분간 이어질 것이란 관측이다. 국토교통부는 주거정책심의위원회를 열고 미분양이 누적되고 집값 하락세를 보인 17개 시군구에 대한 규제지역 해제를 결정했다. 다만 수도권의 경우 여전히 상승세인 지역이 있고 미분양이 많지 않다는 이유 등으로 규제지역 지정이 유지됐다. 여경희 부동산R114 수석연구원은 금리 추가 인상 경기 불확실성 계절적 비수기 등으로 매수심리가 풀리기 어려운 상황 이라며 거래시장의 부진한 흐름은 한동안 계속될 전망 이라고 밝혔다.\n", + "\n", + "### 답변: 서울물가지난주 집값이 5주 연속 하락하고 외곽지역을 위주로 낙폭도 커지는데 매물은 늘어나는 추세지만 잇따른 금리인상 등의 영향으로 매수심리는 점점 위축되어 서울을 포함한 수도권 전체에서 찬바람이 불고 있다고 2일 한국부동산원에 따르면 이번주 서울 아파트값 변동률은 지난주와 같은 0.03%를 기록했다.<|endoftext|>\n", + "67 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 디지털데일리 변재영 기자 신한금융투자는 가산 데이터센터 개발사업 관련 PF대출 단독주관에 성공했다고 7일 밝혔다. 가산 데이터센터 개발사업은 금천구 가산동에 지하 5층 지상 10층 규모의 데이터센터를 개발하는 사업이다. 신한금융투자 주관 사업을 시행하는 가산아이윌의 조달 금액은 총 3700억원이다. 케이티에서 분사한 케이티클라우드가 마스터리스 Master Lease 할 예정이며 시공은 DL건설과 케이티가 공동으로 맡는다. 이번 개발로 서울 서남부권의 신축 데이터센터가 완성된다. 가산 데이터센터는 서울 전역의 글로벌IT업체 및 대기업 등 다양한 고객군을 대상으로 트래픽 수요에 즉시 대응할 수 있는 데이터센터가 될 것으로 평가된다.\n", + "\n", + "### 답변: 신한금융투자는 금천구 가산동에 지하 5층 지상 10층 규모의 데이터센터를 개발하는 가산 데이터센터 개발사업 관련 PF대출 단독주관에 성공했다고 7일 밝혔으며 이를 통해 서울 전역의 글로벌IT업체 및 대기업 등 다양한 고객군을 대상으로 트래픽 수요에 즉시 대응할 수 있는 데이터센터가 될 것으로 평가된다.<|endoftext|>\n", + "68 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 포스코홀딩스 포스코홀딩스 제공. 재판매 및 DB 금지 서울 연합뉴스 박상돈 기자 포스코홀딩스는 최근 테라사이언스와 실리콘음극재 생산기술을 보유한 테라테크노스 지분 100%를 인수하는 계약을 체결했다고 5일 밝혔다. 테라테크노스는 2017년 설립된 실리콘음극재 스타트업으로 열전달이 우수한 고온 액상 방식의 생산 기술을 보유하고 있다. 포스코홀딩스는 실리콘음극재는 현재 리튬이온전지에 대부분 사용되고 있는 흑연음극재보다 에너지 밀도를 4배 정도 높일 수 있어 전기차 주행거리 향상은 물론 충전 시간도 단축할 수 있는 차세대 음극재 라고 소개했다. 포스코홀딩스는 테라테크노스 인수 후 연내 증설을 시작해 2024년 상반기 제품을 양산·판매할 계획이다. 포스코그룹은 리튬과 니켈 등 원료부터 양극재까지 이차전지소재 공급망 가치사슬을 구축한 데 이어 이번 테라테크노스 인수로 음극재 분야에서도 포트폴리오를 확대해 향후 이차전지소재 분야의 높은 중국 의존도를 낮출 수 있을 것으로 기대했다.\n", + "\n", + "### 답변: 포스코홀딩스는 고온 액상 방식의 생산 기술을 보유한 실리콘음극재 스타트업으로 열전달이 우수한 고온 액상 방식의 생산 기술을 보유하고 있는 테라사이언스와 생산기술을 보유한 테라테크노스 지분 100%를 인수하는 계약을 체결했다고 5일 밝혔다.<|endoftext|>\n", + "69 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 인천공항 뉴스1 유승관 기자 수학계의 노벨상 으로 불리는 필즈상을 수상한 허준이 미국 프린스턴대학교 교수 한국 고등과학원 석학교수 가 8일 인천국제공항을 통해 귀국하고 있다. 필즈상 Fields Medal 은 국제수학연맹 IMU 이 4년마다 개최하는 세계수학자대회 ICM 에서 만 40세 미만의 수학자에게 수여하는 수학계 최고의 상이다.\n", + "\n", + "### 답변: 8계의 노벨상이라 불리며 수학계의 노벨상 으로 불리는 필즈상을 수상한 허준이 미국 프린스턴대학교 교수 한국 고등과학원 석학교수가 8일 인천국제공항을 통해 귀국하였으며 필즈상 Fields Medal은 국제수학연맹 IMU 이 4년마다 개최하는 세계수학자대회 ICM 에서 만 40세 미만의 수학자에게 수여하는 수학계 최고의 상이고 필즈상을 수상한 허준이 미국 프린스턴대학교 교수 한국 고등과학원 석학교수 가 8일 인천국제공항을 통해 귀국하고 있다.<|endoftext|>\n", + "70 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 가와사키 AP 뉴시스 일본 스바루 자동차가 만든 수출용 승용차들이 지난 9월7일 도쿄 부근 가와사키항에서 선적을 위해 야적장에 도열해 있다. 2021.10.08 서울 뉴시스 이재준 기자 2022년 1 6월 일본 국내 신차 판매량은 208만대로 전년 동기 대비 15%나 줄었다고 닛케이 신문 등이 1일 보도했다. 매체는 이날 일본자동차판매협회 연합회와 전국경자동차협회 연합회가 정리한 통계를 인용해 이같이 전하며 동일본 대지진이 있던 2011년 상반기 191만9000대 이래 11년 만에 적은 수준이라고 지적했다. 반도체 부족과 중국 상하이 등 봉쇄 여파로 일본에서 자동차 생산이 지체되면서 올해 상반기 신차 판매가 코로나19 확대로 외출자제에 따른 영향이 컸던 2020년 상반기 220만대까지 밑돌았다. 내역을 보면 배기량 660cc 이상 등록차가 지난해 같은 기간보다 16% 감소한 128만5760대에 그쳤다. 경자동차도 작년 동기에 비해 15% 줄어든 80만418대에 머물렀다. 승용차 브랜드별로는 도요타 자동차 렉서스 제외 가 19% 감소한 63만8050대 SUBARU도 21% 크게 준 4만6008대로 주저앉았다. 6월 한달간 신차 판매 대수는 경자동차를 포함해 전년 동월 대비 10% 줄어든 32만7896대로 떨어졌다. 2021년 7월 이래 12개월 연속 전년 동월 실적을 밑돌았다. 등록차는 16% 적은 19만7530대로 1968년 관련 통계 시작 이래 6월로는 최저를 기록했다. 경자동차는 0.4% 감소한 13만366대다. 중국 록다운에 따른 일본공장에서 감산 때문에 도요타의 일본 판매량이 25% 다이하쓰 공업도 18% 각각 줄었다.\n", + "\n", + "### 답변: 닛 닛케이 신문은 일본자동차판매협회 연합회와 전국경자동차협회 연합회가 정리한 통계를 인용해 동일본 대지진이 있던 2011년 상반기 191만9000대 이래 11년 만에 일본 6월 일본 국내 신차 판매량은 208만대로 전년 동기 대비 15%나 줄었다고 1일 보도하며 일본 국내 신차 판매량은 208만대로 전년 동기 대비 15%나 줄었다고 전했다.<|endoftext|>\n", + "71 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 중소벤처기업진흥공단 제공 파이낸셜뉴스 중소벤처기업진흥공단은 제조 소기업 경쟁력 제고를 위한 2022년 중소기업 혁신바우처 사업 2차 참여기업을 모집한다고 4일 밝혔다. 중소기업 혁신바우처는 컨설팅 기술지원 마케팅 서비스를 맞춤형 패키지 형태로 제공해 제조 중소기업의 경영 혁신을 지원하는 사업이다. 지원대상은 3개년 평균 매출액 120억원 이하 제조 소기업 중 지역별 개별사업공고상 참여 요건에 해당하는 기업이다. 올해 1차 공고에선 총 498억원 규모로 일반 및 재기컨설팅 탄소중립 경영혁신 바우처를 지원했다. 이번 2차 모집에는 기업 특성별 맞춤형 지원을 위해 고도화 서비스 바우처 20억원 와 지역단위 자율형 바우처 100억원 를 신설해 총 120억원을 지원할 계획이다. 구체적으로 고도화 서비스 바우처는 2020년 2021년 혁신바우처 사업을 통해 시제품 제작 프로그램에 참여 완료한 기업을 대상으로 한다. 전문가가 현장진단을 바탕으로 맞춤형 프로그램을 추천해 서비스 고도화 및 기업 사업화 역량 강화를 뒷받침할 계획이다. 선정기업에게는 매출 규모에 따라 최대 5000만원 한도로 바우처 발급 금액의 50 90%를 차등 지원한다. 지역단위 자율형 바우처는 지역별 육성 필요산업과 경제현안 등을 고려해 13개 지방중소벤처기업청이 자율적으로 프로그램을 설계·지원한다. 지역산업 성장을 위한 지원주제에 따라 서비스 분야 및 프로그램 한도 등을 정할 예정이다. 김학도 중진공 이사장은 중진공은 성장 가능성이 높은 중소벤처기업의 경쟁력 강화를 위해 혁신 바우처 사업을 비롯한 다양한 사업을 지원해오고 있다 며 앞으로도 제조 소기업의 혁신성장을 통해 지역 균형발전을 이룰 수 있도록 수요자 맞춤형 지원을 확대할 것 이라고 말했다. 한편 사업 공고는 지역별 지원대상 업종과 시기를 고려해 지방중소벤처기업청에서 순차적으로 진행한다. 공고문 확인 및 사업참가 신청은 혁신바우처플랫폼에서 할 수 있고 자세한 문의는 중진공 통합콜센터 1357 또는 지역본·지부로 하면 된다.\n", + "\n", + "### 답변: 중소벤처기업진흥공단이 3개년 평균 매출액 120억원 이하 제조 소기업 중 지역별 개별사업공고상 참여 요건에 해당하는 기업을 대상으로 제조 소기업 경쟁력 제고를 위한 2022년 중소기업 혁신바우처 사업 2차 참여기업을 모집한다고 4일 밝혔으며, 이번 2차 모집에는 고도화 서비스 바우처 20억원와 지역단위 자율형 바우처 100억원을 신설해 총 120억원을 지원할 예정이다.<|endoftext|>\n", + "72 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 김세연 초록뱀미디어 부회장 사진 퍼즐랩 과거 주몽·올인·불새부터 최근 나의아저씨·펜트하우스·나의 해방일지까지 지난 24년의 역사 동안 수많은 히트작을 포함한 총 70여편의 드라마를 제작한 국내 대표 드라마 제작사 초록뱀미디어가 NFT 대체불가능토큰 사업에 도전장을 내밀었다. 초록뱀미디어는 자체 메타버스 세계관이자 초록뱀 소속 아티스트 및 작품 IP 지식재산권 기반 NFT 브랜드 CRB 오리지널 CRB Original 을 앞서 지난달 공개했다. CRB 오리지널 의 첫 프로젝트인 1호 NFT 출시를 앞두고 김세연 초록뱀미디어 부회장을 만나봤다. ◇ 초록뱀의 자체 IP와 블록체인 기술의 만남 김세연 초록뱀미디어 부회장 사진 퍼즐랩 김 부회장은 4일 블루밍비트와의 인터뷰에서 CRB 오리지널 의 출범 배경으로 디지털 콘텐츠 산업의 변화와 블록체인 및 메타버스 등 새로운 시장의 출현을 꼽았다. 그는 드라마 콘텐츠 산업은 2020년 이전까지 공중파 3사가 주도하던 구조에서 최근 종편 및 OTT 서비스의 급격한 성장으로 인해 셀러즈 마켓 으로 산업이 재편됐다 면서 제작사 입장에서는 긍정적인 변화로 IP를 제작사가 소유·판매하는 방향으로 바뀌면서 제작 콘텐츠 수도 크게 늘어나고 있다 고 말했다. 셀러즈 마켓 은 구매자보다 판매자의 의사가 더 중요한 시장으로 그와 반대되는 바이어즈 마켓과 대조되는 의미다. 초록뱀은 OTT 시장 활성화 이후로 매년 1 2편 제작하던 콘텐츠 수를 6 9편으로 늘렸다고 전했다. 무엇보다 IP를 방송사에 넘기는 것이 아니라 제작사가 직접 소유할 수 있게 되면서 이를 활용할 수 있는 분야가 다양해졌다. 즉 IP로 인한 부가가치 창출이 가능해진 가운데 메타버스와 블록체인 산업이 떠오르면서 이를 결합한 CRB 오리지널 이 탄생하게 된 것이다. ◇ 드라마 콘텐츠 IP·소속 연예인 기반 NFT 구축 초록뱀은 지난해 말 블록체인 신사업 TF 태스크포스 팀을 꾸리고 내외부 인재들을 영입해 CRB 오리지널 의 구축과 자체 NFT 제작에 착수했다. NFT 마켓을 운영하는 글로벌 가상자산 거래소 등 해외 유명 기업들이 NFT 사업 협업을 목적으로 먼저 회사 측에 손을 건네기도 했다. 초록뱀이 보유한 IP 강점 덕분이다. 초록뱀은 자체 콘텐츠 IP 뿐만 아니라 스카이이앤엠 YG케이플러스 후크엔터 등 매니지먼트 세 곳을 보유하고 있다. 3사의 소속 연예인은 총 400여명에 달해 이들을 통한 NFT 사업 확장에도 유리한 상황이다. 회사가 조만간 공개를 계획 중인 1호 NFT 역시 소속 연예인 중 한 명을 통해 만들어진 프로젝트다. 단순한 소장가치를 넘어 팬덤 기반 혜택과 멤버십 기능 등 다양한 장점을 부여했다. 김세연 부회장은 초록뱀미디어의 콘텐츠는 크게 드라마와 연예인으로 나눌 수 있다 라며 드라마 속 일부 콘텐츠나 드라마 자체를 NFT화하거나 예능 연기자 가수 모델 등 소속 연예인들의 팬덤을 만족시킬 수 있는 NFT를 개발하는 방안을 고민하고 있다 고 말했다. ◇ 거대한 스토리 형성...SF·판타지 등 요소 투입 물론 단순히 NFT를 출시하는 데서 끝나는 것이 아니다. 향후 내놓을 NFT 프로젝트들은 서로 유기적인 관계로 CRB 오리지널 이라는 초록뱀의 메타버스 세계관 속에서 하나의 스토리를 형성한다. 김 부회장은 예를 들면 마블 세계관처럼 거대한 초록뱀 월드를 만들고자 하는 게 CRB 오리지널 이다 라면서 조만간 출시할 1호 NFT는 CRB 오리지널 로 진입하는 첫 단계가 될 것 이라고 설명했다. 하나의 NFT로 그치는 것이 아니라 지속적으로 CRB 오리지널 NFT 시리즈 를 내놓고 연속성과 연계성을 부여해 구매자들도 꾸준한 혜택을 누릴 수 있도록 한다는 방침이다. 김 부회장은 향후에는 초록뱀 세계관을 바탕으로 드라마 영화 뿐만 아니라 웹툰 웹소설 등 새로운 콘텐츠 제작도 가능할 것 이라며 SF나 판타지 등 흥미로운 장르의 스토리를 구성하는 방안을 마련 중 이라고 말했다. 초록뱀은 첫 번째 NFT 프로젝트를 완성시켜 당초 지난 달 공개할 예정이었으나 현재 글로벌 블록체인 시장의 상황을 고려해 출시 시점을 미루기로 했다. 김세연 부회장은 해당 NFT 연예인의 팬은 물론 구매자 혹은 투자자에 대한 보호와 안정성 제고를 위해 1호 NFT 출시 연기를 결정했다 며 작품의 가치를 오롯이 전달할 수 있는 머지않은 시점에 다시 정식 론칭을 알릴 것 이라고 전했다.\n", + "\n", + "### 답변: 총 70여편의 드라마를 제작한 국내 대표 드라마 제작사 초록뱀미디어가 4일 블루밍비트와의 인터뷰에서 CRB 오리지널의 첫 프로젝트인 1호 NFT 출시를 앞두고 디지털 콘텐츠 산업의 변화와 블록체인 및 메타버스 등 새로운 시장의 출현을 꼽으며 NFT 대체불가능토큰 사업에 도전장을 내밀었다.<|endoftext|>\n", + "73 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 발행액 14.5조원 상환액 9조원 작년말 퇴직연금 기저효과로 발행 감소 …금융감독원 제공 홍콩H지수 등 주요 주가지수가 하락해 파생결합증권 DLS·ELS 조기상환 규모가 감소함에 따라 올해 1분기 파생결합증권 발행잔액이 지난해 같은 기간보다 증가한 것으로 나타났다. 금융감독원이 1일 발표한 ‘2022년 1분기 중 증권회사 파생결합증권 발행·운용 현황’에 따르면 1분기 파생결합증권 발행잔액은 89조4000억원으로 전년 동기 대비 4조6000억원 증가했다. 1분기중 파생결합증권 발행액은 14조5000억원 상환액은 9조원으로 전년 동기 발행액 24조1000억원 과 상환액 29조3000억원 대비 모두 감소했다. 종류별로 보면 ELS 발행액은 12조원으로 전년 동기 대비 6조8000억원 36.0% 감소했다. 작년 말과 비교하면 13조원 51.8% 줄어든 수치다. 금감원은 “퇴직연금에 편입되는 원금보장형 ELS의 상환‧발행이 연말에 집중되면서 작년 말 발행액이 일시적으로 크게 증가한 영향”이라며 “지난해 홍콩H지수 약세와 1분기 글로벌 증시하락 등으로 투자수요가 감소하며 원금비보장형 ELS 발행액이 지속 감소했다”고 설명했다. ELS 상환액은 6조8000억원으로 지난해 1분기 대비 17조원 71.4% 감소했다. 이에 따라 3월말 ELS 발행잔액은 61조9000억원으로 전년 동기 대비 6조1000억원 11.0% 증가했다. 1분기 중 DLS 발행액은 2조5000억원으로 전년 동기 대비 2조8000억원 52.5% 감소했다. 퇴직연금에 편입되는 원금보장형 DLS의 상환‧발행이 연말에 집중되면서 작년말 발행액이 일시적으로 증가했으나 원금비보장형 DLS의 일괄신고서 금지방안과 대내외 금리 상승 등의 영향으로 전체 발행액이 감소한 것으로 나타났다. DLS 상환액은 2조2000억원으로 전년 동기 대비 3조3000억원 59.8% 감소했다. 3월말 DLS 발행잔액은 4000억원 증가한 27조5000억원으로 집계됐다. 1분기 ELS 투자수익률은 연 3.7% DLS 투자수익률은 연 1.5%로 전년 동기 대비 각각 0.8%p 1.1%p 높아졌다. 금감원은 금융시장 변동성 확대에 따른 투자자 손실위험을 모니터링하고 증권회사 리스크관리를 강화할 방침이다. 금감원 관계자는 “원금비보장형 ELS에서 변동성이 높은 종목형 상품이 증가하고 미국 금리 상승 경기침체 우려로 금융시장 변동성이 확대되는 상황”이라며 “투자자 손실위험에 대한 모니터링을 지속하고 증권회사의 헤지운용에 따른 예상손실을 상시 점검해 잠재적 리스크에 선제적으로 대응할 계획”이라고 밝혔다.\n", + "\n", + "### 답변: 1일감동원은 1분기 파생결합증권 발행잔액은 89조4000억원으로 전년 동기 대비 4조6000억원 증가, 주요 주가지수가 하락해 파생결합증권 DLS·ELS 조기상환 규모가 감소함에 따라 올해 1분기 파생결합증권 발행잔액이 지난해 같은 기간보다 증가한 것으로 나타나 금감원은 금융시장 변동성 확대에 따른 투자자 손실위험을 모니터링하고 증권회사 리스크관리를 강화할 방침이다.<|endoftext|>\n", + "74 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: DC IRP에 디폴트옵션 도입...적립금 자동 운용 운용지시 없다면 최대 6주 대기 후 디폴트옵션 운용 10월중 첫 승인상품...분기별로 수익률 공시 …고용노동부 제공 이달 12일부터 확정기여형 퇴직연금 DC 과 개인형퇴직연금 IRP 에 사전지정운용제도 디폴트옵션 가 도입된다. 고용노동부·금융위원회·금융감독원은 디폴트옵션 도입을 위한 근로자퇴직급여보장법 근퇴법 시행령이 국무회의에서 의결됐다고 5일 밝혔다. 앞서 정부는 지난해 12월 근퇴법 개정안이 국회에서 통과됨에 따라 시행규칙 퇴직연금감독규정을 개정했다. 사전지정운용제도 디폴트옵션 는 근로자가 본인의 퇴직연금 적립금을 운용할 금융상품을 결정하지 않을 경우 사전에 정해둔 운용방법으로 적립금이 자동 운용되도록 하는 제도를 말한다. 상품 유형은 예금 이율보증보험계약 GIC 등 원리금보장상품 100% 타깃데이트펀드 TDF 밸런스펀드 BF 스테이블밸류펀드 SVF 사회간접자본펀드 SOC 등 펀드상품 100% 원리금보장상품과 펀드상품을 혼합한 포트폴리오 상품 모두 가능하다. 퇴직연금사업자는 사용자와 근로자에게 제시할 디폴트옵션을 마련해 고용노동부 소속 심의위원회 심의를 거쳐 고용노동부장관의 승인을 받아야 한다. 심의위원회는 원리금보장상품의 금리 만기 예금자 보호 한도 상시가입 가능 여부 펀드 포트폴리오 상품의 수수료 수익률 손실 가능성 자산 배분의 적절성을 위주로 심사한다. …고용노동부 제공 최대 6 주 대기 후 디폴트옵션 운용 ... 언제든 변경 가능 근로자는 퇴직연금규약에 반영된 디폴트옵션 주요정보를 퇴직연금사업자로부터 제공받아 그중 하나의 상품을 본인의 디폴트옵션으로 선정한다. 기존 운용하던 상품의 만기가 도래한 후 운용지시 없이 4주 경과 시 ‘향후 2주 이내 운용지시가 없을 경우 적립금이 디폴트옵션으로 운용됨’을 통지받게 된다. 통지 이후에도 운용지시 없이 2주가 지나면 디폴트옵션으로 운용된다. 신규가입 후 운용지시가 없는 경우에는 4주 대기 없이 바로 통지를 받게 되며 통지 후 2주 이내에 운용지시 없을 경우 적립금이 디폴트옵션으로 운용된다. 디폴트옵션으로 적립금을 운용하고 있지 않은 근로자는 언제든지 디폴트옵션으로 본인의 적립금을 운용하는 것을 선택 OPT IN 할 수 있다. 또 디폴트옵션으로 운용 중에도 언제든지 원하는 다른 상품으로 운용지시가 가능 OPT OUT 하다. 적립금 100% 까지 운용 ...IRP 도 동일 퇴직연금 감독규정 개정에 따라 기존 위험자산 한도 70% 규제에도 불구하고 디폴트옵션은 적립금의 100%까지 운용할 수 있다. 확정기여형 퇴직연금 DC 에 도입되는 디폴트옵션에 관한 사항은 개인형퇴직연금 IRP 에도 동일하게 적용된다. 퇴직연금사업자가 승인받은 상품을 가입자에게 바로 제공하고 가입자는 그중 본인의 디폴트옵션을 선정하면 된다. 정부는 제도 시행 후 퇴직연금사업자로부터 신청을 받아 신속하게 승인 절차를 진행할 예정이며 10월 중에는 첫 번째 심의위원회를 거쳐 승인된 상품을 공시할 예정이다. 아울러 가입자의 선택권 보장과 사업자 간 경쟁 제고를 위해 디폴트옵션의 운용현황 수익률 등을 분기별로 고용노동부와 금융감독원 홈페이지에 공시한다. 또 3년에 1회 이상 정기평가해 승인 지속 여부를 심의해 모니터링 및 관리를 강화할 방침이다. 이정식 고용노동부장관은 “그간 퇴직연금제도는 낮은 수익률 문제로 근로자의 노후준비에 든든한 버팀목 역할을 하지 못했던 측면이 있었다”며 “지난 4월 도입된 중소기업퇴직연금기금제도와 적립금운용위원회 이달 도입되는 디폴트옵션을 빠르게 현장에 안착시키도록 적극 노력하겠다”고 밝혔다.\n", + "\n", + "### 답변: 이달 12일부터 확정기여형 퇴직연금 DC과 개인형퇴직연금 IRP에 사전지정운용제도 디폴트옵션이 도입되어 근로자가 본인의 퇴직연금 적립금을 운용할 금융상품을 결정하지 않을 경우 사전에 정해둔 운용방법으로 적립금이 자동 운용되도록 하며 특정 상품 유형은 예금 이율보증보험계약 GIC 등 원리금보장상품 100% 타깃데이트펀드 TDF 밸런스펀드 BF 스테이블밸류펀드 SVF 사회간접자본펀드 SOC 등 펀드상품 100% 원리금보장상품과 펀드상품을 혼합한 포트폴리오 상품 모두 가능하다.<|endoftext|>\n", + "75 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 핵심요약 23일 우리은행 이어 30일 신한은행서도 거액 외환 이상 거래 발생 금감원 현장 수시검사 나서며 타은행에도 점검 후 보고 지시 실수요 자금인지 위조나 가상자산 통한 차익 거래인지 여부에 주목 연합뉴스 우리은행에 이어 신한은행에서도 거액의 외환 이상 거래가 발견되면서 금융감독원이 타 시중 은행에 대해서도 외환 거래 운용 상황을 보고하도록 했다. 3일 금융권에 따르면 금감원은 지난 30일 신한은행 지점에서 발생한 거액의 외환 이상 거래에 대해 수시 검사에 나서며 나머지 은행들에 대해서도 외환 거래 이상 여부를 확인해 보고하도록 했다. 일부 은행은 금감원 지시 전인 우리은행 지점 사건 직후 자체 점검에 나서거나 금감원에 관련 사안을 문의한 것으로 전해졌다. 금감원은 이번 수시 검사를 통해 자금세탁 방지법과 외환 거래법 위반 여부를 집중 점검할 방침이다. 수입 대금 결제 명목으로 이뤄진 거래에 대한 실수요 자금 여부 서류 위조나 가상 자산과 연루된 차익 거래 여부 중국계 불법성 자본 등과의 연루 여부 자금세탁 목적 여부 등이다. 우리은행은 내부감사를 통해 서울의 한 지점에서 최근 1년 동안 8천억원에 달하는 비정상적인 외환거래가 이뤄진 사실을 알아내고 금감원에 보고했다. 금감원은 지난달 23일 이 지점에 대한 현장 검사를 시작했으며 신한은행으로부터도 이상 거래 현황을 보고 받고 지난달 30일 해당 지점에 대한 현장 검사에 착수했다. 이복현 금감원장은 최근 시중은행장들과의 간담회에서 횡령 등 금융 사고가 반복되는 점과 관련해 내부 통제 강화 를 촉구하면서 개선방안을 추진하겠다고 말했다. ※CBS노컷뉴스는 여러분의 제보로 함께 세상을 바꿉니다.\n", + "\n", + "### 답변: 3일은행에 이어 신한은행에서도 거액의 외환 이상 거래가 발견되면서 금융감독원이 타 시중 은행에 대해서도 외환 거래 운용 상황을 보고하도록 했는데, 3일 금융권에 따르면 금감원은 지난 30일 신한은행 지점에서 발생한 거액의 외환 이상 거래에 대해 수시 검사에 나서며 나머지 은행들에 대해서도 외환 거래 이상 여부를 확인해 보고하도록 했다고 전했으며, 일부 은행은 금감원 지시 전인 우리은행 지점 사건 직후 자체 점검에 나서거나 금감원에 관련 사안을 문의한 것으로 있다고 밝혔다.<|endoftext|>\n", + "76 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 뉴시스 김근수기자 비트코인이 경기 침체와 고금리에 대한 우려로 가상화폐 가격이 등락을 거듭한 1일 오후 서울 서초구 빗썸 고객센터 전광판에 암호화폐 시세가 나타나고 있다. 2022.07.01. ks newsis.com 사진 영상 제보받습니다 공감언론 뉴시스가 독자 여러분의 소중한 제보를 기다립니다. 뉴스 가치나 화제성이 있다고 판단되는 사진 또는 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠습니다.\n", + "\n", + "### 답변: 경기 침체와 고금리에 대한 우려로 가상화폐 가격이 등락을 거듭한 1일 오후 서울 서초구 빗썸 고객센터 전광판에 암호화폐 시세가 나타나고 있으며, 뉴시스 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다며 뉴스 가치나 화제성이 있다고 판단되는 사진이나 영상을 뉴시스 사진영상부 n photo newsis.com 로 보내주시면 적극 반영하겠다고 밝혔다.<|endoftext|>\n", + "77 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 모아데이타가 무상증자 발표 이후 상한가를 기록했다. 5일 오후 1시20분 현재 모아데이타는 전거래일대비 가격제한폭 29.70% 까지 오른 1만9650원을 나타내고 있다. 이날 모아데이타는 보통주 1주당 신주 5주를 배정하는 무상증자를 결정했다고 5일 공시했다. 신주 배정기준일은 오는 20일이며 신주의 상장예정일은 8월10일이다.\n", + "\n", + "### 답변: 모아데이타가 무상증자 발표 이후 상한가를 기록했다고 5일 날렸는데 5일 오후 1시20분 현재 모아데이타는 전거래일대비 가격제한폭 29.70% 까지 오른 1만9650원을 나타내고 있으며 이날 모아데이타는 보통주 1주당 신주 5주를 배정하는 무상증자를 결정했다고 5일 공시했다.<|endoftext|>\n", + "78 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 우리·신한 이상거래 후속조치 가상자산·불법자금세탁 조사 우리은행에 이어 신한은행에서도 거액의 외환 이상 거래가 발견되자 금융감독원이 모든 은행에 외환 거래 운용 상황을 점검하고 그 결과를 보고하도록 했다. 3일 금융권에 따르면 금감원은 지난달 23일 우리은행에 이어 30일 신한은행 지점에서 발생한 거액의 외환 이상 거래에 대해 수시 검사를 시작했으며 나머지 은행들에도 자체적으로 점검한 뒤 외환 거래 이상 여부를 보고하도록 했다. 일부 은행은 최근 우리은행 지점에서 문제가 발생하자 자체 점검에 착수하고 금감원에 관련 사안을 문의한 것으로 전해졌다. 금융당국 관계자는 우리은행 등에서 거액의 외환 이상 거래가 드러나는 등 문제가 있다고 판단돼 모든 은행에 공식적으로 자체 점검을 진행하도록 했다 고 말했다. 금감원은 우리은행 신한은행 지점의 거액의 외환 이상 거래와 관련한 수시 검사에서 자금세탁방지법과 외환거래법 위반 여부를 집중적으로 들여다보고 있다. 수입 대금 결제 명목으로 이뤄진 거래가 실수요 자금인지 서류를 위조하거나 가상자산과 연루돼 차익 거래를 했는지 중국계 불법성 자본 등과 연루됐는지 자금세탁 목적이 있는지 등을 살펴볼 계획이다. 금융당국 관계자는 거액의 송금 거래가 해당 업체의 무역 거래에 맞는 규모인지 의심을 가질 수 있어 여러 가능성을 보고 있다 고 전했다. 우리은행은 서울의 한 지점에서 최근 1년 동안 8000억원에 달하는 비정상적인 외환 거래가 이뤄진 사실을 내부 감사를 통해 포착해 금감원에 보고했다. 이에 금감원은 지난달 23일 이 지점에 대한 현장 검사에 착수했다. 이어 금감원은 신한은행으로부터 외환 이상 거래 현황을 보고받고 지난달 30일 해당 지점에 대한 현장 검사에 나섰다.\n", + "\n", + "### 답변: 3일 금융권에 따르면 금감원은 지난달 23일 우리은행에 이어 30일 신한은행 지점에서 발생한 거액의 외환 이상 거래에 대해 수시 검사를 시작했으며 나머지 은행들에도 자체적으로 점검한 뒤 외환 거래 이상 여부를 보고하도록 했다고 밝혔으며 일부 은행은 최근 우리은행 지점에서 문제가 발생하자 자체 점검에 착수하고 금감원에 관련 사안을 문의한 것으로 전해졌다.<|endoftext|>\n", + "79 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: KDDI 사고 원인 검증·재발방지책 마련할 계획 일본의 대형 이동통신사 KDDI가 통신사고 발생 약 86시간만에 서비스를 복구했다고 밝혔다. 5일 아사히뉴스네트워크 등 다수의 외신에 따르면 KDDI는 이날 오후 3시36분에 서비스 이용 상황과 네트워크 트래픽에 문제가 없음을 최종 확인했다. KDDI는 원인을 검증하고 최대한 빠른 시일 내에 재발 방지책을 마련한다는 계획이다. KDDI는 설비 고장으로 인해 VoLTE 교환기에 트래픽이 급증하며 통신망 과부하가 발생한 것을 사고 발생 원인으로 보고 있다. 2일 오전 1시35분 도쿄에 위치한 타마네트워크센터에서 모바일 코어망 라우터를 교환하던 중 KDDI는 음성 트래픽 경로가 변경되지 않고 VoLTE 통신에 문제가 생긴 것을 처음 확인했다. 타카하시 마코토 KDDI 사장 오른쪽 과 요시무라 카즈유키 KDDI 기술 총괄 본부장이 지난 3일 통신 장애에 대해 사과하고 있다. 사진 지디넷재팬 라우터 변경 작업 중 신규 라우터에 엑세스가 집중되며 VoLTE 교환기에 폭주가 발생했다. KDDI는 트래픽을 줄이기 위해 오전 3시부터 약 12시간 동안 액세스 요구를 제한하는 작업을 진행했지만 오후 3시 22분부터 가입자 데이터베이스 처리 부하가 발생했다. 오후 5시22분에는 가입자 데이터베이스에서 데이터 불일치가 발생하면서 장애 복구가 정상적으로 이뤄지지 않았다. 사고를 수습하는 과정에서도 18대의 VoLTE 교환기 중 6대에서 가입자 데이터베이스에 대한 신호를 과도하게 송출하고 있는 것을 발견했다. KDDI는 이번 통신장애가 지난 2월에 발생한 NTT도코모 사고와 비슷하다고 보고 있다. KDDI 측은 전날 진행된 기자회견에서 이번 사고는 단말기에 트래픽이 급증해 발생했다는 점에서 NTT도코모와 같은 현상이라고 볼 수 있다 고 설명했다. 복구가 늦어진 이유에 대해서는 복구 절차를 착실하게 준비하고 있었지만 처리에 문제가 있었다 며 지금부터 확실히 검증할 계획 이라고 말했다. KDDI는 이번 사고로 최소 3천915만 회선이 피해를 입은 것으로 추정하고 있다. 요시무라 본부장은 사용자 보상에 대해 원인 규명과 재발 방지를 우선적으로 고려하고 있으며 보상은 추후 별도로 안내할 예정 이라고 말했다.\n", + "\n", + "### 답변: 5일 아사히뉴스네트워크 등 다수의 외신에 따르면 일본의 대형 이동통신사 KDDI가 통신사고 발생 약 86시간만에 서비스를 복구했다고 밝혔는데, KDDI는 설비 고장으로 인해 VoLTE 교환기에 트래픽이 급증하며 통신망 과부하가 발생한 것을 사고 발생 원인으로 보고 있으며 KDDI는 원인을 검증하고 최대한 빠른 시일 내에 재발 방지책을 마련할 계획이다.<|endoftext|>\n", + "80 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 날짜미상의 사진에서 카타르 북부에서 운반선에 액화천연가스 LNG 가 실리고 있다.AP뉴시스 우크라이나의 전쟁으로 인한 천연가스의 가격 상승과 공급 우려로 향후 몇년 동안 천연가스에 대한 수요 증가가 둔화시킬 것으로 국제에너지기구 IEA 가 전망했다. 5일 현지시간 온라인 에너지전문매체 오일프라이스닷컴에 따르면 IEA는 이날 공개한 3·4분기 보고서에서 2021∼25년 사이 천연가스에 대한 세계 수요가 1400억㎥ 증가할 것으로 예측했다. 이는 코로나19 대유행으로 인한 경기침체를 포함한 직전 5년 간 2016∼20년 의 3700억㎥ 증가의 절반에도 못미치는 것이다. 이같은 수요 감소 전망은 우크라이나 전쟁으로 인한 천연가스의 높은 가격과 공급 불안 때문인 것으로 분석됐다. 또 구매자들이 천연가스에 대한 수요를 석탄이나 석유 또는 재생 가능한 에너지로 전환하기보다는 경제성장이 더 둔화될 것이라는 예측 때문이다. IEA는 러시아산 가스 구매를 줄이려는 유럽연합 EU 국가들의 노력으로 러시아에서 EU로의 천연가스 수출은 55∼75% 감소할 것으로 예상했다. 대신 EU는 아시아 같은 다른 지역으로부터 액화천연가스 LNG 구매를 늘릴 것으로 예상되는데 2025년 아시아로부터의 구매는 EU 수요의 절반을 차지할 것으로 예상됐다. 오일프라이스닷컴은 LNG 수출을 위한 시설 확충이 수요 증가세에 비해 느린 점도 수요를 둔화시키게 만들 것이라고 전했다. 이 매체는 지난 2010년대 중반 유가 폭락으로 취소된 에너지 인프라 프로젝트가 많고 지난 2020 21년 코로나19 봉쇄령으로 건설도 늦어지면서 시설 확충 속도가 느릴 것으로 전망했다.\n", + "\n", + "### 답변: 국제에너지기구 IEA가 우크라이나의 전쟁으로 인한 천연가스의 가격 상승과 공급 우려로 향후 몇년 동안 천연가스에 대한 수요 증가가 둔화시킬 것으로 예측한 가운데 5일 온라인 에너지전문매체 오일프라이스닷컴에 따르면 IEA는 이날 공개한 3·4분기 보고서에서 2021∼25년 사이 천연가스에 대한 세계 수요가 1400억m3 증가할 것으로, 이는 코로나19 대유행으로 인한 경기침체를 포함한 경기침체를 포함한 직전 5년 간 2016∼20년 의 3700억m3 증가의 절반에도 못미치는 것이다.<|endoftext|>\n", + "81 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 웨이브 독점 HBO 다큐멘터리 세기의 범죄 지난해 미국에서 약물 과다 복용으로 인한 사망자 수가 처음으로 10만명을 넘었다. 마약성 진통제 오피오이드 중독 문제 심각성이 커지자 도널드 트럼프 당시 미국 대통령이 이를 공중보건 비상사태로 규정했고 조 바이든 대통령 또한 불법 마약 거래 관련 국가 비상사태를 선포했다. HBO 다큐멘터리 세기의 범죄 는 이 같은 중독 사태 원인에 대해 집중 조명한다. 실제 제약산업에 종사했던 사람 의사 판매원 생생한 증언으로 사건 이면을 고발한다. 마약성 진통제 이른바 오피오이드는 양귀비의 꼬투리에서 채취한 아편을 원료로 한다. 양귀비에서 직접 추출한 천연 알칼로이드 천연 알칼로이드에서 유도한 반합성 알칼로이드 그리고 처음부터 화학 약품에서 합성한 성분 모두를 총칭한다. 마약성 진통제는 인간 고통을 덜어주기 위한 목적으로 등장했다. 진통제는 중추신경계 오피오이드 수용체에 작용해 통증 자극을 전달하는 신경전달물질 분비를 억제한다. 진통 효과로 주로 말기 암 환자나 수술 직후 환자 등에 한해 처방한다. 하지만 2000년대 이후 이 약은 미국에서 만병통치약으로 과용되기 시작한다. 오피오이드 사태 배후에는 미국의 제약회사 의사 정부의 철저한 계획이 있었다. 1952년 작은 제약회사 퍼듀 프레데릭 을 인수한 새클러 가문은 홍보와 사기를 넘나드는 영업 방식으로 안정제 시장을 선점했다. 이익 창출을 위해 기존에 판매하던 모르핀 계열 진통제보다 더욱 강력한 옥시코돈 에 주목했다. 그렇게 합성 마약제 옥시코돈 에 약물의 지속력을 높이는 코팅 기술이 더해져 마약성 진통제 옥시콘틴 이 탄생했다. 퍼듀 제약회사는 약물 부작용을 축소해 공표했다. 퍼듀로부터 뇌물을 약속 받은 식품의약국은 승인했다. 국가에서 인증한 이 약은 흡수를 지연시켜 오용 가능성을 줄인다 는 설명서 한 줄을 근거로 많은 판매원은 의사에게 마약을 권장했고 의사 역시 대중에 적극적으로 진통제를 처방했다. 약물 오남용 가능성을 알면서 저지른 행동이었다. 가장 큰 부작용은 중독이다. 환각 기억 상실 등 부작용과 투여 중지 시 금단 현상을 일으키며 모르는 사이 중독 과정을 겪게 된다. 환자들은 더 강한 효과를 위해 불법 마약 구매를 하기 시작했다. 멈출 수 없는 중독은 오피오이드 과다 복용으로 이어졌고 미국 질병통제예방센터 CDC 는 1999년부터 2019년까지 약 50만명 미국인이 이로 인해 숨졌다고 발표했다. 지방 정부는 관련 업체들을 상대로 소송을 제기하며 죽음에 대한 책임을 물었다. 제약사 존슨앤드존슨을 포함한 미국 3대 유통업체는 약 30조원이라는 합의금을 지불키로 했으며 퍼듀 파마 역시 지역 사회에 마약성 진통제를 유통한 유죄를 인정했다. 약물 중독과의 전쟁은 진행 중이다. 인간 통증을 인질로 탄생한 합법적 마약 이를 판매했던 장사꾼들의 민낯을 고발하는 HBO 다큐멘터리 세기의 범죄 는 온라인동영상서비스 OTT 웨이브에서 시청할 수 있다.\n", + "\n", + "### 답변: 지난해 미국에서 약물 과다 복용으로 인한 사망자 수가 처음으로 10만명을 넘기고, 미국에서 약물 과다 복용으로 인한 사망자 수가 처음으로 10만명을 넘어서면서 도널드 트럼프 당시 도널드 트럼프 당시 미국 대통령이 이를 공중보건 비상사태로 규정했고 조 바이든 대통령 또한 불법 마약 거래 관련 국가 비상사태를 선포한 가운데, HBO 다큐멘터리 세기의 범죄는 중독 사태 원인에 대해 집중 조명하고 제약산업에 종사했던 사람 의사 판매원 생생한 증언으로 사건 이면을 고발한다.<|endoftext|>\n", + "82 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 다음 블로그가 운영 17년 만에 서비스를 종료한다. 5일 정보기술 IT 업계에 따르면 카카오는 다음 블로그와 티스토리로 나뉘어 운영하던 블로그 플랫폼을 티스토리로 통합하기로 했다. 서비스 통합 예정일은 9월 30일이다. 기존 다음 블로그 이용자들은 콘텐츠를 티스토리로 이관해 활동을 이어나갈 수 있다. 카카오는 서비스 품질 향상을 위해서라고 통합 이유를 설명했다. 서비스 통합에 앞서 카카오는 지난 4일부터 다음 블로그 신규 개설을 중단됐다. 다음 블로그는 블로그 열풍이 불던 2005년 2월 서비스를 시작했다. 2007년 다음이 티스토리를 인수했으며 2020년 5월 전면 리뉴얼 이후 디자인·구조 측면에서 티스토리와 유사하다는 평가가 나왔다.\n", + "\n", + "### 답변: 5일 카카오는 다음 블로그와 티스토리로 나뉘어 운영하던 블로그 플랫폼을 티스토리로 통합하기로 했다고 밝혔으며 다음 블로그가 운영 17년 만에 서비스를 종료하고 기존 다음 블로그 이용자들은 콘텐츠를 티스토리로 이관해 활동을 이어나갈 수 있게 되었다.<|endoftext|>\n", + "83 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 게티이미지뱅크 인터넷전문은행이 대환대출 시장에 본격 진출하면서 카드·저축은행 등 제2금융권에 비상이 걸렸다. 제2금융권 대출을 이용하면서 상대적으로 신용이 우량한 고객 중심으로 이탈이 불가피해졌다. 향후 출혈경쟁으로 업권 자체 건전성까지 해칠 수 있다는 우려도 나온다. 3일 업계에 따르면 토스뱅크가 삼성카드를 시작으로 이달부터 복수 카드사 대상 카드론 장기카드대출 대환대출 서비스를 확대할 예정이어서 카드업계 우려가 커졌다. 카드사 고위 관계자는 “토스뱅크가 하겠다는 서비스가 사실상 카드론 고객 정보를 긁어다가 자사로 유입하겠다는 의도”라면서 “일부 고객에겐 금리인하 등 편익이 있을 수 있지만 산업 종사자로서 산업 생태계 자체가 위협을 받을 가능성이 짙어 우려스럽다”고 설명했다. 토스뱅크가 선보인 카드론 대환대출 서비스 는 이용자가 개인정보 열람에 동의하고 인증서 정보를 입력하면 기존 카드사에서 받은 카드론 금리 등을 안내하고 토스뱅크 대출로 갈아탈 수 있도록 해준다. 실제 1일 기준 토스뱅크 신용대출 금리는 연 4.18 15.00%로 6개 카드사 신한·KB국민·삼성·하나·우리·롯데카드 카드론 금리 5월 31일 기준 연 6.95 19.10%보다 낮다. 토스뱅크에 따르면 카드론 대환대출 서비스 이용자가 해당 서비스를 이용하면 평균금리가 연 6.83% 연이자상환액이 연평균 약 47만원 각각 감소하는 효과를 낸다고 설명했다. 카드업계는 우량 고객 이탈이 불가피하다고 우려한다. 최근 카드채 금리가 급등하면서 자금을 조달하기 어려워진데다 토스뱅크로 상대적으로 신용이 우량한 고객이 이탈하면 자체 대출 사업이 위축될 수 있다고 보고 있다. 이렇다 보니 토스뱅크의 서비스 구현 방식에 대해 볼멘소리도 나온다. 현재 토스뱅크는 카드론 정보를 수집하는 과정에서 웹사이트 콘텐츠를 수집·저장하는 웹 스크래핑 방식을 사용한다. 일각에서는 마이데이터 사업자인 토스와 토스뱅크가 같은 앱에서 서비스를 제공하는데도 토스뱅크가 사업자가 아니라는 이유로 스크래핑을 사용하는 것이 형평성에 어긋난다고 지적한다. 하지만 전체 신용정보를 스크래핑으로 통합 조회한 것이 아니기 때문에 규정을 어긴 것은 아니다. 저축은행도 인터넷은행의 대환대출 확대에 부정적인 견해를 내비쳤다. 현재 토스뱅크 카카오뱅크 등은 자사 플랫폼에서 기존 사용자가 받은 대출을 저축은행 등으로 대환해주는 서비스를 제공하고 있다. 인터넷은행보다 플랫폼 접근성이 현저히 낮은 저축은행 사정상 울며 겨자먹기로 수수료를 내면서 이들 대환대출 서비스에 탑승한 것이다. 다만 초기 예상과 달리 현재 저축은행들은 대환대출에 적극적이지 않다. 인터넷은행이 플랫폼에 들어온 우량 고객은 자사로 유입하고 상대적으로 신용이 취약한 고객만 저축은행으로 대환하고 있다는 주장이다. 한 저축은행 관계자는 “현장에서 인터넷은행의 대환대출 서비스 제공에 대한 우려가 크다”며 “신용이 우량한 고객은 인터넷은행으로 유입하고 상대적으로 신용이 취약한 고객만 저축은행으로 보내다 보니 이 부분에 대한 마케팅도 저절로 줄어드는 상황”이라고 토로했다.\n", + "\n", + "### 답변: 토전문은행이 대환대출 시장에 본격 진출하면서 상대적으로 신용이 우량한 고객 중심으로 이탈이 불가피해져 카드·저축은행 등 제2금융권에 비상이 걸렸으며 향후 출혈경쟁으로 업권 자체 건전성까지 해칠 수 있다는 우려도 나온다.<|endoftext|>\n", + "84 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: ‘시장형 일자리’ 식당 가보니 저렴한 식대 고령 손님 증가 일만 늘고 현상유지 어려워 “자생 위한 중장기 지원해야” 지난 23일 오후 서울 시내 한 반찬 전문점에서 시민들이 반찬을 구입하고 있다. 연합뉴스 “돼지고기 가격이 30%는 올랐어요. 제육볶음에 딸려 나가는 공깃밥값을 추가로 받아야 하나 고민됩니다.” 충북 청주에서 ‘노인일자리’ 식당을 운영하고 있는 담당자 김주현씨 가명 의 말이다. 김씨에게 ‘물가가 더 오를 것’이라는 정부 전망을 전하자 한숨을 크게 내쉬었다. 노인일자리 사업장이 고물가에 흔들리고 있다. 노인이 일하는 식당과 카페 반찬가게는 대표적인 시장형 노인일자리 사업장이다. 시장형 일자리는 정부가 민간 사업체에 인건비 일부를 지원해 만든 취업 자리다. 민간이 주도하는 수익 추구형 일자리사업으로 정부·지방자치단체가 직접 노인을 고용해 인건비를 지원하는 방식과 다르다. 다만 직접 일자리는 아니지만 노인일자리 창출을 위한 정부 지원 사업이기 때문에 공익 성격도 짙다. 노인일자리 사업장에서 판매하는 상품 가격은 비교적 낮은 수준이다. 지난 4일 찾은 청주의 ‘노인 보리밥집’도 정부가 지정한 착한가격업소다. 대표 메뉴인 시래기장 정식은 5500원으로 주변 식당 평균 백반 가격보다 저렴하다. 그나마도 코로나19를 거치면서 수년간 유지한 5000원에서 500원을 올린 가격이다. 코로나19 터널을 빠져나온 뒤 매출은 증가했는데 적자가 더 늘었다. 식자재 가격이 큰 폭으로 올랐기 때문이다. 음식을 팔면 팔수록 손해다. 5일 통계청이 발표한 6월 물가동향을 보면 돼지고기와 닭고기 가격은 1년 전보다 각각 18.6% 20.1% 올랐다. 같은 기간 배추는 35.5% 감자는 37.8% 상승했다. 김씨는 “코로나 때 300만원 적자였다면 올해는 장사가 나아졌으니까 적자가 200만원으로 줄어야 하는데 그게 안 된다”며 “일이 많아져서 어르신들만 더 고생한다”고 했다. 지역공동체를 기반으로 하는 식당 특성상 음식 가격을 올리기도 어렵다. 손님 대부분이 형편이 어려운 고령층이다. 저렴한 가격 때문에 이곳을 찾는 노인도 많다. 김씨는 “지금보다 식자재 가격이 더 오르면 현상 유지도 어려워질 수 있다”며 “뾰족한 방법이 없는 상황”이라고 말했다. 노인일자리 카페도 같은 처지다. 노인 10명이 돌아가며 일하는 청주 A카페도 고물가에 운영난을 겪고 있다. 노인들이 시간당 최저임금을 받으며 일해도 카페 운영이 쉽지 않다. A카페의 수박주스 가격은 4000원으로 다른 프랜차이즈 카페보다 20% 가까이 싸다. 수박 가격 6월 기준 은 1년 전보다 22.2% 올랐다. 카페 관계자는 “일하는 노인분들의 급여를 정산하면 남는 게 거의 없다”고 했다. 김문정 한국노인인력개발원 연구조사센터 부연구위원은 “시장형 노인일자리는 지역사회에 공헌하는 바가 크고 공익성이 있는 일자리”라며 “일자리사업이 중단되지 않고 중장기적으로 자생할 수 있도록 지원할 필요가 있다”고 말했다.\n", + "\n", + "### 답변: 5일 통계청이 발표한 6월 물가동향에 따르면 돼지고기와 닭고기 가격은 1년 전보다 각각 18.6% 20.1% 올랐고 노인일자리 사업장에서 판매하는 상품 가격은 비교적 낮은 수준으로 노인일자리 사업장이 고물가에 흔들리고 있다.<|endoftext|>\n", + "85 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 톰 레이턴 아카마이 대표 해킹 규모 커지고 횟수도 늘어 컴퓨팅 등 全분야 솔루션 제공 24시간 탐지로 피해 예방 가능 클라우드 이용땐 특히 더 필요 우크라이나·러시아 전쟁으로 새로운 종류의 해킹 위협이 많이 늘어날 줄 알았는데 그보다는 전통적인 해킹 악성코드·디도스 이 급증했습니다. 특히 랜섬웨어 피해가 올해 극심합니다. 톰 레이턴 아카마이 최고경영자 CEO·사진 가 최근 매일경제와 인터뷰에서 이 같은 사이버 동향을 전했다. 레이턴 CEO는 지난달 15 16일 한국에 머물며 국내 유수 대기업 관계자와 미팅을 했다. 콘텐츠 전송 네트워크 CDN 분야 글로벌 1위 기업인 아카마이는 보안 솔루션과 클라우드라는 신산업 을 개척하며 New 아카마이 로 탈바꿈하고 있는 기업이다. 지난해 한 해에만 약 34억달러의 매출을 기록했는데 보안 분야 매출액만 13억달러에 이른다. 레이턴 CEO는 컴퓨팅·콘텐츠 전송까지 아우르며 전 세계에 걸쳐 보안 솔루션을 제공할 수 있다는 게 아카마이 보안의 장점 이라고 강조했다. 그는 상시화되고 규모가 커진 해킹 위협에 대응해 사이버 복원력 resiliency 을 가져야 한다고 조언했다. 레이턴 CEO는 해킹 공격은 언젠가는 들어오는데 이를 미리 감지하고 확산이 되지 않게끔 하는 게 사이버 복원력의 핵심 이라며 아카마이는 마이크로세그멘테이션 부문 Microsegmentation 보안에서 강점을 가지고 있다 고 설명했다. 마이크로세그멘테이션이란 기관 내부 시스템에 내재된 악성코드를 미리 감지하고 통신 네트워크를 통해 해당 악성코드가 확산되는 것을 방지하는 솔루션을 말한다. 워낙 촘촘하게 기기와 네트워크가 연결되다 보니 해킹에 노출되는 취약점도 덩달아 많아지게 되는데 마이크로세그멘테이션 보안이 도입되면 24시간 실시간으로 이를 탐지하고 큰 피해를 예방할 수 있다. 아카마이는 지난해 보안업체 가디코어를 인수하고 마이크로세그멘테이션 역량을 확장한 바 있다. 레이턴 CEO는 향후 가장 성장할 분야로 클라우드 보안 을 꼽았다. 자체 서버를 구축하는 것이 아니라 사용한 만큼 구독료를 내며 언제 어디서든 접속이 가능한 클라우드를 도입하는 기업이 점차 늘면서 이에 대한 보안 위협도 증가하고 있다. 레이턴 CEO는 이를 두고 복수 층위에서 보안에 신경을 써야 한다 고 조언했다. 클라우드와 연결되는 주변 기기 휴대폰 PC 등 클라우드에 접근 권한이 있는 임직원 기업 내 여러 서비스와 이와 연관된 통신 단계 애플리케이션 레이어 등이 모두 해커의 타깃이 될 수 있다. 각 단계에 따른 해킹 수법도 모두 다르다. 디도스 공격처럼 한 번에 트래픽을 많이 보내서 시스템을 무력화시키는 해킹이 활용되는 경우도 있지만 애플리케이션 레이어를 해킹할 때는 트래픽을 많이 발생시키지 않고 몰래 악성코드를 심어넣는 해킹 방식이 선호된다. 해킹의 목적도 단순히 시스템을 무력화시키는 것부터 데이터 유출 금품 갈취 등 다양하다. 레이턴 CEO는 이 모든 복수의 층위를 모두 신경 쓰면서 해킹으로 인한 피해를 막고 복원력을 기르는 것이 클라우드 보안의 핵심 이라고 강조했다. 레이턴 CEO는 지난 1분기 매출액을 살펴보면 보안과 컴퓨터 분야 매출이 이미 CDN 매출을 앞질렀다 며 보안 분야 매출이 급성장하고 있어서 앞으로 가장 큰 회사의 수익원이 될 것 이라고 밝혔다.\n", + "\n", + "### 답변: CC 톰 레이턴 아카마이 최고경영자 CEO·사진이 최근 매일경제와 인터뷰에서 전통적인 해킹 악성코드·디도스가 급증하고 있는 사이버 동향을 전하며 컴퓨팅·콘텐츠 전송까지 아우르며 전 세계에 걸쳐 보안 솔루션을 제공할 수 있다는 게 아카마이 보안의 장점 이라고 강조했다.<|endoftext|>\n", + "86 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 고승범 금융위원장 연합뉴스 자료사진 서울 연합뉴스 오주현 기자 고승범 금융위원장이 5일 퇴임하는 가운데 후임 김주현 금융위원장 후보자가 곧 임명 수순을 밟을지 관심이 쏠린다. 금융권에 따르면 고 위원장은 이날 오전 정부서울청사 별관에서 이임식을 연다. 지난해 8월 취임한 고 위원장은 재임 기간이 짧았지만 가계부채 급증 문제를 안정시켰다는 평가를 받는다. 금융사들에 가계부채 총량을 전년보다 5% 수준 이상 늘리지 않도록 주문하는 등 강력한 가계부채 총량 규제를 시행하고 총부채원리금상환비율 DSR 규제를 더욱 강화해 가계부채 저승사자 라는 별명을 얻기도 했다. 그는 소상공인 등 취약층에 대한 금융 지원 무질서한 가상자산 가상화폐 시장의 제도화 등에도 적극적인 역할을 했다는 평가를 받는다. 고 위원장은 이임사에서 그간의 소회를 밝히고 후배들에게 금융시장 안정이 훼손되지 않도록 가계부채 관리 등의 소임을 다 해줄 것을 당부할 예정이다. 고 위원장은 새 정부가 출범한 이후인 지난 5월 사의를 표명했으나 원 구성을 두고 여야가 대치하는 상황이 이어지며 사의를 표명한 지 약 두 달 만에 이임식을 하게 됐다. 윤석열 대통령은 전날 국회에 김주현 금융위원장 후보자에 대한 인사 청문보고서 송부를 재요청했다. 송부 기한인 오는 8일까지 인사청문회가 열리지 않으면 대통령 직권으로 임명할 수 있다. 전날 여야 합의로 국회의장단이 구성되면서 국회가 정상화 수순에 접어든 만큼 이르면 이번 주 중 청문회 일정이 확정될 가능성도 있다. 금융당국 관계자는 원 구성이 이번 주 내로 되지 않는다면 최근 교육부총리가 임명되는 등 선례를 볼 때 다음 주 초께 후임 금융위원장이 임명될 가능성이 있을 것으로 예상한다 고 말했다. 고 위원장이 퇴임하면서 금융위는 당분간 김소영 금융위 부위원장 대행 체제로 운영될 예정이다. 질문에 답변하는 김주현 금융위원장 후보자 서울 연합뉴스 김인철 기자 금융위원장 후보자로 지명된 김주현 여신금융협회 회장이 7일 오후 서울 중구 여신금융협회에서 열린 소감 발표 및 출입기자 간담회에서 취재진 질문에 답하고 있다.\n", + "\n", + "### 답변: 5일해 퇴임하는 고승범 금융위원장이 후임 김주현 금융위원장 후보자가 곧 임명 수순을 밟을지 관심이 쏠리는 가운데 금융권에 따르면 고 위원장은 그간의 소회를 밝히고 후배들에게 금융시장 안정이 훼손되지 않도록 가계부채 관리 등의 소임을 다 해줄 것을 당부할 예정이며 금융위는 당분간 김소영 금융위 부위원장 대행 체제로 운영될 예정이다.<|endoftext|>\n", + "87 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: NBA 2K23 에 등장하는 마이클 조던 모습 2K 제공 미국프로농구 NBA 역대 최고 스타인 마이클 조던이 NBA 2K 커버를 다시 장식했다. NBA 2K11 과 NBA 2K12 NBA 2K16 에 이은 네 번째 행보다. 미국 게임업체 2K는 등번호 23번으로 기억되는 마이클 조던이 NBA 2K23 스페셜 에디션인 마이클 조던 에디션과 챔피언십 에디션 커버에 등장한다고 6일 밝혔다. 마이클 조던은 선수 시절 NBA를 세계적인 현상으로 만들고 농구계에 막대한 영향을 끼친 인물이다. NBA 올스타 14회 기아 NBA MVP 5회 NBA 월드 챔피언 6회 기록을 세우며 네이스미스 농구 명예의 전당에 오르기도 했다. 2K는 올해 NBA 2K 24주년을 맞아 진행하는 캠페인 테마 위대함에 응하라 에 걸맞은 인물로 조던을 꼽았다. 엘피 브로디 NBA 2K 글로벌 마케팅 전략 부사장은 23을 스포츠에서 가장 눈에 띄는 숫자로 만든 역사를 생각하면 NBA 2K23에 마이클 조던 에디션을 선보이는 것은 더할 나위 없는 선택 이라고 했다. 2K는 조던의 빛나는 경력 중 15가지 상징적인 순간을 재현할 수 있는 조던 챌린지를 NBA 2K23 에 다시 도입했다. 이를 위해 NBA 2K11 오리지널 챌린지 10개를 모두 처음부터 다시 만들었다. 2K 측은 10년 이상 기술적 도약이 반영된 새로운 게임 플레이로 조던의 업적을 경험할 수 있다 고 했다. 발로 뛰는 더팩트는 24시간 여러분의 제보를 기다립니다.\n", + "\n", + "### 답변: 미국프로농구 NBA 역대 최고 스타인 마이클 조던이 NBA 2K 커버를 다시 장식했는데 선수 시절 NBA를 세계적인 현상으로 만들고 농구계에 막대한 영향을 끼친 인물로 올해 NBA 2K 24주년을 맞아 진행하는 캠페인 테마 위대함에 응하라에 걸맞은 인물로 조던을 꼽았다<|endoftext|>\n", + "88 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 당국 3세대백신 5천명분 계약 중…지자체서 원숭이두창 검사 시행 준비 치료제 물량 초기 대응에 충분…전국민 백신 접종 필요성 없어 국내 첫환자 상태 호전·양호…김남중 교수 사람두창보다 경미 사망률 과장돼 원숭이두창 감염병 주의 인천공항 안내 모니터 연합뉴스 자료사진 서울 연합뉴스 최인영 조민정 기자 원숭이두창 치료제인 테코비리마트 504명분이 오는 9일 국내에 도입될 예정이다. 또 원숭이두창 예방 효과가 있는 3세대 두창 백신 진네오스 5천명분 1만도즈 을 국내 공급하기 위한 계약도 진행 중이다. 중앙방역대책본부는 5일 원숭이두창 대응을 위해 치료제와 백신 도입을 추진하고 있다며 이같이 밝혔다. 당국은 치료제가 국내 도입되면 전국 17개 시도 지정 병원에 공급해 활용할 예정이다. 임숙영 방대본 상황총괄단장은 도입되는 치료제 물량은 초기 대응에 충분한 수준 이라며 향후 발생 양상을 고려하면서 필요하면 추가로 도입하겠다 고 말했다. 원숭이두창은 증상이 경미한 경우가 많아 원숭이두창 전용 치료제를 사용하지 않고도 증상이 호전되는 경우가 많다고 임 단장은 설명했다. 그러면서 국내 1호 원숭이두창 확진자도 전용 치료제 없이 상태가 많이 호전돼 현재 건강 상태가 양호하다고 밝혔다. 1명당 4주 간격으로 2회 접종하는 3세대 백신 진네오스는 현재 해외 제조사 바바리안 노르딕 와 공급 계약을 진행하고 있으며 계약이 완료되면 구체적인 도입 시기 등을 발표할 예정이다. 앞서 질병청은 진네오스 긴급도입을 요청했고 이에 식품의약품안전처는 국가필수의약품 안정공급협의회 심의를 거쳐 지난 1일 국내 긴급도입을 인정했다. 현재는 정부가 비축한 2세대 두창 백신을 활용해 원숭이두창 예방접종을 하고 있다. 임 단장은 원숭이두창의 전파방식과 전파력을 고려했을 때 백신을 일반 국민을 대상으로 광범위하게 접종할 필요성은 없다고 본다고 설명했다. 그러나 밀접접촉자는 14일 이내 접종해야 효과를 볼 수 있기 때문에 밀접접촉자 중심으로 한 포위접종 방식으로 접종을 진행할 예정이라고 밝혔다. 원숭이두창 관련 검역 강화된 공항 공동취재 원숭이두창은 전날 기준으로 59개국에서 6천157명이 확진된 것으로 확인된다. 국내 확진자는 1명이다. 질병청은 원숭이두창 24시간 종합상황실과 즉각대응팀을 설치하는 등 대응체계를 구축했다. 전국 시도에도 지역 방역대책반을 설치하고 지난달 27일과 이달 4일 시도 보건과장 회의를 개최해 중앙 지역 협조 체계를 다졌다. 질병청은 지난달 28일 지역사회 의심 환자 발생에 대비한 대응체계 점검 도상 훈련을 진행하고 지난달 28∼29일에는 의료진 대상 교육을 시행해 추가 원숭이두창 확진자 발생에 대비했다. 또 지자체 17개 보건환경연구원 검사 확대 계획을 수립해 숙련도 평가를 완료했다. 향후 진단검사시약을 배포해 지자체에서도 원숭이두창 검사를 할 수 있도록 준비하고 있다. 또 DUR 의약품안전사용서비스 과 ITS 해외여행력정보제공시스템 를 연계해 원숭이두창 발생 빈발 국가 5개국의 해외 여행력을 의료기관에 제공하도록 했다. 질병청은 이날 브리핑에 대한감염학회 이사장인 김남중 서울대병원 감염내과 교수를 초청해 원숭이두창에 대한 질의응답 시간을 가졌다. 김 교수는 원숭이두창이 코로나19와 같은 대유행을 일으킬 가능성을 묻는 말에 새로운 환자가 유입될 가능성은 충분히 있지만 밀접접촉에 의한 전파이기 때문에 코로나19 유행처럼 대유행을 일으킬 가능성은 아예 없다고 생각한다 고 답했다. 또 원숭이두창의 치명률이 3∼8%로 알려진 것과 관련 비풍토지역에서 5천명 이상의 환자가 발생했지만 사망자가 없다 며 면역이 저하된 분들이 걸릴 경우가 있을 수 있어 사망자가 앞으로도 0 일 것이라고 장담할 수는 없지만 사망률이 3%에 이른다고 하는 것은 과장됐다 고 강조했다. 그러면서 원숭이두창은 두창 사람두창 에 비해서도 경미한 질병으로 회복 후 반흔 흉 을 남기는 두창과 달리 원숭이두창은 회복 후 시간이 지나면서 반흔도 대부분 없어지는 것으로 알려져있다 고 설명했다. 질병청은 원숭이두창 발생 국가를 방문·여행하는 국민들에게는 현지에서 유증상자나 야생동물과 접촉을 피하고 마스크 착용 손 씻기 등 개인 위생수칙을 준수하는 것이 중요하다고 당부했다. 또 귀국 후 3주 이내 발열 오한 수포성 발진 등 의심 증상이 나타나면 동거인을 포함한 주위 사람들과 접촉하지 않도록 주의해야 하며 주소지 관할 보건소로 신속히 신고해야 한다고 강조했다.\n", + "\n", + "### 답변: 중앙방역대책본부는 증상이 경미한 경우가 많아 원숭이두창 전용 치료제를 사용하지 않고도 증상이 호전되는 경우가 많기 때문에 원숭이두창 치료제인 테코비리마트 504명분을 오는 9일 국내에 도입할 예정이며 향후 발생 양상을 고려하면서 필요하면 추가로 도입하겠다고 말했다.<|endoftext|>\n", + "89 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 게임업계 소통 간담회… 중국 판호 발급 확대 노력·주 52시간 근로 합리적 운영 문화체육관광부 장관 게임업계 소통 간담회 서울 연합뉴스 김주환 기자 1일 서울 강남구 한국게임산업협회에서 열린 게임업계 소통 간담회에 참석한 박보균 문화체육관광부 장관과 게임계 관계자들이 기념 촬영을 하고 있다. 2022.7.1 jujuk yna.co.kr 서울 연합뉴스 김주환 기자 박보균 문화체육관광부 문체부 장관이 취임 이후 처음으로 게임 업계 관계자들을 만난 자리에서 게임은 질병이 아니다 라며 업계의 규제를 풀겠다고 약속했다. 박 장관은 1일 서울 강남구 한국게임산업협회에서 열린 간담회 모두발언에서 게임은 늘 편견과 오해에 시달려왔다. 게임 과몰입을 질병으로 몰아가는 시선이 엄존한다 며 이런 뜻을 밝혔다. 이날 간담회에는 강신철 한국게임산업협회장 황성익 한국모바일게임협회장 정석희 한국게임개발자협회장 윤상규 한국VR·AR콘텐츠진흥협회장 게임산업협회 부회장사를 맡은 12개 게임 업체 대표 및 임원급 등이 참석했다. 박 장관은 K 콘텐츠라면 방탄소년단 BTS 이나 오징어 게임 등을 떠올리는데 글로벌 장악력을 따지면 단연 게임이 맨 앞에 있다 고 말했다. 그러면서 세계 게임시장 경쟁에서 필요한 인재를 키우고 기획·제작·유통 전 과정을 문체부에서 지원하겠다. 규제를 선도적으로 혁신하고 풀겠다 고 약속했다. 또 업계에서 요구하는 중국의 판호 발급 확대를 위해 외교부 경제 부처와 협력해 특별한 노력을 기울이겠다 며 주 52시간제의 합리적인 운영을 위해 지혜롭게 대처하겠다 고도 덧붙였다. 1시간가량 열린 이날 간담회는 참가자들이 돌아가며 한국 게임산업 현안과 산업 경쟁력 회복 방안 등을 이야기하는 방식으로 진행됐다. 간담회에서는 현재 게임 업계의 화두인 P2E Play to Earn·플레이로 돈 벌기 게임에 대한 규제를 완화해 달라는 건의가 나온 것으로 전해졌다. 박 장관은 이에 신기술과 사행성이라는 양면성이 있어 종합적 접근이 필요하다 는 원론적 답변을 내놓았다. 또 근무 시간 확대 요구에 대해서는 유연근무제 확장은 필요하나 판교의 등대 크런치 모드 에 대한 우려의 목소리도 있다 며 게임 업계가 선제적으로 대처해 달라고 주문했다. 이날 토론회에서는 현안과 관련한 구체적인 논의는 오가지 않은 것으로 전해졌다. 한 참석자는 토론회가 끝나고 대형 게임사만 참가해 상대적으로 약자인 중소 게임사들의 이야기가 전혀 나오지 않았다 며 아쉬움을 드러내기도 했다.\n", + "\n", + "### 답변: 박 장관은 1일 서울 강남구 한국게임산업협회에서 열린 간담회 모두발언에서 게임은 늘 편견과 오해에 시달려왔다며, 게임은 게임 과몰입을 질병으로 몰아가는 시선이 엄존하다며, 업계의 규제를 풀겠다고 약속했다.<|endoftext|>\n", + "90 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 파르나스 호텔 제주 숙박권 애플워치에어팟 세트 다이슨 에어랩 등 경품 이벤트도 진행 유통사 자체 페이 GS Pay의 론칭 1주년을 맞아 대고객 감사 이벤트가 열린다. GS리테일은 지난해 론칭한 GS Pay의 1주년을 기념하여 7월 한 달간 운영 중인 모든 채널에서 상상 이상의 간편결제 GS Pay 백만초월 페스티벌 행사를 진행한다. GS25는 GS Pay 사용 시 결제 건 당 GS POINT 100포인트 페이백 행사 최대 5천 원 한도 와 시원한 여름을 날 수 있도록 파우치 음료 1 1 행사를 진행한다. GS더프레시는 물가 안정을 위해 주차 별 생필품 위주의 계절과일 초복 상품 공산품 등에 대해 GS Pay 추가 할인 행사를 진행한다. GS샵은 Weekly GS Pay Day 를 통해 매주 1회 GS Pay 결제에 대한 카드 할인을 적용하며 GS프레시몰은 일주일 간 GS Pay로 7만 원 이상 결제 시 1만 점의 더팝 리워즈를 캐시백 하는 행사를 진행한다. 또한 GS리테일은 경품 이벤트도 선보인다. GS리테일 자회사인 파르나스에서 신규 오픈하는 파르나스 호텔 제주 숙박권 디럭스 2박 을 비롯해 애플워치 에어팟 프로 세트 다이슨 에어랩 스타일러 컴플리트 다이슨 슈퍼소닉 헤어드라이어 케니샤프 콜라보 굿즈 패키지 더팝 리워즈 5 000점 등 다양한 경품을 준비했다. 고객들은 GS리테일의 모든 채널에서 GS Pay를 한번 이상 사용한 후 더팝앱 이벤트 페이지를 통해 응모할 수 있다. GS Pay는 GS리테일이 KB국민은행 및 KG이니시스와 손잡고 선보인 간편 결제 시스템이다. 고객은 GS Pay에 신용카드나 결제 연동 계좌를 1회만 등록하면 GS리테일의 모든 채널에서 원클릭 결제만으로 편리한 쇼핑을 할 수 있다. 10만 원 이하 결제 시 비밀번호 입력 없이 원클릭만으로도 결제할 수 있는 서비스와 KB국민은행의 FDS Fraud Detection System이상금융거래탐지시스템 가 적용돼 업계 최고 수준의 편의성과 안전성도 갖췄다. 또한 계좌 연동 후 상시 2% 적립 행사상품 최대 20% 할인 매월 파격 행사 등 고객을 위한 혜택도 다양하다. GS리테일은 편의성 안전성 차별화 고객 혜택 등 GS Pay가 가지고 있는 다양한 강점들과 GS리테일의 온오프 전 채널에서 함께 사용 가능한 통합적 록인 Lock in 효과가 고객들이 GS Pay를 가입해 이용하고 있는 원인으로 분석하고 있다. 앞으로 GS리테일은 자회사 주요 계열사 제3자까지 GS Pay의 제휴 영역을 확대하고 결제 데이터 분석을 통한 고객 맞춤형 쇼핑 정보 제공 및 파격 할인 프로모션 등을 지속 선보여 GS Pay 사용 고객을 더욱 확대하고 더 많은 혜택을 제공할 방침이다. 조광현 GS리테일 전략마케팅팀 팀장은 GS리테일의 통합 및 GS Pay의 1주년을 기념하여 이용해주시는 모든 고객분들께 감사의 의미를 담아 혜택 가득한 GS Pay 백만초월 페스티벌 행사를 준비하게 됐다 라며 앞으로도 제휴 영역 확대 고객 맞춤형 쇼핑 정보 제공 할인 프로모션 등 GS Pay의 차별화 서비스를 강화해 고객에게 더 큰 만족을 드릴 수 있도록 최선의 노력을 다할 것 이라고 말했다.\n", + "\n", + "### 답변: G은행은 GS Pay의 1주년을 맞아 7월 한 달간 모든 채널에서 상상 이상의 간편결제 GS Pay 백만초월 페스티벌 행사를 열고 파르나스 호텔 제주 숙박권 디럭스 2박 등 애플워치 에어팟 프로 세트 다이슨 에어랩 프로 세트 다이슨 에어랩 스타일러 컴플리트 다이슨 슈퍼소닉 헤어드라이어 케니샤프 콜라보 굿즈 패키지 5 000점 등 경품 이벤트도 준비했다.<|endoftext|>\n", + "91 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 배재현 CIO 완전 매각은 루머 서울경제 카카오가 카카오모빌리티 지분 10%대를 매각해 2대 주주로 남는 방안을 검토한다. 매각안이 성사될 경우 MBK파트너스가 1대 주주로 올라서게 된다. 6일 정보기술 IT 업계에 따르면 배재현 카카오 최고투자책임자 CIO 는 이날 사내 공지를 통해 “카카오모빌리티 지분의 상당수를 매각하는 방안은 검토한 적 없다”며 “현재 검토 중인 방안은 지분 10%대를 매각해 2대 주주로 내려오는 지분변경 구조”라고 밝혔다. 당초 카카오는 40%대의 보유 지분을 MBK파트너스에 매각하는 방안을 검토하고 있는 것으로 알려졌으나 이같은 소문을 정면 반박한 것이다. MBK파트너스가 TPG·칼라일 등 재무적투자자 FI 보유 지분과 카카오 보유 지분을 모두 매입해 1대 주주로 올라설 것으로 전망된다. 지난 연말 기준으로 카카오모빌리티 지분은 △카카오 57.55% △TPG 29.04% △칼라일 그룹 6.21% 등 순이다. 카카오가 MBK에 최대 19% 지분을 매각해도 기존 지분 구조대로라면 1대 주주가 된다. 카카오는 자사가 최대주주에서 물러나야 카카오모빌리티의 기존 사업확장 기조를 이어갈 수 있다고 본다. 글로벌 경쟁에서 살아남으려면 본격적인 성장 드라이브가 필요한데 공익적 성격이 강한 카카오 공동체 안에선 이를 실현하기 어렵다는 판단이다. 다만 카카오 관계자는 “매각안이 확정된 것은 아니 라고 전했다. 한편 이날 카카오 노조 크루유니언 은 카카오 경영진과의 면담 결과를 공개하며 전 계열사 임직원을 대상으로 모빌리티 매각 반대 서명운동을 재개하겠다고 선언했다. 카카오 노조는 카카오가 모빌리티 사업을 이어나갈 의지가 없다 며 사회적 책임을 파기한 것 이라고 주장했다.\n", + "\n", + "### 답변: 6카카오는 40%대의 보유 지분을 MBK파트너스에 매각하는 방안을 검토하고 있으나 MBK파트너스가 TPG·칼라일 등 재무적투자자 FI 보유 지분과 카카오 보유 지분을 모두 매입해 1대 주주로 올라설 것으로 전망되며 현재 검토 중인 방안은 지분 10%대를 매각해 2대 주주로 내려오는 지분변경 구조라고 밝혔다.<|endoftext|>\n", + "92 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 네덜란드 ASML 본사 사옥. 로이터 연합뉴스 미국이 중국의 반도체 산업에 대한 제재의 수위를 높이고 있다. 그간의 고강도 제재에도 불구하고 중국의 반도체 굴기 가 오히려 더 속도를 내자 추가 압박을 가하는 것으로 분석된다. 5일 현지시간 블룸버그통신에 따르면 미국은 네덜란드의 대표적 반도체 장비 업체인 ASML에게 EUV 극자외선 노광장비에 이어 구형 장비인 DUV 심자외선 노광장비에 대해서도 중국 판매 금지를 요청했다. 블룸버그는 돈 그레이브스 미국 상무부 부장관이 5월 말부터 지난달 초까지 네덜란드와 벨기에를 방문했을 당시 공급망 이슈를 논의하며 중국 수출 문제를 언급했고 ASML 본사도 방문해 피터 베닝크 ASML CEO 최고경영자 를 만나 이와 같은 내용을 요청했다고 소식통들을 인용해 보도했다. 네덜란드 정부는 미국의 압박으로 ASML이 세계에서 유일하게 생산하는 EUV 장비의 중국 수출 승인을 내주지 않고 있는데 이 조치를 DUV까지 확대하기를 요구한 것이다. ASML은 반도체 웨이퍼 위에 회로 선폭을 새기는 노광 과정에 필요한 장비를 주로 생산한다. 이 중 EUV는 극자외선 파장의 빛을 이용하는 것으로 파장이 짧아 미세한 회로 구현에 용이하다. EUV 장비는 차세대 반도체 공정에 반드시 필요한 장비지만 현재까지는 5나노 이하 초미세공정이 필요한 시스템반도체 생산이나 10나노 초반대의 차세대 D램 등에서만 주로 쓰인다. 20나노 이상의 숙성 공정에서는 여전히 불화아르곤 ArF 을 사용하는 DUV 노광장비가 가장 일반적으로 사용된다. 미국은 일본 니콘에도 DUV 장비를 중국에 판매하지 못하게 금지해줄 것을 요청하고 있는 것으로 알려졌다. 이는 중국이 10나노 이상급 파운드리에서 괄목할 성장을 이어가고 있어서인 것으로 풀이된다. 대만 시장조사업체 트렌드포스에 따르면 중국 파운드리 반도체 위탁생산 를 대표하는 SMIC 화훙 넥스칩의 시장점유율 합계는 올해 1분기 처음으로 10%를 넘어섰다. 이들 3개사의 매출 합계는 33억2900만 달러에 이른다. 최근 국제반도체장비재료협회 SEMI 에 따르면 해외 반도체 생산장비 업체에 대한 중국의 장비 주문은 지난해에만 전년 대비 58% 증가하며 2년 연속 글로벌 1위를 기록했다. 블룸버그는 이 같은 중국의 반도체 자급화 움직임에 미국의 제재가 오히려 중국 반도체의 약진을 도왔다 고 언급하기도 했다.\n", + "\n", + "### 답변: 5일 그레이브스 미국 상무부 부장관이 5월 말부터 지난달 초까지 네덜란드와 벨기에를 방문했을 당시 공급망 이슈를 논의하며 중국 수출 문제를 언급했고 네덜란드의 대표적 반도체 장비 업체인 ASML에게 EUV 극자외선 노광장비에 이어 구형 장비인 DUV 심자외선 노광장비에 대해서도 중국 판매 금지를 요구한 것으로 전해지며, 그간의 고강도 제재에도 불구하고 중국의 반도체 굴기 가 오히려 더 속도를 내자 추가 압박을 가하는 것으로 분석된다.<|endoftext|>\n", + "93 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 서울 연합뉴스 박동주 기자 3일 서울의 한 재래시장. 이번 주 발표되는 6월 소비자물가 상승률이 6%대를 넘을 수 있다는 관측이 나온다. 전기·가스요금이 인상되고 추석 9월 10일 성수품 수요가 몰리는 7∼8월에는 물가 상승률이 더 높아질 가능성이 크다. 기저효과를 고려하면 후반기에는 물가 오름세가 다소 완화될 수 있다는 기대가 있지만 공공요금 상승과 러시아·우크라이나 전쟁 장기화 높은 기대인플레이션율 임금 상승 압력 등 물가 상승 요인이 산적해 있어 예단하기 어려운 상황이다.\n", + "\n", + "### 답변: 이요금 상승, 러시아·우크라이나 전쟁 장기화 높은 기대인플레이션율 임금 상승 압력 등 물가 상승 요인이 산적해 있어 예단하기 어려운 상황인데, 이번 주 발표되는 6월 소비자물가 상승률이 6%대를 넘을 수 있다는 관측이 나온다.<|endoftext|>\n", + "94 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 장 그루넨워드 퓨리나 AOA CEO 인터뷰 전세계 75개국과 함께하는 네슬레 퓨리나 반려동물도 가족’ 펫휴머니제이션 확산에 프로플랜 등 영양·면역까지 챙긴 제품 내놔 지속가능성·반려동물 복지 최우선 과제 재활용 포장재 등 2050년까지 탄소배출 ‘0’ 최근 MZ 세대를 중심으로 미닝아웃 트렌드가 빠르게 확산되고 있다. 미닝아웃은 신념을 뜻하는 미닝 과 자신의 정체성을 드러냄을 의미하는 커밍아웃 의 합성어다. 자신의 신념과 가치를 드러내는 소비활동으로 윤리적 소비의 일종이다. 미닝아웃 트렌드의 확산에 따라 기업의 사회적 책임을 요구하는 목소리 역시 커지고 있다. 이를 반영해 기업들도 착한 제품 을 개발해 연일 내놓고있다. 반려동물업계도 이러한 트렌드를 따라가고 있다. 특히 국내에서는 반려인구 1500만 시대를 맞아 양적 성장에서 질적 변화를 위한 시도들이 이어지고 있다. 지속가능한 미래를 위해 반려동물 업계는 재활용 포장재 사용 사료 업사이클링 반려동물 용품 등 다양한 친환경 제품들이 출시하고 있다. 세계적인 반려동물 식품기업 네슬레 퓨리나도 이러한 시장 변화에 맞춰 움직이고 있다. 자신의 신념과 가치를 드러내는 소비활동이 늘어나는 지금 네슬레 퓨리나는 어떤 방향으로 움직이고 있는지 아시아·오세아니아·아프리카 AOA 지역 최고경영자 CEO 인 장 그루넨워드 Jean Grunenwald·사진 의 이야기를 들어봤다. 그루넨워드 CEO는 펫산업계의 미래 키워드로 기업의 사회적 책임감 을 꼽으며 바로 오늘이 반려인과 반려동물 그리고 지구가 공존할 수 있는 지속가능한 시스템이 필요한 때 라고 강조했다. 다음은 그루넨워드 CEO와의 일문일답. ―네슬레 퓨리나는 어느 나라에 진출해 있는가. 국가별로 집중하는 전략과 제품이 다른지. 한국과 일본을 포함해 약 75개 국가에 진출해 있다. 우리의 전략은 제품을 이용하는 소비자들의 반려동물이 건강하고 오랜 시간 행복한 삶을 영위할 수 있도록 돕는 것이다. 역사적으로 펫케어 분야는 미국과 유럽 지역에서 먼저 발달했다. 반면 아시아는 앞으로 발전할 기회가 더 많다. ―코로나19가 반려동물 산업에 미친 영향은 무엇인가. 코로나19에 따른 재택근무 증가로 인해 반려동물을 삶에 들일 수 있는 환경이 조성됐다. 네슬레 퓨리나는 다양한 연구를 통해 사람이 반려동물과 함께 하는 것이 더 좋다는 것을 이야기해 왔다. 네슬레 퓨리나가 진행한 반려동물과 인간간 유대감 연구는 반려동물이 사회적 포용성을 촉진하고 외로움을 완화한다는 것을 보여줬다. 팬데믹 이후 맞춤형 영양 제품인 프로플랜과 퓨리나원의 면역력 증진용 제품 수요도 증가한 것으로 나타났다. ―미래 반려동물 산업은 어떻게 변화할 것이라 생각하는가. 반려동물 산업은 꾸준히 성장할 것이다. 펫 휴머니제이션 의 가속화에 따라 MZ세대를 비롯한 새로운 세대의 반려인들은 반려동물의 건강과 지속가능성 상호작용에 더 주의를 기울일 것으로 생각된다. 소비자들은 지속가능성을 검증하기 위해 더 많은 사료 제품을 검토하고 있다. 또 원료와 원료 공급의 투명성에 대한 기대를 품고 있다. 전세계 천연자원이 감소하면서 지속적으로 대체 자원을 찾는 노력이 필요해지고 있는 상황이다. 우리 데이터에 따르면 최근 소비자들 사이에서 대체식품과 대체단백질에 대한 선호도가 증가하고 있다. 퓨리나는 이러한 부분들을 고려하고 반영해 펫푸드 분야에서 지속적인 혁신을 이어 나갈 계획이다. 네슬레 퓨리나의 스마트 연계형 사료 용기 CHEKR ―글로벌 펫 시장의 주요 트렌드는 무엇인가. 특히 관심 가는 부분이 있다면. 반려동물이 중요한 가족 구성원으로 인식되고 있는 만큼 △반려동물이 섭취하는 음식 △건강 문제 △반려인의 경험과 같은 펫케어 부분이 트렌드를 주도할 것이다. 기술적인 관점에서 △오믹스 omics 기술 △빅데이터 △예측 지능의 사용과 △분자 영양학에 대해 집중 연구가 식품영양학을 빠르게 발전하게 했다. 그리고 △활력징후 관찰 △반려동물의 마이크로바이옴 분석 △고양이 배변 상태 분석과 같은 건강 필요에 맞춘 반려동물 기기들이 증가하는 추세다. 모두 반려동물들이 더 오래 더 건강하게 사는데 도움을 주고 있다. 반려인을 도와주는 기술의 한 가지 예시로 네슬레 퓨리나 펫케어 호주가 지난해 론칭한 스마트사료 용기인 체커 CHEKR 를 소개하고 싶다. 앱과 연동이 가능한 체커엔 벼룩 예방을 비롯 반려동물 치료 알림 기능이 내장됐다. 반려인들이 반려동물의 건강을 손쉽게 관리할 수 있도록 도움을 준다. ―네슬레 퓨리나가 주목하고 있는 펫푸드 트렌드가 있다면. 대부분의 반려인들은 제품을 구입시 각각 다른 특성의 사료를 찾는다. 네슬레 퓨리나의 포트폴리오는 반려동물에게 요리식 식사 경험부터 특정 영양분이 필요한 반려동물을 위한 수의사의 처방 식단에 이르기까지 다양하다. 반려동물을 사람처럼 대하는 펫 휴머니제이션의 시대의 영향으로 반려동물을 만족시킬 수 있는 고급 펫푸드 제품 시장이 성장하고 있다. 또한 반려동물이 더 오래 그리고 건강하게 삶을 살 수 있도록 건강학적 이점이 입증된 영양학적 솔루션에 대한 수요도 증가하고 있다. ―네슬레 퓨리나는 성장을 위해 어떤 면에 집중하고 있는가. 우리의 기본은 반려동물 제품을 생산하는 회사다. 항상 최고의 품질과 안전 기준을 갖춘 회사가 되고자 노력하고 있다. 또 건강과 맛 그리고 영양을 모두 챙긴 사료를 제공하기 위해 노력 중이다. 반려동물 복지가 네슬레 퓨리나의 최우선 관심사이자 과제다. 소비자들은 기업에게 투명성 정보공개 을 요구하고 있다. 자신의 구매 결정이 환경에 미칠 영향과 동물 복지 측면에 소비자들의 관심이 높아지고 있다. 그래서 지속가능성을 강조하고 있다. ―지속가능성을 위해 네슬레 퓨리나가는 어떤 노력을 하는지. 네슬레 퓨리나는 2030년까지 온실가스 배출량을 절반으로 줄이고 2050년까지 순배출 제로 0 에 도달하는 순배출 제로 와 2025년까지 포장재의 100%를 재활용 또는 새 플라스틱 사용을 3분의 1까지 줄이는 지속가능한 포장 2025년까지 지속 가능한 방법으로 모든 반려동물 사료의 재료를 조달할 것을 보장하는 지속가능한 소싱 공장 전체의 연간 물 사용량 감소를 목표로 하는 수자원 보호 등 4가지 분야에 힘쓰고 있다. 현재까지 포장재의 29.6%를 재활용 또는 재사용이 가능한 재질로 도입해 생산 중이며 올해까지는 포장재의 69%를 재활용 또는 재사용이 가능한 재질로 전환하는 것을 목표로 하고 있다.\n", + "\n", + "### 답변: 반 MZ 세대를 중심으로 신념과 가치를 드러내는 소비활동인 미닝아웃(신념을 뜻하는 미닝과 자신의 정체성을 드러냄을 의미하는 커밍아웃의 합성어)이 빠르게 확산되고 있으며 자신의 신념과 가치를 드러내는 소비활동이 늘어나는 지금 네슬레 퓨리나는 어떤 방향으로 움직이고 있는지 아시아·오세아니아·아프리카 AOA 지역 최고경영자 CEO 인 장 그루넨워드 Jean Grunenwald·사진 의 이야기를 들어봤다.<|endoftext|>\n", + "95 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 올해 연말 종료될 예정이었던 전기차와 수소차의 고속도로 통행료 감면 제도가 2년 연장됩니다. 국토교통부는 이 같은 내용이 담긴 유료도로법 시행령 개정안을 다음 달 11일까지 입법 예고한다고 밝혔습니다. 정부는 지난 2017년부터 미세먼지 저감과 친환경차 보급을 위해 전기차와 수소차의 고속도로 통행료를 절반 깎아주고 있습니다. 국토부는 또 밤 9시부터 다음 날 아침 6시까지 사업용 화물차와 건설기계의 통행료를 30∼50% 감면해주는 제도도 유가 상승으로 어려움을 겪는 화물업계를 지원하기 위해 연장했습니다.\n", + "\n", + "### 답변: 국차년 연말 종료 예정이었던 전기차와 수소차의 고속도로 통행료 감면 제도가 2년 연장되어 올해 연말 종료될 예정 이었던 전기차와 수소차의 고속도로 통행료 감면 제도가 올해 연말 종료 되며, 국토교통부는 이 같은 내용이 담긴 유료도로법 시행령 개정안을 다음 달 11일까지 입법 예고한다고 밝혔다.<|endoftext|>\n", + "96 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 사진 나이벡 펩타이드 융합 바이오 전문기업 나이벡 주가가 강세다. 4일 오후 1시10분 나이벡은 전 거래일 대비 700원 3.08% 오른 2만3400원에 거래되고 있다. 이날 나이벡은 펩타이드 기반 조직재생 바이오 소재 가 하반기 본격적인 임상에 진입할 계획이라고 밝혔다. 이번 임상은 4차 혁명 및 미래의료 선도과제 를 골자로 하는 범부처사업단 범부처 전주기 의료기기 연구개발 사업단 과 1·2차에 이어 3차년도 협약에 선정된 결과다. 나이벡은 50억원 규모의 정부출연금을 지원받아 서울대 치과병원 한국광기술연구원과 함께 조직재생 기능성 바이오 소재에 대한 연구개발을 진행해 왔다. 나이벡 관계자는 범부처사업단으로부터 3차년도 협약에 성공하지 못한 기업들도 상당하기 때문에 이번 조직재생 바이오 소재에 대한 3차년도 협약성공은 기술이전을 비롯한 제품 상용화에 있어 큰 의미가 있다 며 이미 글로벌 판매처로부터 기술이전을 비롯한 구매의사 확인을 받은 상태로 올해 하반기 임상 시험에 진입해 빠른 상용화를 위해 노력하겠다 고 말했다.\n", + "\n", + "### 답변: 펩타이드 기반 조직재생 바이오 소재가 하반기 본격적인 임상에 진입할 계획이라고 밝히자 펩타이드 융합 바이오 전문기업 나이벡의 주가가 강세여서 4일 오후 1시10분 나이벡은 전 거래일 대비 700원 3.08% 오른 2만3400원에 거래되고 있다.<|endoftext|>\n", + "97 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 앵커 코로나19 장기화로 가장 타격을 입은 분들이 바로 소상공인들이죠. 줄어든 매출을 회복하고 경영 환경을 개선해보려 해도 기반이 부족하다보니 어려움이 따르는 경우가 많습니다. 최근엔 소상공인들이 빅데이터와 SNS 등을 활용해 디지털 전환에 나서고 있다고 하는데요. 신현욱 기자가 취재했습니다. 리포트 서울의 한 아파트 단지 앞 호두과자 가게. 가게 주변의 유동인구 등 각종 자료를 바탕으로 상권을 분석해 봤습니다. 박수현 한국외대 경영학과 데이터를 봐도 퇴근 시간대에 2030 여성분들이 많이 지나가셔서. 그리고 저희가 현장조사 통해서도 혼자 많이 찾아서 오시는 분들이 많으셨는데... 그 결과를 바탕으로 제품을 소포장으로 바꾸고 개점 시간도 앞당기자 매출이 늘었습니다. 장 호 호두과자 가게 사장 영업시간을 당기면 어떻겠느냐 해서 여덟 시 반으로 당겼는데 의외로 출근하시는 분들이 많이 들러서... 이 상권 분석 플랫폼은 전국을 대상으로 한 무료 서비스인데 자료도 매일 갱신됩니다. 이종헌 KT 잘나가게 담당 상무 철저하게 소상공인한테 필요한 상권 입장에서 가장 적합한 것들을 저희가 이 플랫폼에 담으려고 기획을 했고요. 오늘 바나나 한 송이 천 원 드리고... 수십 년간 한 자리에서 장사를 이어온 전통시장 상인들. 갈수록 치열해지는 온라인 마케팅 적응이 쉽지 않습니다. 김수자 상인 온라인에 모르는 게 너무 많았어요. 이럴 때 전문가가 누군가가 좀 나를 도와줬으면 내가 이렇게 저렇게 치고 나갈텐데 하는 아쉬움이 많았어요. 이런 상인들에게도 최근 새로운 창구가 생겼습니다. 모바일 SNS를 통해 쉽게 홍보할 수 있는 채널 을 개설해 고객과 소통할 수 있게 된 겁니다. 육심나 카카오 ESG 사업실장 상인과 고객을 단골 개념으로 묶는 방법에 대해서 고민을 했습니다. 오늘 싸게 팔아요 그런 정보로 다가간다면 고객들한테도 되게 좋은 정보인 거고... 디지털 기술에 대한 소상공인들의 수요가 커지는 만큼 좀 더 체계적인 정부 지원이 필요하다는 지적이 나오고 있습니다. KBS 뉴스 신현욱입니다.\n", + "\n", + "### 답변: 최근로 소상공인들이 빅데이터와 SNS 등을 활용해 디지털 전환에 나서고 있지만 기반이 부족하다보니 어려움이 따르는 경우가 많아 디지털 기술에 대한 소상공인들의 수요가 커지는 만큼 좀 더 체계적인 정부 지원이 필요하다는 지적이 나오고 있다.<|endoftext|>\n", + "98 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 구미 사업장에 2023년까지 총 1조4000억원 투자 투자금 FC BGA와 카메라모듈 생산시설 구축에 활용 LG이노텍 구미사업장 전경 LG이노텍이 반도체기판 FC BGA 및 카메라모듈 생산기지 확대에 나선다. LG이노텍은 6일 구미시청에서 경상북도 및 구미시와 1조4000억원 규모의 투자협약 MOU 을 체결했다고 밝혔다. LG이노텍은 연면적 약 23만㎡에 달하는 구미 4공장 구 LG전자 A3 공장 인수를 포함해 구미 사업장에 2023년까지 총 1조4000억원을 투자한다. 투자금액은 FC BGA와 카메라모듈 생산을 위한 제조시설 구축에 쓰인다. LG이노텍은 내년 양산을 목표로 구미 4공장에 FC BGA 신규 생산라인을 구축해 나갈 방침이다. 지난 2월 시장 진출을 공식화한 FC BGA는 LG이노텍이 미래 성장동력으로 육성하는 분야다. FC BGA는 PC 서버 네트워크 등의 반도체칩을 메인기판과 연결해주는 반도체용 기판으로 글로벌 수요가 급증하는데 비해 기술력을 보유한 업체가 적어 공급 부족 현상이 지속되고 있다. 카메라모듈 생산시설 확대로 스마트폰용 카메라모듈 세계 1위 입지도 더욱 확고히 할 수 있게됐다. 카메라모듈은 LG이노텍의 매출을 이끄는 대표 사업분야다. 카메라모듈을 생산하는 광학솔루션사업부 매출은 지난해 기준 11조8000억원에 달한다. 특히 지난해에는 전년 대비 매출이 68%가량 늘었다. 6일 구미시청에서 LG이노텍이 경상북도 및 구미시와 투자 협약 MOU 을 체결했다. LG이노텍은 구미 4공장 인수를 포함해 구미 사업장에 2023년까지 총 1.4조원을 투자할 계획이다. 사진 왼쪽부터 이철우 경상북도 도지사 정철동 LG이노텍 사장 김장호 구미시장 LG이노텍은 기존에 운영중인 구미 1A 1 2 3공장에 이어 구미 4공장을 추가로 확보하며 총 5개 공장을 갖추게 됐다. LG이노텍 구미 사업장은 총 대지면적이 약 37만㎡로 축구장 52개를 합한 규모다. 이번 구미 투자로 인한 직·간접 고용 창출 효과는 총 1000여명에 이를 것으로 예상된다. 정철동 사장은 “이번 투자는 LG이노텍과 구미 지역사회 협력회사들이 동반성장 할 수 있는 좋은 기회”라며 “고객경험 혁신을 위한 적극적인 투자를 이어 나갈 것”이라고 말했다.\n", + "\n", + "### 답변: LG이노텍은 6일 구미시청에서 경상북도 및 구미시와 1조4000억원 규모의 투자협약 MOU 을 체결하여 구미 4공장 구 LG전자 A3 공장 인수를 포함해 구미 사업장에 2023년까지 총 1조4000억원을 투자하여 FC BGA 및 카메라모듈 생산기지 확대에 나선다.<|endoftext|>\n", + "99 ### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 산업부·조달청 정책설명회 정부가 중견기업을 우리 산업의 새로운 성장 엔진으로 육성하기 위해 이들이 생산하는 제품을 공공조달을 통해 적극적으로 활용·육성하기로 했다. 중견기업은 우리나라 전체 공공조달 계약 규모 184조원 중 26조3000억원을 담당하고 있다. 산업통상자원부는 조달청과 함께 1일 서울 마포구 한국중견기업연합회에서 중견기업을 대상으로 공공조달 정책설명회를 개최하고 중견기업 제품의 공공조달 강화방안을 논의했다고 밝혔다. 이날 설명회는 중견기업 지원에 대한 정부인식 제고를 위해 마련된 가운데 조달청은 새 정부의 공공조달 정책방향을 설명했고 참석자들은 중견기업의 공공조달 관련 애로 및 건의 사항을 전달했다. 이종욱 조달청장은 “중견기업은 공공조달 시장 전체 기업 수의 0.7% 3487개 에 불과하지만 우리나라 전체 공공조달 계약 규모 184조원 중 26조3000억원을 담당한다”며 “중견기업이 공공조달 시장에 보다 활발하게 참여하고 국내를 넘어 해외조달시장으로 뻗어나갈 수 있도록 다각적인 지원방안을 강구하겠다”고 말했다. 장영진 사진 산업부 제1차관은 “우리 경제 역동성·활력을 제고하기 위해서는 기업 성장사다리의 핵심 연결고리인 중견기업에 대한 정부 지원체계 강화가 필수적”이라며 “이번 설명회를 시작으로 향후 중견기업계의 주요 애로사항과 관련된 부처를 대상으로 지속적인 소통을 하겠다”고 말했다.\n", + "\n", + "### 답변: 우리통상자원부는 조달청과 함께 1일 서울 마포구 한국중견기업연합회에서 중견기업을 대상으로 공공조달 정책설명회를 개최해 새 정부의 공공조달 정책방향과 중견기업 제품의 공공조달 강화방안을 논의하며 공공조달을 통해 이들이 생산하는 제품을 공공조달을 통해 적극적으로 활용·육성하기로 했다.<|endoftext|>\n" + ] + } + ], + "source": [ + "# Input 길이가 2048이 넘어가는 경우 학습 불가로 인하여, 학습 전 제거. \n", + "\n", + "data = data.filter(lambda example: len(example[\"input_ids\"]) < 2048)\n", + "\n", + "for i in range(100):\n", + " print(i, data[\"test\"][i][\"text\"])" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "jq0nX33BmfaC", + "outputId": "769fb34e-acd0-4a56-ac87-40db98dabd78" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "You're using a PreTrainedTokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [516/516 5:11:23, Epoch 2/3]\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", + " \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", + " \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", + " \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", + "
StepTraining Loss
102.372900
202.249000
302.107000
402.034100
501.989500
601.953400
701.948200
801.931200
901.917500
1001.921800
1101.895100
1201.918200
1301.904900
1401.908600
1501.880800
1601.874100
1701.879600
1801.866000
1901.888700
2001.891400
2101.880900
2201.877300
2301.848600
2401.868000
2501.868100
2601.877400
2701.851400
2801.870900
2901.841700
3001.842600
3101.854100
3201.848900
3301.813400
3401.846400
3501.822300
3601.840500
3701.834100
3801.823900
3901.846800
4001.822000
4101.833300
4201.840500
4301.838600
4401.845300
4501.835700
4601.820300
4701.841800
4801.821800
4901.817700
5001.832700
5101.840500

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "TrainOutput(global_step=516, training_loss=1.8909196299175883, metrics={'train_runtime': 18719.1001, 'train_samples_per_second': 3.529, 'train_steps_per_second': 0.028, 'total_flos': 2.4312553714640486e+17, 'train_loss': 1.8909196299175883, 'epoch': 3.0})" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import transformers\n", + "\n", + "# needed for gpt-neo-x tokenizer\n", + "tokenizer.pad_token = tokenizer.eos_token\n", + "\n", + "# For LLaMA\n", + "# tokenizer.pad_token_id = (\n", + "# 0 # unk. we want this to be different from the eos token\n", + "# )\n", + "\n", + "trainer = transformers.Trainer(\n", + " model=model,\n", + " train_dataset=data[\"train\"],\n", + " args=transformers.TrainingArguments(\n", + " per_device_train_batch_size=4,\n", + " gradient_accumulation_steps=32,\n", + " # warmup_steps=200,\n", + " # max_steps=500, ## 초소형만 학습: 10 step = 20개 샘플만 학습.\n", + " learning_rate=2e-4,\n", + " fp16=True,\n", + " logging_steps=10,\n", + " save_total_limit=3,\n", + " output_dir=\"outputs\",\n", + " optim=\"paged_adamw_8bit\"\n", + " ),\n", + " data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),\n", + ")\n", + "model.config.use_cache = False # silence the warnings. Please re-enable for inference!\n", + "trainer.train()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "TvP11yUbhzWP", + "outputId": "96eb0cfe-e22f-4642-9fba-796942c62540" + }, + "outputs": [], + "source": [ + "trainer.save_model(\"polyglot-ko_1.3b_news_3ep\")" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": { + "id": "a-jauOEv9XVe" + }, + "outputs": [], + "source": [ + "model.eval()\n", + "model.config.use_cache = True # silence the warnings. Please re-enable for inference!" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "r4ITTiXfp-2r", + "outputId": "e6376ea8-f293-4ca4-f9f3-13f231f5de07" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/lib/python3.8/site-packages/transformers/generation/utils.py:1264: UserWarning: You have modified the pretrained model configuration to control generation. This is a deprecated strategy to control generation and will be removed soon, in a future version. Please use a generation configuration file (see https://huggingface.co/docs/transformers/main_classes/text_generation )\n", + " warnings.warn(\n", + "/opt/conda/lib/python3.8/site-packages/transformers/generation/utils.py:1363: UserWarning: Using `max_length`'s default (20) to control the generation length. This behaviour is deprecated and will be removed from the config in v5 of Transformers -- we recommend using `max_new_tokens` to control the maximum length of the generation.\n", + " warnings.warn(\n", + "Input length of input_ids is 20, but `max_length` is set to 20. This can lead to unexpected behavior. You should consider increasing `max_new_tokens`.\n", + "/opt/conda/lib/python3.8/site-packages/transformers/generation/utils.py:1462: UserWarning: You are calling .generate() with the `input_ids` being on a device type different than your model's device. `input_ids` is on cpu, whereas the model is on cuda. You may experience unexpected behaviors or slower generation. Please make sure that you have put `input_ids` to the correct device by calling for example input_ids = input_ids.to('cuda') before running `.generate()`.\n", + " warnings.warn(\n", + "/opt/conda/lib/python3.8/site-packages/torch/utils/checkpoint.py:31: UserWarning: None of the inputs have requires_grad=True. Gradients will be None\n", + " warnings.warn(\"None of the inputs have requires_grad=True. Gradients will be None\")\n" + ] + }, + { + "data": { + "text/plain": [ + "tensor([[ 0, 835, 29871, 239, 170, 139, 31406, 29901, 29871, 31346,\n", + " 238, 141, 155, 29871, 238, 133, 163, 31781, 31081, 29973,\n", + " 29871]])" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "model.generate(**tokenizer(\"### 질문: 오늘 날씨는?\", return_tensors='pt', return_token_type_ids=False))" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "id": "oDp9W-Gmp5Mb" + }, + "outputs": [], + "source": [ + "def gen(contents):\n", + " gened = model.generate(\n", + " **tokenizer(\n", + " f\"\"\"### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: {contents}\n", + "\n", + "### 답변:\"\"\",\n", + " return_tensors='pt',\n", + " return_token_type_ids=False\n", + " ),\n", + " max_new_tokens=256,\n", + " early_stopping=True,\n", + " do_sample=True,\n", + " eos_token_id=2,\n", + " no_repeat_ngram_size=8,\n", + " top_k=50,\n", + " top_p=0.98,\n", + " # temperature=0.,\n", + " )\n", + " print(tokenizer.decode(gened[0]))" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 128 + }, + "id": "iIbK1GaipZd9", + "outputId": "46537a15-3bce-4959-860a-80706a8b3693" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "### 질문: 아래의 문서를 요약해줘.\n", + "\n", + "###맥락: 삼성전자 2분기 잠정실적 발표 영업익 6천억원 예상치 웃돌아 HBM·DDR5 등 고사양 반도체 판매 호조에 DS부문 적자줄어 감산효과 본격화되는 하반기에 가격정상화·반등 본격화 예상삼성전자 서초사옥. 7일 삼성전자가 공개한 올해 2분기 잠정실적은 2008년 금융위기 이후 가장 저조했지만 시장에서는 “반도체 바닥을 확인했다”는 평가가 많았다. 업계는 올해 2분기가 시작되는 4월까지만 해도 2분기 실적이 1분기보다 대폭 악화될 것이라는 예상을 내놓았다. 특히 삼성전자가 메모리반도체 감산을 선언했음에도 반도체 가격 하락세가 이어졌고 이에 따라 수익성도 악화될 것으로 예측됐다. 1분기 실적을 뒷받침했던 갤럭시 S23 신제품 효과까지 둔화되면서 시장에서는 적자전환 가능성까지 점치는 분위기였다. 그러나 뚜껑이 열리자 “최악은 면했다”는 반응이 나왔다. 올해 2분기 삼성전자는 전분기와 비슷한 실적을 냈지만 시장 전망치를 크게 웃돌았다. 금융정보업체 에프앤가이드가 집계한 실적 컨센서스는 매출 61조8593억원, 영업이익 2818억원이었다. 영업이익이 증권사 예상치를 2배 이상 웃돈 것이다.잠정실적에 사업부별 수치는 나오지 않지만, 반도체 사업을 담당하는 디바이스솔루션 부문이 4조원대 적자를 냈을 것으로 추정된다. 메리츠증권은 삼성전자 DS부문이 4조2000억원대 적자를 기록한 것으로 분석했다. 대신 디스플레이, 모바일·네트워크, TV·생활가전 등 부문의 흑자가 DS부문의 적자폭을 메웠다는 것이 메리츠증권의 예측이다. 하만 등 기타부문에서도 3000억원 안팎의 영업이익을 예상했다. 눈에 띄는 부분은 DS부문의 적자규모가 예상을 밑돌았다는 점이다. 2분기 DS부문의 영업손실은 1분기에 비해 개선됐을 것으로 추정된다. ‘주력’으로 꼽히는 메모리반도체 부문에서는 3조원대 후반대 적자를 낸 것으로 파악된다. 생성형 인공지능 열풍으로 AI 서버 수요가 늘면서 더블데이터레이트5와 고대역폭메모리 등 고사양 제품 판매가 늘면서 적자 규모를 줄였을 것으로 추정된다. 또 적자제품 판매를 축소한 것도 영향을 미쳤다는 시각이다. 김동원 KB증권 연구원은 “2분기 D램 출하량이 전분기보다 20% 증가해 예상보다 빠르게 원가구조가 개선됐다”고 했다. 다만 시스템반도체와 파운드리 사업의 실적 부진은 이어지는 상황이다. 시장에서는 하반기에 대한 기대감도 커지고 있다. 삼성전자의 감산효과가 본격화되는 3분기부터 재고가 감소하면서 수익성이 개선될 것이라는 예상이다. 그동안 삼성전자는 쌓여있는 재고로 재고자산평가손실이 커져 수익성이 악화됐다.특히 삼성전자는 올해 3분기부터 감산규모를 최대 25% 수준까지 확대할 계획이다. 이에 따라 메모리 반도체 가격 또한 상승세를 탈 것으로 전망된다. 한동희 SK증권 연구원은 “감산 효과가 본격화되면서 출하가 이미 저점을 지나고 있다”며 “가격 반등을 모색할 수 있는 구간”이라고 내다봤다. 시장조사업체 트렌드포스는 감산효과로 올 3분기 D램 평균판매가격이 전분기보다 0~5% 하락할 것으로 예상했다. 전 분기 대비 가격 하락폭 전망치가 13~18%이었던 2분기와 비교하면 가격 하락세가 완만해질 것이라는 전망이다. 트렌드포스는 “D램 공급업체의 지속적인 감산으로 전체 D램 공급이 점차 줄고 있다”고 진단했다. 인공지능 열풍으로 HBM 등 고사양 제품 수요가 폭발적으로 늘어나고 있다는 부분도 시장 반등 기대감을 키우고 있다. 경계현 DS부문장은 최근 임직원에게 “삼성 HBM제품 시장 점유율이 여전히 50% 이상”이라며 “HBM3와 HBM3P가 내년 DS부문 이익 증가에 기여할 것”이라고 언급했다. 노근창 현대차증권 연구원은 “삼성전자는 연내 HBM3를 공급하고 기존 라인을 HBM라인으로 바꾸고 있다”고 설명했다. 최근 DS부문 적자 속에서 삼성전자는 HBM 등 분야에서의 경쟁력을 키우기 위해 인사 또한 단행한 상태다. 삼성전자는 HBM 분야를 책임지는 D램 개발실장을 교체하는 강수를 뒀다. 김동원 연구원은 “D램과 파운드리 부문 개발 총책임자 교체라는 ‘핀셋 인사’로 경쟁력 제고가 기대된다”고 분석했다.\n", + "\n", + "### 답변: 6삼성전자는 메모리반도체 감산을 선언한 상황에서 2분기 실적은 전분기 대비 대폭 개선되었는데 삼성전자가 메모리반도체 감산을 선언했음에 따라 2분기가 시작되는 4달까지는 적자전환 가능성이 있었지만 뚜껑이 열리자 “최악을 면했다”는 반응이 나와 “올해 2분기가 시작되는 4윌까지만 해도 2분기 실적이 전분기보다 대폭 악화될 것이”라고 했고 하지만 뚜껑이 열리자 “최악은 면하게 됐다”고 진단했다.\n", + "\n", + "7일 삼성전자가 공개한 올해 2Q 잠정실적은 2008년 금융위기이후 최악이었지만 시장에서는 “반도체 바닥 확인했다”는 평이 나오면서 증권가에서는 “하반기가 시작되는 4월까만 해도 2분기 실적이 1분기에 비해 대폭 악화될 것이라는 예상이 많았지만 뚜껑이 열리자 “최악은 모면했다”는 반응이 나왔습니다. 삼성전자는 올해 2분기에 전분기보다 소폭 개선됐지만 시장 전망치를 크게 웃돈 것이고 올해 2분기 삼성전자의 영업손실은 전분기보다 악화됐을 것으로 추정됩니다. 이에 따라 삼성전자는 메모리반도체 감산을 선언함에도 메모리\n" + ] + } + ], + "source": [ + "gen('''삼성전자 2분기 잠정실적 발표 영업익 6천억원 예상치 웃돌아 HBM·DDR5 등 고사양 반도체 판매 호조에 DS부문 적자줄어 감산효과 본격화되는 하반기에 가격정상화·반등 본격화 예상삼성전자 서초사옥. 7일 삼성전자가 공개한 올해 2분기 잠정실적은 2008년 금융위기 이후 가장 저조했지만 시장에서는 “반도체 바닥을 확인했다”는 평가가 많았다. 업계는 올해 2분기가 시작되는 4월까지만 해도 2분기 실적이 1분기보다 대폭 악화될 것이라는 예상을 내놓았다. 특히 삼성전자가 메모리반도체 감산을 선언했음에도 반도체 가격 하락세가 이어졌고 이에 따라 수익성도 악화될 것으로 예측됐다. 1분기 실적을 뒷받침했던 갤럭시 S23 신제품 효과까지 둔화되면서 시장에서는 적자전환 가능성까지 점치는 분위기였다. 그러나 뚜껑이 열리자 “최악은 면했다”는 반응이 나왔다. 올해 2분기 삼성전자는 전분기와 비슷한 실적을 냈지만 시장 전망치를 크게 웃돌았다. 금융정보업체 에프앤가이드가 집계한 실적 컨센서스는 매출 61조8593억원, 영업이익 2818억원이었다. 영업이익이 증권사 예상치를 2배 이상 웃돈 것이다.잠정실적에 사업부별 수치는 나오지 않지만, 반도체 사업을 담당하는 디바이스솔루션 부문이 4조원대 적자를 냈을 것으로 추정된다. 메리츠증권은 삼성전자 DS부문이 4조2000억원대 적자를 기록한 것으로 분석했다. 대신 디스플레이, 모바일·네트워크, TV·생활가전 등 부문의 흑자가 DS부문의 적자폭을 메웠다는 것이 메리츠증권의 예측이다. 하만 등 기타부문에서도 3000억원 안팎의 영업이익을 예상했다. 눈에 띄는 부분은 DS부문의 적자규모가 예상을 밑돌았다는 점이다. 2분기 DS부문의 영업손실은 1분기에 비해 개선됐을 것으로 추정된다. ‘주력’으로 꼽히는 메모리반도체 부문에서는 3조원대 후반대 적자를 낸 것으로 파악된다. 생성형 인공지능 열풍으로 AI 서버 수요가 늘면서 더블데이터레이트5와 고대역폭메모리 등 고사양 제품 판매가 늘면서 적자 규모를 줄였을 것으로 추정된다. 또 적자제품 판매를 축소한 것도 영향을 미쳤다는 시각이다. 김동원 KB증권 연구원은 “2분기 D램 출하량이 전분기보다 20% 증가해 예상보다 빠르게 원가구조가 개선됐다”고 했다. 다만 시스템반도체와 파운드리 사업의 실적 부진은 이어지는 상황이다. 시장에서는 하반기에 대한 기대감도 커지고 있다. 삼성전자의 감산효과가 본격화되는 3분기부터 재고가 감소하면서 수익성이 개선될 것이라는 예상이다. 그동안 삼성전자는 쌓여있는 재고로 재고자산평가손실이 커져 수익성이 악화됐다.특히 삼성전자는 올해 3분기부터 감산규모를 최대 25% 수준까지 확대할 계획이다. 이에 따라 메모리 반도체 가격 또한 상승세를 탈 것으로 전망된다. 한동희 SK증권 연구원은 “감산 효과가 본격화되면서 출하가 이미 저점을 지나고 있다”며 “가격 반등을 모색할 수 있는 구간”이라고 내다봤다. 시장조사업체 트렌드포스는 감산효과로 올 3분기 D램 평균판매가격이 전분기보다 0~5% 하락할 것으로 예상했다. 전 분기 대비 가격 하락폭 전망치가 13~18%이었던 2분기와 비교하면 가격 하락세가 완만해질 것이라는 전망이다. 트렌드포스는 “D램 공급업체의 지속적인 감산으로 전체 D램 공급이 점차 줄고 있다”고 진단했다. 인공지능 열풍으로 HBM 등 고사양 제품 수요가 폭발적으로 늘어나고 있다는 부분도 시장 반등 기대감을 키우고 있다. 경계현 DS부문장은 최근 임직원에게 “삼성 HBM제품 시장 점유율이 여전히 50% 이상”이라며 “HBM3와 HBM3P가 내년 DS부문 이익 증가에 기여할 것”이라고 언급했다. 노근창 현대차증권 연구원은 “삼성전자는 연내 HBM3를 공급하고 기존 라인을 HBM라인으로 바꾸고 있다”고 설명했다. 최근 DS부문 적자 속에서 삼성전자는 HBM 등 분야에서의 경쟁력을 키우기 위해 인사 또한 단행한 상태다. 삼성전자는 HBM 분야를 책임지는 D램 개발실장을 교체하는 강수를 뒀다. 김동원 연구원은 “D램과 파운드리 부문 개발 총책임자 교체라는 ‘핀셋 인사’로 경쟁력 제고가 기대된다”고 분석했다.''')" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'2.0.1+cu117'" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import torch\n", + "torch.__version__" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "machine_shape": "hm", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "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.5" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "0a91d94890634dc1bb43176347c27fec": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "278070bfaaac4794a649f11306ad2947": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_5391d6d2385549319099d3bf653c34ee", + "IPY_MODEL_ee696f00718b43989f653dd01391a87d", + "IPY_MODEL_e39e4f5284224bfdbde4359d8593d206" + ], + "layout": "IPY_MODEL_0a91d94890634dc1bb43176347c27fec" + } + }, + "3473e65596d5455385269f59e6159e38": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "388757e992344b06b2fc7e4573eba77d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "416d78e5558f4019972720c8d52a410b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5391d6d2385549319099d3bf653c34ee": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ec9d84f9337948cba5562b7e995bb2ef", + "placeholder": "​", + "style": "IPY_MODEL_3473e65596d5455385269f59e6159e38", + "value": "100%" + } + }, + "664f6a3720a446929197650580dd005d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "92e0594143bd4c2690dc3ddaa0170b17": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e39e4f5284224bfdbde4359d8593d206": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_664f6a3720a446929197650580dd005d", + "placeholder": "​", + "style": "IPY_MODEL_92e0594143bd4c2690dc3ddaa0170b17", + "value": " 1/1 [00:00<00:00, 9.41it/s]" + } + }, + "ec9d84f9337948cba5562b7e995bb2ef": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ee696f00718b43989f653dd01391a87d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_416d78e5558f4019972720c8d52a410b", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_388757e992344b06b2fc7e4573eba77d", + "value": 1 + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} From 495933bdc0a2d0c5801b9937c5a3ee003fccd04f Mon Sep 17 00:00:00 2001 From: limha Date: Fri, 21 Jul 2023 04:07:54 +0000 Subject: [PATCH 21/63] [Bug] Fix bug in preprocessing modified: sentence-sentimental/preprocess/main.py modified: sentence-sentimental/preprocess/preprocessing.py - fix remove_triangle, remove_day, remove_press, remove_photo_info - add remove_special_str --- sentence-sentimental/preprocess/main.py | 7 ++-- .../preprocess/preprocessing.py | 42 ++++++++++++++----- 2 files changed, 36 insertions(+), 13 deletions(-) diff --git a/sentence-sentimental/preprocess/main.py b/sentence-sentimental/preprocess/main.py index 2f5b679..a150a56 100644 --- a/sentence-sentimental/preprocess/main.py +++ b/sentence-sentimental/preprocess/main.py @@ -2,7 +2,8 @@ import pandas as pd if __name__ == '__main__' : - df = pd.read_csv("/opt/ml/finance_sentiment_corpus/뉴스_corpus.csv") + # df = pd.read_csv("/opt/ml/finance_sentiment_corpus/뉴스_corpus.csv") + df = pd.read_csv("/opt/ml/finance_sentiment_corpus/merged_samsung.csv") df = df[['title', 'date', 'content']] @@ -11,7 +12,7 @@ df.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_data.csv") # sentence - df_sentence = preprocess_dataframe_to_sentence(df) - df_sentence.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_sentence_data.csv") + # df_sentence = preprocess_dataframe_to_sentence(df) + # df_sentence.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_sentence_data.csv") print("완료! ml/finance_sentiment_corpus/ 에서 data를 확인해보세요!") \ No newline at end of file diff --git a/sentence-sentimental/preprocess/preprocessing.py b/sentence-sentimental/preprocess/preprocessing.py index 9e51ce3..5a24dfe 100644 --- a/sentence-sentimental/preprocess/preprocessing.py +++ b/sentence-sentimental/preprocess/preprocessing.py @@ -20,8 +20,9 @@ def remove_press(texts): """ re_patterns = [ r"\([^(]*?(뉴스|경제|일보|미디어|데일리|한겨례|타임즈|위키트리)\)", - r"[가-힣]{0,4} (기자|선임기자|수습기자|특파원|객원기자|논설고문|통신원|연구소장) =?", # 이름 + 기자 - r"[가-힣]{1,}(뉴스|경제|일보|미디어|데일리|한겨례|타임|위키트리)", # (... 연합뉴스) .. + r"[가-힣]{0,4}\s+(기자|선임기자|수습기자|특파원|객원기자|논설고문|통신원|연구소장)\s?=?", # 이름 + 기자 + # r"[가-힣]{1,}(뉴스|경제|일보|미디어|데일리|한겨례|타임|위키트리)", # (... 연합뉴스) .. + r"(\/?뉴스|news|News)\d", # (... 연합뉴스) .. r"[\(\[]\s+[\)\]]", # ( ) r"[\(\[]=\s+[\)\]]", # (= ) r"[\)\]]\s+=[\)\]]", # ( =) @@ -29,9 +30,9 @@ def remove_press(texts): preprocessed_text = '' for re_pattern in re_patterns : - text = re.sub(re_pattern, "", str(texts)) - if text : - preprocessed_text = text + texts = re.sub(re_pattern, "", str(texts)) + if texts : + preprocessed_text = texts return preprocessed_text @@ -43,7 +44,10 @@ def remove_photo_info(texts): preprocessed_text = [] preprocessed_text = re.sub(r"\(출처 ?= ?.+\) |\(사진 ?= ?.+\) |\(자료 ?= ?.+\)| \(자료사진\) |사진=.+기자 ", "", texts).strip() - preprocessed_text = re.sub(r"\/사진제공?=\S+?\s+ | \/\s사진?=", " ", preprocessed_text) + preprocessed_text = re.sub(r"\/?사진제공(=|\:)\w+", " ", preprocessed_text) + preprocessed_text = re.sub(r"\/? ?(사진|그래픽) ?= ?\w+", " ", preprocessed_text) + preprocessed_text = re.sub(r"\/\w+\s?제공", " ", preprocessed_text) + # preprocessed_text = re.sub(r"\/사진제공=\S?+?\s+ | \/\s사진?=", " ", preprocessed_text) return preprocessed_text @@ -71,13 +75,13 @@ def remove_day(texts): """ 날짜와 관련된 숫자 제거 """ - pattern = r'\d{4}\.\d{2}\.\d{2}' + pattern = r'\d{4}\.\d{1,2}\.\d{1,2}\.?' text = re.sub(pattern, "", texts) return text def remove_triangle(texts): - pattern = r'▶?\s.+=' + pattern = r'▶\s?.+=' text = re.sub(pattern, "", texts) return text @@ -141,7 +145,18 @@ def remove_url(texts): return preprocessed_text +def remove_special_str(texts) : + preprocessed_text = '' + + pattern = r"[◆◇▲▼■●▶◀△▽→←⇒⇔➜➔❯❮]" + preprocessed_text = re.sub(pattern, "", texts) + preprocessed_text = re.sub("\↑", "증가 ", texts) + + return preprocessed_text + + def all_preprocessing(texts) : + texts = str(texts) texts = remove_text(texts) texts = remove_press(texts) texts = remove_photo_info(texts) @@ -150,7 +165,7 @@ def all_preprocessing(texts) : texts = remove_day(texts) texts = remove_triangle(texts) texts = remove_parentheses(texts) - texts = remove_copyright(texts) + texts = remove_special_str(texts) texts = change_quotation(texts) @@ -182,5 +197,12 @@ def preprocess_dataframe_to_sentence(df): return df_sentence if __name__ == "__main__" : - text = '여기에 넣고 싶은 문구를 넣어서 실험해보세요.' + # text = "‘스마트싱스’ 중심의 지속 가능한 일상 전시 에너지 줄이는 비스포크 가전 라인업 선봬[이데일리 김응열 기자] 삼성전자가 29일부터 내달 1일까지 광주광역시 김대중컨벤션센터에서 열리는 ‘2023 국제IoT가전로봇박람회’에 참가해 각종 에너지 절감 기술을 적용한 가전제품 라인업과 솔루션을 대거 소개한다.삼성전자 모델이 29일부터 내달 1일까지 광주광역시 김대중컨벤션센터에서 진행되는 ‘2023국제IoT가전로봇박람회’에 마련된 삼성전자 부스에서 ‘스마트싱스 에너지 세이빙’ 솔루션을 소개하고 있다. 접목 디지털 제어 기술 △스마트싱스 기반 에너지 관리 솔루션 ’스마트싱스 에너지‘의 ’AI 절약모드‘ 등으로 추가적인 에너지 절감이 가능하다. 가령 비스포크 무풍에어컨 갤러리의 에너지 특화 모델은 1등급 최저 기준보다도 냉방 효율이 10% 더 뛰어나다. AI 절약 모드 기능을 활용하면 전력 사용량을 최대 20% 추가 절약할 수 있다.삼성전자 모델이 29일부터 내달 1일까지 광주광역시 김대중컨벤션센터에서 진행되는 ‘2023국제IoT가전로봇박람회’에 마련된 삼성전자 부스에서 스마트싱스 기반의 ‘넷 제로 홈’을 소개하고 있다. (사진=삼성전자)삼성전자는 이번 전시에서 스마트싱스 기반의 ’넷 제로 홈(Net Zero Home)‘으로 에너지 리더십도 강조한다. 넷 제로 홈에서는 태양광 패널로 생산한 에너지를 활용할뿐 아니라 스마트싱스를 이용해 가전제품이나 집안 전체 에너지 사용량을 모니터링하고 줄일 수 있다. 삼성전자는 에너지 절약을 위해 한국전력공사, 서울특별시, 나주시와 협력하는 ’주민 DR(Demand Response)‘ 서비스 사업도 함께 소개했다. 전력거래소나 지방자치단체가 DR 발령 시 자동으로 연동된 삼성전자 제품을 AI 절약 모드로 전환하거나 전원을 끄는 등 전력량을 최소화한다. 이 기능은 에어컨, 냉장고, 세탁기·건조기, 식기세척기, TV 등 총 9종의 삼성전자 가전제품과 파트너사의 스마트 기기까지 지원한다. ’지속 가능한 일상(Everyday Sustainability)‘을 주제로 한 전시 공간에서는 파트너십을 바탕으로 탄생한 자원순환 솔루션을 소개한다. △세탁 과정에서 발생하는 미세 플라스틱 배출 저감을 위해 글로벌 아웃도어 브랜드 파타고니아(Patagonia)와 협업 개발한 ’미세 플라스틱 저감 필터‘ △문승지 디자이너와 업사이클링 패션 브랜드 플리츠마마가 협업해 버려진 페트병, 자투리 원단 등으로 만든 ’제로 에디션(Zero Edition)‘ 의자와 러그 등을 전시하다. 박찬우 삼성전자 생활가전사업부 부사장은 “삼성전자 비스포크 가전은 제품 고유의 기술은 물론 AI와 사물인터넷(IoT)를 접목해 일상을 더욱 풍요롭게 하고 에너지를 절감하는 솔루션을 제시해 왔다”며 “앞으로는 손쉽게 실천할 수 있는 지속 가능 솔루션을 다양하게 선보이며 소비자들이 가치 있는 일상을 경험할 수 있도록 만드는 데에 주력할 것”이라고 말했다.삼성전자 모델이 29일부터 내달 1일까지 광주광역시 김대중컨벤션센터에서 진행되는 ‘2023국제 IoT가전로봇박람회’에 마련된 삼성전자 부스의 ‘지속 가능한 일상’ 주제의 전시 공간에서 자원순환 솔루션을 소개하고 있다. (사진=삼성전자)" + # text = "/사진제공=한화한화 건설부문은 " + # text = "윤선희 기자 =" + # text = "서울 서초구 삼성전자 서초사옥의 모습. 2023.4.7/뉴스1 News1 신웅수 기자 김정은 기자 = " + text = " ▶공매도 대기자금, 전체 증시 83조·삼전 11조 돌파 ‘역대 최대’=1일 헤럴드경제가 금융투자협회 종합통계포털을 분석한 결과 지난달 26일 기준 삼성전자 한 종목에 대한 일간 대차거래 잔액 규모는 11조2507억원에 달했다. 이는 공매도가 부분 재개된 2021년 5월 이후는 물론, 관련 통계가 집계되기 시작한 2009년 이후 가장 큰 액수다. 공매도 부분 재개 후 7조원대 이하에 머물던 삼성전자에 대한 대차거래 잔액 규모는 지난해 11월 8조원대를 돌파해 9조원선을 터치했다. 올해 첫 거래일(1월 2일) 6조7630억원 규모로 시작한 대차" + text = all_preprocessing(text) + # text = remove_day(text) + # text = remove_press(text) print(text) \ No newline at end of file From b49865610fc36ac2dc6d75e912d1dc3b4474a5c1 Mon Sep 17 00:00:00 2001 From: limha Date: Fri, 21 Jul 2023 08:18:45 +0000 Subject: [PATCH 22/63] [Feature] add metric and fix train.ipynb modified: sentence-sentimental/metrics/metrics.py - add macro-f1 modified: sentence-sentimental/train.ipynb - add another model - add feature train, validation, test dataset --- sentence-sentimental/metrics/metrics.py | 5 +- sentence-sentimental/train.ipynb | 564 +++++++++++++++++++----- 2 files changed, 445 insertions(+), 124 deletions(-) diff --git a/sentence-sentimental/metrics/metrics.py b/sentence-sentimental/metrics/metrics.py index a58d37b..83ad98a 100644 --- a/sentence-sentimental/metrics/metrics.py +++ b/sentence-sentimental/metrics/metrics.py @@ -5,6 +5,7 @@ def compute_metrics(pred): preds = pred.predictions.argmax(-1) acc = load_metric('accuracy').compute(predictions=preds, references=labels)['accuracy'] - f1 = load_metric('f1').compute(predictions=preds, references=labels, average='micro')['f1'] + micro_f1 = load_metric('f1').compute(predictions=preds, references=labels, average='micro')['f1'] + macro_f1 = load_metric('f1').compute(predictions=preds, references=labels, average='macro')['f1'] - return {'accuracy':acc, 'f1':f1} \ No newline at end of file + return {'accuracy':acc, 'micro_f1':micro_f1, 'macro_f1':macro_f1} \ No newline at end of file diff --git a/sentence-sentimental/train.ipynb b/sentence-sentimental/train.ipynb index c3e15b1..920fd92 100644 --- a/sentence-sentimental/train.ipynb +++ b/sentence-sentimental/train.ipynb @@ -9,7 +9,7 @@ "name": "stderr", "output_type": "stream", "text": [ - "/opt/conda/envs/final/lib/python3.10/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + "/opt/conda/envs/final/lib/python3.8/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n" ] } @@ -63,17 +63,6 @@ "#### 모델 및 토크나이저" ] }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "MODEL_NAME = 'klue/roberta-large'\n", - "model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device)\n", - "tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)" - ] - }, { "cell_type": "code", "execution_count": 3, @@ -83,21 +72,32 @@ "name": "stderr", "output_type": "stream", "text": [ - "Some weights of the model checkpoint at team-lucid/deberta-v3-base-korean were not used when initializing DebertaV2ForSequenceClassification: ['mask_predictions.LayerNorm.bias', 'mask_predictions.classifier.weight', 'mask_predictions.dense.weight', 'mask_predictions.classifier.bias', 'mask_predictions.dense.bias', 'mask_predictions.LayerNorm.weight']\n", - "- This IS expected if you are initializing DebertaV2ForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n", - "- This IS NOT expected if you are initializing DebertaV2ForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n", - "Some weights of DebertaV2ForSequenceClassification were not initialized from the model checkpoint at team-lucid/deberta-v3-base-korean and are newly initialized: ['classifier.weight', 'classifier.bias', 'pooler.dense.weight', 'pooler.dense.bias']\n", + "Some weights of the model checkpoint at klue/roberta-large were not used when initializing RobertaForSequenceClassification: ['lm_head.dense.weight', 'lm_head.dense.bias', 'lm_head.bias', 'lm_head.decoder.bias', 'lm_head.layer_norm.weight', 'lm_head.decoder.weight', 'lm_head.layer_norm.bias']\n", + "- This IS expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n", + "- This IS NOT expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n", + "Some weights of RobertaForSequenceClassification were not initialized from the model checkpoint at klue/roberta-large and are newly initialized: ['classifier.out_proj.bias', 'classifier.dense.weight', 'classifier.out_proj.weight', 'classifier.dense.bias']\n", "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n" ] } ], "source": [ - "MODEL_NAME = \"team-lucid/deberta-v3-base-korean\"\n", - "\n", - "model = DebertaV2ForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device)\n", + "MODEL_NAME = 'klue/roberta-large'\n", + "model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device)\n", "tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)" ] }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "# MODEL_NAME = \"team-lucid/deberta-v3-base-korean\"\n", + "\n", + "# model = DebertaV2ForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device)\n", + "# tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -120,15 +120,15 @@ "metadata": {}, "outputs": [], "source": [ - "data = pd.read_csv('/opt/ml/finance_sentiment_corpus/merged_samsung_filtered.csv')\n", + "# data = pd.read_csv('/opt/ml/finance_sentiment_corpus/merged_samsung_filtered.csv')\n", "\n", - "def extract_label(json_str) :\n", - " data_dict = eval(json_str) # JSON 문자열을 파이썬 딕셔너리로 변환\n", - " return data_dict[\"label\"]\n", + "# def extract_label(json_str) :\n", + "# data_dict = eval(json_str) # JSON 문자열을 파이썬 딕셔너리로 변환\n", + "# return data_dict[\"label\"]\n", "\n", - "# \"label\" 값을 추출하여 새로운 Series 생성\n", - "data['labels'] = data[\"labels\"].apply(extract_label)\n", - "data['labels'] = data['labels'].map({'부정':0, '긍정':1})" + "# # \"label\" 값을 추출하여 새로운 Series 생성\n", + "# data['labels'] = data[\"labels\"].apply(extract_label)\n", + "# data['labels'] = data['labels'].map({'부정':0, '긍정':1})" ] }, { @@ -141,7 +141,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": {}, "outputs": [ { @@ -303,7 +303,7 @@ "4 . 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 29년간 3만6558편... " ] }, - "execution_count": 4, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -341,22 +341,337 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "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", + " \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", + " \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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Unnamed: 0.3Unnamed: 0.2Unnamed: 0.1Unnamed: 0titledatecontentcontent_corpuscontent_lencontent_corpus_lenlabelsnew_column
00000데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ...2023.07.10 15:29챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...181316511. 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 챗...
12222“삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연2023.07.10 15:07삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...174916980. “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 삼성 가전제품 구매고...
23333SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급2023.07.10 15:05해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (...해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리...5474761. SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 해외 가전 브랜드 공...
34444‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파2023.07.10 14:58북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...109610291. ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 북미·유럽 등...
45555네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다2023.07.10 14:4829년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상...29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상...175916591. 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 29년간 3만6558편...
.......................................
18161861142815671567\"반도체·디스플레이·AI·바이오에 투자 역량 집중해야\" [삼성 '신경영...2023.06.06 19:20전문가가 보는 뉴삼성 전략 비메모리에 승부수 던져야 이재용 등기임원 복귀 시급 사법...전문가가 보는 뉴삼성 전략 비메모리에 승부수 던져야 이재용 등기임원 복귀 시급 사법...206320370. \"반도체·디스플레이·AI·바이오에 투자 역량 집중해야\" [삼성 '신경영... 전...
18171862142915681568삼성家, 상속세 내려고 4조 대출... 2년간 6조 냈지만 아직 6조 ...2023.06.06 19:20대출이자만 年 2000억 넘어 전자·SDS·생명 일부 주식 매각이건희 삼성 선대회장...대출이자만 年 2000억 넘어 전자·SDS·생명 일부 주식 매각이건희 삼성 선대회장...157515710. 삼성家, 상속세 내려고 4조 대출... 2년간 6조 냈지만 아직 6조 ... 대...
18181863143015691569이건희가 만든 '품질의 삼성'…JY '초일류 삼성'으로 계승한다2023.06.06 18:30회장 2년차 맞은 이재용 '제2의 新경영' 내놓는다 李, 국내 1위 자만에 불량 ...회장 2년차 맞은 이재용 '제2의 新경영' 내놓는다 李, 국내 1위 자만에 불량 ...173816541. 이건희가 만든 '품질의 삼성'…JY '초일류 삼성'으로 계승한다 회장 2년차 맞...
18191864143115701570'2나노' 먼저 치고 나간 TSMC... 삼성·인텔도 초미세 공정 추격2023.06.06 18:28글로벌 파운드리(반도체 위탁생산) 1위 업체인 대만 TSMC가 2나노미터(1nm=1...글로벌 파운드리 1위 업체인 대만 TSMC가 2나노미터 공정 개발에 착수하면서 경쟁...148613971. '2나노' 먼저 치고 나간 TSMC... 삼성·인텔도 초미세 공정 추격 글로벌 ...
18201865143215711571“1만대 모두 완판입니다” 망한 줄 알았는데, 이런일이…삼성 ‘초비상’2023.06.06 16:52모토로라 폴더블폰 ‘레이저40 울트라’ [사진, GSM아레나][헤럴드경제= 박영훈기...모토로라 폴더블폰 ‘레이저40 울트라’ “망할 줄 았았는데' 중국으로 넘어간 모...148114101. “1만대 모두 완판입니다” 망한 줄 알았는데, 이런일이…삼성 ‘초비상’ 모토로라...
\n", + "

1821 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " Unnamed: 0.3 Unnamed: 0.2 Unnamed: 0.1 Unnamed: 0 \\\n", + "0 0 0 0 0 \n", + "1 2 2 2 2 \n", + "2 3 3 3 3 \n", + "3 4 4 4 4 \n", + "4 5 5 5 5 \n", + "... ... ... ... ... \n", + "1816 1861 1428 1567 1567 \n", + "1817 1862 1429 1568 1568 \n", + "1818 1863 1430 1569 1569 \n", + "1819 1864 1431 1570 1570 \n", + "1820 1865 1432 1571 1571 \n", + "\n", + " title date \\\n", + "0 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 2023.07.10 15:29 \n", + "1 “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 2023.07.10 15:07 \n", + "2 SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 2023.07.10 15:05 \n", + "3 ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 2023.07.10 14:58 \n", + "4 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 2023.07.10 14:48 \n", + "... ... ... \n", + "1816 \"반도체·디스플레이·AI·바이오에 투자 역량 집중해야\" [삼성 '신경영... 2023.06.06 19:20 \n", + "1817 삼성家, 상속세 내려고 4조 대출... 2년간 6조 냈지만 아직 6조 ... 2023.06.06 19:20 \n", + "1818 이건희가 만든 '품질의 삼성'…JY '초일류 삼성'으로 계승한다 2023.06.06 18:30 \n", + "1819 '2나노' 먼저 치고 나간 TSMC... 삼성·인텔도 초미세 공정 추격 2023.06.06 18:28 \n", + "1820 “1만대 모두 완판입니다” 망한 줄 알았는데, 이런일이…삼성 ‘초비상’ 2023.06.06 16:52 \n", + "\n", + " content \\\n", + "0 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... \n", + "1 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... \n", + "2 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (... \n", + "3 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... \n", + "4 29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상... \n", + "... ... \n", + "1816 전문가가 보는 뉴삼성 전략 비메모리에 승부수 던져야 이재용 등기임원 복귀 시급 사법... \n", + "1817 대출이자만 年 2000억 넘어 전자·SDS·생명 일부 주식 매각이건희 삼성 선대회장... \n", + "1818 회장 2년차 맞은 이재용 '제2의 新경영' 내놓는다 李, 국내 1위 자만에 불량 ... \n", + "1819 글로벌 파운드리(반도체 위탁생산) 1위 업체인 대만 TSMC가 2나노미터(1nm=1... \n", + "1820 모토로라 폴더블폰 ‘레이저40 울트라’ [사진, GSM아레나][헤럴드경제= 박영훈기... \n", + "\n", + " content_corpus content_len \\\n", + "0 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... 1813 \n", + "1 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... 1749 \n", + "2 해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리... 547 \n", + "3 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... 1096 \n", + "4 29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상... 1759 \n", + "... ... ... \n", + "1816 전문가가 보는 뉴삼성 전략 비메모리에 승부수 던져야 이재용 등기임원 복귀 시급 사법... 2063 \n", + "1817 대출이자만 年 2000억 넘어 전자·SDS·생명 일부 주식 매각이건희 삼성 선대회장... 1575 \n", + "1818 회장 2년차 맞은 이재용 '제2의 新경영' 내놓는다 李, 국내 1위 자만에 불량 ... 1738 \n", + "1819 글로벌 파운드리 1위 업체인 대만 TSMC가 2나노미터 공정 개발에 착수하면서 경쟁... 1486 \n", + "1820 모토로라 폴더블폰 ‘레이저40 울트라’ “망할 줄 았았는데' 중국으로 넘어간 모... 1481 \n", + "\n", + " content_corpus_len labels \\\n", + "0 1651 1 \n", + "1 1698 0 \n", + "2 476 1 \n", + "3 1029 1 \n", + "4 1659 1 \n", + "... ... ... \n", + "1816 2037 0 \n", + "1817 1571 0 \n", + "1818 1654 1 \n", + "1819 1397 1 \n", + "1820 1410 1 \n", + "\n", + " new_column \n", + "0 . 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 챗... \n", + "1 . “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 삼성 가전제품 구매고... \n", + "2 . SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 해외 가전 브랜드 공... \n", + "3 . ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 북미·유럽 등... \n", + "4 . 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 29년간 3만6558편... \n", + "... ... \n", + "1816 . \"반도체·디스플레이·AI·바이오에 투자 역량 집중해야\" [삼성 '신경영... 전... \n", + "1817 . 삼성家, 상속세 내려고 4조 대출... 2년간 6조 냈지만 아직 6조 ... 대... \n", + "1818 . 이건희가 만든 '품질의 삼성'…JY '초일류 삼성'으로 계승한다 회장 2년차 맞... \n", + "1819 . '2나노' 먼저 치고 나간 TSMC... 삼성·인텔도 초미세 공정 추격 글로벌 ... \n", + "1820 . “1만대 모두 완판입니다” 망한 줄 알았는데, 이런일이…삼성 ‘초비상’ 모토로라... \n", + "\n", + "[1821 rows x 12 columns]" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data" + ] + }, + { + "cell_type": "code", + "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "# dataset = train_test_split(data['content_corpus'], data['labels'],\n", "\n", - "dataset = train_test_split(data['new_column'], data['labels'],\n", - " test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리\n", + "# train_dataset, test_dataset = train_test_split(data['new_column'], data['labels'],\n", + "# test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리\n", + "# random_state=SEED)\n", + "\n", + "train_dataset, test_dataset = train_test_split(data,\n", + " test_size=0.3, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리\n", " random_state=SEED)\n", - " \n", - "sentence_train, sentence_val, label_train, label_val = dataset\n", + "\n", + "train_dataset, val_dataset = train_test_split(train_dataset,\n", + " test_size=0.2, shuffle=True, stratify=train_dataset['labels'], # label에 비율을 맞춰서 분리\n", + " random_state=SEED)\n", + "\n", + "corpus_train, label_train = train_dataset[\"new_column\"], train_dataset[\"labels\"]\n", + "corpus_val, label_val = val_dataset[\"new_column\"], val_dataset[\"labels\"]\n", + "corpus_test, label_test = test_dataset[\"new_column\"], test_dataset[\"labels\"]\n", + "\n", + "# sentence_train, sentence_val, label_train, label_val = dataset\n", + "\n", "\n", "max_length=500\n", "stride=10\n", "## TODO 임의의 값으로 차후 수정\n", - "train_encoding = tokenizer(sentence_train.tolist(), ## pandas.Series -> list\n", + "train_encoding = tokenizer(corpus_train.tolist(), ## pandas.Series -> list\n", " return_tensors='pt',\n", " padding=True,\n", " truncation=True,\n", @@ -367,7 +682,7 @@ " return_offsets_mapping=False\n", " )\n", "\n", - "val_encoding = tokenizer(sentence_val.tolist(),\n", + "val_encoding = tokenizer(corpus_val.tolist(),\n", " return_tensors='pt',\n", " padding=True,\n", " truncation=True,\n", @@ -379,27 +694,53 @@ " )\n", "\n", "train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True))\n", - "val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True))" + "val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True))\n", + "test_set = SentimentalDataset(val_encoding, label_test.reset_index(drop=True))" ] }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "pandas.core.series.Series" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ - "type(sentence_train)" + "# dataset = train_test_split(data['content_corpus'], data['labels'],\n", + "\n", + "dataset = train_test_split(data['new_column'], data['labels'],\n", + " test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리\n", + " random_state=SEED)\n", + "\n", + "\n", + "sentence_train, sentence_val, label_train, label_val = dataset\n", + "\n", + "\n", + "max_length=500\n", + "stride=10\n", + "## TODO 임의의 값으로 차후 수정\n", + "train_encoding = tokenizer(sentence_train.tolist(), ## pandas.Series -> list\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True,\n", + " ##\n", + " max_length=max_length,\n", + " stride=stride,\n", + " return_overflowing_tokens=True,\n", + " return_offsets_mapping=False\n", + " )\n", + "\n", + "val_encoding = tokenizer(sentence_val.tolist(),\n", + " return_tensors='pt',\n", + " padding=True,\n", + " truncation=True,\n", + " ##\n", + " max_length=max_length,\n", + " stride=stride,\n", + " return_overflowing_tokens=True,\n", + " return_offsets_mapping=False\n", + " )\n", + "\n", + "train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True))\n", + "val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True))" ] }, { @@ -419,7 +760,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -432,53 +773,26 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", - "To disable this warning, you can either:\n", - "\t- Avoid using `tokenizers` before the fork if possible\n", - "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", - "W&B online. Running your script from this directory will now sync to the cloud.\n" - ] - } - ], + "outputs": [], "source": [ - "!wandb online" + "# !wandb online" ] }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 11, "metadata": {}, "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "---train start---\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/conda/envs/final/lib/python3.10/site-packages/transformers/optimization.py:411: FutureWarning: This implementation of AdamW is deprecated and will be removed in a future version. Use the PyTorch implementation torch.optim.AdamW instead, or set `no_deprecation_warning=True` to disable this warning\n", - " warnings.warn(\n" - ] - }, { "data": { "text/html": [ "\n", "
\n", " \n", - " \n", - " [ 3/730 00:00 < 01:35, 7.63 it/s, Epoch 0.01/2]\n", + " \n", + " [730/730 02:58, Epoch 2/2]\n", "
\n", " \n", " \n", @@ -488,6 +802,18 @@ " \n", " \n", " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", "
2000.462800
4000.394800
6000.282900

" ], @@ -499,41 +825,14 @@ "output_type": "display_data" }, { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m/opt/ml/level3_nlp_finalproject-nlp-04/sentence-sentimental/train.ipynb Cell 18\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 16\u001b[0m trainer \u001b[39m=\u001b[39m Trainer(\n\u001b[1;32m 17\u001b[0m model\u001b[39m=\u001b[39mmodel,\n\u001b[1;32m 18\u001b[0m args\u001b[39m=\u001b[39mtraining_args,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 21\u001b[0m compute_metrics\u001b[39m=\u001b[39mcompute_metrics\n\u001b[1;32m 22\u001b[0m )\n\u001b[1;32m 24\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m'\u001b[39m\u001b[39m---train start---\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[0;32m---> 25\u001b[0m trainer\u001b[39m.\u001b[39;49mtrain()\n\u001b[1;32m 26\u001b[0m \u001b[39m# wandb.finish()\u001b[39;00m\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/trainer.py:1645\u001b[0m, in \u001b[0;36mTrainer.train\u001b[0;34m(self, resume_from_checkpoint, trial, ignore_keys_for_eval, **kwargs)\u001b[0m\n\u001b[1;32m 1640\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmodel_wrapped \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mmodel\n\u001b[1;32m 1642\u001b[0m inner_training_loop \u001b[39m=\u001b[39m find_executable_batch_size(\n\u001b[1;32m 1643\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_inner_training_loop, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_train_batch_size, args\u001b[39m.\u001b[39mauto_find_batch_size\n\u001b[1;32m 1644\u001b[0m )\n\u001b[0;32m-> 1645\u001b[0m \u001b[39mreturn\u001b[39;00m inner_training_loop(\n\u001b[1;32m 1646\u001b[0m args\u001b[39m=\u001b[39;49margs,\n\u001b[1;32m 1647\u001b[0m resume_from_checkpoint\u001b[39m=\u001b[39;49mresume_from_checkpoint,\n\u001b[1;32m 1648\u001b[0m trial\u001b[39m=\u001b[39;49mtrial,\n\u001b[1;32m 1649\u001b[0m ignore_keys_for_eval\u001b[39m=\u001b[39;49mignore_keys_for_eval,\n\u001b[1;32m 1650\u001b[0m )\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/trainer.py:1938\u001b[0m, in \u001b[0;36mTrainer._inner_training_loop\u001b[0;34m(self, batch_size, args, resume_from_checkpoint, trial, ignore_keys_for_eval)\u001b[0m\n\u001b[1;32m 1935\u001b[0m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcontrol \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcallback_handler\u001b[39m.\u001b[39mon_step_begin(args, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstate, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcontrol)\n\u001b[1;32m 1937\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39maccelerator\u001b[39m.\u001b[39maccumulate(model):\n\u001b[0;32m-> 1938\u001b[0m tr_loss_step \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mtraining_step(model, inputs)\n\u001b[1;32m 1940\u001b[0m \u001b[39mif\u001b[39;00m (\n\u001b[1;32m 1941\u001b[0m args\u001b[39m.\u001b[39mlogging_nan_inf_filter\n\u001b[1;32m 1942\u001b[0m \u001b[39mand\u001b[39;00m \u001b[39mnot\u001b[39;00m is_torch_tpu_available()\n\u001b[1;32m 1943\u001b[0m \u001b[39mand\u001b[39;00m (torch\u001b[39m.\u001b[39misnan(tr_loss_step) \u001b[39mor\u001b[39;00m torch\u001b[39m.\u001b[39misinf(tr_loss_step))\n\u001b[1;32m 1944\u001b[0m ):\n\u001b[1;32m 1945\u001b[0m \u001b[39m# if loss is nan or inf simply add the average of previous logged losses\u001b[39;00m\n\u001b[1;32m 1946\u001b[0m tr_loss \u001b[39m+\u001b[39m\u001b[39m=\u001b[39m tr_loss \u001b[39m/\u001b[39m (\u001b[39m1\u001b[39m \u001b[39m+\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mstate\u001b[39m.\u001b[39mglobal_step \u001b[39m-\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_globalstep_last_logged)\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/trainer.py:2759\u001b[0m, in \u001b[0;36mTrainer.training_step\u001b[0;34m(self, model, inputs)\u001b[0m\n\u001b[1;32m 2756\u001b[0m \u001b[39mreturn\u001b[39;00m loss_mb\u001b[39m.\u001b[39mreduce_mean()\u001b[39m.\u001b[39mdetach()\u001b[39m.\u001b[39mto(\u001b[39mself\u001b[39m\u001b[39m.\u001b[39margs\u001b[39m.\u001b[39mdevice)\n\u001b[1;32m 2758\u001b[0m \u001b[39mwith\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcompute_loss_context_manager():\n\u001b[0;32m-> 2759\u001b[0m loss \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mcompute_loss(model, inputs)\n\u001b[1;32m 2761\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39margs\u001b[39m.\u001b[39mn_gpu \u001b[39m>\u001b[39m \u001b[39m1\u001b[39m:\n\u001b[1;32m 2762\u001b[0m loss \u001b[39m=\u001b[39m loss\u001b[39m.\u001b[39mmean() \u001b[39m# mean() to average on multi-gpu parallel training\u001b[39;00m\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/trainer.py:2784\u001b[0m, in \u001b[0;36mTrainer.compute_loss\u001b[0;34m(self, model, inputs, return_outputs)\u001b[0m\n\u001b[1;32m 2782\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[1;32m 2783\u001b[0m labels \u001b[39m=\u001b[39m \u001b[39mNone\u001b[39;00m\n\u001b[0;32m-> 2784\u001b[0m outputs \u001b[39m=\u001b[39m model(\u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49minputs)\n\u001b[1;32m 2785\u001b[0m \u001b[39m# Save past state if it exists\u001b[39;00m\n\u001b[1;32m 2786\u001b[0m \u001b[39m# TODO: this needs to be fixed and made cleaner later.\u001b[39;00m\n\u001b[1;32m 2787\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39margs\u001b[39m.\u001b[39mpast_index \u001b[39m>\u001b[39m\u001b[39m=\u001b[39m \u001b[39m0\u001b[39m:\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/accelerate/utils/operations.py:553\u001b[0m, in \u001b[0;36mconvert_outputs_to_fp32..forward\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 552\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 553\u001b[0m \u001b[39mreturn\u001b[39;00m model_forward(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/accelerate/utils/operations.py:541\u001b[0m, in \u001b[0;36mConvertOutputsToFp32.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 541\u001b[0m \u001b[39mreturn\u001b[39;00m convert_to_fp32(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mmodel_forward(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs))\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/amp/autocast_mode.py:14\u001b[0m, in \u001b[0;36mautocast_decorator..decorate_autocast\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[39m@functools\u001b[39m\u001b[39m.\u001b[39mwraps(func)\n\u001b[1;32m 12\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdecorate_autocast\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 13\u001b[0m \u001b[39mwith\u001b[39;00m autocast_instance:\n\u001b[0;32m---> 14\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/accelerate/utils/operations.py:553\u001b[0m, in \u001b[0;36mconvert_outputs_to_fp32..forward\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 552\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 553\u001b[0m \u001b[39mreturn\u001b[39;00m model_forward(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/accelerate/utils/operations.py:541\u001b[0m, in \u001b[0;36mConvertOutputsToFp32.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 541\u001b[0m \u001b[39mreturn\u001b[39;00m convert_to_fp32(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mmodel_forward(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs))\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/amp/autocast_mode.py:14\u001b[0m, in \u001b[0;36mautocast_decorator..decorate_autocast\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[39m@functools\u001b[39m\u001b[39m.\u001b[39mwraps(func)\n\u001b[1;32m 12\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdecorate_autocast\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 13\u001b[0m \u001b[39mwith\u001b[39;00m autocast_instance:\n\u001b[0;32m---> 14\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", - " \u001b[0;31m[... skipping similar frames: ConvertOutputsToFp32.__call__ at line 541 (1 times), autocast_decorator..decorate_autocast at line 14 (1 times), convert_outputs_to_fp32..forward at line 553 (1 times)]\u001b[0m\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/accelerate/utils/operations.py:553\u001b[0m, in \u001b[0;36mconvert_outputs_to_fp32..forward\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 552\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 553\u001b[0m \u001b[39mreturn\u001b[39;00m model_forward(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/accelerate/utils/operations.py:541\u001b[0m, in \u001b[0;36mConvertOutputsToFp32.__call__\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 540\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__call__\u001b[39m(\u001b[39mself\u001b[39m, \u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[0;32m--> 541\u001b[0m \u001b[39mreturn\u001b[39;00m convert_to_fp32(\u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mmodel_forward(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs))\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/amp/autocast_mode.py:14\u001b[0m, in \u001b[0;36mautocast_decorator..decorate_autocast\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[39m@functools\u001b[39m\u001b[39m.\u001b[39mwraps(func)\n\u001b[1;32m 12\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mdecorate_autocast\u001b[39m(\u001b[39m*\u001b[39margs, \u001b[39m*\u001b[39m\u001b[39m*\u001b[39mkwargs):\n\u001b[1;32m 13\u001b[0m \u001b[39mwith\u001b[39;00m autocast_instance:\n\u001b[0;32m---> 14\u001b[0m \u001b[39mreturn\u001b[39;00m func(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/models/deberta_v2/modeling_deberta_v2.py:1310\u001b[0m, in \u001b[0;36mDebertaV2ForSequenceClassification.forward\u001b[0;34m(self, input_ids, attention_mask, token_type_ids, position_ids, inputs_embeds, labels, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m 1302\u001b[0m \u001b[39m\u001b[39m\u001b[39mr\u001b[39m\u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 1303\u001b[0m \u001b[39mlabels (`torch.LongTensor` of shape `(batch_size,)`, *optional*):\u001b[39;00m\n\u001b[1;32m 1304\u001b[0m \u001b[39m Labels for computing the sequence classification/regression loss. Indices should be in `[0, ...,\u001b[39;00m\n\u001b[1;32m 1305\u001b[0m \u001b[39m config.num_labels - 1]`. If `config.num_labels == 1` a regression loss is computed (Mean-Square loss), If\u001b[39;00m\n\u001b[1;32m 1306\u001b[0m \u001b[39m `config.num_labels > 1` a classification loss is computed (Cross-Entropy).\u001b[39;00m\n\u001b[1;32m 1307\u001b[0m \u001b[39m\"\"\"\u001b[39;00m\n\u001b[1;32m 1308\u001b[0m return_dict \u001b[39m=\u001b[39m return_dict \u001b[39mif\u001b[39;00m return_dict \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39melse\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mconfig\u001b[39m.\u001b[39muse_return_dict\n\u001b[0;32m-> 1310\u001b[0m outputs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mdeberta(\n\u001b[1;32m 1311\u001b[0m input_ids,\n\u001b[1;32m 1312\u001b[0m token_type_ids\u001b[39m=\u001b[39;49mtoken_type_ids,\n\u001b[1;32m 1313\u001b[0m attention_mask\u001b[39m=\u001b[39;49mattention_mask,\n\u001b[1;32m 1314\u001b[0m position_ids\u001b[39m=\u001b[39;49mposition_ids,\n\u001b[1;32m 1315\u001b[0m inputs_embeds\u001b[39m=\u001b[39;49minputs_embeds,\n\u001b[1;32m 1316\u001b[0m output_attentions\u001b[39m=\u001b[39;49moutput_attentions,\n\u001b[1;32m 1317\u001b[0m output_hidden_states\u001b[39m=\u001b[39;49moutput_hidden_states,\n\u001b[1;32m 1318\u001b[0m return_dict\u001b[39m=\u001b[39;49mreturn_dict,\n\u001b[1;32m 1319\u001b[0m )\n\u001b[1;32m 1321\u001b[0m encoder_layer \u001b[39m=\u001b[39m outputs[\u001b[39m0\u001b[39m]\n\u001b[1;32m 1322\u001b[0m pooled_output \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mpooler(encoder_layer)\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/models/deberta_v2/modeling_deberta_v2.py:1082\u001b[0m, in \u001b[0;36mDebertaV2Model.forward\u001b[0;34m(self, input_ids, attention_mask, token_type_ids, position_ids, inputs_embeds, output_attentions, output_hidden_states, return_dict)\u001b[0m\n\u001b[1;32m 1072\u001b[0m token_type_ids \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39mzeros(input_shape, dtype\u001b[39m=\u001b[39mtorch\u001b[39m.\u001b[39mlong, device\u001b[39m=\u001b[39mdevice)\n\u001b[1;32m 1074\u001b[0m embedding_output \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39membeddings(\n\u001b[1;32m 1075\u001b[0m input_ids\u001b[39m=\u001b[39minput_ids,\n\u001b[1;32m 1076\u001b[0m token_type_ids\u001b[39m=\u001b[39mtoken_type_ids,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 1079\u001b[0m inputs_embeds\u001b[39m=\u001b[39minputs_embeds,\n\u001b[1;32m 1080\u001b[0m )\n\u001b[0;32m-> 1082\u001b[0m encoder_outputs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mencoder(\n\u001b[1;32m 1083\u001b[0m embedding_output,\n\u001b[1;32m 1084\u001b[0m attention_mask,\n\u001b[1;32m 1085\u001b[0m output_hidden_states\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m,\n\u001b[1;32m 1086\u001b[0m output_attentions\u001b[39m=\u001b[39;49moutput_attentions,\n\u001b[1;32m 1087\u001b[0m return_dict\u001b[39m=\u001b[39;49mreturn_dict,\n\u001b[1;32m 1088\u001b[0m )\n\u001b[1;32m 1089\u001b[0m encoded_layers \u001b[39m=\u001b[39m encoder_outputs[\u001b[39m1\u001b[39m]\n\u001b[1;32m 1091\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mz_steps \u001b[39m>\u001b[39m \u001b[39m1\u001b[39m:\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/models/deberta_v2/modeling_deberta_v2.py:520\u001b[0m, in \u001b[0;36mDebertaV2Encoder.forward\u001b[0;34m(self, hidden_states, attention_mask, output_hidden_states, output_attentions, query_states, relative_pos, return_dict)\u001b[0m\n\u001b[1;32m 511\u001b[0m output_states \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39mutils\u001b[39m.\u001b[39mcheckpoint\u001b[39m.\u001b[39mcheckpoint(\n\u001b[1;32m 512\u001b[0m create_custom_forward(layer_module),\n\u001b[1;32m 513\u001b[0m next_kv,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 517\u001b[0m rel_embeddings,\n\u001b[1;32m 518\u001b[0m )\n\u001b[1;32m 519\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m--> 520\u001b[0m output_states \u001b[39m=\u001b[39m layer_module(\n\u001b[1;32m 521\u001b[0m next_kv,\n\u001b[1;32m 522\u001b[0m attention_mask,\n\u001b[1;32m 523\u001b[0m query_states\u001b[39m=\u001b[39;49mquery_states,\n\u001b[1;32m 524\u001b[0m relative_pos\u001b[39m=\u001b[39;49mrelative_pos,\n\u001b[1;32m 525\u001b[0m rel_embeddings\u001b[39m=\u001b[39;49mrel_embeddings,\n\u001b[1;32m 526\u001b[0m output_attentions\u001b[39m=\u001b[39;49moutput_attentions,\n\u001b[1;32m 527\u001b[0m )\n\u001b[1;32m 529\u001b[0m \u001b[39mif\u001b[39;00m output_attentions:\n\u001b[1;32m 530\u001b[0m output_states, att_m \u001b[39m=\u001b[39m output_states\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/models/deberta_v2/modeling_deberta_v2.py:362\u001b[0m, in \u001b[0;36mDebertaV2Layer.forward\u001b[0;34m(self, hidden_states, attention_mask, query_states, relative_pos, rel_embeddings, output_attentions)\u001b[0m\n\u001b[1;32m 353\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\n\u001b[1;32m 354\u001b[0m \u001b[39mself\u001b[39m,\n\u001b[1;32m 355\u001b[0m hidden_states,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 360\u001b[0m output_attentions\u001b[39m=\u001b[39m\u001b[39mFalse\u001b[39;00m,\n\u001b[1;32m 361\u001b[0m ):\n\u001b[0;32m--> 362\u001b[0m attention_output \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mattention(\n\u001b[1;32m 363\u001b[0m hidden_states,\n\u001b[1;32m 364\u001b[0m attention_mask,\n\u001b[1;32m 365\u001b[0m output_attentions\u001b[39m=\u001b[39;49moutput_attentions,\n\u001b[1;32m 366\u001b[0m query_states\u001b[39m=\u001b[39;49mquery_states,\n\u001b[1;32m 367\u001b[0m relative_pos\u001b[39m=\u001b[39;49mrelative_pos,\n\u001b[1;32m 368\u001b[0m rel_embeddings\u001b[39m=\u001b[39;49mrel_embeddings,\n\u001b[1;32m 369\u001b[0m )\n\u001b[1;32m 370\u001b[0m \u001b[39mif\u001b[39;00m output_attentions:\n\u001b[1;32m 371\u001b[0m attention_output, att_matrix \u001b[39m=\u001b[39m attention_output\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/models/deberta_v2/modeling_deberta_v2.py:293\u001b[0m, in \u001b[0;36mDebertaV2Attention.forward\u001b[0;34m(self, hidden_states, attention_mask, output_attentions, query_states, relative_pos, rel_embeddings)\u001b[0m\n\u001b[1;32m 284\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mforward\u001b[39m(\n\u001b[1;32m 285\u001b[0m \u001b[39mself\u001b[39m,\n\u001b[1;32m 286\u001b[0m hidden_states,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 291\u001b[0m rel_embeddings\u001b[39m=\u001b[39m\u001b[39mNone\u001b[39;00m,\n\u001b[1;32m 292\u001b[0m ):\n\u001b[0;32m--> 293\u001b[0m self_output \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mself(\n\u001b[1;32m 294\u001b[0m hidden_states,\n\u001b[1;32m 295\u001b[0m attention_mask,\n\u001b[1;32m 296\u001b[0m output_attentions,\n\u001b[1;32m 297\u001b[0m query_states\u001b[39m=\u001b[39;49mquery_states,\n\u001b[1;32m 298\u001b[0m relative_pos\u001b[39m=\u001b[39;49mrelative_pos,\n\u001b[1;32m 299\u001b[0m rel_embeddings\u001b[39m=\u001b[39;49mrel_embeddings,\n\u001b[1;32m 300\u001b[0m )\n\u001b[1;32m 301\u001b[0m \u001b[39mif\u001b[39;00m output_attentions:\n\u001b[1;32m 302\u001b[0m self_output, att_matrix \u001b[39m=\u001b[39m self_output\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/torch/nn/modules/module.py:1501\u001b[0m, in \u001b[0;36mModule._call_impl\u001b[0;34m(self, *args, **kwargs)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[39m# If we don't have any hooks, we want to skip the rest of the logic in\u001b[39;00m\n\u001b[1;32m 1497\u001b[0m \u001b[39m# this function, and just call forward.\u001b[39;00m\n\u001b[1;32m 1498\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m (\u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_backward_pre_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_hooks \u001b[39mor\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_forward_pre_hooks\n\u001b[1;32m 1499\u001b[0m \u001b[39mor\u001b[39;00m _global_backward_pre_hooks \u001b[39mor\u001b[39;00m _global_backward_hooks\n\u001b[1;32m 1500\u001b[0m \u001b[39mor\u001b[39;00m _global_forward_hooks \u001b[39mor\u001b[39;00m _global_forward_pre_hooks):\n\u001b[0;32m-> 1501\u001b[0m \u001b[39mreturn\u001b[39;00m forward_call(\u001b[39m*\u001b[39;49margs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 1502\u001b[0m \u001b[39m# Do not call functions when jit is used\u001b[39;00m\n\u001b[1;32m 1503\u001b[0m full_backward_hooks, non_full_backward_hooks \u001b[39m=\u001b[39m [], []\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.10/site-packages/transformers/models/deberta_v2/modeling_deberta_v2.py:741\u001b[0m, in \u001b[0;36mDisentangledSelfAttention.forward\u001b[0;34m(self, hidden_states, attention_mask, output_attentions, query_states, relative_pos, rel_embeddings)\u001b[0m\n\u001b[1;32m 739\u001b[0m attention_probs \u001b[39m=\u001b[39m XSoftmax\u001b[39m.\u001b[39mapply(attention_scores, attention_mask, \u001b[39m-\u001b[39m\u001b[39m1\u001b[39m)\n\u001b[1;32m 740\u001b[0m attention_probs \u001b[39m=\u001b[39m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mdropout(attention_probs)\n\u001b[0;32m--> 741\u001b[0m context_layer \u001b[39m=\u001b[39m torch\u001b[39m.\u001b[39;49mbmm(\n\u001b[1;32m 742\u001b[0m attention_probs\u001b[39m.\u001b[39;49mview(\u001b[39m-\u001b[39;49m\u001b[39m1\u001b[39;49m, attention_probs\u001b[39m.\u001b[39;49msize(\u001b[39m-\u001b[39;49m\u001b[39m2\u001b[39;49m), attention_probs\u001b[39m.\u001b[39;49msize(\u001b[39m-\u001b[39;49m\u001b[39m1\u001b[39;49m)), value_layer\n\u001b[1;32m 743\u001b[0m )\n\u001b[1;32m 744\u001b[0m context_layer \u001b[39m=\u001b[39m (\n\u001b[1;32m 745\u001b[0m context_layer\u001b[39m.\u001b[39mview(\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m, \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mnum_attention_heads, context_layer\u001b[39m.\u001b[39msize(\u001b[39m-\u001b[39m\u001b[39m2\u001b[39m), context_layer\u001b[39m.\u001b[39msize(\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m))\n\u001b[1;32m 746\u001b[0m \u001b[39m.\u001b[39mpermute(\u001b[39m0\u001b[39m, \u001b[39m2\u001b[39m, \u001b[39m1\u001b[39m, \u001b[39m3\u001b[39m)\n\u001b[1;32m 747\u001b[0m \u001b[39m.\u001b[39mcontiguous()\n\u001b[1;32m 748\u001b[0m )\n\u001b[1;32m 749\u001b[0m new_context_layer_shape \u001b[39m=\u001b[39m context_layer\u001b[39m.\u001b[39msize()[:\u001b[39m-\u001b[39m\u001b[39m2\u001b[39m] \u001b[39m+\u001b[39m (\u001b[39m-\u001b[39m\u001b[39m1\u001b[39m,)\n", - "\u001b[0;31mKeyboardInterrupt\u001b[0m: " - ] + "data": { + "text/plain": [ + "TrainOutput(global_step=730, training_loss=0.37612260269792114, metrics={'train_runtime': 187.8492, 'train_samples_per_second': 15.544, 'train_steps_per_second': 3.886, 'total_flos': 2657460528240000.0, 'train_loss': 0.37612260269792114, 'epoch': 2.0})" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ @@ -548,6 +847,7 @@ " per_device_train_batch_size = per_device_train_batch_size,\n", " per_device_eval_batch_size = per_device_eval_batch_size,\n", " learning_rate = learning_rate,\n", + " evaluation_strategy=\"logging_steps\"\n", " fp16=True,\n", " report_to=\"wandb\",\n", ")\n", @@ -579,14 +879,34 @@ "metadata": {}, "outputs": [], "source": [ - "run.finish()" + "# run.finish()" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 37, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "---val evaulate start---\n" + ] + }, + { + "data": { + "text/plain": [ + "{'val1_loss': 0.3280849754810333,\n", + " 'val1_accuracy': 0.9372549019607843,\n", + " 'val1_f1': 0.9372549019607843}" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "print('---val evaulate start---')\n", "# wandb.init()\n", From 3e2265e585d50335c2d1b28d77e8bcf90d6e8cc7 Mon Sep 17 00:00:00 2001 From: Yungi Date: Sat, 22 Jul 2023 10:42:55 +0900 Subject: [PATCH 23/63] [Feature] Add Advanced KeyBert Model - Add keyword_extractor Module - Add MMR Score Code - Add KeyBERT Model Code - Add MaxSum Score Code - Add Transformer_Keyword Extraction Notebook - Move keyword_extraction pipeline into Notebook Dir. --- Notebooks/KRWordRank_KeyWord Extraction.ipynb | 330 ++++++++++++++++ Notebooks/KeyWord Extraction.ipynb | 356 ------------------ .../Transformer_Keyword Extraction.ipynb | 235 ++++++++++++ .../keyword extraction pipeline.ipynb | 0 keyword_extractor/__init__.py | 3 + keyword_extractor/maxsum.py | 35 ++ keyword_extractor/mmr.py | 33 ++ keyword_extractor/model.py | 156 ++++++++ 8 files changed, 792 insertions(+), 356 deletions(-) create mode 100644 Notebooks/KRWordRank_KeyWord Extraction.ipynb delete mode 100644 Notebooks/KeyWord Extraction.ipynb create mode 100644 Notebooks/Transformer_Keyword Extraction.ipynb rename {keyword-extraction => Notebooks}/keyword extraction pipeline.ipynb (100%) create mode 100644 keyword_extractor/__init__.py create mode 100644 keyword_extractor/maxsum.py create mode 100644 keyword_extractor/mmr.py create mode 100644 keyword_extractor/model.py diff --git a/Notebooks/KRWordRank_KeyWord Extraction.ipynb b/Notebooks/KRWordRank_KeyWord Extraction.ipynb new file mode 100644 index 0000000..17e2142 --- /dev/null +++ b/Notebooks/KRWordRank_KeyWord Extraction.ipynb @@ -0,0 +1,330 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import os\n", + "import sys\n", + "import numpy as np\n", + "from pathlib import Path\n", + "from tqdm import trange\n", + "from transformers import AutoModel, AutoTokenizer\n", + "from konlpy.tag import Mecab, Okt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [], + "source": [ + "sys.path.append(str(Path.home().joinpath(\"level3_nlp_finalproject-nlp-04\")))\n", + "from utils.preprocessing import *" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 3, + "outputs": [], + "source": [ + "news = pd.read_csv(Path.cwd().parent.joinpath(\"Data\", \"News\", \"005930.csv\"))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 4, + "outputs": [], + "source": [ + "# news = preprocess_dataframe(news)\n", + "news['content'].replace('', np.nan, inplace=True)\n", + "news.dropna(subset=['content'], inplace=True)\n", + "news.reset_index(drop=True, inplace=True)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 5, + "outputs": [ + { + "data": { + "text/plain": " company title \\\n0 삼성전자 “지독한 중국 떼로 덤비더니” 삼성 점유율 절반 뺏아갔다 \n1 삼성전자 “반도체 시간이 온다”…야심작 출격한 삼성전자, 비밀병기는 \n2 삼성전자 D램 격차 더 벌린 삼성전자…업계 첫 12나노급 양산 \n3 삼성전자 현대차에 내준 '영업이익 1위' 삼성전자, 하반기엔 되찾는다 \n4 삼성전자 삼성전자 '12나노급 D램' 세계 첫 양산 \n... ... ... \n2874 삼성전자 [특징주] 삼성전자, 장중 7만원선 밑돌아…외인 매도에 1% 하락(종합... \n2875 삼성전자 AMD CEO \"韓 언론을 믿냐\"…삼성, AMD 3나노 수주보도에 'T... \n2876 삼성전자 바닥 찍은 반도체·디스플레이… 삼성전자·LGD, 4분기 흑자전환 기대감... \n2877 삼성전자 '황금명함'만 있는 게 아니다...삼성전자 새내기 부모님 '이것' 받고... \n2878 삼성전자 [특징주] 삼성전자, 2% 하락해 다시 ‘6만전자’ \n\n link writer \\\n0 https://finance.naver.com/item/news_read.naver... 헤럴드경제 \n1 https://finance.naver.com/item/news_read.naver... 매일경제 \n2 https://finance.naver.com/item/news_read.naver... 파이낸셜뉴스 \n3 https://finance.naver.com/item/news_read.naver... 매일경제 \n4 https://finance.naver.com/item/news_read.naver... 매일경제 \n... ... ... \n2874 https://finance.naver.com/item/news_read.naver... 연합뉴스 \n2875 https://finance.naver.com/item/news_read.naver... 아시아경제 \n2876 https://finance.naver.com/item/news_read.naver... 조선비즈 \n2877 https://finance.naver.com/item/news_read.naver... 파이낸셜뉴스 \n2878 https://finance.naver.com/item/news_read.naver... 조선비즈 \n\n date content \n0 2023.05.18 22:14 중국 화웨이 폴더블폰 S포켓[헤럴드경제= 박영훈 기자] “삼성 타도 외치더니” 중... \n1 2023.05.18 19:02 12나노급 DDR5 D램 양산 EUV 공정 등 기술력 총동원 DDR5로의 시장 전환... \n2 2023.05.18 18:41 1초에 UHD 영화 2편 처리 가능 생산성 20% 소비전력 23% 개선 ‘챗GPT’... \n3 2023.05.18 17:46 현대차 실적 상고하저 예상 3분기 2조8200억원 그칠듯 삼성전자 하반기 본격 반등... \n4 2023.05.18 17:43 반도체 업황부진 뚫을 야심작 생산성 20%·소비전력 23% ↑삼성전자가 메모리반도체... \n... ... ... \n2874 2023.07.21 15:44 (CG) [연합뉴스TV 제공](서울=연합뉴스) 송은경 기자 = 글로벌 반도체 업종 ... \n2875 2023.07.21 15:32 4년 만에 대만 방문한 리사 수 AMD CEO미국 반도체 업계를 대표하는 대만계 경... \n2876 2023.07.21 15:26 삼성전자, 3분기부터 메모리 감산 효과 본격화 3분기 들어 D램 가격 하락폭도 안정... \n2877 2023.07.21 14:53 삼성전자 반도체(DS)부문 입사 예정자들에게 전달된 황금명함과 꽃다발, 경계현 사장... \n2878 2023.07.21 09:22 21일 삼성전자가 2% 하락하며 다시 ‘6만전자’로 내려앉았다. 전날 미국 뉴욕증시... \n\n[2879 rows x 6 columns]", + "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 \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 \n \n \n \n \n
companytitlelinkwriterdatecontent
0삼성전자“지독한 중국 떼로 덤비더니” 삼성 점유율 절반 뺏아갔다https://finance.naver.com/item/news_read.naver...헤럴드경제2023.05.18 22:14중국 화웨이 폴더블폰 S포켓[헤럴드경제= 박영훈 기자] “삼성 타도 외치더니” 중...
1삼성전자“반도체 시간이 온다”…야심작 출격한 삼성전자, 비밀병기는https://finance.naver.com/item/news_read.naver...매일경제2023.05.18 19:0212나노급 DDR5 D램 양산 EUV 공정 등 기술력 총동원 DDR5로의 시장 전환...
2삼성전자D램 격차 더 벌린 삼성전자…업계 첫 12나노급 양산https://finance.naver.com/item/news_read.naver...파이낸셜뉴스2023.05.18 18:411초에 UHD 영화 2편 처리 가능 생산성 20% 소비전력 23% 개선 ‘챗GPT’...
3삼성전자현대차에 내준 '영업이익 1위' 삼성전자, 하반기엔 되찾는다https://finance.naver.com/item/news_read.naver...매일경제2023.05.18 17:46현대차 실적 상고하저 예상 3분기 2조8200억원 그칠듯 삼성전자 하반기 본격 반등...
4삼성전자삼성전자 '12나노급 D램' 세계 첫 양산https://finance.naver.com/item/news_read.naver...매일경제2023.05.18 17:43반도체 업황부진 뚫을 야심작 생산성 20%·소비전력 23% ↑삼성전자가 메모리반도체...
.....................
2874삼성전자[특징주] 삼성전자, 장중 7만원선 밑돌아…외인 매도에 1% 하락(종합...https://finance.naver.com/item/news_read.naver...연합뉴스2023.07.21 15:44(CG) [연합뉴스TV 제공](서울=연합뉴스) 송은경 기자 = 글로벌 반도체 업종 ...
2875삼성전자AMD CEO \"韓 언론을 믿냐\"…삼성, AMD 3나노 수주보도에 'T...https://finance.naver.com/item/news_read.naver...아시아경제2023.07.21 15:324년 만에 대만 방문한 리사 수 AMD CEO미국 반도체 업계를 대표하는 대만계 경...
2876삼성전자바닥 찍은 반도체·디스플레이… 삼성전자·LGD, 4분기 흑자전환 기대감...https://finance.naver.com/item/news_read.naver...조선비즈2023.07.21 15:26삼성전자, 3분기부터 메모리 감산 효과 본격화 3분기 들어 D램 가격 하락폭도 안정...
2877삼성전자'황금명함'만 있는 게 아니다...삼성전자 새내기 부모님 '이것' 받고...https://finance.naver.com/item/news_read.naver...파이낸셜뉴스2023.07.21 14:53삼성전자 반도체(DS)부문 입사 예정자들에게 전달된 황금명함과 꽃다발, 경계현 사장...
2878삼성전자[특징주] 삼성전자, 2% 하락해 다시 ‘6만전자’https://finance.naver.com/item/news_read.naver...조선비즈2023.07.21 09:2221일 삼성전자가 2% 하락하며 다시 ‘6만전자’로 내려앉았다. 전날 미국 뉴욕증시...
\n

2879 rows × 6 columns

\n
" + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "news" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# Train New Tokenizer\n", + "# def get_news(news):\n", + "# \tcontent = news['content']\n", + "# \tfor start_idx in range(0, len(content), 1000):\n", + "# \t\tsamples = content[start_idx:start_idx+1000]\n", + "# \t\tyield samples" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# tokenizer = AutoTokenizer.from_pretrained(\"klue/roberta-base\")\n", + "# trained_tokenizer = tokenizer.train_new_from_iterator(get_news(news), vocab_size=32000)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# trained_tokenizer.tokenize(news.sample(1)['content'].item())" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "okt = Okt()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "company = news['company'].unique()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "ecopro = news[news['company'] == '에코프로']['content']" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "samsung = news[news['company'] == '삼성전자']['content']" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "for i in trange(len(samsung)):\n", + "\tsamsung[i] = \" \".join(okt.nouns(samsung[i]))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "from krwordrank.word import summarize_with_keywords, KRWordRank" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "wordrank_extractor = KRWordRank(min_count=10, max_length=100)\n", + "\n", + "beta = 0.85\n", + "max_iter = 10\n", + "keywords, rank, graph = wordrank_extractor.extract(samsung.tolist(), beta, max_iter)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "for key, score in sorted(graph[5].items(), reverse=True, key=lambda x: x[1])[:100]:\n", + "\tprint(wordrank_extractor.int2token(key))\n", + "\tprint(score)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "samsung_keywords = summarize_with_keywords(samsung.tolist(),\n", + "\t\t\t\t\t\t\t\t min_count=10,\n", + "\t\t\t\t\t\t\t\t max_length=100,\n", + "\t\t\t\t\t\t\t\t beta=0.85,\n", + "\t\t\t\t\t\t\t\t max_iter=10,\n", + "\t\t\t\t\t\t\t\t verbose=False)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "samsung_keywords" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "ecopro_keywords = summarize_with_keywords(ecopro.tolist(),\n", + "\t\t\t\t\t\t\t\t min_count=10,\n", + "\t\t\t\t\t\t\t\t max_length=100,\n", + "\t\t\t\t\t\t\t\t beta=0.85,\n", + "\t\t\t\t\t\t\t\t max_iter=10,\n", + "\t\t\t\t\t\t\t\t verbose=True)\n", + "ecopro_keywords" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "top_k = set(samsung_keywords) - set(ecopro_keywords)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "t = {key : samsung_keywords[key] for key in top_k}" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "sorted(t.items() , reverse=True, key=lambda x: x[1])" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Notebooks/KeyWord Extraction.ipynb b/Notebooks/KeyWord Extraction.ipynb deleted file mode 100644 index a2af4ad..0000000 --- a/Notebooks/KeyWord Extraction.ipynb +++ /dev/null @@ -1,356 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 3, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import os\n", - "\n", - "from pathlib import Path\n", - "from transformers import AutoModel, AutoTokenizer\n", - "from konlpy.tag import Mecab" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "outputs": [], - "source": [ - "news_path = Path.cwd().parent.joinpath(\"Data\", \"News\")" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 5, - "outputs": [], - "source": [ - "news = pd.DataFrame()\n", - "for news_code in os.listdir(news_path):\n", - "\tload_news = pd.read_csv(Path.joinpath(news_path, news_code))\n", - "\tload_news = load_news.dropna()\n", - "\tnews = pd.concat([news, load_news])\n", - "news = news.reset_index(drop=True)" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 6, - "outputs": [ - { - "data": { - "text/plain": " company title \\\n7493 삼성전자 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... \n7494 삼성전자 LS일렉트릭, 텍사스 공장 짓는다…현지 삼성·SK·LG 전력 지원 \n7495 삼성전자 “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 \n7496 삼성전자 SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 \n7497 삼성전자 ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 \n... ... ... \n9521 삼성전자 엔비디아 폭등에…삼성전자·SK하이닉스 동반 강세 \n9522 삼성전자 \"7만전자 영차\"…삼성전자, 장초반 1% 이상 올라[특징주] \n9523 삼성전자 코스피, 외인 순매수 속 강보합…삼전 1%·하이닉스 3% 상승 \n9524 삼성전자 삼전·하이닉스 강세에 코스피도 상승 출발…외인 매수세 \n9525 삼성전자 반도체 반등 시작했나…삼성전자·SK하이닉스 연일 강세 \n\n link writer \\\n7493 https://finance.naver.com/item/news_read.naver... 조선비즈 \n7494 https://finance.naver.com/item/news_read.naver... 뉴스1 \n7495 https://finance.naver.com/item/news_read.naver... 매일경제 \n7496 https://finance.naver.com/item/news_read.naver... 뉴시스 \n7497 https://finance.naver.com/item/news_read.naver... 매경이코노미 \n... ... ... \n9521 https://finance.naver.com/item/news_read.naver... 뉴시스 \n9522 https://finance.naver.com/item/news_read.naver... 뉴스1 \n9523 https://finance.naver.com/item/news_read.naver... 한국경제 \n9524 https://finance.naver.com/item/news_read.naver... 머니투데이 \n9525 https://finance.naver.com/item/news_read.naver... 머니투데이 \n\n date content \n7493 2023.07.10 15:29 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... \n7494 2023.07.10 15:08 북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ... \n7495 2023.07.10 15:07 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... \n7496 2023.07.10 15:05 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (... \n7497 2023.07.10 14:58 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... \n... ... ... \n9521 2023.05.26 09:25 [서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간... \n9522 2023.05.26 09:19 경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김... \n9523 2023.05.26 09:16 지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외... \n9524 2023.05.26 09:15 /사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강... \n9525 2023.05.26 09:12 [특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉... \n\n[2033 rows x 6 columns]", - "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 \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 \n \n \n \n \n
companytitlelinkwriterdatecontent
7493삼성전자데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ...https://finance.naver.com/item/news_read.naver...조선비즈2023.07.10 15:29챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...
7494삼성전자LS일렉트릭, 텍사스 공장 짓는다…현지 삼성·SK·LG 전력 지원https://finance.naver.com/item/news_read.naver...뉴스12023.07.10 15:08북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ...
7495삼성전자“삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연https://finance.naver.com/item/news_read.naver...매일경제2023.07.10 15:07삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...
7496삼성전자SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급https://finance.naver.com/item/news_read.naver...뉴시스2023.07.10 15:05해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (...
7497삼성전자‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파https://finance.naver.com/item/news_read.naver...매경이코노미2023.07.10 14:58북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...
.....................
9521삼성전자엔비디아 폭등에…삼성전자·SK하이닉스 동반 강세https://finance.naver.com/item/news_read.naver...뉴시스2023.05.26 09:25[서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간...
9522삼성전자\"7만전자 영차\"…삼성전자, 장초반 1% 이상 올라[특징주]https://finance.naver.com/item/news_read.naver...뉴스12023.05.26 09:19경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김...
9523삼성전자코스피, 외인 순매수 속 강보합…삼전 1%·하이닉스 3% 상승https://finance.naver.com/item/news_read.naver...한국경제2023.05.26 09:16지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외...
9524삼성전자삼전·하이닉스 강세에 코스피도 상승 출발…외인 매수세https://finance.naver.com/item/news_read.naver...머니투데이2023.05.26 09:15/사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강...
9525삼성전자반도체 반등 시작했나…삼성전자·SK하이닉스 연일 강세https://finance.naver.com/item/news_read.naver...머니투데이2023.05.26 09:12[특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉...
\n

2033 rows × 6 columns

\n
" - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "news[news['company'] == \"삼성전자\"]" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 8, - "outputs": [ - { - "data": { - "text/plain": " company title \\\n7493 삼성전자 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... \n7494 삼성전자 LS일렉트릭, 텍사스 공장 짓는다…현지 삼성·SK·LG 전력 지원 \n7495 삼성전자 “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 \n7496 삼성전자 SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 \n7497 삼성전자 ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 \n... ... ... \n9521 삼성전자 엔비디아 폭등에…삼성전자·SK하이닉스 동반 강세 \n9522 삼성전자 \"7만전자 영차\"…삼성전자, 장초반 1% 이상 올라[특징주] \n9523 삼성전자 코스피, 외인 순매수 속 강보합…삼전 1%·하이닉스 3% 상승 \n9524 삼성전자 삼전·하이닉스 강세에 코스피도 상승 출발…외인 매수세 \n9525 삼성전자 반도체 반등 시작했나…삼성전자·SK하이닉스 연일 강세 \n\n link writer \\\n7493 https://finance.naver.com/item/news_read.naver... 조선비즈 \n7494 https://finance.naver.com/item/news_read.naver... 뉴스1 \n7495 https://finance.naver.com/item/news_read.naver... 매일경제 \n7496 https://finance.naver.com/item/news_read.naver... 뉴시스 \n7497 https://finance.naver.com/item/news_read.naver... 매경이코노미 \n... ... ... \n9521 https://finance.naver.com/item/news_read.naver... 뉴시스 \n9522 https://finance.naver.com/item/news_read.naver... 뉴스1 \n9523 https://finance.naver.com/item/news_read.naver... 한국경제 \n9524 https://finance.naver.com/item/news_read.naver... 머니투데이 \n9525 https://finance.naver.com/item/news_read.naver... 머니투데이 \n\n date content \n7493 2023.07.10 15:29 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... \n7494 2023.07.10 15:08 북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ... \n7495 2023.07.10 15:07 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... \n7496 2023.07.10 15:05 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (... \n7497 2023.07.10 14:58 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... \n... ... ... \n9521 2023.05.26 09:25 [서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간... \n9522 2023.05.26 09:19 경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김... \n9523 2023.05.26 09:16 지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외... \n9524 2023.05.26 09:15 /사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강... \n9525 2023.05.26 09:12 [특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉... \n\n[2008 rows x 6 columns]", - "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 \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 \n \n \n \n \n
companytitlelinkwriterdatecontent
7493삼성전자데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ...https://finance.naver.com/item/news_read.naver...조선비즈2023.07.10 15:29챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...
7494삼성전자LS일렉트릭, 텍사스 공장 짓는다…현지 삼성·SK·LG 전력 지원https://finance.naver.com/item/news_read.naver...뉴스12023.07.10 15:08북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ...
7495삼성전자“삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연https://finance.naver.com/item/news_read.naver...매일경제2023.07.10 15:07삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...
7496삼성전자SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급https://finance.naver.com/item/news_read.naver...뉴시스2023.07.10 15:05해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (...
7497삼성전자‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파https://finance.naver.com/item/news_read.naver...매경이코노미2023.07.10 14:58북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...
.....................
9521삼성전자엔비디아 폭등에…삼성전자·SK하이닉스 동반 강세https://finance.naver.com/item/news_read.naver...뉴시스2023.05.26 09:25[서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간...
9522삼성전자\"7만전자 영차\"…삼성전자, 장초반 1% 이상 올라[특징주]https://finance.naver.com/item/news_read.naver...뉴스12023.05.26 09:19경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김...
9523삼성전자코스피, 외인 순매수 속 강보합…삼전 1%·하이닉스 3% 상승https://finance.naver.com/item/news_read.naver...한국경제2023.05.26 09:16지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외...
9524삼성전자삼전·하이닉스 강세에 코스피도 상승 출발…외인 매수세https://finance.naver.com/item/news_read.naver...머니투데이2023.05.26 09:15/사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강...
9525삼성전자반도체 반등 시작했나…삼성전자·SK하이닉스 연일 강세https://finance.naver.com/item/news_read.naver...머니투데이2023.05.26 09:12[특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉...
\n

2008 rows × 6 columns

\n
" - }, - "execution_count": 8, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "news[news['company'] == \"삼성전자\"].drop_duplicates(subset='title')" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "# Train New Tokenizer\n", - "# def get_news(news):\n", - "# \tcontent = news['content']\n", - "# \tfor start_idx in range(0, len(content), 1000):\n", - "# \t\tsamples = content[start_idx:start_idx+1000]\n", - "# \t\tyield samples" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "# tokenizer = AutoTokenizer.from_pretrained(\"klue/roberta-base\")\n", - "# trained_tokenizer = tokenizer.train_new_from_iterator(get_news(news), vocab_size=32000)" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "# trained_tokenizer.tokenize(news.sample(1)['content'].item())" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 9, - "outputs": [], - "source": [ - "company = news['company'].unique()" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 10, - "outputs": [], - "source": [ - "ecopro = news[news['company'] == '에코프로']['content']" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 11, - "outputs": [], - "source": [ - "samsung = news[news['company'] == '삼성전자']['content']" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 12, - "outputs": [ - { - "data": { - "text/plain": "7493 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...\n7494 북미 첫 배전시스템 생산거점…생산설비 및 R&D센터 구축 삼성전자 파운드리 공장과 ...\n7495 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...\n7496 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (...\n7497 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...\n ... \n9521 [서울=뉴시스] 김경택 기자 = 삼성전자와 SK하이닉스가 장 초반 동반 강세다. 간...\n9522 경기 수원 영통구 삼성전자 본사의 모습. 2022.3.28/뉴스1 ⓒ News1 김...\n9523 지난 25일 오후 서울 중구 을지로 하나은행 본점 딜링룸. 사진=연합뉴스코스피가 외...\n9524 /사진=임종철 디자인기자기관이 증시에서 매도하며 상승폭이 제한되고 있지만 반도체 강...\n9525 [특징주]삼성전자엔비디아발(發) 훈풍에 코스피 반도체 대형주인 삼성전자와 SK하이닉...\nName: content, Length: 2033, dtype: object" - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "samsung" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 13, - "outputs": [], - "source": [ - "from krwordrank.word import summarize_with_keywords" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 14, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "scan vocabs ... \n", - "num vocabs = 30397\n", - "done = 10\n" - ] - } - ], - "source": [ - "samsung_keywords = summarize_with_keywords(samsung.tolist(),\n", - "\t\t\t\t\t\t\t\t min_count=10,\n", - "\t\t\t\t\t\t\t\t max_length=10,\n", - "\t\t\t\t\t\t\t\t beta=0.85,\n", - "\t\t\t\t\t\t\t\t max_iter=10,\n", - "\t\t\t\t\t\t\t\t verbose=True)" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 15, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "scan vocabs ... \n", - "num vocabs = 12622\n", - "done = 10\n" - ] - } - ], - "source": [ - "ecopro_keywords = summarize_with_keywords(ecopro.tolist(),\n", - "\t\t\t\t\t\t\t\t min_count=10,\n", - "\t\t\t\t\t\t\t\t max_length=10,\n", - "\t\t\t\t\t\t\t\t beta=0.85,\n", - "\t\t\t\t\t\t\t\t max_iter=10,\n", - "\t\t\t\t\t\t\t\t verbose=True)" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 16, - "outputs": [ - { - "data": { - "text/plain": "{'삼성': 113.04899471286005,\n '있다.': 96.40025318211502,\n '반도체': 76.9444809698702,\n '것으로': 57.41522417632173,\n '지난': 44.09371281340386,\n '시장': 41.46153028474646,\n '미국': 38.031196586616815,\n '올해': 37.70354689784546,\n '20': 32.574438066067046,\n '있는': 32.05366671509987,\n '따르면': 31.490588741709978,\n '통해': 29.819577665835357,\n '글로벌': 27.451159114847776,\n '제품': 27.020630444594993,\n '대비': 26.903514518127682,\n '말했다.': 26.652387349729356,\n 'AI': 24.394467032344135,\n '국내': 24.16760445268324,\n '대한': 23.415857106259235,\n '밝혔다.': 23.041813486837455,\n '최근': 23.025695399497952,\n '파운드리': 22.402067269813514,\n '실적': 22.267028820371173,\n '기업': 22.248983977863332,\n '2분기': 21.792027397688823,\n '위해': 21.5718121136273,\n '기술': 21.518306211439885,\n '이후': 20.889227921875438,\n '이어': 20.279837730556185,\n '연구원은': 20.121186816728986,\n '메모리': 20.013778836789744,\n '위한': 18.3880931725465,\n '이날': 18.117215069742315,\n '사업': 17.92858192379237,\n '했다.': 16.876348161285556,\n '스마트': 16.766850786194194,\n '최대': 16.7539714595688,\n '것이': 16.656891018475932,\n '등을': 16.639149420003566,\n '중국': 16.54890383819393,\n '이번': 16.429622935691302,\n '갤럭시': 16.108544225282593,\n '기자]': 15.281724222039594,\n '매출': 15.113520072559439,\n '주가': 14.873539455566247,\n '투자': 14.847024909171799,\n 'TV': 14.774839631407232,\n '함께': 14.67042481586292,\n '전망': 14.2072089165826,\n '각각': 14.151467429653152,\n '세계': 14.08805380041153,\n '특히': 13.954154964610524,\n '현재': 13.727580147803764,\n '업계': 13.624476380663015,\n '서울': 13.39578518613723,\n '오른': 13.28257220616118,\n '열린': 13.171850855907183,\n '10': 13.127804978207454,\n 'D램': 13.104814252989478,\n '1분기': 13.065691640004898,\n '상승': 12.934905065043786,\n '개발': 12.690562199448552,\n '같은': 12.686543269127075,\n '기존': 12.660521818672008,\n '이상': 12.551319454786267,\n '가장': 12.376730741078857,\n '공정': 12.058946044436594,\n '오는': 11.852371658108838,\n '수요': 11.823481852996538,\n '제공': 11.512378466201946,\n '다양한': 11.462409872127832,\n '외국인': 11.391831267344774,\n '프로': 11.36956535143897,\n '고객': 11.141642457050207,\n '경우': 11.082107682421261,\n '기준': 11.08195045421991,\n '영업': 11.003131941251652,\n '관련': 10.971401407697837,\n '주요': 10.951053631956672,\n 'OLED': 10.93389035668707,\n '확대': 10.929831688510971,\n '하반기': 10.78476355703099,\n '따라': 10.533051495722162,\n '출시': 10.506325932631405,\n '대해': 10.323349537573318,\n 'SK하이닉스': 10.19297727744963,\n '사용': 10.084722014770199,\n '차세대': 9.925454133544799,\n '1위': 9.89215093382253,\n '예상': 9.781481776697856,\n '한국': 9.761195412123847,\n '반면': 9.688303839817408,\n '생산': 9.60406675688774,\n '가운데': 9.462230130219446,\n '관계자는': 9.45382339157439,\n '에너지': 9.441387451197949,\n '비스포크': 9.389580621539862,\n '가격': 9.21583725806167,\n \"'삼성\": 9.157540532568149,\n 'LG': 9.055550403168208}" - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "samsung_keywords" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 17, - "outputs": [ - { - "data": { - "text/plain": "{'에코프': 54.889926129265355,\n '있다.': 50.15794883185085,\n '주가': 32.208321531943106,\n '지난': 28.02402241567823,\n '것으로': 23.148091240480124,\n '대비': 22.73903068801928,\n '이날': 22.300822473609166,\n '오른': 20.55145039943215,\n '투자': 20.326081943714932,\n '따르면': 20.231533316702556,\n '상승': 19.049847308432042,\n '코스닥': 17.805913531509685,\n '연구원은': 17.555263009569227,\n '각각': 17.226170678785344,\n '거래': 15.385203867153033,\n '양극재': 15.093433961339818,\n '올해': 14.98328092983398,\n '최근': 14.303050376010049,\n '대한': 14.257971201212495,\n '개인': 13.649856045867324,\n '공매도': 13.553441253263456,\n '미국': 13.056397864081916,\n '기업': 12.961074989749152,\n '현재': 12.244882983648905,\n '있는': 12.216823557403572,\n '하락': 11.976526868536139,\n '기준': 11.938983704280195,\n '시장': 11.821909606994756,\n '국내': 11.540605061803102,\n '종목': 11.365818093263782,\n '20': 11.253322834538004,\n '주식': 11.129030719338278,\n '반면': 11.014786466296483,\n '이후': 10.199095486966236,\n '외국인': 9.610091829773992,\n '말했다.': 9.488019423566351,\n '배터리': 9.286679672657694,\n '순매수': 9.090008812269485,\n '장중': 9.082321431644582,\n '2차': 8.981199445665863,\n '10': 8.725850139283011,\n '상장': 8.638330843843544,\n '이어': 8.60627591237572,\n '매도': 8.595488891917958,\n '생산': 8.506924278944544,\n '밝혔다.': 8.417713342614647,\n '관련': 8.396886825534901,\n '전날': 8.07280030567031,\n '했다.': 7.8301759176879795,\n '자회사': 7.606553752027324,\n '실적': 7.480810547261821,\n '역시': 7.382803951348751,\n '매수': 7.330625796116874,\n '급등': 7.320371588273142,\n '증권': 7.160946144592455,\n '같은': 7.0474046243294,\n '상위': 6.983408733653821,\n '대해': 6.913006765999552,\n '소재': 6.87618260127226,\n '들어': 6.7873567734875335,\n '중이다.': 6.759198140348204,\n '위한': 6.75017133471917,\n '가장': 6.672047369673819,\n '이상': 6.623429481580587,\n '지수': 6.467811532312368,\n '높은': 6.432358343820328,\n '오전': 6.423436136803585,\n '내린': 6.3948323145491575,\n '원),': 6.336123601034103,\n '등을': 6.29948359365883,\n '전기차': 6.29602311691635,\n 'JYP': 6.265788265865504,\n '기록': 6.1924825822205705,\n '매출': 6.0649108367224684,\n '전구체': 6.05625301887726,\n '장을': 6.003681345873961,\n '가운데': 5.99308043971747,\n '위해': 5.942913257204755,\n '1분기': 5.927935451826446,\n '특히': 5.910735646368337,\n '것이': 5.82644797564794,\n '마쳤다.': 5.724675950284127,\n '올랐다.': 5.700854068975071,\n '경우': 5.610166528751129,\n '기관': 5.514381261022586,\n '것은': 5.420623021429579,\n '규모': 5.37162192457227,\n '전년': 5.293710680905656,\n '성장': 5.290821878882535,\n '삼성': 5.206893585272747,\n '기자]': 5.189995398024994,\n '예상': 5.1702086252124015,\n '사업': 5.151595301835381,\n '기간': 5.1296201190158595,\n '기대': 5.093648573320658,\n '한국': 5.087456783661878,\n '증가한': 5.080745851521144,\n '이달': 4.998743613210991,\n '공장': 4.9884009499974615,\n '다만': 4.8965672152555655}" - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "ecopro_keywords" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 18, - "outputs": [], - "source": [ - "top_k = set(samsung_keywords) - set(ecopro_keywords)" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 19, - "outputs": [], - "source": [ - "t = {key : samsung_keywords[key] for key in top_k}" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 20, - "outputs": [ - { - "data": { - "text/plain": "[('반도체', 76.9444809698702),\n ('통해', 29.819577665835357),\n ('글로벌', 27.451159114847776),\n ('제품', 27.020630444594993),\n ('AI', 24.394467032344135),\n ('파운드리', 22.402067269813514),\n ('2분기', 21.792027397688823),\n ('기술', 21.518306211439885),\n ('메모리', 20.013778836789744),\n ('스마트', 16.766850786194194),\n ('최대', 16.7539714595688),\n ('중국', 16.54890383819393),\n ('이번', 16.429622935691302),\n ('갤럭시', 16.108544225282593),\n ('TV', 14.774839631407232),\n ('함께', 14.67042481586292),\n ('전망', 14.2072089165826),\n ('세계', 14.08805380041153),\n ('업계', 13.624476380663015),\n ('서울', 13.39578518613723),\n ('열린', 13.171850855907183),\n ('D램', 13.104814252989478),\n ('개발', 12.690562199448552),\n ('기존', 12.660521818672008),\n ('공정', 12.058946044436594),\n ('오는', 11.852371658108838),\n ('수요', 11.823481852996538),\n ('제공', 11.512378466201946),\n ('다양한', 11.462409872127832),\n ('프로', 11.36956535143897),\n ('고객', 11.141642457050207),\n ('영업', 11.003131941251652),\n ('주요', 10.951053631956672),\n ('OLED', 10.93389035668707),\n ('확대', 10.929831688510971),\n ('하반기', 10.78476355703099),\n ('따라', 10.533051495722162),\n ('출시', 10.506325932631405),\n ('SK하이닉스', 10.19297727744963),\n ('사용', 10.084722014770199),\n ('차세대', 9.925454133544799),\n ('1위', 9.89215093382253),\n ('관계자는', 9.45382339157439),\n ('에너지', 9.441387451197949),\n ('비스포크', 9.389580621539862),\n ('가격', 9.21583725806167),\n (\"'삼성\", 9.157540532568149),\n ('LG', 9.055550403168208)]" - }, - "execution_count": 20, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "sorted(t.items() , reverse=True, key=lambda x: x[1])" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [], - "metadata": { - "collapsed": false - } - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Notebooks/Transformer_Keyword Extraction.ipynb b/Notebooks/Transformer_Keyword Extraction.ipynb new file mode 100644 index 0000000..9a5a62b --- /dev/null +++ b/Notebooks/Transformer_Keyword Extraction.ipynb @@ -0,0 +1,235 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import sys\n", + "\n", + "from konlpy.tag import Okt, Mecab\n", + "from pathlib import Path" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "sys.path.append(str(Path.home().joinpath(\"level3_nlp_finalproject-nlp-04\")))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "from utils.preprocessing import *\n", + "from keyword_extractor.model import KeyBert" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "df = pd.read_csv(Path.cwd().parent.joinpath(\"Data\", \"News\", \"005930.csv\"))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "df['content'] = df['content'].apply(lambda x : all_preprocessing(x))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "okt = Okt()\n", + "mecab = Mecab()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# Sentence-Transformer => STS, NLI 데이터셋" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "model1 = KeyBert(\"jhgan/ko-sroberta-multitask\")\n", + "model2 = KeyBert(\"jhgan/ko-sroberta-nli\")\n", + "model3 = KeyBert(\"snunlp/KR-SBERT-V40K-klueNLI-augSTS\")\n", + "model4 = KeyBert(\"sentence-transformers/xlm-r-100langs-bert-base-nli-stsb-mean-tokens\")" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# mecab_word = df['content'].sample(10).apply(lambda x : \" \".join(okt.nouns(x))).tolist()\n", + "mecab_word = df['content'].sample(10).tolist()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "for corpus in mecab_word:\n", + "\tprint(\"Sentence : \", corpus)\n", + "\tprint(\"=\"*5)\n", + "\tprint(\"(sroberta-multi, sroberta-nli, v40k, xlm)\")\n", + "\tfor (a, b, c, d) in zip(model1.extract_keywords(corpus,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tdiversity=0.9,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tcandidate_frac=0.5,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'],\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\ttag_type=\"okt\")[0],\n", + "\n", + "\t\t\t\t\t\t\tmodel2.extract_keywords(corpus,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tdiversity=0.9,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tcandidate_frac=0.5,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'],\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\ttag_type=\"okt\")[0],\n", + "\t\t\t\t\t\t\tmodel3.extract_keywords(corpus,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tdiversity=0.9,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tcandidate_frac=0.5,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'],\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\ttag_type=\"okt\")[0],\n", + "\t\t\t\t\t\t\tmodel4.extract_keywords(corpus,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tdiversity=0.9,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tcandidate_frac=0.5,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'],\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\ttag_type=\"okt\")[0]):\n", + "\t\tprint(a, b, c, d)\n", + "\tprint(\"=\"*10)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "keywords = model3.extract_keywords(mecab_word,\n", + "\t\t\t\t\t\tkeyphrase_ngram_range=(1, 1),\n", + "\t\t\t\t\t\tdiversity=0.9,\n", + "\t\t\t\t\t\tcandidate_frac=0.5,\n", + "\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'])" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "keywords" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "for keyword, score in keywords[0]:\n", + "\tprint(keyword)\n", + "\tap = okt.pos(keyword)\n", + "\n", + "\twhile len(ap)!=0 and \"N\" != ap[-1][1][0]:\n", + "\t\tap.pop()\n", + "\tprint(\"\".join([a[0] for a in ap]))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "mecab.pos(\"갤럭시s23울트라의\")" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/keyword-extraction/keyword extraction pipeline.ipynb b/Notebooks/keyword extraction pipeline.ipynb similarity index 100% rename from keyword-extraction/keyword extraction pipeline.ipynb rename to Notebooks/keyword extraction pipeline.ipynb diff --git a/keyword_extractor/__init__.py b/keyword_extractor/__init__.py new file mode 100644 index 0000000..73e0854 --- /dev/null +++ b/keyword_extractor/__init__.py @@ -0,0 +1,3 @@ +from .maxsum import * +from .mmr import * +from .model import * \ No newline at end of file diff --git a/keyword_extractor/maxsum.py b/keyword_extractor/maxsum.py new file mode 100644 index 0000000..edc51a3 --- /dev/null +++ b/keyword_extractor/maxsum.py @@ -0,0 +1,35 @@ +import itertools +import numpy as np + +from sklearn.metrics.pairwise import cosine_similarity + +def max_sum_sim( + doc_embedding, + word_embedding, + words, + nr_candidates: int, + top_k: int = 5, + ): + if nr_candidates < top_k: + raise Exception("고려할 후보 군의 갯수가 Top-K보다 작습니다.") + elif top_k > len(words): + return [] + + dis = cosine_similarity(doc_embedding, word_embedding) + dis_words = cosine_similarity(word_embedding) + + words_idx = list(dis.argsort()[0][-nr_candidates:]) + words_vals = [words[idx] for idx in words_idx] + candidates = dis_words[np.ix_(words_idx, words_idx)] + + min_sim = 100_000 + candidate = None + + for combination in itertools.combinations(range(len(words_idx)), top_k): + sim = sum([candidates[i][j] for i in combination for j in combination if i != j]) + + if sim < min_sim: + candidate = combination + min_sim = sim + + return [(words_vals[idx], round(float(dis[0][words_idx[idx]]), 3)) for idx in candidate] \ No newline at end of file diff --git a/keyword_extractor/mmr.py b/keyword_extractor/mmr.py new file mode 100644 index 0000000..2c4569c --- /dev/null +++ b/keyword_extractor/mmr.py @@ -0,0 +1,33 @@ +import numpy as np + +from typing import List, Tuple + +from sklearn.metrics.pairwise import cosine_similarity + +def mmr( + doc_embedding, + word_embedding, + words, + top_k: int = 5, + diversity: float = 0.7, + ) -> List[Tuple[str, float]]: + word_doc_sim = cosine_similarity(word_embedding, doc_embedding) + word_sim = cosine_similarity(word_embedding) + + keywords_idx = [np.argmax(word_doc_sim)] + candidate_idx = [i for i in range(len(words)) if i != keywords_idx[0]] + + for _ in range(min(top_k-1, len(words)-1)): + candidate_sim = word_doc_sim[candidate_idx, :] + target_sim = np.max(word_sim[candidate_idx][:, keywords_idx], axis=1) + + mmr = (1-diversity) * candidate_sim - diversity * target_sim.reshape(-1, 1) + mmr_idx = candidate_idx[np.argmax(mmr)] + + keywords_idx.append(mmr_idx) + candidate_idx.remove(mmr_idx) + + keywords = [(words[idx], round(float(word_doc_sim.reshape(1, -1)[0][idx]), 3)) for idx in keywords_idx] + keywords = sorted(keywords, key=lambda x: x[1], reverse=True) + + return keywords \ No newline at end of file diff --git a/keyword_extractor/model.py b/keyword_extractor/model.py new file mode 100644 index 0000000..75755e3 --- /dev/null +++ b/keyword_extractor/model.py @@ -0,0 +1,156 @@ +import numpy as np + +from typing import List, Union, Tuple + +from konlpy.tag import Mecab, Okt + +from sentence_transformers import SentenceTransformer +from sklearn.metrics.pairwise import cosine_similarity +from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer + +from keyword_extractor.mmr import mmr +from keyword_extractor.maxsum import max_sum_sim + +class KeyBert: + """Keyword Extractor using Sentence-BERT + + + Attributes: + model: Sentence-BERT model + """ + def __init__(self, model_name="sentence-transformers/paraphrase-multilingual-mpnet-base-v2") -> None: + """Initialize Sentence-BERT Model Object + + Args: + model_name: Sentence-BERT model name in HuggingFace + """ + self.model = SentenceTransformer(model_name) + + def extract_keywords(self, + docs: Union[str, List[str]], + keyphrase_ngram_range: Tuple[int, int]=(1, 1), + stop_words:Union[str, List[str]] = [], + top_k:int = 5, + diversity:float = 0.7, + min_df:int = 1, + candidate_frac:float = 0.3, + vectorizer_type:str = "tfidf", + tag_type:str = "mecab", + ) -> List[Tuple[str, float]]: + """Extract keywords from documents + + Vectorizer를 이용해서, 문서에서 후보 키워드를 추출 + 추출된 후보 키워드를 Sentence-BERT를 이용해서 문서와의 유사도(MMR)를 계산 + + Args: + docs: + Documents to extract keywords + keyphrase_ngram_range: + N-gram range for keyphrase + stop_words: + Stop words for vectorizer + top_k: + Number of keywords to extract + diversity: + Diversity for MMR - (0 ~ 1) + min_df: + Minimum document frequency for vectorizer + candidate_frac: + Fraction of candidates to extract keywords - (0 ~ 1) + vectorizer_type: + Vectorizer type for extracting keywords - ["count", "tfidf"] + tag_type: + Tagger type for extracting keywords - ["mecab", "okt"] + + Returns: + List of keywords and scores: + [("keyword1", score1), ("keyword2", score2), ...] + + """ + + if isinstance(docs, str): + if docs: + docs = [docs] + else: + return [] + + # Count Vectorizer + if vectorizer_type == "count": + vectorizer = CountVectorizer(ngram_range=keyphrase_ngram_range, min_df=min_df, stop_words=stop_words).fit(docs) + # TF-IDF Vectorizer + elif vectorizer_type == "tfidf": + vectorizer = TfidfVectorizer(ngram_range=keyphrase_ngram_range, min_df=min_df, stop_words=stop_words).fit(docs) + + + words = vectorizer.get_feature_names_out() # Vocab이 뽑힘 + df = vectorizer.transform(docs) + + doc_embs = self.model.encode(docs) + word_embs = self.model.encode(words) + + all_keywords = [] + + for i, _ in enumerate(docs): + df_value = df[i].data + top_frac_candidate_idx = df[i].nonzero()[1][np.argsort(df_value)[::-1][:int(len(df_value) * candidate_frac)]] + # candidate_idx = df[i].nonzero()[1] + candidate_words = [words[idx] for idx in top_frac_candidate_idx] + candidate_emb = word_embs[top_frac_candidate_idx] + + doc_emb = doc_embs[i].reshape(1, -1) + + keywords = mmr(doc_emb, + candidate_emb, + candidate_words, + top_k, + diversity) + + keywords = self.post_processing(keywords, tag_type, stop_words) + + all_keywords.append(keywords) + + return all_keywords + + + def post_processing(self, + keywords, + tag_type:str = None, + stop_words:Union[str, List[str]] = [], + ) -> List[Tuple[str, float]]: + """Post-processing for extracted keywords + + 추출된 키워드의 오른쪽 경계의 품사를 확인하고, 명사가 아니면 차례로 제거 + + Args: + keywords: + Keywords to post-process + tag_type: + Tagger type for post-processing + stop_words: + Stop words for post-processing + + Returns: + List of keywords and scores: + [("keyword1", score1), ("keyword2", score2), ...] + """ + assert tag_type is not None, "tag_type을 입력해주세요." + + processed_keywords = [] + + if tag_type == "mecab": + tagger = Mecab() + elif tag_type == "okt": + tagger = Okt() + + for word, score in keywords: + ap = tagger.pos(word) + + while len(ap) != 0 and "N" != ap[-1][1][0]: # 맨 우측에서부터 명사가 아닌 것을 제거 + ap.pop() + + keyword = "".join([a[0] for a in ap]) + + if keyword and (keyword not in stop_words): # 키워드가 남아있으면, 추가 + processed_keywords.append((keyword, score)) + + return processed_keywords \ No newline at end of file From 5a92bc875f10ed5a56a8034a028dedea0e20e6dc Mon Sep 17 00:00:00 2001 From: Yungi Date: Sat, 22 Jul 2023 10:57:52 +0900 Subject: [PATCH 24/63] [Etc] Move Notebooks Directory --- .../KRWordRank_KeyWord Extraction.ipynb | 330 ++ .../Transformer_Keyword Extraction.ipynb | 235 + .../keyword extraction pipeline.ipynb | 3957 +++++++++++++++++ 3 files changed, 4522 insertions(+) create mode 100644 Notebooks/Keyword Extraction/KRWordRank_KeyWord Extraction.ipynb create mode 100644 Notebooks/Keyword Extraction/Transformer_Keyword Extraction.ipynb create mode 100644 Notebooks/Keyword Extraction/keyword extraction pipeline.ipynb diff --git a/Notebooks/Keyword Extraction/KRWordRank_KeyWord Extraction.ipynb b/Notebooks/Keyword Extraction/KRWordRank_KeyWord Extraction.ipynb new file mode 100644 index 0000000..17e2142 --- /dev/null +++ b/Notebooks/Keyword Extraction/KRWordRank_KeyWord Extraction.ipynb @@ -0,0 +1,330 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import os\n", + "import sys\n", + "import numpy as np\n", + "from pathlib import Path\n", + "from tqdm import trange\n", + "from transformers import AutoModel, AutoTokenizer\n", + "from konlpy.tag import Mecab, Okt" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "outputs": [], + "source": [ + "sys.path.append(str(Path.home().joinpath(\"level3_nlp_finalproject-nlp-04\")))\n", + "from utils.preprocessing import *" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 3, + "outputs": [], + "source": [ + "news = pd.read_csv(Path.cwd().parent.joinpath(\"Data\", \"News\", \"005930.csv\"))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 4, + "outputs": [], + "source": [ + "# news = preprocess_dataframe(news)\n", + "news['content'].replace('', np.nan, inplace=True)\n", + "news.dropna(subset=['content'], inplace=True)\n", + "news.reset_index(drop=True, inplace=True)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": 5, + "outputs": [ + { + "data": { + "text/plain": " company title \\\n0 삼성전자 “지독한 중국 떼로 덤비더니” 삼성 점유율 절반 뺏아갔다 \n1 삼성전자 “반도체 시간이 온다”…야심작 출격한 삼성전자, 비밀병기는 \n2 삼성전자 D램 격차 더 벌린 삼성전자…업계 첫 12나노급 양산 \n3 삼성전자 현대차에 내준 '영업이익 1위' 삼성전자, 하반기엔 되찾는다 \n4 삼성전자 삼성전자 '12나노급 D램' 세계 첫 양산 \n... ... ... \n2874 삼성전자 [특징주] 삼성전자, 장중 7만원선 밑돌아…외인 매도에 1% 하락(종합... \n2875 삼성전자 AMD CEO \"韓 언론을 믿냐\"…삼성, AMD 3나노 수주보도에 'T... \n2876 삼성전자 바닥 찍은 반도체·디스플레이… 삼성전자·LGD, 4분기 흑자전환 기대감... \n2877 삼성전자 '황금명함'만 있는 게 아니다...삼성전자 새내기 부모님 '이것' 받고... \n2878 삼성전자 [특징주] 삼성전자, 2% 하락해 다시 ‘6만전자’ \n\n link writer \\\n0 https://finance.naver.com/item/news_read.naver... 헤럴드경제 \n1 https://finance.naver.com/item/news_read.naver... 매일경제 \n2 https://finance.naver.com/item/news_read.naver... 파이낸셜뉴스 \n3 https://finance.naver.com/item/news_read.naver... 매일경제 \n4 https://finance.naver.com/item/news_read.naver... 매일경제 \n... ... ... \n2874 https://finance.naver.com/item/news_read.naver... 연합뉴스 \n2875 https://finance.naver.com/item/news_read.naver... 아시아경제 \n2876 https://finance.naver.com/item/news_read.naver... 조선비즈 \n2877 https://finance.naver.com/item/news_read.naver... 파이낸셜뉴스 \n2878 https://finance.naver.com/item/news_read.naver... 조선비즈 \n\n date content \n0 2023.05.18 22:14 중국 화웨이 폴더블폰 S포켓[헤럴드경제= 박영훈 기자] “삼성 타도 외치더니” 중... \n1 2023.05.18 19:02 12나노급 DDR5 D램 양산 EUV 공정 등 기술력 총동원 DDR5로의 시장 전환... \n2 2023.05.18 18:41 1초에 UHD 영화 2편 처리 가능 생산성 20% 소비전력 23% 개선 ‘챗GPT’... \n3 2023.05.18 17:46 현대차 실적 상고하저 예상 3분기 2조8200억원 그칠듯 삼성전자 하반기 본격 반등... \n4 2023.05.18 17:43 반도체 업황부진 뚫을 야심작 생산성 20%·소비전력 23% ↑삼성전자가 메모리반도체... \n... ... ... \n2874 2023.07.21 15:44 (CG) [연합뉴스TV 제공](서울=연합뉴스) 송은경 기자 = 글로벌 반도체 업종 ... \n2875 2023.07.21 15:32 4년 만에 대만 방문한 리사 수 AMD CEO미국 반도체 업계를 대표하는 대만계 경... \n2876 2023.07.21 15:26 삼성전자, 3분기부터 메모리 감산 효과 본격화 3분기 들어 D램 가격 하락폭도 안정... \n2877 2023.07.21 14:53 삼성전자 반도체(DS)부문 입사 예정자들에게 전달된 황금명함과 꽃다발, 경계현 사장... \n2878 2023.07.21 09:22 21일 삼성전자가 2% 하락하며 다시 ‘6만전자’로 내려앉았다. 전날 미국 뉴욕증시... \n\n[2879 rows x 6 columns]", + "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 \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 \n \n \n \n \n
companytitlelinkwriterdatecontent
0삼성전자“지독한 중국 떼로 덤비더니” 삼성 점유율 절반 뺏아갔다https://finance.naver.com/item/news_read.naver...헤럴드경제2023.05.18 22:14중국 화웨이 폴더블폰 S포켓[헤럴드경제= 박영훈 기자] “삼성 타도 외치더니” 중...
1삼성전자“반도체 시간이 온다”…야심작 출격한 삼성전자, 비밀병기는https://finance.naver.com/item/news_read.naver...매일경제2023.05.18 19:0212나노급 DDR5 D램 양산 EUV 공정 등 기술력 총동원 DDR5로의 시장 전환...
2삼성전자D램 격차 더 벌린 삼성전자…업계 첫 12나노급 양산https://finance.naver.com/item/news_read.naver...파이낸셜뉴스2023.05.18 18:411초에 UHD 영화 2편 처리 가능 생산성 20% 소비전력 23% 개선 ‘챗GPT’...
3삼성전자현대차에 내준 '영업이익 1위' 삼성전자, 하반기엔 되찾는다https://finance.naver.com/item/news_read.naver...매일경제2023.05.18 17:46현대차 실적 상고하저 예상 3분기 2조8200억원 그칠듯 삼성전자 하반기 본격 반등...
4삼성전자삼성전자 '12나노급 D램' 세계 첫 양산https://finance.naver.com/item/news_read.naver...매일경제2023.05.18 17:43반도체 업황부진 뚫을 야심작 생산성 20%·소비전력 23% ↑삼성전자가 메모리반도체...
.....................
2874삼성전자[특징주] 삼성전자, 장중 7만원선 밑돌아…외인 매도에 1% 하락(종합...https://finance.naver.com/item/news_read.naver...연합뉴스2023.07.21 15:44(CG) [연합뉴스TV 제공](서울=연합뉴스) 송은경 기자 = 글로벌 반도체 업종 ...
2875삼성전자AMD CEO \"韓 언론을 믿냐\"…삼성, AMD 3나노 수주보도에 'T...https://finance.naver.com/item/news_read.naver...아시아경제2023.07.21 15:324년 만에 대만 방문한 리사 수 AMD CEO미국 반도체 업계를 대표하는 대만계 경...
2876삼성전자바닥 찍은 반도체·디스플레이… 삼성전자·LGD, 4분기 흑자전환 기대감...https://finance.naver.com/item/news_read.naver...조선비즈2023.07.21 15:26삼성전자, 3분기부터 메모리 감산 효과 본격화 3분기 들어 D램 가격 하락폭도 안정...
2877삼성전자'황금명함'만 있는 게 아니다...삼성전자 새내기 부모님 '이것' 받고...https://finance.naver.com/item/news_read.naver...파이낸셜뉴스2023.07.21 14:53삼성전자 반도체(DS)부문 입사 예정자들에게 전달된 황금명함과 꽃다발, 경계현 사장...
2878삼성전자[특징주] 삼성전자, 2% 하락해 다시 ‘6만전자’https://finance.naver.com/item/news_read.naver...조선비즈2023.07.21 09:2221일 삼성전자가 2% 하락하며 다시 ‘6만전자’로 내려앉았다. 전날 미국 뉴욕증시...
\n

2879 rows × 6 columns

\n
" + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "news" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# Train New Tokenizer\n", + "# def get_news(news):\n", + "# \tcontent = news['content']\n", + "# \tfor start_idx in range(0, len(content), 1000):\n", + "# \t\tsamples = content[start_idx:start_idx+1000]\n", + "# \t\tyield samples" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# tokenizer = AutoTokenizer.from_pretrained(\"klue/roberta-base\")\n", + "# trained_tokenizer = tokenizer.train_new_from_iterator(get_news(news), vocab_size=32000)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# trained_tokenizer.tokenize(news.sample(1)['content'].item())" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "okt = Okt()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "company = news['company'].unique()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "ecopro = news[news['company'] == '에코프로']['content']" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "samsung = news[news['company'] == '삼성전자']['content']" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "for i in trange(len(samsung)):\n", + "\tsamsung[i] = \" \".join(okt.nouns(samsung[i]))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "from krwordrank.word import summarize_with_keywords, KRWordRank" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "wordrank_extractor = KRWordRank(min_count=10, max_length=100)\n", + "\n", + "beta = 0.85\n", + "max_iter = 10\n", + "keywords, rank, graph = wordrank_extractor.extract(samsung.tolist(), beta, max_iter)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "for key, score in sorted(graph[5].items(), reverse=True, key=lambda x: x[1])[:100]:\n", + "\tprint(wordrank_extractor.int2token(key))\n", + "\tprint(score)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "samsung_keywords = summarize_with_keywords(samsung.tolist(),\n", + "\t\t\t\t\t\t\t\t min_count=10,\n", + "\t\t\t\t\t\t\t\t max_length=100,\n", + "\t\t\t\t\t\t\t\t beta=0.85,\n", + "\t\t\t\t\t\t\t\t max_iter=10,\n", + "\t\t\t\t\t\t\t\t verbose=False)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "samsung_keywords" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "ecopro_keywords = summarize_with_keywords(ecopro.tolist(),\n", + "\t\t\t\t\t\t\t\t min_count=10,\n", + "\t\t\t\t\t\t\t\t max_length=100,\n", + "\t\t\t\t\t\t\t\t beta=0.85,\n", + "\t\t\t\t\t\t\t\t max_iter=10,\n", + "\t\t\t\t\t\t\t\t verbose=True)\n", + "ecopro_keywords" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "top_k = set(samsung_keywords) - set(ecopro_keywords)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "t = {key : samsung_keywords[key] for key in top_k}" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "sorted(t.items() , reverse=True, key=lambda x: x[1])" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Notebooks/Keyword Extraction/Transformer_Keyword Extraction.ipynb b/Notebooks/Keyword Extraction/Transformer_Keyword Extraction.ipynb new file mode 100644 index 0000000..9a5a62b --- /dev/null +++ b/Notebooks/Keyword Extraction/Transformer_Keyword Extraction.ipynb @@ -0,0 +1,235 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import sys\n", + "\n", + "from konlpy.tag import Okt, Mecab\n", + "from pathlib import Path" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "sys.path.append(str(Path.home().joinpath(\"level3_nlp_finalproject-nlp-04\")))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "from utils.preprocessing import *\n", + "from keyword_extractor.model import KeyBert" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "df = pd.read_csv(Path.cwd().parent.joinpath(\"Data\", \"News\", \"005930.csv\"))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "df['content'] = df['content'].apply(lambda x : all_preprocessing(x))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "okt = Okt()\n", + "mecab = Mecab()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# Sentence-Transformer => STS, NLI 데이터셋" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "model1 = KeyBert(\"jhgan/ko-sroberta-multitask\")\n", + "model2 = KeyBert(\"jhgan/ko-sroberta-nli\")\n", + "model3 = KeyBert(\"snunlp/KR-SBERT-V40K-klueNLI-augSTS\")\n", + "model4 = KeyBert(\"sentence-transformers/xlm-r-100langs-bert-base-nli-stsb-mean-tokens\")" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "# mecab_word = df['content'].sample(10).apply(lambda x : \" \".join(okt.nouns(x))).tolist()\n", + "mecab_word = df['content'].sample(10).tolist()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "for corpus in mecab_word:\n", + "\tprint(\"Sentence : \", corpus)\n", + "\tprint(\"=\"*5)\n", + "\tprint(\"(sroberta-multi, sroberta-nli, v40k, xlm)\")\n", + "\tfor (a, b, c, d) in zip(model1.extract_keywords(corpus,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tdiversity=0.9,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tcandidate_frac=0.5,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'],\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\ttag_type=\"okt\")[0],\n", + "\n", + "\t\t\t\t\t\t\tmodel2.extract_keywords(corpus,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tdiversity=0.9,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tcandidate_frac=0.5,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'],\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\ttag_type=\"okt\")[0],\n", + "\t\t\t\t\t\t\tmodel3.extract_keywords(corpus,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tdiversity=0.9,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tcandidate_frac=0.5,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'],\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\ttag_type=\"okt\")[0],\n", + "\t\t\t\t\t\t\tmodel4.extract_keywords(corpus,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tdiversity=0.9,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tcandidate_frac=0.5,\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'],\n", + "\t\t\t\t\t\t\t\t\t\t\t\t\ttag_type=\"okt\")[0]):\n", + "\t\tprint(a, b, c, d)\n", + "\tprint(\"=\"*10)" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "keywords = model3.extract_keywords(mecab_word,\n", + "\t\t\t\t\t\tkeyphrase_ngram_range=(1, 1),\n", + "\t\t\t\t\t\tdiversity=0.9,\n", + "\t\t\t\t\t\tcandidate_frac=0.5,\n", + "\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'])" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "keywords" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "for keyword, score in keywords[0]:\n", + "\tprint(keyword)\n", + "\tap = okt.pos(keyword)\n", + "\n", + "\twhile len(ap)!=0 and \"N\" != ap[-1][1][0]:\n", + "\t\tap.pop()\n", + "\tprint(\"\".join([a[0] for a in ap]))" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [ + "mecab.pos(\"갤럭시s23울트라의\")" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "execution_count": null, + "outputs": [], + "source": [], + "metadata": { + "collapsed": false + } + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/Notebooks/Keyword Extraction/keyword extraction pipeline.ipynb b/Notebooks/Keyword Extraction/keyword extraction pipeline.ipynb new file mode 100644 index 0000000..ebfb0fe --- /dev/null +++ b/Notebooks/Keyword Extraction/keyword extraction pipeline.ipynb @@ -0,0 +1,3957 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "2d9c22439311433fbde63dec91fb7ffc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9acf167658a04032b54f36eb8cc1e9c8", + "IPY_MODEL_afca155d3a204bc19526d1578e3ff403", + "IPY_MODEL_f451cacff7044b3ea30925553902a0bc" + ], + "layout": "IPY_MODEL_b2ce5bdd00274c07939363b8a51affe7" + } + }, + "9acf167658a04032b54f36eb8cc1e9c8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9f7a91fbb53142a2963b49034c6e9f39", + "placeholder": "​", + "style": "IPY_MODEL_ccc1c4fb85cb4fffaf074cb6c7657357", + "value": "Downloading (…)okenizer_config.json: 100%" + } + }, + "afca155d3a204bc19526d1578e3ff403": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ab20e37d3dde4b5ba482e50e878b2eab", + "max": 365, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a5578182f4ec480bb479b5ee014b7e39", + "value": 365 + } + }, + "f451cacff7044b3ea30925553902a0bc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7c1fa72ef3bd45458cd136b1b01c44b5", + "placeholder": "​", + "style": "IPY_MODEL_69239a07eea34a2890c1da133a0cb47c", + "value": " 365/365 [00:00<00:00, 5.66kB/s]" + } + }, + "b2ce5bdd00274c07939363b8a51affe7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9f7a91fbb53142a2963b49034c6e9f39": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ccc1c4fb85cb4fffaf074cb6c7657357": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ab20e37d3dde4b5ba482e50e878b2eab": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a5578182f4ec480bb479b5ee014b7e39": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7c1fa72ef3bd45458cd136b1b01c44b5": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "69239a07eea34a2890c1da133a0cb47c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2046ef77bcd747ebaf2282d968d8d324": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9444d0ea409a443fa7843d620bed9fae", + "IPY_MODEL_5910343a2e2c46d89b221e272cce619a", + "IPY_MODEL_d4af78e36c0745559630d836f572ba10" + ], + "layout": "IPY_MODEL_7c443272e9584cd8a4e0bc494acac30d" + } + }, + "9444d0ea409a443fa7843d620bed9fae": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7b59e111e7cc413d9bfa87a6e077cc9f", + "placeholder": "​", + "style": "IPY_MODEL_b564d91d5d0e4168b19a3b7dc4089cf8", + "value": "Downloading (…)solve/main/vocab.txt: 100%" + } + }, + "5910343a2e2c46d89b221e272cce619a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_01fd16484b264eaaa3360e0de6972933", + "max": 263327, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9ab3dcd684d244848e5354ceeedeedeb", + "value": 263327 + } + }, + "d4af78e36c0745559630d836f572ba10": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_560c4ecb19f7446785ebd16eddc814f7", + "placeholder": "​", + "style": "IPY_MODEL_92e86e1a4a044af790df8e11f9a7fa0d", + "value": " 263k/263k [00:00<00:00, 3.41MB/s]" + } + }, + "7c443272e9584cd8a4e0bc494acac30d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7b59e111e7cc413d9bfa87a6e077cc9f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b564d91d5d0e4168b19a3b7dc4089cf8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "01fd16484b264eaaa3360e0de6972933": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9ab3dcd684d244848e5354ceeedeedeb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "560c4ecb19f7446785ebd16eddc814f7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "92e86e1a4a044af790df8e11f9a7fa0d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b5dcac63cd2649ef8a96d76111c31bbb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3df8295c1ef04c14897bb86f7f81a8a0", + "IPY_MODEL_7799deaee83a4ccdbbbb0e3a96b8a042", + "IPY_MODEL_5c89b41d27aa444a81f76098cf632513" + ], + "layout": "IPY_MODEL_7d6bcfa8eb794cf18cb282ca92e248dd" + } + }, + "3df8295c1ef04c14897bb86f7f81a8a0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e96da164d67d44998b4615edc9816731", + "placeholder": "​", + "style": "IPY_MODEL_3456d1eb82404263bce844e673579be6", + "value": "Downloading (…)/main/tokenizer.json: 100%" + } + }, + "7799deaee83a4ccdbbbb0e3a96b8a042": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_692ab560e5414507add9093ab3d308b1", + "max": 814850, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d4198e59eae247ff920a7fece1ddb701", + "value": 814850 + } + }, + "5c89b41d27aa444a81f76098cf632513": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a7e43dc7a1b2457fa5ea5ea359fafd08", + "placeholder": "​", + "style": "IPY_MODEL_7ec13f29d83d4be58fa557bbf5b4b980", + "value": " 815k/815k [00:00<00:00, 10.5MB/s]" + } + }, + "7d6bcfa8eb794cf18cb282ca92e248dd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e96da164d67d44998b4615edc9816731": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3456d1eb82404263bce844e673579be6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "692ab560e5414507add9093ab3d308b1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d4198e59eae247ff920a7fece1ddb701": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a7e43dc7a1b2457fa5ea5ea359fafd08": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7ec13f29d83d4be58fa557bbf5b4b980": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0c81c2073c2c4c8fac1d174d356d1659": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_afe5c9d4af724fef936d0b7b69c8d10b", + "IPY_MODEL_4fed88c7a3b848678f09ec9a13bb3c46", + "IPY_MODEL_b4c69a733e084bc1bea1e5106eedd48b" + ], + "layout": "IPY_MODEL_9e2472bae3f9489eb637ad681b551eaf" + } + }, + "afe5c9d4af724fef936d0b7b69c8d10b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_799a551beed049e78a16caad61bfaff3", + "placeholder": "​", + "style": "IPY_MODEL_7dfabc71cf9b460fbc350ec21cbe3165", + "value": "Downloading (…)cial_tokens_map.json: 100%" + } + }, + "4fed88c7a3b848678f09ec9a13bb3c46": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_17c52890539445a8a3e3ba25e1a34805", + "max": 125, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_720050fc0b2f45ed973564357b8b96c0", + "value": 125 + } + }, + "b4c69a733e084bc1bea1e5106eedd48b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e8f1b7529d104fb597c34827ff0b55c9", + "placeholder": "​", + "style": "IPY_MODEL_4c654170f9f64a7081ce622964ea9a6b", + "value": " 125/125 [00:00<00:00, 1.06kB/s]" + } + }, + "9e2472bae3f9489eb637ad681b551eaf": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "799a551beed049e78a16caad61bfaff3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7dfabc71cf9b460fbc350ec21cbe3165": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "17c52890539445a8a3e3ba25e1a34805": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "720050fc0b2f45ed973564357b8b96c0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e8f1b7529d104fb597c34827ff0b55c9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4c654170f9f64a7081ce622964ea9a6b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "aa3972c512604047a848ccbfd6ce7549": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_149b398730f14bc3a84d2537b1f43192", + "IPY_MODEL_3b6dd37cb3ac4300a608e4b7e47513fe", + "IPY_MODEL_2075e02c4a4b4e22a90b1a57299d110a" + ], + "layout": "IPY_MODEL_6a7c0dbf679b4588b7e127fd293343c3" + } + }, + "149b398730f14bc3a84d2537b1f43192": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2045aba1e11c4d618b763af8832f869f", + "placeholder": "​", + "style": "IPY_MODEL_b06d6137f7ee4ddfb34fbc4ba67b701b", + "value": "Downloading (…)lve/main/config.json: 100%" + } + }, + "3b6dd37cb3ac4300a608e4b7e47513fe": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_534575664a26442f8d9a82d2a2c7aaed", + "max": 1880, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9456688719ac46bb889049d7afabf36b", + "value": 1880 + } + }, + "2075e02c4a4b4e22a90b1a57299d110a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_08e297bfd5ea4d549d75855a8d8bfc53", + "placeholder": "​", + "style": "IPY_MODEL_a3d4c956d2e84bac8a285cef6d4e30dd", + "value": " 1.88k/1.88k [00:00<00:00, 33.5kB/s]" + } + }, + "6a7c0dbf679b4588b7e127fd293343c3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2045aba1e11c4d618b763af8832f869f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b06d6137f7ee4ddfb34fbc4ba67b701b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "534575664a26442f8d9a82d2a2c7aaed": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9456688719ac46bb889049d7afabf36b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "08e297bfd5ea4d549d75855a8d8bfc53": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a3d4c956d2e84bac8a285cef6d4e30dd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f41a5c3f217a447e9b5ab384e8f49fe4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e792d635a172466489805d0ff0ea690a", + "IPY_MODEL_0a3ab3fa5b6f434e80f1be44ea869715", + "IPY_MODEL_ad5b79173e414a11954054baad03d074" + ], + "layout": "IPY_MODEL_843b2195c06240f280516695e6c6a163" + } + }, + "e792d635a172466489805d0ff0ea690a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8fea3fa5e37e4f089de7160e9b93603d", + "placeholder": "​", + "style": "IPY_MODEL_24502943168641218c700a88a50b5fcd", + "value": "Downloading model.safetensors: 100%" + } + }, + "0a3ab3fa5b6f434e80f1be44ea869715": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_26c44f82b0b64fa6b0daea6d9d4e3557", + "max": 56284578, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7c13738bca27482799c444fc7fdaee54", + "value": 56284578 + } + }, + "ad5b79173e414a11954054baad03d074": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4468bd12e8364289bad249ac201dca98", + "placeholder": "​", + "style": "IPY_MODEL_09483de37bb04a688b6b1484825f4ff8", + "value": " 56.3M/56.3M [00:00<00:00, 70.6MB/s]" + } + }, + "843b2195c06240f280516695e6c6a163": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8fea3fa5e37e4f089de7160e9b93603d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "24502943168641218c700a88a50b5fcd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "26c44f82b0b64fa6b0daea6d9d4e3557": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7c13738bca27482799c444fc7fdaee54": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4468bd12e8364289bad249ac201dca98": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "09483de37bb04a688b6b1484825f4ff8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "cells": [ + { + "cell_type": "code", + "source": [ + "!pip install transformers" + ], + "metadata": { + "id": "-IvPt6jot3kn" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "!pip install sentence_transformers" + ], + "metadata": { + "id": "aiOjtV_Ft4GR" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "import numpy as np\n", + "import pandas as pd" + ], + "metadata": { + "id": "SXcUC-2ct3gZ" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from sklearn.metrics.pairwise import cosine_distances" + ], + "metadata": { + "id": "29c0VPz8uxJ_" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# 임시 코드 입니다" + ], + "metadata": { + "id": "wBvRYC-yv54e" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "6Jhfqe5yylTF" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "from transformers import AutoTokenizer, AutoModelForTokenClassification\n", + "from transformers import pipeline\n", + "\n", + "tokenizer = AutoTokenizer.from_pretrained(\"Leo97/KoELECTRA-small-v3-modu-ner\")\n", + "model = AutoModelForTokenClassification.from_pretrained(\"Leo97/KoELECTRA-small-v3-modu-ner\")\n", + "ner = pipeline(\"ner\", model=model, tokenizer=tokenizer)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 209, + "referenced_widgets": [ + "2d9c22439311433fbde63dec91fb7ffc", + "9acf167658a04032b54f36eb8cc1e9c8", + "afca155d3a204bc19526d1578e3ff403", + "f451cacff7044b3ea30925553902a0bc", + "b2ce5bdd00274c07939363b8a51affe7", + "9f7a91fbb53142a2963b49034c6e9f39", + "ccc1c4fb85cb4fffaf074cb6c7657357", + "ab20e37d3dde4b5ba482e50e878b2eab", + "a5578182f4ec480bb479b5ee014b7e39", + "7c1fa72ef3bd45458cd136b1b01c44b5", + "69239a07eea34a2890c1da133a0cb47c", + "2046ef77bcd747ebaf2282d968d8d324", + "9444d0ea409a443fa7843d620bed9fae", + "5910343a2e2c46d89b221e272cce619a", + "d4af78e36c0745559630d836f572ba10", + "7c443272e9584cd8a4e0bc494acac30d", + "7b59e111e7cc413d9bfa87a6e077cc9f", + "b564d91d5d0e4168b19a3b7dc4089cf8", + "01fd16484b264eaaa3360e0de6972933", + "9ab3dcd684d244848e5354ceeedeedeb", + "560c4ecb19f7446785ebd16eddc814f7", + "92e86e1a4a044af790df8e11f9a7fa0d", + "b5dcac63cd2649ef8a96d76111c31bbb", + "3df8295c1ef04c14897bb86f7f81a8a0", + "7799deaee83a4ccdbbbb0e3a96b8a042", + "5c89b41d27aa444a81f76098cf632513", + "7d6bcfa8eb794cf18cb282ca92e248dd", + "e96da164d67d44998b4615edc9816731", + "3456d1eb82404263bce844e673579be6", + "692ab560e5414507add9093ab3d308b1", + "d4198e59eae247ff920a7fece1ddb701", + "a7e43dc7a1b2457fa5ea5ea359fafd08", + "7ec13f29d83d4be58fa557bbf5b4b980", + "0c81c2073c2c4c8fac1d174d356d1659", + "afe5c9d4af724fef936d0b7b69c8d10b", + "4fed88c7a3b848678f09ec9a13bb3c46", + "b4c69a733e084bc1bea1e5106eedd48b", + "9e2472bae3f9489eb637ad681b551eaf", + "799a551beed049e78a16caad61bfaff3", + "7dfabc71cf9b460fbc350ec21cbe3165", + "17c52890539445a8a3e3ba25e1a34805", + "720050fc0b2f45ed973564357b8b96c0", + "e8f1b7529d104fb597c34827ff0b55c9", + "4c654170f9f64a7081ce622964ea9a6b", + "aa3972c512604047a848ccbfd6ce7549", + "149b398730f14bc3a84d2537b1f43192", + "3b6dd37cb3ac4300a608e4b7e47513fe", + "2075e02c4a4b4e22a90b1a57299d110a", + "6a7c0dbf679b4588b7e127fd293343c3", + "2045aba1e11c4d618b763af8832f869f", + "b06d6137f7ee4ddfb34fbc4ba67b701b", + "534575664a26442f8d9a82d2a2c7aaed", + "9456688719ac46bb889049d7afabf36b", + "08e297bfd5ea4d549d75855a8d8bfc53", + "a3d4c956d2e84bac8a285cef6d4e30dd", + "f41a5c3f217a447e9b5ab384e8f49fe4", + "e792d635a172466489805d0ff0ea690a", + "0a3ab3fa5b6f434e80f1be44ea869715", + "ad5b79173e414a11954054baad03d074", + "843b2195c06240f280516695e6c6a163", + "8fea3fa5e37e4f089de7160e9b93603d", + "24502943168641218c700a88a50b5fcd", + "26c44f82b0b64fa6b0daea6d9d4e3557", + "7c13738bca27482799c444fc7fdaee54", + "4468bd12e8364289bad249ac201dca98", + "09483de37bb04a688b6b1484825f4ff8" + ] + }, + "id": "V41IQomT-pFV", + "outputId": "977c97aa-ad09-4bad-d58c-1b3fc343a895" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Downloading (…)okenizer_config.json: 0%| | 0.00/365 [00:00\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
companytitlelinkwriterdatecontent
0CNT85CNT85, 156.5억 규모 공사 계약 체결https://finance.naver.com/item/news_read.naver...이데일리2023.07.03 13:46[이데일리 원다연 기자] CNT85(056730)는 테크로스워터앤에너지와 156억 ...
1CNT85CNT85, 28억 규모 RTO 설치공사 공급계약https://finance.naver.com/item/news_read.naver...이데일리2023.06.16 14:30[이데일리 김보겸 기자] CNT85(056730)는 28억원 규모의 당진공장 축열식...
2CNT85CNT85, 4.6억 규모 전환청구권 행사https://finance.naver.com/item/news_read.naver...이데일리2023.05.26 16:22[이데일리 김응태 기자] CNT85(056730)는 4억6000만원 규모의 23회차...
3CNT85CNT85, 1분기 영업익 2.3억원…흑자전환 성공https://finance.naver.com/item/news_read.naver...머니투데이2023.05.12 14:42플랜트, 필터·여과수처리 사업을 운영하는 CNT85가 1분기 영업이익 2억3000만...
4CNT85CNT85, 7억 규모 전환청구권 행사https://finance.naver.com/item/news_read.naver...이데일리2023.04.28 17:25[이데일리 이정현 기자] CNT85(056730)는 7억 원 규모의 23회차 무기명...
\n", + "
\n", + " \n", + " \n", + " \n", + "\n", + " \n", + "
\n", + " \n", + " " + ] + }, + "metadata": {}, + "execution_count": 11 + } + ] + }, + { + "cell_type": "code", + "source": [ + "text = df.loc[0]['content']" + ], + "metadata": { + "id": "UpCiSdvSurwq" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "title = df.loc[0]['title']" + ], + "metadata": { + "id": "ihvjZ9dXurnC" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "text" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 54 + }, + "id": "Vflr9KeNCA4j", + "outputId": "0ea4b104-34d2-4221-f0bd-fa623856b160" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'[이데일리 원다연 기자] CNT85(056730)는 테크로스워터앤에너지와 156억 5000만원 규모의 기흥 SDR 그린센터 오수처리시설 기계배관 공사 계약을 체결했다고 3일 공시했다.이는 최근 매출액 대비 48.78%에 해당한다. 계약 기간은 지난 30일부터 내년 12월 31일까지다.'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 15 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result = return_words(text)\n", + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "gXOh8ZA8vEQq", + "outputId": "7e249d57-d4b3-47ba-df76-745def4d5664" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['일리',\n", + " '원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '0567',\n", + " '##30',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3',\n", + " '##일',\n", + " '48 . 78 %']" + ] + }, + "metadata": {}, + "execution_count": 14 + } + ] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " todo : 현재 입력 데이터의 길이가 길면 출력이 이상해 지는 문제가 있음\n", + " 아래 예시 확인\n", + "'''" + ], + "metadata": { + "id": "ZMxs6kUCffTZ" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "result = return_words(text[:50])\n", + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "rxlltjT5CUX4", + "outputId": "511984ba-e3c3-4e4c-ccca-cd4aa9ad5447" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['원다연', '기자', 'CNT85', '056730', '테크로스워터앤에너지', '156억 5000']" + ] + }, + "metadata": {}, + "execution_count": 24 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result = return_words(text[:101])\n", + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "IG2E3rJdCwv5", + "outputId": "d6573205-682d-42d0-99aa-74b9afbf41af" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '056730',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3일']" + ] + }, + "metadata": {}, + "execution_count": 27 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result = return_words(text[:130])\n", + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "KWZpH3MuDA-B", + "outputId": "d5472fdf-cf67-4bb6-b5e3-a587713833ed" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['일리',\n", + " '원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '056730',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3일',\n", + " '48 . 78 %']" + ] + }, + "metadata": {}, + "execution_count": 31 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result = return_words(text)\n", + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "tEO_oMYPCF7I", + "outputId": "a6a4c31d-1286-45f5-d5ee-5ac6ffeeb896" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['일리',\n", + " '원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '0567',\n", + " '##30',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3',\n", + " '##일',\n", + " '48 . 78 %']" + ] + }, + "metadata": {}, + "execution_count": 32 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "0sceVfkRvEOX", + "outputId": "4d870c4f-d19c-4db7-8150-9d0c4c374fe6" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'word': ['일리',\n", + " '원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '0567',\n", + " '##30',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3',\n", + " '##일',\n", + " '48 . 78 %'],\n", + " 'score': [['I-OG'],\n", + " ['B-OG', 'I-OG', 'I-PS'],\n", + " ['B-CV'],\n", + " ['B-AF', 'I-AF', 'I-AF'],\n", + " ['B-QT', 'I-QT'],\n", + " ['B-QT'],\n", + " ['B-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG'],\n", + " ['B-QT', 'I-QT', 'I-QT'],\n", + " ['B-LC'],\n", + " ['B-AF', 'I-AF', 'I-AF', 'I-AF'],\n", + " ['B-DT'],\n", + " ['B-DT'],\n", + " ['B-QT', 'I-QT', 'I-QT', 'I-QT']],\n", + " 'entity': [[0.49553466],\n", + " [0.5833473, 0.45962462, 0.5877794],\n", + " [0.61917484],\n", + " [0.41322687, 0.45933244, 0.35766423],\n", + " [0.82425725, 0.73227006],\n", + " [0.80768573],\n", + " [0.86274034,\n", + " 0.8953028,\n", + " 0.89671725,\n", + " 0.92597497,\n", + " 0.9127999,\n", + " 0.9244243,\n", + " 0.9098607],\n", + " [0.63297695, 0.64723974, 0.66578895],\n", + " [0.7482972],\n", + " [0.33515036, 0.42516705, 0.46068886, 0.416388],\n", + " [0.7863837],\n", + " [0.77908856],\n", + " [0.7852038, 0.78137255, 0.8358253, 0.80113524]],\n", + " 'index': [[(3, 5)],\n", + " [(6, 7), (7, 8), (8, 9)],\n", + " [(10, 12)],\n", + " [(14, 16), (16, 17), (17, 19)],\n", + " [(20, 22), (22, 24)],\n", + " [(24, 26)],\n", + " [(29, 31), (31, 33), (33, 34), (34, 35), (35, 36), (36, 37), (37, 39)],\n", + " [(41, 44), (44, 45), (46, 50)],\n", + " [(57, 59)],\n", + " [(60, 62), (62, 63), (64, 66), (66, 68)],\n", + " [(94, 95)],\n", + " [(95, 96)],\n", + " [(115, 117), (117, 118), (118, 120), (120, 121)]]}" + ] + }, + "metadata": {}, + "execution_count": 33 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "1Jc0Cr8mDkGP" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "DjdmghkDDj9A" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "result = return_words(text[:130])\n", + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "h5DIRDQGDqFi", + "outputId": "d36d8ed1-cde9-45a1-a032-d509d3af6c06" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['일리',\n", + " '원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '056730',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3일',\n", + " '48 . 78 %']" + ] + }, + "metadata": {}, + "execution_count": 34 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "0wXruLk2ss5G" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### 불용어 제거" + ], + "metadata": { + "id": "saTscqVSr4Pv" + } + }, + { + "cell_type": "code", + "source": [ + "#stopword 목록 다운\n", + "!git clone https://gist.github.com/d10b18575a73778da4bc83853385465c.git stopwords" + ], + "metadata": { + "id": "EQAr45AJt3TS", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "c2d348de-ab1f-44a7-9a28-664c47f155e7" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Cloning into 'stopwords'...\n", + "remote: Enumerating objects: 3, done.\u001b[K\n", + "remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3\u001b[K\n", + "Unpacking objects: 100% (3/3), 2.75 KiB | 2.75 MiB/s, done.\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " todo : 불용어 추가\n", + "'''\n", + "def load_stopwords(custom_stopwords = None):\n", + " words = []\n", + "\n", + " if custom_stopwords:\n", + " words.extend(custom_stopwords)\n", + "\n", + " file_path = \"./stopwords/stopwords.txt\"\n", + " with open(file_path, 'r') as file:\n", + " words.extend(file.read().split('\\n'))\n", + "\n", + " # file_path = \"./stopword.txt\"\n", + " # with open(file_path, 'r') as file:\n", + " # words.extend(file.read().split('\\n'))\n", + "\n", + " # file_path = \"./stopword2.txt\"\n", + " # with open(file_path, 'r') as file:\n", + " # words.extend(file.read().split('\\n')[1:])\n", + "\n", + " return list(set(words))" + ], + "metadata": { + "id": "GEF_B-bEq5Aa" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# custom = []\n", + "custom = ['기자','3일']\n", + "stopwords = load_stopwords(custom)" + ], + "metadata": { + "id": "qY5xgD4irmKq" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(len(stopwords))" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "js9a5HsGEm5x", + "outputId": "58a2ebfa-7cad-461c-bf74-9df6e207228b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "597\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "result" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Depd1ifUGXRv", + "outputId": "3c5996a7-d7aa-4ac8-8e70-0b16db6c968d" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'word': ['일리',\n", + " '원다연',\n", + " '기자',\n", + " 'CNT85',\n", + " '056730',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '3일',\n", + " '48 . 78 %'],\n", + " 'score': [['I-OG'],\n", + " ['B-OG', 'I-PS', 'I-PS'],\n", + " ['B-CV'],\n", + " ['B-AF', 'I-AF', 'I-AF'],\n", + " ['B-QT', 'I-QT', 'I-QT'],\n", + " ['B-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG'],\n", + " ['B-QT', 'I-QT', 'I-QT'],\n", + " ['B-LC'],\n", + " ['B-AF', 'I-AF', 'I-AF', 'I-AF'],\n", + " ['B-DT', 'I-DT'],\n", + " ['B-QT', 'I-QT', 'I-QT', 'I-QT']],\n", + " 'entity': [[0.4308679],\n", + " [0.5620235, 0.4328442, 0.6262465],\n", + " [0.6986592],\n", + " [0.42377126, 0.45967755, 0.36286187],\n", + " [0.9009548, 0.8883027, 0.940171],\n", + " [0.87209386,\n", + " 0.89965653,\n", + " 0.89785665,\n", + " 0.9268155,\n", + " 0.9119154,\n", + " 0.9234293,\n", + " 0.9095367],\n", + " [0.64638066, 0.6557225, 0.6707427],\n", + " [0.7661712],\n", + " [0.37843058, 0.4347338, 0.47299442, 0.4301917],\n", + " [0.8726086, 0.946883],\n", + " [0.83745456, 0.8217816, 0.870865, 0.8377137]],\n", + " 'index': [[(3, 5)],\n", + " [(6, 7), (7, 8), (8, 9)],\n", + " [(10, 12)],\n", + " [(14, 16), (16, 17), (17, 19)],\n", + " [(20, 22), (22, 24), (24, 26)],\n", + " [(29, 31), (31, 33), (33, 34), (34, 35), (35, 36), (36, 37), (37, 39)],\n", + " [(41, 44), (44, 45), (46, 50)],\n", + " [(57, 59)],\n", + " [(60, 62), (62, 63), (64, 66), (66, 68)],\n", + " [(94, 95), (95, 96)],\n", + " [(115, 117), (117, 118), (118, 120), (120, 121)]]}" + ] + }, + "metadata": {}, + "execution_count": 53 + } + ] + }, + { + "cell_type": "code", + "source": [ + "remove_idxs = [i for i, word in enumerate(result['word']) if word in stopwords]\n", + "remove_idxs" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "-6kzIpMVGXLN", + "outputId": "1596d600-9e7c-44db-d80f-5aebabdf70b7" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "[2, 9]" + ] + }, + "metadata": {}, + "execution_count": 54 + } + ] + }, + { + "cell_type": "code", + "source": [ + "for idx in sorted(remove_idxs, reverse=True):\n", + " del result['word'][idx]\n", + " del result['score'][idx]\n", + " del result['entity'][idx]\n", + " del result['index'][idx]" + ], + "metadata": { + "id": "ci0iEZ0oGXFz" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "result" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "m3mvNACsHTYh", + "outputId": "e2da1dd4-be67-4d71-b61f-7f6cf7d9287b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'word': ['일리',\n", + " '원다연',\n", + " 'CNT85',\n", + " '056730',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '48 . 78 %'],\n", + " 'score': [['I-OG'],\n", + " ['B-OG', 'I-PS', 'I-PS'],\n", + " ['B-AF', 'I-AF', 'I-AF'],\n", + " ['B-QT', 'I-QT', 'I-QT'],\n", + " ['B-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG'],\n", + " ['B-QT', 'I-QT', 'I-QT'],\n", + " ['B-LC'],\n", + " ['B-AF', 'I-AF', 'I-AF', 'I-AF'],\n", + " ['B-QT', 'I-QT', 'I-QT', 'I-QT']],\n", + " 'entity': [[0.4308679],\n", + " [0.5620235, 0.4328442, 0.6262465],\n", + " [0.42377126, 0.45967755, 0.36286187],\n", + " [0.9009548, 0.8883027, 0.940171],\n", + " [0.87209386,\n", + " 0.89965653,\n", + " 0.89785665,\n", + " 0.9268155,\n", + " 0.9119154,\n", + " 0.9234293,\n", + " 0.9095367],\n", + " [0.64638066, 0.6557225, 0.6707427],\n", + " [0.7661712],\n", + " [0.37843058, 0.4347338, 0.47299442, 0.4301917],\n", + " [0.83745456, 0.8217816, 0.870865, 0.8377137]],\n", + " 'index': [[(3, 5)],\n", + " [(6, 7), (7, 8), (8, 9)],\n", + " [(14, 16), (16, 17), (17, 19)],\n", + " [(20, 22), (22, 24), (24, 26)],\n", + " [(29, 31), (31, 33), (33, 34), (34, 35), (35, 36), (36, 37), (37, 39)],\n", + " [(41, 44), (44, 45), (46, 50)],\n", + " [(57, 59)],\n", + " [(60, 62), (62, 63), (64, 66), (66, 68)],\n", + " [(115, 117), (117, 118), (118, 120), (120, 121)]]}" + ] + }, + "metadata": {}, + "execution_count": 56 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "bOnMBZihHTTX" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "words = result['word']\n", + "words" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "I_9x2bcdINrq", + "outputId": "8adc2679-c363-4857-935a-4bfdd919dfeb" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['일리',\n", + " '원다연',\n", + " 'CNT85',\n", + " '056730',\n", + " '테크로스워터앤에너지',\n", + " '156억 5000',\n", + " '기흥',\n", + " 'SDR 그린센터',\n", + " '48 . 78 %']" + ] + }, + "metadata": {}, + "execution_count": 58 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "VjyoDJajGXAQ" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### 벡터화" + ], + "metadata": { + "id": "grQ_6GhAr-Zo" + } + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "E2WP0Ukor9lV" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " 참고 사이트 :\n", + " https://devocean.sk.com/blog/techBoardDetail.do?ID=164033\n", + "'''" + ], + "metadata": { + "id": "wH4_QbLD1QmC" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " todo : sota 모델 찾기\n", + "'''\n", + "from sentence_transformers import SentenceTransformer\n", + "model = SentenceTransformer('jhgan/ko-sroberta-multitask')" + ], + "metadata": { + "id": "0086Wo6C1QGX" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "print(title)\n", + "print(text)\n", + "print(words)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "qjogJSFtIfLN", + "outputId": "fa9998a1-cc3f-4a23-a7aa-f9ec846ec41c" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "CNT85, 156.5억 규모 공사 계약 체결\n", + "[이데일리 원다연 기자] CNT85(056730)는 테크로스워터앤에너지와 156억 5000만원 규모의 기흥 SDR 그린센터 오수처리시설 기계배관 공사 계약을 체결했다고 3일 공시했다.이는 최근 매출액 대비 48.78%에 해당한다. 계약 기간은 지난 30일부터 내년 12월 31일까지다.\n", + "['일리', '원다연', 'CNT85', '056730', '테크로스워터앤에너지', '156억 5000', '기흥', 'SDR 그린센터', '48 . 78 %']\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "# title 벡터화\n", + "title_emb = model.encode(title)\n", + "# text 벡터화\n", + "doc_emb = model.encode(text)\n", + "# words 백터화\n", + "word_emb = model.encode(words)\n", + "# print(doc_emb.shape)\n", + "# print(word_emb.shape)" + ], + "metadata": { + "id": "l0MxvjSst3P8" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "# 코사인 유사도 측정\n", + "title_word_dists = cosine_distances([title_emb], word_emb).flatten()\n", + "text_word_dists = cosine_distances([doc_emb], word_emb).flatten()\n", + "print('title과 text의 cosine distance: ',cosine_distances([doc_emb], [title_emb]).flatten())" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ZO7J0ZlTyDNq", + "outputId": "df325d5f-63be-4ed5-8944-9a49562fd036" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "title과 text의 cosine distance: [0.36870557]\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "text_word_dists" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "VMuNJeyiKK43", + "outputId": "5f00413e-1b0d-4178-8919-6923a94da41b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([0.87537664, 0.82498133, 0.5951872 , 0.6734893 , 0.49724144,\n", + " 0.6993714 , 0.6877056 , 0.6774784 , 0.71606404], dtype=float32)" + ] + }, + "metadata": {}, + "execution_count": 72 + } + ] + }, + { + "cell_type": "code", + "source": [ + "print('title과 words의 cosine distance')\n", + "for i in np.argsort(title_word_dists):\n", + " print(words[i],title_word_dists[i])" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "ZP9idZW_yDKl", + "outputId": "bffb2575-50d8-4db0-fe82-6862245ae5a9" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "title과 words의 cosine distance\n", + "CNT85 0.36422163\n", + "156억 5000 0.5453429\n", + "테크로스워터앤에너지 0.58205175\n", + "056730 0.6712269\n", + "SDR 그린센터 0.7803867\n", + "원다연 0.8208597\n", + "기흥 0.82504976\n", + "일리 0.8513015\n", + "48 . 78 % 0.97520405\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "print('text과 words의 cosine distance')\n", + "for i in np.argsort(text_word_dists):\n", + " print(words[i],text_word_dists[i])" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "GGaUCZvWw2DM", + "outputId": "5c954ed0-7070-4714-d2dd-5a81248ad187" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "text과 words의 cosine distance\n", + "테크로스워터앤에너지 0.49724144\n", + "CNT85 0.5951872\n", + "056730 0.6734893\n", + "SDR 그린센터 0.6774784\n", + "기흥 0.6877056\n", + "156억 5000 0.6993714\n", + "48 . 78 % 0.71606404\n", + "원다연 0.82498133\n", + "일리 0.87537664\n" + ] + } + ] + }, + { + "cell_type": "markdown", + "source": [ + "### Score 계산" + ], + "metadata": { + "id": "sIFjWEeGfKDw" + } + }, + { + "cell_type": "code", + "source": [ + "# score 구하기 (임시)\n", + "score = 0.6 * (1 - title_word_dists) + 0.4 * (1 - text_word_dists)\n", + "score" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "MIPArmgdKdD3", + "outputId": "2d242fc8-e6a2-4af6-d1ec-b4ac62053994" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([0.13906845, 0.17749166, 0.5433922 , 0.32786816, 0.4518724 ,\n", + " 0.3930457 , 0.22988792, 0.26077664, 0.12845196], dtype=float32)" + ] + }, + "metadata": {}, + "execution_count": 79 + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(list(score))\n", + "np.argsort(score)" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SUYEYhvVLpNH", + "outputId": "43485f27-9b25-47b6-ffa8-b780095f3045" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "[0.13906845, 0.17749166, 0.5433922, 0.32786816, 0.4518724, 0.3930457, 0.22988792, 0.26077664, 0.12845196]\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([8, 0, 1, 6, 7, 3, 5, 4, 2])" + ] + }, + "metadata": {}, + "execution_count": 86 + } + ] + }, + { + "cell_type": "code", + "source": [ + "top_k = 3\n", + "top_words = []\n", + "for i in np.argsort(-score)[:top_k]:\n", + " top_words.append()\n", + " print(i, words[i], 'score :',score[i], 'title score :', 1 - title_word_dists[i], 'text score :', 1 - text_word_dists[i])" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "SYzgrLMbKaNg", + "outputId": "03928fd4-f28c-4621-a1d5-c7eb8899397c" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "2 CNT85 score : 0.5433922 title score : 0.6357783675193787 text score : 0.4048128128051758\n", + "4 테크로스워터앤에너지 score : 0.4518724 title score : 0.41794824600219727 text score : 0.5027585625648499\n", + "5 156억 5000 score : 0.3930457 title score : 0.45465707778930664 text score : 0.3006286025047302\n" + ] + } + ] + }, + { + "cell_type": "code", + "source": [ + "print(title)\n", + "text" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 72 + }, + "id": "E_KCOQKowB-Q", + "outputId": "676655e0-90c8-49ad-ce59-bd6baf5d7d7f" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "CNT85, 156.5억 규모 공사 계약 체결\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "'[이데일리 원다연 기자] CNT85(056730)는 테크로스워터앤에너지와 156억 5000만원 규모의 기흥 SDR 그린센터 오수처리시설 기계배관 공사 계약을 체결했다고 3일 공시했다.이는 최근 매출액 대비 48.78%에 해당한다. 계약 기간은 지난 30일부터 내년 12월 31일까지다.'" + ], + "application/vnd.google.colaboratory.intrinsic+json": { + "type": "string" + } + }, + "metadata": {}, + "execution_count": 91 + } + ] + }, + { + "cell_type": "code", + "source": [ + "result['word'].index()" + ], + "metadata": { + "id": "QY-vX00vNLyM" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " todo : 유사도 threshold로 word filtering\n", + "'''" + ], + "metadata": { + "id": "BOdvOz985F71" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "eNzZI4yd5Ftc" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "source": [ + "### 키워드 빈도수 계산" + ], + "metadata": { + "id": "2ehFBbv_4pL-" + } + }, + { + "cell_type": "code", + "source": [ + "word_counts = {}\n", + "for word in words:\n", + " count = text.count(word)\n", + " word_counts[word] = count" + ], + "metadata": { + "id": "0J1zc7eM4omG" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "word_counts" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "nINedIBL4QeH", + "outputId": "07c2a191-5da0-43a6-9714-de1ed241653b" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "{'챗': 1,\n", + " '등': 1,\n", + " '출현': 1,\n", + " '미국 반도체 업체 엔비디아 주가': 1,\n", + " '연일': 1,\n", + " '행진': 1,\n", + " '어가': 1,\n", + " '차기': 1,\n", + " '혜주': 1,\n", + " '관심': 1}" + ] + }, + "metadata": {}, + "execution_count": 33 + } + ] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "8ojvYDaJ4ZPk" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " todo :\n", + " 1. 뉴스 제목과 word의 유사도 측정\n", + " 2. 빈도수, 제목과 유사성, 본문과 유사성 등 을 합쳐 점수 계산\n", + " (option) 기사 간 키워드 클러스터링 해서 filtering\n", + "'''" + ], + "metadata": { + "id": "oOFahDC94CbE" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "vpTWM1jz4C0h" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "WIdcILnO4DIS" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + " todo : option\n", + " 급상승 키워드 재순위화\n", + "'''" + ], + "metadata": { + "id": "4rrtsYJOyDCp" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "N-vrylfxt3Mr" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "_-m4zal0t3J_" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [ + "'''\n", + "나중에 참고용\n", + "elastric search 도입 참고용\n", + "https://www.lesstif.com/dbms/elastic-search-nori-80248960.html\n", + "'''" + ], + "metadata": { + "id": "sHsULSEyt3GK" + }, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "source": [], + "metadata": { + "id": "8lWwifjxt3DB" + }, + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file From c00bfddb950d51a38eedfc3de235a801f7130d84 Mon Sep 17 00:00:00 2001 From: Yungi Date: Sat, 22 Jul 2023 14:47:41 +0900 Subject: [PATCH 25/63] [Etc] Delete exsting Notebooks --- Notebooks/KRWordRank_KeyWord Extraction.ipynb | 330 -- .../Transformer_Keyword Extraction.ipynb | 235 - Notebooks/keyword extraction pipeline.ipynb | 3957 ----------------- 3 files changed, 4522 deletions(-) delete mode 100644 Notebooks/KRWordRank_KeyWord Extraction.ipynb delete mode 100644 Notebooks/Transformer_Keyword Extraction.ipynb delete mode 100644 Notebooks/keyword extraction pipeline.ipynb diff --git a/Notebooks/KRWordRank_KeyWord Extraction.ipynb b/Notebooks/KRWordRank_KeyWord Extraction.ipynb deleted file mode 100644 index 17e2142..0000000 --- a/Notebooks/KRWordRank_KeyWord Extraction.ipynb +++ /dev/null @@ -1,330 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import os\n", - "import sys\n", - "import numpy as np\n", - "from pathlib import Path\n", - "from tqdm import trange\n", - "from transformers import AutoModel, AutoTokenizer\n", - "from konlpy.tag import Mecab, Okt" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "outputs": [], - "source": [ - "sys.path.append(str(Path.home().joinpath(\"level3_nlp_finalproject-nlp-04\")))\n", - "from utils.preprocessing import *" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 3, - "outputs": [], - "source": [ - "news = pd.read_csv(Path.cwd().parent.joinpath(\"Data\", \"News\", \"005930.csv\"))" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 4, - "outputs": [], - "source": [ - "# news = preprocess_dataframe(news)\n", - "news['content'].replace('', np.nan, inplace=True)\n", - "news.dropna(subset=['content'], inplace=True)\n", - "news.reset_index(drop=True, inplace=True)" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": 5, - "outputs": [ - { - "data": { - "text/plain": " company title \\\n0 삼성전자 “지독한 중국 떼로 덤비더니” 삼성 점유율 절반 뺏아갔다 \n1 삼성전자 “반도체 시간이 온다”…야심작 출격한 삼성전자, 비밀병기는 \n2 삼성전자 D램 격차 더 벌린 삼성전자…업계 첫 12나노급 양산 \n3 삼성전자 현대차에 내준 '영업이익 1위' 삼성전자, 하반기엔 되찾는다 \n4 삼성전자 삼성전자 '12나노급 D램' 세계 첫 양산 \n... ... ... \n2874 삼성전자 [특징주] 삼성전자, 장중 7만원선 밑돌아…외인 매도에 1% 하락(종합... \n2875 삼성전자 AMD CEO \"韓 언론을 믿냐\"…삼성, AMD 3나노 수주보도에 'T... \n2876 삼성전자 바닥 찍은 반도체·디스플레이… 삼성전자·LGD, 4분기 흑자전환 기대감... \n2877 삼성전자 '황금명함'만 있는 게 아니다...삼성전자 새내기 부모님 '이것' 받고... \n2878 삼성전자 [특징주] 삼성전자, 2% 하락해 다시 ‘6만전자’ \n\n link writer \\\n0 https://finance.naver.com/item/news_read.naver... 헤럴드경제 \n1 https://finance.naver.com/item/news_read.naver... 매일경제 \n2 https://finance.naver.com/item/news_read.naver... 파이낸셜뉴스 \n3 https://finance.naver.com/item/news_read.naver... 매일경제 \n4 https://finance.naver.com/item/news_read.naver... 매일경제 \n... ... ... \n2874 https://finance.naver.com/item/news_read.naver... 연합뉴스 \n2875 https://finance.naver.com/item/news_read.naver... 아시아경제 \n2876 https://finance.naver.com/item/news_read.naver... 조선비즈 \n2877 https://finance.naver.com/item/news_read.naver... 파이낸셜뉴스 \n2878 https://finance.naver.com/item/news_read.naver... 조선비즈 \n\n date content \n0 2023.05.18 22:14 중국 화웨이 폴더블폰 S포켓[헤럴드경제= 박영훈 기자] “삼성 타도 외치더니” 중... \n1 2023.05.18 19:02 12나노급 DDR5 D램 양산 EUV 공정 등 기술력 총동원 DDR5로의 시장 전환... \n2 2023.05.18 18:41 1초에 UHD 영화 2편 처리 가능 생산성 20% 소비전력 23% 개선 ‘챗GPT’... \n3 2023.05.18 17:46 현대차 실적 상고하저 예상 3분기 2조8200억원 그칠듯 삼성전자 하반기 본격 반등... \n4 2023.05.18 17:43 반도체 업황부진 뚫을 야심작 생산성 20%·소비전력 23% ↑삼성전자가 메모리반도체... \n... ... ... \n2874 2023.07.21 15:44 (CG) [연합뉴스TV 제공](서울=연합뉴스) 송은경 기자 = 글로벌 반도체 업종 ... \n2875 2023.07.21 15:32 4년 만에 대만 방문한 리사 수 AMD CEO미국 반도체 업계를 대표하는 대만계 경... \n2876 2023.07.21 15:26 삼성전자, 3분기부터 메모리 감산 효과 본격화 3분기 들어 D램 가격 하락폭도 안정... \n2877 2023.07.21 14:53 삼성전자 반도체(DS)부문 입사 예정자들에게 전달된 황금명함과 꽃다발, 경계현 사장... \n2878 2023.07.21 09:22 21일 삼성전자가 2% 하락하며 다시 ‘6만전자’로 내려앉았다. 전날 미국 뉴욕증시... \n\n[2879 rows x 6 columns]", - "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 \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 \n \n \n \n \n
companytitlelinkwriterdatecontent
0삼성전자“지독한 중국 떼로 덤비더니” 삼성 점유율 절반 뺏아갔다https://finance.naver.com/item/news_read.naver...헤럴드경제2023.05.18 22:14중국 화웨이 폴더블폰 S포켓[헤럴드경제= 박영훈 기자] “삼성 타도 외치더니” 중...
1삼성전자“반도체 시간이 온다”…야심작 출격한 삼성전자, 비밀병기는https://finance.naver.com/item/news_read.naver...매일경제2023.05.18 19:0212나노급 DDR5 D램 양산 EUV 공정 등 기술력 총동원 DDR5로의 시장 전환...
2삼성전자D램 격차 더 벌린 삼성전자…업계 첫 12나노급 양산https://finance.naver.com/item/news_read.naver...파이낸셜뉴스2023.05.18 18:411초에 UHD 영화 2편 처리 가능 생산성 20% 소비전력 23% 개선 ‘챗GPT’...
3삼성전자현대차에 내준 '영업이익 1위' 삼성전자, 하반기엔 되찾는다https://finance.naver.com/item/news_read.naver...매일경제2023.05.18 17:46현대차 실적 상고하저 예상 3분기 2조8200억원 그칠듯 삼성전자 하반기 본격 반등...
4삼성전자삼성전자 '12나노급 D램' 세계 첫 양산https://finance.naver.com/item/news_read.naver...매일경제2023.05.18 17:43반도체 업황부진 뚫을 야심작 생산성 20%·소비전력 23% ↑삼성전자가 메모리반도체...
.....................
2874삼성전자[특징주] 삼성전자, 장중 7만원선 밑돌아…외인 매도에 1% 하락(종합...https://finance.naver.com/item/news_read.naver...연합뉴스2023.07.21 15:44(CG) [연합뉴스TV 제공](서울=연합뉴스) 송은경 기자 = 글로벌 반도체 업종 ...
2875삼성전자AMD CEO \"韓 언론을 믿냐\"…삼성, AMD 3나노 수주보도에 'T...https://finance.naver.com/item/news_read.naver...아시아경제2023.07.21 15:324년 만에 대만 방문한 리사 수 AMD CEO미국 반도체 업계를 대표하는 대만계 경...
2876삼성전자바닥 찍은 반도체·디스플레이… 삼성전자·LGD, 4분기 흑자전환 기대감...https://finance.naver.com/item/news_read.naver...조선비즈2023.07.21 15:26삼성전자, 3분기부터 메모리 감산 효과 본격화 3분기 들어 D램 가격 하락폭도 안정...
2877삼성전자'황금명함'만 있는 게 아니다...삼성전자 새내기 부모님 '이것' 받고...https://finance.naver.com/item/news_read.naver...파이낸셜뉴스2023.07.21 14:53삼성전자 반도체(DS)부문 입사 예정자들에게 전달된 황금명함과 꽃다발, 경계현 사장...
2878삼성전자[특징주] 삼성전자, 2% 하락해 다시 ‘6만전자’https://finance.naver.com/item/news_read.naver...조선비즈2023.07.21 09:2221일 삼성전자가 2% 하락하며 다시 ‘6만전자’로 내려앉았다. 전날 미국 뉴욕증시...
\n

2879 rows × 6 columns

\n
" - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "news" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "# Train New Tokenizer\n", - "# def get_news(news):\n", - "# \tcontent = news['content']\n", - "# \tfor start_idx in range(0, len(content), 1000):\n", - "# \t\tsamples = content[start_idx:start_idx+1000]\n", - "# \t\tyield samples" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "# tokenizer = AutoTokenizer.from_pretrained(\"klue/roberta-base\")\n", - "# trained_tokenizer = tokenizer.train_new_from_iterator(get_news(news), vocab_size=32000)" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "# trained_tokenizer.tokenize(news.sample(1)['content'].item())" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "okt = Okt()" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "company = news['company'].unique()" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "ecopro = news[news['company'] == '에코프로']['content']" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "samsung = news[news['company'] == '삼성전자']['content']" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "for i in trange(len(samsung)):\n", - "\tsamsung[i] = \" \".join(okt.nouns(samsung[i]))" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "from krwordrank.word import summarize_with_keywords, KRWordRank" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "wordrank_extractor = KRWordRank(min_count=10, max_length=100)\n", - "\n", - "beta = 0.85\n", - "max_iter = 10\n", - "keywords, rank, graph = wordrank_extractor.extract(samsung.tolist(), beta, max_iter)" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "for key, score in sorted(graph[5].items(), reverse=True, key=lambda x: x[1])[:100]:\n", - "\tprint(wordrank_extractor.int2token(key))\n", - "\tprint(score)" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "samsung_keywords = summarize_with_keywords(samsung.tolist(),\n", - "\t\t\t\t\t\t\t\t min_count=10,\n", - "\t\t\t\t\t\t\t\t max_length=100,\n", - "\t\t\t\t\t\t\t\t beta=0.85,\n", - "\t\t\t\t\t\t\t\t max_iter=10,\n", - "\t\t\t\t\t\t\t\t verbose=False)" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "samsung_keywords" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "ecopro_keywords = summarize_with_keywords(ecopro.tolist(),\n", - "\t\t\t\t\t\t\t\t min_count=10,\n", - "\t\t\t\t\t\t\t\t max_length=100,\n", - "\t\t\t\t\t\t\t\t beta=0.85,\n", - "\t\t\t\t\t\t\t\t max_iter=10,\n", - "\t\t\t\t\t\t\t\t verbose=True)\n", - "ecopro_keywords" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "top_k = set(samsung_keywords) - set(ecopro_keywords)" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "t = {key : samsung_keywords[key] for key in top_k}" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "sorted(t.items() , reverse=True, key=lambda x: x[1])" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [], - "metadata": { - "collapsed": false - } - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Notebooks/Transformer_Keyword Extraction.ipynb b/Notebooks/Transformer_Keyword Extraction.ipynb deleted file mode 100644 index 9a5a62b..0000000 --- a/Notebooks/Transformer_Keyword Extraction.ipynb +++ /dev/null @@ -1,235 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": true - }, - "outputs": [], - "source": [ - "import pandas as pd\n", - "import numpy as np\n", - "import sys\n", - "\n", - "from konlpy.tag import Okt, Mecab\n", - "from pathlib import Path" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "sys.path.append(str(Path.home().joinpath(\"level3_nlp_finalproject-nlp-04\")))" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "from utils.preprocessing import *\n", - "from keyword_extractor.model import KeyBert" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "df = pd.read_csv(Path.cwd().parent.joinpath(\"Data\", \"News\", \"005930.csv\"))" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "df['content'] = df['content'].apply(lambda x : all_preprocessing(x))" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "okt = Okt()\n", - "mecab = Mecab()" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "# Sentence-Transformer => STS, NLI 데이터셋" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "model1 = KeyBert(\"jhgan/ko-sroberta-multitask\")\n", - "model2 = KeyBert(\"jhgan/ko-sroberta-nli\")\n", - "model3 = KeyBert(\"snunlp/KR-SBERT-V40K-klueNLI-augSTS\")\n", - "model4 = KeyBert(\"sentence-transformers/xlm-r-100langs-bert-base-nli-stsb-mean-tokens\")" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "# mecab_word = df['content'].sample(10).apply(lambda x : \" \".join(okt.nouns(x))).tolist()\n", - "mecab_word = df['content'].sample(10).tolist()" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "for corpus in mecab_word:\n", - "\tprint(\"Sentence : \", corpus)\n", - "\tprint(\"=\"*5)\n", - "\tprint(\"(sroberta-multi, sroberta-nli, v40k, xlm)\")\n", - "\tfor (a, b, c, d) in zip(model1.extract_keywords(corpus,\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\tdiversity=0.9,\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\tcandidate_frac=0.5,\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'],\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\ttag_type=\"okt\")[0],\n", - "\n", - "\t\t\t\t\t\t\tmodel2.extract_keywords(corpus,\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\tdiversity=0.9,\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\tcandidate_frac=0.5,\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'],\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\ttag_type=\"okt\")[0],\n", - "\t\t\t\t\t\t\tmodel3.extract_keywords(corpus,\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\tdiversity=0.9,\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\tcandidate_frac=0.5,\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'],\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\ttag_type=\"okt\")[0],\n", - "\t\t\t\t\t\t\tmodel4.extract_keywords(corpus,\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\tdiversity=0.9,\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\tcandidate_frac=0.5,\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'],\n", - "\t\t\t\t\t\t\t\t\t\t\t\t\ttag_type=\"okt\")[0]):\n", - "\t\tprint(a, b, c, d)\n", - "\tprint(\"=\"*10)" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "keywords = model3.extract_keywords(mecab_word,\n", - "\t\t\t\t\t\tkeyphrase_ngram_range=(1, 1),\n", - "\t\t\t\t\t\tdiversity=0.9,\n", - "\t\t\t\t\t\tcandidate_frac=0.5,\n", - "\t\t\t\t\t\tstop_words = ['삼성전자', '삼성', '전자'])" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "keywords" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "for keyword, score in keywords[0]:\n", - "\tprint(keyword)\n", - "\tap = okt.pos(keyword)\n", - "\n", - "\twhile len(ap)!=0 and \"N\" != ap[-1][1][0]:\n", - "\t\tap.pop()\n", - "\tprint(\"\".join([a[0] for a in ap]))" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [ - "mecab.pos(\"갤럭시s23울트라의\")" - ], - "metadata": { - "collapsed": false - } - }, - { - "cell_type": "code", - "execution_count": null, - "outputs": [], - "source": [], - "metadata": { - "collapsed": false - } - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 2 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython2", - "version": "2.7.6" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} diff --git a/Notebooks/keyword extraction pipeline.ipynb b/Notebooks/keyword extraction pipeline.ipynb deleted file mode 100644 index ebfb0fe..0000000 --- a/Notebooks/keyword extraction pipeline.ipynb +++ /dev/null @@ -1,3957 +0,0 @@ -{ - "nbformat": 4, - "nbformat_minor": 0, - "metadata": { - "colab": { - "provenance": [] - }, - "kernelspec": { - "name": "python3", - "display_name": "Python 3" - }, - "language_info": { - "name": "python" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "2d9c22439311433fbde63dec91fb7ffc": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_9acf167658a04032b54f36eb8cc1e9c8", - "IPY_MODEL_afca155d3a204bc19526d1578e3ff403", - "IPY_MODEL_f451cacff7044b3ea30925553902a0bc" - ], - "layout": "IPY_MODEL_b2ce5bdd00274c07939363b8a51affe7" - } - }, - "9acf167658a04032b54f36eb8cc1e9c8": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_9f7a91fbb53142a2963b49034c6e9f39", - "placeholder": "​", - "style": "IPY_MODEL_ccc1c4fb85cb4fffaf074cb6c7657357", - "value": "Downloading (…)okenizer_config.json: 100%" - } - }, - "afca155d3a204bc19526d1578e3ff403": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_ab20e37d3dde4b5ba482e50e878b2eab", - "max": 365, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_a5578182f4ec480bb479b5ee014b7e39", - "value": 365 - } - }, - "f451cacff7044b3ea30925553902a0bc": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_7c1fa72ef3bd45458cd136b1b01c44b5", - "placeholder": "​", - "style": "IPY_MODEL_69239a07eea34a2890c1da133a0cb47c", - "value": " 365/365 [00:00<00:00, 5.66kB/s]" - } - }, - "b2ce5bdd00274c07939363b8a51affe7": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "9f7a91fbb53142a2963b49034c6e9f39": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "ccc1c4fb85cb4fffaf074cb6c7657357": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "ab20e37d3dde4b5ba482e50e878b2eab": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "a5578182f4ec480bb479b5ee014b7e39": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "7c1fa72ef3bd45458cd136b1b01c44b5": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "69239a07eea34a2890c1da133a0cb47c": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "2046ef77bcd747ebaf2282d968d8d324": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_9444d0ea409a443fa7843d620bed9fae", - "IPY_MODEL_5910343a2e2c46d89b221e272cce619a", - "IPY_MODEL_d4af78e36c0745559630d836f572ba10" - ], - "layout": "IPY_MODEL_7c443272e9584cd8a4e0bc494acac30d" - } - }, - "9444d0ea409a443fa7843d620bed9fae": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_7b59e111e7cc413d9bfa87a6e077cc9f", - "placeholder": "​", - "style": "IPY_MODEL_b564d91d5d0e4168b19a3b7dc4089cf8", - "value": "Downloading (…)solve/main/vocab.txt: 100%" - } - }, - "5910343a2e2c46d89b221e272cce619a": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_01fd16484b264eaaa3360e0de6972933", - "max": 263327, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_9ab3dcd684d244848e5354ceeedeedeb", - "value": 263327 - } - }, - "d4af78e36c0745559630d836f572ba10": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_560c4ecb19f7446785ebd16eddc814f7", - "placeholder": "​", - "style": "IPY_MODEL_92e86e1a4a044af790df8e11f9a7fa0d", - "value": " 263k/263k [00:00<00:00, 3.41MB/s]" - } - }, - "7c443272e9584cd8a4e0bc494acac30d": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "7b59e111e7cc413d9bfa87a6e077cc9f": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "b564d91d5d0e4168b19a3b7dc4089cf8": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "01fd16484b264eaaa3360e0de6972933": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "9ab3dcd684d244848e5354ceeedeedeb": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "560c4ecb19f7446785ebd16eddc814f7": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "92e86e1a4a044af790df8e11f9a7fa0d": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "b5dcac63cd2649ef8a96d76111c31bbb": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_3df8295c1ef04c14897bb86f7f81a8a0", - "IPY_MODEL_7799deaee83a4ccdbbbb0e3a96b8a042", - "IPY_MODEL_5c89b41d27aa444a81f76098cf632513" - ], - "layout": "IPY_MODEL_7d6bcfa8eb794cf18cb282ca92e248dd" - } - }, - "3df8295c1ef04c14897bb86f7f81a8a0": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_e96da164d67d44998b4615edc9816731", - "placeholder": "​", - "style": "IPY_MODEL_3456d1eb82404263bce844e673579be6", - "value": "Downloading (…)/main/tokenizer.json: 100%" - } - }, - "7799deaee83a4ccdbbbb0e3a96b8a042": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_692ab560e5414507add9093ab3d308b1", - "max": 814850, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_d4198e59eae247ff920a7fece1ddb701", - "value": 814850 - } - }, - "5c89b41d27aa444a81f76098cf632513": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_a7e43dc7a1b2457fa5ea5ea359fafd08", - "placeholder": "​", - "style": "IPY_MODEL_7ec13f29d83d4be58fa557bbf5b4b980", - "value": " 815k/815k [00:00<00:00, 10.5MB/s]" - } - }, - "7d6bcfa8eb794cf18cb282ca92e248dd": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "e96da164d67d44998b4615edc9816731": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "3456d1eb82404263bce844e673579be6": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "692ab560e5414507add9093ab3d308b1": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "d4198e59eae247ff920a7fece1ddb701": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "a7e43dc7a1b2457fa5ea5ea359fafd08": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "7ec13f29d83d4be58fa557bbf5b4b980": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "0c81c2073c2c4c8fac1d174d356d1659": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_afe5c9d4af724fef936d0b7b69c8d10b", - "IPY_MODEL_4fed88c7a3b848678f09ec9a13bb3c46", - "IPY_MODEL_b4c69a733e084bc1bea1e5106eedd48b" - ], - "layout": "IPY_MODEL_9e2472bae3f9489eb637ad681b551eaf" - } - }, - "afe5c9d4af724fef936d0b7b69c8d10b": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_799a551beed049e78a16caad61bfaff3", - "placeholder": "​", - "style": "IPY_MODEL_7dfabc71cf9b460fbc350ec21cbe3165", - "value": "Downloading (…)cial_tokens_map.json: 100%" - } - }, - "4fed88c7a3b848678f09ec9a13bb3c46": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_17c52890539445a8a3e3ba25e1a34805", - "max": 125, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_720050fc0b2f45ed973564357b8b96c0", - "value": 125 - } - }, - "b4c69a733e084bc1bea1e5106eedd48b": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_e8f1b7529d104fb597c34827ff0b55c9", - "placeholder": "​", - "style": "IPY_MODEL_4c654170f9f64a7081ce622964ea9a6b", - "value": " 125/125 [00:00<00:00, 1.06kB/s]" - } - }, - "9e2472bae3f9489eb637ad681b551eaf": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "799a551beed049e78a16caad61bfaff3": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "7dfabc71cf9b460fbc350ec21cbe3165": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "17c52890539445a8a3e3ba25e1a34805": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "720050fc0b2f45ed973564357b8b96c0": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "e8f1b7529d104fb597c34827ff0b55c9": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "4c654170f9f64a7081ce622964ea9a6b": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "aa3972c512604047a848ccbfd6ce7549": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_149b398730f14bc3a84d2537b1f43192", - "IPY_MODEL_3b6dd37cb3ac4300a608e4b7e47513fe", - "IPY_MODEL_2075e02c4a4b4e22a90b1a57299d110a" - ], - "layout": "IPY_MODEL_6a7c0dbf679b4588b7e127fd293343c3" - } - }, - "149b398730f14bc3a84d2537b1f43192": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_2045aba1e11c4d618b763af8832f869f", - "placeholder": "​", - "style": "IPY_MODEL_b06d6137f7ee4ddfb34fbc4ba67b701b", - "value": "Downloading (…)lve/main/config.json: 100%" - } - }, - "3b6dd37cb3ac4300a608e4b7e47513fe": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_534575664a26442f8d9a82d2a2c7aaed", - "max": 1880, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_9456688719ac46bb889049d7afabf36b", - "value": 1880 - } - }, - "2075e02c4a4b4e22a90b1a57299d110a": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_08e297bfd5ea4d549d75855a8d8bfc53", - "placeholder": "​", - "style": "IPY_MODEL_a3d4c956d2e84bac8a285cef6d4e30dd", - "value": " 1.88k/1.88k [00:00<00:00, 33.5kB/s]" - } - }, - "6a7c0dbf679b4588b7e127fd293343c3": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "2045aba1e11c4d618b763af8832f869f": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "b06d6137f7ee4ddfb34fbc4ba67b701b": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "534575664a26442f8d9a82d2a2c7aaed": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "9456688719ac46bb889049d7afabf36b": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "08e297bfd5ea4d549d75855a8d8bfc53": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "a3d4c956d2e84bac8a285cef6d4e30dd": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "f41a5c3f217a447e9b5ab384e8f49fe4": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HBoxModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HBoxView", - "box_style": "", - "children": [ - "IPY_MODEL_e792d635a172466489805d0ff0ea690a", - "IPY_MODEL_0a3ab3fa5b6f434e80f1be44ea869715", - "IPY_MODEL_ad5b79173e414a11954054baad03d074" - ], - "layout": "IPY_MODEL_843b2195c06240f280516695e6c6a163" - } - }, - "e792d635a172466489805d0ff0ea690a": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_8fea3fa5e37e4f089de7160e9b93603d", - "placeholder": "​", - "style": "IPY_MODEL_24502943168641218c700a88a50b5fcd", - "value": "Downloading model.safetensors: 100%" - } - }, - "0a3ab3fa5b6f434e80f1be44ea869715": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "FloatProgressModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "ProgressView", - "bar_style": "success", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_26c44f82b0b64fa6b0daea6d9d4e3557", - "max": 56284578, - "min": 0, - "orientation": "horizontal", - "style": "IPY_MODEL_7c13738bca27482799c444fc7fdaee54", - "value": 56284578 - } - }, - "ad5b79173e414a11954054baad03d074": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_dom_classes": [], - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "HTMLModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/controls", - "_view_module_version": "1.5.0", - "_view_name": "HTMLView", - "description": "", - "description_tooltip": null, - "layout": "IPY_MODEL_4468bd12e8364289bad249ac201dca98", - "placeholder": "​", - "style": "IPY_MODEL_09483de37bb04a688b6b1484825f4ff8", - "value": " 56.3M/56.3M [00:00<00:00, 70.6MB/s]" - } - }, - "843b2195c06240f280516695e6c6a163": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "8fea3fa5e37e4f089de7160e9b93603d": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "24502943168641218c700a88a50b5fcd": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - }, - "26c44f82b0b64fa6b0daea6d9d4e3557": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "7c13738bca27482799c444fc7fdaee54": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "ProgressStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "bar_color": null, - "description_width": "" - } - }, - "4468bd12e8364289bad249ac201dca98": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_model_module": "@jupyter-widgets/base", - "_model_module_version": "1.2.0", - "_model_name": "LayoutModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "LayoutView", - "align_content": null, - "align_items": null, - "align_self": null, - "border": null, - "bottom": null, - "display": null, - "flex": null, - "flex_flow": null, - "grid_area": null, - "grid_auto_columns": null, - "grid_auto_flow": null, - "grid_auto_rows": null, - "grid_column": null, - "grid_gap": null, - "grid_row": null, - "grid_template_areas": null, - "grid_template_columns": null, - "grid_template_rows": null, - "height": null, - "justify_content": null, - "justify_items": null, - "left": null, - "margin": null, - "max_height": null, - "max_width": null, - "min_height": null, - "min_width": null, - "object_fit": null, - "object_position": null, - "order": null, - "overflow": null, - "overflow_x": null, - "overflow_y": null, - "padding": null, - "right": null, - "top": null, - "visibility": null, - "width": null - } - }, - "09483de37bb04a688b6b1484825f4ff8": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_model_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_model_name": "DescriptionStyleModel", - "_view_count": null, - "_view_module": "@jupyter-widgets/base", - "_view_module_version": "1.2.0", - "_view_name": "StyleView", - "description_width": "" - } - } - } - } - }, - "cells": [ - { - "cell_type": "code", - "source": [ - "!pip install transformers" - ], - "metadata": { - "id": "-IvPt6jot3kn" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "!pip install sentence_transformers" - ], - "metadata": { - "id": "aiOjtV_Ft4GR" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "import numpy as np\n", - "import pandas as pd" - ], - "metadata": { - "id": "SXcUC-2ct3gZ" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "from sklearn.metrics.pairwise import cosine_distances" - ], - "metadata": { - "id": "29c0VPz8uxJ_" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# 임시 코드 입니다" - ], - "metadata": { - "id": "wBvRYC-yv54e" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "6Jhfqe5yylTF" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "from transformers import AutoTokenizer, AutoModelForTokenClassification\n", - "from transformers import pipeline\n", - "\n", - "tokenizer = AutoTokenizer.from_pretrained(\"Leo97/KoELECTRA-small-v3-modu-ner\")\n", - "model = AutoModelForTokenClassification.from_pretrained(\"Leo97/KoELECTRA-small-v3-modu-ner\")\n", - "ner = pipeline(\"ner\", model=model, tokenizer=tokenizer)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 209, - "referenced_widgets": [ - "2d9c22439311433fbde63dec91fb7ffc", - "9acf167658a04032b54f36eb8cc1e9c8", - "afca155d3a204bc19526d1578e3ff403", - "f451cacff7044b3ea30925553902a0bc", - "b2ce5bdd00274c07939363b8a51affe7", - "9f7a91fbb53142a2963b49034c6e9f39", - "ccc1c4fb85cb4fffaf074cb6c7657357", - "ab20e37d3dde4b5ba482e50e878b2eab", - "a5578182f4ec480bb479b5ee014b7e39", - "7c1fa72ef3bd45458cd136b1b01c44b5", - "69239a07eea34a2890c1da133a0cb47c", - "2046ef77bcd747ebaf2282d968d8d324", - "9444d0ea409a443fa7843d620bed9fae", - "5910343a2e2c46d89b221e272cce619a", - "d4af78e36c0745559630d836f572ba10", - "7c443272e9584cd8a4e0bc494acac30d", - "7b59e111e7cc413d9bfa87a6e077cc9f", - "b564d91d5d0e4168b19a3b7dc4089cf8", - "01fd16484b264eaaa3360e0de6972933", - "9ab3dcd684d244848e5354ceeedeedeb", - "560c4ecb19f7446785ebd16eddc814f7", - "92e86e1a4a044af790df8e11f9a7fa0d", - "b5dcac63cd2649ef8a96d76111c31bbb", - "3df8295c1ef04c14897bb86f7f81a8a0", - "7799deaee83a4ccdbbbb0e3a96b8a042", - "5c89b41d27aa444a81f76098cf632513", - "7d6bcfa8eb794cf18cb282ca92e248dd", - "e96da164d67d44998b4615edc9816731", - "3456d1eb82404263bce844e673579be6", - "692ab560e5414507add9093ab3d308b1", - "d4198e59eae247ff920a7fece1ddb701", - "a7e43dc7a1b2457fa5ea5ea359fafd08", - "7ec13f29d83d4be58fa557bbf5b4b980", - "0c81c2073c2c4c8fac1d174d356d1659", - "afe5c9d4af724fef936d0b7b69c8d10b", - "4fed88c7a3b848678f09ec9a13bb3c46", - "b4c69a733e084bc1bea1e5106eedd48b", - "9e2472bae3f9489eb637ad681b551eaf", - "799a551beed049e78a16caad61bfaff3", - "7dfabc71cf9b460fbc350ec21cbe3165", - "17c52890539445a8a3e3ba25e1a34805", - "720050fc0b2f45ed973564357b8b96c0", - "e8f1b7529d104fb597c34827ff0b55c9", - "4c654170f9f64a7081ce622964ea9a6b", - "aa3972c512604047a848ccbfd6ce7549", - "149b398730f14bc3a84d2537b1f43192", - "3b6dd37cb3ac4300a608e4b7e47513fe", - "2075e02c4a4b4e22a90b1a57299d110a", - "6a7c0dbf679b4588b7e127fd293343c3", - "2045aba1e11c4d618b763af8832f869f", - "b06d6137f7ee4ddfb34fbc4ba67b701b", - "534575664a26442f8d9a82d2a2c7aaed", - "9456688719ac46bb889049d7afabf36b", - "08e297bfd5ea4d549d75855a8d8bfc53", - "a3d4c956d2e84bac8a285cef6d4e30dd", - "f41a5c3f217a447e9b5ab384e8f49fe4", - "e792d635a172466489805d0ff0ea690a", - "0a3ab3fa5b6f434e80f1be44ea869715", - "ad5b79173e414a11954054baad03d074", - "843b2195c06240f280516695e6c6a163", - "8fea3fa5e37e4f089de7160e9b93603d", - "24502943168641218c700a88a50b5fcd", - "26c44f82b0b64fa6b0daea6d9d4e3557", - "7c13738bca27482799c444fc7fdaee54", - "4468bd12e8364289bad249ac201dca98", - "09483de37bb04a688b6b1484825f4ff8" - ] - }, - "id": "V41IQomT-pFV", - "outputId": "977c97aa-ad09-4bad-d58c-1b3fc343a895" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/plain": [ - "Downloading (…)okenizer_config.json: 0%| | 0.00/365 [00:00\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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
companytitlelinkwriterdatecontent
0CNT85CNT85, 156.5억 규모 공사 계약 체결https://finance.naver.com/item/news_read.naver...이데일리2023.07.03 13:46[이데일리 원다연 기자] CNT85(056730)는 테크로스워터앤에너지와 156억 ...
1CNT85CNT85, 28억 규모 RTO 설치공사 공급계약https://finance.naver.com/item/news_read.naver...이데일리2023.06.16 14:30[이데일리 김보겸 기자] CNT85(056730)는 28억원 규모의 당진공장 축열식...
2CNT85CNT85, 4.6억 규모 전환청구권 행사https://finance.naver.com/item/news_read.naver...이데일리2023.05.26 16:22[이데일리 김응태 기자] CNT85(056730)는 4억6000만원 규모의 23회차...
3CNT85CNT85, 1분기 영업익 2.3억원…흑자전환 성공https://finance.naver.com/item/news_read.naver...머니투데이2023.05.12 14:42플랜트, 필터·여과수처리 사업을 운영하는 CNT85가 1분기 영업이익 2억3000만...
4CNT85CNT85, 7억 규모 전환청구권 행사https://finance.naver.com/item/news_read.naver...이데일리2023.04.28 17:25[이데일리 이정현 기자] CNT85(056730)는 7억 원 규모의 23회차 무기명...
\n", - "
\n", - " \n", - " \n", - " \n", - "\n", - " \n", - "
\n", - " \n", - " " - ] - }, - "metadata": {}, - "execution_count": 11 - } - ] - }, - { - "cell_type": "code", - "source": [ - "text = df.loc[0]['content']" - ], - "metadata": { - "id": "UpCiSdvSurwq" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "title = df.loc[0]['title']" - ], - "metadata": { - "id": "ihvjZ9dXurnC" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "text" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 54 - }, - "id": "Vflr9KeNCA4j", - "outputId": "0ea4b104-34d2-4221-f0bd-fa623856b160" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "'[이데일리 원다연 기자] CNT85(056730)는 테크로스워터앤에너지와 156억 5000만원 규모의 기흥 SDR 그린센터 오수처리시설 기계배관 공사 계약을 체결했다고 3일 공시했다.이는 최근 매출액 대비 48.78%에 해당한다. 계약 기간은 지난 30일부터 내년 12월 31일까지다.'" - ], - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - } - }, - "metadata": {}, - "execution_count": 15 - } - ] - }, - { - "cell_type": "code", - "source": [ - "result = return_words(text)\n", - "words = result['word']\n", - "words" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "gXOh8ZA8vEQq", - "outputId": "7e249d57-d4b3-47ba-df76-745def4d5664" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "['일리',\n", - " '원다연',\n", - " '기자',\n", - " 'CNT85',\n", - " '0567',\n", - " '##30',\n", - " '테크로스워터앤에너지',\n", - " '156억 5000',\n", - " '기흥',\n", - " 'SDR 그린센터',\n", - " '3',\n", - " '##일',\n", - " '48 . 78 %']" - ] - }, - "metadata": {}, - "execution_count": 14 - } - ] - }, - { - "cell_type": "code", - "source": [ - "'''\n", - " todo : 현재 입력 데이터의 길이가 길면 출력이 이상해 지는 문제가 있음\n", - " 아래 예시 확인\n", - "'''" - ], - "metadata": { - "id": "ZMxs6kUCffTZ" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "result = return_words(text[:50])\n", - "words = result['word']\n", - "words" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "rxlltjT5CUX4", - "outputId": "511984ba-e3c3-4e4c-ccca-cd4aa9ad5447" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "['원다연', '기자', 'CNT85', '056730', '테크로스워터앤에너지', '156억 5000']" - ] - }, - "metadata": {}, - "execution_count": 24 - } - ] - }, - { - "cell_type": "code", - "source": [ - "result = return_words(text[:101])\n", - "words = result['word']\n", - "words" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "IG2E3rJdCwv5", - "outputId": "d6573205-682d-42d0-99aa-74b9afbf41af" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "['원다연',\n", - " '기자',\n", - " 'CNT85',\n", - " '056730',\n", - " '테크로스워터앤에너지',\n", - " '156억 5000',\n", - " '기흥',\n", - " 'SDR 그린센터',\n", - " '3일']" - ] - }, - "metadata": {}, - "execution_count": 27 - } - ] - }, - { - "cell_type": "code", - "source": [ - "result = return_words(text[:130])\n", - "words = result['word']\n", - "words" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "KWZpH3MuDA-B", - "outputId": "d5472fdf-cf67-4bb6-b5e3-a587713833ed" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "['일리',\n", - " '원다연',\n", - " '기자',\n", - " 'CNT85',\n", - " '056730',\n", - " '테크로스워터앤에너지',\n", - " '156억 5000',\n", - " '기흥',\n", - " 'SDR 그린센터',\n", - " '3일',\n", - " '48 . 78 %']" - ] - }, - "metadata": {}, - "execution_count": 31 - } - ] - }, - { - "cell_type": "code", - "source": [ - "result = return_words(text)\n", - "words = result['word']\n", - "words" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "tEO_oMYPCF7I", - "outputId": "a6a4c31d-1286-45f5-d5ee-5ac6ffeeb896" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "['일리',\n", - " '원다연',\n", - " '기자',\n", - " 'CNT85',\n", - " '0567',\n", - " '##30',\n", - " '테크로스워터앤에너지',\n", - " '156억 5000',\n", - " '기흥',\n", - " 'SDR 그린센터',\n", - " '3',\n", - " '##일',\n", - " '48 . 78 %']" - ] - }, - "metadata": {}, - "execution_count": 32 - } - ] - }, - { - "cell_type": "code", - "source": [ - "result" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "0sceVfkRvEOX", - "outputId": "4d870c4f-d19c-4db7-8150-9d0c4c374fe6" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'word': ['일리',\n", - " '원다연',\n", - " '기자',\n", - " 'CNT85',\n", - " '0567',\n", - " '##30',\n", - " '테크로스워터앤에너지',\n", - " '156억 5000',\n", - " '기흥',\n", - " 'SDR 그린센터',\n", - " '3',\n", - " '##일',\n", - " '48 . 78 %'],\n", - " 'score': [['I-OG'],\n", - " ['B-OG', 'I-OG', 'I-PS'],\n", - " ['B-CV'],\n", - " ['B-AF', 'I-AF', 'I-AF'],\n", - " ['B-QT', 'I-QT'],\n", - " ['B-QT'],\n", - " ['B-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG'],\n", - " ['B-QT', 'I-QT', 'I-QT'],\n", - " ['B-LC'],\n", - " ['B-AF', 'I-AF', 'I-AF', 'I-AF'],\n", - " ['B-DT'],\n", - " ['B-DT'],\n", - " ['B-QT', 'I-QT', 'I-QT', 'I-QT']],\n", - " 'entity': [[0.49553466],\n", - " [0.5833473, 0.45962462, 0.5877794],\n", - " [0.61917484],\n", - " [0.41322687, 0.45933244, 0.35766423],\n", - " [0.82425725, 0.73227006],\n", - " [0.80768573],\n", - " [0.86274034,\n", - " 0.8953028,\n", - " 0.89671725,\n", - " 0.92597497,\n", - " 0.9127999,\n", - " 0.9244243,\n", - " 0.9098607],\n", - " [0.63297695, 0.64723974, 0.66578895],\n", - " [0.7482972],\n", - " [0.33515036, 0.42516705, 0.46068886, 0.416388],\n", - " [0.7863837],\n", - " [0.77908856],\n", - " [0.7852038, 0.78137255, 0.8358253, 0.80113524]],\n", - " 'index': [[(3, 5)],\n", - " [(6, 7), (7, 8), (8, 9)],\n", - " [(10, 12)],\n", - " [(14, 16), (16, 17), (17, 19)],\n", - " [(20, 22), (22, 24)],\n", - " [(24, 26)],\n", - " [(29, 31), (31, 33), (33, 34), (34, 35), (35, 36), (36, 37), (37, 39)],\n", - " [(41, 44), (44, 45), (46, 50)],\n", - " [(57, 59)],\n", - " [(60, 62), (62, 63), (64, 66), (66, 68)],\n", - " [(94, 95)],\n", - " [(95, 96)],\n", - " [(115, 117), (117, 118), (118, 120), (120, 121)]]}" - ] - }, - "metadata": {}, - "execution_count": 33 - } - ] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "1Jc0Cr8mDkGP" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "DjdmghkDDj9A" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "result = return_words(text[:130])\n", - "words = result['word']\n", - "words" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "h5DIRDQGDqFi", - "outputId": "d36d8ed1-cde9-45a1-a032-d509d3af6c06" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "['일리',\n", - " '원다연',\n", - " '기자',\n", - " 'CNT85',\n", - " '056730',\n", - " '테크로스워터앤에너지',\n", - " '156억 5000',\n", - " '기흥',\n", - " 'SDR 그린센터',\n", - " '3일',\n", - " '48 . 78 %']" - ] - }, - "metadata": {}, - "execution_count": 34 - } - ] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "0wXruLk2ss5G" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "### 불용어 제거" - ], - "metadata": { - "id": "saTscqVSr4Pv" - } - }, - { - "cell_type": "code", - "source": [ - "#stopword 목록 다운\n", - "!git clone https://gist.github.com/d10b18575a73778da4bc83853385465c.git stopwords" - ], - "metadata": { - "id": "EQAr45AJt3TS", - "colab": { - "base_uri": "https://localhost:8080/" - }, - "outputId": "c2d348de-ab1f-44a7-9a28-664c47f155e7" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Cloning into 'stopwords'...\n", - "remote: Enumerating objects: 3, done.\u001b[K\n", - "remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3\u001b[K\n", - "Unpacking objects: 100% (3/3), 2.75 KiB | 2.75 MiB/s, done.\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "'''\n", - " todo : 불용어 추가\n", - "'''\n", - "def load_stopwords(custom_stopwords = None):\n", - " words = []\n", - "\n", - " if custom_stopwords:\n", - " words.extend(custom_stopwords)\n", - "\n", - " file_path = \"./stopwords/stopwords.txt\"\n", - " with open(file_path, 'r') as file:\n", - " words.extend(file.read().split('\\n'))\n", - "\n", - " # file_path = \"./stopword.txt\"\n", - " # with open(file_path, 'r') as file:\n", - " # words.extend(file.read().split('\\n'))\n", - "\n", - " # file_path = \"./stopword2.txt\"\n", - " # with open(file_path, 'r') as file:\n", - " # words.extend(file.read().split('\\n')[1:])\n", - "\n", - " return list(set(words))" - ], - "metadata": { - "id": "GEF_B-bEq5Aa" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# custom = []\n", - "custom = ['기자','3일']\n", - "stopwords = load_stopwords(custom)" - ], - "metadata": { - "id": "qY5xgD4irmKq" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "print(len(stopwords))" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "js9a5HsGEm5x", - "outputId": "58a2ebfa-7cad-461c-bf74-9df6e207228b" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "597\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "result" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "Depd1ifUGXRv", - "outputId": "3c5996a7-d7aa-4ac8-8e70-0b16db6c968d" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'word': ['일리',\n", - " '원다연',\n", - " '기자',\n", - " 'CNT85',\n", - " '056730',\n", - " '테크로스워터앤에너지',\n", - " '156억 5000',\n", - " '기흥',\n", - " 'SDR 그린센터',\n", - " '3일',\n", - " '48 . 78 %'],\n", - " 'score': [['I-OG'],\n", - " ['B-OG', 'I-PS', 'I-PS'],\n", - " ['B-CV'],\n", - " ['B-AF', 'I-AF', 'I-AF'],\n", - " ['B-QT', 'I-QT', 'I-QT'],\n", - " ['B-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG'],\n", - " ['B-QT', 'I-QT', 'I-QT'],\n", - " ['B-LC'],\n", - " ['B-AF', 'I-AF', 'I-AF', 'I-AF'],\n", - " ['B-DT', 'I-DT'],\n", - " ['B-QT', 'I-QT', 'I-QT', 'I-QT']],\n", - " 'entity': [[0.4308679],\n", - " [0.5620235, 0.4328442, 0.6262465],\n", - " [0.6986592],\n", - " [0.42377126, 0.45967755, 0.36286187],\n", - " [0.9009548, 0.8883027, 0.940171],\n", - " [0.87209386,\n", - " 0.89965653,\n", - " 0.89785665,\n", - " 0.9268155,\n", - " 0.9119154,\n", - " 0.9234293,\n", - " 0.9095367],\n", - " [0.64638066, 0.6557225, 0.6707427],\n", - " [0.7661712],\n", - " [0.37843058, 0.4347338, 0.47299442, 0.4301917],\n", - " [0.8726086, 0.946883],\n", - " [0.83745456, 0.8217816, 0.870865, 0.8377137]],\n", - " 'index': [[(3, 5)],\n", - " [(6, 7), (7, 8), (8, 9)],\n", - " [(10, 12)],\n", - " [(14, 16), (16, 17), (17, 19)],\n", - " [(20, 22), (22, 24), (24, 26)],\n", - " [(29, 31), (31, 33), (33, 34), (34, 35), (35, 36), (36, 37), (37, 39)],\n", - " [(41, 44), (44, 45), (46, 50)],\n", - " [(57, 59)],\n", - " [(60, 62), (62, 63), (64, 66), (66, 68)],\n", - " [(94, 95), (95, 96)],\n", - " [(115, 117), (117, 118), (118, 120), (120, 121)]]}" - ] - }, - "metadata": {}, - "execution_count": 53 - } - ] - }, - { - "cell_type": "code", - "source": [ - "remove_idxs = [i for i, word in enumerate(result['word']) if word in stopwords]\n", - "remove_idxs" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "-6kzIpMVGXLN", - "outputId": "1596d600-9e7c-44db-d80f-5aebabdf70b7" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[2, 9]" - ] - }, - "metadata": {}, - "execution_count": 54 - } - ] - }, - { - "cell_type": "code", - "source": [ - "for idx in sorted(remove_idxs, reverse=True):\n", - " del result['word'][idx]\n", - " del result['score'][idx]\n", - " del result['entity'][idx]\n", - " del result['index'][idx]" - ], - "metadata": { - "id": "ci0iEZ0oGXFz" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "result" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "m3mvNACsHTYh", - "outputId": "e2da1dd4-be67-4d71-b61f-7f6cf7d9287b" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'word': ['일리',\n", - " '원다연',\n", - " 'CNT85',\n", - " '056730',\n", - " '테크로스워터앤에너지',\n", - " '156억 5000',\n", - " '기흥',\n", - " 'SDR 그린센터',\n", - " '48 . 78 %'],\n", - " 'score': [['I-OG'],\n", - " ['B-OG', 'I-PS', 'I-PS'],\n", - " ['B-AF', 'I-AF', 'I-AF'],\n", - " ['B-QT', 'I-QT', 'I-QT'],\n", - " ['B-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG', 'I-OG'],\n", - " ['B-QT', 'I-QT', 'I-QT'],\n", - " ['B-LC'],\n", - " ['B-AF', 'I-AF', 'I-AF', 'I-AF'],\n", - " ['B-QT', 'I-QT', 'I-QT', 'I-QT']],\n", - " 'entity': [[0.4308679],\n", - " [0.5620235, 0.4328442, 0.6262465],\n", - " [0.42377126, 0.45967755, 0.36286187],\n", - " [0.9009548, 0.8883027, 0.940171],\n", - " [0.87209386,\n", - " 0.89965653,\n", - " 0.89785665,\n", - " 0.9268155,\n", - " 0.9119154,\n", - " 0.9234293,\n", - " 0.9095367],\n", - " [0.64638066, 0.6557225, 0.6707427],\n", - " [0.7661712],\n", - " [0.37843058, 0.4347338, 0.47299442, 0.4301917],\n", - " [0.83745456, 0.8217816, 0.870865, 0.8377137]],\n", - " 'index': [[(3, 5)],\n", - " [(6, 7), (7, 8), (8, 9)],\n", - " [(14, 16), (16, 17), (17, 19)],\n", - " [(20, 22), (22, 24), (24, 26)],\n", - " [(29, 31), (31, 33), (33, 34), (34, 35), (35, 36), (36, 37), (37, 39)],\n", - " [(41, 44), (44, 45), (46, 50)],\n", - " [(57, 59)],\n", - " [(60, 62), (62, 63), (64, 66), (66, 68)],\n", - " [(115, 117), (117, 118), (118, 120), (120, 121)]]}" - ] - }, - "metadata": {}, - "execution_count": 56 - } - ] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "bOnMBZihHTTX" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "words = result['word']\n", - "words" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "I_9x2bcdINrq", - "outputId": "8adc2679-c363-4857-935a-4bfdd919dfeb" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "['일리',\n", - " '원다연',\n", - " 'CNT85',\n", - " '056730',\n", - " '테크로스워터앤에너지',\n", - " '156억 5000',\n", - " '기흥',\n", - " 'SDR 그린센터',\n", - " '48 . 78 %']" - ] - }, - "metadata": {}, - "execution_count": 58 - } - ] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "VjyoDJajGXAQ" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "### 벡터화" - ], - "metadata": { - "id": "grQ_6GhAr-Zo" - } - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "E2WP0Ukor9lV" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "'''\n", - " 참고 사이트 :\n", - " https://devocean.sk.com/blog/techBoardDetail.do?ID=164033\n", - "'''" - ], - "metadata": { - "id": "wH4_QbLD1QmC" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "'''\n", - " todo : sota 모델 찾기\n", - "'''\n", - "from sentence_transformers import SentenceTransformer\n", - "model = SentenceTransformer('jhgan/ko-sroberta-multitask')" - ], - "metadata": { - "id": "0086Wo6C1QGX" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "print(title)\n", - "print(text)\n", - "print(words)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "qjogJSFtIfLN", - "outputId": "fa9998a1-cc3f-4a23-a7aa-f9ec846ec41c" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "CNT85, 156.5억 규모 공사 계약 체결\n", - "[이데일리 원다연 기자] CNT85(056730)는 테크로스워터앤에너지와 156억 5000만원 규모의 기흥 SDR 그린센터 오수처리시설 기계배관 공사 계약을 체결했다고 3일 공시했다.이는 최근 매출액 대비 48.78%에 해당한다. 계약 기간은 지난 30일부터 내년 12월 31일까지다.\n", - "['일리', '원다연', 'CNT85', '056730', '테크로스워터앤에너지', '156억 5000', '기흥', 'SDR 그린센터', '48 . 78 %']\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "# title 벡터화\n", - "title_emb = model.encode(title)\n", - "# text 벡터화\n", - "doc_emb = model.encode(text)\n", - "# words 백터화\n", - "word_emb = model.encode(words)\n", - "# print(doc_emb.shape)\n", - "# print(word_emb.shape)" - ], - "metadata": { - "id": "l0MxvjSst3P8" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "# 코사인 유사도 측정\n", - "title_word_dists = cosine_distances([title_emb], word_emb).flatten()\n", - "text_word_dists = cosine_distances([doc_emb], word_emb).flatten()\n", - "print('title과 text의 cosine distance: ',cosine_distances([doc_emb], [title_emb]).flatten())" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "ZO7J0ZlTyDNq", - "outputId": "df325d5f-63be-4ed5-8944-9a49562fd036" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "title과 text의 cosine distance: [0.36870557]\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "text_word_dists" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "VMuNJeyiKK43", - "outputId": "5f00413e-1b0d-4178-8919-6923a94da41b" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([0.87537664, 0.82498133, 0.5951872 , 0.6734893 , 0.49724144,\n", - " 0.6993714 , 0.6877056 , 0.6774784 , 0.71606404], dtype=float32)" - ] - }, - "metadata": {}, - "execution_count": 72 - } - ] - }, - { - "cell_type": "code", - "source": [ - "print('title과 words의 cosine distance')\n", - "for i in np.argsort(title_word_dists):\n", - " print(words[i],title_word_dists[i])" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "ZP9idZW_yDKl", - "outputId": "bffb2575-50d8-4db0-fe82-6862245ae5a9" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "title과 words의 cosine distance\n", - "CNT85 0.36422163\n", - "156억 5000 0.5453429\n", - "테크로스워터앤에너지 0.58205175\n", - "056730 0.6712269\n", - "SDR 그린센터 0.7803867\n", - "원다연 0.8208597\n", - "기흥 0.82504976\n", - "일리 0.8513015\n", - "48 . 78 % 0.97520405\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "print('text과 words의 cosine distance')\n", - "for i in np.argsort(text_word_dists):\n", - " print(words[i],text_word_dists[i])" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "GGaUCZvWw2DM", - "outputId": "5c954ed0-7070-4714-d2dd-5a81248ad187" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "text과 words의 cosine distance\n", - "테크로스워터앤에너지 0.49724144\n", - "CNT85 0.5951872\n", - "056730 0.6734893\n", - "SDR 그린센터 0.6774784\n", - "기흥 0.6877056\n", - "156억 5000 0.6993714\n", - "48 . 78 % 0.71606404\n", - "원다연 0.82498133\n", - "일리 0.87537664\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "source": [ - "### Score 계산" - ], - "metadata": { - "id": "sIFjWEeGfKDw" - } - }, - { - "cell_type": "code", - "source": [ - "# score 구하기 (임시)\n", - "score = 0.6 * (1 - title_word_dists) + 0.4 * (1 - text_word_dists)\n", - "score" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "MIPArmgdKdD3", - "outputId": "2d242fc8-e6a2-4af6-d1ec-b4ac62053994" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([0.13906845, 0.17749166, 0.5433922 , 0.32786816, 0.4518724 ,\n", - " 0.3930457 , 0.22988792, 0.26077664, 0.12845196], dtype=float32)" - ] - }, - "metadata": {}, - "execution_count": 79 - } - ] - }, - { - "cell_type": "code", - "source": [ - "print(list(score))\n", - "np.argsort(score)" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "SUYEYhvVLpNH", - "outputId": "43485f27-9b25-47b6-ffa8-b780095f3045" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "[0.13906845, 0.17749166, 0.5433922, 0.32786816, 0.4518724, 0.3930457, 0.22988792, 0.26077664, 0.12845196]\n" - ] - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "array([8, 0, 1, 6, 7, 3, 5, 4, 2])" - ] - }, - "metadata": {}, - "execution_count": 86 - } - ] - }, - { - "cell_type": "code", - "source": [ - "top_k = 3\n", - "top_words = []\n", - "for i in np.argsort(-score)[:top_k]:\n", - " top_words.append()\n", - " print(i, words[i], 'score :',score[i], 'title score :', 1 - title_word_dists[i], 'text score :', 1 - text_word_dists[i])" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "SYzgrLMbKaNg", - "outputId": "03928fd4-f28c-4621-a1d5-c7eb8899397c" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "2 CNT85 score : 0.5433922 title score : 0.6357783675193787 text score : 0.4048128128051758\n", - "4 테크로스워터앤에너지 score : 0.4518724 title score : 0.41794824600219727 text score : 0.5027585625648499\n", - "5 156억 5000 score : 0.3930457 title score : 0.45465707778930664 text score : 0.3006286025047302\n" - ] - } - ] - }, - { - "cell_type": "code", - "source": [ - "print(title)\n", - "text" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 72 - }, - "id": "E_KCOQKowB-Q", - "outputId": "676655e0-90c8-49ad-ce59-bd6baf5d7d7f" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "CNT85, 156.5억 규모 공사 계약 체결\n" - ] - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "'[이데일리 원다연 기자] CNT85(056730)는 테크로스워터앤에너지와 156억 5000만원 규모의 기흥 SDR 그린센터 오수처리시설 기계배관 공사 계약을 체결했다고 3일 공시했다.이는 최근 매출액 대비 48.78%에 해당한다. 계약 기간은 지난 30일부터 내년 12월 31일까지다.'" - ], - "application/vnd.google.colaboratory.intrinsic+json": { - "type": "string" - } - }, - "metadata": {}, - "execution_count": 91 - } - ] - }, - { - "cell_type": "code", - "source": [ - "result['word'].index()" - ], - "metadata": { - "id": "QY-vX00vNLyM" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "'''\n", - " todo : 유사도 threshold로 word filtering\n", - "'''" - ], - "metadata": { - "id": "BOdvOz985F71" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "eNzZI4yd5Ftc" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "markdown", - "source": [ - "### 키워드 빈도수 계산" - ], - "metadata": { - "id": "2ehFBbv_4pL-" - } - }, - { - "cell_type": "code", - "source": [ - "word_counts = {}\n", - "for word in words:\n", - " count = text.count(word)\n", - " word_counts[word] = count" - ], - "metadata": { - "id": "0J1zc7eM4omG" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "word_counts" - ], - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "nINedIBL4QeH", - "outputId": "07c2a191-5da0-43a6-9714-de1ed241653b" - }, - "execution_count": null, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "{'챗': 1,\n", - " '등': 1,\n", - " '출현': 1,\n", - " '미국 반도체 업체 엔비디아 주가': 1,\n", - " '연일': 1,\n", - " '행진': 1,\n", - " '어가': 1,\n", - " '차기': 1,\n", - " '혜주': 1,\n", - " '관심': 1}" - ] - }, - "metadata": {}, - "execution_count": 33 - } - ] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "8ojvYDaJ4ZPk" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "'''\n", - " todo :\n", - " 1. 뉴스 제목과 word의 유사도 측정\n", - " 2. 빈도수, 제목과 유사성, 본문과 유사성 등 을 합쳐 점수 계산\n", - " (option) 기사 간 키워드 클러스터링 해서 filtering\n", - "'''" - ], - "metadata": { - "id": "oOFahDC94CbE" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "vpTWM1jz4C0h" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "WIdcILnO4DIS" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "'''\n", - " todo : option\n", - " 급상승 키워드 재순위화\n", - "'''" - ], - "metadata": { - "id": "4rrtsYJOyDCp" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "N-vrylfxt3Mr" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "_-m4zal0t3J_" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [ - "'''\n", - "나중에 참고용\n", - "elastric search 도입 참고용\n", - "https://www.lesstif.com/dbms/elastic-search-nori-80248960.html\n", - "'''" - ], - "metadata": { - "id": "sHsULSEyt3GK" - }, - "execution_count": null, - "outputs": [] - }, - { - "cell_type": "code", - "source": [], - "metadata": { - "id": "8lWwifjxt3DB" - }, - "execution_count": null, - "outputs": [] - } - ] -} \ No newline at end of file From c5178c5abd0a74a74faa074d9845d336d26edba1 Mon Sep 17 00:00:00 2001 From: Yungi Date: Sat, 22 Jul 2023 15:06:36 +0900 Subject: [PATCH 26/63] [Feature] Add Backend Base Directory - Add Backend Dirs.(Keyword Extraction, Summ, Sent) --- Backend/Keyword Extraction/__main__.py | 4 ++++ Backend/Keyword Extraction/main.py | 20 ++++++++++++++++++++ Backend/Sentimental/.gitkeep | 0 Backend/Summarization/.gitkeep | 0 4 files changed, 24 insertions(+) create mode 100644 Backend/Keyword Extraction/__main__.py create mode 100644 Backend/Keyword Extraction/main.py create mode 100644 Backend/Sentimental/.gitkeep create mode 100644 Backend/Summarization/.gitkeep diff --git a/Backend/Keyword Extraction/__main__.py b/Backend/Keyword Extraction/__main__.py new file mode 100644 index 0000000..ff2dc79 --- /dev/null +++ b/Backend/Keyword Extraction/__main__.py @@ -0,0 +1,4 @@ +if __name__ == "__main__": + import uvicorn + + uvicorn.run("Keyword Extraction.main:app", host="0.0.0.0", port=30008, reload=True) diff --git a/Backend/Keyword Extraction/main.py b/Backend/Keyword Extraction/main.py new file mode 100644 index 0000000..ff6a88b --- /dev/null +++ b/Backend/Keyword Extraction/main.py @@ -0,0 +1,20 @@ +import sys + +from pathlib import Path + +from fastapi import FastAPI, UploadFile, File +from fastapi.param_functions import Depends +from pydantic import BaseModel, Field +from uuid import UUID, uuid4 +from typing import List, Union, Optional, Dict, Any + +from datetime import datetime + +sys.path.append(str(Path.home().joinpath("level3_nlp_finalproject-nlp-04"))) +from keyword_extractor.model import KeyBert + +app = FastAPI() + +@app.get("/") +def hello_word(): + return {"hello": "world"} \ No newline at end of file diff --git a/Backend/Sentimental/.gitkeep b/Backend/Sentimental/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Backend/Summarization/.gitkeep b/Backend/Summarization/.gitkeep new file mode 100644 index 0000000..e69de29 From 7e1a3a377eae7aae88e11dca944aa29e189d0a4b Mon Sep 17 00:00:00 2001 From: Yungi Date: Sat, 22 Jul 2023 18:33:21 +0900 Subject: [PATCH 27/63] [Feature] Add Docstring, Assertion in MMR --- keyword_extractor/mmr.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/keyword_extractor/mmr.py b/keyword_extractor/mmr.py index 2c4569c..bc4f0e8 100644 --- a/keyword_extractor/mmr.py +++ b/keyword_extractor/mmr.py @@ -11,6 +11,28 @@ def mmr( top_k: int = 5, diversity: float = 0.7, ) -> List[Tuple[str, float]]: + """Maximal Marginal Relevance + + Calculate MMR score for each word and extract top-k keywords + + Args: + doc_embedding: + Embedding of document + word_embedding: + Embedding of words + words: + Words to extract keywords + top_k: + Number of keywords to extract + diversity: + Diversity for MMR - (0 ~ 1) + + Returns: + Keywords and scores: List of tuples (word, score) + """ + + assert 0 <= diversity <= 1, "Diversity should be between 0 and 1" + word_doc_sim = cosine_similarity(word_embedding, doc_embedding) word_sim = cosine_similarity(word_embedding) From 89f1ba13b8eed5f36c9e1e35c1c90db82c665dc9 Mon Sep 17 00:00:00 2001 From: Yungi Date: Sat, 22 Jul 2023 19:26:08 +0900 Subject: [PATCH 28/63] [Feature] Add Get Data in DB Code - Add get_stock Code in DB - Add get_db for loading News Data in DB --- Backend/Keyword Extraction/main.py | 36 ++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/Backend/Keyword Extraction/main.py b/Backend/Keyword Extraction/main.py index ff6a88b..ecabbdd 100644 --- a/Backend/Keyword Extraction/main.py +++ b/Backend/Keyword Extraction/main.py @@ -1,5 +1,8 @@ import sys +import pendulum + +from datetime import datetime, timedelta from pathlib import Path from fastapi import FastAPI, UploadFile, File @@ -8,13 +11,42 @@ from uuid import UUID, uuid4 from typing import List, Union, Optional, Dict, Any -from datetime import datetime +from supabase import create_client, Client sys.path.append(str(Path.home().joinpath("level3_nlp_finalproject-nlp-04"))) from keyword_extractor.model import KeyBert +from utils.secrets import Secrets app = FastAPI() +tz = pendulum.timezone("Asia/Seoul") @app.get("/") def hello_word(): - return {"hello": "world"} \ No newline at end of file + return {"hello": "world"} + +@app.get("/get_db", description="Stock Code, Company Name 가져오기") +async def get_stock(): + url = Secrets.url + key = Secrets.key + + supabase: Client = create_client(url, key) + + res = supabase.table("ticker").select("*").execute().data + return res + +@app.get("/get_db/{stock_code}", description="종목 코드를 이용해서, DB에서 데이터 가져오기") +async def get_db(stock_code: str, + start_date: Optional[str] = (datetime.now(tz=tz) - timedelta(days=7)).strftime('%Y%m%d%H%M%S'), + end_date: Optional[str] = datetime.now(tz=tz).strftime('%Y%m%d%H%M%S')): + url = Secrets.url + key = Secrets.key + + supabase: Client = create_client(url, key) + + + stock_name = supabase.table("ticker").select("name").eq("ticker", stock_code).execute().data[0]["name"] + res = supabase.table("news").select("*").eq("company", stock_name).filter("date", "gt", + datetime.strptime(start_date, "%Y%m%d%H%M%S").strftime('%Y-%m-%d %H:%M:%S') + ).filter("date", "lt", + datetime.strptime(end_date, "%Y%m%d%H%M%S").strftime('%Y-%m-%d %H:%M:%S')).execute().data + return res \ No newline at end of file From 5564bbd5ff4b6e7026d404cea37167f70db46a56 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Sun, 23 Jul 2023 14:51:18 +0900 Subject: [PATCH 29/63] [Backend] Summarization backend v1 - Summarization backend version 1. - Check README.md file. - Check API docs in swagger. --- Backend/Summarization/summe/.env.example | 4 + .../summe/.github/workflows/ci.yaml | 24 + Backend/Summarization/summe/.gitignore | 92 ++ Backend/Summarization/summe/.pylintrc | 585 +++++++ Backend/Summarization/summe/Dockerfile | 21 + Backend/Summarization/summe/Makefile | 62 + Backend/Summarization/summe/README.md | 62 + Backend/Summarization/summe/app/__init__.py | 1 + .../Summarization/summe/app/api/__init__.py | 0 .../summe/app/api/routes/__init__.py | 0 .../Summarization/summe/app/api/routes/api.py | 6 + .../summe/app/api/routes/predictor.py | 74 + .../Summarization/summe/app/core/__init__.py | 0 .../Summarization/summe/app/core/config.py | 31 + .../Summarization/summe/app/core/errors.py | 6 + .../Summarization/summe/app/core/events.py | 19 + .../Summarization/summe/app/core/logging.py | 9 + .../Summarization/summe/app/core/paginator.py | 35 + Backend/Summarization/summe/app/main.py | 17 + .../summe/app/models/prediction.py | 61 + .../summe/app/services/predict.py | 122 ++ .../Summarization/summe/docker-compose.yml | 16 + Backend/Summarization/summe/ml/__init__.py | 0 .../Summarization/summe/ml/data/__init__.py | 0 .../summe/ml/data/make_dataset.py | 28 + .../summe/ml/features/__init__.py | 0 .../summe/ml/features/build_features.py | 28 + Backend/Summarization/summe/ml/model/.gitkeep | 0 .../summe/ml/model/examples/example.json | 7 + .../Summarization/summe/notebooks/.gitkeep | 0 Backend/Summarization/summe/poetry.lock | 1395 +++++++++++++++++ Backend/Summarization/summe/pyproject.toml | 47 + Backend/Summarization/summe/tests/__init__.py | 0 .../summe/tests/test_pagination_behavior.py | 45 + 34 files changed, 2797 insertions(+) create mode 100644 Backend/Summarization/summe/.env.example create mode 100644 Backend/Summarization/summe/.github/workflows/ci.yaml create mode 100644 Backend/Summarization/summe/.gitignore create mode 100644 Backend/Summarization/summe/.pylintrc create mode 100644 Backend/Summarization/summe/Dockerfile create mode 100644 Backend/Summarization/summe/Makefile create mode 100644 Backend/Summarization/summe/README.md create mode 100644 Backend/Summarization/summe/app/__init__.py create mode 100644 Backend/Summarization/summe/app/api/__init__.py create mode 100644 Backend/Summarization/summe/app/api/routes/__init__.py create mode 100644 Backend/Summarization/summe/app/api/routes/api.py create mode 100644 Backend/Summarization/summe/app/api/routes/predictor.py create mode 100644 Backend/Summarization/summe/app/core/__init__.py create mode 100644 Backend/Summarization/summe/app/core/config.py create mode 100644 Backend/Summarization/summe/app/core/errors.py create mode 100644 Backend/Summarization/summe/app/core/events.py create mode 100644 Backend/Summarization/summe/app/core/logging.py create mode 100644 Backend/Summarization/summe/app/core/paginator.py create mode 100644 Backend/Summarization/summe/app/main.py create mode 100644 Backend/Summarization/summe/app/models/prediction.py create mode 100644 Backend/Summarization/summe/app/services/predict.py create mode 100644 Backend/Summarization/summe/docker-compose.yml create mode 100644 Backend/Summarization/summe/ml/__init__.py create mode 100644 Backend/Summarization/summe/ml/data/__init__.py create mode 100644 Backend/Summarization/summe/ml/data/make_dataset.py create mode 100644 Backend/Summarization/summe/ml/features/__init__.py create mode 100644 Backend/Summarization/summe/ml/features/build_features.py create mode 100644 Backend/Summarization/summe/ml/model/.gitkeep create mode 100644 Backend/Summarization/summe/ml/model/examples/example.json create mode 100644 Backend/Summarization/summe/notebooks/.gitkeep create mode 100644 Backend/Summarization/summe/poetry.lock create mode 100644 Backend/Summarization/summe/pyproject.toml create mode 100644 Backend/Summarization/summe/tests/__init__.py create mode 100644 Backend/Summarization/summe/tests/test_pagination_behavior.py diff --git a/Backend/Summarization/summe/.env.example b/Backend/Summarization/summe/.env.example new file mode 100644 index 0000000..adf3560 --- /dev/null +++ b/Backend/Summarization/summe/.env.example @@ -0,0 +1,4 @@ +SECRET_KEY=secret +DEBUG=True +MODEL_PATH=./ml/model/ +MODEL_NAME=model.pkl \ No newline at end of file diff --git a/Backend/Summarization/summe/.github/workflows/ci.yaml b/Backend/Summarization/summe/.github/workflows/ci.yaml new file mode 100644 index 0000000..9f0ecf1 --- /dev/null +++ b/Backend/Summarization/summe/.github/workflows/ci.yaml @@ -0,0 +1,24 @@ +name: Python package + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ["3.6", "3.7", "3.8", "3.9"] + + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + make install + - name: Test with pytest + run: | + make test \ No newline at end of file diff --git a/Backend/Summarization/summe/.gitignore b/Backend/Summarization/summe/.gitignore new file mode 100644 index 0000000..47e2318 --- /dev/null +++ b/Backend/Summarization/summe/.gitignore @@ -0,0 +1,92 @@ +# Cookiecutter specific +data/* + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# 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/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover + +# Translations +*.mo +*.pot + +# Django stuff: +*.log + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# DotEnv configuration +.env + +# Database +*.db +*.rdb + +# Pycharm +.idea + +# VS Code +.vscode/ + +# Spyder +.spyproject/ + +# Jupyter NB Checkpoints +.ipynb_checkpoints/ + +# exclude data from source control by default +/data/ + +# Mac OS-specific storage files +.DS_Store + +# vim +*.swp +*.swo + +# Mypy cache +.mypy_cache/ diff --git a/Backend/Summarization/summe/.pylintrc b/Backend/Summarization/summe/.pylintrc new file mode 100644 index 0000000..3d1c651 --- /dev/null +++ b/Backend/Summarization/summe/.pylintrc @@ -0,0 +1,585 @@ +[MASTER] + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. +extension-pkg-whitelist= + +# Add files or directories to the blacklist. They should be base names, not +# paths. +ignore=CVS + +# Add files or directories matching the regex patterns to the blacklist. The +# regex matches against base names, not paths. +ignore-patterns= + +# Python code to execute, usually for sys.path manipulation such as +# pygtk.require(). +#init-hook= + +# Use multiple processes to speed up Pylint. Specifying 0 will auto-detect the +# number of processors available to use. +jobs=1 + +# Control the amount of potential inferred values when inferring a single +# object. This can help the performance when dealing with large functions or +# complex, nested conditions. +limit-inference-results=100 + +# List of plugins (as comma separated values of python module names) to load, +# usually to register additional checkers. +load-plugins= + +# Pickle collected data for later comparisons. +persistent=yes + +# Specify a configuration file. +#rcfile= + +# When enabled, pylint would attempt to guess common misconfiguration and emit +# user-friendly hints instead of false-positive error messages. +suggestion-mode=yes + +# Allow loading of arbitrary C extensions. Extensions are imported into the +# active Python interpreter and may run arbitrary code. +unsafe-load-any-extension=no + + +[MESSAGES CONTROL] + +# Only show warnings with the listed confidence levels. Leave empty to show +# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. +confidence= + +# Disable the message, report, category or checker with the given id(s). You +# can either give multiple identifiers separated by comma (,) or put this +# option multiple times (only on the command line, not in the configuration +# file where it should appear only once). You can also use "--disable=all" to +# disable everything first and then reenable specific checks. For example, if +# you want to run only the similarities checker, you can use "--disable=all +# --enable=similarities". If you want to run only the classes checker, but have +# no Warning level messages displayed, use "--disable=all --enable=classes +# --disable=W". +disable=print-statement, + parameter-unpacking, + unpacking-in-except, + old-raise-syntax, + backtick, + long-suffix, + old-ne-operator, + old-octal-literal, + import-star-module-level, + non-ascii-bytes-literal, + raw-checker-failed, + bad-inline-option, + locally-disabled, + file-ignored, + suppressed-message, + useless-suppression, + deprecated-pragma, + use-symbolic-message-instead, + apply-builtin, + basestring-builtin, + buffer-builtin, + cmp-builtin, + coerce-builtin, + execfile-builtin, + file-builtin, + long-builtin, + raw_input-builtin, + reduce-builtin, + standarderror-builtin, + unicode-builtin, + xrange-builtin, + coerce-method, + delslice-method, + getslice-method, + setslice-method, + no-absolute-import, + old-division, + dict-iter-method, + dict-view-method, + next-method-called, + metaclass-assignment, + indexing-exception, + raising-string, + reload-builtin, + oct-method, + hex-method, + nonzero-method, + cmp-method, + input-builtin, + round-builtin, + intern-builtin, + unichr-builtin, + map-builtin-not-iterating, + zip-builtin-not-iterating, + range-builtin-not-iterating, + filter-builtin-not-iterating, + using-cmp-argument, + eq-without-hash, + div-method, + idiv-method, + rdiv-method, + exception-message-attribute, + invalid-str-codec, + sys-max-int, + bad-python3-import, + deprecated-string-function, + deprecated-str-translate-call, + deprecated-itertools-function, + deprecated-types-field, + next-method-defined, + dict-items-not-iterating, + dict-keys-not-iterating, + dict-values-not-iterating, + deprecated-operator-function, + deprecated-urllib-function, + xreadlines-attribute, + deprecated-sys-function, + exception-escape, + comprehension-escape. + logging-fstring-interpolation + +# Enable the message, report, category or checker with the given id(s). You can +# either give multiple identifier separated by comma (,) or put this option +# multiple time (only on the command line, not in the configuration file where +# it should appear only once). See also the "--disable" option for examples. +enable=c-extension-no-member + + +[REPORTS] + +# Python expression which should return a score less than or equal to 10. You +# have access to the variables 'error', 'warning', 'refactor', and 'convention' +# which contain the number of messages in each category, as well as 'statement' +# which is the total number of statements analyzed. This score is used by the +# global evaluation report (RP0004). +evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details. +#msg-template= + +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio). You can also give a reporter class, e.g. +# mypackage.mymodule.MyReporterClass. +output-format=text + +# Tells whether to display a full report or only the messages. +reports=no + +# Activate the evaluation score. +score=yes + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=sys.exit + + +[VARIABLES] + +# List of additional names supposed to be defined in builtins. Remember that +# you should avoid defining new builtins when possible. +additional-builtins= + +# Tells whether unused global variables should be treated as a violation. +allow-global-unused-variables=yes + +# List of strings which can identify a callback function by name. A callback +# name must start or end with one of those strings. +callbacks=cb_, + _cb + +# A regular expression matching the name of dummy variables (i.e. expected to +# not be used). +dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_ + +# Argument names that match this expression will be ignored. Default to name +# with leading underscore. +ignored-argument-names=_.*|^ignored_|^unused_ + +# Tells whether we should check for unused import in __init__ files. +init-import=no + +# List of qualified module names which can have objects that can redefine +# builtins. +redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io + + +[TYPECHECK] + +# List of decorators that produce context managers, such as +# contextlib.contextmanager. Add to this list to register other decorators that +# produce valid context managers. +contextmanager-decorators=contextlib.contextmanager + +# List of members which are set dynamically and missed by pylint inference +# system, and so shouldn't trigger E1101 when accessed. Python regular +# expressions are accepted. +generated-members= + +# Tells whether missing members accessed in mixin class should be ignored. A +# mixin class is detected if its name ends with "mixin" (case insensitive). +ignore-mixin-members=yes + +# Tells whether to warn about missing members when the owner of the attribute +# is inferred to be None. +ignore-none=yes + +# This flag controls whether pylint should warn about no-member and similar +# checks whenever an opaque object is returned when inferring. The inference +# can return multiple potential results while evaluating a Python object, but +# some branches might not be evaluated, which results in partial inference. In +# that case, it might be useful to still emit no-member and other checks for +# the rest of the inferred objects. +ignore-on-opaque-inference=yes + +# List of class names for which member attributes should not be checked (useful +# for classes with dynamically set attributes). This supports the use of +# qualified names. +ignored-classes=optparse.Values,thread._local,_thread._local + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis). It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= + +# Show a hint with possible names when a member name was not found. The aspect +# of finding the hint is based on edit distance. +missing-member-hint=yes + +# The minimum edit distance a name should have in order to be considered a +# similar match for a missing member name. +missing-member-hint-distance=1 + +# The total number of similar names that should be taken in consideration when +# showing a hint for a missing member. +missing-member-max-choices=1 + +# List of decorators that change the signature of a decorated function. +signature-mutators= + + +[MISCELLANEOUS] + +# List of note tags to take in consideration, separated by a comma. +notes=FIXME, + XXX, + TODO + + +[BASIC] + +# Naming style matching correct argument names. +argument-naming-style=snake_case + +# Regular expression matching correct argument names. Overrides argument- +# naming-style. +#argument-rgx= + +# Naming style matching correct attribute names. +attr-naming-style=snake_case + +# Regular expression matching correct attribute names. Overrides attr-naming- +# style. +#attr-rgx= + +# Bad variable names which should always be refused, separated by a comma. +bad-names=foo, + bar, + baz, + toto, + tutu, + tata + +# Naming style matching correct class attribute names. +class-attribute-naming-style=any + +# Regular expression matching correct class attribute names. Overrides class- +# attribute-naming-style. +#class-attribute-rgx= + +# Naming style matching correct class names. +class-naming-style=PascalCase + +# Regular expression matching correct class names. Overrides class-naming- +# style. +#class-rgx= + +# Naming style matching correct constant names. +const-naming-style=UPPER_CASE + +# Regular expression matching correct constant names. Overrides const-naming- +# style. +#const-rgx= + +# Minimum line length for functions/classes that require docstrings, shorter +# ones are exempt. +docstring-min-length=-1 + +# Naming style matching correct function names. +function-naming-style=snake_case + +# Regular expression matching correct function names. Overrides function- +# naming-style. +#function-rgx= + +# Good variable names which should always be accepted, separated by a comma. +good-names=i, + j, + k, + ex, + Run, + _, + sc, sqlContext, + df + +# Include a hint for the correct naming format with invalid-name. +include-naming-hint=no + +# Naming style matching correct inline iteration names. +inlinevar-naming-style=any + +# Regular expression matching correct inline iteration names. Overrides +# inlinevar-naming-style. +#inlinevar-rgx= + +# Naming style matching correct method names. +method-naming-style=snake_case + +# Regular expression matching correct method names. Overrides method-naming- +# style. +#method-rgx= + +# Naming style matching correct module names. +module-naming-style=snake_case + +# Regular expression matching correct module names. Overrides module-naming- +# style. +#module-rgx= + +# Colon-delimited sets of names that determine each other's naming style when +# the name regexes allow several styles. +name-group= + +# Regular expression which should only match function or class names that do +# not require a docstring. +no-docstring-rgx=^_ + +# List of decorators that produce properties, such as abc.abstractproperty. Add +# to this list to register other decorators that produce valid properties. +# These decorators are taken in consideration only for invalid-name. +property-classes=abc.abstractproperty + +# Naming style matching correct variable names. +variable-naming-style=snake_case + +# Regular expression matching correct variable names. Overrides variable- +# naming-style. +#variable-rgx= + + +[FORMAT] + +# Expected format of line ending, e.g. empty (any line ending), LF or CRLF. +expected-line-ending-format= + +# Regexp for a line that is allowed to be longer than the limit. +ignore-long-lines=^\s*(# )??$ + +# Number of spaces of indent required inside a hanging or continued line. +indent-after-paren=4 + +# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1 +# tab). +indent-string=' ' + +# Maximum number of characters on a single line. +max-line-length=100 + +# Maximum number of lines in a module. +max-module-lines=1000 + +# List of optional constructs for which whitespace checking is disabled. `dict- +# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. +# `trailing-comma` allows a space between comma and closing bracket: (a, ). +# `empty-line` allows space-only lines. +no-space-check=trailing-comma, + dict-separator + +# Allow the body of a class to be on the same line as the declaration if body +# contains single statement. +single-line-class-stmt=no + +# Allow the body of an if to be on the same line as the test if there is no +# else. +single-line-if-stmt=no + + +[STRING] + +# This flag controls whether the implicit-str-concat-in-sequence should +# generate a warning on implicit string concatenation in sequences defined over +# several lines. +check-str-concat-over-line-jumps=no + + +[SPELLING] + +# Limits count of emitted suggestions for spelling mistakes. +max-spelling-suggestions=4 + +# Spelling dictionary name. Available dictionaries: none. To make it work, +# install the python-enchant package. +spelling-dict= + +# List of comma separated words that should not be checked. +spelling-ignore-words= + +# A path to a file that contains the private dictionary; one word per line. +spelling-private-dict-file= + +# Tells whether to store unknown words to the private dictionary (see the +# --spelling-private-dict-file option) instead of raising a message. +spelling-store-unknown-words=no + + +[SIMILARITIES] + +# Ignore comments when computing similarities. +ignore-comments=yes + +# Ignore docstrings when computing similarities. +ignore-docstrings=yes + +# Ignore imports when computing similarities. +ignore-imports=no + +# Minimum lines number of a similarity. +min-similarity-lines=4 + + +[LOGGING] + +# Format style used to check logging format string. `old` means using % +# formatting, `new` is for `{}` formatting,and `fstr` is for f-strings. +logging-format-style=fstr + +# Logging modules to check that the string format arguments are in logging +# function parameter format. +logging-modules=logging + + +[CLASSES] + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp, + __post_init__ + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=cls + + +[DESIGN] + +# Maximum number of arguments for function / method. +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of boolean expressions in an if statement (see R0916). +max-bool-expr=5 + +# Maximum number of branch for function / method body. +max-branches=12 + +# Maximum number of locals for function / method body. +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body. +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[IMPORTS] + +# List of modules that can be imported at any level, not just the top level +# one. +allow-any-import-level= + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules=optparse,tkinter.tix + +# Create a graph of external dependencies in the given file (report RP0402 must +# not be disabled). +ext-import-graph= + +# Create a graph of every (i.e. internal and external) dependencies in the +# given file (report RP0402 must not be disabled). +import-graph= + +# Create a graph of internal dependencies in the given file (report RP0402 must +# not be disabled). +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Couples of modules and preferred modules, separated by a comma. +preferred-modules= + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when being caught. Defaults to +# "BaseException, Exception". +overgeneral-exceptions=BaseException, + Exception + diff --git a/Backend/Summarization/summe/Dockerfile b/Backend/Summarization/summe/Dockerfile new file mode 100644 index 0000000..35127b2 --- /dev/null +++ b/Backend/Summarization/summe/Dockerfile @@ -0,0 +1,21 @@ +FROM python:3.11.4 + +ENV PYTHONUNBUFFERED 1 + +WORKDIR /app + +COPY poetry.lock pyproject.toml ./ +RUN pip install --upgrade pip && \ + pip install poetry && \ + poetry config virtualenvs.create false + +ARG DEV=false +RUN if [ "$DEV" = "true" ] ; then poetry install --with dev ; else poetry install --only main ; fi + +COPY ./app/ ./ +COPY ./ml/model/ ./ml/model/ + +ENV PYTHONPATH "${PYTHONPATH}:/app" + +EXPOSE 8080 +CMD uvicorn main:app --host 0.0.0.0 --port 8080 diff --git a/Backend/Summarization/summe/Makefile b/Backend/Summarization/summe/Makefile new file mode 100644 index 0000000..3f252c6 --- /dev/null +++ b/Backend/Summarization/summe/Makefile @@ -0,0 +1,62 @@ +SHELL := /bin/bash + +# Variables definitions +# ----------------------------------------------------------------------------- + +ifeq ($(TIMEOUT),) +TIMEOUT := 60 +endif + +ifeq ($(MODEL_PATH),) +MODEL_PATH := ./ml/model/ +endif + +ifeq ($(MODEL_NAME_T5),) +MODEL_NAME_T5 := summary_with_news/checkpoint-11000 +endif + +ifeq ($(MODEL_NAME_POLYGLOT),) +MODEL_NAME_POLYGLOT := polyglot-ko_1.3b_news_3ep +endif + +# Target section and Global definitions +# ----------------------------------------------------------------------------- +.PHONY: all clean test install run deploy down + +all: clean test install run deploy down + +test: + poetry run pytest tests -vv --show-capture=all + +install: generate_dot_env + pip install --upgrade pip + pip install poetry + poetry install --with dev + +run: + PYTHONPATH=app/ poetry run uvicorn main:app --reload --host 0.0.0.0 --port 8081 + +deploy: generate_dot_env + docker-compose build + docker-compose up -d + +down: + docker-compose down + +generate_dot_env: + @if [[ ! -e .env ]]; then \ + cp .env.example .env; \ + fi + +clean: + @find . -name '*.pyc' -exec rm -rf {} \; + @find . -name '__pycache__' -exec rm -rf {} \; + @find . -name 'Thumbs.db' -exec rm -rf {} \; + @find . -name '*~' -exec rm -rf {} \; + rm -rf .cache + rm -rf build + rm -rf dist + rm -rf *.egg-info + rm -rf htmlcov + rm -rf .tox/ + rm -rf docs/_build \ No newline at end of file diff --git a/Backend/Summarization/summe/README.md b/Backend/Summarization/summe/README.md new file mode 100644 index 0000000..631f4a1 --- /dev/null +++ b/Backend/Summarization/summe/README.md @@ -0,0 +1,62 @@ +# Summe + +T5 모델과 polyglot 모델을 이용하여 뉴스 기사를 요약해주는 RESTful API 입니다. + +## Requirements + +- Python3.11.0 +- Pip +- Poetry (Python Package Manager) + +## Requirements +실행시 모델이 필요합니다. 모델이 필요하신 경우 [email](mailto:kwak@minseok.me)로 문의 주시기 바랍니다. + +## Installation +### ⚠️ 주의! 아직 `poetry`가 호횐되지 않습니다. +pip install을 이용하여 다음의 패키지를 설치해 주세요. +``` +pip install uvicorn +pip install fastapi +pip install loguru +``` +실행을 위해 다음의 명령어를 이용하여 실행시켜 주세요. +``` +PYTHONPATH=app/ uvicorn main:app --reload --host 0.0.0.0 --port PORT_NUMBER +``` + +## Project structure + + app + | + | # Fast-API stuff + ├── api - web related stuff. + │   └── routes - web routes. + ├── core - application configuration, startup events, logging. + ├── models - pydantic models for this application. + ├── services - logic that is not just crud related. + ├── main-aws-lambda.py - [Optional] FastAPI application for AWS Lambda creation and configuration. + └── main.py - FastAPI application creation and configuration. + | + | # ML stuff + ├── data - where you persist data locally + │   ├── interim - intermediate data that has been transformed. + │   ├── processed - the final, canonical data sets for modeling. + │   └── raw - the original, immutable data dump. + │ + ├── notebooks - Jupyter notebooks. Naming convention is a number (for ordering), + | + ├── ml - modelling source code for use in this project. + │   ├── __init__.py - makes ml a Python module + │   ├── pipeline.py - scripts to orchestrate the whole pipeline + │ │ + │   ├── data - scripts to download or generate data + │   │   └── make_dataset.py + │ │ + │   ├── features - scripts to turn raw data into features for modeling + │   │   └── build_features.py + │ │ + │   └── model - scripts to train models and make predictions + │      ├── predict_model.py + │      └── train_model.py + │ + └── tests - pytest diff --git a/Backend/Summarization/summe/app/__init__.py b/Backend/Summarization/summe/app/__init__.py new file mode 100644 index 0000000..3dc1f76 --- /dev/null +++ b/Backend/Summarization/summe/app/__init__.py @@ -0,0 +1 @@ +__version__ = "0.1.0" diff --git a/Backend/Summarization/summe/app/api/__init__.py b/Backend/Summarization/summe/app/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Backend/Summarization/summe/app/api/routes/__init__.py b/Backend/Summarization/summe/app/api/routes/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Backend/Summarization/summe/app/api/routes/api.py b/Backend/Summarization/summe/app/api/routes/api.py new file mode 100644 index 0000000..a34b37a --- /dev/null +++ b/Backend/Summarization/summe/app/api/routes/api.py @@ -0,0 +1,6 @@ +from fastapi import APIRouter + +from api.routes import predictor + +router = APIRouter() +router.include_router(predictor.router, tags=["predictor"], prefix="/v1") diff --git a/Backend/Summarization/summe/app/api/routes/predictor.py b/Backend/Summarization/summe/app/api/routes/predictor.py new file mode 100644 index 0000000..2a6f67f --- /dev/null +++ b/Backend/Summarization/summe/app/api/routes/predictor.py @@ -0,0 +1,74 @@ +from transformers import pipeline +from fastapi import APIRouter, HTTPException + +from services.predict import MachineLearningModelHandlerT5 as model_T5 +from services.predict import MachineLearningModelHandlerPolyglot as model_polyglot + +from models.prediction import ( + TextDataInput, + SummerizedResponse, + HealthResponse, +) + +router = APIRouter() + + +def get_summerization(model_name, data_point): + if model_name == "t5": + model = model_T5() + elif model_name == "polyglot": + model = model_polyglot() + + return model.predict(data_point, load_wrapper=pipeline, method="predict") + + +def get_model_health(model_name): + if model_name == "t5": + model = model_T5() + elif model_name == "polyglot": + model = model_polyglot() + + return model.get_model_status() + + +@router.post( + "/summerize/{model_name}", + response_model=SummerizedResponse, + name="summerize news", + description="모델을 이용하여 기사를 요약하는 API 입니다. `model_name`에는 `t5`, `polyglot` 중 하나를 선택하시면 됩니다. \ + `num_split`은 t5 모델에서만 사용되며, `options`의 내용은 \ + [link](https://huggingface.co/docs/transformers/v4.30.0/main_classes/text_generation#transformers.GenerationConfig)를 참조하시기 바랍니다. " +) +async def summerize(model_name: str, data_input: TextDataInput): + if not model_name in ["t5", "polyglot"]: + raise HTTPException(status_code=404, detail="'model_name' argument invalid! Type model name. \n Model: t5, polyglot") + + if not data_input: + raise HTTPException(status_code=404, detail="'data_input' argument invalid!") + try: + data_point = data_input.get_all_info() + arr_para, arr_para_sum = get_summerization(model_name, data_point) + + except Exception as err: + raise HTTPException(status_code=500, detail=f"Exception: {err}") + + return SummerizedResponse(arr_split=arr_para, arr_summerized=arr_para_sum) + + +@router.get( + "/summerize/{model_name}/health", + response_model=HealthResponse, + description="모델이 GPU에 로드되어있는지 확인하는 API 입니다. `model_name`에는 `t5`, `polyglot` 중 하나를 선택하시면 됩니다. \ + `load` 옵션을 이용하여 모델을 GPU에 로드시킬 수 있습니다. " +) +async def health_check(model_name: str, load: bool=False): + if not model_name in ["t5", "polyglot"]: + raise HTTPException(status_code=404, detail="'model_name' argument invalid! Type model name. \n Model: t5, polyglot") + + if load: + get_summerization(model_name, {"prompt": "", "contents": "", "options": {}, "num_split": 1}) + + return HealthResponse(loaded=True) + else: + return HealthResponse(loaded=get_model_health(model_name)) + diff --git a/Backend/Summarization/summe/app/core/__init__.py b/Backend/Summarization/summe/app/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Backend/Summarization/summe/app/core/config.py b/Backend/Summarization/summe/app/core/config.py new file mode 100644 index 0000000..0f02d1b --- /dev/null +++ b/Backend/Summarization/summe/app/core/config.py @@ -0,0 +1,31 @@ +import sys +import logging + +from loguru import logger +from starlette.config import Config +from starlette.datastructures import Secret + +from core.logging import InterceptHandler + +config = Config(".env") + +API_PREFIX = "/api" +VERSION = "0.1.0" +DEBUG: bool = config("DEBUG", cast=bool, default=False) +MAX_CONNECTIONS_COUNT: int = config("MAX_CONNECTIONS_COUNT", cast=int, default=10) +MIN_CONNECTIONS_COUNT: int = config("MIN_CONNECTIONS_COUNT", cast=int, default=10) +SECRET_KEY: Secret = config("SECRET_KEY", cast=Secret, default="") + +PROJECT_NAME: str = config("PROJECT_NAME", default="Summe") + +# logging configuration +LOGGING_LEVEL = logging.DEBUG if DEBUG else logging.INFO +logging.basicConfig( + handlers=[InterceptHandler(level=LOGGING_LEVEL)], level=LOGGING_LEVEL +) +logger.configure(handlers=[{"sink": sys.stderr, "level": LOGGING_LEVEL}]) + +MODEL_PATH = config("MODEL_PATH", default="./ml/model/") +MODEL_NAME_T5 = config("MODEL_NAME_T5", default="summary_with_news/checkpoint-11000") +MODEL_NAME_POLYGLOT = config("MODEL_NAME_POLYGLOT", default="summary_with_news/checkpoint-11000") +INPUT_EXAMPLE = config("INPUT_EXAMPLE", default="./ml/model/examples/example.json") diff --git a/Backend/Summarization/summe/app/core/errors.py b/Backend/Summarization/summe/app/core/errors.py new file mode 100644 index 0000000..83dbd94 --- /dev/null +++ b/Backend/Summarization/summe/app/core/errors.py @@ -0,0 +1,6 @@ +class PredictException(BaseException): + ... + + +class ModelLoadException(BaseException): + ... diff --git a/Backend/Summarization/summe/app/core/events.py b/Backend/Summarization/summe/app/core/events.py new file mode 100644 index 0000000..1f75ebd --- /dev/null +++ b/Backend/Summarization/summe/app/core/events.py @@ -0,0 +1,19 @@ +from typing import Callable + +from fastapi import FastAPI + + +def preload_model(): + """ + In order to load model on memory to each worker + """ + from services.predict import MachineLearningModelHandlerScore + + MachineLearningModelHandlerScore.get_model() + + +def create_start_app_handler(app: FastAPI) -> Callable: + def start_app() -> None: + preload_model() + + return start_app diff --git a/Backend/Summarization/summe/app/core/logging.py b/Backend/Summarization/summe/app/core/logging.py new file mode 100644 index 0000000..a22cc55 --- /dev/null +++ b/Backend/Summarization/summe/app/core/logging.py @@ -0,0 +1,9 @@ +import logging + +from loguru import logger + + +class InterceptHandler(logging.Handler): + def emit(self, record: logging.LogRecord) -> None: # pragma: no cover + logger_opt = logger.opt(depth=7, exception=record.exc_info) + logger_opt.log(record.levelname, record.getMessage()) diff --git a/Backend/Summarization/summe/app/core/paginator.py b/Backend/Summarization/summe/app/core/paginator.py new file mode 100644 index 0000000..c3d393c --- /dev/null +++ b/Backend/Summarization/summe/app/core/paginator.py @@ -0,0 +1,35 @@ +def pagenation( + page_number=1, page_size=20, total_count=0, data=None, start_page_as_1=True +): + """Return payload that contains metainformations about + pagination and listing data. + page_number starts with 0 (array like), + if start_page_as_1 defined as True, start with 1. + """ + if start_page_as_1: + if page_number <= 0: + raise Exception( + "Page number must starts > 0.\nCause: start_page_as_1=True and page_number defined as <= 0" + ) + else: + page_number -= 1 + remaining = total_count % page_size + total_pages = ( + total_count // page_size + 1 if remaining else total_count // page_size + ) + begin = page_number * page_size + end = begin + if page_number == total_pages and remaining: + end += remaining + else: + end += page_size + return { + "begin": begin, + "end": end, + "totalPages": total_pages, + "remaining": remaining, + "pageNumber": page_number, + "pageSize": page_size, + "totalCount": total_count, + "listings": data[begin:end], + } diff --git a/Backend/Summarization/summe/app/main.py b/Backend/Summarization/summe/app/main.py new file mode 100644 index 0000000..936b70c --- /dev/null +++ b/Backend/Summarization/summe/app/main.py @@ -0,0 +1,17 @@ +from fastapi import FastAPI + +from api.routes.api import router as api_router +from core.events import create_start_app_handler +from core.config import API_PREFIX, DEBUG, PROJECT_NAME, VERSION + + +def get_application() -> FastAPI: + application = FastAPI(title=PROJECT_NAME, debug=DEBUG, version=VERSION) + application.include_router(api_router, prefix=API_PREFIX) + pre_load = False + if pre_load: + application.add_event_handler("startup", create_start_app_handler(application)) + return application + + +app = get_application() diff --git a/Backend/Summarization/summe/app/models/prediction.py b/Backend/Summarization/summe/app/models/prediction.py new file mode 100644 index 0000000..4aa8ab7 --- /dev/null +++ b/Backend/Summarization/summe/app/models/prediction.py @@ -0,0 +1,61 @@ +import numpy as np +from typing import List, Dict, Union + +from pydantic import BaseModel + + +class MachineLearningResponse(BaseModel): + prediction: float + + +class HealthResponse(BaseModel): + loaded: bool + + +class MachineLearningDataInput(BaseModel): + feature1: float + feature2: float + feature3: float + feature4: float + feature5: float + + def get_np_array(self): + return np.array( + [ + [ + self.feature1, + self.feature2, + self.feature3, + self.feature4, + self.feature5, + ] + ] + ) + +class SummerizedResponse(BaseModel): + arr_split: List + arr_summerized: List + +class TextDataInput(BaseModel): + prompt: str = "아래의 뉴스를 사실에 입각하여 맥락의 내용을 요약해줘." + title: str = "" + contents: str = "" + num_split: int = 5 + options: Dict = { + "max_new_tokens": 256, + "early_stopping": "never", + "do_sample": True, + "eos_token_id": 2, + "no_repeat_ngram_size": 8, + "top_k": 50, + "top_p": 0.98, + } + + def get_all_info(self): + return { + "prompt": self.prompt, + "title": self.title, + "contents": self.contents, + "num_split": self.num_split, + "options": self.options, + } \ No newline at end of file diff --git a/Backend/Summarization/summe/app/services/predict.py b/Backend/Summarization/summe/app/services/predict.py new file mode 100644 index 0000000..f6b7056 --- /dev/null +++ b/Backend/Summarization/summe/app/services/predict.py @@ -0,0 +1,122 @@ +import os + +from loguru import logger + +from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig, LlamaTokenizer +from peft import PeftModel, PeftConfig + +from core.errors import PredictException, ModelLoadException +from core.config import MODEL_NAME_T5, MODEL_NAME_POLYGLOT, MODEL_PATH + +class MachineLearningModelHandler(object): + @classmethod + def get_model(cls, load_wrapper): + if cls.model is None and load_wrapper: + cls.model = cls.load(load_wrapper) + return cls.model + + @classmethod + def get_model_status(cls): + return True if cls.model != None else False + + +class MachineLearningModelHandlerT5(MachineLearningModelHandler): + model = None + + @classmethod + def predict(cls, input, load_wrapper=None, method="predict"): + if cls.model == None: + cls.get_model(load_wrapper) + + n = input["num_split"] + news_split = [x+"다." for x in input["contents"].split("다.") if x] + arr_para = [] + arr_para_sum = [] + + for i in range(0, len(news_split) // n): + arr_para.append("".join(news_split[i * n:i * n + n])) + + clf = cls.get_model(load_wrapper) + if hasattr(clf, method): + for para in arr_para: + news_tokenized = len(clf.tokenizer(para)["input_ids"]) + # arr_para_sum.append(clf(para, min_length=news_tokenized // 2, max_length=news_tokenized // 2 + (news_tokenized // 4))[0]["summary_text"]) + arr_para_sum.append(clf(para, **input["options"],)[0]["summary_text"]) + + return arr_para, arr_para_sum + raise PredictException(f"'{method}' attribute is missing") + + @staticmethod + def load(load_wrapper): + model = None + if MODEL_PATH.endswith("/"): + path = f"{MODEL_PATH}{MODEL_NAME_T5}" + else: + path = f"{MODEL_PATH}/{MODEL_NAME_T5}" + if not os.path.exists(path): + message = f"Machine learning model at {path} not exists!" + logger.error(message) + raise FileNotFoundError(message) + model = load_wrapper("summarization", path) + if not model: + message = f"Model {model} could not load!" + logger.error(message) + raise ModelLoadException(message) + return model + + +class MachineLearningModelHandlerPolyglot(MachineLearningModelHandler): + model = None + tokenizer = None + + prompt = lambda prompt, document: f"### 질문: {prompt}\n\n###맥락: {document}\n\n### 답변:" + + @classmethod + def predict(cls, input, load_wrapper=None, method="predict"): + if cls.model == None: + cls.get_model(load_wrapper) + + x_prompt = cls.prompt(input["prompt"], input["contents"]) + + result = cls.model.generate( + **cls.tokenizer( + x_prompt, + return_tensors='pt', + return_token_type_ids=False + ), + **input["options"], + ) + + arr_para = [x_prompt] + arr_para_sum = [cls.tokenizer.decode(result[0])[len(x_prompt):]] + + return arr_para, arr_para_sum + # raise PredictException(f"'{method}' attribute is missing") + + @classmethod + def get_model(cls, load_wrapper): + if cls.model is None and load_wrapper: + cls.model, cls.tokenizer = cls.load(load_wrapper) + return cls.model, cls.tokenizer + + @staticmethod + def load(load_wrapper): + model = None + if MODEL_PATH.endswith("/"): + path = f"{MODEL_PATH}{MODEL_NAME_POLYGLOT}" + else: + path = f"{MODEL_PATH}/{MODEL_NAME_POLYGLOT}" + if not os.path.exists(path): + message = f"Machine learning model at {path} not exists!" + logger.error(message) + raise FileNotFoundError(message) + config = PeftConfig.from_pretrained(path) + model = AutoModelForCausalLM.from_pretrained(config.base_model_name_or_path) + model = PeftModel.from_pretrained(model, path) + tokenizer = AutoTokenizer.from_pretrained(config.base_model_name_or_path) + + if not model: + message = f"Model {model} could not load!" + logger.error(message) + raise ModelLoadException(message) + return model, tokenizer \ No newline at end of file diff --git a/Backend/Summarization/summe/docker-compose.yml b/Backend/Summarization/summe/docker-compose.yml new file mode 100644 index 0000000..38cf9c5 --- /dev/null +++ b/Backend/Summarization/summe/docker-compose.yml @@ -0,0 +1,16 @@ +version: "3" + +services: + app: + build: + context: . + args: + DEV: "true" + ports: + - "8080:8080" + env_file: + - .env + command: uvicorn main:app --reload --host 0.0.0.0 --port 8080 + volumes: + - ./app:/app/ + - ./ml/model/:/app/ml/model/ \ No newline at end of file diff --git a/Backend/Summarization/summe/ml/__init__.py b/Backend/Summarization/summe/ml/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Backend/Summarization/summe/ml/data/__init__.py b/Backend/Summarization/summe/ml/data/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Backend/Summarization/summe/ml/data/make_dataset.py b/Backend/Summarization/summe/ml/data/make_dataset.py new file mode 100644 index 0000000..ac10eb5 --- /dev/null +++ b/Backend/Summarization/summe/ml/data/make_dataset.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +import click +from pathlib import Path + +from loguru import logger +from dotenv import find_dotenv, load_dotenv + + +def pipeline(): + logger.info("Start making dataset.") + + +@click.command() +@click.argument("input_filepath", default="data/raw", type=click.Path(exists=True)) +@click.argument("output_filepath", default="data/interim", type=click.Path()) +def main(input_filepath, output_filepath): + """Runs data processing scripts to turn raw data from (../raw) into + cleaned data ready to be analyzed (saved in ../processed). + """ + logger.info(f"Read from {input_filepath}, write to {output_filepath}.") + + +if __name__ == "__main__": + + load_dotenv(find_dotenv()) + + # pylint: disable = no-value-for-paramete + main() diff --git a/Backend/Summarization/summe/ml/features/__init__.py b/Backend/Summarization/summe/ml/features/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Backend/Summarization/summe/ml/features/build_features.py b/Backend/Summarization/summe/ml/features/build_features.py new file mode 100644 index 0000000..e3f928b --- /dev/null +++ b/Backend/Summarization/summe/ml/features/build_features.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +import click +from pathlib import Path + +from loguru import logger +from dotenv import find_dotenv, load_dotenv + + +def pipeline(): + logger.info("Start building features.") + + +@click.command() +@click.argument("input_filepath", default="data/interim", type=click.Path(exists=True)) +@click.argument("output_filepath", default="data/processed", type=click.Path()) +def main(input_filepath, output_filepath): + """Runs data processing scripts to turn cleaned data from (../interim) into + training data ready to be trained (saved in ../processed). + """ + logger.info(f"Read from {input_filepath}, write to {output_filepath}.") + + +if __name__ == "__main__": + + load_dotenv(find_dotenv()) + + # pylint: disable = no-value-for-paramete + main() diff --git a/Backend/Summarization/summe/ml/model/.gitkeep b/Backend/Summarization/summe/ml/model/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Backend/Summarization/summe/ml/model/examples/example.json b/Backend/Summarization/summe/ml/model/examples/example.json new file mode 100644 index 0000000..3ea0af6 --- /dev/null +++ b/Backend/Summarization/summe/ml/model/examples/example.json @@ -0,0 +1,7 @@ +{ + "feature1": 1.0, + "feature2": 1.1, + "feature3": 1.2, + "feature4": 1.3, + "feature5": 1.4 +} \ No newline at end of file diff --git a/Backend/Summarization/summe/notebooks/.gitkeep b/Backend/Summarization/summe/notebooks/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/Backend/Summarization/summe/poetry.lock b/Backend/Summarization/summe/poetry.lock new file mode 100644 index 0000000..a1e10eb --- /dev/null +++ b/Backend/Summarization/summe/poetry.lock @@ -0,0 +1,1395 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "3.7.1" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "anyio-3.7.1-py3-none-any.whl", hash = "sha256:91dee416e570e92c64041bd18b900d1d6fa78dff7048769ce5ac5ddad004fbb5"}, + {file = "anyio-3.7.1.tar.gz", hash = "sha256:44a3c9aba0f5defa43261a8b3efb97891f2bd7d804e0e1f56419befa1adfc780"}, +] + +[package.dependencies] +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme (>=1.2.2)", "sphinxcontrib-jquery"] +test = ["anyio[trio]", "coverage[toml] (>=4.5)", "hypothesis (>=4.0)", "mock (>=4)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (<0.22)"] + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] + +[[package]] +name = "astroid" +version = "2.15.6" +description = "An abstract syntax tree for Python with inference support." +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "astroid-2.15.6-py3-none-any.whl", hash = "sha256:389656ca57b6108f939cf5d2f9a2a825a3be50ba9d589670f393236e0a03b91c"}, + {file = "astroid-2.15.6.tar.gz", hash = "sha256:903f024859b7c7687d7a7f3a3f73b17301f8e42dfd9cc9df9d4418172d3e2dbd"}, +] + +[package.dependencies] +lazy-object-proxy = ">=1.4.0" +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +wrapt = [ + {version = ">=1.11,<2", markers = "python_version < \"3.11\""}, + {version = ">=1.14,<2", markers = "python_version >= \"3.11\""}, +] + +[[package]] +name = "asttokens" +version = "2.2.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, + {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +test = ["astroid", "pytest"] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "autopep8" +version = "2.0.2" +description = "A tool that automatically formats Python code to conform to the PEP 8 style guide" +optional = false +python-versions = ">=3.6" +files = [ + {file = "autopep8-2.0.2-py2.py3-none-any.whl", hash = "sha256:86e9303b5e5c8160872b2f5ef611161b2893e9bfe8ccc7e2f76385947d57a2f1"}, + {file = "autopep8-2.0.2.tar.gz", hash = "sha256:f9849cdd62108cb739dbcdbfb7fdcc9a30d1b63c4cc3e1c1f893b5360941b61c"}, +] + +[package.dependencies] +pycodestyle = ">=2.10.0" +tomli = {version = "*", markers = "python_version < \"3.11\""} + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +optional = false +python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] + +[[package]] +name = "black" +version = "19.10b0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.6" +files = [ + {file = "black-19.10b0-py36-none-any.whl", hash = "sha256:1b30e59be925fafc1ee4565e5e08abef6b03fe455102883820fe5ee2e4734e0b"}, + {file = "black-19.10b0.tar.gz", hash = "sha256:c2edb73a08e9e0e6f65a0e6af18b059b8b1cdd5bef997d7a0b181df93dc81539"}, +] + +[package.dependencies] +appdirs = "*" +attrs = ">=18.1.0" +click = ">=6.5" +pathspec = ">=0.6,<1" +regex = "*" +toml = ">=0.9.4" +typed-ast = ">=1.4.0" + +[package.extras] +d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, + {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "click" +version = "8.1.5" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.5-py3-none-any.whl", hash = "sha256:e576aa487d679441d7d30abb87e1b43d24fc53bffb8758443b1a9e1cee504548"}, + {file = "click-8.1.5.tar.gz", hash = "sha256:4be4b1af8d665c6d942909916d31a213a106800c47d0eeba73d34da3cbc11367"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "dill" +version = "0.3.6" +description = "serialize all of python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, + {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, +] + +[package.extras] +graph = ["objgraph (>=1.7.2)"] + +[[package]] +name = "exceptiongroup" +version = "1.1.2" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, + {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "1.2.0" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = "*" +files = [ + {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, + {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, +] + +[package.extras] +tests = ["asttokens", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastapi" +version = "0.99.1" +description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastapi-0.99.1-py3-none-any.whl", hash = "sha256:976df7bab51ac7beda9f68c4513b8c4490b5c1135c72aafd0a5ee4023ec5282e"}, + {file = "fastapi-0.99.1.tar.gz", hash = "sha256:ac78f717cd80d657bd183f94d33b9bda84aa376a46a9dab513586b8eef1dc6fc"}, +] + +[package.dependencies] +pydantic = ">=1.7.4,<1.8 || >1.8,<1.8.1 || >1.8.1,<2.0.0" +starlette = ">=0.27.0,<0.28.0" +typing-extensions = ">=4.5.0" + +[package.extras] +all = ["email-validator (>=1.1.1)", "httpx (>=0.23.0)", "itsdangerous (>=1.1.0)", "jinja2 (>=2.11.2)", "orjson (>=3.2.1)", "python-multipart (>=0.0.5)", "pyyaml (>=5.3.1)", "ujson (>=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0)", "uvicorn[standard] (>=0.12.0)"] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipdb" +version = "0.13.13" +description = "IPython-enabled pdb" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "ipdb-0.13.13-py3-none-any.whl", hash = "sha256:45529994741c4ab6d2388bfa5d7b725c2cf7fe9deffabdb8a6113aa5ed449ed4"}, + {file = "ipdb-0.13.13.tar.gz", hash = "sha256:e3ac6018ef05126d442af680aad863006ec19d02290561ac88b8b1c0b0cfc726"}, +] + +[package.dependencies] +decorator = {version = "*", markers = "python_version > \"3.6\""} +ipython = {version = ">=7.31.1", markers = "python_version > \"3.6\""} +tomli = {version = "*", markers = "python_version > \"3.6\" and python_version < \"3.11\""} + +[[package]] +name = "ipython" +version = "8.14.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ipython-8.14.0-py3-none-any.whl", hash = "sha256:248aca623f5c99a6635bc3857677b7320b9b8039f99f070ee0d20a5ca5a8e6bf"}, + {file = "ipython-8.14.0.tar.gz", hash = "sha256:1d197b907b6ba441b692c48cf2a3a2de280dc0ac91a3405b39349a50272ca0a1"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] + +[[package]] +name = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "jedi" +version = "0.18.2" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.18.2-py2.py3-none-any.whl", hash = "sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e"}, + {file = "jedi-0.18.2.tar.gz", hash = "sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612"}, +] + +[package.dependencies] +parso = ">=0.8.0,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["Django (<3.1)", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "joblib" +version = "1.3.1" +description = "Lightweight pipelining with Python functions" +optional = false +python-versions = ">=3.7" +files = [ + {file = "joblib-1.3.1-py3-none-any.whl", hash = "sha256:89cf0529520e01b3de7ac7b74a8102c90d16d54c64b5dd98cafcd14307fdf915"}, + {file = "joblib-1.3.1.tar.gz", hash = "sha256:1f937906df65329ba98013dc9692fe22a4c5e4a648112de500508b18a21b41e3"}, +] + +[[package]] +name = "lazy-object-proxy" +version = "1.9.0" +description = "A fast and thorough lazy object proxy." +optional = false +python-versions = ">=3.7" +files = [ + {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, + {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, + {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, + {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, + {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, + {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, +] + +[[package]] +name = "loguru" +version = "0.7.0" +description = "Python logging made (stupidly) simple" +optional = false +python-versions = ">=3.5" +files = [ + {file = "loguru-0.7.0-py3-none-any.whl", hash = "sha256:b93aa30099fa6860d4727f1b81f8718e965bb96253fa190fab2077aaad6d15d3"}, + {file = "loguru-0.7.0.tar.gz", hash = "sha256:1612053ced6ae84d7959dd7d5e431a0532642237ec21f7fd83ac73fe539e03e1"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} +win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} + +[package.extras] +dev = ["Sphinx (==5.3.0)", "colorama (==0.4.5)", "colorama (==0.4.6)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v0.990)", "pre-commit (==3.2.1)", "pytest (==6.1.2)", "pytest (==7.2.1)", "pytest-cov (==2.12.1)", "pytest-cov (==4.0.0)", "pytest-mypy-plugins (==1.10.1)", "pytest-mypy-plugins (==1.9.3)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.2.0)", "tox (==3.27.1)", "tox (==4.4.6)"] + +[[package]] +name = "mangum" +version = "0.17.0" +description = "AWS Lambda support for ASGI applications" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mangum-0.17.0-py3-none-any.whl", hash = "sha256:f00be705605bc4793958df62e4d249abf58d254c39d90bb410d069570206f4a2"}, + {file = "mangum-0.17.0.tar.gz", hash = "sha256:5b4e26375e12eed051687670466d17968f8b74beecaca432edd4eb4127f78509"}, +] + +[package.dependencies] +typing-extensions = "*" + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "numpy" +version = "1.25.1" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-1.25.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77d339465dff3eb33c701430bcb9c325b60354698340229e1dff97745e6b3efa"}, + {file = "numpy-1.25.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d736b75c3f2cb96843a5c7f8d8ccc414768d34b0a75f466c05f3a739b406f10b"}, + {file = "numpy-1.25.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a90725800caeaa160732d6b31f3f843ebd45d6b5f3eec9e8cc287e30f2805bf"}, + {file = "numpy-1.25.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c6c9261d21e617c6dc5eacba35cb68ec36bb72adcff0dee63f8fbc899362588"}, + {file = "numpy-1.25.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:0def91f8af6ec4bb94c370e38c575855bf1d0be8a8fbfba42ef9c073faf2cf19"}, + {file = "numpy-1.25.1-cp310-cp310-win32.whl", hash = "sha256:fd67b306320dcadea700a8f79b9e671e607f8696e98ec255915c0c6d6b818503"}, + {file = "numpy-1.25.1-cp310-cp310-win_amd64.whl", hash = "sha256:c1516db588987450b85595586605742879e50dcce923e8973f79529651545b57"}, + {file = "numpy-1.25.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6b82655dd8efeea69dbf85d00fca40013d7f503212bc5259056244961268b66e"}, + {file = "numpy-1.25.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e8f6049c4878cb16960fbbfb22105e49d13d752d4d8371b55110941fb3b17800"}, + {file = "numpy-1.25.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41a56b70e8139884eccb2f733c2f7378af06c82304959e174f8e7370af112e09"}, + {file = "numpy-1.25.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5154b1a25ec796b1aee12ac1b22f414f94752c5f94832f14d8d6c9ac40bcca6"}, + {file = "numpy-1.25.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:38eb6548bb91c421261b4805dc44def9ca1a6eef6444ce35ad1669c0f1a3fc5d"}, + {file = "numpy-1.25.1-cp311-cp311-win32.whl", hash = "sha256:791f409064d0a69dd20579345d852c59822c6aa087f23b07b1b4e28ff5880fcb"}, + {file = "numpy-1.25.1-cp311-cp311-win_amd64.whl", hash = "sha256:c40571fe966393b212689aa17e32ed905924120737194b5d5c1b20b9ed0fb171"}, + {file = "numpy-1.25.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3d7abcdd85aea3e6cdddb59af2350c7ab1ed764397f8eec97a038ad244d2d105"}, + {file = "numpy-1.25.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1a180429394f81c7933634ae49b37b472d343cccb5bb0c4a575ac8bbc433722f"}, + {file = "numpy-1.25.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d412c1697c3853c6fc3cb9751b4915859c7afe6a277c2bf00acf287d56c4e625"}, + {file = "numpy-1.25.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20e1266411120a4f16fad8efa8e0454d21d00b8c7cee5b5ccad7565d95eb42dd"}, + {file = "numpy-1.25.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f76aebc3358ade9eacf9bc2bb8ae589863a4f911611694103af05346637df1b7"}, + {file = "numpy-1.25.1-cp39-cp39-win32.whl", hash = "sha256:247d3ffdd7775bdf191f848be8d49100495114c82c2bd134e8d5d075fb386a1c"}, + {file = "numpy-1.25.1-cp39-cp39-win_amd64.whl", hash = "sha256:1d5d3c68e443c90b38fdf8ef40e60e2538a27548b39b12b73132456847f4b631"}, + {file = "numpy-1.25.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:35a9527c977b924042170a0887de727cd84ff179e478481404c5dc66b4170009"}, + {file = "numpy-1.25.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d3fe3dd0506a28493d82dc3cf254be8cd0d26f4008a417385cbf1ae95b54004"}, + {file = "numpy-1.25.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:012097b5b0d00a11070e8f2e261128c44157a8689f7dedcf35576e525893f4fe"}, + {file = "numpy-1.25.1.tar.gz", hash = "sha256:9a3a9f3a61480cc086117b426a8bd86869c213fc4072e606f01c4e4b66eb92bf"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, + {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, +] + +[[package]] +name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +optional = false +python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] + +[[package]] +name = "platformdirs" +version = "3.9.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.9.1-py3-none-any.whl", hash = "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f"}, + {file = "platformdirs-3.9.1.tar.gz", hash = "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421"}, +] + +[package.extras] +docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.2.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, + {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.39" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, + {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pycodestyle" +version = "2.10.0" +description = "Python style guide checker" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, + {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, +] + +[[package]] +name = "pydantic" +version = "1.10.11" +description = "Data validation and settings management using python type hints" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"}, + {file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"}, + {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"}, + {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"}, + {file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"}, + {file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"}, + {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"}, + {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"}, + {file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"}, + {file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"}, + {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"}, + {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"}, + {file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"}, + {file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"}, + {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"}, + {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"}, + {file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"}, + {file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"}, + {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"}, + {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"}, + {file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"}, + {file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"}, + {file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"}, +] + +[package.dependencies] +typing-extensions = ">=4.2.0" + +[package.extras] +dotenv = ["python-dotenv (>=0.10.4)"] +email = ["email-validator (>=1.0.3)"] + +[[package]] +name = "pygments" +version = "2.15.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, + {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[package]] +name = "pylint" +version = "2.17.4" +description = "python code static checker" +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "pylint-2.17.4-py3-none-any.whl", hash = "sha256:7a1145fb08c251bdb5cca11739722ce64a63db479283d10ce718b2460e54123c"}, + {file = "pylint-2.17.4.tar.gz", hash = "sha256:5dcf1d9e19f41f38e4e85d10f511e5b9c35e1aa74251bf95cdd8cb23584e2db1"}, +] + +[package.dependencies] +astroid = ">=2.15.4,<=2.17.0-dev0" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +dill = [ + {version = ">=0.2", markers = "python_version < \"3.11\""}, + {version = ">=0.3.6", markers = "python_version >= \"3.11\""}, +] +isort = ">=4.2.5,<6" +mccabe = ">=0.6,<0.8" +platformdirs = ">=2.2.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +tomlkit = ">=0.10.1" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +spelling = ["pyenchant (>=3.2,<4.0)"] +testutils = ["gitpython (>3)"] + +[[package]] +name = "pytest" +version = "7.4.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.0-py3-none-any.whl", hash = "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32"}, + {file = "pytest-7.4.0.tar.gz", hash = "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "regex" +version = "2023.6.3" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.6" +files = [ + {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"}, + {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"}, + {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"}, + {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"}, + {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"}, + {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"}, + {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"}, + {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"}, + {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"}, + {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"}, + {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"}, + {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"}, + {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"}, + {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"}, + {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"}, + {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"}, + {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"}, + {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"}, + {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"}, + {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"}, + {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"}, + {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"}, + {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"}, + {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"}, + {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, + {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"}, + {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"}, + {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"}, + {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"}, + {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"}, + {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"}, + {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"}, + {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"}, + {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"}, + {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "scikit-learn" +version = "1.3.0" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.8" +files = [ + {file = "scikit-learn-1.3.0.tar.gz", hash = "sha256:8be549886f5eda46436b6e555b0e4873b4f10aa21c07df45c4bc1735afbccd7a"}, + {file = "scikit_learn-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981287869e576d42c682cf7ca96af0c6ac544ed9316328fd0d9292795c742cf5"}, + {file = "scikit_learn-1.3.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:436aaaae2c916ad16631142488e4c82f4296af2404f480e031d866863425d2a2"}, + {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e28d8fa47a0b30ae1bd7a079519dd852764e31708a7804da6cb6f8b36e3630"}, + {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80c08834a473d08a204d966982a62e11c976228d306a2648c575e3ead12111"}, + {file = "scikit_learn-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:552fd1b6ee22900cf1780d7386a554bb96949e9a359999177cf30211e6b20df6"}, + {file = "scikit_learn-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79970a6d759eb00a62266a31e2637d07d2d28446fca8079cf9afa7c07b0427f8"}, + {file = "scikit_learn-1.3.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:850a00b559e636b23901aabbe79b73dc604b4e4248ba9e2d6e72f95063765603"}, + {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee04835fb016e8062ee9fe9074aef9b82e430504e420bff51e3e5fffe72750ca"}, + {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d953531f5d9f00c90c34fa3b7d7cfb43ecff4c605dac9e4255a20b114a27369"}, + {file = "scikit_learn-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:151ac2bf65ccf363664a689b8beafc9e6aae36263db114b4ca06fbbbf827444a"}, + {file = "scikit_learn-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a885a9edc9c0a341cab27ec4f8a6c58b35f3d449c9d2503a6fd23e06bbd4f6a"}, + {file = "scikit_learn-1.3.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:9877af9c6d1b15486e18a94101b742e9d0d2f343d35a634e337411ddb57783f3"}, + {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c470f53cea065ff3d588050955c492793bb50c19a92923490d18fcb637f6383a"}, + {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6e2d7389542eae01077a1ee0318c4fec20c66c957f45c7aac0c6eb0fe3c612"}, + {file = "scikit_learn-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:3a11936adbc379a6061ea32fa03338d4ca7248d86dd507c81e13af428a5bc1db"}, + {file = "scikit_learn-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:998d38fcec96584deee1e79cd127469b3ad6fefd1ea6c2dfc54e8db367eb396b"}, + {file = "scikit_learn-1.3.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ded35e810438a527e17623ac6deae3b360134345b7c598175ab7741720d7ffa7"}, + {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8102d5036e28d08ab47166b48c8d5e5810704daecf3a476a4282d562be9a28"}, + {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7617164951c422747e7c32be4afa15d75ad8044f42e7d70d3e2e0429a50e6718"}, + {file = "scikit_learn-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d54fb9e6038284548072df22fd34777e434153f7ffac72c8596f2d6987110dd"}, +] + +[package.dependencies] +joblib = ">=1.1.1" +numpy = ">=1.17.3" +scipy = ">=1.5.0" +threadpoolctl = ">=2.0.0" + +[package.extras] +benchmark = ["matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "pandas (>=1.0.5)"] +docs = ["Pillow (>=7.1.2)", "matplotlib (>=3.1.3)", "memory-profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)", "sphinx (>=6.0.0)", "sphinx-copybutton (>=0.5.2)", "sphinx-gallery (>=0.10.1)", "sphinx-prompt (>=1.3.0)", "sphinxext-opengraph (>=0.4.2)"] +examples = ["matplotlib (>=3.1.3)", "pandas (>=1.0.5)", "plotly (>=5.14.0)", "pooch (>=1.6.0)", "scikit-image (>=0.16.2)", "seaborn (>=0.9.0)"] +tests = ["black (>=23.3.0)", "matplotlib (>=3.1.3)", "mypy (>=1.3)", "numpydoc (>=1.2.0)", "pandas (>=1.0.5)", "pooch (>=1.6.0)", "pyamg (>=4.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.0.272)", "scikit-image (>=0.16.2)"] + +[[package]] +name = "scipy" +version = "1.9.3" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, + {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, + {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, + {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, + {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, + {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, + {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, + {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, + {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, + {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, + {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, + {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, + {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, + {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, + {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, + {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, + {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, + {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, + {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, + {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, + {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, +] + +[package.dependencies] +numpy = ">=1.18.5,<1.26.0" + +[package.extras] +dev = ["flake8", "mypy", "pycodestyle", "typing_extensions"] +doc = ["matplotlib (>2)", "numpydoc", "pydata-sphinx-theme (==0.9.0)", "sphinx (!=4.1.0)", "sphinx-panels (>=0.5.2)", "sphinx-tabs"] +test = ["asv", "gmpy2", "mpmath", "pytest", "pytest-cov", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "stack-data" +version = "0.6.2" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, + {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "starlette" +version = "0.27.0" +description = "The little ASGI library that shines." +optional = false +python-versions = ">=3.7" +files = [ + {file = "starlette-0.27.0-py3-none-any.whl", hash = "sha256:918416370e846586541235ccd38a474c08b80443ed31c578a418e2209b3eef91"}, + {file = "starlette-0.27.0.tar.gz", hash = "sha256:6a6b0d042acb8d469a01eba54e9cda6cbd24ac602c4cd016723117d6a7e73b75"}, +] + +[package.dependencies] +anyio = ">=3.4.0,<5" +typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\""} + +[package.extras] +full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyaml"] + +[[package]] +name = "threadpoolctl" +version = "3.2.0" +description = "threadpoolctl" +optional = false +python-versions = ">=3.8" +files = [ + {file = "threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032"}, + {file = "threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355"}, +] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tomlkit" +version = "0.11.8" +description = "Style preserving TOML library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, + {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, +] + +[[package]] +name = "traitlets" +version = "5.9.0" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.7" +files = [ + {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, + {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] + +[[package]] +name = "typed-ast" +version = "1.5.5" +description = "a fork of Python 2 and 3 ast modules with type comment support" +optional = false +python-versions = ">=3.6" +files = [ + {file = "typed_ast-1.5.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bc1efe0ce3ffb74784e06460f01a223ac1f6ab31c6bc0376a21184bf5aabe3b"}, + {file = "typed_ast-1.5.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5f7a8c46a8b333f71abd61d7ab9255440d4a588f34a21f126bbfc95f6049e686"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:597fc66b4162f959ee6a96b978c0435bd63791e31e4f410622d19f1686d5e769"}, + {file = "typed_ast-1.5.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d41b7a686ce653e06c2609075d397ebd5b969d821b9797d029fccd71fdec8e04"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5fe83a9a44c4ce67c796a1b466c270c1272e176603d5e06f6afbc101a572859d"}, + {file = "typed_ast-1.5.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d5c0c112a74c0e5db2c75882a0adf3133adedcdbfd8cf7c9d6ed77365ab90a1d"}, + {file = "typed_ast-1.5.5-cp310-cp310-win_amd64.whl", hash = "sha256:e1a976ed4cc2d71bb073e1b2a250892a6e968ff02aa14c1f40eba4f365ffec02"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c631da9710271cb67b08bd3f3813b7af7f4c69c319b75475436fcab8c3d21bee"}, + {file = "typed_ast-1.5.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b445c2abfecab89a932b20bd8261488d574591173d07827c1eda32c457358b18"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc95ffaaab2be3b25eb938779e43f513e0e538a84dd14a5d844b8f2932593d88"}, + {file = "typed_ast-1.5.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61443214d9b4c660dcf4b5307f15c12cb30bdfe9588ce6158f4a005baeb167b2"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6eb936d107e4d474940469e8ec5b380c9b329b5f08b78282d46baeebd3692dc9"}, + {file = "typed_ast-1.5.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e48bf27022897577d8479eaed64701ecaf0467182448bd95759883300ca818c8"}, + {file = "typed_ast-1.5.5-cp311-cp311-win_amd64.whl", hash = "sha256:83509f9324011c9a39faaef0922c6f720f9623afe3fe220b6d0b15638247206b"}, + {file = "typed_ast-1.5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:44f214394fc1af23ca6d4e9e744804d890045d1643dd7e8229951e0ef39429b5"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:118c1ce46ce58fda78503eae14b7664163aa735b620b64b5b725453696f2a35c"}, + {file = "typed_ast-1.5.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be4919b808efa61101456e87f2d4c75b228f4e52618621c77f1ddcaae15904fa"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:fc2b8c4e1bc5cd96c1a823a885e6b158f8451cf6f5530e1829390b4d27d0807f"}, + {file = "typed_ast-1.5.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:16f7313e0a08c7de57f2998c85e2a69a642e97cb32f87eb65fbfe88381a5e44d"}, + {file = "typed_ast-1.5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:2b946ef8c04f77230489f75b4b5a4a6f24c078be4aed241cfabe9cbf4156e7e5"}, + {file = "typed_ast-1.5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2188bc33d85951ea4ddad55d2b35598b2709d122c11c75cffd529fbc9965508e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0635900d16ae133cab3b26c607586131269f88266954eb04ec31535c9a12ef1e"}, + {file = "typed_ast-1.5.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:57bfc3cf35a0f2fdf0a88a3044aafaec1d2f24d8ae8cd87c4f58d615fb5b6311"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:fe58ef6a764de7b4b36edfc8592641f56e69b7163bba9f9c8089838ee596bfb2"}, + {file = "typed_ast-1.5.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d09d930c2d1d621f717bb217bf1fe2584616febb5138d9b3e8cdd26506c3f6d4"}, + {file = "typed_ast-1.5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d40c10326893ecab8a80a53039164a224984339b2c32a6baf55ecbd5b1df6431"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd946abf3c31fb50eee07451a6aedbfff912fcd13cf357363f5b4e834cc5e71a"}, + {file = "typed_ast-1.5.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ed4a1a42df8a3dfb6b40c3d2de109e935949f2f66b19703eafade03173f8f437"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:045f9930a1550d9352464e5149710d56a2aed23a2ffe78946478f7b5416f1ede"}, + {file = "typed_ast-1.5.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:381eed9c95484ceef5ced626355fdc0765ab51d8553fec08661dce654a935db4"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bfd39a41c0ef6f31684daff53befddae608f9daf6957140228a08e51f312d7e6"}, + {file = "typed_ast-1.5.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8c524eb3024edcc04e288db9541fe1f438f82d281e591c548903d5b77ad1ddd4"}, + {file = "typed_ast-1.5.5-cp38-cp38-win_amd64.whl", hash = "sha256:7f58fabdde8dcbe764cef5e1a7fcb440f2463c1bbbec1cf2a86ca7bc1f95184b"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:042eb665ff6bf020dd2243307d11ed626306b82812aba21836096d229fdc6a10"}, + {file = "typed_ast-1.5.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:622e4a006472b05cf6ef7f9f2636edc51bda670b7bbffa18d26b255269d3d814"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1efebbbf4604ad1283e963e8915daa240cb4bf5067053cf2f0baadc4d4fb51b8"}, + {file = "typed_ast-1.5.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0aefdd66f1784c58f65b502b6cf8b121544680456d1cebbd300c2c813899274"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:48074261a842acf825af1968cd912f6f21357316080ebaca5f19abbb11690c8a"}, + {file = "typed_ast-1.5.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:429ae404f69dc94b9361bb62291885894b7c6fb4640d561179548c849f8492ba"}, + {file = "typed_ast-1.5.5-cp39-cp39-win_amd64.whl", hash = "sha256:335f22ccb244da2b5c296e6f96b06ee9bed46526db0de38d2f0e5a6597b81155"}, + {file = "typed_ast-1.5.5.tar.gz", hash = "sha256:94282f7a354f36ef5dbce0ef3467ebf6a258e370ab33d5b40c249fa996e590dd"}, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, + {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, +] + +[[package]] +name = "urllib3" +version = "2.0.3" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.3-py3-none-any.whl", hash = "sha256:48e7fafa40319d358848e1bc6809b208340fafe2096f1725d05d67443d0483d1"}, + {file = "urllib3-2.0.3.tar.gz", hash = "sha256:bee28b5e56addb8226c96f7f13ac28cb4c301dd5ea8a6ca179c0b9835e032825"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "uvicorn" +version = "0.22.0" +description = "The lightning-fast ASGI server." +optional = false +python-versions = ">=3.7" +files = [ + {file = "uvicorn-0.22.0-py3-none-any.whl", hash = "sha256:e9434d3bbf05f310e762147f769c9f21235ee118ba2d2bf1155a7196448bd996"}, + {file = "uvicorn-0.22.0.tar.gz", hash = "sha256:79277ae03db57ce7d9aa0567830bbb51d7a612f54d6e1e3e92da3ef24c2c8ed8"}, +] + +[package.dependencies] +click = ">=7.0" +h11 = ">=0.8" + +[package.extras] +standard = ["colorama (>=0.4)", "httptools (>=0.5.0)", "python-dotenv (>=0.13)", "pyyaml (>=5.1)", "uvloop (>=0.14.0,!=0.15.0,!=0.15.1)", "watchfiles (>=0.13)", "websockets (>=10.4)"] + +[[package]] +name = "wcwidth" +version = "0.2.6" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, + {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, +] + +[[package]] +name = "win32-setctime" +version = "1.1.0" +description = "A small Python utility to set file creation time on Windows" +optional = false +python-versions = ">=3.5" +files = [ + {file = "win32_setctime-1.1.0-py3-none-any.whl", hash = "sha256:231db239e959c2fe7eb1d7dc129f11172354f98361c4fa2d6d2d7e278baa8aad"}, + {file = "win32_setctime-1.1.0.tar.gz", hash = "sha256:15cf5750465118d6929ae4de4eb46e8edae9a5634350c01ba582df868e932cb2"}, +] + +[package.extras] +dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] + +[[package]] +name = "wrapt" +version = "1.15.0" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, + {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, + {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, + {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, + {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, + {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, + {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, + {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, + {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, + {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, + {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, + {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, + {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, + {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, + {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, + {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, + {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, + {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, + {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, + {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, + {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, + {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, + {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, + {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, + {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, + {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, + {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, + {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, + {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, + {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, + {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, + {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, + {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, + {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, + {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, + {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, + {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, + {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.9" +content-hash = "234616ac4bc6e23d565319df2d906aa4252b554bf285afb377e534c049e7e93b" diff --git a/Backend/Summarization/summe/pyproject.toml b/Backend/Summarization/summe/pyproject.toml new file mode 100644 index 0000000..b0a3617 --- /dev/null +++ b/Backend/Summarization/summe/pyproject.toml @@ -0,0 +1,47 @@ +[tool.poetry] +name = "Summe" +version = "0.1.0" +description = "Summerize text. " +authors = ["Minseok Kwak (kwak@minseok.me)"] + +[tool.poetry.dependencies] +python = "^3.9" +fastapi = "^0.99.0" +uvicorn = "0.22.0" +pydantic = "^1.3" +requests = "^2.22.0" +loguru = "^0.7.0" +joblib = "^1.2.0" +scikit-learn = "^1.2.0" + +[tool.poetry.group.dev.dependencies] +pytest = "^7.2" +black = {version = "^19.10b0", allow-prereleases = true} +autopep8 = "^2.0.0" +ipdb = "^0.13.0" +pylint = "^2.15.8" + +[tool.poetry.group.aws] +optional = true + +[tool.poetry.group.aws.dependencies] +mangum = "^0.17.0" + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" + +[tool.black] +line-length = 88 +target-version = ['py39', 'py310', 'py311'] +include = '\.pyi?$' +exclude = ''' +/( + \.toml + |\.sh + |\.git + |\.ini + |Dockerfile + |Jenkinfile +)/ +''' \ No newline at end of file diff --git a/Backend/Summarization/summe/tests/__init__.py b/Backend/Summarization/summe/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Backend/Summarization/summe/tests/test_pagination_behavior.py b/Backend/Summarization/summe/tests/test_pagination_behavior.py new file mode 100644 index 0000000..ce80f13 --- /dev/null +++ b/Backend/Summarization/summe/tests/test_pagination_behavior.py @@ -0,0 +1,45 @@ +import pytest +from app.core.paginator import pagenation + +""" +In order to test behavior of pagenation function +""" + + +def test_pagenation_400_initial_default(): + + d = pagenation(1, 20, 400, list(range(400))) + print(d["listings"]) + print(list(range(20))) + assert d["listings"] == list(range(0, 20)) + + +def test_pagenation_400_10th_page(): + + d = pagenation(10, 20, 400, list(range(400))) + print(d["listings"]) + print(list(range(180, 200))) + assert d["listings"] == list(range(180, 200)) + + +def test_pagenation_400_start_0(): + + d = pagenation(19, 20, 400, list(range(400)), start_page_as_1=False) + print(d["listings"]) + print(list(range(380, 400))) + assert d["listings"] == list(range(380, 400)) + + +def test_pagenation_400_start_1(): + + d = pagenation(20, 20, 400, list(range(400))) + print(d["listings"]) + print(list(range(380, 400))) + assert d["listings"] == list(range(380, 400)) + + +def test_pagenation_400_set_start_1_equals_True_and_init_as_pagenumber_as_0(): + """Exception case + """ + with pytest.raises(Exception, match=r".* starts > 0. *"): + d = pagenation(0, 20, 400, list(range(400))) From 1999885f6b3d684aefae60e57febe44ebd3a4cdd Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Sun, 23 Jul 2023 15:15:22 +0900 Subject: [PATCH 30/63] [Docs] Add docstring and clean codes - Add docstring in routes. - Remove examples created from cookiecutter. --- .../summe/app/api/routes/predictor.py | 63 +++++++++++++++++-- .../Summarization/summe/app/core/config.py | 1 + .../summe/app/models/prediction.py | 21 +------ 3 files changed, 60 insertions(+), 25 deletions(-) diff --git a/Backend/Summarization/summe/app/api/routes/predictor.py b/Backend/Summarization/summe/app/api/routes/predictor.py index 2a6f67f..a6fdbe5 100644 --- a/Backend/Summarization/summe/app/api/routes/predictor.py +++ b/Backend/Summarization/summe/app/api/routes/predictor.py @@ -4,6 +4,8 @@ from services.predict import MachineLearningModelHandlerT5 as model_T5 from services.predict import MachineLearningModelHandlerPolyglot as model_polyglot +from typing import Tuple + from models.prediction import ( TextDataInput, SummerizedResponse, @@ -13,7 +15,16 @@ router = APIRouter() -def get_summerization(model_name, data_point): +def get_summerization(model_name: str, data_point: TextDataInput) -> Tuple: + """선택된 모델과 입력값을 이용하여 결과를 반환하는 함수. + + Args: + model_name (str): 모델의 이름. + data_point (TextDataInput): HTTP Request로 받은 정보. + + Returns: + Tuple: 모델의 사용된 구문과 결과. + """ if model_name == "t5": model = model_T5() elif model_name == "polyglot": @@ -22,7 +33,16 @@ def get_summerization(model_name, data_point): return model.predict(data_point, load_wrapper=pipeline, method="predict") -def get_model_health(model_name): +def get_model_health(model_name: str) -> bool: + """모델의 GPU 로드 여부 확인용 함수. + + Args: + model_name (str): 모델의 이름. + + Returns: + bool: 모델의 GPU 로드 여부. + """ + if model_name == "t5": model = model_T5() elif model_name == "polyglot": @@ -39,7 +59,22 @@ def get_model_health(model_name): `num_split`은 t5 모델에서만 사용되며, `options`의 내용은 \ [link](https://huggingface.co/docs/transformers/v4.30.0/main_classes/text_generation#transformers.GenerationConfig)를 참조하시기 바랍니다. " ) -async def summerize(model_name: str, data_input: TextDataInput): +async def summerize(model_name: str, data_input: TextDataInput) -> SummerizedResponse: + """선택된 모델을 이용하여 주어진 기사를 요약 및 반환을 위한 HTTP Request 처리 함수. + + Args: + model_name (str): 모델의 이름. + data_input (TextDataInput): HTTP Request로 받은 정보. + + Raises: + HTTPException: 운용중인 모델의 이름 외의 모델 요청이 오는경우. + HTTPException: 동작시 필요한 JSON 입력이 없는 경우. + HTTPException: 위의 예외 밖의 다른 에러가 발생하는 경우. + + Returns: + SummerizedResponse: 모델에서 추출된 결과를 반환하는 함수. + """ + if not model_name in ["t5", "polyglot"]: raise HTTPException(status_code=404, detail="'model_name' argument invalid! Type model name. \n Model: t5, polyglot") @@ -61,12 +96,30 @@ async def summerize(model_name: str, data_input: TextDataInput): description="모델이 GPU에 로드되어있는지 확인하는 API 입니다. `model_name`에는 `t5`, `polyglot` 중 하나를 선택하시면 됩니다. \ `load` 옵션을 이용하여 모델을 GPU에 로드시킬 수 있습니다. " ) -async def health_check(model_name: str, load: bool=False): +async def health_check(model_name: str, load: bool=False) -> HealthResponse: + """모델의 상태에 확인과 GPU 로드를 위해 HTTP Request를 처리하는 함수. + + Args: + model_name (str): 모델의 이름. + load (bool, optional): 모델의 GPU 로드와 관계 없이 강제로 GPU에 로드 시도 여부. (기본값: False) + + Raises: + HTTPException: 운용중인 모델의 이름 외의 모델 요청이 오는경우. + HTTPException: 위의 예외 밖의 다른 에러가 발생하는 경우. + + Returns: + HealthResponse: 모델의 GPU 로드 여부. (load=True인 경우 HTTPException가 발생하지 않는 경우 True.) + """ + if not model_name in ["t5", "polyglot"]: raise HTTPException(status_code=404, detail="'model_name' argument invalid! Type model name. \n Model: t5, polyglot") if load: - get_summerization(model_name, {"prompt": "", "contents": "", "options": {}, "num_split": 1}) + try: + get_summerization(model_name, {"prompt": "", "contents": "", "options": {}, "num_split": 1}) + + except Exception as err: + raise HTTPException(status_code=500, detail=f"Exception: {err}") return HealthResponse(loaded=True) else: diff --git a/Backend/Summarization/summe/app/core/config.py b/Backend/Summarization/summe/app/core/config.py index 0f02d1b..8955936 100644 --- a/Backend/Summarization/summe/app/core/config.py +++ b/Backend/Summarization/summe/app/core/config.py @@ -25,6 +25,7 @@ ) logger.configure(handlers=[{"sink": sys.stderr, "level": LOGGING_LEVEL}]) +# 모델이 저장되어 있어야 합니다. MODEL_PATH = config("MODEL_PATH", default="./ml/model/") MODEL_NAME_T5 = config("MODEL_NAME_T5", default="summary_with_news/checkpoint-11000") MODEL_NAME_POLYGLOT = config("MODEL_NAME_POLYGLOT", default="summary_with_news/checkpoint-11000") diff --git a/Backend/Summarization/summe/app/models/prediction.py b/Backend/Summarization/summe/app/models/prediction.py index 4aa8ab7..087bb0a 100644 --- a/Backend/Summarization/summe/app/models/prediction.py +++ b/Backend/Summarization/summe/app/models/prediction.py @@ -11,30 +11,11 @@ class MachineLearningResponse(BaseModel): class HealthResponse(BaseModel): loaded: bool - -class MachineLearningDataInput(BaseModel): - feature1: float - feature2: float - feature3: float - feature4: float - feature5: float - - def get_np_array(self): - return np.array( - [ - [ - self.feature1, - self.feature2, - self.feature3, - self.feature4, - self.feature5, - ] - ] - ) class SummerizedResponse(BaseModel): arr_split: List arr_summerized: List + class TextDataInput(BaseModel): prompt: str = "아래의 뉴스를 사실에 입각하여 맥락의 내용을 요약해줘." From 5094fd4f31a9f048c6372d8cb5294da0a8e84b5e Mon Sep 17 00:00:00 2001 From: limha Date: Sun, 23 Jul 2023 08:36:54 +0000 Subject: [PATCH 31/63] =?UTF-8?q?[Feature]=20Save=20model=20and=20activate?= =?UTF-8?q?=20saved=20model=20=09modified:=20=20=20sentence-sentimental/tr?= =?UTF-8?q?ain.ipynb=20=20=20=20=20=20=20=20=20-=20model=EC=9D=84=20save?= =?UTF-8?q?=20=ED=95=98=EB=8A=94=20=EA=B2=83=20=20=20=20=20=20=20=20=20-?= =?UTF-8?q?=20saved=EB=90=9C=20=EB=AA=A8=EB=8D=B8=EC=9D=84=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8A=94=20=EA=B2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sentence-sentimental/train.ipynb | 620 +++++++++++-------------------- 1 file changed, 221 insertions(+), 399 deletions(-) diff --git a/sentence-sentimental/train.ipynb b/sentence-sentimental/train.ipynb index 920fd92..8273088 100644 --- a/sentence-sentimental/train.ipynb +++ b/sentence-sentimental/train.ipynb @@ -2,18 +2,9 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 30, "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "/opt/conda/envs/final/lib/python3.8/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", - " from .autonotebook import tqdm as notebook_tqdm\n" - ] - } - ], + "outputs": [], "source": [ "import torch\n", "import pandas as pd\n", @@ -22,10 +13,12 @@ "import numpy as np\n", "import wandb\n", "\n", - "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n", + "from transformers import AutoModel\n", + "from transformers import AutoModelForSequenceClassification, AutoTokenizer, BertForSequenceClassification\n", "from transformers import TrainingArguments, Trainer\n", "from transformers import pipeline\n", "from transformers import DebertaV2ForSequenceClassification\n", + "from transformers import RobertaTokenizer, RobertaForSequenceClassification\n", "\n", "from dataset.datasets import SentimentalDataset\n", "from metrics.metrics import compute_metrics\n", @@ -65,17 +58,17 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "Some weights of the model checkpoint at klue/roberta-large were not used when initializing RobertaForSequenceClassification: ['lm_head.dense.weight', 'lm_head.dense.bias', 'lm_head.bias', 'lm_head.decoder.bias', 'lm_head.layer_norm.weight', 'lm_head.decoder.weight', 'lm_head.layer_norm.bias']\n", + "Some weights of the model checkpoint at klue/roberta-large were not used when initializing RobertaForSequenceClassification: ['lm_head.bias', 'lm_head.layer_norm.weight', 'lm_head.dense.weight', 'lm_head.layer_norm.bias', 'lm_head.dense.bias']\n", "- This IS expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n", "- This IS NOT expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n", - "Some weights of RobertaForSequenceClassification were not initialized from the model checkpoint at klue/roberta-large and are newly initialized: ['classifier.out_proj.bias', 'classifier.dense.weight', 'classifier.out_proj.weight', 'classifier.dense.bias']\n", + "Some weights of RobertaForSequenceClassification were not initialized from the model checkpoint at klue/roberta-large and are newly initialized: ['classifier.dense.bias', 'classifier.out_proj.bias', 'classifier.dense.weight', 'classifier.out_proj.weight']\n", "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n" ] } @@ -341,361 +334,59 @@ }, { "cell_type": "code", - "execution_count": 35, - "metadata": {}, - "outputs": [ - { - "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", - " \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", - " \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", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
Unnamed: 0.3Unnamed: 0.2Unnamed: 0.1Unnamed: 0titledatecontentcontent_corpuscontent_lencontent_corpus_lenlabelsnew_column
00000데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ...2023.07.10 15:29챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...181316511. 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 챗...
12222“삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연2023.07.10 15:07삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...174916980. “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 삼성 가전제품 구매고...
23333SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급2023.07.10 15:05해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (...해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리...5474761. SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 해외 가전 브랜드 공...
34444‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파2023.07.10 14:58북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...109610291. ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 북미·유럽 등...
45555네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다2023.07.10 14:4829년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상...29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상...175916591. 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 29년간 3만6558편...
.......................................
18161861142815671567\"반도체·디스플레이·AI·바이오에 투자 역량 집중해야\" [삼성 '신경영...2023.06.06 19:20전문가가 보는 뉴삼성 전략 비메모리에 승부수 던져야 이재용 등기임원 복귀 시급 사법...전문가가 보는 뉴삼성 전략 비메모리에 승부수 던져야 이재용 등기임원 복귀 시급 사법...206320370. \"반도체·디스플레이·AI·바이오에 투자 역량 집중해야\" [삼성 '신경영... 전...
18171862142915681568삼성家, 상속세 내려고 4조 대출... 2년간 6조 냈지만 아직 6조 ...2023.06.06 19:20대출이자만 年 2000억 넘어 전자·SDS·생명 일부 주식 매각이건희 삼성 선대회장...대출이자만 年 2000억 넘어 전자·SDS·생명 일부 주식 매각이건희 삼성 선대회장...157515710. 삼성家, 상속세 내려고 4조 대출... 2년간 6조 냈지만 아직 6조 ... 대...
18181863143015691569이건희가 만든 '품질의 삼성'…JY '초일류 삼성'으로 계승한다2023.06.06 18:30회장 2년차 맞은 이재용 '제2의 新경영' 내놓는다 李, 국내 1위 자만에 불량 ...회장 2년차 맞은 이재용 '제2의 新경영' 내놓는다 李, 국내 1위 자만에 불량 ...173816541. 이건희가 만든 '품질의 삼성'…JY '초일류 삼성'으로 계승한다 회장 2년차 맞...
18191864143115701570'2나노' 먼저 치고 나간 TSMC... 삼성·인텔도 초미세 공정 추격2023.06.06 18:28글로벌 파운드리(반도체 위탁생산) 1위 업체인 대만 TSMC가 2나노미터(1nm=1...글로벌 파운드리 1위 업체인 대만 TSMC가 2나노미터 공정 개발에 착수하면서 경쟁...148613971. '2나노' 먼저 치고 나간 TSMC... 삼성·인텔도 초미세 공정 추격 글로벌 ...
18201865143215711571“1만대 모두 완판입니다” 망한 줄 알았는데, 이런일이…삼성 ‘초비상’2023.06.06 16:52모토로라 폴더블폰 ‘레이저40 울트라’ [사진, GSM아레나][헤럴드경제= 박영훈기...모토로라 폴더블폰 ‘레이저40 울트라’ “망할 줄 았았는데' 중국으로 넘어간 모...148114101. “1만대 모두 완판입니다” 망한 줄 알았는데, 이런일이…삼성 ‘초비상’ 모토로라...
\n", - "

1821 rows × 12 columns

\n", - "
" - ], - "text/plain": [ - " Unnamed: 0.3 Unnamed: 0.2 Unnamed: 0.1 Unnamed: 0 \\\n", - "0 0 0 0 0 \n", - "1 2 2 2 2 \n", - "2 3 3 3 3 \n", - "3 4 4 4 4 \n", - "4 5 5 5 5 \n", - "... ... ... ... ... \n", - "1816 1861 1428 1567 1567 \n", - "1817 1862 1429 1568 1568 \n", - "1818 1863 1430 1569 1569 \n", - "1819 1864 1431 1570 1570 \n", - "1820 1865 1432 1571 1571 \n", - "\n", - " title date \\\n", - "0 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 2023.07.10 15:29 \n", - "1 “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 2023.07.10 15:07 \n", - "2 SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 2023.07.10 15:05 \n", - "3 ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 2023.07.10 14:58 \n", - "4 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 2023.07.10 14:48 \n", - "... ... ... \n", - "1816 \"반도체·디스플레이·AI·바이오에 투자 역량 집중해야\" [삼성 '신경영... 2023.06.06 19:20 \n", - "1817 삼성家, 상속세 내려고 4조 대출... 2년간 6조 냈지만 아직 6조 ... 2023.06.06 19:20 \n", - "1818 이건희가 만든 '품질의 삼성'…JY '초일류 삼성'으로 계승한다 2023.06.06 18:30 \n", - "1819 '2나노' 먼저 치고 나간 TSMC... 삼성·인텔도 초미세 공정 추격 2023.06.06 18:28 \n", - "1820 “1만대 모두 완판입니다” 망한 줄 알았는데, 이런일이…삼성 ‘초비상’ 2023.06.06 16:52 \n", - "\n", - " content \\\n", - "0 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... \n", - "1 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... \n", - "2 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (... \n", - "3 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... \n", - "4 29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상... \n", - "... ... \n", - "1816 전문가가 보는 뉴삼성 전략 비메모리에 승부수 던져야 이재용 등기임원 복귀 시급 사법... \n", - "1817 대출이자만 年 2000억 넘어 전자·SDS·생명 일부 주식 매각이건희 삼성 선대회장... \n", - "1818 회장 2년차 맞은 이재용 '제2의 新경영' 내놓는다 李, 국내 1위 자만에 불량 ... \n", - "1819 글로벌 파운드리(반도체 위탁생산) 1위 업체인 대만 TSMC가 2나노미터(1nm=1... \n", - "1820 모토로라 폴더블폰 ‘레이저40 울트라’ [사진, GSM아레나][헤럴드경제= 박영훈기... \n", - "\n", - " content_corpus content_len \\\n", - "0 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... 1813 \n", - "1 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... 1749 \n", - "2 해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리... 547 \n", - "3 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... 1096 \n", - "4 29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상... 1759 \n", - "... ... ... \n", - "1816 전문가가 보는 뉴삼성 전략 비메모리에 승부수 던져야 이재용 등기임원 복귀 시급 사법... 2063 \n", - "1817 대출이자만 年 2000억 넘어 전자·SDS·생명 일부 주식 매각이건희 삼성 선대회장... 1575 \n", - "1818 회장 2년차 맞은 이재용 '제2의 新경영' 내놓는다 李, 국내 1위 자만에 불량 ... 1738 \n", - "1819 글로벌 파운드리 1위 업체인 대만 TSMC가 2나노미터 공정 개발에 착수하면서 경쟁... 1486 \n", - "1820 모토로라 폴더블폰 ‘레이저40 울트라’ “망할 줄 았았는데' 중국으로 넘어간 모... 1481 \n", - "\n", - " content_corpus_len labels \\\n", - "0 1651 1 \n", - "1 1698 0 \n", - "2 476 1 \n", - "3 1029 1 \n", - "4 1659 1 \n", - "... ... ... \n", - "1816 2037 0 \n", - "1817 1571 0 \n", - "1818 1654 1 \n", - "1819 1397 1 \n", - "1820 1410 1 \n", - "\n", - " new_column \n", - "0 . 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 챗... \n", - "1 . “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 삼성 가전제품 구매고... \n", - "2 . SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 해외 가전 브랜드 공... \n", - "3 . ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 북미·유럽 등... \n", - "4 . 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 29년간 3만6558편... \n", - "... ... \n", - "1816 . \"반도체·디스플레이·AI·바이오에 투자 역량 집중해야\" [삼성 '신경영... 전... \n", - "1817 . 삼성家, 상속세 내려고 4조 대출... 2년간 6조 냈지만 아직 6조 ... 대... \n", - "1818 . 이건희가 만든 '품질의 삼성'…JY '초일류 삼성'으로 계승한다 회장 2년차 맞... \n", - "1819 . '2나노' 먼저 치고 나간 TSMC... 삼성·인텔도 초미세 공정 추격 글로벌 ... \n", - "1820 . “1만대 모두 완판입니다” 망한 줄 알았는데, 이런일이…삼성 ‘초비상’ 모토로라... \n", - "\n", - "[1821 rows x 12 columns]" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data" - ] - }, - { - "cell_type": "code", - "execution_count": 33, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ - "# dataset = train_test_split(data['content_corpus'], data['labels'],\n", - "\n", - "# train_dataset, test_dataset = train_test_split(data['new_column'], data['labels'],\n", - "# test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리\n", - "# random_state=SEED)\n", - "\n", - "train_dataset, test_dataset = train_test_split(data,\n", - " test_size=0.3, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리\n", - " random_state=SEED)\n", - "\n", - "train_dataset, val_dataset = train_test_split(train_dataset,\n", - " test_size=0.2, shuffle=True, stratify=train_dataset['labels'], # label에 비율을 맞춰서 분리\n", - " random_state=SEED)\n", + "# # dataset = train_test_split(data['content_corpus'], data['labels'],\n", "\n", - "corpus_train, label_train = train_dataset[\"new_column\"], train_dataset[\"labels\"]\n", - "corpus_val, label_val = val_dataset[\"new_column\"], val_dataset[\"labels\"]\n", - "corpus_test, label_test = test_dataset[\"new_column\"], test_dataset[\"labels\"]\n", + "# # train_dataset, test_dataset = train_test_split(data['new_column'], data['labels'],\n", + "# # test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리\n", + "# # random_state=SEED)\n", "\n", - "# sentence_train, sentence_val, label_train, label_val = dataset\n", - "\n", - "\n", - "max_length=500\n", - "stride=10\n", - "## TODO 임의의 값으로 차후 수정\n", - "train_encoding = tokenizer(corpus_train.tolist(), ## pandas.Series -> list\n", - " return_tensors='pt',\n", - " padding=True,\n", - " truncation=True,\n", - " ##\n", - " max_length=max_length,\n", - " stride=stride,\n", - " return_overflowing_tokens=True,\n", - " return_offsets_mapping=False\n", - " )\n", + "# train_dataset, test_dataset = train_test_split(data,\n", + "# test_size=0.3, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리\n", + "# random_state=SEED)\n", "\n", - "val_encoding = tokenizer(corpus_val.tolist(),\n", - " return_tensors='pt',\n", - " padding=True,\n", - " truncation=True,\n", - " ##\n", - " max_length=max_length,\n", - " stride=stride,\n", - " return_overflowing_tokens=True,\n", - " return_offsets_mapping=False\n", - " )\n", + "# train_dataset, val_dataset = train_test_split(train_dataset,\n", + "# test_size=0.2, shuffle=True, stratify=train_dataset['labels'], # label에 비율을 맞춰서 분리\n", + "# random_state=SEED)\n", "\n", - "train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True))\n", - "val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True))\n", - "test_set = SentimentalDataset(val_encoding, label_test.reset_index(drop=True))" + "# corpus_train, label_train = train_dataset[\"new_column\"], train_dataset[\"labels\"]\n", + "# corpus_val, label_val = val_dataset[\"new_column\"], val_dataset[\"labels\"]\n", + "# corpus_test, label_test = test_dataset[\"new_column\"], test_dataset[\"labels\"]\n", + "\n", + "# # sentence_train, sentence_val, label_train, label_val = dataset\n", + "\n", + "\n", + "# max_length=40\n", + "# stride=10\n", + "# ## TODO 임의의 값으로 차후 수정\n", + "# train_encoding = tokenizer(corpus_train.tolist(), ## pandas.Series -> list\n", + "# return_tensors='pt',\n", + "# padding=True,\n", + "# truncation=True,\n", + "# ##\n", + "# max_length=max_length,\n", + "# stride=stride,\n", + "# return_overflowing_tokens=True,\n", + "# return_offsets_mapping=False\n", + "# )\n", + "\n", + "# val_encoding = tokenizer(corpus_val.tolist(),\n", + "# return_tensors='pt',\n", + "# padding=True,\n", + "# truncation=True,\n", + "# ##\n", + "# max_length=max_length,\n", + "# stride=stride,\n", + "# return_overflowing_tokens=True,\n", + "# return_offsets_mapping=False\n", + "# )\n", + "\n", + "# train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True))\n", + "# val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True))\n", + "# test_set = SentimentalDataset(val_encoding, label_test.reset_index(drop=True))" ] }, { @@ -715,6 +406,7 @@ "\n", "\n", "max_length=500\n", + "# max_length = 2000\n", "stride=10\n", "## TODO 임의의 값으로 차후 수정\n", "train_encoding = tokenizer(sentence_train.tolist(), ## pandas.Series -> list\n", @@ -765,7 +457,7 @@ "outputs": [], "source": [ "logging_steps = 200\n", - "num_train_epochs = 2\n", + "num_train_epochs = 3\n", "per_device_train_batch_size = 4\n", "per_device_eval_batch_size = 4\n", "learning_rate = 5e-6" @@ -782,7 +474,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -791,28 +483,44 @@ "\n", "
\n", " \n", - " \n", - " [730/730 02:58, Epoch 2/2]\n", + " \n", + " [1095/1095 05:00, Epoch 3/3]\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", "
StepEpochTraining LossValidation LossAccuracyMicro F1Macro F1
2000.46280010.4765000.2974090.9205480.9205480.899829
4000.39480020.2876000.3709720.9150680.9150680.890825
6000.28290030.1752000.3755220.9342470.9342470.918363

" @@ -827,10 +535,10 @@ { "data": { "text/plain": [ - "TrainOutput(global_step=730, training_loss=0.37612260269792114, metrics={'train_runtime': 187.8492, 'train_samples_per_second': 15.544, 'train_steps_per_second': 3.886, 'total_flos': 2657460528240000.0, 'train_loss': 0.37612260269792114, 'epoch': 2.0})" + "TrainOutput(global_step=1095, training_loss=0.3064597926727713, metrics={'train_runtime': 309.5533, 'train_samples_per_second': 14.149, 'train_steps_per_second': 3.537, 'total_flos': 3986190792360000.0, 'train_loss': 0.3064597926727713, 'epoch': 3.0})" ] }, - "execution_count": 11, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -847,7 +555,7 @@ " per_device_train_batch_size = per_device_train_batch_size,\n", " per_device_eval_batch_size = per_device_eval_batch_size,\n", " learning_rate = learning_rate,\n", - " evaluation_strategy=\"logging_steps\"\n", + " evaluation_strategy=\"epoch\", \n", " fp16=True,\n", " report_to=\"wandb\",\n", ")\n", @@ -865,6 +573,66 @@ "# wandb.finish()" ] }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "# torch.save(model, \"/opt/ml/input/model-roberta_large-sota\")\n", + "trainer.save_model(\"/opt/ml/input/model-roberta_large-sota_trainer\") " + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n", + "To disable this warning, you can either:\n", + "\t- Avoid using `tokenizers` before the fork if possible\n", + "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n", + "Sat Jul 22 12:44:18 2023 \n", + "+-----------------------------------------------------------------------------+\n", + "| NVIDIA-SMI 450.80.02 Driver Version: 450.80.02 CUDA Version: 11.0 |\n", + "|-------------------------------+----------------------+----------------------+\n", + "| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |\n", + "| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |\n", + "| | | MIG M. |\n", + "|===============================+======================+======================|\n", + "| 0 Tesla V100-PCIE... On | 00000000:00:05.0 Off | Off |\n", + "| N/A 41C P0 44W / 250W | 32455MiB / 32510MiB | 0% Default |\n", + "| | | N/A |\n", + "+-------------------------------+----------------------+----------------------+\n", + " \n", + "+-----------------------------------------------------------------------------+\n", + "| Processes: |\n", + "| GPU GI CI PID Type Process name GPU Memory |\n", + "| ID ID Usage |\n", + "|=============================================================================|\n", + "+-----------------------------------------------------------------------------+\n" + ] + } + ], + "source": [ + "!nvidia-smi" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "import torch, gc\n", + "gc.collect()\n", + "torch.cuda.empty_cache()" + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -884,7 +652,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -895,22 +663,21 @@ ] }, { - "data": { - "text/plain": [ - "{'val1_loss': 0.3280849754810333,\n", - " 'val1_accuracy': 0.9372549019607843,\n", - " 'val1_f1': 0.9372549019607843}" - ] - }, - "execution_count": 37, - "metadata": {}, - "output_type": "execute_result" + "ename": "NameError", + "evalue": "name 'model' is not defined", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mNameError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/opt/ml/level3_nlp_finalproject-nlp-04/sentence-sentimental/train.ipynb Cell 24\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[39mprint\u001b[39m(\u001b[39m'\u001b[39m\u001b[39m---val evaulate start---\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[1;32m 2\u001b[0m \u001b[39m# wandb.init()\u001b[39;00m\n\u001b[1;32m 3\u001b[0m \u001b[39m# trainer.evaluate(eval_dataset=val_set, metric_key_prefix='val1')\u001b[39;00m\n\u001b[0;32m----> 4\u001b[0m model\u001b[39m.\u001b[39mevaluate(eval_dataset\u001b[39m=\u001b[39mval_set, metric_key_prefix\u001b[39m=\u001b[39m\u001b[39m'\u001b[39m\u001b[39mval1\u001b[39m\u001b[39m'\u001b[39m)\n\u001b[1;32m 5\u001b[0m \u001b[39m# wandb.finish()\u001b[39;00m\n", + "\u001b[0;31mNameError\u001b[0m: name 'model' is not defined" + ] } ], "source": [ "print('---val evaulate start---')\n", "# wandb.init()\n", - "trainer.evaluate(eval_dataset=val_set, metric_key_prefix='val1')\n", + "# trainer.evaluate(eval_dataset=val_set, metric_key_prefix='val1')\n", "# wandb.finish()" ] }, @@ -1058,22 +825,40 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "---inference start---\n", - "tensor([2.0495e-01, 9.4348e-05, 7.9496e-01])\n" + "---inference start---\n" + ] + }, + { + "ename": "OSError", + "evalue": "Can't load tokenizer for '/opt/ml/input/model-roberta_large-sota_trainer'. If you were trying to load it from 'https://huggingface.co/models', make sure you don't have a local directory with the same name. Otherwise, make sure '/opt/ml/input/model-roberta_large-sota_trainer' is the correct path to a directory containing all relevant files for a BertTokenizerFast tokenizer.", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", + "\u001b[1;32m/opt/ml/level3_nlp_finalproject-nlp-04/sentence-sentimental/train.ipynb Cell 31\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[39m# model = model.to('cpu')\u001b[39;00m\n\u001b[1;32m 4\u001b[0m \u001b[39m# MODEL_PATH = \"/opt/ml/input/model-roberta_large-sota_trainer/pytorch_model.bin\"\u001b[39;00m\n\u001b[1;32m 5\u001b[0m MODEL_PATH \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m/opt/ml/input/model-roberta_large-sota_trainer\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m----> 6\u001b[0m tokenizer \u001b[39m=\u001b[39m AutoTokenizer\u001b[39m.\u001b[39;49mfrom_pretrained(MODEL_PATH)\n\u001b[1;32m 7\u001b[0m \u001b[39m# tokenizer = RobertaTokenizer(MODEL_PATH)\u001b[39;00m\n\u001b[1;32m 8\u001b[0m \u001b[39m# model = RobertaForSequenceClassification(MODEL_PATH)\u001b[39;00m\n\u001b[1;32m 9\u001b[0m model \u001b[39m=\u001b[39m AutoModelForSequenceClassification\u001b[39m.\u001b[39mfrom_pretrained(MODEL_PATH)\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.8/site-packages/transformers/models/auto/tokenization_auto.py:693\u001b[0m, in \u001b[0;36mAutoTokenizer.from_pretrained\u001b[0;34m(cls, pretrained_model_name_or_path, *inputs, **kwargs)\u001b[0m\n\u001b[1;32m 689\u001b[0m \u001b[39mif\u001b[39;00m tokenizer_class \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m 690\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\n\u001b[1;32m 691\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mTokenizer class \u001b[39m\u001b[39m{\u001b[39;00mtokenizer_class_candidate\u001b[39m}\u001b[39;00m\u001b[39m does not exist or is not currently imported.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 692\u001b[0m )\n\u001b[0;32m--> 693\u001b[0m \u001b[39mreturn\u001b[39;00m tokenizer_class\u001b[39m.\u001b[39;49mfrom_pretrained(pretrained_model_name_or_path, \u001b[39m*\u001b[39;49minputs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 695\u001b[0m \u001b[39m# Otherwise we have to be creative.\u001b[39;00m\n\u001b[1;32m 696\u001b[0m \u001b[39m# if model is an encoder decoder, the encoder tokenizer class is used by default\u001b[39;00m\n\u001b[1;32m 697\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39misinstance\u001b[39m(config, EncoderDecoderConfig):\n", + "File \u001b[0;32m/opt/conda/envs/final/lib/python3.8/site-packages/transformers/tokenization_utils_base.py:1796\u001b[0m, in \u001b[0;36mPreTrainedTokenizerBase.from_pretrained\u001b[0;34m(cls, pretrained_model_name_or_path, *init_inputs, **kwargs)\u001b[0m\n\u001b[1;32m 1790\u001b[0m logger\u001b[39m.\u001b[39minfo(\n\u001b[1;32m 1791\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mCan\u001b[39m\u001b[39m'\u001b[39m\u001b[39mt load following files from cache: \u001b[39m\u001b[39m{\u001b[39;00munresolved_files\u001b[39m}\u001b[39;00m\u001b[39m and cannot check if these \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1792\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mfiles are necessary for the tokenizer to operate.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1793\u001b[0m )\n\u001b[1;32m 1795\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mall\u001b[39m(full_file_name \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39mfor\u001b[39;00m full_file_name \u001b[39min\u001b[39;00m resolved_vocab_files\u001b[39m.\u001b[39mvalues()):\n\u001b[0;32m-> 1796\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mEnvironmentError\u001b[39;00m(\n\u001b[1;32m 1797\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mCan\u001b[39m\u001b[39m'\u001b[39m\u001b[39mt load tokenizer for \u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00mpretrained_model_name_or_path\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m\u001b[39m. If you were trying to load it from \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1798\u001b[0m \u001b[39m\"\u001b[39m\u001b[39m'\u001b[39m\u001b[39mhttps://huggingface.co/models\u001b[39m\u001b[39m'\u001b[39m\u001b[39m, make sure you don\u001b[39m\u001b[39m'\u001b[39m\u001b[39mt have a local directory with the same name. \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1799\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mOtherwise, make sure \u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00mpretrained_model_name_or_path\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m\u001b[39m is the correct path to a directory \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1800\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mcontaining all relevant files for a \u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mcls\u001b[39m\u001b[39m.\u001b[39m\u001b[39m__name__\u001b[39m\u001b[39m}\u001b[39;00m\u001b[39m tokenizer.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1801\u001b[0m )\n\u001b[1;32m 1803\u001b[0m \u001b[39mfor\u001b[39;00m file_id, file_path \u001b[39min\u001b[39;00m vocab_files\u001b[39m.\u001b[39mitems():\n\u001b[1;32m 1804\u001b[0m \u001b[39mif\u001b[39;00m file_id \u001b[39mnot\u001b[39;00m \u001b[39min\u001b[39;00m resolved_vocab_files:\n", + "\u001b[0;31mOSError\u001b[0m: Can't load tokenizer for '/opt/ml/input/model-roberta_large-sota_trainer'. If you were trying to load it from 'https://huggingface.co/models', make sure you don't have a local directory with the same name. Otherwise, make sure '/opt/ml/input/model-roberta_large-sota_trainer' is the correct path to a directory containing all relevant files for a BertTokenizerFast tokenizer." ] } ], "source": [ "print('---inference start---')\n", - "my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯'*10\n", - "model = model.to('cpu')\n", + "my_text = '삼성전자 진짜 무조건 오를 듯'*20\n", + "\n", + "MODEL_PATH = \"/opt/ml/input/model-roberta_large-sota_trainer\"\n", + "tokenizer = AutoTokenizer.from_pretrained(\"klue/roberta-large\")\n", + "model = AutoModelForSequenceClassification.from_pretrained(MODEL_PATH)\n", + "\n", + "\n", + "# # model = torch.load(PATH)\n", "model.eval()\n", "with torch.no_grad() :\n", " temp = tokenizer(\n", @@ -1082,19 +867,56 @@ " padding=True,\n", " truncation=True,\n", " ##\n", - " max_length=max_length,\n", - " stride=stride,\n", + " max_length=100,\n", + " # stride=stride,\n", " return_overflowing_tokens=True,\n", " return_offsets_mapping=False\n", " )\n", + "\n", + " \n", " temp = {\n", " 'input_ids':temp['input_ids'],\n", " 'token_type_ids':temp['token_type_ids'],\n", " 'attention_mask':temp['attention_mask'],\n", " }\n", - " predicted_label = model(**temp)\n", + " # print(temp)\n", + " \n", + " print(\"######################################\")\n", + " predicted_label = model(temp['input_ids'])\n", + " print(predicted_label.logits)\n", " print(torch.nn.Softmax(dim=-1)(predicted_label.logits).mean(dim=0))\n", - " # tensor([[0.0108, 0.1264, 0.8628]])" + "\n", + "torch.nn.Softmax(dim=-1)(predicted_label.logits).mean(dim=0)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "## 위에 결과에서 앞의 것이 부정 뒤에것이 긍정" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "부정\n" + ] + } + ], + "source": [ + "result = torch.nn.Softmax(dim=-1)(predicted_label.logits).mean(dim=0)\n", + "\n", + "if result[0] > result[1] :\n", + " print(\"부정\")" ] }, { @@ -1121,7 +943,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.11" + "version": "3.8.5" }, "orig_nbformat": 4, "vscode": { From 45fd7e28fe9c41842d821ddc7109ad3bfe6f2ac8 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Sun, 23 Jul 2023 18:30:13 +0900 Subject: [PATCH 32/63] [Docs] Add ignores for frontend --- .gitignore | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 159 insertions(+) diff --git a/.gitignore b/.gitignore index 79bc597..72dba32 100644 --- a/.gitignore +++ b/.gitignore @@ -365,3 +365,162 @@ $RECYCLE.BIN/ *.lnk # End of https://www.toptal.com/developers/gitignore/api/python,visualstudiocode,pycharm,windows,macos + +# Ignore names for front-end. +# Created by https://www.toptal.com/developers/gitignore/api/react,node +# Edit at https://www.toptal.com/developers/gitignore?templates=react,node + +### Node ### +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +### Node Patch ### +# Serverless Webpack directories +.webpack/ + +# Optional stylelint cache + +# SvelteKit build / generate output +.svelte-kit + +### react ### +.DS_* +**/*.backup.* +**/*.back.* + +node_modules + +*.sublime* + +psd +thumb +sketch + +# End of https://www.toptal.com/developers/gitignore/api/react,node From 4577a471d6490e45caaaaeb1cd68ff13d3befb15 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Sun, 23 Jul 2023 18:33:02 +0900 Subject: [PATCH 33/63] [Frontend] Frontend v1 --- Frontend/deguel/.eslintrc.cjs | 20 + Frontend/deguel/.gitignore | 27 + Frontend/deguel/index.html | 13 + Frontend/deguel/package-lock.json | 4937 ++++++++++++++++++++ Frontend/deguel/package.json | 35 + Frontend/deguel/postcss.config.js | 6 + Frontend/deguel/public/_redirects | 1 + Frontend/deguel/public/vite.svg | 1 + Frontend/deguel/src/App.css | 42 + Frontend/deguel/src/App.jsx | 59 + Frontend/deguel/src/assets/react.svg | 1 + Frontend/deguel/src/elements/Chart.jsx | 167 + Frontend/deguel/src/elements/Summary.jsx | 95 + Frontend/deguel/src/elements/Tag.jsx | 0 Frontend/deguel/src/elements/TreeMap.jsx | 163 + Frontend/deguel/src/elements/ValueCard.jsx | 13 + Frontend/deguel/src/index.css | 73 + Frontend/deguel/src/main.jsx | 10 + Frontend/deguel/src/supabaseClient.js | 6 + Frontend/deguel/tailwind.config.js | 130 + Frontend/deguel/vite.config.js | 7 + 21 files changed, 5806 insertions(+) create mode 100644 Frontend/deguel/.eslintrc.cjs create mode 100644 Frontend/deguel/.gitignore create mode 100644 Frontend/deguel/index.html create mode 100644 Frontend/deguel/package-lock.json create mode 100644 Frontend/deguel/package.json create mode 100644 Frontend/deguel/postcss.config.js create mode 100644 Frontend/deguel/public/_redirects create mode 100644 Frontend/deguel/public/vite.svg create mode 100644 Frontend/deguel/src/App.css create mode 100644 Frontend/deguel/src/App.jsx create mode 100644 Frontend/deguel/src/assets/react.svg create mode 100644 Frontend/deguel/src/elements/Chart.jsx create mode 100644 Frontend/deguel/src/elements/Summary.jsx create mode 100644 Frontend/deguel/src/elements/Tag.jsx create mode 100644 Frontend/deguel/src/elements/TreeMap.jsx create mode 100644 Frontend/deguel/src/elements/ValueCard.jsx create mode 100644 Frontend/deguel/src/index.css create mode 100644 Frontend/deguel/src/main.jsx create mode 100644 Frontend/deguel/src/supabaseClient.js create mode 100644 Frontend/deguel/tailwind.config.js create mode 100644 Frontend/deguel/vite.config.js diff --git a/Frontend/deguel/.eslintrc.cjs b/Frontend/deguel/.eslintrc.cjs new file mode 100644 index 0000000..ee71034 --- /dev/null +++ b/Frontend/deguel/.eslintrc.cjs @@ -0,0 +1,20 @@ +/* eslint-env node */ + +module.exports = { + env: { browser: true, es2020: true }, + extends: [ + 'eslint:recommended', + 'plugin:react/recommended', + 'plugin:react/jsx-runtime', + 'plugin:react-hooks/recommended', + ], + parserOptions: { ecmaVersion: 'latest', sourceType: 'module' }, + settings: { react: { version: '18.2' } }, + plugins: ['react-refresh'], + rules: { + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, +} diff --git a/Frontend/deguel/.gitignore b/Frontend/deguel/.gitignore new file mode 100644 index 0000000..c3bb0db --- /dev/null +++ b/Frontend/deguel/.gitignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +# Local Netlify folder +.netlify diff --git a/Frontend/deguel/index.html b/Frontend/deguel/index.html new file mode 100644 index 0000000..79c4701 --- /dev/null +++ b/Frontend/deguel/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +

+ + + diff --git a/Frontend/deguel/package-lock.json b/Frontend/deguel/package-lock.json new file mode 100644 index 0000000..38d7e15 --- /dev/null +++ b/Frontend/deguel/package-lock.json @@ -0,0 +1,4937 @@ +{ + "name": "deguel", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "deguel", + "version": "0.0.0", + "dependencies": { + "@heroicons/react": "^1.0.6", + "@supabase/supabase-js": "^2.26.0", + "@tremor/react": "^3.4.1", + "chart.js": "^4.3.0", + "chartjs-chart-treemap": "^2.3.0", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.14", + "@types/react-dom": "^18.2.6", + "@vitejs/plugin-react": "^4.0.1", + "autoprefixer": "^10.4.14", + "eslint": "^8.44.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.1", + "postcss": "^8.4.26", + "tailwindcss": "^3.3.3", + "vite": "^4.4.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz", + "integrity": "sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz", + "integrity": "sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.5", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz", + "integrity": "sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dev": true, + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.22.5.tgz", + "integrity": "sha512-nTh2ogNUtxbiSbxaT4Ds6aXnXEipHweN9YRgOX/oNXdf0cCrGn/+2LozFa3lnPV5D90MkjhgckCPBrsoSc1a7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.22.5.tgz", + "integrity": "sha512-yIiRO6yobeEIaI0RTbIr8iAK9FcBHLtZq0S89ZPjDLQXBA4xvghaKqI0etp/tF3htTM0sazJKKLz9oEiGRtu7w==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.13.tgz", + "integrity": "sha512-KwqFhxRFMKZINHzCqf8eKxE0XqWlAVPRxwy6rc7CbVFxzUWB2sA/s3hbMZeemPdhN3fKBkqOaFhTbS8xJXYIWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.13.tgz", + "integrity": "sha512-j7NhycJUoUAG5kAzGf4fPWfd17N6SM3o1X6MlXVqfHvs2buFraCJzos9vbeWjLxOyBKHyPOnuCuipbhvbYtTAg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.13.tgz", + "integrity": "sha512-M2eZkRxR6WnWfVELHmv6MUoHbOqnzoTVSIxgtsyhm/NsgmL+uTmag/VVzdXvmahak1I6sOb1K/2movco5ikDJg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.13.tgz", + "integrity": "sha512-f5goG30YgR1GU+fxtaBRdSW3SBG9pZW834Mmhxa6terzcboz7P2R0k4lDxlkP7NYRIIdBbWp+VgwQbmMH4yV7w==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.13.tgz", + "integrity": "sha512-RIrxoKH5Eo+yE5BtaAIMZaiKutPhZjw+j0OCh8WdvKEKJQteacq0myZvBDLU+hOzQOZWJeDnuQ2xgSScKf1Ovw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.13.tgz", + "integrity": "sha512-AfRPhHWmj9jGyLgW/2FkYERKmYR+IjYxf2rtSLmhOrPGFh0KCETFzSjx/JX/HJnvIqHt/DRQD/KAaVsUKoI3Xg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.13.tgz", + "integrity": "sha512-pGzWWZJBInhIgdEwzn8VHUBang8UvFKsvjDkeJ2oyY5gZtAM6BaxK0QLCuZY+qoj/nx/lIaItH425rm/hloETA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.13.tgz", + "integrity": "sha512-4iMxLRMCxGyk7lEvkkvrxw4aJeC93YIIrfbBlUJ062kilUUnAiMb81eEkVvCVoh3ON283ans7+OQkuy1uHW+Hw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.13.tgz", + "integrity": "sha512-hCzZbVJEHV7QM77fHPv2qgBcWxgglGFGCxk6KfQx6PsVIdi1u09X7IvgE9QKqm38OpkzaAkPnnPqwRsltvLkIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.13.tgz", + "integrity": "sha512-I3OKGbynl3AAIO6onXNrup/ttToE6Rv2XYfFgLK/wnr2J+1g+7k4asLrE+n7VMhaqX+BUnyWkCu27rl+62Adug==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.13.tgz", + "integrity": "sha512-8pcKDApAsKc6WW51ZEVidSGwGbebYw2qKnO1VyD8xd6JN0RN6EUXfhXmDk9Vc4/U3Y4AoFTexQewQDJGsBXBpg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.13.tgz", + "integrity": "sha512-6GU+J1PLiVqWx8yoCK4Z0GnfKyCGIH5L2KQipxOtbNPBs+qNDcMJr9euxnyJ6FkRPyMwaSkjejzPSISD9hb+gg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.13.tgz", + "integrity": "sha512-pfn/OGZ8tyR8YCV7MlLl5hAit2cmS+j/ZZg9DdH0uxdCoJpV7+5DbuXrR+es4ayRVKIcfS9TTMCs60vqQDmh+w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.13.tgz", + "integrity": "sha512-aIbhU3LPg0lOSCfVeGHbmGYIqOtW6+yzO+Nfv57YblEK01oj0mFMtvDJlOaeAZ6z0FZ9D13oahi5aIl9JFphGg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.13.tgz", + "integrity": "sha512-Pct1QwF2sp+5LVi4Iu5Y+6JsGaV2Z2vm4O9Dd7XZ5tKYxEHjFtb140fiMcl5HM1iuv6xXO8O1Vrb1iJxHlv8UA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.13.tgz", + "integrity": "sha512-zTrIP0KzYP7O0+3ZnmzvUKgGtUvf4+piY8PIO3V8/GfmVd3ZyHJGz7Ht0np3P1wz+I8qJ4rjwJKqqEAbIEPngA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.13.tgz", + "integrity": "sha512-I6zs10TZeaHDYoGxENuksxE1sxqZpCp+agYeW039yqFwh3MgVvdmXL5NMveImOC6AtpLvE4xG5ujVic4NWFIDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.13.tgz", + "integrity": "sha512-W5C5nczhrt1y1xPG5bV+0M12p2vetOGlvs43LH8SopQ3z2AseIROu09VgRqydx5qFN7y9qCbpgHLx0kb0TcW7g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.13.tgz", + "integrity": "sha512-X/xzuw4Hzpo/yq3YsfBbIsipNgmsm8mE/QeWbdGdTTeZ77fjxI2K0KP3AlhZ6gU3zKTw1bKoZTuKLnqcJ537qw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.13.tgz", + "integrity": "sha512-4CGYdRQT/ILd+yLLE5i4VApMPfGE0RPc/wFQhlluDQCK09+b4JDbxzzjpgQqTPrdnP7r5KUtGVGZYclYiPuHrw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.13.tgz", + "integrity": "sha512-D+wKZaRhQI+MUGMH+DbEr4owC2D7XnF+uyGiZk38QbgzLcofFqIOwFs7ELmIeU45CQgfHNy9Q+LKW3cE8g37Kg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.13.tgz", + "integrity": "sha512-iVl6lehAfJS+VmpF3exKpNQ8b0eucf5VWfzR8S7xFve64NBNz2jPUgx1X93/kfnkfgP737O+i1k54SVQS7uVZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.3.1.tgz", + "integrity": "sha512-Bu+AMaXNjrpjh41znzHqaz3r2Nr8hHuHZT6V2LBKMhyMl0FgKA62PNYbqnfgmzOhoWZj70Zecisbo4H1rotP5g==" + }, + "node_modules/@floating-ui/dom": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.4.5.tgz", + "integrity": "sha512-96KnRWkRnuBSSFbj0sFGwwOUd8EkiecINVl0O9wiZlZ64EkpyAOG3Xc2vKKNJmru0Z7RqWNymA+6b8OZqjgyyw==", + "dependencies": { + "@floating-ui/core": "^1.3.1" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.19.2.tgz", + "integrity": "sha512-JyNk4A0Ezirq8FlXECvRtQOX/iBe5Ize0W/pLkrZjfHW9GUV7Xnq6zm6fyZuQzaHHqEnVizmvlA96e1/CkZv+w==", + "dependencies": { + "@floating-ui/react-dom": "^1.3.0", + "aria-hidden": "^1.1.3", + "tabbable": "^6.0.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-1.3.0.tgz", + "integrity": "sha512-htwHm67Ji5E/pROEAr7f8IKFShuiCKHwUC/UY4vC3I5jiSvGFAYnSYiZO5MlGmads+QqvUkR9ANHEguGrDv72g==", + "dependencies": { + "@floating-ui/dom": "^1.2.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@headlessui/react": { + "version": "1.7.15", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.15.tgz", + "integrity": "sha512-OTO0XtoRQ6JPB1cKNFYBZv2Q0JMqMGNhYP1CjPvcJvjz8YGokz8oAj89HIYZGN0gZzn/4kk9iUpmMF4Q21Gsqw==", + "dependencies": { + "client-only": "^0.0.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18", + "react-dom": "^16 || ^17 || ^18" + } + }, + "node_modules/@headlessui/tailwindcss": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@headlessui/tailwindcss/-/tailwindcss-0.1.3.tgz", + "integrity": "sha512-3aMdDyYZx9A15euRehpppSyQnb2gIw2s/Uccn2ELIoLQ9oDy0+9oRygNWNjXCD5Dt+w1pxo7C+XoiYvGcqA4Kg==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "tailwindcss": "^3.0" + } + }, + "node_modules/@heroicons/react": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-1.0.6.tgz", + "integrity": "sha512-JJCXydOFWMDpCP4q13iEplA503MQO3xLoZiKum+955ZCtHINWnx26CUxVxxFQu/uLb4LW3ge15ZpzIkXKkJ8oQ==", + "peerDependencies": { + "react": ">= 16" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@supabase/functions-js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@supabase/functions-js/-/functions-js-2.1.2.tgz", + "integrity": "sha512-QCR6pwJs9exCl37bmpMisUd6mf+0SUBJ6mUpiAjEkSJ/+xW8TCuO14bvkWHADd5hElJK9MxNlMQXxSA4DRz9nQ==", + "dependencies": { + "cross-fetch": "^3.1.5" + } + }, + "node_modules/@supabase/gotrue-js": { + "version": "2.44.1", + "resolved": "https://registry.npmjs.org/@supabase/gotrue-js/-/gotrue-js-2.44.1.tgz", + "integrity": "sha512-/6AEWvvGHHFazoiLp8Uf17UfKRYmcOAnY5N4dcpLuUZkvilc8dHpgEngC/XLlZqWsK1r3lcjwROU3I8IBfGwDg==", + "dependencies": { + "cross-fetch": "^3.1.5" + } + }, + "node_modules/@supabase/postgrest-js": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@supabase/postgrest-js/-/postgrest-js-1.7.2.tgz", + "integrity": "sha512-GK80JpRq8l6Qll85erICypAfQCied8tdlXfsDN14W844HqXCSOisk8AaE01DAwGJanieaoN5fuqhzA2yKxDvEQ==", + "dependencies": { + "cross-fetch": "^3.1.5" + } + }, + "node_modules/@supabase/realtime-js": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@supabase/realtime-js/-/realtime-js-2.7.3.tgz", + "integrity": "sha512-c7TzL81sx2kqyxsxcDduJcHL9KJdCOoKimGP6lQSqiZKX42ATlBZpWbyy9KFGFBjAP4nyopMf5JhPi2ZH9jyNw==", + "dependencies": { + "@types/phoenix": "^1.5.4", + "@types/websocket": "^1.0.3", + "websocket": "^1.0.34" + } + }, + "node_modules/@supabase/storage-js": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@supabase/storage-js/-/storage-js-2.5.1.tgz", + "integrity": "sha512-nkR0fQA9ScAtIKA3vNoPEqbZv1k5B5HVRYEvRWdlP6mUpFphM9TwPL2jZ/ztNGMTG5xT6SrHr+H7Ykz8qzbhjw==", + "dependencies": { + "cross-fetch": "^3.1.5" + } + }, + "node_modules/@supabase/supabase-js": { + "version": "2.26.0", + "resolved": "https://registry.npmjs.org/@supabase/supabase-js/-/supabase-js-2.26.0.tgz", + "integrity": "sha512-RXmTPTobaYAwkSobadHZmEVLmzX3SGrtRZIGfLWnLv92VzBRrjuXn0a+bJqKl50GUzsyqPA+j5pod7EwMkcH5A==", + "dependencies": { + "@supabase/functions-js": "^2.1.0", + "@supabase/gotrue-js": "^2.31.0", + "@supabase/postgrest-js": "^1.7.0", + "@supabase/realtime-js": "^2.7.3", + "@supabase/storage-js": "^2.5.1", + "cross-fetch": "^3.1.5" + } + }, + "node_modules/@tremor/react": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@tremor/react/-/react-3.4.1.tgz", + "integrity": "sha512-o+jUN4GJYmjghEBGBEThM+STFrXD+7bze4AcZ4BA8p+s9LmkrDc/8SFItc6R/xkFsvj3jdE63bJWCD4f3FvsNA==", + "dependencies": { + "@floating-ui/react": "^0.19.1", + "@headlessui/react": "^1.7.14", + "@headlessui/tailwindcss": "^0.1.3", + "date-fns": "^2.28.0", + "react-day-picker": "^8.7.1", + "react-transition-group": "^4.4.5", + "recharts": "^2.7.1", + "tailwind-merge": "^1.9.1" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/@types/d3-array": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.0.5.tgz", + "integrity": "sha512-Qk7fpJ6qFp+26VeQ47WY0mkwXaiq8+76RJcncDEfMc2ocRzXLO67bLFRNI4OX1aGBoPzsM5Y2T+/m1pldOgD+A==" + }, + "node_modules/@types/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA==" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.0.tgz", + "integrity": "sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA==" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw==", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.0.0.tgz", + "integrity": "sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg==" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.3.tgz", + "integrity": "sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ==", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.1.tgz", + "integrity": "sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A==", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.0.tgz", + "integrity": "sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg==" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.0.tgz", + "integrity": "sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g==" + }, + "node_modules/@types/node": { + "version": "20.4.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.2.tgz", + "integrity": "sha512-Dd0BYtWgnWJKwO1jkmTrzofjK2QXXcai0dmtzvIBhcA+RsG5h8R3xlyta0kGOZRNfL9GuRtb1knmPEhQrePCEw==" + }, + "node_modules/@types/phoenix": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@types/phoenix/-/phoenix-1.6.0.tgz", + "integrity": "sha512-qwfpsHmFuhAS/dVd4uBIraMxRd56vwBUYQGZ6GpXnFuM2XMRFJbIyruFKKlW2daQliuYZwe0qfn/UjFCDKic5g==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", + "dev": true + }, + "node_modules/@types/react": { + "version": "18.2.15", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.15.tgz", + "integrity": "sha512-oEjE7TQt1fFTFSbf8kkNuc798ahTUzn3Le67/PWjE8MAfYAD/qB7O8hSTcromLFqHCt9bcdOg5GXMokzTjJ5SA==", + "dev": true, + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz", + "integrity": "sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==", + "dev": true + }, + "node_modules/@types/websocket": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/websocket/-/websocket-1.0.5.tgz", + "integrity": "sha512-NbsqiNX9CnEfC1Z0Vf4mE1SgAJ07JnRYcNex7AJ9zAVzmiGHmjKFEk7O4TJIsgv2B1sLEb6owKFZrACwdYngsQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.0.3.tgz", + "integrity": "sha512-pwXDog5nwwvSIzwrvYYmA2Ljcd/ZNlcsSG2Q9CNDBwnsd55UGAyr2doXtB5j+2uymRCnCfExlznzzSFbBRcoCg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.5", + "@babel/plugin-transform-react-jsx-self": "^7.22.5", + "@babel/plugin-transform-react-jsx-source": "^7.22.5", + "react-refresh": "^0.14.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz", + "integrity": "sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/autoprefixer/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bufferutil": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.7.tgz", + "integrity": "sha512-kukuqc39WOHtdxtw4UScxF/WVnMFVSQVKhtx3AjZJzhd0RGZZldcrfSEbVsWWe6KNH253574cq5F+wpv0G9pJw==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001516", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001516.tgz", + "integrity": "sha512-Wmec9pCBY8CWbmI4HsjBeQLqDTqV91nFVR83DnZpYyRnPI1wePDsTg0bGLPC5VU/3OIZV1fmxEea1b+tFKe86g==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chart.js": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.3.0.tgz", + "integrity": "sha512-ynG0E79xGfMaV2xAHdbhwiPLczxnNNnasrmPEXriXsPJGjmhOBYzFVEsB65w2qMDz+CaBJJuJD0inE/ab/h36g==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=7" + } + }, + "node_modules/chartjs-chart-treemap": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/chartjs-chart-treemap/-/chartjs-chart-treemap-2.3.0.tgz", + "integrity": "sha512-Q7jyqSXSg1OfmaOUOKtk7+JCu/gsb1AIXhW+JgKnmuYvu0runzgne77HVSVjb+LN93wSKylmR2J4HL2flgEHEw==", + "peerDependencies": { + "chart.js": ">=3.0.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, + "node_modules/cross-fetch": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz", + "integrity": "sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-unit-converter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.2.tgz", + "integrity": "sha512-IiJwMC8rdZE0+xiEZHeru6YoONC4rfPMqGm2W85jMIbkFvv5nFTwJVFHam2eFrN6txmoUYFAFXiv8ICVeTO0MA==" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.461", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.461.tgz", + "integrity": "sha512-1JkvV2sgEGTDXjdsaQCeSwYYuhLRphRpc+g6EHTFELJXEiznLt3/0pZ9JuAOQ5p2rI3YxKTbivtvajirIfhrEQ==", + "dev": true + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/esbuild": { + "version": "0.18.13", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.13.tgz", + "integrity": "sha512-vhg/WR/Oiu4oUIkVhmfcc23G6/zWuEQKFS+yiosSHe4aN6+DQRXIfeloYGibIfVhkr4wyfuVsGNLr+sQU1rWWw==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.13", + "@esbuild/android-arm64": "0.18.13", + "@esbuild/android-x64": "0.18.13", + "@esbuild/darwin-arm64": "0.18.13", + "@esbuild/darwin-x64": "0.18.13", + "@esbuild/freebsd-arm64": "0.18.13", + "@esbuild/freebsd-x64": "0.18.13", + "@esbuild/linux-arm": "0.18.13", + "@esbuild/linux-arm64": "0.18.13", + "@esbuild/linux-ia32": "0.18.13", + "@esbuild/linux-loong64": "0.18.13", + "@esbuild/linux-mips64el": "0.18.13", + "@esbuild/linux-ppc64": "0.18.13", + "@esbuild/linux-riscv64": "0.18.13", + "@esbuild/linux-s390x": "0.18.13", + "@esbuild/linux-x64": "0.18.13", + "@esbuild/netbsd-x64": "0.18.13", + "@esbuild/openbsd-x64": "0.18.13", + "@esbuild/sunos-x64": "0.18.13", + "@esbuild/win32-arm64": "0.18.13", + "@esbuild/win32-ia32": "0.18.13", + "@esbuild/win32-x64": "0.18.13" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.3.tgz", + "integrity": "sha512-Hh0wv8bUNY877+sI0BlCUlsS0TYYQqvzEwJsJJPM2WF4RnTStSnSR3zdJYa2nPOJgg3UghXi54lVyMSmpCalzA==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.1.tgz", + "integrity": "sha512-CvefSOsDdaYYvxChovdrPo/ZGt8d5lrJWleAc1diXRKhHGiTYEI26cvo8Kle/wGnsizoCJjK73FMg1/IkIwiNA==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-equals": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", + "integrity": "sha512-WF1Wi8PwwSY7/6Kx0vKXtw8RwuSGoM1bvDaJbu7MxDlR1vovZjIAKrnzyrThgAjm6JDTu0fVgWXDlMGspodfoQ==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz", + "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/node-fetch": { + "version": "2.6.12", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz", + "integrity": "sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-gyp-build": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.6.0.tgz", + "integrity": "sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==", + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.26.tgz", + "integrity": "sha512-jrXHFF8iTloAenySjM/ob3gSj7pCu0Ji49hnjqzsgSRa50hkWCKD0HQ+gMNJkW38jBI68MpAAg7ZWwHwX8NMMw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-import/node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-chartjs-2": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", + "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-day-picker": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/react-day-picker/-/react-day-picker-8.8.0.tgz", + "integrity": "sha512-QIC3uOuyGGbtypbd5QEggsCSqVaPNu8kzUWquZ7JjW9fuWB9yv7WyixKmnaFelTLXFdq7h7zU6n/aBleBqe/dA==", + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/gpbl" + }, + "peerDependencies": { + "date-fns": "^2.28.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-refresh": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", + "integrity": "sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-resize-detector": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-8.1.0.tgz", + "integrity": "sha512-S7szxlaIuiy5UqLhLL1KY3aoyGHbZzsTpYal9eYMwCyKqoqoVLCmIgAgNyIM1FhnP2KyBygASJxdhejrzjMb+w==", + "dependencies": { + "lodash": "^4.17.21" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-smooth": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-2.0.3.tgz", + "integrity": "sha512-yl4y3XiMorss7ayF5QnBiSprig0+qFHui8uh7Hgg46QX5O+aRMRKlfGGNGLHno35JkQSvSYY8eCWkBfHfrSHfg==", + "dependencies": { + "fast-equals": "^5.0.0", + "react-transition-group": "2.9.0" + }, + "peerDependencies": { + "prop-types": "^15.6.0", + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-smooth/node_modules/dom-helpers": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz", + "integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==", + "dependencies": { + "@babel/runtime": "^7.1.2" + } + }, + "node_modules/react-smooth/node_modules/react-transition-group": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz", + "integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==", + "dependencies": { + "dom-helpers": "^3.4.0", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2", + "react-lifecycles-compat": "^3.0.4" + }, + "peerDependencies": { + "react": ">=15.0.0", + "react-dom": ">=15.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recharts": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.7.2.tgz", + "integrity": "sha512-HMKRBkGoOXHW+7JcRa6+MukPSifNtJlqbc+JreGVNA407VLE/vOP+8n3YYjprDVVIF9E2ZgwWnL3D7K/LUFzBg==", + "dependencies": { + "classnames": "^2.2.5", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.19", + "react-is": "^16.10.2", + "react-resize-detector": "^8.0.4", + "react-smooth": "^2.0.2", + "recharts-scale": "^0.4.4", + "reduce-css-calc": "^2.1.8", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "prop-types": "^15.6.0", + "react": "^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/reduce-css-calc": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.8.tgz", + "integrity": "sha512-8liAVezDmUcH+tdzoEGrhfbGcP7nOV4NkGE3a74+qqvE7nt9i4sKLGBuZNOnpI4WiGksiNPklZxva80061QiPg==", + "dependencies": { + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.26.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.26.3.tgz", + "integrity": "sha512-7Tin0C8l86TkpcMtXvQu6saWH93nhG3dGQ1/+l5V2TDMceTxO7kDiK6GzbfLWNNxqJXm591PcEZUozZm51ogwQ==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.33.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.33.0.tgz", + "integrity": "sha512-ARGC7vbufOHfpvyGcZZXFaXCMZ9A4fffOGC5ucOW7+WHDGlAe8LJdf3Jts1sWhDeiI1RSWrKy5Hodl+JWGdW2A==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "node_modules/tailwind-merge": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-1.14.0.tgz", + "integrity": "sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/utf-8-validate": { + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", + "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", + "hasInstallScript": true, + "dependencies": { + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">=6.14.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/victory-vendor": { + "version": "36.6.11", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.6.11.tgz", + "integrity": "sha512-nT8kCiJp8dQh8g991J/R5w5eE2KnO8EAIP0xocWlh9l2okngMWglOPoMZzJvek8Q1KUc4XE/mJxTZnvOB1sTYg==", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.4.tgz", + "integrity": "sha512-4mvsTxjkveWrKDJI70QmelfVqTm+ihFAb6+xf4sjEU2TmUCTlVX87tmg/QooPEMQb/lM9qGHT99ebqPziEd3wg==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.25", + "rollup": "^3.25.2" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "node_modules/websocket": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.34.tgz", + "integrity": "sha512-PRDso2sGwF6kM75QykIesBijKSVceR6jL2G8NGYyq2XrItNC2P5/qL5XeR056GhA+Ly7JMFvJb9I312mJfmqnQ==", + "dependencies": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/websocket/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/websocket/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha512-MvQa//+KcZCUkBTIC9blM+CU9J2GzuTytsOUwf2lidtvkx/6gnEp1QvJv34t9vdjhFmha/mUiNDbN0D0mJWdug==", + "engines": { + "node": ">=0.10.32" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/Frontend/deguel/package.json b/Frontend/deguel/package.json new file mode 100644 index 0000000..762ca7a --- /dev/null +++ b/Frontend/deguel/package.json @@ -0,0 +1,35 @@ +{ + "name": "deguel", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint src --ext js,jsx --report-unused-disable-directives --max-warnings 0", + "preview": "vite preview" + }, + "dependencies": { + "@heroicons/react": "^1.0.6", + "@supabase/supabase-js": "^2.26.0", + "@tremor/react": "^3.4.1", + "chart.js": "^4.3.0", + "chartjs-chart-treemap": "^2.3.0", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-dom": "^18.2.0" + }, + "devDependencies": { + "@types/react": "^18.2.14", + "@types/react-dom": "^18.2.6", + "@vitejs/plugin-react": "^4.0.1", + "autoprefixer": "^10.4.14", + "eslint": "^8.44.0", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.1", + "postcss": "^8.4.26", + "tailwindcss": "^3.3.3", + "vite": "^4.4.0" + } +} diff --git a/Frontend/deguel/postcss.config.js b/Frontend/deguel/postcss.config.js new file mode 100644 index 0000000..2e7af2b --- /dev/null +++ b/Frontend/deguel/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/Frontend/deguel/public/_redirects b/Frontend/deguel/public/_redirects new file mode 100644 index 0000000..f824337 --- /dev/null +++ b/Frontend/deguel/public/_redirects @@ -0,0 +1 @@ +/* /index.html 200 \ No newline at end of file diff --git a/Frontend/deguel/public/vite.svg b/Frontend/deguel/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/Frontend/deguel/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Frontend/deguel/src/App.css b/Frontend/deguel/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/Frontend/deguel/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/Frontend/deguel/src/App.jsx b/Frontend/deguel/src/App.jsx new file mode 100644 index 0000000..99c8955 --- /dev/null +++ b/Frontend/deguel/src/App.jsx @@ -0,0 +1,59 @@ +"use client"; + +import { + Title, + Text, + Tab, + TabList, + TabGroup, + TabPanel, + TabPanels, +} from "@tremor/react"; +import TreemMap from "./elements/TreeMap"; + +export default function App() { + + return ( +
+ Deguel + 현재, 언론사에서 가장 많이 다루고 있는 키워드 입니다. + + + + 👍 긍정 키워드 + 👎 부정 키워드 + {/*📰 뉴스 요약본*/} + + + +
+ +
+
+ + +
+ +
+
+ + {/* + + + +
+ + + + + +
+
+ + + */} + + +
+ ); +} diff --git a/Frontend/deguel/src/assets/react.svg b/Frontend/deguel/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/Frontend/deguel/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/Frontend/deguel/src/elements/Chart.jsx b/Frontend/deguel/src/elements/Chart.jsx new file mode 100644 index 0000000..fcd29f7 --- /dev/null +++ b/Frontend/deguel/src/elements/Chart.jsx @@ -0,0 +1,167 @@ +import { + Title, + Text, + LineChart, + TabList, + Tab, + TabGroup, + TabPanel, + TabPanels, + Flex, + BadgeDelta, + Metric, + } from "@tremor/react"; + + import { useEffect, useState } from "react"; + import { startOfYear, subDays } from "date-fns"; + import { supabase } from "../supabaseClient"; + + + const dataFormatter = (number) => `${Intl.NumberFormat("ko-KR", { + style: 'currency', + currency: 'KRW', + }).format(number).toString()}`; + + export default function LineChartTab() { + const [selectedIndex, setSelectedIndex] = useState("Max"); + const [stockPrice, setStockPrice] = useState([{"id": 0, "ticker": "005930.KS", "price": 0, "date": "2021-04-05"}, {"id": 0, "ticker": "005930.KS", "price": 0, "date": "2021-04-05"}]); + + // useEffect로 함수 call. + useEffect(() => { + getInformations(); + }, []); + + + // Supabase에서 데이터 가져오기. + async function getInformations() { + const { data } = await supabase.from("price").select("*").order('date', { ascending: true }); + setStockPrice(data); + getFilteredData(selectedIndex); + } + + // 날짜 포멧 변경 + const getDate = (dateString) => { + const [year, month, day] = dateString.split("T")[0].split("-").map(Number); + return new Date(year, month - 1, day); + }; + + // 주어진 범위의 가격만 가져오기. + const filterData = (startDate, endDate) => + stockPrice.filter((item) => { + const currentDate = getDate(item.date); + return currentDate >= startDate && currentDate <= endDate; + }); + + // 일자 범위에 맞는 만큼의 데이터 가져오기. + const getFilteredData = (period) => { + const lastAvailableDate = getDate(stockPrice[stockPrice.length - 1].date); + switch (period) { + case 0: { + const periodStartDate = subDays(lastAvailableDate, 30); + return filterData(periodStartDate, lastAvailableDate); + } + case 1: { + const periodStartDate = subDays(lastAvailableDate, 60); + return filterData(periodStartDate, lastAvailableDate); + } + case 2: { + const periodStartDate = subDays(lastAvailableDate, 180); + return filterData(periodStartDate, lastAvailableDate); + } + case 3: { + const periodStartDate = startOfYear(lastAvailableDate); + return filterData(periodStartDate, lastAvailableDate); + } + default: + return stockPrice; + } + }; + + const getDiffRatio = (price1, price2) => { + return (price1 - price2) / price2 * 100; + } + + return ( +
+ + 삼성전자 + + {getDiffRatio(stockPrice[stockPrice.length - 1].price, stockPrice[stockPrice.length - 2].price).toFixed(2)}% + + + {dataFormatter(stockPrice[stockPrice.length - 1].price)} + 최근 1주일간의 주식 차트에요! + + + 1M + 2M + 6M + YTD + Max + + + + + + + + + + + + + + + + + + + +
+ ); + } diff --git a/Frontend/deguel/src/elements/Summary.jsx b/Frontend/deguel/src/elements/Summary.jsx new file mode 100644 index 0000000..c362c75 --- /dev/null +++ b/Frontend/deguel/src/elements/Summary.jsx @@ -0,0 +1,95 @@ +import { useEffect, useState } from "react"; +import { + Title, + Subtitle, + Text, + Tracker, + Divider, + Flex, + BadgeDelta, +} from "@tremor/react" +import { supabase } from "../supabaseClient"; + + +const data = [ + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "blue", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "blue", tooltip: "Operational" }, + { color: "green", tooltip: "Operational" }, + { color: "green", tooltip: "Operational" }, + { color: "green", tooltip: "Downtime" }, + { color: "blue", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Maintenance" }, + { color: "gray", tooltip: "Operational" }, + { color: "gray", tooltip: "Operational" }, + { color: "blue", tooltip: "Operational" }, + { color: "green", tooltip: "Degraded" }, + { color: "green", tooltip: "Operational" }, +]; + +export default function SummaryCard() { + const [newsSummarized, setNewsSummarized] = useState("") + const [keyword, setKeyword] = useState("#7nm 공정") + + // useEffect로 + // const [newsKeywordList, setnewsKeywordList] = useState([]) + + // useEffect로 함수 call. + useEffect(() => { + getInformations(); + }, []); + + + // Supabase에서 데이터 가져오기. + async function getInformations() { + const { data } = await supabase.from("news").select("content").order('date', { ascending: false }).limit(1); + setNewsSummarized(data[0].content); + } + + // Click event for Close button. + const onCloseClick = (text) => { + console.log("+++ badge +++") + setKeyword(text); + } + + return ( +
+ 선택하신 키워드에 대한 주요 뉴스 요약본이에요! + {keyword} + {newsSummarized} + + + 해당 키워드의 지난 30일간 언급 유무예요. + 언급 빈도 + + + + 같이 언급된 키워드예요. + 연관 키워드 + + onCloseClick("양산화")}>양산화 + onCloseClick("평택 공장")}>평택 공장 + onCloseClick("증설")}>증설 + onCloseClick("조사")}>조사 + onCloseClick("TSMC")}>TSMC + +
+ ); +} diff --git a/Frontend/deguel/src/elements/Tag.jsx b/Frontend/deguel/src/elements/Tag.jsx new file mode 100644 index 0000000..e69de29 diff --git a/Frontend/deguel/src/elements/TreeMap.jsx b/Frontend/deguel/src/elements/TreeMap.jsx new file mode 100644 index 0000000..730a045 --- /dev/null +++ b/Frontend/deguel/src/elements/TreeMap.jsx @@ -0,0 +1,163 @@ +import { + Chart as ChartJS, + CategoryScale, + LinearScale, + BarElement, + Title, + Tooltip, + Legend, +} from 'chart.js'; +import { TreemapController, TreemapElement } from 'chartjs-chart-treemap'; +import { Chart } from 'react-chartjs-2'; + +import { + Title as TremorTitle, + Subtitle, + Button, + Divider, + Grid, + Col, +} from "@tremor/react"; + + +import { color } from 'chart.js/helpers'; +import { PropTypes } from 'prop-types'; +import { useEffect, useRef, useState } from 'react'; + +import LineChartTab from './Chart'; + +import { supabase } from '../supabaseClient'; + +import { XIcon } from "@heroicons/react/outline"; +import SummaryCard from './Summary'; + +ChartJS.register( + CategoryScale, + LinearScale, + BarElement, + Title, + Tooltip, + Legend, + TreemapController, + TreemapElement +); + +export default function TreeMap(props) { + const chartRef = useRef(); + const [kewords, setKeywords] = useState([]); + const [isClicked, setIsClicked] = useState(false); + + // useEffect로 함수 call. + useEffect(() => { + getInformations(); + }, []); + + // Supabase에서 데이터 가져오기. + async function getInformations() { + const { data } = await supabase.from("keyword").select("keywords").order('created_at', { ascending: false }); + console.log(data[0].keywords); + setKeywords(data[0].keywords); + } + + TreeMap.propTypes = { + color: PropTypes.string.isRequired, + title: PropTypes.string.isRequired, + } + + const config = { + type: 'treemap', + data: { + datasets: [ + { + tree: kewords, + key: 'capacityMW', + labels: { + display: true, + formatter: (context) => context.raw._data.name, + }, + backgroundColor(context) { + if (context.type !== 'data') return 'transparent'; + const { dataCoverage } = context.raw._data; + return dataCoverage === 0 + ? color('grey').rgbString() + : color(props.color).alpha(dataCoverage).rgbString(); + }, + }, + ], + }, + }; + + const options = { + plugins: { + title: { + display: true, + text: '분석된 키워드', + }, + legend: { + display: false, + }, + tooltip: { + displayColors: false, + callbacks: { + title(items) { + return items[0].raw._data.name; + }, + label(item) { + const { + _data: { capacityMW, dataCoverage }, + } = item.raw; + return [ + `Export capacity: ${capacityMW} MW`, + `Data Coverage: ${dataCoverage * 100}%`, + ]; + }, + }, + }, + }, + }; + + // Click event for TreeMap. + const onDataClick = (event) => { + if(chartRef.current) { + console.log(event); + console.log(chartRef); + + setIsClicked(true); + } + } + + // Click event for Close button. + const onCloseClick = (event) => { + console.log(event); + + setIsClicked(false); + } + + return ( +
+ {!isClicked &&
+ 분석된 {props.title} 예요. + {props.title} + +
} + + {isClicked &&
+ + + +
+ + + + + +
+ + + + + +
} +
+ ); +} diff --git a/Frontend/deguel/src/elements/ValueCard.jsx b/Frontend/deguel/src/elements/ValueCard.jsx new file mode 100644 index 0000000..04e3eb3 --- /dev/null +++ b/Frontend/deguel/src/elements/ValueCard.jsx @@ -0,0 +1,13 @@ +import { Card, Text, Metric, Flex, ProgressBar } from "@tremor/react"; + +export default function ValueCard(){ + return + Sales + $ 71,465 + + 32% of annual target + $ 225,000 + + + +} \ No newline at end of file diff --git a/Frontend/deguel/src/index.css b/Frontend/deguel/src/index.css new file mode 100644 index 0000000..a0edd12 --- /dev/null +++ b/Frontend/deguel/src/index.css @@ -0,0 +1,73 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +/* a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} */ + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/Frontend/deguel/src/main.jsx b/Frontend/deguel/src/main.jsx new file mode 100644 index 0000000..c468168 --- /dev/null +++ b/Frontend/deguel/src/main.jsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.jsx' +import './index.css' + +ReactDOM.createRoot(document.getElementById('root')).render( + + + , +) diff --git a/Frontend/deguel/src/supabaseClient.js b/Frontend/deguel/src/supabaseClient.js new file mode 100644 index 0000000..89f1679 --- /dev/null +++ b/Frontend/deguel/src/supabaseClient.js @@ -0,0 +1,6 @@ +import { createClient } from '@supabase/supabase-js' + +const supabaseUrl = import.meta.env.VITE_SUPABASE_URL +const supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY + +export const supabase = createClient(supabaseUrl, supabaseAnonKey) \ No newline at end of file diff --git a/Frontend/deguel/tailwind.config.js b/Frontend/deguel/tailwind.config.js new file mode 100644 index 0000000..19a52e5 --- /dev/null +++ b/Frontend/deguel/tailwind.config.js @@ -0,0 +1,130 @@ +/** @type {import('tailwindcss').Config} */ + +module.exports = { + content: [ + "./index.html", + "./src/**/*.{js,ts,jsx,tsx}", + + // Path to the Tremor module + "./node_modules/@tremor/**/*.{js,ts,jsx,tsx}", + ], + theme: { + transparent: "transparent", + current: "currentColor", + extend: { + colors: { + // light mode + tremor: { + brand: { + faint: "#eff6ff", // blue-50 + muted: "#bfdbfe", // blue-200 + subtle: "#60a5fa", // blue-400 + DEFAULT: "#3b82f6", // blue-500 + emphasis: "#1d4ed8", // blue-700 + inverted: "#ffffff", // white + }, + background: { + muted: "#f9fafb", // gray-50 + subtle: "#f3f4f6", // gray-100 + DEFAULT: "#ffffff", // white + emphasis: "#374151", // gray-700 + }, + border: { + DEFAULT: "#e5e7eb", // gray-200 + }, + ring: { + DEFAULT: "#e5e7eb", // gray-200 + }, + content: { + subtle: "#9ca3af", // gray-400 + DEFAULT: "#6b7280", // gray-500 + emphasis: "#374151", // gray-700 + strong: "#111827", // gray-900 + inverted: "#ffffff", // white + }, + }, + // dark mode + "dark-tremor": { + brand: { + faint: "#0B1229", // custom + muted: "#172554", // blue-950 + subtle: "#1e40af", // blue-800 + DEFAULT: "#3b82f6", // blue-500 + emphasis: "#60a5fa", // blue-400 + inverted: "#030712", // gray-950 + }, + background: { + muted: "#131A2B", // custom + subtle: "#1f2937", // gray-800 + DEFAULT: "#111827", // gray-900 + emphasis: "#d1d5db", // gray-300 + }, + border: { + DEFAULT: "#1f2937", // gray-800 + }, + ring: { + DEFAULT: "#1f2937", // gray-800 + }, + content: { + subtle: "#4b5563", // gray-600 + DEFAULT: "#6b7280", // gray-600 + emphasis: "#e5e7eb", // gray-200 + strong: "#f9fafb", // gray-50 + inverted: "#000000", // black + }, + }, + }, + boxShadow: { + // light + "tremor-input": "0 1px 2px 0 rgb(0 0 0 / 0.05)", + "tremor-card": "0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)", + "tremor-dropdown": "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)", + // dark + "dark-tremor-input": "0 1px 2px 0 rgb(0 0 0 / 0.05)", + "dark-tremor-card": "0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)", + "dark-tremor-dropdown": "0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)", + }, + borderRadius: { + "tremor-small": "0.375rem", + "tremor-default": "0.5rem", + "tremor-full": "9999px", + }, + fontSize: { + "tremor-label": ["0.75rem"], + "tremor-default": ["0.875rem", { lineHeight: "1.25rem" }], + "tremor-title": ["1.125rem", { lineHeight: "1.75rem" }], + "tremor-metric": ["1.875rem", { lineHeight: "2.25rem" }], + }, + }, + }, + safelist: [ + { + pattern: + /^(bg-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950))$/, + variants: ["hover", "ui-selected"], + }, + { + pattern: + /^(text-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950))$/, + variants: ["hover", "ui-selected"], + }, + { + pattern: + /^(border-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950))$/, + variants: ["hover", "ui-selected"], + }, + { + pattern: + /^(ring-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950))$/, + }, + { + pattern: + /^(stroke-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950))$/, + }, + { + pattern: + /^(fill-(?:slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-(?:50|100|200|300|400|500|600|700|800|900|950))$/, + }, + ], + plugins: [require("@headlessui/tailwindcss")], +}; diff --git a/Frontend/deguel/vite.config.js b/Frontend/deguel/vite.config.js new file mode 100644 index 0000000..5a33944 --- /dev/null +++ b/Frontend/deguel/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) From a2db8f882b71c59e6556a15646ad0a136c574043 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Sun, 23 Jul 2023 18:42:59 +0900 Subject: [PATCH 34/63] [Docs] Add README.md --- README.md | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 3b4d36a..87ff2c2 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,27 @@ -# 개요 ---- +# [프로젝트 명] - Frontend +[프로젝트 명]의 프론트엔드 프로젝트 입니다. + +## 📄 간략 설명 +- React와 vite로 구성된 프론트엔드 프로젝트 입니다. +- Tailwind CSS를 이용하여 디자인을 구성하였습니다. + +## 🚀 사용 방법 +1. 먼저 시작에 앞서, 다음의 내용의 파일을 `./env.local`에 만드십시오. +``` +VITE_SUPABASE_URL=SUPABASE_URL +VITE_SUPABASE_ANON_KEY=SUPABASE_KEY +``` +2. 다음의 명렬어를 이용하여 설치하십시오. +``` +npm install +``` +3. 다음의 명령어로 실행이 가능합니다. +``` +npm run dev +``` +### ☁️ 배포 +1. 다음의 명령어로 프로젝트를 build 할 수 있습니다. +``` +npm run build +``` +2. 경로 `./dist`의 폴더에 결과물이 생성됩니다. 해당 결과물을 배포하시면 됩니다. \ No newline at end of file From 882d95493915859aa630123489cca81d95d38fe5 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Sun, 23 Jul 2023 18:47:22 +0900 Subject: [PATCH 35/63] [Refectoring] Add comments and clean code --- Frontend/deguel/src/elements/Chart.jsx | 300 +++++++++++------------ Frontend/deguel/src/elements/Summary.jsx | 5 +- Frontend/deguel/src/elements/Tag.jsx | 0 Frontend/deguel/src/elements/TreeMap.jsx | 13 +- 4 files changed, 159 insertions(+), 159 deletions(-) delete mode 100644 Frontend/deguel/src/elements/Tag.jsx diff --git a/Frontend/deguel/src/elements/Chart.jsx b/Frontend/deguel/src/elements/Chart.jsx index fcd29f7..b3608a2 100644 --- a/Frontend/deguel/src/elements/Chart.jsx +++ b/Frontend/deguel/src/elements/Chart.jsx @@ -12,156 +12,156 @@ import { Metric, } from "@tremor/react"; - import { useEffect, useState } from "react"; - import { startOfYear, subDays } from "date-fns"; - import { supabase } from "../supabaseClient"; - - - const dataFormatter = (number) => `${Intl.NumberFormat("ko-KR", { - style: 'currency', - currency: 'KRW', - }).format(number).toString()}`; - - export default function LineChartTab() { - const [selectedIndex, setSelectedIndex] = useState("Max"); - const [stockPrice, setStockPrice] = useState([{"id": 0, "ticker": "005930.KS", "price": 0, "date": "2021-04-05"}, {"id": 0, "ticker": "005930.KS", "price": 0, "date": "2021-04-05"}]); +import { useEffect, useState } from "react"; +import { startOfYear, subDays } from "date-fns"; +import { supabase } from "../supabaseClient"; - // useEffect로 함수 call. - useEffect(() => { - getInformations(); - }, []); - - - // Supabase에서 데이터 가져오기. - async function getInformations() { - const { data } = await supabase.from("price").select("*").order('date', { ascending: true }); - setStockPrice(data); - getFilteredData(selectedIndex); - } - - // 날짜 포멧 변경 - const getDate = (dateString) => { - const [year, month, day] = dateString.split("T")[0].split("-").map(Number); - return new Date(year, month - 1, day); - }; - - // 주어진 범위의 가격만 가져오기. - const filterData = (startDate, endDate) => - stockPrice.filter((item) => { - const currentDate = getDate(item.date); - return currentDate >= startDate && currentDate <= endDate; - }); - - // 일자 범위에 맞는 만큼의 데이터 가져오기. - const getFilteredData = (period) => { - const lastAvailableDate = getDate(stockPrice[stockPrice.length - 1].date); - switch (period) { - case 0: { - const periodStartDate = subDays(lastAvailableDate, 30); - return filterData(periodStartDate, lastAvailableDate); - } - case 1: { - const periodStartDate = subDays(lastAvailableDate, 60); - return filterData(periodStartDate, lastAvailableDate); - } - case 2: { - const periodStartDate = subDays(lastAvailableDate, 180); - return filterData(periodStartDate, lastAvailableDate); - } - case 3: { - const periodStartDate = startOfYear(lastAvailableDate); - return filterData(periodStartDate, lastAvailableDate); - } - default: - return stockPrice; - } - }; +// 원화 표기를 위한 함수. +const dataFormatter = (number) => `${Intl.NumberFormat("ko-KR", { + style: 'currency', + currency: 'KRW', +}).format(number).toString()}`; + +export default function LineChartTab() { + const [selectedIndex, setSelectedIndex] = useState("Max"); + const [stockPrice, setStockPrice] = useState([{"id": 0, "ticker": "005930.KS", "price": 0, "date": "2021-04-05"}, {"id": 0, "ticker": "005930.KS", "price": 0, "date": "2021-04-05"}]); + + // useEffect로 함수 call. + useEffect(() => { + getInformations(); + }, []); - const getDiffRatio = (price1, price2) => { - return (price1 - price2) / price2 * 100; + + // Supabase에서 데이터 가져오기. + async function getInformations() { + const { data } = await supabase.from("price").select("*").order('date', { ascending: true }); + setStockPrice(data); + getFilteredData(selectedIndex); + } + + // 날짜 포멧 변경 + const getDate = (dateString) => { + const [year, month, day] = dateString.split("T")[0].split("-").map(Number); + return new Date(year, month - 1, day); + }; + + // 주어진 범위의 가격만 가져오기. + const filterData = (startDate, endDate) => + stockPrice.filter((item) => { + const currentDate = getDate(item.date); + return currentDate >= startDate && currentDate <= endDate; + }); + + // 일자 범위에 맞는 만큼의 데이터 가져오기. + const getFilteredData = (period) => { + const lastAvailableDate = getDate(stockPrice[stockPrice.length - 1].date); + switch (period) { + case 0: { + const periodStartDate = subDays(lastAvailableDate, 30); + return filterData(periodStartDate, lastAvailableDate); + } + case 1: { + const periodStartDate = subDays(lastAvailableDate, 60); + return filterData(periodStartDate, lastAvailableDate); + } + case 2: { + const periodStartDate = subDays(lastAvailableDate, 180); + return filterData(periodStartDate, lastAvailableDate); + } + case 3: { + const periodStartDate = startOfYear(lastAvailableDate); + return filterData(periodStartDate, lastAvailableDate); + } + default: + return stockPrice; } - - return ( -
- - 삼성전자 - - {getDiffRatio(stockPrice[stockPrice.length - 1].price, stockPrice[stockPrice.length - 2].price).toFixed(2)}% - - - {dataFormatter(stockPrice[stockPrice.length - 1].price)} - 최근 1주일간의 주식 차트에요! - - - 1M - 2M - 6M - YTD - Max - - - - - - - - - - - - - - - - - - - -
- ); - } + }; + + const getDiffRatio = (price1, price2) => { + return (price1 - price2) / price2 * 100; + } + + return ( +
+ + 삼성전자 + + {getDiffRatio(stockPrice[stockPrice.length - 1].price, stockPrice[stockPrice.length - 2].price).toFixed(2)}% + + + {dataFormatter(stockPrice[stockPrice.length - 1].price)} + 최근 1주일간의 주식 차트에요! + + + 1M + 2M + 6M + YTD + Max + + + + + + + + + + + + + + + + + + + +
+ ); +} diff --git a/Frontend/deguel/src/elements/Summary.jsx b/Frontend/deguel/src/elements/Summary.jsx index c362c75..5a10864 100644 --- a/Frontend/deguel/src/elements/Summary.jsx +++ b/Frontend/deguel/src/elements/Summary.jsx @@ -10,7 +10,7 @@ import { } from "@tremor/react" import { supabase } from "../supabaseClient"; - +// 표기를 위한 임시 데이터. const data = [ { color: "gray", tooltip: "Operational" }, { color: "gray", tooltip: "Operational" }, @@ -48,9 +48,6 @@ export default function SummaryCard() { const [newsSummarized, setNewsSummarized] = useState("") const [keyword, setKeyword] = useState("#7nm 공정") - // useEffect로 - // const [newsKeywordList, setnewsKeywordList] = useState([]) - // useEffect로 함수 call. useEffect(() => { getInformations(); diff --git a/Frontend/deguel/src/elements/Tag.jsx b/Frontend/deguel/src/elements/Tag.jsx deleted file mode 100644 index e69de29..0000000 diff --git a/Frontend/deguel/src/elements/TreeMap.jsx b/Frontend/deguel/src/elements/TreeMap.jsx index 730a045..d3f6caa 100644 --- a/Frontend/deguel/src/elements/TreeMap.jsx +++ b/Frontend/deguel/src/elements/TreeMap.jsx @@ -47,6 +47,12 @@ export default function TreeMap(props) { const [kewords, setKeywords] = useState([]); const [isClicked, setIsClicked] = useState(false); + // 객체 TreeMap에 대한 필수 prop 정의. + TreeMap.propTypes = { + color: PropTypes.string.isRequired, + title: PropTypes.string.isRequired, + } + // useEffect로 함수 call. useEffect(() => { getInformations(); @@ -59,11 +65,7 @@ export default function TreeMap(props) { setKeywords(data[0].keywords); } - TreeMap.propTypes = { - color: PropTypes.string.isRequired, - title: PropTypes.string.isRequired, - } - + // TreeMap의 색상 설정 정의. const config = { type: 'treemap', data: { @@ -87,6 +89,7 @@ export default function TreeMap(props) { }, }; + // TreeMap의 표기 설정 정의. const options = { plugins: { title: { From faaf691e88342077fbfcb7950b468f080f5e70a5 Mon Sep 17 00:00:00 2001 From: ChoiHwimin Date: Sun, 23 Jul 2023 19:40:34 +0900 Subject: [PATCH 36/63] [Feature] Add keyword extraction API Code - Add keyword extraction API Code --- Backend/Keyword Extraction/main.py | 71 ++++++++++++++++++++++++++++-- 1 file changed, 68 insertions(+), 3 deletions(-) diff --git a/Backend/Keyword Extraction/main.py b/Backend/Keyword Extraction/main.py index ff6a88b..77fc64d 100644 --- a/Backend/Keyword Extraction/main.py +++ b/Backend/Keyword Extraction/main.py @@ -2,13 +2,14 @@ from pathlib import Path -from fastapi import FastAPI, UploadFile, File +from fastapi import FastAPI, UploadFile, File, HTTPException from fastapi.param_functions import Depends from pydantic import BaseModel, Field from uuid import UUID, uuid4 -from typing import List, Union, Optional, Dict, Any +from typing import List, Union, Optional, Dict, Any, Tuple from datetime import datetime +import pandas as pd sys.path.append(str(Path.home().joinpath("level3_nlp_finalproject-nlp-04"))) from keyword_extractor.model import KeyBert @@ -17,4 +18,68 @@ @app.get("/") def hello_word(): - return {"hello": "world"} \ No newline at end of file + return {"hello": "world"} + + +class Item(BaseModel): + titles: List[str] = [] + contents: List[str] = [] + dates: List[str] = [] + + +class Parameter(BaseModel): + stop_words: Optional[List[str]] = None + top_k: Optional[int] = 5 + diversity: Optional[float] = 0.7 + min_df: Optional[int] = 1 + candidate_frac: Optional[float] = 0.3 + vectorizer_type: Optional[str] = "tfidf" + tag_type: Optional[str] = "okt" + + +def df_transform(data_input): + df = pd.DataFrame({'title': data_input.titles, + 'content': data_input.contents, + 'date': data_input.dates}) + return df + + +def get_model(model_number): + if model_number == "1": + model = KeyBert("jhgan/ko-sroberta-multitask") + elif model_number == "2": + model = KeyBert("snunlp/KR-SBERT-V40K-klueNLI-augSTS") + elif model_number == "3": + model = KeyBert("sentence-transformers/paraphrase-multilingual-mpnet-base-v2") + return model + + +@app.post( + "/keywordExtraction/{model_number}", + name="keyword extraction", + description="뉴스 기사에서 키워드를 추출하는 요약하는 API 입니다. `model_number`에는 `1`, `2`,`3` 중 하나를 선택하시면 됩니다.\ + 기본 모델 목록 1: jhgan/ko-sroberta-multitask, 2:snunlp/KR-SBERT-V40K-klueNLI-augSTS, 3:sentence-transformers/paraphrase-multilingual-mpnet-base-v2" +) +async def keywordExtraction(model_number: str, data_input: Item, parameter: Parameter): + if not model_number in ["1", "2","3"]: + raise HTTPException(status_code=404, detail="'model_number' argument invalid! Type model name. \n Model: 1, 2, 3") + + if not data_input: + raise HTTPException(status_code=404, detail="'data_input' argument invalid!") + try: + df = df_transform(data_input) + + except Exception as err: + raise HTTPException(status_code=500, detail=f"Exception: {err}") + + model = get_model(model_number) + + result = model.extract_keywords(df['content'].tolist(), + stop_words = parameter.stop_words if parameter.stop_words else [], + top_k = parameter.top_k, + diversity = parameter.diversity, + candidate_frac = parameter.candidate_frac, + vectorizer_type = parameter.vectorizer_type, + tag_type = parameter.tag_type, + ) + return result, parameter \ No newline at end of file From f5f7a7e854ff66f3fb02724976c9e9262ceb74a1 Mon Sep 17 00:00:00 2001 From: ChoiHwimin Date: Mon, 24 Jul 2023 00:49:34 +0900 Subject: [PATCH 37/63] [Feature] Add Union str in keyword extraction API Code --- Backend/Keyword Extraction/main.py | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/Backend/Keyword Extraction/main.py b/Backend/Keyword Extraction/main.py index 77fc64d..ef73918 100644 --- a/Backend/Keyword Extraction/main.py +++ b/Backend/Keyword Extraction/main.py @@ -2,7 +2,7 @@ from pathlib import Path -from fastapi import FastAPI, UploadFile, File, HTTPException +from fastapi import FastAPI, UploadFile, File, HTTPException, Depends from fastapi.param_functions import Depends from pydantic import BaseModel, Field from uuid import UUID, uuid4 @@ -22,10 +22,9 @@ def hello_word(): class Item(BaseModel): - titles: List[str] = [] - contents: List[str] = [] - dates: List[str] = [] - + titles: Union[str, List[str]] = [] + contents: Union[str, List[str]] = [] + dates: Union[str, List[str]] = [] class Parameter(BaseModel): stop_words: Optional[List[str]] = None @@ -37,14 +36,29 @@ class Parameter(BaseModel): tag_type: Optional[str] = "okt" -def df_transform(data_input): +def df_transform(data_input: Item): + # DataFrame으로 변환하는 함수 df = pd.DataFrame({'title': data_input.titles, 'content': data_input.contents, 'date': data_input.dates}) return df +def process_input_data(data_input: Item): + # 단일 문자열을 리스트로 변환하는 함수 + def convert_to_list(item): + if isinstance(item, str): + return [item] + return item + + # data_input의 필드에 대해 타입 변환 수행 + data_input.titles = convert_to_list(data_input.titles) + data_input.contents = convert_to_list(data_input.contents) + data_input.dates = convert_to_list(data_input.dates) + + return data_input def get_model(model_number): + # model 반환 함수 if model_number == "1": model = KeyBert("jhgan/ko-sroberta-multitask") elif model_number == "2": @@ -60,7 +74,7 @@ def get_model(model_number): description="뉴스 기사에서 키워드를 추출하는 요약하는 API 입니다. `model_number`에는 `1`, `2`,`3` 중 하나를 선택하시면 됩니다.\ 기본 모델 목록 1: jhgan/ko-sroberta-multitask, 2:snunlp/KR-SBERT-V40K-klueNLI-augSTS, 3:sentence-transformers/paraphrase-multilingual-mpnet-base-v2" ) -async def keywordExtraction(model_number: str, data_input: Item, parameter: Parameter): +async def keywordExtraction(model_number: str, data_input: Item = Depends(process_input_data), parameter: Parameter = Depends()): if not model_number in ["1", "2","3"]: raise HTTPException(status_code=404, detail="'model_number' argument invalid! Type model name. \n Model: 1, 2, 3") From 7a63bab4b1e403362b84ef3c63d56153515f18f0 Mon Sep 17 00:00:00 2001 From: limha Date: Sun, 23 Jul 2023 17:13:58 +0000 Subject: [PATCH 38/63] [Feature] Fix docstring of preprocessing modified: sentence-sentimental/preprocess/preprocessing.py --- .../preprocess/preprocessing.py | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/sentence-sentimental/preprocess/preprocessing.py b/sentence-sentimental/preprocess/preprocessing.py index 5a24dfe..62cfa2b 100644 --- a/sentence-sentimental/preprocess/preprocessing.py +++ b/sentence-sentimental/preprocess/preprocessing.py @@ -2,6 +2,9 @@ import pandas as pd def remove_text(texts) : + """ + 재판매 및 DB금지 를 제거. + """ pattern = r"\*? ?재판매 및 DB 금지" preprocessed_text = '' @@ -52,6 +55,9 @@ def remove_photo_info(texts): return preprocessed_text def change_quotation(texts) : + """ + " -> ' + """ pattern = r"\"" replacement = "\'" @@ -74,6 +80,7 @@ def remove_email(texts): def remove_day(texts): """ 날짜와 관련된 숫자 제거 + 2022.01.01 -> "" """ pattern = r'\d{4}\.\d{1,2}\.\d{1,2}\.?' @@ -81,6 +88,9 @@ def remove_day(texts): return text def remove_triangle(texts): + """ + "▶ 임의의 문구 =" 를 제거한다. + """ pattern = r'▶\s?.+=' text = re.sub(pattern, "", texts) @@ -146,11 +156,17 @@ def remove_url(texts): return preprocessed_text def remove_special_str(texts) : + """ + 1. ◆◇▲▼■●▶◀△▽→←⇒⇔➜➔❯❮ 해당하는 문자들은 다 제거한다. + 2. ↑ 해당하는 문자를 증가로 치환한다. + 3. ↓ 해당하는 문자를 감소로 치환한다. + """ preprocessed_text = '' pattern = r"[◆◇▲▼■●▶◀△▽→←⇒⇔➜➔❯❮]" preprocessed_text = re.sub(pattern, "", texts) preprocessed_text = re.sub("\↑", "증가 ", texts) + preprocessed_text = re.sub("\↓", "감소 ", texts) return preprocessed_text @@ -197,12 +213,7 @@ def preprocess_dataframe_to_sentence(df): return df_sentence if __name__ == "__main__" : - # text = "‘스마트싱스’ 중심의 지속 가능한 일상 전시 에너지 줄이는 비스포크 가전 라인업 선봬[이데일리 김응열 기자] 삼성전자가 29일부터 내달 1일까지 광주광역시 김대중컨벤션센터에서 열리는 ‘2023 국제IoT가전로봇박람회’에 참가해 각종 에너지 절감 기술을 적용한 가전제품 라인업과 솔루션을 대거 소개한다.삼성전자 모델이 29일부터 내달 1일까지 광주광역시 김대중컨벤션센터에서 진행되는 ‘2023국제IoT가전로봇박람회’에 마련된 삼성전자 부스에서 ‘스마트싱스 에너지 세이빙’ 솔루션을 소개하고 있다. 접목 디지털 제어 기술 △스마트싱스 기반 에너지 관리 솔루션 ’스마트싱스 에너지‘의 ’AI 절약모드‘ 등으로 추가적인 에너지 절감이 가능하다. 가령 비스포크 무풍에어컨 갤러리의 에너지 특화 모델은 1등급 최저 기준보다도 냉방 효율이 10% 더 뛰어나다. AI 절약 모드 기능을 활용하면 전력 사용량을 최대 20% 추가 절약할 수 있다.삼성전자 모델이 29일부터 내달 1일까지 광주광역시 김대중컨벤션센터에서 진행되는 ‘2023국제IoT가전로봇박람회’에 마련된 삼성전자 부스에서 스마트싱스 기반의 ‘넷 제로 홈’을 소개하고 있다. (사진=삼성전자)삼성전자는 이번 전시에서 스마트싱스 기반의 ’넷 제로 홈(Net Zero Home)‘으로 에너지 리더십도 강조한다. 넷 제로 홈에서는 태양광 패널로 생산한 에너지를 활용할뿐 아니라 스마트싱스를 이용해 가전제품이나 집안 전체 에너지 사용량을 모니터링하고 줄일 수 있다. 삼성전자는 에너지 절약을 위해 한국전력공사, 서울특별시, 나주시와 협력하는 ’주민 DR(Demand Response)‘ 서비스 사업도 함께 소개했다. 전력거래소나 지방자치단체가 DR 발령 시 자동으로 연동된 삼성전자 제품을 AI 절약 모드로 전환하거나 전원을 끄는 등 전력량을 최소화한다. 이 기능은 에어컨, 냉장고, 세탁기·건조기, 식기세척기, TV 등 총 9종의 삼성전자 가전제품과 파트너사의 스마트 기기까지 지원한다. ’지속 가능한 일상(Everyday Sustainability)‘을 주제로 한 전시 공간에서는 파트너십을 바탕으로 탄생한 자원순환 솔루션을 소개한다. △세탁 과정에서 발생하는 미세 플라스틱 배출 저감을 위해 글로벌 아웃도어 브랜드 파타고니아(Patagonia)와 협업 개발한 ’미세 플라스틱 저감 필터‘ △문승지 디자이너와 업사이클링 패션 브랜드 플리츠마마가 협업해 버려진 페트병, 자투리 원단 등으로 만든 ’제로 에디션(Zero Edition)‘ 의자와 러그 등을 전시하다. 박찬우 삼성전자 생활가전사업부 부사장은 “삼성전자 비스포크 가전은 제품 고유의 기술은 물론 AI와 사물인터넷(IoT)를 접목해 일상을 더욱 풍요롭게 하고 에너지를 절감하는 솔루션을 제시해 왔다”며 “앞으로는 손쉽게 실천할 수 있는 지속 가능 솔루션을 다양하게 선보이며 소비자들이 가치 있는 일상을 경험할 수 있도록 만드는 데에 주력할 것”이라고 말했다.삼성전자 모델이 29일부터 내달 1일까지 광주광역시 김대중컨벤션센터에서 진행되는 ‘2023국제 IoT가전로봇박람회’에 마련된 삼성전자 부스의 ‘지속 가능한 일상’ 주제의 전시 공간에서 자원순환 솔루션을 소개하고 있다. (사진=삼성전자)" - # text = "/사진제공=한화한화 건설부문은 " - # text = "윤선희 기자 =" - # text = "서울 서초구 삼성전자 서초사옥의 모습. 2023.4.7/뉴스1 News1 신웅수 기자 김정은 기자 = " - text = " ▶공매도 대기자금, 전체 증시 83조·삼전 11조 돌파 ‘역대 최대’=1일 헤럴드경제가 금융투자협회 종합통계포털을 분석한 결과 지난달 26일 기준 삼성전자 한 종목에 대한 일간 대차거래 잔액 규모는 11조2507억원에 달했다. 이는 공매도가 부분 재개된 2021년 5월 이후는 물론, 관련 통계가 집계되기 시작한 2009년 이후 가장 큰 액수다. 공매도 부분 재개 후 7조원대 이하에 머물던 삼성전자에 대한 대차거래 잔액 규모는 지난해 11월 8조원대를 돌파해 9조원선을 터치했다. 올해 첫 거래일(1월 2일) 6조7630억원 규모로 시작한 대차" + text = "실험해보고 싶은 문구를 넣어보세요." + text = all_preprocessing(text) - # text = remove_day(text) - # text = remove_press(text) print(text) \ No newline at end of file From 0e797a71d74f609fb45430475f30ea122c90eebc Mon Sep 17 00:00:00 2001 From: limha Date: Mon, 24 Jul 2023 08:01:39 +0000 Subject: [PATCH 39/63] [Feature] Add Remove Duplicated Space --- sentence-sentimental/preprocess/preprocessing.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/sentence-sentimental/preprocess/preprocessing.py b/sentence-sentimental/preprocess/preprocessing.py index 62cfa2b..07cc5d5 100644 --- a/sentence-sentimental/preprocess/preprocessing.py +++ b/sentence-sentimental/preprocess/preprocessing.py @@ -170,6 +170,10 @@ def remove_special_str(texts) : return preprocessed_text +def remove_space_dup(texts): + preprocessed_text = re.sub(r"\s+", " ", texts) + + return preprocessed_text def all_preprocessing(texts) : texts = str(texts) @@ -184,6 +188,7 @@ def all_preprocessing(texts) : texts = remove_special_str(texts) texts = change_quotation(texts) + texts = remove_space_dup(texts) return texts From 17cfff6cd89fbaf7a539c600725a837e23adfd4c Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Mon, 24 Jul 2023 17:09:06 +0900 Subject: [PATCH 40/63] [Etc] Remove sentence-sentimental codes - Remove codes for resolve conflict. --- sentence-sentimental/preprocess/main.py | 17 -- .../preprocess/preprocessing.py | 186 ------------------ 2 files changed, 203 deletions(-) delete mode 100644 sentence-sentimental/preprocess/main.py delete mode 100644 sentence-sentimental/preprocess/preprocessing.py diff --git a/sentence-sentimental/preprocess/main.py b/sentence-sentimental/preprocess/main.py deleted file mode 100644 index 2f5b679..0000000 --- a/sentence-sentimental/preprocess/main.py +++ /dev/null @@ -1,17 +0,0 @@ -from preprocessing import * -import pandas as pd - -if __name__ == '__main__' : - df = pd.read_csv("/opt/ml/finance_sentiment_corpus/뉴스_corpus.csv") - - df = df[['title', 'date', 'content']] - - # corpus - df = preprocess_dataframe(df) - df.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_data.csv") - - # sentence - df_sentence = preprocess_dataframe_to_sentence(df) - df_sentence.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_sentence_data.csv") - - print("완료! ml/finance_sentiment_corpus/ 에서 data를 확인해보세요!") \ No newline at end of file diff --git a/sentence-sentimental/preprocess/preprocessing.py b/sentence-sentimental/preprocess/preprocessing.py deleted file mode 100644 index 9e51ce3..0000000 --- a/sentence-sentimental/preprocess/preprocessing.py +++ /dev/null @@ -1,186 +0,0 @@ -import re -import pandas as pd - -def remove_text(texts) : - pattern = r"\*? ?재판매 및 DB 금지" - - preprocessed_text = '' - - text = re.sub(pattern, "", texts).strip() - if text: - preprocessed_text = text - - return preprocessed_text - -def remove_press(texts): - """ - 언론 정보를 제거 - -> ~~ 기자 (연합뉴스) - -> (서울=연합뉴스) ~~ 특파원 - """ - re_patterns = [ - r"\([^(]*?(뉴스|경제|일보|미디어|데일리|한겨례|타임즈|위키트리)\)", - r"[가-힣]{0,4} (기자|선임기자|수습기자|특파원|객원기자|논설고문|통신원|연구소장) =?", # 이름 + 기자 - r"[가-힣]{1,}(뉴스|경제|일보|미디어|데일리|한겨례|타임|위키트리)", # (... 연합뉴스) .. - r"[\(\[]\s+[\)\]]", # ( ) - r"[\(\[]=\s+[\)\]]", # (= ) - r"[\)\]]\s+=[\)\]]", # ( =) - ] - - preprocessed_text = '' - for re_pattern in re_patterns : - text = re.sub(re_pattern, "", str(texts)) - if text : - preprocessed_text = text - - return preprocessed_text - -def remove_photo_info(texts): - ## 수정 필요 - """ - 뉴스의 이미지 설명 대한 label 제거 - """ - preprocessed_text = [] - - preprocessed_text = re.sub(r"\(출처 ?= ?.+\) |\(사진 ?= ?.+\) |\(자료 ?= ?.+\)| \(자료사진\) |사진=.+기자 ", "", texts).strip() - preprocessed_text = re.sub(r"\/사진제공?=\S+?\s+ | \/\s사진?=", " ", preprocessed_text) - - return preprocessed_text - -def change_quotation(texts) : - pattern = r"\"" - replacement = "\'" - - processed_text = re.sub(pattern, replacement, texts) - - return processed_text - -def remove_email(texts): - """ - 이메일을 제거 - """ - preprocessed_text = '' - - text = re.sub(r"[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+", "", texts).strip() - if text: - preprocessed_text = text - - return preprocessed_text - -def remove_day(texts): - """ - 날짜와 관련된 숫자 제거 - """ - pattern = r'\d{4}\.\d{2}\.\d{2}' - - text = re.sub(pattern, "", texts) - return text - -def remove_triangle(texts): - pattern = r'▶?\s.+=' - - text = re.sub(pattern, "", texts) - return text - -def remove_parentheses(texts): - """ - 괄호와 그 안에 있는 내용들을 제거 - """ - pattern = r'[\(\[][^(^[]*[\)\]]' - - processed_text = re.sub(pattern, '', texts) - - return processed_text - -def remove_copyright(texts): - """ - 뉴스 내 포함된 저작권 관련 텍스트를 제거합니다. - """ - re_patterns = [ - r"\<저작권자(\(c\)|ⓒ|©|\(Copyright\)|(\(c\))|(\(C\))).+?\>", - r"저작권자\(c\)|ⓒ|©|(Copyright)|(\(c\))|(\(C\))" - ] - preprocessed_text = '' - - for re_pattern in re_patterns : - text = re.sub(re_pattern, "", texts) - if text: - preprocessed_text = text - - return preprocessed_text - -def split_sentence(texts) : - sentence_list = texts.split(". ") - - return sentence_list - -# 혹시 필요한 것들 모음 -def remove_hashtag(texts): - """ - 해쉬태그(#)를 제거합니다. - """ - preprocessed_text = '' - - text = re.sub(r"#\S+", "", texts).strip() - if text: - preprocessed_text = text - - return preprocessed_text - -def remove_url(texts): - """ - URL을 제거합니다. - 주소: www.naver.com`` -> 주소: - """ - preprocessed_text = '' - - text = re.sub(r"(http|https)?:\/\/\S+\b|www\.(\w+\.)+\S*", "", texts).strip() - text = re.sub(r"pic\.(\w+\.)+\S*", "", texts).strip() - - preprocessed_text = text - - return preprocessed_text - -def all_preprocessing(texts) : - texts = remove_text(texts) - texts = remove_press(texts) - texts = remove_photo_info(texts) - texts = remove_email(texts) - texts = remove_copyright(texts) - texts = remove_day(texts) - texts = remove_triangle(texts) - texts = remove_parentheses(texts) - texts = remove_copyright(texts) - - texts = change_quotation(texts) - - return texts - -def preprocess_dataframe(df): - df['content_corpus'] = df['content'].apply(all_preprocessing) - - return df - -def preprocess_dataframe_to_sentence(df): - df_sentence = pd.DataFrame(columns=['title', 'date', 'content_sentence']) - - for index, row in df.iterrows(): - title = row['title'] - date = row['date'] - content = row['content'] - - content = split_sentence(content) - - for sentence in content: - l = len(df_sentence) - sentence = all_preprocessing(sentence) - new_row = {'title': title, 'date': date, 'content_sentence': sentence} - - new_row = pd.DataFrame(new_row, index = [l]) - df_sentence = pd.concat([df_sentence, new_row], axis = 0) - - return df_sentence - -if __name__ == "__main__" : - text = '여기에 넣고 싶은 문구를 넣어서 실험해보세요.' - print(text) \ No newline at end of file From 8b58cba85c8e5b8f6ef6ba75363e36a5234031c1 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Mon, 24 Jul 2023 17:33:11 +0900 Subject: [PATCH 41/63] [Etc] Remove summe workflows --- .../summe/.github/workflows/ci.yaml | 24 ------------------- 1 file changed, 24 deletions(-) delete mode 100644 Backend/Summarization/summe/.github/workflows/ci.yaml diff --git a/Backend/Summarization/summe/.github/workflows/ci.yaml b/Backend/Summarization/summe/.github/workflows/ci.yaml deleted file mode 100644 index 9f0ecf1..0000000 --- a/Backend/Summarization/summe/.github/workflows/ci.yaml +++ /dev/null @@ -1,24 +0,0 @@ -name: Python package - -on: [push] - -jobs: - build: - - runs-on: ubuntu-latest - strategy: - matrix: - python-version: ["3.6", "3.7", "3.8", "3.9"] - - steps: - - uses: actions/checkout@v3 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v3 - with: - python-version: ${{ matrix.python-version }} - - name: Install dependencies - run: | - make install - - name: Test with pytest - run: | - make test \ No newline at end of file From c4162b43dffd6dfe232a50a8ddfb484b3c077538 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Tue, 25 Jul 2023 11:27:48 +0900 Subject: [PATCH 42/63] [Feature] Add clean paragraph function - Add cleaning paragraph function in API --- .../summe/app/services/predict.py | 47 +++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/Backend/Summarization/summe/app/services/predict.py b/Backend/Summarization/summe/app/services/predict.py index f6b7056..09c29aa 100644 --- a/Backend/Summarization/summe/app/services/predict.py +++ b/Backend/Summarization/summe/app/services/predict.py @@ -1,10 +1,13 @@ import os +import re from loguru import logger -from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig, LlamaTokenizer +from transformers import AutoTokenizer, AutoModelForCausalLM from peft import PeftModel, PeftConfig +from kss import split_sentences + from core.errors import PredictException, ModelLoadException from core.config import MODEL_NAME_T5, MODEL_NAME_POLYGLOT, MODEL_PATH @@ -29,19 +32,24 @@ def predict(cls, input, load_wrapper=None, method="predict"): cls.get_model(load_wrapper) n = input["num_split"] - news_split = [x+"다." for x in input["contents"].split("다.") if x] + + # 2개 이상의 공백 제거. + input["contents"] = re.sub(r'\s{2,}', ' ', input["contents"]) + + news_split = split_sentences(input["contents"]) arr_para = [] arr_para_sum = [] - for i in range(0, len(news_split) // n): + for i in range(0, len(news_split) // n + 1): arr_para.append("".join(news_split[i * n:i * n + n])) clf = cls.get_model(load_wrapper) if hasattr(clf, method): for para in arr_para: - news_tokenized = len(clf.tokenizer(para)["input_ids"]) + # news_tokenized = len(clf.tokenizer(para)["input_ids"]) # arr_para_sum.append(clf(para, min_length=news_tokenized // 2, max_length=news_tokenized // 2 + (news_tokenized // 4))[0]["summary_text"]) - arr_para_sum.append(clf(para, **input["options"],)[0]["summary_text"]) + text = clf(para, **input["options"],)[0]["summary_text"] + arr_para_sum.append(cls.clean_paragraph(text)) return arr_para, arr_para_sum raise PredictException(f"'{method}' attribute is missing") @@ -63,7 +71,18 @@ def load(load_wrapper): logger.error(message) raise ModelLoadException(message) return model - + + @classmethod + def clean_paragraph(cls, text) -> str: + list_sentence = split_sentences(text) + str_clean = "" + + for sentence in list_sentence: + if "다." in sentence: + str_clean = sentence + " " + break + + return str_clean class MachineLearningModelHandlerPolyglot(MachineLearningModelHandler): model = None @@ -86,9 +105,10 @@ def predict(cls, input, load_wrapper=None, method="predict"): ), **input["options"], ) + result = cls.tokenizer.decode(result[0])[len(x_prompt):] arr_para = [x_prompt] - arr_para_sum = [cls.tokenizer.decode(result[0])[len(x_prompt):]] + arr_para_sum = [cls.clean_paragraph(result)] return arr_para, arr_para_sum # raise PredictException(f"'{method}' attribute is missing") @@ -119,4 +139,15 @@ def load(load_wrapper): message = f"Model {model} could not load!" logger.error(message) raise ModelLoadException(message) - return model, tokenizer \ No newline at end of file + return model, tokenizer + + @classmethod + def clean_paragraph(cls, text) -> str: + list_sentence = list(dict.fromkeys(split_sentences(text))) + str_clean = "" + + for sentence in list_sentence: + if "다." in sentence: + str_clean += sentence + " " + + return str_clean + "\n" \ No newline at end of file From 1a3f09796d0ed50271724ac5b8ec61280cc0b046 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Tue, 25 Jul 2023 15:40:39 +0900 Subject: [PATCH 43/63] [Feature] Add after process in summarization - Add bad words. - Apply sentence cleaning function. --- Backend/Summarization/summe/app/services/predict.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Backend/Summarization/summe/app/services/predict.py b/Backend/Summarization/summe/app/services/predict.py index 09c29aa..7ad589d 100644 --- a/Backend/Summarization/summe/app/services/predict.py +++ b/Backend/Summarization/summe/app/services/predict.py @@ -49,7 +49,10 @@ def predict(cls, input, load_wrapper=None, method="predict"): # news_tokenized = len(clf.tokenizer(para)["input_ids"]) # arr_para_sum.append(clf(para, min_length=news_tokenized // 2, max_length=news_tokenized // 2 + (news_tokenized // 4))[0]["summary_text"]) text = clf(para, **input["options"],)[0]["summary_text"] - arr_para_sum.append(cls.clean_paragraph(text)) + text = re.sub(r'\s{2,}', ' ', text) + text = cls.clean_paragraph(text) + + arr_para_sum.append(text) return arr_para, arr_para_sum raise PredictException(f"'{method}' attribute is missing") @@ -79,7 +82,8 @@ def clean_paragraph(cls, text) -> str: for sentence in list_sentence: if "다." in sentence: - str_clean = sentence + " " + # str_clean = sentence + " " + str_clean = sentence.split("다.")[0] + "다. " break return str_clean @@ -92,10 +96,13 @@ class MachineLearningModelHandlerPolyglot(MachineLearningModelHandler): @classmethod def predict(cls, input, load_wrapper=None, method="predict"): + if cls.model == None: cls.get_model(load_wrapper) x_prompt = cls.prompt(input["prompt"], input["contents"]) + list_badword = [cls.tokenizer("###", add_special_tokens=False).input_ids, + cls.tokenizer("\n", add_special_tokens=False).input_ids,] result = cls.model.generate( **cls.tokenizer( @@ -103,6 +110,7 @@ def predict(cls, input, load_wrapper=None, method="predict"): return_tensors='pt', return_token_type_ids=False ), + bad_words_ids=list_badword, **input["options"], ) result = cls.tokenizer.decode(result[0])[len(x_prompt):] From 544724ccbe25537281b621f526a19fd3ced65d4c Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Tue, 25 Jul 2023 15:44:45 +0900 Subject: [PATCH 44/63] [Feature] Add `all` option in model - Create option `all` option. - Works with both model(T5, polyglot). --- .../Summarization/summe/app/api/routes/predictor.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Backend/Summarization/summe/app/api/routes/predictor.py b/Backend/Summarization/summe/app/api/routes/predictor.py index a6fdbe5..8b45f60 100644 --- a/Backend/Summarization/summe/app/api/routes/predictor.py +++ b/Backend/Summarization/summe/app/api/routes/predictor.py @@ -29,6 +29,11 @@ def get_summerization(model_name: str, data_point: TextDataInput) -> Tuple: model = model_T5() elif model_name == "polyglot": model = model_polyglot() + elif model_name == "all": + _, context_t5 = get_summerization("t5", data_point) + _, context_poly = get_summerization("polyglot", data_point) + + return [], [context_t5[0] + "\n\n" + context_poly[0]] return model.predict(data_point, load_wrapper=pipeline, method="predict") @@ -55,7 +60,7 @@ def get_model_health(model_name: str) -> bool: "/summerize/{model_name}", response_model=SummerizedResponse, name="summerize news", - description="모델을 이용하여 기사를 요약하는 API 입니다. `model_name`에는 `t5`, `polyglot` 중 하나를 선택하시면 됩니다. \ + description="모델을 이용하여 기사를 요약하는 API 입니다. `model_name`에는 `t5`, `polyglot` 혹은 모든 모델을 이용하는 `all` 중 하나를 선택하시면 됩니다. \ `num_split`은 t5 모델에서만 사용되며, `options`의 내용은 \ [link](https://huggingface.co/docs/transformers/v4.30.0/main_classes/text_generation#transformers.GenerationConfig)를 참조하시기 바랍니다. " ) @@ -75,8 +80,8 @@ async def summerize(model_name: str, data_input: TextDataInput) -> SummerizedRes SummerizedResponse: 모델에서 추출된 결과를 반환하는 함수. """ - if not model_name in ["t5", "polyglot"]: - raise HTTPException(status_code=404, detail="'model_name' argument invalid! Type model name. \n Model: t5, polyglot") + if not model_name in ["t5", "polyglot", "all"]: + raise HTTPException(status_code=404, detail="'model_name' argument invalid! Type model name. \n Model: t5, polyglot, all") if not data_input: raise HTTPException(status_code=404, detail="'data_input' argument invalid!") From c729781a4cfb322aebca1ce1d74c7b29350a98e7 Mon Sep 17 00:00:00 2001 From: Yungi Date: Tue, 25 Jul 2023 15:51:40 +0900 Subject: [PATCH 45/63] [Refactor] Remove Duplicate Condition [main.py] - Remove Contents type check in Serving - Remove unnecessary item in Item - Remove Covert Dataframe Function in Serving [model.py] - Add instance check condition in Model [mmr.py] - Move post processing func into Scoring Code --- Backend/Keyword Extraction/main.py | 36 +++------------- keyword_extractor/mmr.py | 59 +++++++++++++++++++++++--- keyword_extractor/model.py | 67 +++++++++--------------------- 3 files changed, 79 insertions(+), 83 deletions(-) diff --git a/Backend/Keyword Extraction/main.py b/Backend/Keyword Extraction/main.py index b79923a..8edf6b2 100644 --- a/Backend/Keyword Extraction/main.py +++ b/Backend/Keyword Extraction/main.py @@ -29,12 +29,11 @@ def hello_word(): class Item(BaseModel): - titles: Union[str, List[str]] = [] - contents: Union[str, List[str]] = [] - dates: Union[str, List[str]] = [] + titles: Union[str, List[str]] + contents: Union[str, List[str]] class Parameter(BaseModel): - stop_words: Optional[List[str]] = None + stop_words: Optional[Union[str, List[str]]] = None top_k: Optional[int] = 5 diversity: Optional[float] = 0.7 min_df: Optional[int] = 1 @@ -43,26 +42,6 @@ class Parameter(BaseModel): tag_type: Optional[str] = "okt" -def df_transform(data_input: Item): - # DataFrame으로 변환하는 함수 - df = pd.DataFrame({'title': data_input.titles, - 'content': data_input.contents, - 'date': data_input.dates}) - return df - -def process_input_data(data_input: Item): - # 단일 문자열을 리스트로 변환하는 함수 - def convert_to_list(item): - if isinstance(item, str): - return [item] - return item - - # data_input의 필드에 대해 타입 변환 수행 - data_input.titles = convert_to_list(data_input.titles) - data_input.contents = convert_to_list(data_input.contents) - data_input.dates = convert_to_list(data_input.dates) - - return data_input def get_model(model_number): # model 반환 함수 @@ -81,21 +60,18 @@ def get_model(model_number): description="뉴스 기사에서 키워드를 추출하는 요약하는 API 입니다. `model_number`에는 `1`, `2`,`3` 중 하나를 선택하시면 됩니다.\ 기본 모델 목록 1: jhgan/ko-sroberta-multitask, 2:snunlp/KR-SBERT-V40K-klueNLI-augSTS, 3:sentence-transformers/paraphrase-multilingual-mpnet-base-v2" ) -async def keywordExtraction(model_number: str, data_input: Item = Depends(process_input_data), parameter: Parameter = Depends()): +async def keywordExtraction(model_number: str, data_input: Item, parameter: Parameter = Depends()): if not model_number in ["1", "2","3"]: raise HTTPException(status_code=404, detail="'model_number' argument invalid! Type model name. \n Model: 1, 2, 3") if not data_input: raise HTTPException(status_code=404, detail="'data_input' argument invalid!") - try: - df = df_transform(data_input) - except Exception as err: - raise HTTPException(status_code=500, detail=f"Exception: {err}") model = get_model(model_number) - result = model.extract_keywords(df['content'].tolist(), + result = model.extract_keywords(data_input.titles, + data_input.contents, stop_words = parameter.stop_words if parameter.stop_words else [], top_k = parameter.top_k, diversity = parameter.diversity, diff --git a/keyword_extractor/mmr.py b/keyword_extractor/mmr.py index bc4f0e8..5d55f55 100644 --- a/keyword_extractor/mmr.py +++ b/keyword_extractor/mmr.py @@ -1,15 +1,18 @@ import numpy as np -from typing import List, Tuple +from typing import List, Tuple, Union +from konlpy.tag import Mecab, Okt from sklearn.metrics.pairwise import cosine_similarity def mmr( doc_embedding, word_embedding, words, + stop_words: Union[str, List[str]] = [], top_k: int = 5, diversity: float = 0.7, + tag_type: str = "okt", ) -> List[Tuple[str, float]]: """Maximal Marginal Relevance @@ -22,6 +25,8 @@ def mmr( Embedding of words words: Words to extract keywords + stop_words: + Stop words for vectorizer top_k: Number of keywords to extract diversity: @@ -36,20 +41,62 @@ def mmr( word_doc_sim = cosine_similarity(word_embedding, doc_embedding) word_sim = cosine_similarity(word_embedding) + keywords = [] keywords_idx = [np.argmax(word_doc_sim)] candidate_idx = [i for i in range(len(words)) if i != keywords_idx[0]] - for _ in range(min(top_k-1, len(words)-1)): + while len(keywords) < min(top_k, len(words)): candidate_sim = word_doc_sim[candidate_idx, :] target_sim = np.max(word_sim[candidate_idx][:, keywords_idx], axis=1) mmr = (1-diversity) * candidate_sim - diversity * target_sim.reshape(-1, 1) mmr_idx = candidate_idx[np.argmax(mmr)] - keywords_idx.append(mmr_idx) - candidate_idx.remove(mmr_idx) + post_processed_keyword = post_processing(words[mmr_idx], + tag_type=tag_type) + if post_processed_keyword != "" and post_processed_keyword not in stop_words and post_processed_keyword not in [k[0] for k in keywords]: + keywords.append((post_processed_keyword, round(float(word_doc_sim.reshape(1, -1)[0][mmr_idx]), 3))) + candidate_idx.remove(mmr_idx) + else: + candidate_idx.remove(mmr_idx) - keywords = [(words[idx], round(float(word_doc_sim.reshape(1, -1)[0][idx]), 3)) for idx in keywords_idx] + # keywords = [(words[idx], round(float(word_doc_sim.reshape(1, -1)[0][idx]), 3)) for idx in keywords_idx] keywords = sorted(keywords, key=lambda x: x[1], reverse=True) - return keywords \ No newline at end of file + return keywords + +def post_processing(keyword: str, + tag_type:str = None, + ) -> str: + """Post-processing for extracted keywords + + 추출된 키워드의 오른쪽 경계의 품사를 확인하고, 명사가 아니면 차례로 제거 + + Args: + keyword: + Keyword to post-process + tag_type: + Tagger type for post-processing + + Returns: + processd keyword: + "processed keyword" + """ + assert tag_type is not None, "tag_type을 입력해주세요." + + + if tag_type == "mecab": + tagger = Mecab() + elif tag_type == "okt": + tagger = Okt() + + ap = tagger.pos(keyword) + + while len(ap) != 0 and "N" != ap[-1][1][0]: # 맨 우측에서부터 명사가 아닌 것을 제거 + ap.pop() + + keyword = "".join([a[0] for a in ap]) + + processed_keyword = keyword + + return processed_keyword \ No newline at end of file diff --git a/keyword_extractor/model.py b/keyword_extractor/model.py index 75755e3..d4c0b41 100644 --- a/keyword_extractor/model.py +++ b/keyword_extractor/model.py @@ -27,6 +27,7 @@ def __init__(self, model_name="sentence-transformers/paraphrase-multilingual-mpn self.model = SentenceTransformer(model_name) def extract_keywords(self, + titles: Union[str, List[str]], docs: Union[str, List[str]], keyphrase_ngram_range: Tuple[int, int]=(1, 1), stop_words:Union[str, List[str]] = [], @@ -43,6 +44,8 @@ def extract_keywords(self, 추출된 후보 키워드를 Sentence-BERT를 이용해서 문서와의 유사도(MMR)를 계산 Args: + titles: + Titles to extract keywords docs: Documents to extract keywords keyphrase_ngram_range: @@ -74,6 +77,18 @@ def extract_keywords(self, else: return [] + if isinstance(titles, str): + if titles: + titles = [titles] + else: + return [] + + if isinstance(stop_words, str): + if stop_words: + stop_words = [stop_words] + else: + stop_words = [] + # Count Vectorizer if vectorizer_type == "count": vectorizer = CountVectorizer(ngram_range=keyphrase_ngram_range, min_df=min_df, stop_words=stop_words).fit(docs) @@ -102,55 +117,13 @@ def extract_keywords(self, keywords = mmr(doc_emb, candidate_emb, candidate_words, + stop_words, top_k, - diversity) + diversity, + tag_type) - keywords = self.post_processing(keywords, tag_type, stop_words) + # keywords = self.post_processing(keywords, tag_type, stop_words) all_keywords.append(keywords) - return all_keywords - - - def post_processing(self, - keywords, - tag_type:str = None, - stop_words:Union[str, List[str]] = [], - ) -> List[Tuple[str, float]]: - """Post-processing for extracted keywords - - 추출된 키워드의 오른쪽 경계의 품사를 확인하고, 명사가 아니면 차례로 제거 - - Args: - keywords: - Keywords to post-process - tag_type: - Tagger type for post-processing - stop_words: - Stop words for post-processing - - Returns: - List of keywords and scores: - [("keyword1", score1), ("keyword2", score2), ...] - """ - assert tag_type is not None, "tag_type을 입력해주세요." - - processed_keywords = [] - - if tag_type == "mecab": - tagger = Mecab() - elif tag_type == "okt": - tagger = Okt() - - for word, score in keywords: - ap = tagger.pos(word) - - while len(ap) != 0 and "N" != ap[-1][1][0]: # 맨 우측에서부터 명사가 아닌 것을 제거 - ap.pop() - - keyword = "".join([a[0] for a in ap]) - - if keyword and (keyword not in stop_words): # 키워드가 남아있으면, 추가 - processed_keywords.append((keyword, score)) - - return processed_keywords \ No newline at end of file + return all_keywords \ No newline at end of file From a91f538baf1a5422123e574ecce162d95d8b49a1 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Tue, 25 Jul 2023 16:26:37 +0900 Subject: [PATCH 46/63] [Feature] Edit model parameter - Add `temperature` option. - Edit `prompt` more better perfomence. --- Backend/Summarization/summe/app/models/prediction.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Backend/Summarization/summe/app/models/prediction.py b/Backend/Summarization/summe/app/models/prediction.py index 087bb0a..d4b6a31 100644 --- a/Backend/Summarization/summe/app/models/prediction.py +++ b/Backend/Summarization/summe/app/models/prediction.py @@ -1,5 +1,4 @@ -import numpy as np -from typing import List, Dict, Union +from typing import List, Dict from pydantic import BaseModel @@ -18,7 +17,7 @@ class SummerizedResponse(BaseModel): class TextDataInput(BaseModel): - prompt: str = "아래의 뉴스를 사실에 입각하여 맥락의 내용을 요약해줘." + prompt: str = "아래의 뉴스를 사실에 입각하여 거짓된 내용 없이 맥락의 내용을 요약해줘." title: str = "" contents: str = "" num_split: int = 5 @@ -30,6 +29,7 @@ class TextDataInput(BaseModel): "no_repeat_ngram_size": 8, "top_k": 50, "top_p": 0.98, + "temperature": 0.1, } def get_all_info(self): From d5acea48a12eb8a2be760c71c91f147b0e36c7e4 Mon Sep 17 00:00:00 2001 From: Yungi Date: Tue, 25 Jul 2023 17:18:31 +0900 Subject: [PATCH 47/63] [Fix] Add ValueError Exception Try, Etc. [mmr.py] - Add ValueError when candidate_idx is Empty [model.py] - Add titles Param default Value --- keyword_extractor/mmr.py | 7 ++++++- keyword_extractor/model.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/keyword_extractor/mmr.py b/keyword_extractor/mmr.py index 5d55f55..6c23704 100644 --- a/keyword_extractor/mmr.py +++ b/keyword_extractor/mmr.py @@ -50,7 +50,12 @@ def mmr( target_sim = np.max(word_sim[candidate_idx][:, keywords_idx], axis=1) mmr = (1-diversity) * candidate_sim - diversity * target_sim.reshape(-1, 1) - mmr_idx = candidate_idx[np.argmax(mmr)] + # 짧은 기사에서 candidate_idx가 모두 지워지는 경우 에러 처리 + try: + mmr_idx = candidate_idx[np.argmax(mmr)] + except ValueError: + print("Raise ValueError: mmr_idx") + break post_processed_keyword = post_processing(words[mmr_idx], tag_type=tag_type) diff --git a/keyword_extractor/model.py b/keyword_extractor/model.py index d4c0b41..6c4c40b 100644 --- a/keyword_extractor/model.py +++ b/keyword_extractor/model.py @@ -27,8 +27,8 @@ def __init__(self, model_name="sentence-transformers/paraphrase-multilingual-mpn self.model = SentenceTransformer(model_name) def extract_keywords(self, - titles: Union[str, List[str]], docs: Union[str, List[str]], + titles: Union[str, List[str]] = None, keyphrase_ngram_range: Tuple[int, int]=(1, 1), stop_words:Union[str, List[str]] = [], top_k:int = 5, From 4ec806c9927735c936b4b072a01948ec9eff36e0 Mon Sep 17 00:00:00 2001 From: limha Date: Tue, 25 Jul 2023 17:30:24 +0000 Subject: [PATCH 48/63] [Feature] preprocessing data["labels"] MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit modified: sentence-sentimental/train.ipynb - chat gpt에서 분류해서 dataframe["labels"]에 들어가는 부분을 전처리 했다. - json 형태로 바꾸기 - json 형태로 가공하기 어려운 상태이거나 오류인 상태의 row는 제거 --- sentence-sentimental/train.py | 193 +++++++++++++++++----------------- 1 file changed, 95 insertions(+), 98 deletions(-) diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py index 9f863f9..3135c58 100644 --- a/sentence-sentimental/train.py +++ b/sentence-sentimental/train.py @@ -5,9 +5,11 @@ import numpy as np import wandb +from transformers import AutoModel from transformers import AutoModelForSequenceClassification, AutoTokenizer from transformers import TrainingArguments, Trainer from transformers import pipeline +from transformers import DebertaV2ForSequenceClassification from dataset.datasets import SentimentalDataset from metrics.metrics import compute_metrics @@ -16,125 +18,105 @@ from sklearn.model_selection import train_test_split from utils.utils import config_seed + +import json +import re ''' - git clone https://github.com/ukairia777/finance_sentiment_corpus.git 먼저 실행 - readme.md 작성 예정 ''' def train() : - ## 설정 + # 설정 SEED = 42 config_seed(SEED) device = torch.device("cuda" if torch.cuda.is_available() else 'cpu') - ## 모델 + # 모델 MODEL_NAME = 'klue/roberta-large' model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device) tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) + special_tokens_dict = {'additional_special_tokens': ['[COMPANY]','[/COMPANY]']} + num_added_toks = tokenizer.add_special_tokens(special_tokens_dict) + model.resize_token_embeddings(len(tokenizer)) - - ## 데이터 - data = pd.read_csv('/opt/ml/finance_sentiment_corpus/merged_samsung_filtered.csv') - def extract_label(json_str): - data_dict = eval(json_str) # JSON 문자열을 파이썬 딕셔너리로 변환 - return data_dict["label"] - # "label" 값을 추출하여 새로운 Series 생성 - - temp = train_test_split(data['content_corpus'], data['labels'], - test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리 - random_state=SEED) - - sentence_train, sentence_val, label_train, label_val = temp - - max_length=200 - stride=10 - ## TODO 임의의 값으로 차후 수정 - train_encoding = tokenizer(sentence_train.tolist(), ## pandas.Series -> list - return_tensors='pt', - padding=True, - truncation=True, - ## - max_length=max_length, - stride=stride, - return_overflowing_tokens=True, - return_offsets_mapping=False - ) + # 데이터 + data = pd.read_csv("/opt/ml/finance_sentiment_corpus/merged/merged_all.csv") - val_encoding = tokenizer(sentence_val.tolist(), - return_tensors='pt', - padding=True, - truncation=True, - ## - max_length=max_length, - stride=stride, - return_overflowing_tokens=True, - return_offsets_mapping=False - ) + # 오류로 라벨링이 되어있지 않은 row를 제거 + def remove_idx_row(data) : + patterns = [r'idx\s*:?\s*.+?', r'라벨링\s*:?\s*.+?'] + + for pattern in patterns : + mask = data['labels'].str.match(pattern) + data = data.drop(data[mask].index) - train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True)) - val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True)) + return data - ## 학습 - training_args = TrainingArguments( - output_dir = './outputs', - logging_steps = 50, - num_train_epochs = 2, - per_device_train_batch_size=8, - per_device_eval_batch_size=8, - learning_rate = 5e-6, - fp16=True, - report_to="wandb", - ) - - trainer = Trainer( - model=model, - args=training_args, - train_dataset=train_set, - eval_dataset=val_set, - compute_metrics=compute_metrics - ) - - print('---train start---') - trainer.train() + # ['labels'] 전처리 + def preprocessing_label(json_str) : + json_str = re.sub(r"^.*### 출력\s?:?\s?\n?\s?", "", str(json_str)) + # json_str= json_str.replace("\"", "'") + json_str = json_str.replace("'", "\\'") # python interpreter에서 한번, json에서 한번 + + return json_str + + # title과 content_corpus에서 원하는 문장 추출 + # TODO: 가장 적잘한 값으로 수정 + def extract_sentences(text): + sentences = text.split('. ') + if len(sentences) >= 5 : + return '. '.join([sentences[0], sentences[1], sentences[-2], sentences[-1]]) + else : + return '. '+text + # json 형태로 되어있지 않은 형태를 최대한 json 형태로 바꿔주고 label 추출 + def extract_label(json_str) : + json_str = json_str.replace("'", "\"") + try: + json_data = json.loads(json_str) + + except json.JSONDecodeError as e: + if json_str[-2:] == '.}' : + json_str = json_str[:-2] + ".\"}" + elif json_str[-1] == "\"" : + json_str = json_str + "}" + else: + json_str += "\"}" + + # 마지막에도 되지 않으면 None으로 처리 + try: + data_dict = json.loads(json_str) + except json.JSONDecodeError as e: + return None + + return data_dict["label"] + data = remove_idx_row(data) + data["labels"] = data["labels"].apply(preprocessing_label) + data['labels'] = data["labels"].apply(extract_label) + data['content_corpus_company'] = data.apply(lambda row: '이 기사는 [COMPANY]'+ str(row["company"]) +'[/COMPANY]에 대한 기사. [SEP]'+ extract_sentences(row['title']) + ' ' + extract_sentences(row['content_corpus']), axis=1) #TODO: 학습에 들어가는 부분이기 때문에 조정 필수 + data['labels'] = data['labels'].map({'부정':0, '긍정':1}) + data = data[["title", "date", "content_corpus", "labels", "content_corpus_company"]] + data = data[data['labels'].notna()] # 최후에 처리 되지 않은 None row 제거 -def sweep_train(config=None) : - ## wandB - run = wandb.init(config=config) - config = wandb.config - run.name = f"model: klue/roberta-large' / batch_size: {config.batch_size} / lr: {config.lr} / warmup: {config.warmup_step}" - ## 설정 - SEED = 42 - config_seed(SEED) - device = torch.device("cuda" if torch.cuda.is_available() else 'cpu') + # "labels" 값을 추출하여 새로운 Series 생성 + dataset = train_test_split(data['content_corpus_company'], data['labels'], + test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리 + random_state=SEED) - ## 모델 - MODEL_NAME = 'klue/roberta-large' - model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device) - tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) - - ## 데이터 - data = pd.read_csv('/opt/ml/finance_sentiment_corpus/merged_samsung_filtered.csv') - def extract_label(json_str): - data_dict = eval(json_str) # JSON 문자열을 파이썬 딕셔너리로 변환 - return data_dict["label"] - # "label" 값을 추출하여 새로운 Series 생성 + sentence_train, sentence_val, label_train, label_val = dataset - temp = train_test_split(data['content_corpus'], data['labels'], - test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리 - random_state=SEED) - - sentence_train, sentence_val, label_train, label_val = temp - max_length=200 - stride=10 - ## TODO 임의의 값으로 차후 수정 - train_encoding = tokenizer(sentence_train.tolist(), ## pandas.Series -> list + max_length=500 + stride=0 + + # TODO 임의의 값으로 차후 수정 + train_encoding = tokenizer(sentence_train.tolist(), # pandas.Series -> list return_tensors='pt', padding=True, truncation=True, @@ -159,14 +141,24 @@ def extract_label(json_str): train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True)) val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True)) - ## 학습 + + # 학습 + # run = wandb.init(project="final_sentimental", entity="nlp-10") + # run.name = f"model: {MODEL_NAME} / batch_size: {per_device_train_batch_size} / lr: {learning_rate}" + logging_steps = 200 + num_train_epochs = 3 + per_device_train_batch_size = 4 + per_device_eval_batch_size = 4 + learning_rate = 5e-6 + training_args = TrainingArguments( output_dir = './outputs', - logging_steps = 50, - num_train_epochs = 2, - per_device_train_batch_size=8, - per_device_eval_batch_size=8, - learning_rate = 5e-6, + logging_steps = logging_steps, + num_train_epochs = num_train_epochs, + per_device_train_batch_size = per_device_train_batch_size, + per_device_eval_batch_size = per_device_eval_batch_size, + learning_rate = learning_rate, + evaluation_strategy="epoch", fp16=True, report_to="wandb", ) @@ -181,6 +173,11 @@ def extract_label(json_str): print('---train start---') trainer.train() + # wandb.finish() + + +def sweep_train(config=None) : + return if __name__ == '__main__': train() From 408ee82053c48e0eda7ba275744b3d1d63523c80 Mon Sep 17 00:00:00 2001 From: lig96 Date: Tue, 25 Jul 2023 19:08:04 +0000 Subject: [PATCH 49/63] [Feature] Add wandb sweep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - train 함수를 살짝 변형해서 sweep을 돌립니다. - 코드 리팩토링은 필요합니다. --- sentence-sentimental/train.py | 169 +++++++++++++++++++++++++++++++++- 1 file changed, 167 insertions(+), 2 deletions(-) diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py index 3135c58..e7f6a51 100644 --- a/sentence-sentimental/train.py +++ b/sentence-sentimental/train.py @@ -177,7 +177,172 @@ def extract_label(json_str) : def sweep_train(config=None) : - return + ## wandb + run = wandb.init(config=wandb.config) + run.name = f"max_length: {wandb.config.max_length}" + + # 설정 + SEED = 42 + config_seed(SEED) + device = torch.device("cuda" if torch.cuda.is_available() else 'cpu') + + + # 모델 + MODEL_NAME = 'klue/roberta-large' + model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device) + tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) + + special_tokens_dict = {'additional_special_tokens': ['[COMPANY]','[/COMPANY]']} + num_added_toks = tokenizer.add_special_tokens(special_tokens_dict) + model.resize_token_embeddings(len(tokenizer)) + + + # 데이터 + data = pd.read_csv("/opt/ml/finance_sentiment_corpus/merged/merged_all.csv") + + # 오류로 라벨링이 되어있지 않은 row를 제거 + def remove_idx_row(data) : + patterns = [r'idx\s*:?\s*.+?', r'라벨링\s*:?\s*.+?'] + + for pattern in patterns : + mask = data['labels'].str.match(pattern) + data = data.drop(data[mask].index) + + return data + + # ['labels'] 전처리 + def preprocessing_label(json_str) : + json_str = re.sub(r"^.*### 출력\s?:?\s?\n?\s?", "", str(json_str)) + # json_str= json_str.replace("\"", "'") + json_str = json_str.replace("'", "\\'") # python interpreter에서 한번, json에서 한번 + + return json_str + + # title과 content_corpus에서 원하는 문장 추출 + # TODO: 가장 적잘한 값으로 수정 + def extract_sentences(text): + sentences = text.split('. ') + if len(sentences) >= 5 : + return '. '.join([sentences[0], sentences[1], sentences[-2], sentences[-1]]) + else : + return '. '+text + + # json 형태로 되어있지 않은 형태를 최대한 json 형태로 바꿔주고 label 추출 + def extract_label(json_str) : + json_str = json_str.replace("'", "\"") + try: + json_data = json.loads(json_str) + + except json.JSONDecodeError as e: + if json_str[-2:] == '.}' : + json_str = json_str[:-2] + ".\"}" + elif json_str[-1] == "\"" : + json_str = json_str + "}" + else: + json_str += "\"}" + + # 마지막에도 되지 않으면 None으로 처리 + try: + data_dict = json.loads(json_str) + except json.JSONDecodeError as e: + return None + + return data_dict["label"] + + data = remove_idx_row(data) + data["labels"] = data["labels"].apply(preprocessing_label) + data['labels'] = data["labels"].apply(extract_label) + data['content_corpus_company'] = data.apply(lambda row: '이 기사는 [COMPANY]'+ str(row["company"]) +'[/COMPANY]에 대한 기사. [SEP]'+ extract_sentences(row['title']) + ' ' + extract_sentences(row['content_corpus']), axis=1) #TODO: 학습에 들어가는 부분이기 때문에 조정 필수 + data['labels'] = data['labels'].map({'부정':0, '긍정':1}) + data = data[["title", "date", "content_corpus", "labels", "content_corpus_company"]] + data = data[data['labels'].notna()] # 최후에 처리 되지 않은 None row 제거 + + + # "labels" 값을 추출하여 새로운 Series 생성 + dataset = train_test_split(data['content_corpus_company'], data['labels'], + test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리 + random_state=SEED) + + + sentence_train, sentence_val, label_train, label_val = dataset + + + max_length=wandb.config.max_length #원본:500 + stride=0 + + # TODO 임의의 값으로 차후 수정 + train_encoding = tokenizer(sentence_train.tolist(), # pandas.Series -> list + return_tensors='pt', + padding=True, + truncation=True, + ## + max_length=max_length, + stride=stride, + return_overflowing_tokens=True, + return_offsets_mapping=False + ) + + val_encoding = tokenizer(sentence_val.tolist(), + return_tensors='pt', + padding=True, + truncation=True, + ## + max_length=max_length, + stride=stride, + return_overflowing_tokens=True, + return_offsets_mapping=False + ) + + train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True)) + val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True)) + + + # 학습 + # run = wandb.init(project="final_sentimental", entity="nlp-10") + # run.name = f"model: {MODEL_NAME} / batch_size: {per_device_train_batch_size} / lr: {learning_rate}" + logging_steps = 200 + num_train_epochs = 3 + per_device_train_batch_size = 4 + per_device_eval_batch_size = 4 + learning_rate = 5e-6 + + training_args = TrainingArguments( + output_dir = './outputs', + logging_steps = logging_steps, + num_train_epochs = num_train_epochs, + per_device_train_batch_size = per_device_train_batch_size, + per_device_eval_batch_size = per_device_eval_batch_size, + learning_rate = learning_rate, + evaluation_strategy="epoch", + fp16=True, + report_to="wandb", + ) + + trainer = Trainer( + model=model, + args=training_args, + train_dataset=train_set, + eval_dataset=val_set, + compute_metrics=compute_metrics + ) + + print('---train start---') + trainer.train() + # wandb.finish() if __name__ == '__main__': - train() + do_train = False + if do_train: + train() + else: + wandb_config = { + 'method': 'grid', + 'parameters': + { + 'max_length': {'values' : [500, 250]}, + } + } + sweep_id = wandb.sweep(sweep=wandb_config, + project='sweep_merged_all' + ) + wandb.agent(sweep_id, function=sweep_train) \ No newline at end of file From a9446776edaf85cfe742500c5eb559f7df430fb5 Mon Sep 17 00:00:00 2001 From: Yungi Date: Wed, 26 Jul 2023 11:39:50 +0900 Subject: [PATCH 50/63] [Refactor] Add Model Serving Param Keyword --- Backend/Keyword Extraction/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Backend/Keyword Extraction/main.py b/Backend/Keyword Extraction/main.py index 8edf6b2..256fca5 100644 --- a/Backend/Keyword Extraction/main.py +++ b/Backend/Keyword Extraction/main.py @@ -70,8 +70,8 @@ async def keywordExtraction(model_number: str, data_input: Item, parameter: Para model = get_model(model_number) - result = model.extract_keywords(data_input.titles, - data_input.contents, + result = model.extract_keywords(docs=data_input.contents, + titles=data_input.titles, stop_words = parameter.stop_words if parameter.stop_words else [], top_k = parameter.top_k, diversity = parameter.diversity, From 6abcf505d5e871de67adada667b61dafd2439cf5 Mon Sep 17 00:00:00 2001 From: Yungi Date: Wed, 26 Jul 2023 11:46:37 +0900 Subject: [PATCH 51/63] [Refactor] Remove Secret Module import --- Backend/Keyword Extraction/main.py | 1 - 1 file changed, 1 deletion(-) diff --git a/Backend/Keyword Extraction/main.py b/Backend/Keyword Extraction/main.py index 256fca5..8be5637 100644 --- a/Backend/Keyword Extraction/main.py +++ b/Backend/Keyword Extraction/main.py @@ -18,7 +18,6 @@ sys.path.append(str(Path.home().joinpath("level3_nlp_finalproject-nlp-04"))) from keyword_extractor.model import KeyBert -from utils.secrets import Secrets app = FastAPI() tz = pendulum.timezone("Asia/Seoul") From 2c9bcecae34898d3e0acf8d99d66386ba3de4377 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Wed, 26 Jul 2023 13:09:21 +0900 Subject: [PATCH 52/63] [Feature] Create util backend - Create stock API. - Insert stock price info to DB. - For more information, check docs. --- Backend/Util/README.md | 26 ++++++++++++ Backend/Util/app/main.py | 61 ++++++++++++++++++++++++++++ Backend/Util/app/payload/__init__.py | 1 + Backend/Util/app/payload/stock.py | 10 +++++ 4 files changed, 98 insertions(+) create mode 100644 Backend/Util/README.md create mode 100644 Backend/Util/app/main.py create mode 100644 Backend/Util/app/payload/__init__.py create mode 100644 Backend/Util/app/payload/stock.py diff --git a/Backend/Util/README.md b/Backend/Util/README.md new file mode 100644 index 0000000..d13bfeb --- /dev/null +++ b/Backend/Util/README.md @@ -0,0 +1,26 @@ +# 🛠️ Util +## 개요 +모델 서빙 이외의 필요한 API를 호출할수 있는 프로젝트 입니다. + +## 🚀 실행 방법 +다음의 환경 변수를 설정해 주셔야 합니다. +``` +export SUPABASE_URL=URL +export SUPABASE_KEY=KEY +``` + +다음의 코드를 이용하여 필수 패키지를 설치합니다. +``` +pip install uvicon +pip install fastapi +pip install supabase +pip install yfinance +pip install pandas_datareader +``` + +다음의 명령어를 이용하여 실행해주시면 됩니다. 현재 경로는 app 내에 있어야 합니다. +``` +uvicorn main:app --reload +``` + +자세한 API 설명은 `localhost:PORT/docs`를 참조하시기 바랍니다. \ No newline at end of file diff --git a/Backend/Util/app/main.py b/Backend/Util/app/main.py new file mode 100644 index 0000000..3d00483 --- /dev/null +++ b/Backend/Util/app/main.py @@ -0,0 +1,61 @@ +from payload import Stock + +import os + +from fastapi import FastAPI +from fastapi import HTTPException + +import pandas as pd +from supabase import create_client, Client + +url: str = os.environ.get("SUPABASE_URL") +key: str = os.environ.get("SUPABASE_KEY") +supabase: Client = create_client(url, key) + +from pandas_datareader import data as pdr +import yfinance as yf +yf.pdr_override() + +app = FastAPI() + +@app.get("/") +def read_root(): + """API 상태 확인용 API. + + Returns: + dict: API의 status를 반환한다. + """ + + return {"status": True} + + +@app.post("/stock/") +def read_item(stock: Stock): + """주어진 옵션을 이용하여 DB에 주가 종가를 insert 하는 API. + + Args: + stock (Stock): 주가를 받아오기 위해 사용되는 옵션. + + Raises: + HTTPException: 주어진 'option'이 올바르지 않은 경우. + + Returns: + dict: 모두 완료된 경우 결과 반환. + """ + + if stock.option == "now": + df = pdr.get_data_yahoo(stock.ticker + stock.sufix, stock.date_start, stock.date_end) + elif stock.option == "range": + df = pdr.get_data_yahoo(stock.ticker + stock.sufix, stock.date_start, stock.date_end) + else: + raise HTTPException(status_code=404, detail="'option' argument invalid! Choose 'now' or 'range'. ") + + for idx, item in df.iterrows(): + data = {"ticker": stock.ticker, "price": int(item["Close"]), "date": str(idx)} + + data, count = supabase\ + .table('price')\ + .insert(data)\ + .execute() + + return {"data": data, "count": count} diff --git a/Backend/Util/app/payload/__init__.py b/Backend/Util/app/payload/__init__.py new file mode 100644 index 0000000..afba835 --- /dev/null +++ b/Backend/Util/app/payload/__init__.py @@ -0,0 +1 @@ +from .stock import Stock \ No newline at end of file diff --git a/Backend/Util/app/payload/stock.py b/Backend/Util/app/payload/stock.py new file mode 100644 index 0000000..8b08c99 --- /dev/null +++ b/Backend/Util/app/payload/stock.py @@ -0,0 +1,10 @@ +from datetime import datetime +from pydantic import BaseModel + +class Stock(BaseModel): + ticker: str = "005930" + sufix: str = ".KS" + date_start: datetime + date_end: datetime + frequency: str = "day" + option: str = "now" From 8f620148b3a3c81a9451d4fafbe0549c1e41a80f Mon Sep 17 00:00:00 2001 From: limha Date: Wed, 26 Jul 2023 07:08:56 +0000 Subject: [PATCH 53/63] [Feature] Modulization train.py and main.py with sweep MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit modified: sentence-sentimental/main.py - sweep 구성한 sweep_train 구성 modified: sentence-sentimental/train.ipynb - 실험한 것 modified: sentence-sentimental/train.py - train.py sweep_train modified: sentence-sentimental/utils/utils.py - utils.py로 함수 옮겨서 module화 --- sentence-sentimental/main.py | 27 +- sentence-sentimental/train.ipynb | 510 +++++++++++++++------------- sentence-sentimental/train.py | 241 +------------ sentence-sentimental/utils/utils.py | 66 +++- 4 files changed, 386 insertions(+), 458 deletions(-) diff --git a/sentence-sentimental/main.py b/sentence-sentimental/main.py index 41c7d80..af3eba2 100644 --- a/sentence-sentimental/main.py +++ b/sentence-sentimental/main.py @@ -1,4 +1,27 @@ -from train import train +from train import sweep_train +import wandb +import argparse if __name__== "__main__" : - train() \ No newline at end of file + parser = argparse.ArgumentParser(description="Sentimental anlysis") + parser.add_argument("--train", type=bool, default = False) + parser.add_argument("--inference", type=bool, default = False) + args = parser.parse_args() + + wandb_config = { + 'method': 'grid', + 'parameters': + { + 'max_length': {'values' : [500, 250]}, + } + } + + if args.train : + sweep_id = wandb.sweep(sweep=wandb_config, + project='sweep_merged_all' + ) + wandb.agent(sweep_id, function=sweep_train) + + elif args.inference : + # TODO: inference 코드 구현 + pass \ No newline at end of file diff --git a/sentence-sentimental/train.ipynb b/sentence-sentimental/train.ipynb index 8273088..f992c70 100644 --- a/sentence-sentimental/train.ipynb +++ b/sentence-sentimental/train.ipynb @@ -2,9 +2,18 @@ "cells": [ { "cell_type": "code", - "execution_count": 30, + "execution_count": 2, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/opt/conda/envs/final/lib/python3.8/site-packages/tqdm/auto.py:21: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", + " from .autonotebook import tqdm as notebook_tqdm\n" + ] + } + ], "source": [ "import torch\n", "import pandas as pd\n", @@ -26,7 +35,10 @@ "from sklearn.datasets import load_iris # 샘플 데이터 로딩\n", "from sklearn.model_selection import train_test_split\n", "\n", - "from utils.utils import config_seed" + "from utils.utils import config_seed\n", + "\n", + "import json\n", + "import re" ] }, { @@ -39,7 +51,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -58,30 +70,44 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "Some weights of the model checkpoint at klue/roberta-large were not used when initializing RobertaForSequenceClassification: ['lm_head.bias', 'lm_head.layer_norm.weight', 'lm_head.dense.weight', 'lm_head.layer_norm.bias', 'lm_head.dense.bias']\n", + "Some weights of the model checkpoint at klue/roberta-large were not used when initializing RobertaForSequenceClassification: ['lm_head.layer_norm.bias', 'lm_head.dense.bias', 'lm_head.bias', 'lm_head.layer_norm.weight', 'lm_head.dense.weight']\n", "- This IS expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model trained on another task or with another architecture (e.g. initializing a BertForSequenceClassification model from a BertForPreTraining model).\n", "- This IS NOT expected if you are initializing RobertaForSequenceClassification from the checkpoint of a model that you expect to be exactly identical (initializing a BertForSequenceClassification model from a BertForSequenceClassification model).\n", - "Some weights of RobertaForSequenceClassification were not initialized from the model checkpoint at klue/roberta-large and are newly initialized: ['classifier.dense.bias', 'classifier.out_proj.bias', 'classifier.dense.weight', 'classifier.out_proj.weight']\n", + "Some weights of RobertaForSequenceClassification were not initialized from the model checkpoint at klue/roberta-large and are newly initialized: ['classifier.dense.bias', 'classifier.dense.weight', 'classifier.out_proj.weight', 'classifier.out_proj.bias']\n", "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n" ] + }, + { + "data": { + "text/plain": [ + "Embedding(32002, 1024)" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ "MODEL_NAME = 'klue/roberta-large'\n", "model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device)\n", - "tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)" + "tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME)\n", + "\n", + "special_tokens_dict = {'additional_special_tokens': ['[COMPANY]','[/COMPANY]']}\n", + "num_added_toks = tokenizer.add_special_tokens(special_tokens_dict)\n", + "model.resize_token_embeddings(len(tokenizer))" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -109,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -134,7 +160,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 122, "metadata": {}, "outputs": [ { @@ -158,108 +184,178 @@ " \n", " \n", " \n", - " Unnamed: 0.3\n", - " Unnamed: 0.2\n", - " Unnamed: 0.1\n", - " Unnamed: 0\n", + " company\n", " title\n", " date\n", - " content\n", " content_corpus\n", - " content_len\n", - " content_corpus_len\n", " labels\n", - " new_column\n", " \n", " \n", " \n", " \n", " 0\n", - " 0\n", - " 0\n", - " 0\n", - " 0\n", + " 삼성전자\n", " 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ...\n", " 2023.07.10 15:29\n", " 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...\n", - " 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...\n", - " 1813\n", - " 1651\n", - " 1\n", - " . 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 챗...\n", + " {\"label\": \"긍정\", \"reason\": \"전력효율성 개선을 위한 솔루션 개발...\n", " \n", " \n", " 1\n", - " 2\n", - " 2\n", - " 2\n", - " 2\n", + " 삼성전자\n", " “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연\n", " 2023.07.10 15:07\n", " 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...\n", - " 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...\n", - " 1749\n", - " 1698\n", - " 0\n", - " . “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 삼성 가전제품 구매고...\n", + " {\"label\": \"부정\", \"reason\": \"삼성전자 멤버십 플랜 신규 고객 모...\n", " \n", " \n", " 2\n", - " 3\n", - " 3\n", - " 3\n", - " 3\n", + " 삼성전자\n", " SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급\n", " 2023.07.10 15:05\n", - " 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (...\n", " 해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리...\n", - " 547\n", - " 476\n", - " 1\n", - " . SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 해외 가전 브랜드 공...\n", + " {\"label\": \"긍정\", \"reason\": \"해외 가전 브랜드들을 공략하며 전 ...\n", " \n", " \n", " 3\n", - " 4\n", - " 4\n", - " 4\n", - " 4\n", + " 삼성전자\n", " ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파\n", " 2023.07.10 14:58\n", " 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...\n", - " 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...\n", - " 1096\n", - " 1029\n", - " 1\n", - " . ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 북미·유럽 등...\n", + " {\"label\": \"긍정\", \"reason\": \"오디세이 OLED G9의 글로벌 예...\n", " \n", " \n", " 4\n", - " 5\n", - " 5\n", - " 5\n", - " 5\n", + " 삼성전자\n", " 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다\n", " 2023.07.10 14:48\n", " 29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상...\n", - " 29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상...\n", - " 1759\n", - " 1659\n", - " 1\n", - " . 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 29년간 3만6558편...\n", + " {\"label\": \"긍정\", \"reason\": \"삼성휴먼테크논문대상이 올해로 시행 ...\n", " \n", " \n", "\n", "
" ], "text/plain": [ - " Unnamed: 0.3 Unnamed: 0.2 Unnamed: 0.1 Unnamed: 0 \\\n", - "0 0 0 0 0 \n", - "1 2 2 2 2 \n", - "2 3 3 3 3 \n", - "3 4 4 4 4 \n", - "4 5 5 5 5 \n", + " company title date \\\n", + "0 삼성전자 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 2023.07.10 15:29 \n", + "1 삼성전자 “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 2023.07.10 15:07 \n", + "2 삼성전자 SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 2023.07.10 15:05 \n", + "3 삼성전자 ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 2023.07.10 14:58 \n", + "4 삼성전자 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 2023.07.10 14:48 \n", "\n", + " content_corpus \\\n", + "0 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... \n", + "1 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... \n", + "2 해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리... \n", + "3 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... \n", + "4 29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상... \n", + "\n", + " labels \n", + "0 {\"label\": \"긍정\", \"reason\": \"전력효율성 개선을 위한 솔루션 개발... \n", + "1 {\"label\": \"부정\", \"reason\": \"삼성전자 멤버십 플랜 신규 고객 모... \n", + "2 {\"label\": \"긍정\", \"reason\": \"해외 가전 브랜드들을 공략하며 전 ... \n", + "3 {\"label\": \"긍정\", \"reason\": \"오디세이 OLED G9의 글로벌 예... \n", + "4 {\"label\": \"긍정\", \"reason\": \"삼성휴먼테크논문대상이 올해로 시행 ... " + ] + }, + "execution_count": 122, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data = pd.read_csv(\"/opt/ml/finance_sentiment_corpus/merged/merged_all.csv\")\n", + "data.head()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "(3778, 5)\n", + "(3777, 5)\n" + ] + }, + { + "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", + "
titledatecontent_corpuslabelscontent_corpus_company
0데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ...2023.07.10 15:29챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개...1.0이 기사는 [COMPANY]삼성전자[/COMPANY]에 대한 기사. [SEP]. 데...
1“삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연2023.07.10 15:07삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ...0.0이 기사는 [COMPANY]삼성전자[/COMPANY]에 대한 기사. [SEP]. “...
2SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급2023.07.10 15:05해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리...1.0이 기사는 [COMPANY]삼성전자[/COMPANY]에 대한 기사. [SEP]. S...
3‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파2023.07.10 14:58북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연...1.0이 기사는 [COMPANY]삼성전자[/COMPANY]에 대한 기사. [SEP]. ‘...
4네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다2023.07.10 14:4829년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상...1.0이 기사는 [COMPANY]삼성전자[/COMPANY]에 대한 기사. [SEP]. 네...
\n", + "
" + ], + "text/plain": [ " title date \\\n", "0 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 2023.07.10 15:29 \n", "1 “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 2023.07.10 15:07 \n", @@ -267,44 +363,39 @@ "3 ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 2023.07.10 14:58 \n", "4 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 2023.07.10 14:48 \n", "\n", - " content \\\n", - "0 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... \n", - "1 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... \n", - "2 해외 가전 브랜드 공략…B2B 사업 확장[서울=뉴시스] SGC솔루션 논산 공장. (... \n", - "3 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... \n", - "4 29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상... \n", + " content_corpus labels \\\n", + "0 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... 1.0 \n", + "1 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... 0.0 \n", + "2 해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리... 1.0 \n", + "3 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... 1.0 \n", + "4 29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상... 1.0 \n", "\n", - " content_corpus content_len \\\n", - "0 챗GPT 시대 화두로 떠오른 전력효율성 문제 ”전력 먹는 하마, D램 전력효율성 개... 1813 \n", - "1 삼성 가전제품 구매고객에 삼성닷컴 내 e-식품관에서 할인혜택 주며 ‘락인’ 기대 ... 1749 \n", - "2 해외 가전 브랜드 공략…B2B 사업 확장 SGC솔루션 논산 공장. . 생활유리... 547 \n", - "3 북미·유럽 등 예약 판매 3000대 돌파 10일 오후 6시 삼성닷컴 ‘페이커’ 출연... 1096 \n", - "4 29년간 3만6558편 논문 접수…수상자 5312명 9월1일부터 올해 대상 접수…상... 1759 \n", - "\n", - " content_corpus_len labels \\\n", - "0 1651 1 \n", - "1 1698 0 \n", - "2 476 1 \n", - "3 1029 1 \n", - "4 1659 1 \n", - "\n", - " new_column \n", - "0 . 데이터센터 전력 40% 차지하는 D램… 삼성·SK하이닉스, ‘전성비’ ... 챗... \n", - "1 . “삼성전자가 식품도 팔았어?”…신규 가입 일단 종료한 사연 삼성 가전제품 구매고... \n", - "2 . SGC솔루션 '도어글라스'…삼성·LG 세탁기·건조기에 공급 해외 가전 브랜드 공... \n", - "3 . ‘페이커’ 내세운 삼성 OLED 게이밍 모니터 글로벌 3천대 돌파 북미·유럽 등... \n", - "4 . 네이처 게재 등 성과…삼성휴먼테크논문대상, 30년 맞았다 29년간 3만6558편... " + " content_corpus_company \n", + "0 이 기사는 [COMPANY]삼성전자[/COMPANY]에 대한 기사. [SEP]. 데... \n", + "1 이 기사는 [COMPANY]삼성전자[/COMPANY]에 대한 기사. [SEP]. “... \n", + "2 이 기사는 [COMPANY]삼성전자[/COMPANY]에 대한 기사. [SEP]. S... \n", + "3 이 기사는 [COMPANY]삼성전자[/COMPANY]에 대한 기사. [SEP]. ‘... \n", + "4 이 기사는 [COMPANY]삼성전자[/COMPANY]에 대한 기사. [SEP]. 네... " ] }, - "execution_count": 6, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "data = pd.read_csv('/opt/ml/finance_sentiment_corpus/merged_samsung_filtered.csv')\n", - "data = pd.DataFrame(data)\n", + "data = pd.read_csv(\"/opt/ml/finance_sentiment_corpus/merged/merged_all.csv\")\n", + "# data = pd.read_csv(\"/opt/ml/finance_sentiment_corpus/merged/merged_NAVER.csv\")\n", + "\n", + "def remove_idx_row(data) : \n", + " patterns = [r'idx\\s*:?\\s*.+?', r'라벨링\\s*:?\\s*.+?']\n", + " \n", + " for pattern in patterns :\n", + " mask = data['labels'].str.match(pattern)\n", + " data = data.drop(data[mask].index)\n", "\n", + " return data\n", + " \n", "# title과 content_corpus에서 원하는 문장 추출\n", "def extract_sentences(text):\n", " sentences = text.split('. ')\n", @@ -314,13 +405,46 @@ " return '. '+text\n", " \n", "def extract_label(json_str) :\n", - " data_dict = eval(json_str) # JSON 문자열을 파이썬 딕셔너리로 변환\n", + " json_str = json_str.replace(\"'\", \"\\\"\")\n", + " try:\n", + " json_data = json.loads(json_str)\n", + "\n", + " except json.JSONDecodeError as e:\n", + " if json_str[-2:] == '.}' :\n", + " json_str = json_str[:-2] + \".\\\"}\"\n", + " elif json_str[-1] == \"\\\"\" :\n", + " json_str = json_str + \"}\"\n", + " else:\n", + " json_str += \"\\\"}\"\n", + " \n", + " try:\n", + " data_dict = json.loads(json_str)\n", + " except json.JSONDecodeError as e:\n", + " return None\n", + "\n", " return data_dict[\"label\"]\n", + " \n", + "def preprocessing_label(json_str) :\n", + " json_str = re.sub(r\"^.*### 출력\\s?:?\\s?\\n?\\s?\", \"\", str(json_str))\n", + " # json_str= json_str.replace(\"\\\"\", \"'\")\n", + " json_str = json_str.replace(\"'\", \"\\\\'\") # python interpreter에서 한번, json에서 한번\n", + " \n", + " return json_str\n", + "\n", + "data = remove_idx_row(data)\n", "\n", - "# \"label\" 값을 추출하여 새로운 Series 생성\n", + "# \"label\" column만 있다면 바꾸자.\n", + "if \"label\" in data.columns and \"labels\" not in data.columns :\n", + " data[\"labels\"] = data[\"label\"]\n", + "\n", + "data[\"labels\"] = data[\"labels\"].apply(preprocessing_label)\n", "data['labels'] = data[\"labels\"].apply(extract_label)\n", - "data['new_column'] = data.apply(lambda row: extract_sentences(row['title']) + ' ' + extract_sentences(row['content_corpus']), axis=1)\n", + "data['content_corpus_company'] = data.apply(lambda row: '이 기사는 [COMPANY]'+ str(row[\"company\"]) +'[/COMPANY]에 대한 기사. [SEP]'+ extract_sentences(row['title']) + ' ' + extract_sentences(row['content_corpus']), axis=1)\n", "data['labels'] = data['labels'].map({'부정':0, '긍정':1})\n", + "data = data[[\"title\", \"date\", \"content_corpus\", \"labels\", \"content_corpus_company\"]]\n", + "print(data.shape)\n", + "data = data[data['labels'].notna()]\n", + "print(data.shape)\n", "data.head()" ] }, @@ -334,7 +458,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -391,13 +515,11 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 7, "metadata": {}, "outputs": [], "source": [ - "# dataset = train_test_split(data['content_corpus'], data['labels'],\n", - "\n", - "dataset = train_test_split(data['new_column'], data['labels'],\n", + "dataset = train_test_split(data['content_corpus_company'], data['labels'],\n", " test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리\n", " random_state=SEED)\n", "\n", @@ -416,7 +538,7 @@ " ##\n", " max_length=max_length,\n", " stride=stride,\n", - " return_overflowing_tokens=True,\n", + " # return_overflowing_tokens=True,\n", " return_offsets_mapping=False\n", " )\n", "\n", @@ -427,7 +549,7 @@ " ##\n", " max_length=max_length,\n", " stride=stride,\n", - " return_overflowing_tokens=True,\n", + " # return_overflowing_tokens=True,\n", " return_offsets_mapping=False\n", " )\n", "\n", @@ -452,7 +574,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -465,7 +587,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 57, "metadata": {}, "outputs": [], "source": [ @@ -474,7 +596,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 131, "metadata": {}, "outputs": [ { @@ -483,8 +605,8 @@ "\n", "
\n", " \n", - " \n", - " [1095/1095 05:00, Epoch 3/3]\n", + " \n", + " [2271/2271 08:54, Epoch 3/3]\n", "
\n", " \n", " \n", @@ -500,27 +622,27 @@ " \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", "
10.4765000.2974090.9205480.9205480.8998290.3565000.3422700.9128140.9128140.893988
20.2876000.3709720.9150680.9150680.8908250.2326000.3953610.9180980.9180980.895991
30.1752000.3755220.9342470.9342470.9183630.0999000.4616850.9194190.9194190.897826

" @@ -535,10 +657,10 @@ { "data": { "text/plain": [ - "TrainOutput(global_step=1095, training_loss=0.3064597926727713, metrics={'train_runtime': 309.5533, 'train_samples_per_second': 14.149, 'train_steps_per_second': 3.537, 'total_flos': 3986190792360000.0, 'train_loss': 0.3064597926727713, 'epoch': 3.0})" + "TrainOutput(global_step=2271, training_loss=0.2475055377948447, metrics={'train_runtime': 534.9292, 'train_samples_per_second': 16.982, 'train_steps_per_second': 4.245, 'total_flos': 8267250492648000.0, 'train_loss': 0.2475055377948447, 'epoch': 3.0})" ] }, - "execution_count": 13, + "execution_count": 131, "metadata": {}, "output_type": "execute_result" } @@ -575,12 +697,12 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "# torch.save(model, \"/opt/ml/input/model-roberta_large-sota\")\n", - "trainer.save_model(\"/opt/ml/input/model-roberta_large-sota_trainer\") " + "trainer.save_model(\"/opt/ml/input/model-roberta_large-sota_trainer_company-name\") " ] }, { @@ -681,82 +803,6 @@ "# wandb.finish()" ] }, - { - "attachments": {}, - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 학습(wandb_sweep)" - ] - }, - { - "cell_type": "code", - "execution_count": 39, - "metadata": {}, - "outputs": [], - "source": [ - "sweep_config = {'name': f\"{MODEL_NAME}_1\", # name : sweep_name\n", - " 'method': 'grid', # 'grid', 'uniform', 'bayesian'\n", - " 'parameters': {\n", - " 'lr': { # parameter 작성방식 여러개 있으니까, 노션 문서 참고\n", - " 'values': [4e-6, 5e-6, 6e-6]\n", - " },\n", - " 'warmup_step': {\n", - " \"values\": [200]\n", - " },\n", - " 'logging_steps': {\n", - " \"values\": [200]\n", - " },\n", - " \"batch_size\": {\n", - " \"values\": [8]\n", - " },\n", - " \"max_epoch\": {\n", - " \"values\": [2]\n", - " },\n", - " },\n", - " # goal : maximize, minimize\n", - " 'metric': {'name': 'val1_accuracy', 'goal': 'maximize'}\n", - " }" - ] - }, - { - "cell_type": "code", - "execution_count": 40, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Train mode\n", - "Create sweep with ID: tdlke131\n", - "Sweep URL: https://wandb.ai/nlp-10/final_sentimental/sweeps/tdlke131\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "\u001b[34m\u001b[1mwandb\u001b[0m: Ctrl + C detected. Stopping sweep.\n" - ] - } - ], - "source": [ - "# import json\n", - "\n", - "# print(\"Training with sweep mode\")\n", - "\n", - "# sweep_id = wandb.sweep(json.load(open(\"/opt/ml/level3_nlp_finalproject-nlp-04/sentence-sentimental/sweep.json\", \"r\"), object_hook=_decode), project=\"final_sentimental\", entity=\"nlp-10\")\n", - "# wandb.agent(sweep_id, trainWithSweep, count=int(5))\n", - "# wandb.finish()\n", - "from train import sweep_train\n", - "\n", - "print(\"Train mode\")\n", - "sweep_id = wandb.sweep(sweep_config, project=\"final_sentimental\", entity=\"nlp-10\")\n", - "wandb.agent(sweep_id, sweep_train, count=3)\n", - "wandb.finish()" - ] - }, { "attachments": {}, "cell_type": "markdown", @@ -813,7 +859,9 @@ "output_type": "execute_result" } ], - "source": [] + "source": [ + "trainer.evaluate(eval_dataset=val_set, metric_key_prefix='val1')" + ] }, { "attachments": {}, @@ -825,35 +873,36 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 43, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "---inference start---\n" + "---inference start---\n", + "######################################\n", + "tensor([[ 3.0807, -3.1782]])\n", + "tensor([0.9981, 0.0019])\n" ] }, { - "ename": "OSError", - "evalue": "Can't load tokenizer for '/opt/ml/input/model-roberta_large-sota_trainer'. If you were trying to load it from 'https://huggingface.co/models', make sure you don't have a local directory with the same name. Otherwise, make sure '/opt/ml/input/model-roberta_large-sota_trainer' is the correct path to a directory containing all relevant files for a BertTokenizerFast tokenizer.", - "output_type": "error", - "traceback": [ - "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", - "\u001b[0;31mOSError\u001b[0m Traceback (most recent call last)", - "\u001b[1;32m/opt/ml/level3_nlp_finalproject-nlp-04/sentence-sentimental/train.ipynb Cell 31\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[39m# model = model.to('cpu')\u001b[39;00m\n\u001b[1;32m 4\u001b[0m \u001b[39m# MODEL_PATH = \"/opt/ml/input/model-roberta_large-sota_trainer/pytorch_model.bin\"\u001b[39;00m\n\u001b[1;32m 5\u001b[0m MODEL_PATH \u001b[39m=\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m/opt/ml/input/model-roberta_large-sota_trainer\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m----> 6\u001b[0m tokenizer \u001b[39m=\u001b[39m AutoTokenizer\u001b[39m.\u001b[39;49mfrom_pretrained(MODEL_PATH)\n\u001b[1;32m 7\u001b[0m \u001b[39m# tokenizer = RobertaTokenizer(MODEL_PATH)\u001b[39;00m\n\u001b[1;32m 8\u001b[0m \u001b[39m# model = RobertaForSequenceClassification(MODEL_PATH)\u001b[39;00m\n\u001b[1;32m 9\u001b[0m model \u001b[39m=\u001b[39m AutoModelForSequenceClassification\u001b[39m.\u001b[39mfrom_pretrained(MODEL_PATH)\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.8/site-packages/transformers/models/auto/tokenization_auto.py:693\u001b[0m, in \u001b[0;36mAutoTokenizer.from_pretrained\u001b[0;34m(cls, pretrained_model_name_or_path, *inputs, **kwargs)\u001b[0m\n\u001b[1;32m 689\u001b[0m \u001b[39mif\u001b[39;00m tokenizer_class \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m 690\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\n\u001b[1;32m 691\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mTokenizer class \u001b[39m\u001b[39m{\u001b[39;00mtokenizer_class_candidate\u001b[39m}\u001b[39;00m\u001b[39m does not exist or is not currently imported.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 692\u001b[0m )\n\u001b[0;32m--> 693\u001b[0m \u001b[39mreturn\u001b[39;00m tokenizer_class\u001b[39m.\u001b[39;49mfrom_pretrained(pretrained_model_name_or_path, \u001b[39m*\u001b[39;49minputs, \u001b[39m*\u001b[39;49m\u001b[39m*\u001b[39;49mkwargs)\n\u001b[1;32m 695\u001b[0m \u001b[39m# Otherwise we have to be creative.\u001b[39;00m\n\u001b[1;32m 696\u001b[0m \u001b[39m# if model is an encoder decoder, the encoder tokenizer class is used by default\u001b[39;00m\n\u001b[1;32m 697\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39misinstance\u001b[39m(config, EncoderDecoderConfig):\n", - "File \u001b[0;32m/opt/conda/envs/final/lib/python3.8/site-packages/transformers/tokenization_utils_base.py:1796\u001b[0m, in \u001b[0;36mPreTrainedTokenizerBase.from_pretrained\u001b[0;34m(cls, pretrained_model_name_or_path, *init_inputs, **kwargs)\u001b[0m\n\u001b[1;32m 1790\u001b[0m logger\u001b[39m.\u001b[39minfo(\n\u001b[1;32m 1791\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mCan\u001b[39m\u001b[39m'\u001b[39m\u001b[39mt load following files from cache: \u001b[39m\u001b[39m{\u001b[39;00munresolved_files\u001b[39m}\u001b[39;00m\u001b[39m and cannot check if these \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1792\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mfiles are necessary for the tokenizer to operate.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1793\u001b[0m )\n\u001b[1;32m 1795\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mall\u001b[39m(full_file_name \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39mfor\u001b[39;00m full_file_name \u001b[39min\u001b[39;00m resolved_vocab_files\u001b[39m.\u001b[39mvalues()):\n\u001b[0;32m-> 1796\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mEnvironmentError\u001b[39;00m(\n\u001b[1;32m 1797\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mCan\u001b[39m\u001b[39m'\u001b[39m\u001b[39mt load tokenizer for \u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00mpretrained_model_name_or_path\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m\u001b[39m. If you were trying to load it from \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1798\u001b[0m \u001b[39m\"\u001b[39m\u001b[39m'\u001b[39m\u001b[39mhttps://huggingface.co/models\u001b[39m\u001b[39m'\u001b[39m\u001b[39m, make sure you don\u001b[39m\u001b[39m'\u001b[39m\u001b[39mt have a local directory with the same name. \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1799\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mOtherwise, make sure \u001b[39m\u001b[39m'\u001b[39m\u001b[39m{\u001b[39;00mpretrained_model_name_or_path\u001b[39m}\u001b[39;00m\u001b[39m'\u001b[39m\u001b[39m is the correct path to a directory \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1800\u001b[0m \u001b[39mf\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mcontaining all relevant files for a \u001b[39m\u001b[39m{\u001b[39;00m\u001b[39mcls\u001b[39m\u001b[39m.\u001b[39m\u001b[39m__name__\u001b[39m\u001b[39m}\u001b[39;00m\u001b[39m tokenizer.\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m 1801\u001b[0m )\n\u001b[1;32m 1803\u001b[0m \u001b[39mfor\u001b[39;00m file_id, file_path \u001b[39min\u001b[39;00m vocab_files\u001b[39m.\u001b[39mitems():\n\u001b[1;32m 1804\u001b[0m \u001b[39mif\u001b[39;00m file_id \u001b[39mnot\u001b[39;00m \u001b[39min\u001b[39;00m resolved_vocab_files:\n", - "\u001b[0;31mOSError\u001b[0m: Can't load tokenizer for '/opt/ml/input/model-roberta_large-sota_trainer'. If you were trying to load it from 'https://huggingface.co/models', make sure you don't have a local directory with the same name. Otherwise, make sure '/opt/ml/input/model-roberta_large-sota_trainer' is the correct path to a directory containing all relevant files for a BertTokenizerFast tokenizer." - ] + "data": { + "text/plain": [ + "tensor([0.9981, 0.0019])" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ "print('---inference start---')\n", - "my_text = '삼성전자 진짜 무조건 오를 듯'*20\n", - "\n", - "MODEL_PATH = \"/opt/ml/input/model-roberta_large-sota_trainer\"\n", + "text = '이 기사는 [COMPANY]'+ '삼성전자' +'[/COMPANY]에 대한 기사. [SEP] \"\n", + "corpus = \"삼성전자가 테슬라와 4000억 규모의 협약이 미뤄졌다.\"\n", + "# MODEL_PATH = \"/opt/ml/input/model-roberta_large-sota_trainer\"\n", + "MODEL_PATH = \"/opt/ml/input/model-roberta_large-sota_trainer_company-name\"\n", "tokenizer = AutoTokenizer.from_pretrained(\"klue/roberta-large\")\n", "model = AutoModelForSequenceClassification.from_pretrained(MODEL_PATH)\n", "\n", @@ -885,6 +934,9 @@ " predicted_label = model(temp['input_ids'])\n", " print(predicted_label.logits)\n", " print(torch.nn.Softmax(dim=-1)(predicted_label.logits).mean(dim=0))\n", + " [20 80] => [50]\n", + " [[20, 80], [30, 70]]\n", + " \n", "\n", "torch.nn.Softmax(dim=-1)(predicted_label.logits).mean(dim=0)\n", " " @@ -901,7 +953,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -916,7 +968,9 @@ "result = torch.nn.Softmax(dim=-1)(predicted_label.logits).mean(dim=0)\n", "\n", "if result[0] > result[1] :\n", - " print(\"부정\")" + " print(\"부정\")\n", + "else :\n", + " print(\"긍정\")" ] }, { diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py index e7f6a51..fcd7175 100644 --- a/sentence-sentimental/train.py +++ b/sentence-sentimental/train.py @@ -17,7 +17,7 @@ from sklearn.datasets import load_iris # 샘플 데이터 로딩 from sklearn.model_selection import train_test_split -from utils.utils import config_seed +from utils.utils import config_seed, gpt_preprocessing_labels import json import re @@ -25,159 +25,8 @@ - git clone https://github.com/ukairia777/finance_sentiment_corpus.git 먼저 실행 - readme.md 작성 예정 ''' -def train() : - # 설정 - SEED = 42 - config_seed(SEED) - device = torch.device("cuda" if torch.cuda.is_available() else 'cpu') - - - # 모델 - MODEL_NAME = 'klue/roberta-large' - model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=2).to(device) - tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) - - special_tokens_dict = {'additional_special_tokens': ['[COMPANY]','[/COMPANY]']} - num_added_toks = tokenizer.add_special_tokens(special_tokens_dict) - model.resize_token_embeddings(len(tokenizer)) - - - # 데이터 - data = pd.read_csv("/opt/ml/finance_sentiment_corpus/merged/merged_all.csv") - - # 오류로 라벨링이 되어있지 않은 row를 제거 - def remove_idx_row(data) : - patterns = [r'idx\s*:?\s*.+?', r'라벨링\s*:?\s*.+?'] - - for pattern in patterns : - mask = data['labels'].str.match(pattern) - data = data.drop(data[mask].index) - - return data - - # ['labels'] 전처리 - def preprocessing_label(json_str) : - json_str = re.sub(r"^.*### 출력\s?:?\s?\n?\s?", "", str(json_str)) - # json_str= json_str.replace("\"", "'") - json_str = json_str.replace("'", "\\'") # python interpreter에서 한번, json에서 한번 - - return json_str - - # title과 content_corpus에서 원하는 문장 추출 - # TODO: 가장 적잘한 값으로 수정 - def extract_sentences(text): - sentences = text.split('. ') - if len(sentences) >= 5 : - return '. '.join([sentences[0], sentences[1], sentences[-2], sentences[-1]]) - else : - return '. '+text - - # json 형태로 되어있지 않은 형태를 최대한 json 형태로 바꿔주고 label 추출 - def extract_label(json_str) : - json_str = json_str.replace("'", "\"") - try: - json_data = json.loads(json_str) - - except json.JSONDecodeError as e: - if json_str[-2:] == '.}' : - json_str = json_str[:-2] + ".\"}" - elif json_str[-1] == "\"" : - json_str = json_str + "}" - else: - json_str += "\"}" - - # 마지막에도 되지 않으면 None으로 처리 - try: - data_dict = json.loads(json_str) - except json.JSONDecodeError as e: - return None - - return data_dict["label"] - - data = remove_idx_row(data) - data["labels"] = data["labels"].apply(preprocessing_label) - data['labels'] = data["labels"].apply(extract_label) - data['content_corpus_company'] = data.apply(lambda row: '이 기사는 [COMPANY]'+ str(row["company"]) +'[/COMPANY]에 대한 기사. [SEP]'+ extract_sentences(row['title']) + ' ' + extract_sentences(row['content_corpus']), axis=1) #TODO: 학습에 들어가는 부분이기 때문에 조정 필수 - data['labels'] = data['labels'].map({'부정':0, '긍정':1}) - data = data[["title", "date", "content_corpus", "labels", "content_corpus_company"]] - data = data[data['labels'].notna()] # 최후에 처리 되지 않은 None row 제거 - - - # "labels" 값을 추출하여 새로운 Series 생성 - dataset = train_test_split(data['content_corpus_company'], data['labels'], - test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리 - random_state=SEED) - - - sentence_train, sentence_val, label_train, label_val = dataset - - - max_length=500 - stride=0 - - # TODO 임의의 값으로 차후 수정 - train_encoding = tokenizer(sentence_train.tolist(), # pandas.Series -> list - return_tensors='pt', - padding=True, - truncation=True, - ## - max_length=max_length, - stride=stride, - return_overflowing_tokens=True, - return_offsets_mapping=False - ) - - val_encoding = tokenizer(sentence_val.tolist(), - return_tensors='pt', - padding=True, - truncation=True, - ## - max_length=max_length, - stride=stride, - return_overflowing_tokens=True, - return_offsets_mapping=False - ) - - train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True)) - val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True)) - - - # 학습 - # run = wandb.init(project="final_sentimental", entity="nlp-10") - # run.name = f"model: {MODEL_NAME} / batch_size: {per_device_train_batch_size} / lr: {learning_rate}" - logging_steps = 200 - num_train_epochs = 3 - per_device_train_batch_size = 4 - per_device_eval_batch_size = 4 - learning_rate = 5e-6 - - training_args = TrainingArguments( - output_dir = './outputs', - logging_steps = logging_steps, - num_train_epochs = num_train_epochs, - per_device_train_batch_size = per_device_train_batch_size, - per_device_eval_batch_size = per_device_eval_batch_size, - learning_rate = learning_rate, - evaluation_strategy="epoch", - fp16=True, - report_to="wandb", - ) - - trainer = Trainer( - model=model, - args=training_args, - train_dataset=train_set, - eval_dataset=val_set, - compute_metrics=compute_metrics - ) - - print('---train start---') - trainer.train() - # wandb.finish() - - def sweep_train(config=None) : - ## wandb + # wandb run = wandb.init(config=wandb.config) run.name = f"max_length: {wandb.config.max_length}" @@ -199,64 +48,7 @@ def sweep_train(config=None) : # 데이터 data = pd.read_csv("/opt/ml/finance_sentiment_corpus/merged/merged_all.csv") - - # 오류로 라벨링이 되어있지 않은 row를 제거 - def remove_idx_row(data) : - patterns = [r'idx\s*:?\s*.+?', r'라벨링\s*:?\s*.+?'] - - for pattern in patterns : - mask = data['labels'].str.match(pattern) - data = data.drop(data[mask].index) - - return data - - # ['labels'] 전처리 - def preprocessing_label(json_str) : - json_str = re.sub(r"^.*### 출력\s?:?\s?\n?\s?", "", str(json_str)) - # json_str= json_str.replace("\"", "'") - json_str = json_str.replace("'", "\\'") # python interpreter에서 한번, json에서 한번 - - return json_str - - # title과 content_corpus에서 원하는 문장 추출 - # TODO: 가장 적잘한 값으로 수정 - def extract_sentences(text): - sentences = text.split('. ') - if len(sentences) >= 5 : - return '. '.join([sentences[0], sentences[1], sentences[-2], sentences[-1]]) - else : - return '. '+text - - # json 형태로 되어있지 않은 형태를 최대한 json 형태로 바꿔주고 label 추출 - def extract_label(json_str) : - json_str = json_str.replace("'", "\"") - try: - json_data = json.loads(json_str) - - except json.JSONDecodeError as e: - if json_str[-2:] == '.}' : - json_str = json_str[:-2] + ".\"}" - elif json_str[-1] == "\"" : - json_str = json_str + "}" - else: - json_str += "\"}" - - # 마지막에도 되지 않으면 None으로 처리 - try: - data_dict = json.loads(json_str) - except json.JSONDecodeError as e: - return None - - return data_dict["label"] - - data = remove_idx_row(data) - data["labels"] = data["labels"].apply(preprocessing_label) - data['labels'] = data["labels"].apply(extract_label) - data['content_corpus_company'] = data.apply(lambda row: '이 기사는 [COMPANY]'+ str(row["company"]) +'[/COMPANY]에 대한 기사. [SEP]'+ extract_sentences(row['title']) + ' ' + extract_sentences(row['content_corpus']), axis=1) #TODO: 학습에 들어가는 부분이기 때문에 조정 필수 - data['labels'] = data['labels'].map({'부정':0, '긍정':1}) - data = data[["title", "date", "content_corpus", "labels", "content_corpus_company"]] - data = data[data['labels'].notna()] # 최후에 처리 되지 않은 None row 제거 - + data = gpt_preprocessing_labels(data) # gpt에서 출력한 오류들을 json 형식으로 맞춰주고 labels를 수정하는 것 # "labels" 값을 추출하여 새로운 Series 생성 dataset = train_test_split(data['content_corpus_company'], data['labels'], @@ -298,8 +90,6 @@ def extract_label(json_str) : # 학습 - # run = wandb.init(project="final_sentimental", entity="nlp-10") - # run.name = f"model: {MODEL_NAME} / batch_size: {per_device_train_batch_size} / lr: {learning_rate}" logging_steps = 200 num_train_epochs = 3 per_device_train_batch_size = 4 @@ -330,19 +120,16 @@ def extract_label(json_str) : trainer.train() # wandb.finish() + if __name__ == '__main__': - do_train = False - if do_train: - train() - else: - wandb_config = { - 'method': 'grid', - 'parameters': - { - 'max_length': {'values' : [500, 250]}, - } + wandb_config = { + 'method': 'grid', + 'parameters': + { + 'max_length': {'values' : [500, 250]}, } - sweep_id = wandb.sweep(sweep=wandb_config, - project='sweep_merged_all' - ) - wandb.agent(sweep_id, function=sweep_train) \ No newline at end of file + } + sweep_id = wandb.sweep(sweep=wandb_config, + project='sweep_merged_all' + ) + wandb.agent(sweep_id, function=sweep_train) \ No newline at end of file diff --git a/sentence-sentimental/utils/utils.py b/sentence-sentimental/utils/utils.py index 7caf61b..6cd25ea 100644 --- a/sentence-sentimental/utils/utils.py +++ b/sentence-sentimental/utils/utils.py @@ -1,9 +1,73 @@ import torch import random import numpy as np +import re +import json + def config_seed(SEED) : random.seed(SEED) np.random.seed(SEED) torch.manual_seed(SEED) - torch.cuda.manual_seed_all(SEED) \ No newline at end of file + torch.cuda.manual_seed_all(SEED) + +# 오류로 라벨링이 되어있지 않은 row를 제거 +def remove_idx_row(data) : + patterns = [r'idx\s*:?\s*.+?', r'라벨링\s*:?\s*.+?'] + + for pattern in patterns : + mask = data['labels'].str.match(pattern) + data = data.drop(data[mask].index) + + return data + +# ['labels'] 전처리 +def preprocessing_label(json_str) : + json_str = re.sub(r"^.*### 출력\s?:?\s?\n?\s?", "", str(json_str)) + # json_str= json_str.replace("\"", "'") + json_str = json_str.replace("'", "\\'") # python interpreter에서 한번, json에서 한번 + + return json_str + + +# title과 content_corpus에서 원하는 문장 추출 +# TODO: 가장 적잘한 값으로 수정 +def extract_sentences(text): + sentences = text.split('. ') + if len(sentences) >= 5 : + return '. '.join([sentences[0], sentences[1], sentences[-2], sentences[-1]]) + else : + return '. '+text + +# json 형태로 되어있지 않은 형태를 최대한 json 형태로 바꿔주고 label 추출 +def extract_label(json_str) : + json_str = json_str.replace("'", "\"") + try: + json_data = json.loads(json_str) + + except json.JSONDecodeError as e: + if json_str[-2:] == '.}' : + json_str = json_str[:-2] + ".\"}" + elif json_str[-1] == "\"" : + json_str = json_str + "}" + else: + json_str += "\"}" + + # 마지막에도 되지 않으면 None으로 처리 + try: + data_dict = json.loads(json_str) + except json.JSONDecodeError as e: + return None + + return data_dict["label"] + +def gpt_preprocessing_labels(data) : + data = remove_idx_row(data) + data["labels"] = data["labels"].apply(preprocessing_label) + data['labels'] = data["labels"].apply(extract_label) + data['content_corpus_company'] = data.apply(lambda row: '이 기사는 [COMPANY]'+ str(row["company"]) +'[/COMPANY]에 대한 기사. [SEP]'+ extract_sentences(row['title']) + ' ' + extract_sentences(row['content_corpus']), axis=1) #TODO: 학습에 들어가는 부분이기 때문에 조정 필수 + data['labels'] = data['labels'].map({'부정':0, '긍정':1}) + data = data[["title", "date", "content_corpus", "labels", "content_corpus_company"]] + data = data[data['labels'].notna()] # 최후에 처리 되지 않은 None row 제거 + + return data \ No newline at end of file From 6a894d02c3d45a55092e3b9d6e892da33b22d732 Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Wed, 26 Jul 2023 16:26:30 +0900 Subject: [PATCH 54/63] [Feature] Sync with DB modified: Frontend/deguel/src/elements/Chart.jsx - Clean code. modified: Frontend/deguel/src/elements/Summary.jsx - Add user interection. - Scrollable in tag list. modified: Frontend/deguel/src/elements/TreeMap.jsx - Now treemap can display data in DB. - Modify tooltip. - Data tail onclick event works. --- Frontend/deguel/src/elements/Chart.jsx | 6 +-- Frontend/deguel/src/elements/Summary.jsx | 60 +++++++++++++++------- Frontend/deguel/src/elements/TreeMap.jsx | 63 ++++++++++++++---------- 3 files changed, 82 insertions(+), 47 deletions(-) diff --git a/Frontend/deguel/src/elements/Chart.jsx b/Frontend/deguel/src/elements/Chart.jsx index b3608a2..9a20b0e 100644 --- a/Frontend/deguel/src/elements/Chart.jsx +++ b/Frontend/deguel/src/elements/Chart.jsx @@ -10,8 +10,8 @@ import { Flex, BadgeDelta, Metric, - } from "@tremor/react"; - +} from "@tremor/react"; + import { useEffect, useState } from "react"; import { startOfYear, subDays } from "date-fns"; import { supabase } from "../supabaseClient"; @@ -164,4 +164,4 @@ export default function LineChartTab() {

); -} +} diff --git a/Frontend/deguel/src/elements/Summary.jsx b/Frontend/deguel/src/elements/Summary.jsx index 5a10864..015ce54 100644 --- a/Frontend/deguel/src/elements/Summary.jsx +++ b/Frontend/deguel/src/elements/Summary.jsx @@ -7,10 +7,12 @@ import { Divider, Flex, BadgeDelta, + Button, } from "@tremor/react" import { supabase } from "../supabaseClient"; -// 표기를 위한 임시 데이터. +import { PropTypes } from 'prop-types'; + const data = [ { color: "gray", tooltip: "Operational" }, { color: "gray", tooltip: "Operational" }, @@ -44,15 +46,23 @@ const data = [ { color: "green", tooltip: "Operational" }, ]; -export default function SummaryCard() { +export default function SummaryCard(props) { const [newsSummarized, setNewsSummarized] = useState("") - const [keyword, setKeyword] = useState("#7nm 공정") + const [keyword, setKeyword] = useState(props.keyword) + + // useEffect로 + // const [newsKeywordList, setnewsKeywordList] = useState([]) // useEffect로 함수 call. useEffect(() => { getInformations(); }, []); + SummaryCard.propTypes = { + keyword: PropTypes.string.isRequired, + isMain: PropTypes.bool.isRequired, + } + // Supabase에서 데이터 가져오기. async function getInformations() { @@ -69,24 +79,40 @@ export default function SummaryCard() { return (
선택하신 키워드에 대한 주요 뉴스 요약본이에요! - {keyword} + # {keyword} {newsSummarized} - 해당 키워드의 지난 30일간 언급 유무예요. - 언급 빈도 - - + {!props.isMain && +
+ 해당 키워드의 지난 30일간 언급 유무예요. + 언급 빈도 + + + + 같이 언급된 키워드예요. + 연관 키워드 + + onCloseClick("양산화")}>양산화 + onCloseClick("평택 공장")}>평택 공장 + onCloseClick("증설")}>증설 + onCloseClick("조사")}>조사 + onCloseClick("TSMC")}>TSMC + + +
+ } - 같이 언급된 키워드예요. - 연관 키워드 - - onCloseClick("양산화")}>양산화 - onCloseClick("평택 공장")}>평택 공장 - onCloseClick("증설")}>증설 - onCloseClick("조사")}>조사 - onCloseClick("TSMC")}>TSMC - + 이 기사를 추천하시나요? + 추천하기 +
+
+ +
+
+ +
+
); } diff --git a/Frontend/deguel/src/elements/TreeMap.jsx b/Frontend/deguel/src/elements/TreeMap.jsx index d3f6caa..86b0410 100644 --- a/Frontend/deguel/src/elements/TreeMap.jsx +++ b/Frontend/deguel/src/elements/TreeMap.jsx @@ -8,7 +8,7 @@ import { Legend, } from 'chart.js'; import { TreemapController, TreemapElement } from 'chartjs-chart-treemap'; -import { Chart } from 'react-chartjs-2'; +import { Chart, getElementAtEvent } from 'react-chartjs-2'; import { Title as TremorTitle, @@ -28,7 +28,7 @@ import LineChartTab from './Chart'; import { supabase } from '../supabaseClient'; -import { XIcon } from "@heroicons/react/outline"; +import { ArrowLeftIcon } from "@heroicons/react/outline"; import SummaryCard from './Summary'; ChartJS.register( @@ -46,12 +46,7 @@ export default function TreeMap(props) { const chartRef = useRef(); const [kewords, setKeywords] = useState([]); const [isClicked, setIsClicked] = useState(false); - - // 객체 TreeMap에 대한 필수 prop 정의. - TreeMap.propTypes = { - color: PropTypes.string.isRequired, - title: PropTypes.string.isRequired, - } + const [clickedKeyword, setClickedKeyword] = useState("") // useEffect로 함수 call. useEffect(() => { @@ -60,36 +55,48 @@ export default function TreeMap(props) { // Supabase에서 데이터 가져오기. async function getInformations() { - const { data } = await supabase.from("keyword").select("keywords").order('created_at', { ascending: false }); - console.log(data[0].keywords); - setKeywords(data[0].keywords); + const { data } = await supabase.from("keywords").select("*").order('create_time', { ascending: false }); + console.log(data); + setKeywords(data); } - // TreeMap의 색상 설정 정의. + TreeMap.propTypes = { + color: PropTypes.string.isRequired, + title: PropTypes.string.isRequired, + } + const config = { type: 'treemap', data: { datasets: [ { tree: kewords, - key: 'capacityMW', + key: props.color === "tomato" ? 'neg_cnt' : 'pos_cnt', labels: { display: true, - formatter: (context) => context.raw._data.name, + formatter: (context) => context.raw._data.keyword, + color: ['white', 'whiteSmoke'], + font: [{size: 36, weight: 'bold'}, {size: 12}], }, backgroundColor(context) { if (context.type !== 'data') return 'transparent'; - const { dataCoverage } = context.raw._data; - return dataCoverage === 0 - ? color('grey').rgbString() - : color(props.color).alpha(dataCoverage).rgbString(); + const { count, pos_cnt, neg_cnt } = context.raw._data; + + if(props.color === "green") + return pos_cnt / count === 0 + ? color('grey').rgbString() + : color(props.color).alpha(pos_cnt / count).rgbString(); + + if(props.color === "tomato") + return neg_cnt / count === 0 + ? color('grey').rgbString() + : color(props.color).alpha(neg_cnt / count).rgbString(); }, }, ], }, }; - // TreeMap의 표기 설정 정의. const options = { plugins: { title: { @@ -98,20 +105,21 @@ export default function TreeMap(props) { }, legend: { display: false, + }, tooltip: { displayColors: false, callbacks: { title(items) { - return items[0].raw._data.name; + return items[0].raw._data.keyword; }, label(item) { const { - _data: { capacityMW, dataCoverage }, + _data: { pos_cnt, neg_cnt }, } = item.raw; return [ - `Export capacity: ${capacityMW} MW`, - `Data Coverage: ${dataCoverage * 100}%`, + `긍정 사용 빈도: ${pos_cnt} 번`, + `부정 사용 빈도: ${neg_cnt} 번`, ]; }, }, @@ -124,15 +132,15 @@ export default function TreeMap(props) { if(chartRef.current) { console.log(event); console.log(chartRef); + const clicked_text = getElementAtEvent(chartRef.current, event)[0].element.options.labels.formatter; + setClickedKeyword(clicked_text); setIsClicked(true); } } // Click event for Close button. const onCloseClick = (event) => { - console.log(event); - setIsClicked(false); } @@ -153,13 +161,14 @@ export default function TreeMap(props) { - +
- + +
} ); From 3d9435071a01344a5fd7d6bd444fa835cd65105f Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Wed, 26 Jul 2023 16:34:35 +0900 Subject: [PATCH 55/63] [Feature] Add user recomended news modified: Frontend/deguel/src/App.jsx - Add user recomended news list. --- Frontend/deguel/src/App.jsx | 41 ++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/Frontend/deguel/src/App.jsx b/Frontend/deguel/src/App.jsx index 99c8955..f4df269 100644 --- a/Frontend/deguel/src/App.jsx +++ b/Frontend/deguel/src/App.jsx @@ -8,8 +8,12 @@ import { TabGroup, TabPanel, TabPanels, + Grid, + Col, + Card, } from "@tremor/react"; import TreemMap from "./elements/TreeMap"; +import SummaryCard from "./elements/Summary"; export default function App() { @@ -36,24 +40,29 @@ export default function App() { - - {/* - - - -
- - - - - -
-
- - - */} + + 사용자 추천 기사 + 많은 사용자가 본 뉴스에요. + + + + + +
+ + + + + + + +
+ + + + ); } From 048a87968d6387dd74500c3efeb999e9eaa40bbe Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Wed, 26 Jul 2023 16:52:29 +0900 Subject: [PATCH 56/63] [Fix] Fix chart bug modified: Frontend/deguel/src/elements/Chart.jsx - Fix bug in chart, get all price in DB. --- Frontend/deguel/src/elements/Chart.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Frontend/deguel/src/elements/Chart.jsx b/Frontend/deguel/src/elements/Chart.jsx index 9a20b0e..615440e 100644 --- a/Frontend/deguel/src/elements/Chart.jsx +++ b/Frontend/deguel/src/elements/Chart.jsx @@ -34,7 +34,7 @@ export default function LineChartTab() { // Supabase에서 데이터 가져오기. async function getInformations() { - const { data } = await supabase.from("price").select("*").order('date', { ascending: true }); + const { data } = await supabase.from("price").select("*").eq("ticker", "005930.KS").order('date', { ascending: true }); setStockPrice(data); getFilteredData(selectedIndex); } From eabee3c3bfd4be5b18586271728fa83a50a74e6e Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Wed, 26 Jul 2023 17:48:15 +0900 Subject: [PATCH 57/63] [Feature] Sync ticker with price, ticker name modified: Frontend/deguel/src/elements/Chart.jsx - Set ticker name with props. - Set price chart with props. - Hand over ticker to Chart. --- Frontend/deguel/src/elements/Chart.jsx | 19 +++++++++++++++---- Frontend/deguel/src/elements/TreeMap.jsx | 2 +- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Frontend/deguel/src/elements/Chart.jsx b/Frontend/deguel/src/elements/Chart.jsx index 615440e..d6ed1e4 100644 --- a/Frontend/deguel/src/elements/Chart.jsx +++ b/Frontend/deguel/src/elements/Chart.jsx @@ -12,6 +12,7 @@ import { Metric, } from "@tremor/react"; +import { PropTypes } from 'prop-types'; import { useEffect, useState } from "react"; import { startOfYear, subDays } from "date-fns"; import { supabase } from "../supabaseClient"; @@ -22,20 +23,30 @@ const dataFormatter = (number) => `${Intl.NumberFormat("ko-KR", { currency: 'KRW', }).format(number).toString()}`; -export default function LineChartTab() { +export default function LineChartTab(props) { const [selectedIndex, setSelectedIndex] = useState("Max"); - const [stockPrice, setStockPrice] = useState([{"id": 0, "ticker": "005930.KS", "price": 0, "date": "2021-04-05"}, {"id": 0, "ticker": "005930.KS", "price": 0, "date": "2021-04-05"}]); + const [stockPrice, setStockPrice] = useState([{"id": 0, "ticker": "005930", "price": 0, "date": "2021-04-05"}, {"id": 0, "ticker": "005930", "price": 0, "date": "2021-04-05"}]); + const [ticker_name, setTickerName] = useState("a"); // useEffect로 함수 call. useEffect(() => { getInformations(); }, []); + LineChartTab.propTypes = { + ticker: PropTypes.string.isRequired, + } // Supabase에서 데이터 가져오기. async function getInformations() { - const { data } = await supabase.from("price").select("*").eq("ticker", "005930.KS").order('date', { ascending: true }); + // DB에서 ticker에 맞는 가격 데이터 가져오기. + var { data } = await supabase.from("price").select("*").eq("ticker", props.ticker).order('date', { ascending: true }); setStockPrice(data); + + // ticker에 맞는 주가 명 가져오기. + data = await supabase.from("ticker").select("*").eq("ticker", props.ticker); + setTickerName(data.data[0].name); + getFilteredData(selectedIndex); } @@ -84,7 +95,7 @@ export default function LineChartTab() { return (
- 삼성전자 + {ticker_name} {getDiffRatio(stockPrice[stockPrice.length - 1].price, stockPrice[stockPrice.length - 2].price).toFixed(2)}% diff --git a/Frontend/deguel/src/elements/TreeMap.jsx b/Frontend/deguel/src/elements/TreeMap.jsx index 86b0410..ec74640 100644 --- a/Frontend/deguel/src/elements/TreeMap.jsx +++ b/Frontend/deguel/src/elements/TreeMap.jsx @@ -155,7 +155,7 @@ export default function TreeMap(props) { {isClicked &&
- +
From 9237853fe02f52dd9387281b04e11a3517c3e330 Mon Sep 17 00:00:00 2001 From: limha Date: Wed, 26 Jul 2023 09:47:50 +0000 Subject: [PATCH 58/63] [Feature] ready to merge to sentence-sentimental new file: Backend/Sentimental/app/__main__.py new file: Backend/Sentimental/app/main.py renamed: experiment/datasets.ipynb -> Notebooks/datasets.ipynb new file: Notebooks/glob.ipynb renamed: sentence-sentimental/train.ipynb -> Notebooks/train.ipynb renamed: sentence-sentimental/dataset/datasets.py -> Sentimental/dataset/datasets.py renamed: sentence-sentimental/main.py -> Sentimental/main.py renamed: sentence-sentimental/metrics/metrics.py -> Sentimental/metrics/metrics.py renamed: sentence-sentimental/train.py -> Sentimental/train.py renamed: sentence-sentimental/utils/utils.py -> Sentimental/utils/utils.py deleted: sentence-sentimental/preprocess/main.py deleted: sentence-sentimental/preprocess/preprocessing.py --- Backend/Sentimental/app/__main__.py | 4 + Backend/Sentimental/app/main.py | 77 +++++ {experiment => Notebooks}/datasets.ipynb | 0 Notebooks/glob.ipynb | 320 ++++++++++++++++++ .../train.ipynb | 0 .../dataset/datasets.py | 0 {sentence-sentimental => Sentimental}/main.py | 0 .../metrics/metrics.py | 0 .../train.py | 0 .../utils/utils.py | 0 sentence-sentimental/preprocess/main.py | 17 - .../preprocess/preprocessing.py | 186 ---------- 12 files changed, 401 insertions(+), 203 deletions(-) create mode 100644 Backend/Sentimental/app/__main__.py create mode 100644 Backend/Sentimental/app/main.py rename {experiment => Notebooks}/datasets.ipynb (100%) create mode 100644 Notebooks/glob.ipynb rename {sentence-sentimental => Notebooks}/train.ipynb (100%) rename {sentence-sentimental => Sentimental}/dataset/datasets.py (100%) rename {sentence-sentimental => Sentimental}/main.py (100%) rename {sentence-sentimental => Sentimental}/metrics/metrics.py (100%) rename {sentence-sentimental => Sentimental}/train.py (100%) rename {sentence-sentimental => Sentimental}/utils/utils.py (100%) delete mode 100644 sentence-sentimental/preprocess/main.py delete mode 100644 sentence-sentimental/preprocess/preprocessing.py diff --git a/Backend/Sentimental/app/__main__.py b/Backend/Sentimental/app/__main__.py new file mode 100644 index 0000000..8b63f2b --- /dev/null +++ b/Backend/Sentimental/app/__main__.py @@ -0,0 +1,4 @@ +if __name__ == "__main__": + import uvicorn + + uvicorn.run("app.main:app", host="0.0.0.0", port=30007, reload=True) diff --git a/Backend/Sentimental/app/main.py b/Backend/Sentimental/app/main.py new file mode 100644 index 0000000..f85368b --- /dev/null +++ b/Backend/Sentimental/app/main.py @@ -0,0 +1,77 @@ +from fastapi import FastAPI, UploadFile, File +from fastapi.param_functions import Depends +from pydantic import BaseModel, Field +from uuid import UUID, uuid4 +from typing import List, Union, Optional, Dict, Any + +from datetime import datetime + +import torch +from transformers import AutoTokenizer, AutoModelForSequenceClassification + +app = FastAPI() + +MODEL_PATH = "/opt/ml/input/model-roberta_large-sota_trainer" +tokenizer = AutoTokenizer.from_pretrained("klue/roberta-large") +model = AutoModelForSequenceClassification.from_pretrained(MODEL_PATH) + +@app.get("/") +def hello_world(): + return {"hello": "world"} + + +def predict_sentiment(text): + model.eval() + with torch.no_grad() : + temp = tokenizer( + text, + return_tensors='pt', + padding=True, + truncation=True, + ## + max_length=100, + # stride=stride, + # return_overflowing_tokens=True, + return_offsets_mapping=False + ) + + + predicted_label = model(input_ids=temp['input_ids'], + token_type_ids=temp['token_type_ids']) + + print(predicted_label) + + results = [] + results = torch.nn.Softmax(dim=-1)(predicted_label.logits) + + + answer = [] + print(results) + for result in results : + if result[0]>=result[1] : + answer.append("부정") + + else : + answer.append("긍정") + + return answer + +class FinanaceSentiment(BaseModel): + corpus_list: list = [] + title: str = "title" + company: str = "삼성전자" + result: Optional[List] + +@app.post("/classify_sentiment", description="문장의 감정을 분류합니다.") +async def classify_sentiment(finance: FinanaceSentiment): + # 입력으로 받은 텍스트를 모델로 예측합니다. + predictions = predict_sentiment(finance.corpus_list) + + # 결과를 반환합니다. + result = { + "title": finance.title, + # "input_text": finance.corpus, + "sentiment": predictions + } + + return predictions \ No newline at end of file diff --git a/experiment/datasets.ipynb b/Notebooks/datasets.ipynb similarity index 100% rename from experiment/datasets.ipynb rename to Notebooks/datasets.ipynb diff --git a/Notebooks/glob.ipynb b/Notebooks/glob.ipynb new file mode 100644 index 0000000..54f9977 --- /dev/null +++ b/Notebooks/glob.ipynb @@ -0,0 +1,320 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import glob\n", + "import re" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 공시번호 기준으로 폴더 나누기" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "data\n", + "data\n", + "data\n", + "data\n", + "data\n" + ] + } + ], + "source": [ + "import os\n", + "import pandas as pd\n", + "\n", + "def merge_and_move_files(directory_path):\n", + " file_list = os.listdir(directory_path)\n", + "\n", + " # 파일들을 처리하기 위해 딕셔너리를 생성합니다.\n", + " files_by_number = {}\n", + "\n", + " # 파일들을 숫자에 따라 그룹화합니다.\n", + " for file_name in file_list:\n", + " if file_name.startswith(\"preprocessed_data_\"):\n", + " number = file_name.split(\"_\")[2]\n", + " if number not in files_by_number:\n", + " files_by_number[number] = []\n", + " files_by_number[number].append(file_name)\n", + "\n", + " # 각 숫자에 대해 폴더를 만들고 해당 폴더로 파일들을 이동합니다.\n", + " for number, files in files_by_number.items():\n", + " folder_path = os.path.join(directory_path, number)\n", + " os.makedirs(folder_path, exist_ok=True)\n", + "\n", + " # 파일들을 위아래로 합쳐서 새로운 파일로 만듭니다.\n", + " combined_data = pd.concat([pd.read_csv(os.path.join(directory_path, file)) for file in files], axis=0)\n", + "\n", + " # 새로운 파일을 해당 폴더로 이동합니다.\n", + " merged_file_path = os.path.join(folder_path, f\"merged_{number}.csv\")\n", + " combined_data.to_csv(merged_file_path, index=False)\n", + "\n", + " # # 이동한 파일들은 삭제합니다. (선택사항)\n", + " # for file in files:\n", + " # file_path = os.path.join(directory_path, file)\n", + " # os.remove(file_path)\n", + "\n", + "if __name__ == \"__main__\":\n", + " target_directory = '/opt/ml/finance_sentiment_corpus/'\n", + " merge_and_move_files(target_directory)\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 회사명 기준으로 파일 나누기" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "\n", + "def merge_and_move_files(directory_path):\n", + " # 디렉토리 내의 파일 리스트를 가져옵니다.\n", + " file_list = os.listdir(directory_path)\n", + "\n", + " # 파일들을 처리하기 위해 딕셔너리를 생성합니다.\n", + " files_by_company = {}\n", + "\n", + " # 파일들을 기업 이름에 따라 그룹화합니다.\n", + " for file_name in file_list:\n", + " # if file_name[0].isdigit():\n", + " # if file_name.startswith(\"preprocessed_data_\"):\n", + " file_path = os.path.join(directory_path, file_name)\n", + " data = pd.read_csv(file_path)\n", + " company_name = data['company'].iloc[0]\n", + " if company_name not in files_by_company:\n", + " files_by_company[company_name] = []\n", + " files_by_company[company_name].append(file_name)\n", + "\n", + " # 각 기업에 대해 폴더를 만들고 해당 폴더로 파일들을 이동합니다.\n", + " for company_name, files in files_by_company.items():\n", + " folder_path = os.path.join(directory_path, \"merged\")\n", + " os.makedirs(folder_path, exist_ok=True)\n", + "\n", + " # 파일들을 위아래로 합쳐서 새로운 파일로 만듭니다.\n", + " combined_data = pd.concat([pd.read_csv(os.path.join(directory_path, file)) for file in files], axis=0)\n", + "\n", + " # 새로운 파일을 해당 폴더로 이동합니다.\n", + " merged_file_path = os.path.join(folder_path, f\"merged_{company_name}.csv\")\n", + " combined_data.to_csv(merged_file_path, index=False)\n", + "\n", + " # # 이동한 파일들은 삭제합니다. (선택사항)\n", + " # for file in files:\n", + " # file_path = os.path.join(directory_path, file)\n", + " # os.remove(file_path)\n", + "\n", + "if __name__ == \"__main__\":\n", + " # target_directory = '/opt/ml/finance_sentiment_corpus/'\n", + " target_directory = \"/opt/ml/finance_sentiment_corpus\"\n", + " merge_and_move_files(target_directory)\n" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 파일 합치기" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "def merge_csv_files(directory_path, output_file_name):\n", + " file_list = os.listdir(directory_path)\n", + " combined_data = pd.DataFrame()\n", + "\n", + " for file_name in file_list:\n", + " if file_name.endswith(\".csv\") and file_name != \"merged_all.csv\":\n", + " file_path = os.path.join(directory_path, file_name)\n", + " print(file_path)\n", + " data = pd.read_csv(file_path)\n", + " \n", + " if \"label\" in data.columns and \"labels\" not in data.columns :\n", + " data[\"labels\"] = data[\"label\"]\n", + " \n", + " data = data[[\"company\", \"title\", \"date\", \"content_corpus\", \"labels\"]]\n", + " combined_data = pd.concat([combined_data, data], axis=0, ignore_index=True)\n", + " \n", + " output_file_path = os.path.join(directory_path, output_file_name)\n", + " # print(output_file_path)\n", + " if os.path.exists(output_file_path):\n", + " os.remove(output_file_path)\n", + " \n", + " combined_data.to_csv(output_file_path, index=False)\n", + " return combined_data\n", + "\n", + "directory_path = \"/opt/ml/finance_sentiment_corpus/merged\"\n", + "output_file_name = \"merged_all.csv\"\n", + "output_file_path = directory_path + output_file_name\n", + " \n", + "data = merge_csv_files(directory_path , output_file_name)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 전처리해서 chat gpt한테 넣어주기" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "/opt/ml/finance_sentiment_corpus/merged/merged_LG전자.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_KT&G.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_셀트리온.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_현대모비스.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_LG.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_SK이노베이션.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_카카오뱅크.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_HD현대중공업.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_한국전력.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_POSCO홀딩스.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_두산에너빌리티.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_삼성바이오로직스.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_LG화학.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_에코프로비엠.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_삼성물산.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_SK하이닉스.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_삼성SDI.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_삼성화재.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_카카오.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_포스코퓨처엠.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_기아.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_하이브.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_삼성생명.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_에코프로.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_신한지주.csv\n", + "/opt/ml/finance_sentiment_corpus/merged/merged_KB금융.csv\n" + ] + } + ], + "source": [ + "def merge_csv_files(directory_path, output_file_name):\n", + " file_list = os.listdir(directory_path)\n", + " combined_data = pd.DataFrame()\n", + "\n", + " for file_name in file_list:\n", + " if file_name.endswith(\".csv\") and file_name != \"merged_all.csv\":\n", + " file_path = os.path.join(directory_path, file_name)\n", + " print(file_path)\n", + " data = pd.read_csv(file_path)\n", + " \n", + " # if \"label\" in data.columns and \"labels\" not in data.columns :\n", + " # data[\"labels\"] = data[\"label\"]\n", + " \n", + " data = data[[\"company\", \"title\", \"date\", \"content_corpus\"]]\n", + " combined_data = pd.concat([combined_data, data], axis=0, ignore_index=True)\n", + " \n", + " output_file_path = os.path.join(directory_path, output_file_name)\n", + " # print(output_file_path)\n", + " if os.path.exists(output_file_path):\n", + " os.remove(output_file_path)\n", + " \n", + " combined_data.to_csv(output_file_path, index=False)\n", + " return combined_data\n", + "\n", + "directory_path = \"/opt/ml/finance_sentiment_corpus/merged\"\n", + "output_file_name = \"merged_all.csv\"\n", + "output_file_path = directory_path + output_file_name\n", + " \n", + "data = merge_csv_files(directory_path , output_file_name)" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import pandas as pd\n", + "\n", + "def merge_csv_files(directory_path, output_file_name):\n", + " file_list = os.listdir(directory_path)\n", + " combined_data = pd.DataFrame()\n", + "\n", + " for file_name in file_list:\n", + " if file_name.endswith(\".csv\"):\n", + " file_path = os.path.join(directory_path, file_name)\n", + " data = pd.read_csv(file_path)\n", + " combined_data = pd.concat([combined_data, data], axis=0, ignore_index=True)\n", + "\n", + " output_file_path = os.path.join(directory_path, output_file_name)\n", + "\n", + " combined_data.to_csv(output_file_path, index=False)\n", + "\n", + "directory_path = \"/opt/ml/finance_sentiment_corpus/\"\n", + "output_file_name = \"merged_all.csv\"\n", + "output_file_path = directory_path + output_file_name\n", + "\n", + "if os.path.exists(output_file_path):\n", + " os.remove(output_file_path)\n", + "# merge_csv_files(\"/opt/ml/finance_sentiment_corpus\", \"merged_all.csv\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "final", + "language": "python", + "name": "python3" + }, + "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.5" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "981f108a204f421f158e0977940335d851edffa6dd3586828a3e1aec045160e4" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/sentence-sentimental/train.ipynb b/Notebooks/train.ipynb similarity index 100% rename from sentence-sentimental/train.ipynb rename to Notebooks/train.ipynb diff --git a/sentence-sentimental/dataset/datasets.py b/Sentimental/dataset/datasets.py similarity index 100% rename from sentence-sentimental/dataset/datasets.py rename to Sentimental/dataset/datasets.py diff --git a/sentence-sentimental/main.py b/Sentimental/main.py similarity index 100% rename from sentence-sentimental/main.py rename to Sentimental/main.py diff --git a/sentence-sentimental/metrics/metrics.py b/Sentimental/metrics/metrics.py similarity index 100% rename from sentence-sentimental/metrics/metrics.py rename to Sentimental/metrics/metrics.py diff --git a/sentence-sentimental/train.py b/Sentimental/train.py similarity index 100% rename from sentence-sentimental/train.py rename to Sentimental/train.py diff --git a/sentence-sentimental/utils/utils.py b/Sentimental/utils/utils.py similarity index 100% rename from sentence-sentimental/utils/utils.py rename to Sentimental/utils/utils.py diff --git a/sentence-sentimental/preprocess/main.py b/sentence-sentimental/preprocess/main.py deleted file mode 100644 index 2f5b679..0000000 --- a/sentence-sentimental/preprocess/main.py +++ /dev/null @@ -1,17 +0,0 @@ -from preprocessing import * -import pandas as pd - -if __name__ == '__main__' : - df = pd.read_csv("/opt/ml/finance_sentiment_corpus/뉴스_corpus.csv") - - df = df[['title', 'date', 'content']] - - # corpus - df = preprocess_dataframe(df) - df.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_data.csv") - - # sentence - df_sentence = preprocess_dataframe_to_sentence(df) - df_sentence.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_sentence_data.csv") - - print("완료! ml/finance_sentiment_corpus/ 에서 data를 확인해보세요!") \ No newline at end of file diff --git a/sentence-sentimental/preprocess/preprocessing.py b/sentence-sentimental/preprocess/preprocessing.py deleted file mode 100644 index 9e51ce3..0000000 --- a/sentence-sentimental/preprocess/preprocessing.py +++ /dev/null @@ -1,186 +0,0 @@ -import re -import pandas as pd - -def remove_text(texts) : - pattern = r"\*? ?재판매 및 DB 금지" - - preprocessed_text = '' - - text = re.sub(pattern, "", texts).strip() - if text: - preprocessed_text = text - - return preprocessed_text - -def remove_press(texts): - """ - 언론 정보를 제거 - -> ~~ 기자 (연합뉴스) - -> (서울=연합뉴스) ~~ 특파원 - """ - re_patterns = [ - r"\([^(]*?(뉴스|경제|일보|미디어|데일리|한겨례|타임즈|위키트리)\)", - r"[가-힣]{0,4} (기자|선임기자|수습기자|특파원|객원기자|논설고문|통신원|연구소장) =?", # 이름 + 기자 - r"[가-힣]{1,}(뉴스|경제|일보|미디어|데일리|한겨례|타임|위키트리)", # (... 연합뉴스) .. - r"[\(\[]\s+[\)\]]", # ( ) - r"[\(\[]=\s+[\)\]]", # (= ) - r"[\)\]]\s+=[\)\]]", # ( =) - ] - - preprocessed_text = '' - for re_pattern in re_patterns : - text = re.sub(re_pattern, "", str(texts)) - if text : - preprocessed_text = text - - return preprocessed_text - -def remove_photo_info(texts): - ## 수정 필요 - """ - 뉴스의 이미지 설명 대한 label 제거 - """ - preprocessed_text = [] - - preprocessed_text = re.sub(r"\(출처 ?= ?.+\) |\(사진 ?= ?.+\) |\(자료 ?= ?.+\)| \(자료사진\) |사진=.+기자 ", "", texts).strip() - preprocessed_text = re.sub(r"\/사진제공?=\S+?\s+ | \/\s사진?=", " ", preprocessed_text) - - return preprocessed_text - -def change_quotation(texts) : - pattern = r"\"" - replacement = "\'" - - processed_text = re.sub(pattern, replacement, texts) - - return processed_text - -def remove_email(texts): - """ - 이메일을 제거 - """ - preprocessed_text = '' - - text = re.sub(r"[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+", "", texts).strip() - if text: - preprocessed_text = text - - return preprocessed_text - -def remove_day(texts): - """ - 날짜와 관련된 숫자 제거 - """ - pattern = r'\d{4}\.\d{2}\.\d{2}' - - text = re.sub(pattern, "", texts) - return text - -def remove_triangle(texts): - pattern = r'▶?\s.+=' - - text = re.sub(pattern, "", texts) - return text - -def remove_parentheses(texts): - """ - 괄호와 그 안에 있는 내용들을 제거 - """ - pattern = r'[\(\[][^(^[]*[\)\]]' - - processed_text = re.sub(pattern, '', texts) - - return processed_text - -def remove_copyright(texts): - """ - 뉴스 내 포함된 저작권 관련 텍스트를 제거합니다. - """ - re_patterns = [ - r"\<저작권자(\(c\)|ⓒ|©|\(Copyright\)|(\(c\))|(\(C\))).+?\>", - r"저작권자\(c\)|ⓒ|©|(Copyright)|(\(c\))|(\(C\))" - ] - preprocessed_text = '' - - for re_pattern in re_patterns : - text = re.sub(re_pattern, "", texts) - if text: - preprocessed_text = text - - return preprocessed_text - -def split_sentence(texts) : - sentence_list = texts.split(". ") - - return sentence_list - -# 혹시 필요한 것들 모음 -def remove_hashtag(texts): - """ - 해쉬태그(#)를 제거합니다. - """ - preprocessed_text = '' - - text = re.sub(r"#\S+", "", texts).strip() - if text: - preprocessed_text = text - - return preprocessed_text - -def remove_url(texts): - """ - URL을 제거합니다. - 주소: www.naver.com`` -> 주소: - """ - preprocessed_text = '' - - text = re.sub(r"(http|https)?:\/\/\S+\b|www\.(\w+\.)+\S*", "", texts).strip() - text = re.sub(r"pic\.(\w+\.)+\S*", "", texts).strip() - - preprocessed_text = text - - return preprocessed_text - -def all_preprocessing(texts) : - texts = remove_text(texts) - texts = remove_press(texts) - texts = remove_photo_info(texts) - texts = remove_email(texts) - texts = remove_copyright(texts) - texts = remove_day(texts) - texts = remove_triangle(texts) - texts = remove_parentheses(texts) - texts = remove_copyright(texts) - - texts = change_quotation(texts) - - return texts - -def preprocess_dataframe(df): - df['content_corpus'] = df['content'].apply(all_preprocessing) - - return df - -def preprocess_dataframe_to_sentence(df): - df_sentence = pd.DataFrame(columns=['title', 'date', 'content_sentence']) - - for index, row in df.iterrows(): - title = row['title'] - date = row['date'] - content = row['content'] - - content = split_sentence(content) - - for sentence in content: - l = len(df_sentence) - sentence = all_preprocessing(sentence) - new_row = {'title': title, 'date': date, 'content_sentence': sentence} - - new_row = pd.DataFrame(new_row, index = [l]) - df_sentence = pd.concat([df_sentence, new_row], axis = 0) - - return df_sentence - -if __name__ == "__main__" : - text = '여기에 넣고 싶은 문구를 넣어서 실험해보세요.' - print(text) \ No newline at end of file From 7d3eae68d5fa4205cf32f4917c920faa1ad36bc8 Mon Sep 17 00:00:00 2001 From: limha Date: Wed, 26 Jul 2023 09:59:36 +0000 Subject: [PATCH 59/63] [Etc] Move module to parent Dir --- Backend/Sentimental/__main__.py | 4 ++ Backend/Sentimental/main.py | 77 +++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 Backend/Sentimental/__main__.py create mode 100644 Backend/Sentimental/main.py diff --git a/Backend/Sentimental/__main__.py b/Backend/Sentimental/__main__.py new file mode 100644 index 0000000..8b63f2b --- /dev/null +++ b/Backend/Sentimental/__main__.py @@ -0,0 +1,4 @@ +if __name__ == "__main__": + import uvicorn + + uvicorn.run("app.main:app", host="0.0.0.0", port=30007, reload=True) diff --git a/Backend/Sentimental/main.py b/Backend/Sentimental/main.py new file mode 100644 index 0000000..f85368b --- /dev/null +++ b/Backend/Sentimental/main.py @@ -0,0 +1,77 @@ +from fastapi import FastAPI, UploadFile, File +from fastapi.param_functions import Depends +from pydantic import BaseModel, Field +from uuid import UUID, uuid4 +from typing import List, Union, Optional, Dict, Any + +from datetime import datetime + +import torch +from transformers import AutoTokenizer, AutoModelForSequenceClassification + +app = FastAPI() + +MODEL_PATH = "/opt/ml/input/model-roberta_large-sota_trainer" +tokenizer = AutoTokenizer.from_pretrained("klue/roberta-large") +model = AutoModelForSequenceClassification.from_pretrained(MODEL_PATH) + +@app.get("/") +def hello_world(): + return {"hello": "world"} + + +def predict_sentiment(text): + model.eval() + with torch.no_grad() : + temp = tokenizer( + text, + return_tensors='pt', + padding=True, + truncation=True, + ## + max_length=100, + # stride=stride, + # return_overflowing_tokens=True, + return_offsets_mapping=False + ) + + + predicted_label = model(input_ids=temp['input_ids'], + token_type_ids=temp['token_type_ids']) + + print(predicted_label) + + results = [] + results = torch.nn.Softmax(dim=-1)(predicted_label.logits) + + + answer = [] + print(results) + for result in results : + if result[0]>=result[1] : + answer.append("부정") + + else : + answer.append("긍정") + + return answer + +class FinanaceSentiment(BaseModel): + corpus_list: list = [] + title: str = "title" + company: str = "삼성전자" + result: Optional[List] + +@app.post("/classify_sentiment", description="문장의 감정을 분류합니다.") +async def classify_sentiment(finance: FinanaceSentiment): + # 입력으로 받은 텍스트를 모델로 예측합니다. + predictions = predict_sentiment(finance.corpus_list) + + # 결과를 반환합니다. + result = { + "title": finance.title, + # "input_text": finance.corpus, + "sentiment": predictions + } + + return predictions \ No newline at end of file From a1c5b000389388211b2c3900ff8de96b94510231 Mon Sep 17 00:00:00 2001 From: limha Date: Wed, 26 Jul 2023 10:01:22 +0000 Subject: [PATCH 60/63] [Etc] Remove Existing Module --- Backend/Sentimental/app/__main__.py | 4 -- Backend/Sentimental/app/main.py | 77 ----------------------------- 2 files changed, 81 deletions(-) delete mode 100644 Backend/Sentimental/app/__main__.py delete mode 100644 Backend/Sentimental/app/main.py diff --git a/Backend/Sentimental/app/__main__.py b/Backend/Sentimental/app/__main__.py deleted file mode 100644 index 8b63f2b..0000000 --- a/Backend/Sentimental/app/__main__.py +++ /dev/null @@ -1,4 +0,0 @@ -if __name__ == "__main__": - import uvicorn - - uvicorn.run("app.main:app", host="0.0.0.0", port=30007, reload=True) diff --git a/Backend/Sentimental/app/main.py b/Backend/Sentimental/app/main.py deleted file mode 100644 index f85368b..0000000 --- a/Backend/Sentimental/app/main.py +++ /dev/null @@ -1,77 +0,0 @@ -from fastapi import FastAPI, UploadFile, File -from fastapi.param_functions import Depends -from pydantic import BaseModel, Field -from uuid import UUID, uuid4 -from typing import List, Union, Optional, Dict, Any - -from datetime import datetime - -import torch -from transformers import AutoTokenizer, AutoModelForSequenceClassification - -app = FastAPI() - -MODEL_PATH = "/opt/ml/input/model-roberta_large-sota_trainer" -tokenizer = AutoTokenizer.from_pretrained("klue/roberta-large") -model = AutoModelForSequenceClassification.from_pretrained(MODEL_PATH) - -@app.get("/") -def hello_world(): - return {"hello": "world"} - - -def predict_sentiment(text): - model.eval() - with torch.no_grad() : - temp = tokenizer( - text, - return_tensors='pt', - padding=True, - truncation=True, - ## - max_length=100, - # stride=stride, - # return_overflowing_tokens=True, - return_offsets_mapping=False - ) - - - predicted_label = model(input_ids=temp['input_ids'], - token_type_ids=temp['token_type_ids']) - - print(predicted_label) - - results = [] - results = torch.nn.Softmax(dim=-1)(predicted_label.logits) - - - answer = [] - print(results) - for result in results : - if result[0]>=result[1] : - answer.append("부정") - - else : - answer.append("긍정") - - return answer - -class FinanaceSentiment(BaseModel): - corpus_list: list = [] - title: str = "title" - company: str = "삼성전자" - result: Optional[List] - -@app.post("/classify_sentiment", description="문장의 감정을 분류합니다.") -async def classify_sentiment(finance: FinanaceSentiment): - # 입력으로 받은 텍스트를 모델로 예측합니다. - predictions = predict_sentiment(finance.corpus_list) - - # 결과를 반환합니다. - result = { - "title": finance.title, - # "input_text": finance.corpus, - "sentiment": predictions - } - - return predictions \ No newline at end of file From 8c9c7e7fc4923c1f6e2cdffb8ff4e7459b127afc Mon Sep 17 00:00:00 2001 From: limha Date: Wed, 26 Jul 2023 10:10:04 +0000 Subject: [PATCH 61/63] [Etc] Remove Useless File --- sentence-sentimental/dataset/datasets.py | 16 -- sentence-sentimental/main.py | 4 - sentence-sentimental/metrics/metrics.py | 10 - sentence-sentimental/preprocess/main.py | 18 -- .../preprocess/preprocessing.py | 224 ------------------ sentence-sentimental/train.py | 150 ------------ sentence-sentimental/utils/utils.py | 9 - 7 files changed, 431 deletions(-) delete mode 100644 sentence-sentimental/dataset/datasets.py delete mode 100644 sentence-sentimental/main.py delete mode 100644 sentence-sentimental/metrics/metrics.py delete mode 100644 sentence-sentimental/preprocess/main.py delete mode 100644 sentence-sentimental/preprocess/preprocessing.py delete mode 100644 sentence-sentimental/train.py delete mode 100644 sentence-sentimental/utils/utils.py diff --git a/sentence-sentimental/dataset/datasets.py b/sentence-sentimental/dataset/datasets.py deleted file mode 100644 index 00c401e..0000000 --- a/sentence-sentimental/dataset/datasets.py +++ /dev/null @@ -1,16 +0,0 @@ -import torch -from torch.utils.data import Dataset - -class SentimentalDataset(Dataset): - def __init__(self, encodings, labels): - self.encoding = encodings - self.labels = labels[self.encoding['overflow_to_sample_mapping'].tolist()].reset_index(drop=True) - # 여러 개로 나뉜 문장에 대해 1개의 라벨을 매핑해줍니다. - - def __getitem__(self, idx): - data = {key: val[idx] for key, val in self.encoding.items()} - data['labels'] = torch.tensor(self.labels[idx]).long() - return data - - def __len__(self): - return len(self.labels) \ No newline at end of file diff --git a/sentence-sentimental/main.py b/sentence-sentimental/main.py deleted file mode 100644 index 41c7d80..0000000 --- a/sentence-sentimental/main.py +++ /dev/null @@ -1,4 +0,0 @@ -from train import train - -if __name__== "__main__" : - train() \ No newline at end of file diff --git a/sentence-sentimental/metrics/metrics.py b/sentence-sentimental/metrics/metrics.py deleted file mode 100644 index a58d37b..0000000 --- a/sentence-sentimental/metrics/metrics.py +++ /dev/null @@ -1,10 +0,0 @@ -from datasets import load_metric - -def compute_metrics(pred): - labels = pred.label_ids - preds = pred.predictions.argmax(-1) - - acc = load_metric('accuracy').compute(predictions=preds, references=labels)['accuracy'] - f1 = load_metric('f1').compute(predictions=preds, references=labels, average='micro')['f1'] - - return {'accuracy':acc, 'f1':f1} \ No newline at end of file diff --git a/sentence-sentimental/preprocess/main.py b/sentence-sentimental/preprocess/main.py deleted file mode 100644 index a150a56..0000000 --- a/sentence-sentimental/preprocess/main.py +++ /dev/null @@ -1,18 +0,0 @@ -from preprocessing import * -import pandas as pd - -if __name__ == '__main__' : - # df = pd.read_csv("/opt/ml/finance_sentiment_corpus/뉴스_corpus.csv") - df = pd.read_csv("/opt/ml/finance_sentiment_corpus/merged_samsung.csv") - - df = df[['title', 'date', 'content']] - - # corpus - df = preprocess_dataframe(df) - df.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_data.csv") - - # sentence - # df_sentence = preprocess_dataframe_to_sentence(df) - # df_sentence.to_csv("/opt/ml/finance_sentiment_corpus/preprocessed_sentence_data.csv") - - print("완료! ml/finance_sentiment_corpus/ 에서 data를 확인해보세요!") \ No newline at end of file diff --git a/sentence-sentimental/preprocess/preprocessing.py b/sentence-sentimental/preprocess/preprocessing.py deleted file mode 100644 index 07cc5d5..0000000 --- a/sentence-sentimental/preprocess/preprocessing.py +++ /dev/null @@ -1,224 +0,0 @@ -import re -import pandas as pd - -def remove_text(texts) : - """ - 재판매 및 DB금지 를 제거. - """ - pattern = r"\*? ?재판매 및 DB 금지" - - preprocessed_text = '' - - text = re.sub(pattern, "", texts).strip() - if text: - preprocessed_text = text - - return preprocessed_text - -def remove_press(texts): - """ - 언론 정보를 제거 - -> ~~ 기자 (연합뉴스) - -> (서울=연합뉴스) ~~ 특파원 - """ - re_patterns = [ - r"\([^(]*?(뉴스|경제|일보|미디어|데일리|한겨례|타임즈|위키트리)\)", - r"[가-힣]{0,4}\s+(기자|선임기자|수습기자|특파원|객원기자|논설고문|통신원|연구소장)\s?=?", # 이름 + 기자 - # r"[가-힣]{1,}(뉴스|경제|일보|미디어|데일리|한겨례|타임|위키트리)", # (... 연합뉴스) .. - r"(\/?뉴스|news|News)\d", # (... 연합뉴스) .. - r"[\(\[]\s+[\)\]]", # ( ) - r"[\(\[]=\s+[\)\]]", # (= ) - r"[\)\]]\s+=[\)\]]", # ( =) - ] - - preprocessed_text = '' - for re_pattern in re_patterns : - texts = re.sub(re_pattern, "", str(texts)) - if texts : - preprocessed_text = texts - - return preprocessed_text - -def remove_photo_info(texts): - ## 수정 필요 - """ - 뉴스의 이미지 설명 대한 label 제거 - """ - preprocessed_text = [] - - preprocessed_text = re.sub(r"\(출처 ?= ?.+\) |\(사진 ?= ?.+\) |\(자료 ?= ?.+\)| \(자료사진\) |사진=.+기자 ", "", texts).strip() - preprocessed_text = re.sub(r"\/?사진제공(=|\:)\w+", " ", preprocessed_text) - preprocessed_text = re.sub(r"\/? ?(사진|그래픽) ?= ?\w+", " ", preprocessed_text) - preprocessed_text = re.sub(r"\/\w+\s?제공", " ", preprocessed_text) - # preprocessed_text = re.sub(r"\/사진제공=\S?+?\s+ | \/\s사진?=", " ", preprocessed_text) - - return preprocessed_text - -def change_quotation(texts) : - """ - " -> ' - """ - pattern = r"\"" - replacement = "\'" - - processed_text = re.sub(pattern, replacement, texts) - - return processed_text - -def remove_email(texts): - """ - 이메일을 제거 - """ - preprocessed_text = '' - - text = re.sub(r"[a-zA-Z0-9+-_.]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+", "", texts).strip() - if text: - preprocessed_text = text - - return preprocessed_text - -def remove_day(texts): - """ - 날짜와 관련된 숫자 제거 - 2022.01.01 -> "" - """ - pattern = r'\d{4}\.\d{1,2}\.\d{1,2}\.?' - - text = re.sub(pattern, "", texts) - return text - -def remove_triangle(texts): - """ - "▶ 임의의 문구 =" 를 제거한다. - """ - pattern = r'▶\s?.+=' - - text = re.sub(pattern, "", texts) - return text - -def remove_parentheses(texts): - """ - 괄호와 그 안에 있는 내용들을 제거 - """ - pattern = r'[\(\[][^(^[]*[\)\]]' - - processed_text = re.sub(pattern, '', texts) - - return processed_text - -def remove_copyright(texts): - """ - 뉴스 내 포함된 저작권 관련 텍스트를 제거합니다. - """ - re_patterns = [ - r"\<저작권자(\(c\)|ⓒ|©|\(Copyright\)|(\(c\))|(\(C\))).+?\>", - r"저작권자\(c\)|ⓒ|©|(Copyright)|(\(c\))|(\(C\))" - ] - preprocessed_text = '' - - for re_pattern in re_patterns : - text = re.sub(re_pattern, "", texts) - if text: - preprocessed_text = text - - return preprocessed_text - -def split_sentence(texts) : - sentence_list = texts.split(". ") - - return sentence_list - -# 혹시 필요한 것들 모음 -def remove_hashtag(texts): - """ - 해쉬태그(#)를 제거합니다. - """ - preprocessed_text = '' - - text = re.sub(r"#\S+", "", texts).strip() - if text: - preprocessed_text = text - - return preprocessed_text - -def remove_url(texts): - """ - URL을 제거합니다. - 주소: www.naver.com`` -> 주소: - """ - preprocessed_text = '' - - text = re.sub(r"(http|https)?:\/\/\S+\b|www\.(\w+\.)+\S*", "", texts).strip() - text = re.sub(r"pic\.(\w+\.)+\S*", "", texts).strip() - - preprocessed_text = text - - return preprocessed_text - -def remove_special_str(texts) : - """ - 1. ◆◇▲▼■●▶◀△▽→←⇒⇔➜➔❯❮ 해당하는 문자들은 다 제거한다. - 2. ↑ 해당하는 문자를 증가로 치환한다. - 3. ↓ 해당하는 문자를 감소로 치환한다. - """ - preprocessed_text = '' - - pattern = r"[◆◇▲▼■●▶◀△▽→←⇒⇔➜➔❯❮]" - preprocessed_text = re.sub(pattern, "", texts) - preprocessed_text = re.sub("\↑", "증가 ", texts) - preprocessed_text = re.sub("\↓", "감소 ", texts) - - return preprocessed_text - -def remove_space_dup(texts): - preprocessed_text = re.sub(r"\s+", " ", texts) - - return preprocessed_text - -def all_preprocessing(texts) : - texts = str(texts) - texts = remove_text(texts) - texts = remove_press(texts) - texts = remove_photo_info(texts) - texts = remove_email(texts) - texts = remove_copyright(texts) - texts = remove_day(texts) - texts = remove_triangle(texts) - texts = remove_parentheses(texts) - texts = remove_special_str(texts) - - texts = change_quotation(texts) - texts = remove_space_dup(texts) - - return texts - -def preprocess_dataframe(df): - df['content_corpus'] = df['content'].apply(all_preprocessing) - - return df - -def preprocess_dataframe_to_sentence(df): - df_sentence = pd.DataFrame(columns=['title', 'date', 'content_sentence']) - - for index, row in df.iterrows(): - title = row['title'] - date = row['date'] - content = row['content'] - - content = split_sentence(content) - - for sentence in content: - l = len(df_sentence) - sentence = all_preprocessing(sentence) - new_row = {'title': title, 'date': date, 'content_sentence': sentence} - - new_row = pd.DataFrame(new_row, index = [l]) - df_sentence = pd.concat([df_sentence, new_row], axis = 0) - - return df_sentence - -if __name__ == "__main__" : - text = "실험해보고 싶은 문구를 넣어보세요." - - text = all_preprocessing(text) - print(text) \ No newline at end of file diff --git a/sentence-sentimental/train.py b/sentence-sentimental/train.py deleted file mode 100644 index 40b1c72..0000000 --- a/sentence-sentimental/train.py +++ /dev/null @@ -1,150 +0,0 @@ -import torch -import pandas as pd -import sklearn -import random -import numpy as np -import wandb - -from transformers import AutoModelForSequenceClassification, AutoTokenizer -from transformers import TrainingArguments, Trainer -from transformers import pipeline - -from dataset.datasets import SentimentalDataset -from metrics.metrics import compute_metrics - -from sklearn.datasets import load_iris # 샘플 데이터 로딩 -from sklearn.model_selection import train_test_split - -from utils.utils import config_seed - -''' -- git clone https://github.com/ukairia777/finance_sentiment_corpus.git 먼저 실행 -- readme.md 작성 예정 -''' -def train() : - ## 설정 - SEED = 42 - config_seed(SEED) - device = torch.device("cuda" if torch.cuda.is_available() else 'cpu') - - - ## 모델 - MODEL_NAME = 'klue/roberta-base' - model = AutoModelForSequenceClassification.from_pretrained(MODEL_NAME, num_labels=3).to(device) - tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME) - - - ## 데이터 - data = pd.read_csv('/opt/ml/finance_sentiment_corpus/finance_data.csv') - data['labels'] = data['labels'].map({'negative':0, 'neutral':1, 'positive':2}) - - temp = train_test_split(data['kor_sentence'], data['labels'], - test_size=0.2, shuffle=True, stratify=data['labels'], # label에 비율을 맞춰서 분리 - random_state=SEED) - sentence_train, sentence_val, label_train, label_val = temp - - max_length=30 - stride=0 - ## TODO 임의의 값으로 차후 수정 - train_encoding = tokenizer(sentence_train.tolist(), - return_tensors='pt', - padding=True, - truncation=True, - ## - max_length=max_length, - stride=stride, - return_overflowing_tokens=True, - return_offsets_mapping=False - ) - val_encoding = tokenizer(sentence_val.tolist(), - return_tensors='pt', - padding=True, - truncation=True, - ## - max_length=max_length, - stride=stride, - return_overflowing_tokens=True, - return_offsets_mapping=False - ) - train_set = SentimentalDataset(train_encoding, label_train.reset_index(drop=True)) - val_set = SentimentalDataset(val_encoding, label_val.reset_index(drop=True)) - - data2 = pd.read_csv('/opt/ml/finance_sentiment_corpus/native_korean_news_100.csv') - val2_encoding = tokenizer(data2['kor_sentence'].tolist(), - return_tensors='pt', - padding=True, - truncation=True, - ## - max_length=max_length, - stride=stride, - return_overflowing_tokens=True, - return_offsets_mapping=False - ) - val2_set = SentimentalDataset(val2_encoding, data2['labels']) - - - ## 학습 - run = wandb.init(project="final_sentimental", entity="nlp-10") - training_args = TrainingArguments( - output_dir = './outputs', - logging_steps = 50, - num_train_epochs = 1, - per_device_train_batch_size=32, - per_device_eval_batch_size=32, - fp16=True, - report_to="wandb", - ) - trainer = Trainer( - model=model, - args=training_args, - train_dataset=train_set, - eval_dataset=train_set, - compute_metrics=compute_metrics - ) - - print('---train start---') - trainer.train() - - - ## 평가 - print('---val evaulate start---') - trainer.evaluate(eval_dataset=val_set, metric_key_prefix='val1') - - print('---test evaluate start---') - trainer.evaluate(eval_dataset=val2_set, metric_key_prefix='val2') - - # print('---inference start---') ## 추론 방법 1 - # model = model.to('cpu') ## 주의 - # my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯' - # classifier = pipeline("sentiment-analysis", model=model, - # tokenizer=tokenizer) - # inference_output = classifier(my_text) - # print(inference_output) - # # [{'label': 'LABEL_2', 'score': 0.8627877831459045}] - - print('---inference start---') ## 추론 방법 2 - my_text = '삼성전자, 올해부터 다운턴 끝나고 매출 상승 시작할 듯'*10 - model = model.to('cpu') - model.eval() - with torch.no_grad() : - temp = tokenizer( - my_text, - return_tensors='pt', - padding=True, - truncation=True, - ## - max_length=max_length, - stride=stride, - return_overflowing_tokens=True, - return_offsets_mapping=False - ) - temp = { - 'input_ids':temp['input_ids'], - 'token_type_ids':temp['token_type_ids'], - 'attention_mask':temp['attention_mask'], - } - predicted_label = model(**temp) - print(torch.nn.Softmax(dim=-1)(predicted_label.logits).mean(dim=0)) - # tensor([[0.0108, 0.1264, 0.8628]]) -if __name__ == '__main__': - train() diff --git a/sentence-sentimental/utils/utils.py b/sentence-sentimental/utils/utils.py deleted file mode 100644 index 7caf61b..0000000 --- a/sentence-sentimental/utils/utils.py +++ /dev/null @@ -1,9 +0,0 @@ -import torch -import random -import numpy as np - -def config_seed(SEED) : - random.seed(SEED) - np.random.seed(SEED) - torch.manual_seed(SEED) - torch.cuda.manual_seed_all(SEED) \ No newline at end of file From 0604dc2bdb8a3a3e0914b782b7a078499dba21bf Mon Sep 17 00:00:00 2001 From: Minseok Kwak Date: Wed, 26 Jul 2023 19:25:19 +0900 Subject: [PATCH 62/63] [Docs] Move README.md to Frontend --- Frontend/README.md | 27 +++++++++++++++++++++++++++ README.md | 27 --------------------------- 2 files changed, 27 insertions(+), 27 deletions(-) create mode 100644 Frontend/README.md diff --git a/Frontend/README.md b/Frontend/README.md new file mode 100644 index 0000000..87ff2c2 --- /dev/null +++ b/Frontend/README.md @@ -0,0 +1,27 @@ +# [프로젝트 명] - Frontend +[프로젝트 명]의 프론트엔드 프로젝트 입니다. + +## 📄 간략 설명 +- React와 vite로 구성된 프론트엔드 프로젝트 입니다. +- Tailwind CSS를 이용하여 디자인을 구성하였습니다. + +## 🚀 사용 방법 +1. 먼저 시작에 앞서, 다음의 내용의 파일을 `./env.local`에 만드십시오. +``` +VITE_SUPABASE_URL=SUPABASE_URL +VITE_SUPABASE_ANON_KEY=SUPABASE_KEY +``` +2. 다음의 명렬어를 이용하여 설치하십시오. +``` +npm install +``` +3. 다음의 명령어로 실행이 가능합니다. +``` +npm run dev +``` +### ☁️ 배포 +1. 다음의 명령어로 프로젝트를 build 할 수 있습니다. +``` +npm run build +``` +2. 경로 `./dist`의 폴더에 결과물이 생성됩니다. 해당 결과물을 배포하시면 됩니다. \ No newline at end of file diff --git a/README.md b/README.md index 87ff2c2..e69de29 100644 --- a/README.md +++ b/README.md @@ -1,27 +0,0 @@ -# [프로젝트 명] - Frontend -[프로젝트 명]의 프론트엔드 프로젝트 입니다. - -## 📄 간략 설명 -- React와 vite로 구성된 프론트엔드 프로젝트 입니다. -- Tailwind CSS를 이용하여 디자인을 구성하였습니다. - -## 🚀 사용 방법 -1. 먼저 시작에 앞서, 다음의 내용의 파일을 `./env.local`에 만드십시오. -``` -VITE_SUPABASE_URL=SUPABASE_URL -VITE_SUPABASE_ANON_KEY=SUPABASE_KEY -``` -2. 다음의 명렬어를 이용하여 설치하십시오. -``` -npm install -``` -3. 다음의 명령어로 실행이 가능합니다. -``` -npm run dev -``` -### ☁️ 배포 -1. 다음의 명령어로 프로젝트를 build 할 수 있습니다. -``` -npm run build -``` -2. 경로 `./dist`의 폴더에 결과물이 생성됩니다. 해당 결과물을 배포하시면 됩니다. \ No newline at end of file From eb327608b3b45fc21b0ff05f9e08e4e2bf6382e4 Mon Sep 17 00:00:00 2001 From: Yungi Date: Wed, 26 Jul 2023 20:31:42 +0900 Subject: [PATCH 63/63] [Docs] Add README.md --- README.md | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/README.md b/README.md index e69de29..b4be4b4 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,80 @@ +# 📄 프로젝트 소개 + +하루에도 수백, 수천 개의 경제 뉴스가 발간되어 기업의 경제 활동에 대한 정보를 제공합니다. 하지만 양이 지나치게 방대하여 개인이 전부 읽은 뒤 주식 투자에 활용 하기에는 어려움이 있습니다. 따라서 저희는 기사 요약, 키워드 추출, 키워드와 기사에 대한 긍/부정 분류를 통해 주식시장의 흐름을 가독성이 높은 형태로 제공하려고 합니다. + +# 🗓️ 개발 기간 + +23.07.03 - 23.07.28(총 26일) + +# 👨‍👨‍👧‍👧 멤버 구성 및 역할 + +| [곽민석](https://github.com/kms7530) | [이인균](https://github.com/lig96) | [임하림](https://github.com/halimx2) | [최휘민](https://github.com/ChoiHwimin) | [황윤기](https://github.com/dbsrlskfdk) | +|---|---|---|---| --- | +| | | | | | + +- **곽민석** + - 요약 모델 + - 데이터셋 수집 + - 모델 성능 실험 + - 요약 모델 API 설계 + - 기사 긍부정 분류 데이터셋 + - LLM을 이용한 데이터셋 라벨링 + - Backend + - Frontend +- **이인균** + - 뉴스 긍부정 분류 + - 최신 Model 탐색 + - 자체 Model 설계 +- **임하림** + - 서기 + - 뉴스 긍부정 분류 + - 자체 Model 설계 + - 모델 입력 데이터 설계 + - 뉴스 긍부정 api 설계 + - chat gpt 라벨링 + - 기사 전처리 +- **최휘민** + - 키워드 추출 + - 자체 Model 설계 및 실험 + - 키워드 추출 API 설계 + - 평가 데이터 수집 +- **황윤기** + - 프로젝트 리더 + - 네이버 뉴스 크롤링 + - Airflow + - Crawling Scheduling + - Serving Scheduling + - 키워드 추출 + - KeyBERT 기반 Model + +# ⚒️ 기능 + +## 키워드 추출 + +- 주어진 기사 내에서 중요한 키워드를 추출하기 위한 작업을 시행합니다. +- 기사 전체에서 단어의 가중치를 계산하고, 해당 가중치를 이용한 주요 단어 후보를 선정합니다. +- 한국어 키워드 추출의 성능을 측정하기 위한 데이터셋이 존재하지 않기 때문에 50개의 자체 평가 데이터셋을 구성하였습니다. + +## 기사 긍부정 분류 + +- 추출된 키워드가 기업의 좋은 상황을 나타내는 단어인지, 나쁜 상황을 나타내는 단어인지 정보를 제공하기 위해 긍부정 분류 모델을 사용합니다. 기사 전체를 감성 분석한 뒤에 키워드의 대용 지표로 채택합니다. +- 총 학습 데이터는 기사 긍부정 분류에는 30개의 기업의 총 9000개의 기사를 chat gpt API를 활용해 긍부정 labeling을 진행했고, train set, dev set을 8:2로 나누어서 학습을 진행했습니다. + +## 기사 요약 + +- IT / 경제분야 뉴스를 이용하여 학습한 모델(T5, polyglot-ko)을 이용하여 뉴스를 요약 제공합니다. +- T5 모델을 이용하여 한줄 요약을 만들어내고, 이후 자세한 내용은 polyglot-ko 모델을 이용하여 상대적으로 긴 요약 내용을 추가해 줍니다. +- 모델을 이용하여 생성된 결과는 유의미한 문장만을 가져와 후처리하여 반환합니다. + +--- + +# 👨‍🔬 모델 연구 + +## 키워드 추출 + +- 주요 단어 후보와 기사를 한국어로 기학습된 `Sentence-Transformer`를 이용해서 Embedding을 계산한 후, 유사도를 계산하여 높은 점수를 낸 단어를 해당 기사의 주요 키워드로 선정하였습니다. +- 선정된 키워드들을 키워드의 형태(명사형 어구)로 표시하고자, 추출된 키워드에 대해 후처리를 진행하였습니다. + +## 뉴스 긍부정 분류 + +## 기사 요약 \ No newline at end of file