diff --git "a/text-summarization.ipynb" "b/text-summarization.ipynb"
new file mode 100644--- /dev/null
+++ "b/text-summarization.ipynb"
@@ -0,0 +1 @@
+{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[],"dockerImageVersionId":30747,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install -U transformers\n!pip install -U accelerate\n!pip install -U datasets\n!pip install -U bertviz\n!pip install -U umap-learn\n!pip install -U sentencepiece\n!pip install -U urllib3\n!pip install py7zr\n!pip uninstall -y botocore\n!pip install botocore","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-07-20T03:45:06.007979Z","iopub.execute_input":"2024-07-20T03:45:06.008672Z","iopub.status.idle":"2024-07-20T03:47:34.628795Z","shell.execute_reply.started":"2024-07-20T03:45:06.008639Z","shell.execute_reply":"2024-07-20T03:47:34.627697Z"},"trusted":true},"execution_count":1,"outputs":[{"name":"stdout","text":"Requirement already satisfied: transformers in /opt/conda/lib/python3.10/site-packages (4.42.3)\nCollecting transformers\n  Downloading transformers-4.42.4-py3-none-any.whl.metadata (43 kB)\n\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m43.6/43.6 kB\u001b[0m \u001b[31m672.7 kB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n\u001b[?25hRequirement already satisfied: filelock in /opt/conda/lib/python3.10/site-packages (from transformers) (3.13.1)\nRequirement already satisfied: huggingface-hub<1.0,>=0.23.2 in /opt/conda/lib/python3.10/site-packages (from transformers) (0.23.4)\nRequirement already satisfied: numpy<2.0,>=1.17 in /opt/conda/lib/python3.10/site-packages (from transformers) (1.26.4)\nRequirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.10/site-packages (from transformers) (21.3)\nRequirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.10/site-packages (from transformers) (6.0.1)\nRequirement already satisfied: regex!=2019.12.17 in /opt/conda/lib/python3.10/site-packages (from transformers) (2023.12.25)\nRequirement already satisfied: requests in /opt/conda/lib/python3.10/site-packages (from transformers) (2.32.3)\nRequirement already satisfied: safetensors>=0.4.1 in /opt/conda/lib/python3.10/site-packages (from transformers) (0.4.3)\nRequirement already satisfied: tokenizers<0.20,>=0.19 in /opt/conda/lib/python3.10/site-packages (from transformers) (0.19.1)\nRequirement already satisfied: tqdm>=4.27 in /opt/conda/lib/python3.10/site-packages (from transformers) (4.66.4)\nRequirement already satisfied: fsspec>=2023.5.0 in /opt/conda/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.23.2->transformers) (2024.5.0)\nRequirement already satisfied: typing-extensions>=3.7.4.3 in /opt/conda/lib/python3.10/site-packages (from huggingface-hub<1.0,>=0.23.2->transformers) (4.9.0)\nRequirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.10/site-packages (from packaging>=20.0->transformers) (3.1.1)\nRequirement already satisfied: charset-normalizer<4,>=2 in /opt/conda/lib/python3.10/site-packages (from requests->transformers) (3.3.2)\nRequirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.10/site-packages (from requests->transformers) (3.6)\nRequirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/lib/python3.10/site-packages (from requests->transformers) (1.26.18)\nRequirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.10/site-packages (from requests->transformers) (2024.7.4)\nDownloading transformers-4.42.4-py3-none-any.whl (9.3 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.3/9.3 MB\u001b[0m \u001b[31m27.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n\u001b[?25hInstalling collected packages: transformers\n  Attempting uninstall: transformers\n    Found existing installation: transformers 4.42.3\n    Uninstalling transformers-4.42.3:\n      Successfully uninstalled transformers-4.42.3\nSuccessfully installed transformers-4.42.4\nRequirement already satisfied: accelerate in /opt/conda/lib/python3.10/site-packages (0.32.1)\nRequirement already satisfied: numpy<2.0.0,>=1.17 in /opt/conda/lib/python3.10/site-packages (from accelerate) (1.26.4)\nRequirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.10/site-packages (from accelerate) (21.3)\nRequirement already satisfied: psutil in /opt/conda/lib/python3.10/site-packages (from accelerate) (5.9.3)\nRequirement already satisfied: pyyaml in /opt/conda/lib/python3.10/site-packages (from accelerate) (6.0.1)\nRequirement already satisfied: torch>=1.10.0 in /opt/conda/lib/python3.10/site-packages (from accelerate) (2.1.2)\nRequirement already satisfied: huggingface-hub in /opt/conda/lib/python3.10/site-packages (from accelerate) (0.23.4)\nRequirement already satisfied: safetensors>=0.3.1 in /opt/conda/lib/python3.10/site-packages (from accelerate) (0.4.3)\nRequirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.10/site-packages (from packaging>=20.0->accelerate) (3.1.1)\nRequirement already satisfied: filelock in /opt/conda/lib/python3.10/site-packages (from torch>=1.10.0->accelerate) (3.13.1)\nRequirement already satisfied: typing-extensions in /opt/conda/lib/python3.10/site-packages (from torch>=1.10.0->accelerate) (4.9.0)\nRequirement already satisfied: sympy in /opt/conda/lib/python3.10/site-packages (from torch>=1.10.0->accelerate) (1.13.0)\nRequirement already satisfied: networkx in /opt/conda/lib/python3.10/site-packages (from torch>=1.10.0->accelerate) (3.2.1)\nRequirement already satisfied: jinja2 in /opt/conda/lib/python3.10/site-packages (from torch>=1.10.0->accelerate) (3.1.2)\nRequirement already satisfied: fsspec in /opt/conda/lib/python3.10/site-packages (from torch>=1.10.0->accelerate) (2024.5.0)\nRequirement already satisfied: requests in /opt/conda/lib/python3.10/site-packages (from huggingface-hub->accelerate) (2.32.3)\nRequirement already satisfied: tqdm>=4.42.1 in /opt/conda/lib/python3.10/site-packages (from huggingface-hub->accelerate) (4.66.4)\nRequirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.10/site-packages (from jinja2->torch>=1.10.0->accelerate) (2.1.3)\nRequirement already satisfied: charset-normalizer<4,>=2 in /opt/conda/lib/python3.10/site-packages (from requests->huggingface-hub->accelerate) (3.3.2)\nRequirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.10/site-packages (from requests->huggingface-hub->accelerate) (3.6)\nRequirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/lib/python3.10/site-packages (from requests->huggingface-hub->accelerate) (1.26.18)\nRequirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.10/site-packages (from requests->huggingface-hub->accelerate) (2024.7.4)\nRequirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/conda/lib/python3.10/site-packages (from sympy->torch>=1.10.0->accelerate) (1.3.0)\nRequirement already satisfied: datasets in /opt/conda/lib/python3.10/site-packages (2.20.0)\nRequirement already satisfied: filelock in /opt/conda/lib/python3.10/site-packages (from datasets) (3.13.1)\nRequirement already satisfied: numpy>=1.17 in /opt/conda/lib/python3.10/site-packages (from datasets) (1.26.4)\nRequirement already satisfied: pyarrow>=15.0.0 in /opt/conda/lib/python3.10/site-packages (from datasets) (16.1.0)\nRequirement already satisfied: pyarrow-hotfix in /opt/conda/lib/python3.10/site-packages (from datasets) (0.6)\nRequirement already satisfied: dill<0.3.9,>=0.3.0 in /opt/conda/lib/python3.10/site-packages (from datasets) (0.3.8)\nRequirement already satisfied: pandas in /opt/conda/lib/python3.10/site-packages (from datasets) (2.2.2)\nRequirement already satisfied: requests>=2.32.2 in /opt/conda/lib/python3.10/site-packages (from datasets) (2.32.3)\nRequirement already satisfied: tqdm>=4.66.3 in /opt/conda/lib/python3.10/site-packages (from datasets) (4.66.4)\nRequirement already satisfied: xxhash in /opt/conda/lib/python3.10/site-packages (from datasets) (3.4.1)\nRequirement already satisfied: multiprocess in /opt/conda/lib/python3.10/site-packages (from datasets) (0.70.16)\nRequirement already satisfied: fsspec<=2024.5.0,>=2023.1.0 in /opt/conda/lib/python3.10/site-packages (from fsspec[http]<=2024.5.0,>=2023.1.0->datasets) (2024.5.0)\nRequirement already satisfied: aiohttp in /opt/conda/lib/python3.10/site-packages (from datasets) (3.9.1)\nRequirement already satisfied: huggingface-hub>=0.21.2 in /opt/conda/lib/python3.10/site-packages (from datasets) (0.23.4)\nRequirement already satisfied: packaging in /opt/conda/lib/python3.10/site-packages (from datasets) (21.3)\nRequirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.10/site-packages (from datasets) (6.0.1)\nRequirement already satisfied: attrs>=17.3.0 in /opt/conda/lib/python3.10/site-packages (from aiohttp->datasets) (23.2.0)\nRequirement already satisfied: multidict<7.0,>=4.5 in /opt/conda/lib/python3.10/site-packages (from aiohttp->datasets) (6.0.4)\nRequirement already satisfied: yarl<2.0,>=1.0 in /opt/conda/lib/python3.10/site-packages (from aiohttp->datasets) (1.9.3)\nRequirement already satisfied: frozenlist>=1.1.1 in /opt/conda/lib/python3.10/site-packages (from aiohttp->datasets) (1.4.1)\nRequirement already satisfied: aiosignal>=1.1.2 in /opt/conda/lib/python3.10/site-packages (from aiohttp->datasets) (1.3.1)\nRequirement already satisfied: async-timeout<5.0,>=4.0 in /opt/conda/lib/python3.10/site-packages (from aiohttp->datasets) (4.0.3)\nRequirement already satisfied: typing-extensions>=3.7.4.3 in /opt/conda/lib/python3.10/site-packages (from huggingface-hub>=0.21.2->datasets) (4.9.0)\nRequirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.10/site-packages (from packaging->datasets) (3.1.1)\nRequirement already satisfied: charset-normalizer<4,>=2 in /opt/conda/lib/python3.10/site-packages (from requests>=2.32.2->datasets) (3.3.2)\nRequirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.10/site-packages (from requests>=2.32.2->datasets) (3.6)\nRequirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/lib/python3.10/site-packages (from requests>=2.32.2->datasets) (1.26.18)\nRequirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.10/site-packages (from requests>=2.32.2->datasets) (2024.7.4)\nRequirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.10/site-packages (from pandas->datasets) (2.9.0.post0)\nRequirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.10/site-packages (from pandas->datasets) (2023.3.post1)\nRequirement already satisfied: tzdata>=2022.7 in /opt/conda/lib/python3.10/site-packages (from pandas->datasets) (2023.4)\nRequirement already satisfied: six>=1.5 in /opt/conda/lib/python3.10/site-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.16.0)\nCollecting bertviz\n  Downloading bertviz-1.4.0-py3-none-any.whl.metadata (19 kB)\nRequirement already satisfied: transformers>=2.0 in /opt/conda/lib/python3.10/site-packages (from bertviz) (4.42.4)\nRequirement already satisfied: torch>=1.0 in /opt/conda/lib/python3.10/site-packages (from bertviz) (2.1.2)\nRequirement already satisfied: tqdm in /opt/conda/lib/python3.10/site-packages (from bertviz) (4.66.4)\nRequirement already satisfied: boto3 in /opt/conda/lib/python3.10/site-packages (from bertviz) (1.26.100)\nRequirement already satisfied: requests in /opt/conda/lib/python3.10/site-packages (from bertviz) (2.32.3)\nRequirement already satisfied: regex in /opt/conda/lib/python3.10/site-packages (from bertviz) (2023.12.25)\nRequirement already satisfied: sentencepiece in /opt/conda/lib/python3.10/site-packages (from bertviz) (0.2.0)\nRequirement already satisfied: filelock in /opt/conda/lib/python3.10/site-packages (from torch>=1.0->bertviz) (3.13.1)\nRequirement already satisfied: typing-extensions in /opt/conda/lib/python3.10/site-packages (from torch>=1.0->bertviz) (4.9.0)\nRequirement already satisfied: sympy in /opt/conda/lib/python3.10/site-packages (from torch>=1.0->bertviz) (1.13.0)\nRequirement already satisfied: networkx in /opt/conda/lib/python3.10/site-packages (from torch>=1.0->bertviz) (3.2.1)\nRequirement already satisfied: jinja2 in /opt/conda/lib/python3.10/site-packages (from torch>=1.0->bertviz) (3.1.2)\nRequirement already satisfied: fsspec in /opt/conda/lib/python3.10/site-packages (from torch>=1.0->bertviz) (2024.5.0)\nRequirement already satisfied: huggingface-hub<1.0,>=0.23.2 in /opt/conda/lib/python3.10/site-packages (from transformers>=2.0->bertviz) (0.23.4)\nRequirement already satisfied: numpy<2.0,>=1.17 in /opt/conda/lib/python3.10/site-packages (from transformers>=2.0->bertviz) (1.26.4)\nRequirement already satisfied: packaging>=20.0 in /opt/conda/lib/python3.10/site-packages (from transformers>=2.0->bertviz) (21.3)\nRequirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.10/site-packages (from transformers>=2.0->bertviz) (6.0.1)\nRequirement already satisfied: safetensors>=0.4.1 in /opt/conda/lib/python3.10/site-packages (from transformers>=2.0->bertviz) (0.4.3)\nRequirement already satisfied: tokenizers<0.20,>=0.19 in /opt/conda/lib/python3.10/site-packages (from transformers>=2.0->bertviz) (0.19.1)\nCollecting botocore<1.30.0,>=1.29.100 (from boto3->bertviz)\n  Downloading botocore-1.29.165-py3-none-any.whl.metadata (5.9 kB)\nRequirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/conda/lib/python3.10/site-packages (from boto3->bertviz) (1.0.1)\nRequirement already satisfied: s3transfer<0.7.0,>=0.6.0 in /opt/conda/lib/python3.10/site-packages (from boto3->bertviz) (0.6.2)\nRequirement already satisfied: charset-normalizer<4,>=2 in /opt/conda/lib/python3.10/site-packages (from requests->bertviz) (3.3.2)\nRequirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.10/site-packages (from requests->bertviz) (3.6)\nRequirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/lib/python3.10/site-packages (from requests->bertviz) (1.26.18)\nRequirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.10/site-packages (from requests->bertviz) (2024.7.4)\nRequirement already satisfied: python-dateutil<3.0.0,>=2.1 in /opt/conda/lib/python3.10/site-packages (from botocore<1.30.0,>=1.29.100->boto3->bertviz) (2.9.0.post0)\nRequirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.10/site-packages (from packaging>=20.0->transformers>=2.0->bertviz) (3.1.1)\nRequirement already satisfied: MarkupSafe>=2.0 in /opt/conda/lib/python3.10/site-packages (from jinja2->torch>=1.0->bertviz) (2.1.3)\nRequirement already satisfied: mpmath<1.4,>=1.1.0 in /opt/conda/lib/python3.10/site-packages (from sympy->torch>=1.0->bertviz) (1.3.0)\nRequirement already satisfied: six>=1.5 in /opt/conda/lib/python3.10/site-packages (from python-dateutil<3.0.0,>=2.1->botocore<1.30.0,>=1.29.100->boto3->bertviz) (1.16.0)\nDownloading bertviz-1.4.0-py3-none-any.whl (157 kB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m157.6/157.6 kB\u001b[0m \u001b[31m1.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0mm\n\u001b[?25hDownloading botocore-1.29.165-py3-none-any.whl (11.0 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m11.0/11.0 MB\u001b[0m \u001b[31m51.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m0:01\u001b[0m\n\u001b[?25hInstalling collected packages: botocore, bertviz\n  Attempting uninstall: botocore\n    Found existing installation: botocore 1.34.131\n    Uninstalling botocore-1.34.131:\n      Successfully uninstalled botocore-1.34.131\n\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\naiobotocore 2.13.1 requires aiohttp<4.0.0,>=3.9.2, but you have aiohttp 3.9.1 which is incompatible.\naiobotocore 2.13.1 requires botocore<1.34.132,>=1.34.70, but you have botocore 1.29.165 which is incompatible.\u001b[0m\u001b[31m\n\u001b[0mSuccessfully installed bertviz-1.4.0 botocore-1.29.165\nRequirement already satisfied: umap-learn in /opt/conda/lib/python3.10/site-packages (0.5.6)\nRequirement already satisfied: numpy>=1.17 in /opt/conda/lib/python3.10/site-packages (from umap-learn) (1.26.4)\nRequirement already satisfied: scipy>=1.3.1 in /opt/conda/lib/python3.10/site-packages (from umap-learn) (1.11.4)\nRequirement already satisfied: scikit-learn>=0.22 in /opt/conda/lib/python3.10/site-packages (from umap-learn) (1.2.2)\nRequirement already satisfied: numba>=0.51.2 in /opt/conda/lib/python3.10/site-packages (from umap-learn) (0.58.1)\nRequirement already satisfied: pynndescent>=0.5 in /opt/conda/lib/python3.10/site-packages (from umap-learn) (0.5.13)\nRequirement already satisfied: tqdm in /opt/conda/lib/python3.10/site-packages (from umap-learn) (4.66.4)\nRequirement already satisfied: llvmlite<0.42,>=0.41.0dev0 in /opt/conda/lib/python3.10/site-packages (from numba>=0.51.2->umap-learn) (0.41.1)\nRequirement already satisfied: joblib>=0.11 in /opt/conda/lib/python3.10/site-packages (from pynndescent>=0.5->umap-learn) (1.4.2)\nRequirement already satisfied: threadpoolctl>=2.0.0 in /opt/conda/lib/python3.10/site-packages (from scikit-learn>=0.22->umap-learn) (3.2.0)\nRequirement already satisfied: sentencepiece in /opt/conda/lib/python3.10/site-packages (0.2.0)\nRequirement already satisfied: urllib3 in /opt/conda/lib/python3.10/site-packages (1.26.18)\nCollecting urllib3\n  Downloading urllib3-2.2.2-py3-none-any.whl.metadata (6.4 kB)\nDownloading urllib3-2.2.2-py3-none-any.whl (121 kB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m121.4/121.4 kB\u001b[0m \u001b[31m1.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m \u001b[36m0:00:01\u001b[0m0m\n\u001b[?25hInstalling collected packages: urllib3\n  Attempting uninstall: urllib3\n    Found existing installation: urllib3 1.26.18\n    Uninstalling urllib3-1.26.18:\n      Successfully uninstalled urllib3-1.26.18\n\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\ntensorflow-decision-forests 1.8.1 requires wurlitzer, which is not installed.\nbotocore 1.29.165 requires urllib3<1.27,>=1.25.4, but you have urllib3 2.2.2 which is incompatible.\ndistributed 2024.5.1 requires dask==2024.5.1, but you have dask 2024.7.0 which is incompatible.\nkfp 2.5.0 requires google-cloud-storage<3,>=2.2.1, but you have google-cloud-storage 1.44.0 which is incompatible.\nkfp 2.5.0 requires urllib3<2.0.0, but you have urllib3 2.2.2 which is incompatible.\nrapids-dask-dependency 24.6.0a0 requires dask==2024.5.1, but you have dask 2024.7.0 which is incompatible.\ntensorflow 2.15.0 requires keras<2.16,>=2.15.0, but you have keras 3.4.1 which is incompatible.\nydata-profiling 4.6.4 requires numpy<1.26,>=1.16.0, but you have numpy 1.26.4 which is incompatible.\u001b[0m\u001b[31m\n\u001b[0mSuccessfully installed urllib3-2.1.0\nCollecting py7zr\n  Downloading py7zr-0.21.1-py3-none-any.whl.metadata (17 kB)\nRequirement already satisfied: texttable in /opt/conda/lib/python3.10/site-packages (from py7zr) (1.7.0)\nCollecting pycryptodomex>=3.16.0 (from py7zr)\n  Downloading pycryptodomex-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (3.4 kB)\nCollecting pyzstd>=0.15.9 (from py7zr)\n  Downloading pyzstd-0.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (2.4 kB)\nCollecting pyppmd<1.2.0,>=1.1.0 (from py7zr)\n  Downloading pyppmd-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (5.7 kB)\nCollecting pybcj<1.1.0,>=1.0.0 (from py7zr)\n  Downloading pybcj-1.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.0 kB)\nCollecting multivolumefile>=0.2.3 (from py7zr)\n  Downloading multivolumefile-0.2.3-py3-none-any.whl.metadata (6.3 kB)\nCollecting inflate64<1.1.0,>=1.0.0 (from py7zr)\n  Downloading inflate64-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (4.0 kB)\nRequirement already satisfied: brotli>=1.1.0 in /opt/conda/lib/python3.10/site-packages (from py7zr) (1.1.0)\nRequirement already satisfied: psutil in /opt/conda/lib/python3.10/site-packages (from py7zr) (5.9.3)\nDownloading py7zr-0.21.1-py3-none-any.whl (67 kB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m67.8/67.8 kB\u001b[0m \u001b[31m1.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0meta \u001b[36m0:00:01\u001b[0m\n\u001b[?25hDownloading inflate64-1.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (93 kB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m93.1/93.1 kB\u001b[0m \u001b[31m3.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n\u001b[?25hDownloading multivolumefile-0.2.3-py3-none-any.whl (17 kB)\nDownloading pybcj-1.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (49 kB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m49.7/49.7 kB\u001b[0m \u001b[31m2.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n\u001b[?25hDownloading pycryptodomex-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (2.1 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.1/2.1 MB\u001b[0m \u001b[31m14.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n\u001b[?25hDownloading pyppmd-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (138 kB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m138.9/138.9 kB\u001b[0m \u001b[31m3.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n\u001b[?25hDownloading pyzstd-0.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (413 kB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m413.8/413.8 kB\u001b[0m \u001b[31m27.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n\u001b[?25hInstalling collected packages: pyzstd, pyppmd, pycryptodomex, pybcj, multivolumefile, inflate64, py7zr\nSuccessfully installed inflate64-1.0.0 multivolumefile-0.2.3 py7zr-0.21.1 pybcj-1.0.2 pycryptodomex-3.20.0 pyppmd-1.1.0 pyzstd-0.16.0\nFound existing installation: botocore 1.29.165\nUninstalling botocore-1.29.165:\n  Successfully uninstalled botocore-1.29.165\nCollecting botocore\n  Downloading botocore-1.34.145-py3-none-any.whl.metadata (5.7 kB)\nRequirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/conda/lib/python3.10/site-packages (from botocore) (1.0.1)\nRequirement already satisfied: python-dateutil<3.0.0,>=2.1 in /opt/conda/lib/python3.10/site-packages (from botocore) (2.9.0.post0)\nRequirement already satisfied: urllib3!=2.2.0,<3,>=1.25.4 in /opt/conda/lib/python3.10/site-packages (from botocore) (2.1.0)\nRequirement already satisfied: six>=1.5 in /opt/conda/lib/python3.10/site-packages (from python-dateutil<3.0.0,>=2.1->botocore) (1.16.0)\nDownloading botocore-1.34.145-py3-none-any.whl (12.4 MB)\n\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m12.4/12.4 MB\u001b[0m \u001b[31m61.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m:00:01\u001b[0m0:01\u001b[0m\n\u001b[?25hInstalling collected packages: botocore\n\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\naiobotocore 2.13.1 requires aiohttp<4.0.0,>=3.9.2, but you have aiohttp 3.9.1 which is incompatible.\naiobotocore 2.13.1 requires botocore<1.34.132,>=1.34.70, but you have botocore 1.34.145 which is incompatible.\nboto3 1.26.100 requires botocore<1.30.0,>=1.29.100, but you have botocore 1.34.145 which is incompatible.\u001b[0m\u001b[31m\n\u001b[0mSuccessfully installed botocore-1.34.145\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Import Transformers, Dataset","metadata":{}},{"cell_type":"code","source":"from datasets import load_dataset\nfrom transformers import pipeline\n\nfrom transformers import AutoModelForSeq2SeqLM, AutoTokenizer\nimport torch","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:47:34.631285Z","iopub.execute_input":"2024-07-20T03:47:34.631859Z","iopub.status.idle":"2024-07-20T03:47:53.500410Z","shell.execute_reply.started":"2024-07-20T03:47:34.631820Z","shell.execute_reply":"2024-07-20T03:47:53.499569Z"},"trusted":true},"execution_count":2,"outputs":[{"name":"stderr","text":"2024-07-20 03:47:42.643508: E external/local_xla/xla/stream_executor/cuda/cuda_dnn.cc:9261] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n2024-07-20 03:47:42.643643: E external/local_xla/xla/stream_executor/cuda/cuda_fft.cc:607] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n2024-07-20 03:47:42.773001: E external/local_xla/xla/stream_executor/cuda/cuda_blas.cc:1515] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Load Samsum Dataset","metadata":{}},{"cell_type":"code","source":"samsum_df = load_dataset('samsum')\nsamsum_df","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:47:53.501564Z","iopub.execute_input":"2024-07-20T03:47:53.502197Z","iopub.status.idle":"2024-07-20T03:48:01.738605Z","shell.execute_reply.started":"2024-07-20T03:47:53.502162Z","shell.execute_reply":"2024-07-20T03:48:01.737606Z"},"trusted":true},"execution_count":3,"outputs":[{"output_type":"display_data","data":{"text/plain":"Downloading builder script:   0%|          | 0.00/3.36k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"84c1b3168aae4be3a008b446edf9d2e6"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Downloading readme:   0%|          | 0.00/7.04k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"0466fa4cd3cc4804aa01e0e9ba8b9fc0"}},"metadata":{}},{"output_type":"stream","name":"stdin","text":"The repository for samsum contains custom code which must be executed to correctly load the dataset. You can inspect the repository content at https://hf.co/datasets/samsum.\nYou can avoid this prompt in future by passing the argument `trust_remote_code=True`.\n\nDo you wish to run the custom code? [y/N]  y\n"},{"output_type":"display_data","data":{"text/plain":"Downloading data:   0%|          | 0.00/2.94M [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"346e206ed9e641dc8f6810ddbdbafa06"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Generating train split:   0%|          | 0/14732 [00:00<?, ? examples/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"e9e3ba10f1b644319e2b245be4727689"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Generating test split:   0%|          | 0/819 [00:00<?, ? examples/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"e6b002bdb86743adbe627fdcdc18c3f8"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Generating validation split:   0%|          | 0/818 [00:00<?, ? examples/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"457de5bbb5554e7187a1570d281c411e"}},"metadata":{}},{"execution_count":3,"output_type":"execute_result","data":{"text/plain":"DatasetDict({\n    train: Dataset({\n        features: ['id', 'dialogue', 'summary'],\n        num_rows: 14732\n    })\n    test: Dataset({\n        features: ['id', 'dialogue', 'summary'],\n        num_rows: 819\n    })\n    validation: Dataset({\n        features: ['id', 'dialogue', 'summary'],\n        num_rows: 818\n    })\n})"},"metadata":{}}]},{"cell_type":"code","source":"samsum_df['train']['dialogue'][100]","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:48:17.256997Z","iopub.execute_input":"2024-07-20T03:48:17.257409Z","iopub.status.idle":"2024-07-20T03:48:17.294729Z","shell.execute_reply.started":"2024-07-20T03:48:17.257380Z","shell.execute_reply":"2024-07-20T03:48:17.293716Z"},"trusted":true},"execution_count":5,"outputs":[{"execution_count":5,"output_type":"execute_result","data":{"text/plain":"\"Gabby: How is you? Settling into the new house OK?\\r\\nSandra: Good. The kids and the rest of the menagerie are doing fine. The dogs absolutely love the new garden. Plenty of room to dig and run around.\\r\\nGabby: What about the hubby?\\r\\nSandra: Well, apart from being his usual grumpy self I guess he's doing OK.\\r\\nGabby: :-D yeah sounds about right for Jim.\\r\\nSandra: He's a man of few words. No surprises there. Give him a backyard shed and that's the last you'll see of him for months.\\r\\nGabby: LOL that describes most men I know.\\r\\nSandra: Ain't that the truth! \\r\\nGabby: Sure is. :-) My one might as well move into the garage. Always tinkering and building something in there.\\r\\nSandra: Ever wondered what he's doing in there?\\r\\nGabby: All the time. But he keeps the place locked.\\r\\nSandra: Prolly building a portable teleporter or something. ;-)\\r\\nGabby: Or a time machine... LOL\\r\\nSandra: Or a new greatly improved Rabbit :-P\\r\\nGabby: I wish... Lmfao!\""},"metadata":{}}]},{"cell_type":"code","source":"samsum_df['train']['summary'][100]","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:48:28.533245Z","iopub.execute_input":"2024-07-20T03:48:28.533633Z","iopub.status.idle":"2024-07-20T03:48:28.564101Z","shell.execute_reply.started":"2024-07-20T03:48:28.533604Z","shell.execute_reply":"2024-07-20T03:48:28.562715Z"},"trusted":true},"execution_count":6,"outputs":[{"execution_count":6,"output_type":"execute_result","data":{"text/plain":"'Sandra is setting into the new house; her family is happy with it. Then Sandra and Gabby discuss the nature of their men and laugh about their habit of spending time in the garage or a shed.'"},"metadata":{}}]},{"cell_type":"code","source":"samsum_df['validation']['dialogue'][30]","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:48:55.082936Z","iopub.execute_input":"2024-07-20T03:48:55.083364Z","iopub.status.idle":"2024-07-20T03:48:55.094064Z","shell.execute_reply.started":"2024-07-20T03:48:55.083331Z","shell.execute_reply":"2024-07-20T03:48:55.092849Z"},"trusted":true},"execution_count":8,"outputs":[{"execution_count":8,"output_type":"execute_result","data":{"text/plain":"\"Toby: Hi, when are you leaving?\\r\\nTheo: on Friday.\\r\\nToby: Soon!\\r\\nTheo: soonish\\r\\nToby: Where are you going? decided?\\r\\nTheo: I was thinking about the Italian Alpes\\r\\nToby: where exactly? \\r\\nTheo: close to Torino I guess\\r\\nToby: Do you have a free seat in the car?\\r\\nTheo: I think we still do\\r\\nToby: So maybe I would join you, just for the weekend.\\r\\nTheo: That would be very nice!\\r\\nToby: And I would come back by train on Monday.\\r\\nTheo: Is it worth it, the journey?\\r\\nToby: I haven't beed skiing for years, I really miss it\\r\\nTheo: ok, but we want to depart before 7am, will you manage?\\r\\nToby: if you could pick my up, or at least come to my neighbourhood...\\r\\nTheo: That's not a problem!\\r\\nToby: Great!\\r\\nTheo: I'll write you later about all the details.\""},"metadata":{}}]},{"cell_type":"code","source":"samsum_df['validation']['summary'][30]","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:49:04.537104Z","iopub.execute_input":"2024-07-20T03:49:04.537865Z","iopub.status.idle":"2024-07-20T03:49:04.545741Z","shell.execute_reply.started":"2024-07-20T03:49:04.537821Z","shell.execute_reply":"2024-07-20T03:49:04.544567Z"},"trusted":true},"execution_count":9,"outputs":[{"execution_count":9,"output_type":"execute_result","data":{"text/plain":"\"Theo's going to stay near Torino in the region of Italian Alpes. Toby wants to join the trip. Theo agrees and will pick Toby up on Friday at 7 am.\""},"metadata":{}}]},{"cell_type":"markdown","source":"# Text Cleaning","metadata":{}},{"cell_type":"code","source":"import re\n\ndef clean_text(text):\n    # Remove Byte Order Marks (BOM)\n    text = text.replace('\\ufeff', '')\n    # Replace \\n with a space\n    text = text.replace('\\n', ' ')\n    # Replace \\r with a space\n    text = text.replace('\\r', ' ')\n    # Remove backslashes\n    text = text.replace('\\\\', '')\n    # Remove Non-ASCII characters\n    text = re.sub(r'[^\\x00-\\x7F]+', '', text)\n    # Remove Non-printable characters\n    text = re.sub(r'[\\x00-\\x1F\\x7F-\\x9F]', '', text)\n    # Normalize whitespace\n    text = ' '.join(text.split())\n    return text","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:54:15.172835Z","iopub.execute_input":"2024-07-20T03:54:15.173525Z","iopub.status.idle":"2024-07-20T03:54:15.179639Z","shell.execute_reply.started":"2024-07-20T03:54:15.173490Z","shell.execute_reply":"2024-07-20T03:54:15.178538Z"},"trusted":true},"execution_count":14,"outputs":[]},{"cell_type":"code","source":"# Clean text for train dataset\nsamsum_df['train'] = samsum_df['train'].map(lambda x: {'dialogue': clean_text(x['dialogue'])})\n\n# Clean text for validation dataset\nsamsum_df['validation'] = samsum_df['validation'].map(lambda x: {'dialogue': clean_text(x['dialogue'])})\n\n# Clean text for test dataset\nsamsum_df['test'] = samsum_df['test'].map(lambda x: {'dialogue': clean_text(x['dialogue'])})\n","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:54:15.646933Z","iopub.execute_input":"2024-07-20T03:54:15.648076Z","iopub.status.idle":"2024-07-20T03:54:17.708694Z","shell.execute_reply.started":"2024-07-20T03:54:15.648042Z","shell.execute_reply":"2024-07-20T03:54:17.707640Z"},"trusted":true},"execution_count":15,"outputs":[{"output_type":"display_data","data":{"text/plain":"Map:   0%|          | 0/14732 [00:00<?, ? examples/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"5cd0c24327724a01a31bcf224b9b3155"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Map:   0%|          | 0/818 [00:00<?, ? examples/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"197994820a0b466a8106935aef2e50c0"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Map:   0%|          | 0/819 [00:00<?, ? examples/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"f50db451e94e4f0881514e61d4500d4b"}},"metadata":{}}]},{"cell_type":"code","source":"samsum_df['validation']['dialogue'][30]","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:54:28.322558Z","iopub.execute_input":"2024-07-20T03:54:28.322945Z","iopub.status.idle":"2024-07-20T03:54:28.331745Z","shell.execute_reply.started":"2024-07-20T03:54:28.322913Z","shell.execute_reply":"2024-07-20T03:54:28.330592Z"},"trusted":true},"execution_count":16,"outputs":[{"execution_count":16,"output_type":"execute_result","data":{"text/plain":"\"Toby: Hi, when are you leaving? Theo: on Friday. Toby: Soon! Theo: soonish Toby: Where are you going? decided? Theo: I was thinking about the Italian Alpes Toby: where exactly? Theo: close to Torino I guess Toby: Do you have a free seat in the car? Theo: I think we still do Toby: So maybe I would join you, just for the weekend. Theo: That would be very nice! Toby: And I would come back by train on Monday. Theo: Is it worth it, the journey? Toby: I haven't beed skiing for years, I really miss it Theo: ok, but we want to depart before 7am, will you manage? Toby: if you could pick my up, or at least come to my neighbourhood... Theo: That's not a problem! Toby: Great! Theo: I'll write you later about all the details.\""},"metadata":{}}]},{"cell_type":"markdown","source":"# Load Model","metadata":{}},{"cell_type":"code","source":"device = 'gpu'\nmodel_ckpt = 'facebook/bart-large-cnn'\ntokenizer = AutoTokenizer.from_pretrained(model_ckpt)\nmodel = AutoModelForSeq2SeqLM.from_pretrained(model_ckpt)","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:54:34.452624Z","iopub.execute_input":"2024-07-20T03:54:34.453492Z","iopub.status.idle":"2024-07-20T03:54:45.915251Z","shell.execute_reply.started":"2024-07-20T03:54:34.453454Z","shell.execute_reply":"2024-07-20T03:54:45.914418Z"},"trusted":true},"execution_count":17,"outputs":[{"output_type":"display_data","data":{"text/plain":"config.json:   0%|          | 0.00/1.58k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"94b95a170c4e41aa931a844f89dad2f0"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"vocab.json:   0%|          | 0.00/899k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"c45f7a89e7174cfda7265d880ffccfbb"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"merges.txt:   0%|          | 0.00/456k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"3a4939f81d5242f794d1c49f5ab6e945"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"tokenizer.json:   0%|          | 0.00/1.36M [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"c703afd9d7974273b6dfc2b9e08e2762"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"model.safetensors:   0%|          | 0.00/1.63G [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"28328e05dc4d47439fb77993d0986877"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"generation_config.json:   0%|          | 0.00/363 [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"e6f39cb199b245b5a40f147a4ee1dda0"}},"metadata":{}}]},{"cell_type":"code","source":"dialogue_len = [len(x['dialogue'].split()) for x in samsum_df['train']]\nsummary_len = [len(x['summary'].split()) for x in samsum_df['train']]","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:54:45.916881Z","iopub.execute_input":"2024-07-20T03:54:45.917222Z","iopub.status.idle":"2024-07-20T03:54:47.570702Z","shell.execute_reply.started":"2024-07-20T03:54:45.917195Z","shell.execute_reply":"2024-07-20T03:54:47.569594Z"},"trusted":true},"execution_count":18,"outputs":[]},{"cell_type":"code","source":"import pandas as pd\n\ndata = pd.DataFrame([dialogue_len, summary_len]).T\ndata.columns = ['Dialogue Length', 'Summary Length']\n\ndata.hist(figsize=(15,5))","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:54:47.572756Z","iopub.execute_input":"2024-07-20T03:54:47.573190Z","iopub.status.idle":"2024-07-20T03:54:48.620404Z","shell.execute_reply.started":"2024-07-20T03:54:47.573152Z","shell.execute_reply":"2024-07-20T03:54:48.619120Z"},"trusted":true},"execution_count":19,"outputs":[{"execution_count":19,"output_type":"execute_result","data":{"text/plain":"array([[<Axes: title={'center': 'Dialogue Length'}>,\n        <Axes: title={'center': 'Summary Length'}>]], dtype=object)"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<Figure size 1500x500 with 2 Axes>","image/png":"iVBORw0KGgoAAAANSUhEUgAABMsAAAHDCAYAAAA6Bp1oAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABz1UlEQVR4nO3dfVxUZf7/8TcgDKAN5A0giUi5q+JNmpbOVmaKTMa23dj+skypTNPQUto0WzXUDLNMrUxrK2k33dK+1ZaaMmpqJt7xlfKmLEuz3QTaDMfbYYTz+6Nhvo6gODojOLyejwcPPed8zjXX5xoYrvlwzTlBhmEYAgAAAAAAAKDgmu4AAAAAAAAAUFtQLAMAAAAAAABcKJYBAAAAAAAALhTLAAAAAAAAABeKZQAAAAAAAIALxTIAAAAAAADAhWIZAAAAAAAA4EKxDAAAAAAAAHChWAYAAAAAAAC4UCwD6qCsrCwFBQWd07k9evRQjx49fNsheK1Fixb64x//WNPdAAAAwEVo7969CgoK0vPPP1/TXQFqJYplwEUuJydHQUFB7q/w8HDFx8fLarXqxRdf1KFDh2q6i7VWRdHwv//9b013pUo7d+5UVlaW9u7dW9NdAQAAAWDbtm268847lZiYqPDwcF122WXq3bu3XnrppZru2kWrR48eateuXU1347SWLl2qrKysmu4GcNGhWAYEiEmTJukf//iH5syZoxEjRkiSRo4cqfbt2+vLL7/0iB03bpyOHTtWE92EF3bu3KmJEydSLAMAAOdt/fr16tKli7744gsNHjxYL7/8sh588EEFBwdr1qxZNd09+MnSpUs1ceLEmu4GcNGpV9MdAOAbffr0UZcuXdzbY8eO1apVq/THP/5Rf/rTn/TVV18pIiJCklSvXj3Vq8ePPwAAQF0xZcoURUVFafPmzYqOjvY4VlxcXDOdqkGGYej48ePu+TEAnIyVZUAA69mzp8aPH68ffvhBb7/9tnt/Vdcsmzdvnnr27KmYmBiZTCYlJydrzpw5Z/U4xcXFGjRokGJjYxUeHq4rr7xSb731VqW4X375RQMGDJDZbFZ0dLTS09P1xRdfKCgoSDk5Oe64010X7b777lOLFi089pWXl2vmzJlq27atwsPDFRsbq4ceeki//vrrWfX9bHz99de688471bBhQ4WHh6tLly766KOPPGIqPg77+eefKzMzU02aNFH9+vV1++236+eff67U56ysLMXHxysyMlI33nijdu7cqRYtWui+++5zt/fnP/9ZknTjjTe6P2a7evVqj7bWrVuna665RuHh4br88sv197//3Wd5AwCAwPHdd9+pbdu2lQplkhQTE+P+f8W1rE6em1UICgry+EhfxZzym2++0b333quoqCg1adJE48ePl2EY+vHHH3XrrbfKbDYrLi5O06dP92hv9erVCgoK0sKFCzVx4kRddtlluuSSS3TnnXfq4MGDcjgcGjlypGJiYtSgQQPdf//9cjgcHm2c7Ry24nqvy5cvV5cuXRQREaFXX31VN9xwg6688soqx6xVq1ayWq1nGNWz98knn+j6669X/fr1dckllygtLU07duzwiLnvvvvUoEED/ec//9Ftt92mBg0aqEmTJvrLX/6isrIyj9izmVffd999mj17tiR5XLblVK+99pquuOIKmUwmXX311dq8ebNPcgYuZiwtAQLcgAED9OSTTyo3N1eDBw8+bdycOXPUtm1b/elPf1K9evX08ccf6+GHH1Z5ebkyMjJOe96xY8fUo0cP7d69W8OHD1dSUpIWLVqk++67TyUlJXr00Ucl/VYguuWWW7Rp0yYNGzZMrVu31r/+9S+lp6efV34PPfSQcnJydP/99+uRRx7Rnj179PLLL2vr1q36/PPPFRoael7t79ixQ9dee60uu+wyPfHEE6pfv74WLlyo2267Tf/zP/+j22+/3SN+xIgRuvTSS/XUU09p7969mjlzpoYPH653333XHTN27FhNmzZNt9xyi6xWq7744gtZrVYdP37cHdO9e3c98sgjevHFF/Xkk0+qTZs2kuT+V5J2796tO++8U4MGDVJ6errefPNN3XfffercubPatm17XnkDAIDAkpiYqLy8PG3fvt3n19i666671KZNG02dOlVLlizR008/rYYNG+rVV19Vz5499eyzz2r+/Pn6y1/+oquvvlrdu3f3OD87O1sRERF64okntHv3br300ksKDQ1VcHCwfv31V2VlZWnDhg3KyclRUlKSJkyY4D7Xmznsrl27dPfdd+uhhx7S4MGD1apVKzVo0ECDBw+uNC6bN2/WN998o3Hjxp33+PzjH/9Qenq6rFarnn32WR09elRz5szRddddp61bt3r8MbisrExWq1Vdu3bV888/rxUrVmj69Om64oorNGzYMElnP69+6KGH9NNPP8lms+kf//hHlX1bsGCBDh06pIceekhBQUGaNm2a7rjjDn3//ffnPY8GLmoGgIvavHnzDEnG5s2bTxsTFRVldOrUyb391FNPGaf++B89erTSeVar1bj88ss99t1www3GDTfc4N6eOXOmIcl4++233ftKS0sNi8ViNGjQwLDb7YZhGMb//M//GJKMmTNnuuPKysqMnj17GpKMefPmnfYxKqSnpxuJiYnu7c8++8yQZMyfP98jbtmyZVXuP1XFOPz888+njenVq5fRvn174/jx4+595eXlxh/+8Afjd7/7nXtfxfOQkpJilJeXu/ePGjXKCAkJMUpKSgzDMIzCwkKjXr16xm233ebxOFlZWYYkIz093b1v0aJFhiTj008/rdSvxMREQ5Kxdu1a977i4mLDZDIZjz322BnzBgAAdU9ubq4REhJihISEGBaLxRg9erSxfPlyo7S01CNuz549leZmFSQZTz31lHu7Yi41ZMgQ974TJ04YzZo1M4KCgoypU6e69//6669GRESEx1zn008/NSQZ7dq18+jH3XffbQQFBRl9+vTxeHyLxeIxFzSMs5/DVsydli1b5rG/pKTECA8PN8aMGeOx/5FHHjHq169vHD58uFL7J7vhhhuMtm3bnvb4oUOHjOjoaGPw4MEe+wsLC42oqCiP/enp6YYkY9KkSR6xnTp1Mjp37uze9mZenZGRUWnebxj/9zw3atTIOHDggHv/v/71L0OS8fHHH58xbyDQ8TFMoA5o0KBBtXfFPPl6DQcPHtR///tf3XDDDfr+++918ODB0563dOlSxcXF6e6773bvCw0N1SOPPKLDhw9rzZo1kqRly5YpNDTUY3VbcHDwGVetVWfRokWKiopS79699d///tf91blzZzVo0ECffvrpObctSQcOHNCqVav0//7f/9OhQ4fc7f/yyy+yWq369ttv9Z///MfjnCFDhngsb7/++utVVlamH374QZK0cuVKnThxQg8//LDHeRU3ZfBGcnKyrr/+evd2kyZN1KpVK33//fdetwUAAAJb7969lZeXpz/96U/64osvNG3aNFmtVl122WWVLi/hrQcffND9/5CQEHXp0kWGYWjQoEHu/dHR0aedpwwcONBjFVPXrl1lGIYeeOABj7iuXbvqxx9/1IkTJ9z7vJnDJiUlVfpYZVRUlG699Vb985//lGEYkn5b3fXuu+/qtttuU/369b0ZikpsNptKSkp09913e8xXQ0JC1LVr1yrnq0OHDvXYvv766z3GzZfz6rvuukuXXnqpx2NJYj6JOo+PYQJ1wOHDhz2uRVGVzz//XE899ZTy8vJ09OhRj2MHDx5UVFRUlef98MMP+t3vfqfgYM/ae8XHBSuKRD/88IOaNm2qyMhIj7iWLVt6lcvJvv32Wx08ePC0uZ3vxWp3794twzA0fvx4jR8//rSPcdlll7m3mzdv7nG8YvJRcQ21ivE4Ne+GDRt6TFTOxqmPVfF4vrxeGwAACBxXX3213n//fZWWluqLL77QBx98oBkzZujOO+9UQUGBkpOTz6ndU+ckUVFRCg8PV+PGjSvt/+WXX87qfElKSEiotL+8vFwHDx5Uo0aNJHk3h01KSqqy/wMHDtS7776rzz77TN27d9eKFStUVFSkAQMGnCnts/Ltt99K+u1awlUxm80e2+Hh4WrSpInHvlPnd76cV1c3dwXqKoplQID797//rYMHD57xl+d3332nXr16qXXr1nrhhReUkJCgsLAwLV26VDNmzFB5efkF7PFvFyCt+MveyU69sGl5ebliYmI0f/78Kts5daLhrYq8//KXv5z24q6njmtISEiVcVXlc74u5GMBAIDAERYWpquvvlpXX321fv/73+v+++/XokWL9NRTT1V5AXip8jzsZFXNSbyZp5wutro2vJ3Dnu7Ol1arVbGxsXr77bfVvXt3vf3224qLi1NKSkqV8d6o6MM//vEPxcXFVTp+6h3qT5ezvzCfBKpGsQwIcBUX8zzTnXw+/vhjORwOffTRRx5/XTqbjzEmJibqyy+/VHl5ucfqsq+//tp9vOLfTz/9VEePHvX4K9ju3bsrtXnppZdWufS7YlVWhSuuuEIrVqzQtdde65fbfl9++eWSfvtYqS8mS9L/jcfu3bs9/rr5yy+/VPoL3ukmqwAAAL7SpUsXSdL+/fsl/d/KopKSEo+4U+dhtcH5zGFPFhISonvuuUc5OTl69tln9eGHH2rw4ME+KVxdccUVkn6746gv55NnO69mPgmcG65ZBgSwVatWafLkyUpKSlL//v1PG1cxETj5L0gHDx7UvHnzqn2Mm2++WYWFhR53ezxx4oReeuklNWjQQDfccIOk34p1TqdTf/vb39xx5eXl7ttZn+yKK67Q119/rZ9//tm974svvtDnn3/uEff//t//U1lZmSZPnlypjRMnTlSa5HkrJiZGPXr00KuvvuqeQJ7s5P6drV69eqlevXqVbmn+8ssvV4qtuEbG+eYBAADw6aefVrlaaOnSpZKkVq1aSfrtY4GNGzfW2rVrPeJeeeUV/3fSS+czhz3VgAED9Ouvv+qhhx7S4cOHde+99/qkj1arVWazWc8884ycTmel4+cyn/RmXs18Ejg3rCwDAsQnn3yir7/+WidOnFBRUZFWrVolm82mxMREffTRRwoPDz/tuampqQoLC9Mtt9ziniD87W9/U0xMTJVFopMNGTJEr776qu677z7l5+erRYsWeu+99/T5559r5syZuuSSSyRJt912m6655ho99thj2r17t1q3bq2PPvpIBw4ckOT5V68HHnhAL7zwgqxWqwYNGqTi4mLNnTtXbdu2ld1ud8fdcMMNeuihh5Sdna2CggKlpqYqNDRU3377rRYtWqRZs2bpzjvvrHbsXnjhhUrXfAgODtaTTz6p2bNn67rrrlP79u01ePBgXX755SoqKlJeXp7+/e9/64svvqi2/ZPFxsbq0Ucf1fTp0/WnP/1JN910k7744gt98sknaty4scc4dOzYUSEhIXr22Wd18OBBmUwm9ezZs9rrzwEAAJxqxIgROnr0qG6//Xa1bt1apaWlWr9+vd599121aNFC999/vzv2wQcf1NSpU/Xggw+qS5cuWrt2rb755psa7H3VzmcOe6pOnTqpXbt2WrRokdq0aaOrrrrqrM/9+eef9fTTT1faX/EH6zlz5mjAgAG66qqr1K9fPzVp0kT79u3TkiVLdO2111b5R9Mz8WZe3blzZ0nSI488IqvVqpCQEPXr18+rxwPqIoplQICYMGGCpN+uQdGwYUO1b99eM2fO1P333+8uWJ1Oq1at9N5772ncuHH6y1/+ori4OA0bNkxNmjSpdBeiU0VERGj16tV64okn9NZbb8lut6tVq1aaN2+e7rvvPndcSEiIlixZokcffVRvvfWWgoODdfvtt+upp57Stdde61HMa9Omjf7+979rwoQJyszMVHJysv7xj39owYIFWr16tcfjz507V507d9arr76qJ598UvXq1VOLFi1077336tprrz2rscvOzq60LyQkRE8++aSSk5O1ZcsWTZw4UTk5Ofrll18UExOjTp06ucfc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NEidO3fWZ5995vERyfnz56t169bq1auXbr75Zl133XV67bXX3MejoqKUm5urPXv2qHPnznrsscc0YcIEDRky5ILnCwAALl5eFcvmzJmjDh06yGw2y2w2y2Kx6JNPPnEfP378uDIyMtSoUSM1aNBAffv2rXTdiH379iktLU2RkZGKiYnR448/rhMnTnjErF69WldddZVMJpNatmypnJycc88QAAAANa5Hjx4yDKPSV05OjiIiIrR8+XIVFxertLRUe/fu1Wuvvea+k2WFhg0basGCBTp06JAOHjyoN998Uw0aNPCI6dChgz777DMdP35c//73vzVmzJgLmSYAAAgAXhXLmjVrpqlTpyo/P19btmxRz549deutt2rHjh2SpFGjRunjjz/WokWLtGbNGv3000+644473OeXlZUpLS1NpaWlWr9+vd566y3l5ORowoQJ7pg9e/YoLS1NN954owoKCjRy5Eg9+OCDWr7cd3fgAQAAAAAAAKri1d0wb7nlFo/tKVOmaM6cOdqwYYOaNWumN954QwsWLFDPnj0lSfPmzVObNm20YcMGdevWTbm5udq5c6dWrFih2NhYdezYUZMnT9aYMWOUlZWlsLAwzZ07V0lJSZo+fbqk365PsW7dOs2YMcN9zQoAAAAAAADAH875mmVlZWV65513dOTIEVksFuXn58vpdColJcUd07p1azVv3lx5eXmSpLy8PLVv395jSb3VapXdbnevTsvLy/NooyKmog0AAAAAAADAX7xaWSZJ27Ztk8Vi0fHjx9WgQQN98MEHSk5OVkFBgcLCwhQdHe0RHxsbq8LCQklSYWFhpWtPVGxXF2O323Xs2DFFRERU2S+HwyGHw+HettvtkiSn0+lx+3BfqGjPFGz4tN3apCK32pKjr5/Dk9v0R9u1RV3IUaobeZJjYKgLOUr+zzPQxw8AAAA1y+tiWatWrVRQUKCDBw/qvffeU3p6utasWeOPvnklOztbEydOrLQ/NzdXkZGRfnnMyV3K/dJubVJbcly6dKnf2rbZbH5ru7aoCzlKdSNPcgwMdSFHyX95Hj161C/tAgAAANI5FMvCwsLUsmVLSVLnzp21efNmzZo1S3fddZdKS0tVUlLisbqsqKhIcXFxkqS4uDht2rTJo72Ku2WeHHPqHTSLiopkNptPu6pMksaOHavMzEz3tt1uV0JCglJTU2U2m71N84ycTqdsNpvGbwmWozzIp23XFqZgQ5O7lNeaHLdn+f56dRXPY+/evRUaGurz9muDupCjVDfyJMfAUBdylPyfZ8XqcQAAAMAfvC6Wnaq8vFwOh0OdO3dWaGioVq5cqb59+0qSdu3apX379slisUiSLBaLpkyZouLiYsXExEj67a/OZrNZycnJ7phTVxHZbDZ3G6djMplkMpkq7Q8NDfXbGxJHeZAcZTVfSPKn2pKjP99U+vN7pLaoCzlKdSNPcgwMdSFHyX951oWxAwAAQM3xqlg2duxY9enTR82bN9ehQ4e0YMECrV69WsuXL1dUVJQGDRqkzMxMNWzYUGazWSNGjJDFYlG3bt0kSampqUpOTtaAAQM0bdo0FRYWaty4ccrIyHAXuoYOHaqXX35Zo0eP1gMPPKBVq1Zp4cKFWrJkie+zBwAAAAAAAE7iVbGsuLhYAwcO1P79+xUVFaUOHTpo+fLl6t27tyRpxowZCg4OVt++feVwOGS1WvXKK6+4zw8JCdHixYs1bNgwWSwW1a9fX+np6Zo0aZI7JikpSUuWLNGoUaM0a9YsNWvWTK+//rqsVt9/DA8AAAAAAAA4mVfFsjfeeOOMx8PDwzV79mzNnj37tDGJiYnVXqy9R48e2rp1qzddAwAAAAAAAM5bcE13AAAAAAAAAKgtKJYBAAAAAAAALhTLAAAAAAAAABeKZQAAAAAAAIALxTIAAAAAAADAhWIZAAAAAAAA4EKxDAAAAAAAAHChWAYAAAAAAAC4UCwDAAAAAAAAXCiWAQAAAAAAAC4UywAAAAAAAAAXimUAAAAAAACAC8UyAAAAAAAAwIViGQAAAAAAAOBCsQwAAAAAAABwoVgGAAAAAAAAuFAsAwAAAAAAAFwolgEAAAAAAAAuFMsAAAAAAAAAF4plAAAAAAAAgAvFMgAAAAAAAMCFYhkAAAAAAADgUq+mOwAAAADUFS2eWFLTXQAAANVgZRkAAAAAAADgQrEMAAAAAAAAcKFYBgAAAAAAALhQLAMAAAAAAABcKJYBAAAAAAAALhTLAAAA4Hdr167VLbfcovj4eAUFBenDDz/0OG4YhiZMmKCmTZsqIiJCKSkp+vbbbz1iDhw4oP79+8tsNis6OlqDBg3S4cOHPWK+/PJLXX/99QoPD1dCQoKmTZvm79QAAECAoVgGAAAAvzty5IiuvPJKzZ49u8rj06ZN04svvqi5c+dq48aNql+/vqxWq44fP+6O6d+/v3bs2CGbzabFixdr7dq1GjJkiPu43W5XamqqEhMTlZ+fr+eee05ZWVl67bXX/J4fAAAIHPVqugMAAAAIfH369FGfPn2qPGYYhmbOnKlx48bp1ltvlST9/e9/V2xsrD788EP169dPX331lZYtW6bNmzerS5cukqSXXnpJN998s55//nnFx8dr/vz5Ki0t1ZtvvqmwsDC1bdtWBQUFeuGFFzyKagAAAGfCyjIAAADUqD179qiwsFApKSnufVFRUeratavy8vIkSXl5eYqOjnYXyiQpJSVFwcHB2rhxozume/fuCgsLc8dYrVbt2rVLv/766wXKBgAAXOxYWQYAAIAaVVhYKEmKjY312B8bG+s+VlhYqJiYGI/j9erVU8OGDT1ikpKSKrVRcezSSy+t9NgOh0MOh8O9bbfbJUlOp1NOp9PrXCrOOd25phDD6zYDjSnY8PgXnhif6vl6jM7lZ722q+61CIzR2Qi0MfImD4plAAAAqLOys7M1ceLESvtzc3MVGRl5zu3abLYq90+75pybDDiTu5TXdBdqNcaner4ao6VLl/qkndrodK9F+D+MUfUCZYyOHj161rEUywAAAFCj4uLiJElFRUVq2rSpe39RUZE6duzojikuLvY478SJEzpw4ID7/Li4OBUVFXnEVGxXxJxq7NixyszMdG/b7XYlJCQoNTVVZrPZ61ycTqdsNpt69+6t0NDQSsfbZS33us1AYwo2NLlLucZvCZajPKimu1PrMD7V8/UYbc+y+qBXtUt1r0VgjM5GoI1Rxerxs+FVsSw7O1vvv/++vv76a0VEROgPf/iDnn32WbVq1codc/z4cT322GN655135HA4ZLVa9corr3gsq9+3b5+GDRumTz/9VA0aNFB6erqys7NVr97/dWf16tXKzMzUjh07lJCQoHHjxum+++7zprsAAAC4CCQlJSkuLk4rV650F8fsdrs2btyoYcOGSZIsFotKSkqUn5+vzp07S5JWrVql8vJyde3a1R3z17/+VU6n0z2pt9lsatWqVZUfwZQkk8kkk8lUaX9oaOh5vTE43fmOMoofFRzlQYzHGTA+1fPVGAVCEeB0zve1rC5gjKoXKGPkTQ5eXeB/zZo1ysjI0IYNG2Sz2eR0OpWamqojR464Y0aNGqWPP/5YixYt0po1a/TTTz/pjjvucB8vKytTWlqaSktLtX79er311lvKycnRhAkT3DF79uxRWlqabrzxRhUUFGjkyJF68MEHtXw5f4kDAAC4GB0+fFgFBQUqKCiQ9Nt8r6CgQPv27VNQUJBGjhypp59+Wh999JG2bdumgQMHKj4+XrfddpskqU2bNrrppps0ePBgbdq0SZ9//rmGDx+ufv36KT4+XpJ0zz33KCwsTIMGDdKOHTv07rvvatasWR4rxwAAAKrj1cqyZcuWeWzn5OQoJiZG+fn56t69uw4ePKg33nhDCxYsUM+ePSVJ8+bNU5s2bbRhwwZ169ZNubm52rlzp1asWKHY2Fh17NhRkydP1pgxY5SVlaWwsDDNnTtXSUlJmj59uqTfJkfr1q3TjBkzZLUG3hJZAACAQLdlyxbdeOON7u2KAlZ6erpycnI0evRoHTlyREOGDFFJSYmuu+46LVu2TOHh4e5z5s+fr+HDh6tXr14KDg5W37599eKLL7qPR0VFKTc3VxkZGercubMaN26sCRMmaMiQIRcuUQAAcNE7r2uWHTx4UJLUsGFDSVJ+fr6cTqfHbb9bt26t5s2bKy8vT926dVNeXp7at2/v8bFMq9WqYcOGaceOHerUqZPy8vI82qiIGTly5Pl0FwAAADWkR48eMozT37kuKChIkyZN0qRJk04b07BhQy1YsOCMj9OhQwd99tln59xPAACAcy6WlZeXa+TIkbr22mvVrl07Sb/dkjssLEzR0dEesafe9ruq24JXHDtTjN1u17FjxxQREVGpP76+7feZVLQXyLdzrm23rPbHrWoD7Ta4VakLOUp1I09yDAx1IUfJ/3kG+vgBAACgZp1zsSwjI0Pbt2/XunXrfNmfc+av236fSV24nXNtydGft3MOlNvgnkldyFGqG3mSY2CoCzlK/svTm9t+AwAAAN46p2LZ8OHDtXjxYq1du1bNmjVz74+Li1NpaalKSko8VpcVFRV53NJ706ZNHu2dekvv093222w2V7mqTPL9bb/PpOL2qYF8O+fadstqf9zOOdBug1uVupCjVDfyJMfAUBdylPyfpze3/QYAoDotnlhS0104J3unptV0F4CA5VWxzDAMjRgxQh988IFWr16tpKQkj+OdO3dWaGioVq5cqb59+0qSdu3apX379slisUj67ZbeU6ZMUXFxsWJiYiT99pdn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"},"metadata":{}}]},{"cell_type":"markdown","source":"# Make Features","metadata":{}},{"cell_type":"code","source":"def get_feature(batch):\n  encodings = tokenizer(batch['dialogue'], text_target=batch['summary'],\n                        max_length=1024, truncation=True)\n\n  encodings = {'input_ids': encodings['input_ids'],\n               'attention_mask': encodings['attention_mask'],\n               'labels': encodings['labels']}\n\n  return encodings","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:54:49.642045Z","iopub.execute_input":"2024-07-20T03:54:49.642900Z","iopub.status.idle":"2024-07-20T03:54:49.652230Z","shell.execute_reply.started":"2024-07-20T03:54:49.642868Z","shell.execute_reply":"2024-07-20T03:54:49.651222Z"},"trusted":true},"execution_count":20,"outputs":[]},{"cell_type":"code","source":"samsum_pt = samsum_df.map(get_feature, batched=True)","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:54:51.122633Z","iopub.execute_input":"2024-07-20T03:54:51.123029Z","iopub.status.idle":"2024-07-20T03:55:00.526192Z","shell.execute_reply.started":"2024-07-20T03:54:51.122997Z","shell.execute_reply":"2024-07-20T03:55:00.525216Z"},"trusted":true},"execution_count":21,"outputs":[{"output_type":"display_data","data":{"text/plain":"Map:   0%|          | 0/14732 [00:00<?, ? examples/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"38cf3c8a1b2e496fb8c14a6aa416aeb5"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Map:   0%|          | 0/819 [00:00<?, ? examples/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"531378555ea54d4387b16acc942289e3"}},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"Map:   0%|          | 0/818 [00:00<?, ? examples/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"6653e68ca50549c38564e3039a44533e"}},"metadata":{}}]},{"cell_type":"code","source":"columns = ['input_ids', 'labels', 'attention_mask']\nsamsum_pt.set_format(type='torch', columns=columns)","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:55:00.528080Z","iopub.execute_input":"2024-07-20T03:55:00.528461Z","iopub.status.idle":"2024-07-20T03:55:00.537879Z","shell.execute_reply.started":"2024-07-20T03:55:00.528432Z","shell.execute_reply":"2024-07-20T03:55:00.536893Z"},"trusted":true},"execution_count":22,"outputs":[]},{"cell_type":"code","source":"samsum_pt","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:55:00.539382Z","iopub.execute_input":"2024-07-20T03:55:00.539777Z","iopub.status.idle":"2024-07-20T03:55:00.594865Z","shell.execute_reply.started":"2024-07-20T03:55:00.539741Z","shell.execute_reply":"2024-07-20T03:55:00.593650Z"},"trusted":true},"execution_count":23,"outputs":[{"execution_count":23,"output_type":"execute_result","data":{"text/plain":"DatasetDict({\n    train: Dataset({\n        features: ['id', 'dialogue', 'summary', 'input_ids', 'attention_mask', 'labels'],\n        num_rows: 14732\n    })\n    test: Dataset({\n        features: ['id', 'dialogue', 'summary', 'input_ids', 'attention_mask', 'labels'],\n        num_rows: 819\n    })\n    validation: Dataset({\n        features: ['id', 'dialogue', 'summary', 'input_ids', 'attention_mask', 'labels'],\n        num_rows: 818\n    })\n})"},"metadata":{}}]},{"cell_type":"code","source":"from transformers import DataCollatorForSeq2Seq, TrainingArguments, Trainer, EarlyStoppingCallback\nfrom transformers import DataCollatorForSeq2Seq\ndata_collator = DataCollatorForSeq2Seq(tokenizer, model=model)","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:55:04.012389Z","iopub.execute_input":"2024-07-20T03:55:04.012777Z","iopub.status.idle":"2024-07-20T03:55:04.546776Z","shell.execute_reply.started":"2024-07-20T03:55:04.012749Z","shell.execute_reply":"2024-07-20T03:55:04.545667Z"},"trusted":true},"execution_count":24,"outputs":[]},{"cell_type":"markdown","source":"# Model Training","metadata":{}},{"cell_type":"code","source":"from transformers import TrainingArguments, Trainer\n\ntraining_args = TrainingArguments(\n    output_dir = 'bart_samsum_5',\n    num_train_epochs=2,\n    warmup_steps = 500,\n    per_device_train_batch_size=4,\n    per_device_eval_batch_size=4,\n    weight_decay = 0.01,\n    logging_steps = 10,\n    evaluation_strategy = 'steps',\n    eval_steps=50,\n    save_steps=1e6,\n    gradient_accumulation_steps=16,\n    load_best_model_at_end = True\n)\n\nearly_stopping_callback = EarlyStoppingCallback(early_stopping_patience=3)  # Adjust patience as needed\n\n\ntrainer = Trainer(model=model, args=training_args, tokenizer=tokenizer, data_collator=data_collator,\n                  train_dataset = samsum_pt['train'], eval_dataset = samsum_pt['validation'],callbacks=[early_stopping_callback])","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:55:12.577962Z","iopub.execute_input":"2024-07-20T03:55:12.578710Z","iopub.status.idle":"2024-07-20T03:55:13.947211Z","shell.execute_reply.started":"2024-07-20T03:55:12.578676Z","shell.execute_reply":"2024-07-20T03:55:13.946390Z"},"trusted":true},"execution_count":25,"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/transformers/training_args.py:1494: FutureWarning: `evaluation_strategy` is deprecated and will be removed in version 4.46 of 🤗 Transformers. Use `eval_strategy` instead\n  warnings.warn(\n","output_type":"stream"}]},{"cell_type":"code","source":"trainer.train()","metadata":{"execution":{"iopub.status.busy":"2024-07-20T03:56:03.037558Z","iopub.execute_input":"2024-07-20T03:56:03.037935Z","iopub.status.idle":"2024-07-20T04:50:14.203662Z","shell.execute_reply.started":"2024-07-20T03:56:03.037907Z","shell.execute_reply":"2024-07-20T04:50:14.202602Z"},"trusted":true},"execution_count":26,"outputs":[{"name":"stderr","text":"\u001b[34m\u001b[1mwandb\u001b[0m: \u001b[33mWARNING\u001b[0m The `run_name` is currently set to the same value as `TrainingArguments.output_dir`. If this was not intended, please specify a different run name by setting the `TrainingArguments.run_name` parameter.\n\u001b[34m\u001b[1mwandb\u001b[0m: Logging into wandb.ai. (Learn how to deploy a W&B server locally: https://wandb.me/wandb-server)\n\u001b[34m\u001b[1mwandb\u001b[0m: You can find your API key in your browser here: https://wandb.ai/authorize\n\u001b[34m\u001b[1mwandb\u001b[0m: Paste an API key from your profile and hit enter, or press ctrl+c to quit:","output_type":"stream"},{"output_type":"stream","name":"stdin","text":"  ········································\n"},{"name":"stderr","text":"\u001b[34m\u001b[1mwandb\u001b[0m: Appending key for api.wandb.ai to your netrc file: /root/.netrc\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"wandb version 0.17.5 is available!  To upgrade, please run:\n $ pip install wandb --upgrade"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Tracking run with wandb version 0.17.4"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Run data is saved locally in <code>/kaggle/working/wandb/run-20240720_035607-g91p99nz</code>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"Syncing run <strong><a href='https://wandb.ai/markish9017-Lok%20Jagruti%20University/huggingface/runs/g91p99nz' target=\"_blank\">bart_samsum_5</a></strong> to <a href='https://wandb.ai/markish9017-Lok%20Jagruti%20University/huggingface' target=\"_blank\">Weights & Biases</a> (<a href='https://wandb.me/run' target=\"_blank\">docs</a>)<br/>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":" View project at <a href='https://wandb.ai/markish9017-Lok%20Jagruti%20University/huggingface' target=\"_blank\">https://wandb.ai/markish9017-Lok%20Jagruti%20University/huggingface</a>"},"metadata":{}},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":" View run at <a href='https://wandb.ai/markish9017-Lok%20Jagruti%20University/huggingface/runs/g91p99nz' target=\"_blank\">https://wandb.ai/markish9017-Lok%20Jagruti%20University/huggingface/runs/g91p99nz</a>"},"metadata":{}},{"name":"stderr","text":"/opt/conda/lib/python3.10/site-packages/transformers/data/data_collator.py:656: UserWarning: Creating a tensor from a list of numpy.ndarrays is extremely slow. Please consider converting the list to a single numpy.ndarray with numpy.array() before converting to a tensor. (Triggered internally at /usr/local/src/pytorch/torch/csrc/utils/tensor_new.cpp:261.)\n  batch[\"labels\"] = torch.tensor(batch[\"labels\"], dtype=torch.int64)\n/opt/conda/lib/python3.10/site-packages/torch/nn/parallel/_functions.py:68: UserWarning: Was asked to gather along dimension 0, but all input tensors were scalars; will instead unsqueeze and return a vector.\n  warnings.warn('Was asked to gather along dimension 0, but all '\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"<IPython.core.display.HTML object>","text/html":"\n    <div>\n      \n      <progress value='230' max='230' style='width:300px; height:20px; vertical-align: middle;'></progress>\n      [230/230 53:36, Epoch 1/2]\n    </div>\n    <table border=\"1\" class=\"dataframe\">\n  <thead>\n <tr style=\"text-align: left;\">\n      <th>Step</th>\n      <th>Training Loss</th>\n      <th>Validation Loss</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <td>50</td>\n      <td>1.526700</td>\n      <td>1.510433</td>\n    </tr>\n    <tr>\n      <td>100</td>\n      <td>1.390300</td>\n      <td>1.422089</td>\n    </tr>\n    <tr>\n      <td>150</td>\n      <td>1.287000</td>\n      <td>1.389398</td>\n    </tr>\n    <tr>\n      <td>200</td>\n      <td>1.276400</td>\n      <td>1.352196</td>\n    </tr>\n  </tbody>\n</table><p>"},"metadata":{}},{"name":"stderr","text":"Some non-default generation parameters are set in the model config. These should go into a GenerationConfig file (https://huggingface.co/docs/transformers/generation_strategies#save-a-custom-decoding-strategy-with-your-model) instead. This warning will be raised to an exception in v4.41.\nNon-default generation parameters: {'max_length': 142, 'min_length': 56, 'early_stopping': True, 'num_beams': 4, 'length_penalty': 2.0, 'no_repeat_ngram_size': 3, 'forced_bos_token_id': 0, 'forced_eos_token_id': 2}\n","output_type":"stream"},{"execution_count":26,"output_type":"execute_result","data":{"text/plain":"TrainOutput(global_step=230, training_loss=1.4225341631018598, metrics={'train_runtime': 3250.5316, 'train_samples_per_second': 9.064, 'train_steps_per_second': 0.071, 'total_flos': 1.856077686295757e+16, 'train_loss': 1.4225341631018598, 'epoch': 1.997828447339848})"},"metadata":{}}]},{"cell_type":"markdown","source":"# Saving the Model","metadata":{}},{"cell_type":"code","source":"trainer.save_model('bart_samsum_model_5')\ntokenizer.save_pretrained(\"bart_samsum_model_5\")","metadata":{"execution":{"iopub.status.busy":"2024-07-20T05:07:32.484298Z","iopub.execute_input":"2024-07-20T05:07:32.485479Z","iopub.status.idle":"2024-07-20T05:07:34.686369Z","shell.execute_reply.started":"2024-07-20T05:07:32.485435Z","shell.execute_reply":"2024-07-20T05:07:34.685264Z"},"trusted":true},"execution_count":37,"outputs":[{"name":"stderr","text":"Some non-default generation parameters are set in the model config. These should go into a GenerationConfig file (https://huggingface.co/docs/transformers/generation_strategies#save-a-custom-decoding-strategy-with-your-model) instead. This warning will be raised to an exception in v4.41.\nNon-default generation parameters: {'max_length': 142, 'min_length': 56, 'early_stopping': True, 'num_beams': 4, 'length_penalty': 2.0, 'no_repeat_ngram_size': 3, 'forced_bos_token_id': 0, 'forced_eos_token_id': 2}\n","output_type":"stream"},{"execution_count":37,"output_type":"execute_result","data":{"text/plain":"('bart_samsum_model_5/tokenizer_config.json',\n 'bart_samsum_model_5/special_tokens_map.json',\n 'bart_samsum_model_5/vocab.json',\n 'bart_samsum_model_5/merges.txt',\n 'bart_samsum_model_5/added_tokens.json',\n 'bart_samsum_model_5/tokenizer.json')"},"metadata":{}}]},{"cell_type":"code","source":"!pip install rouge-score\n!pip install datasets","metadata":{"execution":{"iopub.status.busy":"2024-07-20T04:54:24.229870Z","iopub.execute_input":"2024-07-20T04:54:24.230526Z","iopub.status.idle":"2024-07-20T04:54:54.172136Z","shell.execute_reply.started":"2024-07-20T04:54:24.230485Z","shell.execute_reply":"2024-07-20T04:54:54.170917Z"},"trusted":true},"execution_count":28,"outputs":[{"name":"stderr","text":"/opt/conda/lib/python3.10/pty.py:89: RuntimeWarning: os.fork() was called. os.fork() is incompatible with multithreaded code, and JAX is multithreaded, so this will likely lead to a deadlock.\n  pid, fd = os.forkpty()\nhuggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\nTo 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","output_type":"stream"},{"name":"stdout","text":"Collecting rouge-score\n  Downloading rouge_score-0.1.2.tar.gz (17 kB)\n  Preparing metadata (setup.py) ... \u001b[?25ldone\n\u001b[?25hRequirement already satisfied: absl-py in /opt/conda/lib/python3.10/site-packages (from rouge-score) (1.4.0)\nRequirement already satisfied: nltk in /opt/conda/lib/python3.10/site-packages (from rouge-score) (3.2.4)\nRequirement already satisfied: numpy in /opt/conda/lib/python3.10/site-packages (from rouge-score) (1.26.4)\nRequirement already satisfied: six>=1.14.0 in /opt/conda/lib/python3.10/site-packages (from rouge-score) (1.16.0)\nBuilding wheels for collected packages: rouge-score\n  Building wheel for rouge-score (setup.py) ... \u001b[?25ldone\n\u001b[?25h  Created wheel for rouge-score: filename=rouge_score-0.1.2-py3-none-any.whl size=24934 sha256=a69ddf1663ec4e38a560e1d4907f1493314633798fbf3f86251cce2f24a5d281\n  Stored in directory: /root/.cache/pip/wheels/5f/dd/89/461065a73be61a532ff8599a28e9beef17985c9e9c31e541b4\nSuccessfully built rouge-score\nInstalling collected packages: rouge-score\nSuccessfully installed rouge-score-0.1.2\n","output_type":"stream"},{"name":"stderr","text":"huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\nTo 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","output_type":"stream"},{"name":"stdout","text":"Requirement already satisfied: datasets in /opt/conda/lib/python3.10/site-packages (2.20.0)\nRequirement already satisfied: filelock in /opt/conda/lib/python3.10/site-packages (from datasets) (3.13.1)\nRequirement already satisfied: numpy>=1.17 in /opt/conda/lib/python3.10/site-packages (from datasets) (1.26.4)\nRequirement already satisfied: pyarrow>=15.0.0 in /opt/conda/lib/python3.10/site-packages (from datasets) (16.1.0)\nRequirement already satisfied: pyarrow-hotfix in /opt/conda/lib/python3.10/site-packages (from datasets) (0.6)\nRequirement already satisfied: dill<0.3.9,>=0.3.0 in /opt/conda/lib/python3.10/site-packages (from datasets) (0.3.8)\nRequirement already satisfied: pandas in /opt/conda/lib/python3.10/site-packages (from datasets) (2.2.2)\nRequirement already satisfied: requests>=2.32.2 in /opt/conda/lib/python3.10/site-packages (from datasets) (2.32.3)\nRequirement already satisfied: tqdm>=4.66.3 in /opt/conda/lib/python3.10/site-packages (from datasets) (4.66.4)\nRequirement already satisfied: xxhash in /opt/conda/lib/python3.10/site-packages (from datasets) (3.4.1)\nRequirement already satisfied: multiprocess in /opt/conda/lib/python3.10/site-packages (from datasets) (0.70.16)\nRequirement already satisfied: fsspec<=2024.5.0,>=2023.1.0 in /opt/conda/lib/python3.10/site-packages (from fsspec[http]<=2024.5.0,>=2023.1.0->datasets) (2024.5.0)\nRequirement already satisfied: aiohttp in /opt/conda/lib/python3.10/site-packages (from datasets) (3.9.1)\nRequirement already satisfied: huggingface-hub>=0.21.2 in /opt/conda/lib/python3.10/site-packages (from datasets) (0.23.4)\nRequirement already satisfied: packaging in /opt/conda/lib/python3.10/site-packages (from datasets) (21.3)\nRequirement already satisfied: pyyaml>=5.1 in /opt/conda/lib/python3.10/site-packages (from datasets) (6.0.1)\nRequirement already satisfied: attrs>=17.3.0 in /opt/conda/lib/python3.10/site-packages (from aiohttp->datasets) (23.2.0)\nRequirement already satisfied: multidict<7.0,>=4.5 in /opt/conda/lib/python3.10/site-packages (from aiohttp->datasets) (6.0.4)\nRequirement already satisfied: yarl<2.0,>=1.0 in /opt/conda/lib/python3.10/site-packages (from aiohttp->datasets) (1.9.3)\nRequirement already satisfied: frozenlist>=1.1.1 in /opt/conda/lib/python3.10/site-packages (from aiohttp->datasets) (1.4.1)\nRequirement already satisfied: aiosignal>=1.1.2 in /opt/conda/lib/python3.10/site-packages (from aiohttp->datasets) (1.3.1)\nRequirement already satisfied: async-timeout<5.0,>=4.0 in /opt/conda/lib/python3.10/site-packages (from aiohttp->datasets) (4.0.3)\nRequirement already satisfied: typing-extensions>=3.7.4.3 in /opt/conda/lib/python3.10/site-packages (from huggingface-hub>=0.21.2->datasets) (4.9.0)\nRequirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /opt/conda/lib/python3.10/site-packages (from packaging->datasets) (3.1.1)\nRequirement already satisfied: charset-normalizer<4,>=2 in /opt/conda/lib/python3.10/site-packages (from requests>=2.32.2->datasets) (3.3.2)\nRequirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.10/site-packages (from requests>=2.32.2->datasets) (3.6)\nRequirement already satisfied: urllib3<3,>=1.21.1 in /opt/conda/lib/python3.10/site-packages (from requests>=2.32.2->datasets) (2.1.0)\nRequirement already satisfied: certifi>=2017.4.17 in /opt/conda/lib/python3.10/site-packages (from requests>=2.32.2->datasets) (2024.7.4)\nRequirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.10/site-packages (from pandas->datasets) (2.9.0.post0)\nRequirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.10/site-packages (from pandas->datasets) (2023.3.post1)\nRequirement already satisfied: tzdata>=2022.7 in /opt/conda/lib/python3.10/site-packages (from pandas->datasets) (2023.4)\nRequirement already satisfied: six>=1.5 in /opt/conda/lib/python3.10/site-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.16.0)\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Testing on Custom Text","metadata":{}},{"cell_type":"code","source":"pipe = pipeline('summarization', model='bart_samsum_model_5')\ngen_kwargs = {'length_penalty': 0.8, 'num_beams': 8, \"min_length\": 30}\n\ncustom_dialogue=\"\"\"\nLaxmi Kant: what work you planning to give Tom?\nJuli: i was hoping to send him on a business trip first.\nLaxmi Kant: cool. is there any suitable work for him?\nJuli: he did excellent in last quarter. i will assign new project, once he is back.\n\"\"\"\nprint(pipe(custom_dialogue, **gen_kwargs))","metadata":{"execution":{"iopub.status.busy":"2024-07-20T05:07:41.074458Z","iopub.execute_input":"2024-07-20T05:07:41.074845Z","iopub.status.idle":"2024-07-20T05:07:49.387129Z","shell.execute_reply.started":"2024-07-20T05:07:41.074815Z","shell.execute_reply":"2024-07-20T05:07:49.385789Z"},"trusted":true},"execution_count":38,"outputs":[{"name":"stderr","text":"Hardware accelerator e.g. GPU is available in the environment, but no `device` argument is passed to the `Pipeline` object. Model will be on CPU.\nYour max_length is set to 142, but your input_length is only 72. Since this is a summarization task, where outputs shorter than the input are typically wanted, you might consider decreasing max_length manually, e.g. summarizer('...', max_length=36)\n","output_type":"stream"},{"name":"stdout","text":"[{'summary_text': 'Juli wants to send Tom on a business trip first. He will assign a new project to Tom once he is back. '}]\n","output_type":"stream"}]},{"cell_type":"markdown","source":"# Testing on Test dataset","metadata":{}},{"cell_type":"code","source":"from datasets import load_metric, load_dataset\nfrom transformers import pipeline\n\n# Load ROUGE metric\nrouge = load_metric('rouge')\n\n# Load samsum dataset\n# samsum = load_dataset('samsum')\n\n# Initialize summarization pipeline\ndevice = 0 if torch.cuda.is_available() else -1\npipe = pipeline('summarization', model='/kaggle/working/bart_samsum_model_5', device=device)\n\n# Function to generate summaries\ndef generate_summary(text, gen_kwargs):\n    summary = pipe(text, **gen_kwargs)\n    return summary[0]['summary_text']\n\n# Lists to store references and generated summaries\nreferences = samsum_df['test']['summary']\ngenerated_summaries = []\n\n# Generate summaries for your dataset\nfor dialogue in samsum_df['test']['dialogue']:\n    input_length = len(dialogue.split())\n    max_length = max(10, min(142, input_length // 2))\n    generated_summary = generate_summary(dialogue, gen_kwargs={'min_length': 30, 'max_length': max_length, 'num_beams': 4})\n    generated_summaries.append(generated_summary)\n\n# Compute ROUGE scores\nresults = rouge.compute(predictions=generated_summaries, references=references)\n\n# Print the results\nfor key in results.keys():\n    print(f\"{key}: {results[key].mid}\")","metadata":{"execution":{"iopub.status.busy":"2024-07-20T04:55:46.985309Z","iopub.execute_input":"2024-07-20T04:55:46.985689Z","iopub.status.idle":"2024-07-20T05:01:53.179173Z","shell.execute_reply.started":"2024-07-20T04:55:46.985658Z","shell.execute_reply":"2024-07-20T05:01:53.178116Z"},"trusted":true},"execution_count":31,"outputs":[{"name":"stderr","text":"/tmp/ipykernel_34/2165442090.py:5: 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  rouge = load_metric('rouge')\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"Downloading builder script:   0%|          | 0.00/2.17k [00:00<?, ?B/s]","application/vnd.jupyter.widget-view+json":{"version_major":2,"version_minor":0,"model_id":"5ca0e26289d5444e80cbc5d4fd403b50"}},"metadata":{}},{"output_type":"stream","name":"stdin","text":"The repository for rouge contains custom code which must be executed to correctly load the dataset. You can inspect the repository content at https://hf.co/datasets/rouge.\nYou can avoid this prompt in future by passing the argument `trust_remote_code=True`.\n\nDo you wish to run the custom code? [y/N]  y\n"},{"name":"stderr","text":"You seem to be using the pipelines sequentially on GPU. In order to maximize efficiency please use a dataset\nYour min_length=30 must be inferior than your max_length=28.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (28). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=12.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (12). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=22.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (22). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=19.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (19). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=23.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (23). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=16.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (16). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=10.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (10). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=21.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (21). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=27.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (27). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=24.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (24). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=24.\nYour min_length=30 must be inferior than your max_length=17.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (17). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=26.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (26). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=25.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (25). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=23.\nYour min_length=30 must be inferior than your max_length=28.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=23.\nYour min_length=30 must be inferior than your max_length=11.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (11). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=28.\nYour min_length=30 must be inferior than your max_length=20.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (20). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=18.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (18). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=24.\nYour min_length=30 must be inferior than your max_length=11.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=14.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (14). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=23.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=11.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=17.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=11.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=23.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=20.\nYour min_length=30 must be inferior than your max_length=23.\nYour min_length=30 must be inferior than your max_length=13.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (13). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=11.\nYour min_length=30 must be inferior than your max_length=15.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (15). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=29.\n/opt/conda/lib/python3.10/site-packages/transformers/generation/utils.py:1273: UserWarning: Unfeasible length constraints: `min_length` (30) is larger than the maximum possible length (29). Generation will stop at the defined maximum length. You should decrease the minimum length and/or increase the maximum length.\n  warnings.warn(\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=11.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=24.\nYour min_length=30 must be inferior than your max_length=24.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=14.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=28.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=17.\nYour min_length=30 must be inferior than your max_length=29.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=29.\nYour min_length=30 must be inferior than your max_length=15.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=15.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=17.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=24.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=24.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=28.\nYour min_length=30 must be inferior than your max_length=14.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=15.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=29.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=29.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=11.\nYour min_length=30 must be inferior than your max_length=17.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=17.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=14.\nYour min_length=30 must be inferior than your max_length=15.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=17.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=15.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=29.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=23.\nYour min_length=30 must be inferior than your max_length=20.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=20.\nYour min_length=30 must be inferior than your max_length=29.\nYour min_length=30 must be inferior than your max_length=23.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=14.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=14.\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=17.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=24.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=15.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=23.\nYour min_length=30 must be inferior than your max_length=28.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=17.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=20.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=28.\nYour min_length=30 must be inferior than your max_length=11.\nYour min_length=30 must be inferior than your max_length=29.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=23.\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=17.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=14.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=12.\nYour min_length=30 must be inferior than your max_length=15.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=15.\nYour min_length=30 must be inferior than your max_length=23.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=11.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=20.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=11.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=20.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=11.\nYour min_length=30 must be inferior than your max_length=17.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=24.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=14.\nYour min_length=30 must be inferior than your max_length=29.\nYour min_length=30 must be inferior than your max_length=15.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=20.\nYour min_length=30 must be inferior than your max_length=14.\nYour min_length=30 must be inferior than your max_length=25.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=15.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=14.\nYour min_length=30 must be inferior than your max_length=19.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=24.\nYour min_length=30 must be inferior than your max_length=28.\nYour min_length=30 must be inferior than your max_length=20.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=24.\nYour min_length=30 must be inferior than your max_length=24.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=29.\nYour min_length=30 must be inferior than your max_length=29.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=26.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=18.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=17.\nYour min_length=30 must be inferior than your max_length=28.\nYour min_length=30 must be inferior than your max_length=23.\nYour min_length=30 must be inferior than your max_length=28.\nYour min_length=30 must be inferior than your max_length=28.\nYour min_length=30 must be inferior than your max_length=27.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=20.\nYour min_length=30 must be inferior than your max_length=17.\nYour min_length=30 must be inferior than your max_length=24.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=22.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=15.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=20.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=15.\nYour min_length=30 must be inferior than your max_length=29.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=21.\nYour min_length=30 must be inferior than your max_length=11.\nYour min_length=30 must be inferior than your max_length=11.\nYour min_length=30 must be inferior than your max_length=16.\nYour min_length=30 must be inferior than your max_length=13.\nYour min_length=30 must be inferior than your max_length=10.\nYour min_length=30 must be inferior than your max_length=14.\n","output_type":"stream"},{"name":"stdout","text":"rouge1: Score(precision=0.5240761726639174, recall=0.5164609406411964, fmeasure=0.48813699709755287)\nrouge2: Score(precision=0.2750003463132431, recall=0.26328277298441694, fmeasure=0.2498681871552253)\nrougeL: Score(precision=0.4338563417029981, recall=0.42507261340158575, fmeasure=0.40241707690768413)\nrougeLsum: Score(precision=0.4330077769824946, recall=0.42511422355384887, fmeasure=0.4021251370419605)\n","output_type":"stream"}]},{"cell_type":"code","source":"import pandas as pd\n\n# Assuming you have generated summaries in generated_summaries list and references list is already defined\n# Create a DataFrame to store the results\ndf_results = pd.DataFrame({\n    'reference': references,\n    'generated_summary': generated_summaries\n})\n\n# Save the results to a CSV file\ndf_results.to_csv('summaries_results.csv', index=False)\n\n# Optionally, save ROUGE scores to another file\nrouge_scores = {key: results[key].mid for key in results.keys()}\ndf_rouge = pd.DataFrame(rouge_scores.items(), columns=['metric', 'score'])\ndf_rouge.to_csv('rouge_scores.csv', index=False)","metadata":{"execution":{"iopub.status.busy":"2024-07-20T05:02:42.499367Z","iopub.execute_input":"2024-07-20T05:02:42.500177Z","iopub.status.idle":"2024-07-20T05:02:42.521901Z","shell.execute_reply.started":"2024-07-20T05:02:42.500142Z","shell.execute_reply":"2024-07-20T05:02:42.520888Z"},"trusted":true},"execution_count":33,"outputs":[]},{"cell_type":"code","source":"df_results","metadata":{"execution":{"iopub.status.busy":"2024-07-20T05:02:48.580605Z","iopub.execute_input":"2024-07-20T05:02:48.581357Z","iopub.status.idle":"2024-07-20T05:02:48.600133Z","shell.execute_reply.started":"2024-07-20T05:02:48.581324Z","shell.execute_reply":"2024-07-20T05:02:48.599142Z"},"trusted":true},"execution_count":34,"outputs":[{"execution_count":34,"output_type":"execute_result","data":{"text/plain":"                                             reference  \\\n0    Hannah needs Betty's number but Amanda doesn't...   \n1    Eric and Rob are going to watch a stand-up on ...   \n2    Lenny can't decide which trousers to buy. Bob ...   \n3    Emma will be home soon and she will let Will k...   \n4    Jane is in Warsaw. Ollie and Jane has a party....   \n..                                                 ...   \n814  Benjamin didn't come to see a basketball game ...   \n815      The audition starts at 7.30 P.M. in Antena 3.   \n816                    Marta sent a file accidentally,   \n817  There was a meet-and-greet with James Charles ...   \n818  Rachel sends a list of Top 50 films of 2018. J...   \n\n                                     generated_summary  \n0    Hannah doesn't have Betty's number. Amanda ask...  \n1    Rob will watch some stand-up comedy by Russian...  \n2    Lenny will buy the first or the third pair of ...  \n3    Emma will be home soon. She will tell Will wha...  \n4    Jane is back from Morocco. Ollie and Jane will...  \n..                                                 ...  \n814  Benjamin was unable to attend Friday night's b...  \n815                               Jamilla reminds Kiki  \n816        Marta accidentally sent Weronika and Agnies  \n817  There was a meet and greet with James Charles ...  \n818  Janice has watched almost all the Top 50 Best ...  \n\n[819 rows x 2 columns]","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>reference</th>\n      <th>generated_summary</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>Hannah needs Betty's number but Amanda doesn't...</td>\n      <td>Hannah doesn't have Betty's number. Amanda ask...</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>Eric and Rob are going to watch a stand-up on ...</td>\n      <td>Rob will watch some stand-up comedy by Russian...</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>Lenny can't decide which trousers to buy. Bob ...</td>\n      <td>Lenny will buy the first or the third pair of ...</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>Emma will be home soon and she will let Will k...</td>\n      <td>Emma will be home soon. She will tell Will wha...</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>Jane is in Warsaw. Ollie and Jane has a party....</td>\n      <td>Jane is back from Morocco. Ollie and Jane will...</td>\n    </tr>\n    <tr>\n      <th>...</th>\n      <td>...</td>\n      <td>...</td>\n    </tr>\n    <tr>\n      <th>814</th>\n      <td>Benjamin didn't come to see a basketball game ...</td>\n      <td>Benjamin was unable to attend Friday night's b...</td>\n    </tr>\n    <tr>\n      <th>815</th>\n      <td>The audition starts at 7.30 P.M. in Antena 3.</td>\n      <td>Jamilla reminds Kiki</td>\n    </tr>\n    <tr>\n      <th>816</th>\n      <td>Marta sent a file accidentally,</td>\n      <td>Marta accidentally sent Weronika and Agnies</td>\n    </tr>\n    <tr>\n      <th>817</th>\n      <td>There was a meet-and-greet with James Charles ...</td>\n      <td>There was a meet and greet with James Charles ...</td>\n    </tr>\n    <tr>\n      <th>818</th>\n      <td>Rachel sends a list of Top 50 films of 2018. J...</td>\n      <td>Janice has watched almost all the Top 50 Best ...</td>\n    </tr>\n  </tbody>\n</table>\n<p>819 rows × 2 columns</p>\n</div>"},"metadata":{}}]},{"cell_type":"code","source":"df_rouge","metadata":{"execution":{"iopub.status.busy":"2024-07-20T05:02:58.224837Z","iopub.execute_input":"2024-07-20T05:02:58.225244Z","iopub.status.idle":"2024-07-20T05:02:58.240278Z","shell.execute_reply.started":"2024-07-20T05:02:58.225213Z","shell.execute_reply":"2024-07-20T05:02:58.238961Z"},"trusted":true},"execution_count":35,"outputs":[{"execution_count":35,"output_type":"execute_result","data":{"text/plain":"      metric                                              score\n0     rouge1  (0.5240761726639174, 0.5164609406411964, 0.488...\n1     rouge2  (0.2750003463132431, 0.26328277298441694, 0.24...\n2     rougeL  (0.4338563417029981, 0.42507261340158575, 0.40...\n3  rougeLsum  (0.4330077769824946, 0.42511422355384887, 0.40...","text/html":"<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>metric</th>\n      <th>score</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>rouge1</td>\n      <td>(0.5240761726639174, 0.5164609406411964, 0.488...</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>rouge2</td>\n      <td>(0.2750003463132431, 0.26328277298441694, 0.24...</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>rougeL</td>\n      <td>(0.4338563417029981, 0.42507261340158575, 0.40...</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>rougeLsum</td>\n      <td>(0.4330077769824946, 0.42511422355384887, 0.40...</td>\n    </tr>\n  </tbody>\n</table>\n</div>"},"metadata":{}}]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}
\ No newline at end of file