{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "694ywzJro_xb",
        "outputId": "23db38ab-a6da-4348-d18e-f97cd104efb4"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Fri May  2 12:44:12 AM UTC 2025\n",
            "Python 3.11.12\n"
          ]
        }
      ],
      "source": [
        "!date\n",
        "!python --version"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "更新履歴\n",
        "- 2025年5月1日\n",
        "  - 解説追加。\n",
        "  - TrainingArguments\n",
        "    - evaluation_strategyをeval_strategyに変更。\n",
        "    - `report_to=\"none\"`を追加。（デフォルトだとwandbを使うため、APIキー入力待ちになってしまう）"
      ],
      "metadata": {
        "id": "ZPtWgVBKpzTh"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "# AutoModelForSequenceClassificationを用いたファインチューニング例\n",
        "このノートブックでは[Japanese Realistic Textual Entailment Corpus](https://github.com/megagonlabs/jrte-corpus)のpn.tsvをデータセットとし、BERT（\"tohoku-nlp/bert-base-japanese-v3\"）を用いてファインチューニングする例を示している。\n",
        "\n",
        "pn.tsvは実際のレビュー文に対して5名の被験者が極性ラベルを付与したデータセットである。[上記サイトのデータ説明](https://github.com/megagonlabs/jrte-corpus?tab=readme-ov-file#datapntsv)にあるとおり、ID, Label, Text, Judges, Usage の5列のデータがサンプル毎に用意されている。\n",
        "- ID: ユニークなID\n",
        "- Label: 1 (Positive), 0 (Neutral), -1 (Negative)\n",
        "- Text: レビュー文そのもの\n",
        "- Judges: JSONフォーマットによる極性判定結果。例: `{\"0\": 1, \"1\": 4}`\n",
        "- Usage: train, deve, testの種別。\n",
        "\n",
        "全体の流れは以下の通り。\n",
        "\n",
        "- 環境構築: fugashi, accelerateをインストール\n",
        "- モジュール読み込み\n",
        "- データ前処理: LLMにおける分類タスクでは教師ラベルを「0から始まる整数」として割り振る必要があるため、ラベルを設定し直した。\n",
        "- モデルの用意: tokenizerの動作確認を含む。\n",
        "- LLM用にデータを整形: tokenizerの出力と教師ラベルを合わせてDataset型に変換。\n",
        "- 学習\n",
        "- テストデータに対する詳細結果\n",
        "- 学習データに対する詳細結果"
      ],
      "metadata": {
        "id": "YQry16tI1iXY"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!curl -O https://raw.githubusercontent.com/megagonlabs/jrte-corpus/refs/heads/master/data/pn.tsv\n",
        "!head pn.tsv"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "uwHzUemBm8H5",
        "outputId": "912c903a-41c8-4257-aa7c-a815e575d085"
      },
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current\n",
            "                                 Dload  Upload   Total   Spent    Left  Speed\n",
            "100  473k  100  473k    0     0  1275k      0 --:--:-- --:--:-- --:--:-- 1275k\n",
            "pn17q00001\t0\t出張でお世話になりました。\t{\"0\": 3}\ttest\n",
            "pn17q00002\t0\t朝食は普通でした。\t{\"0\": 3}\ttest\n",
            "pn17q00003\t1\tまた是非行きたいです。\t{\"1\": 3}\ttest\n",
            "pn17q00004\t1\tまた利用したいと思えるホテルでした。\t{\"1\": 3}\ttest\n",
            "pn17q00005\t1\t駅から近くて便利でした。\t{\"0\": 1, \"1\": 2}\ttest\n",
            "pn17q00006\t1\tまた来年も利用したいと思います。\t{\"0\": 1, \"1\": 2}\ttest\n",
            "pn17q00007\t0\t新婚旅行で利用しました。\t{\"0\": 3}\ttest\n",
            "pn17q00008\t1\tまた利用いたします。\t{\"0\": 1, \"1\": 2}\ttest\n",
            "pn17q00009\t1\tコストパフォーマンス最高です。\t{\"1\": 3}\ttest\n",
            "pn17q00010\t0\tお心遣いありがとうございました。\t{\"0\": 2, \"1\": 1}\ttest\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 注意\n",
        "### GPUを指定する\n",
        "LLMを用いた学習を行っている都合上、デフォルト（CPU）実行すると極めて時間がかかる。おそらく数時間要するだろう。自身でも動作確認したい人は、GPUを指定して実行することをお勧めする。\n",
        "\n",
        "GPUを指定するには以下の手順を取る。\n",
        "- 「ランタイム」から「ランタイムのタイプの変更」を選ぶ。\n",
        "- 「ハードウェア アクセラレータ」からGPUを選ぶ。\n",
        "  - T4 GPU を選ぶと良い。この中では低スペックだが十分早い。T4 GPUなら、10エポックの学習が約14分で終了する。\n",
        "\n",
        "### リソース使用制限\n",
        "Google Colabは無料で利用できるが、利用度合いに応じてリソースが制限されることがある。特にGPUは使えなくなることが多いため、不必要に何度も実行することは避けよう。\n",
        "\n",
        "詳細: [最適な Colab のプランを選択する](https://colab.research.google.com/signup/pricing?hl=ja)\n",
        "\n",
        "### 必要に応じてモデルや結果をファイル保存する\n",
        "このノートブックではノートブック内に出力しつつ、学習したモデルはセッション内に保存しているだけで終えている。このため後日「学習結果を利用したい」場合には改めて学習し直す必要がある。それが面倒に思う人はファイル保存するようにしよう。\n",
        "\n",
        "なお、正確には「ファイル」ではなく「複数のファイルを含むフォルダ」として保存されている。このフォルダ単位でダウンロードしたり、アップロードしてモデルを復元する必要があることに注意しよう。\n",
        "\n",
        "またモデルはとてもファイルサイズが大きく、実際にダウンロード＆アップロードするにはとても時間がかかる。そのためGoogleドライブにアクセス許可した上で自身のドライブ内に保存する方が楽だ。\n",
        "\n",
        "```Python\n",
        "# ノートブックからドライブへのアクセスを許可する\n",
        "from google.colab import drive\n",
        "drive.mount('/content/drive')\n",
        "```"
      ],
      "metadata": {
        "id": "ddjbPBwC63Fi"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 環境構築"
      ],
      "metadata": {
        "id": "gmO5jzDI1zl0"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "!pip install fugashi[unidic-lite]\n",
        "!pip install accelerate -U"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "WXcMonRRpPW2",
        "outputId": "7f6e4508-d5af-46b7-a05a-5241e0ace47e"
      },
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Collecting fugashi[unidic-lite]\n",
            "  Downloading fugashi-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.metadata (6.9 kB)\n",
            "Collecting unidic-lite (from fugashi[unidic-lite])\n",
            "  Downloading unidic-lite-1.0.8.tar.gz (47.4 MB)\n",
            "\u001b[2K     \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m47.4/47.4 MB\u001b[0m \u001b[31m20.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25h  Preparing metadata (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
            "Downloading fugashi-1.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (698 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m698.0/698.0 kB\u001b[0m \u001b[31m5.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hBuilding wheels for collected packages: unidic-lite\n",
            "  Building wheel for unidic-lite (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
            "  Created wheel for unidic-lite: filename=unidic_lite-1.0.8-py3-none-any.whl size=47658817 sha256=dbcb89f589c4f364e62826e9552de412a0e688f737d11c42dde9f26283941cb3\n",
            "  Stored in directory: /root/.cache/pip/wheels/b7/fd/e9/ea4459b868e6d2902e8d80e82dbacb6203e05b3b3a58c64966\n",
            "Successfully built unidic-lite\n",
            "Installing collected packages: unidic-lite, fugashi\n",
            "Successfully installed fugashi-1.4.0 unidic-lite-1.0.8\n",
            "Requirement already satisfied: accelerate in /usr/local/lib/python3.11/dist-packages (1.6.0)\n",
            "Requirement already satisfied: numpy<3.0.0,>=1.17 in /usr/local/lib/python3.11/dist-packages (from accelerate) (2.0.2)\n",
            "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.11/dist-packages (from accelerate) (24.2)\n",
            "Requirement already satisfied: psutil in /usr/local/lib/python3.11/dist-packages (from accelerate) (5.9.5)\n",
            "Requirement already satisfied: pyyaml in /usr/local/lib/python3.11/dist-packages (from accelerate) (6.0.2)\n",
            "Requirement already satisfied: torch>=2.0.0 in /usr/local/lib/python3.11/dist-packages (from accelerate) (2.6.0+cu124)\n",
            "Requirement already satisfied: huggingface-hub>=0.21.0 in /usr/local/lib/python3.11/dist-packages (from accelerate) (0.30.2)\n",
            "Requirement already satisfied: safetensors>=0.4.3 in /usr/local/lib/python3.11/dist-packages (from accelerate) (0.5.3)\n",
            "Requirement already satisfied: filelock in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.21.0->accelerate) (3.18.0)\n",
            "Requirement already satisfied: fsspec>=2023.5.0 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.21.0->accelerate) (2025.3.2)\n",
            "Requirement already satisfied: requests in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.21.0->accelerate) (2.32.3)\n",
            "Requirement already satisfied: tqdm>=4.42.1 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.21.0->accelerate) (4.67.1)\n",
            "Requirement already satisfied: typing-extensions>=3.7.4.3 in /usr/local/lib/python3.11/dist-packages (from huggingface-hub>=0.21.0->accelerate) (4.13.2)\n",
            "Requirement already satisfied: networkx in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.0->accelerate) (3.4.2)\n",
            "Requirement already satisfied: jinja2 in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.0->accelerate) (3.1.6)\n",
            "Collecting nvidia-cuda-nvrtc-cu12==12.4.127 (from torch>=2.0.0->accelerate)\n",
            "  Downloading nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
            "Collecting nvidia-cuda-runtime-cu12==12.4.127 (from torch>=2.0.0->accelerate)\n",
            "  Downloading nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
            "Collecting nvidia-cuda-cupti-cu12==12.4.127 (from torch>=2.0.0->accelerate)\n",
            "  Downloading nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n",
            "Collecting nvidia-cudnn-cu12==9.1.0.70 (from torch>=2.0.0->accelerate)\n",
            "  Downloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n",
            "Collecting nvidia-cublas-cu12==12.4.5.8 (from torch>=2.0.0->accelerate)\n",
            "  Downloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
            "Collecting nvidia-cufft-cu12==11.2.1.3 (from torch>=2.0.0->accelerate)\n",
            "  Downloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
            "Collecting nvidia-curand-cu12==10.3.5.147 (from torch>=2.0.0->accelerate)\n",
            "  Downloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
            "Collecting nvidia-cusolver-cu12==11.6.1.9 (from torch>=2.0.0->accelerate)\n",
            "  Downloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n",
            "Collecting nvidia-cusparse-cu12==12.3.1.170 (from torch>=2.0.0->accelerate)\n",
            "  Downloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl.metadata (1.6 kB)\n",
            "Requirement already satisfied: nvidia-cusparselt-cu12==0.6.2 in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.0->accelerate) (0.6.2)\n",
            "Requirement already satisfied: nvidia-nccl-cu12==2.21.5 in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.0->accelerate) (2.21.5)\n",
            "Requirement already satisfied: nvidia-nvtx-cu12==12.4.127 in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.0->accelerate) (12.4.127)\n",
            "Collecting nvidia-nvjitlink-cu12==12.4.127 (from torch>=2.0.0->accelerate)\n",
            "  Downloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl.metadata (1.5 kB)\n",
            "Requirement already satisfied: triton==3.2.0 in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.0->accelerate) (3.2.0)\n",
            "Requirement already satisfied: sympy==1.13.1 in /usr/local/lib/python3.11/dist-packages (from torch>=2.0.0->accelerate) (1.13.1)\n",
            "Requirement already satisfied: mpmath<1.4,>=1.1.0 in /usr/local/lib/python3.11/dist-packages (from sympy==1.13.1->torch>=2.0.0->accelerate) (1.3.0)\n",
            "Requirement already satisfied: MarkupSafe>=2.0 in /usr/local/lib/python3.11/dist-packages (from jinja2->torch>=2.0.0->accelerate) (3.0.2)\n",
            "Requirement already satisfied: charset-normalizer<4,>=2 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.21.0->accelerate) (3.4.1)\n",
            "Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.21.0->accelerate) (3.10)\n",
            "Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.21.0->accelerate) (2.4.0)\n",
            "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.11/dist-packages (from requests->huggingface-hub>=0.21.0->accelerate) (2025.4.26)\n",
            "Downloading nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl (363.4 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m363.4/363.4 MB\u001b[0m \u001b[31m4.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (13.8 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m13.8/13.8 MB\u001b[0m \u001b[31m116.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (24.6 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m24.6/24.6 MB\u001b[0m \u001b[31m95.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (883 kB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m883.7/883.7 kB\u001b[0m \u001b[31m56.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl (664.8 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m664.8/664.8 MB\u001b[0m \u001b[31m2.8 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl (211.5 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m211.5/211.5 MB\u001b[0m \u001b[31m5.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl (56.3 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m56.3/56.3 MB\u001b[0m \u001b[31m13.2 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl (127.9 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m127.9/127.9 MB\u001b[0m \u001b[31m7.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl (207.5 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m207.5/207.5 MB\u001b[0m \u001b[31m5.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hDownloading nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl (21.1 MB)\n",
            "\u001b[2K   \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m21.1/21.1 MB\u001b[0m \u001b[31m86.5 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
            "\u001b[?25hInstalling collected packages: nvidia-nvjitlink-cu12, nvidia-curand-cu12, nvidia-cufft-cu12, nvidia-cuda-runtime-cu12, nvidia-cuda-nvrtc-cu12, nvidia-cuda-cupti-cu12, nvidia-cublas-cu12, nvidia-cusparse-cu12, nvidia-cudnn-cu12, nvidia-cusolver-cu12\n",
            "  Attempting uninstall: nvidia-nvjitlink-cu12\n",
            "    Found existing installation: nvidia-nvjitlink-cu12 12.5.82\n",
            "    Uninstalling nvidia-nvjitlink-cu12-12.5.82:\n",
            "      Successfully uninstalled nvidia-nvjitlink-cu12-12.5.82\n",
            "  Attempting uninstall: nvidia-curand-cu12\n",
            "    Found existing installation: nvidia-curand-cu12 10.3.6.82\n",
            "    Uninstalling nvidia-curand-cu12-10.3.6.82:\n",
            "      Successfully uninstalled nvidia-curand-cu12-10.3.6.82\n",
            "  Attempting uninstall: nvidia-cufft-cu12\n",
            "    Found existing installation: nvidia-cufft-cu12 11.2.3.61\n",
            "    Uninstalling nvidia-cufft-cu12-11.2.3.61:\n",
            "      Successfully uninstalled nvidia-cufft-cu12-11.2.3.61\n",
            "  Attempting uninstall: nvidia-cuda-runtime-cu12\n",
            "    Found existing installation: nvidia-cuda-runtime-cu12 12.5.82\n",
            "    Uninstalling nvidia-cuda-runtime-cu12-12.5.82:\n",
            "      Successfully uninstalled nvidia-cuda-runtime-cu12-12.5.82\n",
            "  Attempting uninstall: nvidia-cuda-nvrtc-cu12\n",
            "    Found existing installation: nvidia-cuda-nvrtc-cu12 12.5.82\n",
            "    Uninstalling nvidia-cuda-nvrtc-cu12-12.5.82:\n",
            "      Successfully uninstalled nvidia-cuda-nvrtc-cu12-12.5.82\n",
            "  Attempting uninstall: nvidia-cuda-cupti-cu12\n",
            "    Found existing installation: nvidia-cuda-cupti-cu12 12.5.82\n",
            "    Uninstalling nvidia-cuda-cupti-cu12-12.5.82:\n",
            "      Successfully uninstalled nvidia-cuda-cupti-cu12-12.5.82\n",
            "  Attempting uninstall: nvidia-cublas-cu12\n",
            "    Found existing installation: nvidia-cublas-cu12 12.5.3.2\n",
            "    Uninstalling nvidia-cublas-cu12-12.5.3.2:\n",
            "      Successfully uninstalled nvidia-cublas-cu12-12.5.3.2\n",
            "  Attempting uninstall: nvidia-cusparse-cu12\n",
            "    Found existing installation: nvidia-cusparse-cu12 12.5.1.3\n",
            "    Uninstalling nvidia-cusparse-cu12-12.5.1.3:\n",
            "      Successfully uninstalled nvidia-cusparse-cu12-12.5.1.3\n",
            "  Attempting uninstall: nvidia-cudnn-cu12\n",
            "    Found existing installation: nvidia-cudnn-cu12 9.3.0.75\n",
            "    Uninstalling nvidia-cudnn-cu12-9.3.0.75:\n",
            "      Successfully uninstalled nvidia-cudnn-cu12-9.3.0.75\n",
            "  Attempting uninstall: nvidia-cusolver-cu12\n",
            "    Found existing installation: nvidia-cusolver-cu12 11.6.3.83\n",
            "    Uninstalling nvidia-cusolver-cu12-11.6.3.83:\n",
            "      Successfully uninstalled nvidia-cusolver-cu12-11.6.3.83\n",
            "Successfully installed nvidia-cublas-cu12-12.4.5.8 nvidia-cuda-cupti-cu12-12.4.127 nvidia-cuda-nvrtc-cu12-12.4.127 nvidia-cuda-runtime-cu12-12.4.127 nvidia-cudnn-cu12-9.1.0.70 nvidia-cufft-cu12-11.2.1.3 nvidia-curand-cu12-10.3.5.147 nvidia-cusolver-cu12-11.6.1.9 nvidia-cusparse-cu12-12.3.1.170 nvidia-nvjitlink-cu12-12.4.127\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## モジュール読み込み、データ前処理\n",
        "元データでは極性が -1, 0, 1 で付与されている。しかし教師ラベルとしては0から始まる整数で設定する必要がある。そのためここでは read_csv() で読み込んだ後、map関数により -1を0に、0を1に、1を2に置換している。"
      ],
      "metadata": {
        "id": "L-AQS9sy12nO"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        },
        "id": "jOIVctCTo_xf",
        "outputId": "4fae80c8-0efe-4ea0-dca6-f5072ca811db"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "           id  sentiment                text       judges-json usage\n",
              "0  pn17q00001          0       出張でお世話になりました。          {\"0\": 3}  test\n",
              "1  pn17q00002          0           朝食は普通でした。          {\"0\": 3}  test\n",
              "2  pn17q00003          1         また是非行きたいです。          {\"1\": 3}  test\n",
              "3  pn17q00004          1  また利用したいと思えるホテルでした。          {\"1\": 3}  test\n",
              "4  pn17q00005          1        駅から近くて便利でした。  {\"0\": 1, \"1\": 2}  test"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-b66bba93-6b80-4571-96c5-815fdb1d0d52\" class=\"colab-df-container\">\n",
              "    <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>id</th>\n",
              "      <th>sentiment</th>\n",
              "      <th>text</th>\n",
              "      <th>judges-json</th>\n",
              "      <th>usage</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>pn17q00001</td>\n",
              "      <td>0</td>\n",
              "      <td>出張でお世話になりました。</td>\n",
              "      <td>{\"0\": 3}</td>\n",
              "      <td>test</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>pn17q00002</td>\n",
              "      <td>0</td>\n",
              "      <td>朝食は普通でした。</td>\n",
              "      <td>{\"0\": 3}</td>\n",
              "      <td>test</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>pn17q00003</td>\n",
              "      <td>1</td>\n",
              "      <td>また是非行きたいです。</td>\n",
              "      <td>{\"1\": 3}</td>\n",
              "      <td>test</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>pn17q00004</td>\n",
              "      <td>1</td>\n",
              "      <td>また利用したいと思えるホテルでした。</td>\n",
              "      <td>{\"1\": 3}</td>\n",
              "      <td>test</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>pn17q00005</td>\n",
              "      <td>1</td>\n",
              "      <td>駅から近くて便利でした。</td>\n",
              "      <td>{\"0\": 1, \"1\": 2}</td>\n",
              "      <td>test</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-b66bba93-6b80-4571-96c5-815fdb1d0d52')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-b66bba93-6b80-4571-96c5-815fdb1d0d52 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-b66bba93-6b80-4571-96c5-815fdb1d0d52');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "    <div id=\"df-a64356ba-5e11-4906-9790-f5f2de06d0ee\">\n",
              "      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-a64356ba-5e11-4906-9790-f5f2de06d0ee')\"\n",
              "                title=\"Suggest charts\"\n",
              "                style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "      </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "      <script>\n",
              "        async function quickchart(key) {\n",
              "          const quickchartButtonEl =\n",
              "            document.querySelector('#' + key + ' button');\n",
              "          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "          quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "          try {\n",
              "            const charts = await google.colab.kernel.invokeFunction(\n",
              "                'suggestCharts', [key], {});\n",
              "          } catch (error) {\n",
              "            console.error('Error during call to suggestCharts:', error);\n",
              "          }\n",
              "          quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "          quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "        }\n",
              "        (() => {\n",
              "          let quickchartButtonEl =\n",
              "            document.querySelector('#df-a64356ba-5e11-4906-9790-f5f2de06d0ee button');\n",
              "          quickchartButtonEl.style.display =\n",
              "            google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "        })();\n",
              "      </script>\n",
              "    </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df",
              "summary": "{\n  \"name\": \"df\",\n  \"rows\": 5553,\n  \"fields\": [\n    {\n      \"column\": \"id\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5553,\n        \"samples\": [\n          \"pn17q01971\",\n          \"pn17q03940\",\n          \"pn17q02861\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"sentiment\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": -1,\n        \"max\": 1,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          0,\n          1,\n          -1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"text\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5553,\n        \"samples\": [\n          \"\\u30d0\\u30a4\\u30ad\\u30f3\\u30b0\\u306e\\u671d\\u98df\\u3082\\u7f8e\\u5473\\u3057\\u304b\\u3063\\u305f\\u3067\\u3059\\u3002\",\n          \"\\u30d5\\u30ed\\u30f3\\u30c8\\u5bfe\\u5fdc\\u3082\\u4e01\\u5be7\\u3067\\u3059\\u3002\",\n          \"\\u671d\\u98df\\u306f\\u7f8e\\u5473\\u304b\\u3063\\u305f\\u3002\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"judges-json\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 10,\n        \"samples\": [\n          \"{\\\"-1\\\": 1, \\\"1\\\": 2}\",\n          \"{\\\"1\\\": 3}\",\n          \"{\\\"-1\\\": 3}\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"usage\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"test\",\n          \"train\",\n          \"dev\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 4
        }
      ],
      "source": [
        "import torch\n",
        "import pandas as pd\n",
        "from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments\n",
        "from transformers import AutoModelForSequenceClassification, AutoTokenizer\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.metrics import accuracy_score, precision_recall_fscore_support\n",
        "import numpy as np\n",
        "\n",
        "# データの読み込み\n",
        "filename = \"pn.tsv\"\n",
        "columns = [\"id\", \"sentiment\", \"text\", \"judges-json\", \"usage\"]\n",
        "df = pd.read_csv(filename, sep=\"\\t\", names=columns)\n",
        "df.head()"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# ラベルの付け替え\n",
        "# AutoModelForSequenceClassificationではラベルは「0から始まる整数」である必要がある。\n",
        "# このため -1, 0, 1 => 0, 1, 2（ネガティブ0、ノーマル1、ポジティブ2）に付け替える。\n",
        "df['sentiment'] = df['sentiment'].map({-1: 0, 0: 1, 1: 2})\n",
        "df.head()"
      ],
      "metadata": {
        "id": "pkm-AzaZjTRk",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        },
        "outputId": "2e58f8ed-936f-4bd1-e910-9c68ce4fbbaa"
      },
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "           id  sentiment                text       judges-json usage\n",
              "0  pn17q00001          1       出張でお世話になりました。          {\"0\": 3}  test\n",
              "1  pn17q00002          1           朝食は普通でした。          {\"0\": 3}  test\n",
              "2  pn17q00003          2         また是非行きたいです。          {\"1\": 3}  test\n",
              "3  pn17q00004          2  また利用したいと思えるホテルでした。          {\"1\": 3}  test\n",
              "4  pn17q00005          2        駅から近くて便利でした。  {\"0\": 1, \"1\": 2}  test"
            ],
            "text/html": [
              "\n",
              "  <div id=\"df-036dcb49-a17e-476c-8032-3faf346cf888\" class=\"colab-df-container\">\n",
              "    <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>id</th>\n",
              "      <th>sentiment</th>\n",
              "      <th>text</th>\n",
              "      <th>judges-json</th>\n",
              "      <th>usage</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <th>0</th>\n",
              "      <td>pn17q00001</td>\n",
              "      <td>1</td>\n",
              "      <td>出張でお世話になりました。</td>\n",
              "      <td>{\"0\": 3}</td>\n",
              "      <td>test</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>1</th>\n",
              "      <td>pn17q00002</td>\n",
              "      <td>1</td>\n",
              "      <td>朝食は普通でした。</td>\n",
              "      <td>{\"0\": 3}</td>\n",
              "      <td>test</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>2</th>\n",
              "      <td>pn17q00003</td>\n",
              "      <td>2</td>\n",
              "      <td>また是非行きたいです。</td>\n",
              "      <td>{\"1\": 3}</td>\n",
              "      <td>test</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>3</th>\n",
              "      <td>pn17q00004</td>\n",
              "      <td>2</td>\n",
              "      <td>また利用したいと思えるホテルでした。</td>\n",
              "      <td>{\"1\": 3}</td>\n",
              "      <td>test</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <th>4</th>\n",
              "      <td>pn17q00005</td>\n",
              "      <td>2</td>\n",
              "      <td>駅から近くて便利でした。</td>\n",
              "      <td>{\"0\": 1, \"1\": 2}</td>\n",
              "      <td>test</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table>\n",
              "</div>\n",
              "    <div class=\"colab-df-buttons\">\n",
              "\n",
              "  <div class=\"colab-df-container\">\n",
              "    <button class=\"colab-df-convert\" onclick=\"convertToInteractive('df-036dcb49-a17e-476c-8032-3faf346cf888')\"\n",
              "            title=\"Convert this dataframe to an interactive table.\"\n",
              "            style=\"display:none;\">\n",
              "\n",
              "  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\">\n",
              "    <path d=\"M120-120v-720h720v720H120Zm60-500h600v-160H180v160Zm220 220h160v-160H400v160Zm0 220h160v-160H400v160ZM180-400h160v-160H180v160Zm440 0h160v-160H620v160ZM180-180h160v-160H180v160Zm440 0h160v-160H620v160Z\"/>\n",
              "  </svg>\n",
              "    </button>\n",
              "\n",
              "  <style>\n",
              "    .colab-df-container {\n",
              "      display:flex;\n",
              "      gap: 12px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert {\n",
              "      background-color: #E8F0FE;\n",
              "      border: none;\n",
              "      border-radius: 50%;\n",
              "      cursor: pointer;\n",
              "      display: none;\n",
              "      fill: #1967D2;\n",
              "      height: 32px;\n",
              "      padding: 0 0 0 0;\n",
              "      width: 32px;\n",
              "    }\n",
              "\n",
              "    .colab-df-convert:hover {\n",
              "      background-color: #E2EBFA;\n",
              "      box-shadow: 0px 1px 2px rgba(60, 64, 67, 0.3), 0px 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "      fill: #174EA6;\n",
              "    }\n",
              "\n",
              "    .colab-df-buttons div {\n",
              "      margin-bottom: 4px;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert {\n",
              "      background-color: #3B4455;\n",
              "      fill: #D2E3FC;\n",
              "    }\n",
              "\n",
              "    [theme=dark] .colab-df-convert:hover {\n",
              "      background-color: #434B5C;\n",
              "      box-shadow: 0px 1px 3px 1px rgba(0, 0, 0, 0.15);\n",
              "      filter: drop-shadow(0px 1px 2px rgba(0, 0, 0, 0.3));\n",
              "      fill: #FFFFFF;\n",
              "    }\n",
              "  </style>\n",
              "\n",
              "    <script>\n",
              "      const buttonEl =\n",
              "        document.querySelector('#df-036dcb49-a17e-476c-8032-3faf346cf888 button.colab-df-convert');\n",
              "      buttonEl.style.display =\n",
              "        google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "\n",
              "      async function convertToInteractive(key) {\n",
              "        const element = document.querySelector('#df-036dcb49-a17e-476c-8032-3faf346cf888');\n",
              "        const dataTable =\n",
              "          await google.colab.kernel.invokeFunction('convertToInteractive',\n",
              "                                                    [key], {});\n",
              "        if (!dataTable) return;\n",
              "\n",
              "        const docLinkHtml = 'Like what you see? Visit the ' +\n",
              "          '<a target=\"_blank\" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'\n",
              "          + ' to learn more about interactive tables.';\n",
              "        element.innerHTML = '';\n",
              "        dataTable['output_type'] = 'display_data';\n",
              "        await google.colab.output.renderOutput(dataTable, element);\n",
              "        const docLink = document.createElement('div');\n",
              "        docLink.innerHTML = docLinkHtml;\n",
              "        element.appendChild(docLink);\n",
              "      }\n",
              "    </script>\n",
              "  </div>\n",
              "\n",
              "\n",
              "    <div id=\"df-2556d970-0214-43ea-b158-3d3d89170f35\">\n",
              "      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-2556d970-0214-43ea-b158-3d3d89170f35')\"\n",
              "                title=\"Suggest charts\"\n",
              "                style=\"display:none;\">\n",
              "\n",
              "<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\"viewBox=\"0 0 24 24\"\n",
              "     width=\"24px\">\n",
              "    <g>\n",
              "        <path d=\"M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zM9 17H7v-7h2v7zm4 0h-2V7h2v10zm4 0h-2v-4h2v4z\"/>\n",
              "    </g>\n",
              "</svg>\n",
              "      </button>\n",
              "\n",
              "<style>\n",
              "  .colab-df-quickchart {\n",
              "      --bg-color: #E8F0FE;\n",
              "      --fill-color: #1967D2;\n",
              "      --hover-bg-color: #E2EBFA;\n",
              "      --hover-fill-color: #174EA6;\n",
              "      --disabled-fill-color: #AAA;\n",
              "      --disabled-bg-color: #DDD;\n",
              "  }\n",
              "\n",
              "  [theme=dark] .colab-df-quickchart {\n",
              "      --bg-color: #3B4455;\n",
              "      --fill-color: #D2E3FC;\n",
              "      --hover-bg-color: #434B5C;\n",
              "      --hover-fill-color: #FFFFFF;\n",
              "      --disabled-bg-color: #3B4455;\n",
              "      --disabled-fill-color: #666;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart {\n",
              "    background-color: var(--bg-color);\n",
              "    border: none;\n",
              "    border-radius: 50%;\n",
              "    cursor: pointer;\n",
              "    display: none;\n",
              "    fill: var(--fill-color);\n",
              "    height: 32px;\n",
              "    padding: 0;\n",
              "    width: 32px;\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart:hover {\n",
              "    background-color: var(--hover-bg-color);\n",
              "    box-shadow: 0 1px 2px rgba(60, 64, 67, 0.3), 0 1px 3px 1px rgba(60, 64, 67, 0.15);\n",
              "    fill: var(--button-hover-fill-color);\n",
              "  }\n",
              "\n",
              "  .colab-df-quickchart-complete:disabled,\n",
              "  .colab-df-quickchart-complete:disabled:hover {\n",
              "    background-color: var(--disabled-bg-color);\n",
              "    fill: var(--disabled-fill-color);\n",
              "    box-shadow: none;\n",
              "  }\n",
              "\n",
              "  .colab-df-spinner {\n",
              "    border: 2px solid var(--fill-color);\n",
              "    border-color: transparent;\n",
              "    border-bottom-color: var(--fill-color);\n",
              "    animation:\n",
              "      spin 1s steps(1) infinite;\n",
              "  }\n",
              "\n",
              "  @keyframes spin {\n",
              "    0% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "      border-left-color: var(--fill-color);\n",
              "    }\n",
              "    20% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    30% {\n",
              "      border-color: transparent;\n",
              "      border-left-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    40% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-top-color: var(--fill-color);\n",
              "    }\n",
              "    60% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "    }\n",
              "    80% {\n",
              "      border-color: transparent;\n",
              "      border-right-color: var(--fill-color);\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "    90% {\n",
              "      border-color: transparent;\n",
              "      border-bottom-color: var(--fill-color);\n",
              "    }\n",
              "  }\n",
              "</style>\n",
              "\n",
              "      <script>\n",
              "        async function quickchart(key) {\n",
              "          const quickchartButtonEl =\n",
              "            document.querySelector('#' + key + ' button');\n",
              "          quickchartButtonEl.disabled = true;  // To prevent multiple clicks.\n",
              "          quickchartButtonEl.classList.add('colab-df-spinner');\n",
              "          try {\n",
              "            const charts = await google.colab.kernel.invokeFunction(\n",
              "                'suggestCharts', [key], {});\n",
              "          } catch (error) {\n",
              "            console.error('Error during call to suggestCharts:', error);\n",
              "          }\n",
              "          quickchartButtonEl.classList.remove('colab-df-spinner');\n",
              "          quickchartButtonEl.classList.add('colab-df-quickchart-complete');\n",
              "        }\n",
              "        (() => {\n",
              "          let quickchartButtonEl =\n",
              "            document.querySelector('#df-2556d970-0214-43ea-b158-3d3d89170f35 button');\n",
              "          quickchartButtonEl.style.display =\n",
              "            google.colab.kernel.accessAllowed ? 'block' : 'none';\n",
              "        })();\n",
              "      </script>\n",
              "    </div>\n",
              "\n",
              "    </div>\n",
              "  </div>\n"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "dataframe",
              "variable_name": "df",
              "summary": "{\n  \"name\": \"df\",\n  \"rows\": 5553,\n  \"fields\": [\n    {\n      \"column\": \"id\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5553,\n        \"samples\": [\n          \"pn17q01971\",\n          \"pn17q03940\",\n          \"pn17q02861\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"sentiment\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 2,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          1,\n          2,\n          0\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"text\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 5553,\n        \"samples\": [\n          \"\\u30d0\\u30a4\\u30ad\\u30f3\\u30b0\\u306e\\u671d\\u98df\\u3082\\u7f8e\\u5473\\u3057\\u304b\\u3063\\u305f\\u3067\\u3059\\u3002\",\n          \"\\u30d5\\u30ed\\u30f3\\u30c8\\u5bfe\\u5fdc\\u3082\\u4e01\\u5be7\\u3067\\u3059\\u3002\",\n          \"\\u671d\\u98df\\u306f\\u7f8e\\u5473\\u304b\\u3063\\u305f\\u3002\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"judges-json\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 10,\n        \"samples\": [\n          \"{\\\"-1\\\": 1, \\\"1\\\": 2}\",\n          \"{\\\"1\\\": 3}\",\n          \"{\\\"-1\\\": 3}\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"usage\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"test\",\n          \"train\",\n          \"dev\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"
            }
          },
          "metadata": {},
          "execution_count": 5
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# データセットの分割\n",
        "train_texts = df[df[\"usage\"] == \"train\"][\"text\"].tolist()\n",
        "train_labels = df[df[\"usage\"] == \"train\"][\"sentiment\"].tolist()\n",
        "dev_texts = df[df[\"usage\"] == \"dev\"][\"text\"].tolist()\n",
        "dev_labels = df[df[\"usage\"] == \"dev\"][\"sentiment\"].tolist()\n",
        "test_texts = df[df[\"usage\"] == \"test\"][\"text\"].tolist()\n",
        "test_labels = df[df[\"usage\"] == \"test\"][\"sentiment\"].tolist()\n",
        "\n",
        "# 動作確認\n",
        "print(f\"{train_texts[0]=}\")\n",
        "print(f\"{train_labels[0]=}\")\n",
        "print(df['sentiment'].value_counts())"
      ],
      "metadata": {
        "id": "H2oGt5Xthwsy",
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "outputId": "d6da3d4d-b4c9-44e8-dbbc-4f7509aef52e"
      },
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "train_texts[0]='(笑)'\n",
            "train_labels[0]=1\n",
            "sentiment\n",
            "2    3406\n",
            "1    1329\n",
            "0     818\n",
            "Name: count, dtype: int64\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ETXKmVVYo_xg"
      },
      "source": [
        "## モデルの用意\n",
        "- ここでは \"tohoku-nlp/bert-base-japanese-v3\" を利用。\n",
        "- 長文だが、最初の出力「`Some weights of BertForSequenceClassification were not initialized from the model checkpoint at tohoku-nlp/bert-base-japanese-v3 and are newly initialized: ['classifier.bias', 'classifier.weight']   You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.`」は、このままでは利用できない（ので学習が必要だろう）ということを指摘している。この理由は、AutoModelForSequenceClassificationが「LLMの最後尾に新たな線形層（[torch.nn.Linear](https://pytorch.org/docs/stable/generated/torch.nn.Linear.html)）を追加しているためだ。この線形層はクラス数と同数のユニットを持つように設定されており（引数num_labelsで設定）、各ユニットに対するスコアを求めるようにモデルを拡張している。\n",
        "- このようなにモデルを拡張しているということは、拡張した部分（Linear層のパラメータ）については重みがまっさらな状態である。このままでは当然推定できない（でたらめになる）ため、「You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.」と注意を促している。"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 384,
          "referenced_widgets": [
            "e1e113c9b2034983a48c322b9c77fd83",
            "72f0f6f3095345b5998e699d5d6c7cb6",
            "325f14486f4142da983aa43855195e40",
            "613e973f5cf54f21884da91545d2b0e2",
            "72a7bc647e1f46efa345547143d49a46",
            "e5b548bc39e141fb8b23388142032b3f",
            "0349448fe7eb4ff595ecf438d7c79574",
            "6dbb7b01e3af46c09d3e39385aee4fa0",
            "20f695e8bb7f49568881f214a1833f96",
            "f7ab322a9018409bac6c0716ca82c39f",
            "65b40695869c472bbe05a97534f77e96",
            "6accad342c3f477cb9113c70452b0738",
            "4be71da5a98c4b58a798180629ed853d",
            "1c8069f42fe24988930203d7765e25dd",
            "d0b22e266aa74c6b896eaac59bdf10d2",
            "c31e201f9b3a4bcf8c61e74f477076d7",
            "d256ad649a2c4fc98535ed481531a739",
            "28a0f9c0e7804686870308200ee4caa1",
            "ceb7fccbd47643f886b08f2d47ee1eea",
            "46947fe9e2a1463daf82ba854b255a8b",
            "9a0b334b526f47e7ab9f840e13a1806e",
            "2df113687bf148ec8796f2f1f41b9196",
            "04ef6e02b51247b08e651397fcee0d42",
            "2e8d4f2f77fa4a3b9fb2d0eb1ac5cc74",
            "66b6fd8426e6422d8feb0cb22294896d",
            "c47a8602ac144b40bb07211f167bddf4",
            "fa799fafd1f447589ed648eb32771baa",
            "61fa4dc07cc742c9995c5ffbcc95225e",
            "32a12c03610c4d718a00472249d24a15",
            "f9f3e94cb6af4b14b062f32e257022dc",
            "5a43ce8d466047609e97f112ba63d85e",
            "74c94a9dc8194c8c902d989ed9269230",
            "3bdd49a6dec04b5aa484ba8b8c583ebd",
            "3e70c1d2d83c46fb845e8159a70950d0",
            "5d894253ea5b435389ab72f749b82cfb",
            "0489dc7134ea4a52a382eb1bd0ead726",
            "5338b621a4304a0d8fd32c9b8a6c8fad",
            "bdf3717814b24b59abf1d7f1ad3ac115",
            "bb67b2b1e3b44bb8a1b2c9315735aee9",
            "0962a495fdf94d83a1f3f0567caf8052",
            "6f0c662fa67e49529e4c0754bcc9648e",
            "1dce1e6afd394576b07d2fae5187cb17",
            "25a1abc6014044059177088de6d71d51",
            "155cdc297d984f0483928f9dafc5e3be",
            "0b52104a96164b68b605914303968a4b",
            "1e03065f13c0421eac2b67a2636a735c",
            "4f4305820d304fd59f9ad41c6708f2d3",
            "dd9a9a5b7366478fb05e0887498e0c8c",
            "8135925fe02446139bcd40f0c835b67d",
            "8c8b3f690f934266b1f37debc4a43e63",
            "3a41f0df8a124c67920e78971c21c93e",
            "a395af14f2214165a69ac588cce57049",
            "6cbe1ec6340c4c82b33eaaf919c8ae5b",
            "50779aa05b71429c9b0ea78c784fcfe4",
            "b52ca6f490554505b5190a0a42fa083a"
          ]
        },
        "id": "uzl27_c_o_xh",
        "outputId": "cd90e7cd-0a67-4b3e-c0cc-675141951e0b"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "/usr/local/lib/python3.11/dist-packages/huggingface_hub/utils/_auth.py:94: UserWarning: \n",
            "The secret `HF_TOKEN` does not exist in your Colab secrets.\n",
            "To authenticate with the Hugging Face Hub, create a token in your settings tab (https://huggingface.co/settings/tokens), set it as secret in your Google Colab and restart your session.\n",
            "You will be able to reuse this secret in all of your notebooks.\n",
            "Please note that authentication is recommended but still optional to access public models or datasets.\n",
            "  warnings.warn(\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "tokenizer_config.json:   0%|          | 0.00/251 [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "e1e113c9b2034983a48c322b9c77fd83"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "vocab.txt:   0%|          | 0.00/231k [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "6accad342c3f477cb9113c70452b0738"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "config.json:   0%|          | 0.00/472 [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "04ef6e02b51247b08e651397fcee0d42"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "pytorch_model.bin:   0%|          | 0.00/447M [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "3e70c1d2d83c46fb845e8159a70950d0"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "Some weights of BertForSequenceClassification were not initialized from the model checkpoint at tohoku-nlp/bert-base-japanese-v3 and are newly initialized: ['classifier.bias', 'classifier.weight']\n",
            "You should probably TRAIN this model on a down-stream task to be able to use it for predictions and inference.\n"
          ]
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "model.safetensors:   0%|          | 0.00/447M [00:00<?, ?B/s]"
            ],
            "application/vnd.jupyter.widget-view+json": {
              "version_major": 2,
              "version_minor": 0,
              "model_id": "0b52104a96164b68b605914303968a4b"
            }
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "dict_keys(['input_ids', 'token_type_ids', 'attention_mask'])\n",
            "[2, 23, 4374, 24, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n",
            "[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n"
          ]
        }
      ],
      "source": [
        "# ハイパーパラメータ\n",
        "num_labels = 3   # クラス数\n",
        "max_length = 128 # 最長系列長（最大トークン数）\n",
        "num_train_epochs = 10 # 最大学習エポック数\n",
        "output_dir = './results' # チェックポイント等を保存するディレクトリ\n",
        "batch_size = 16  # バッチサイズ（一度に処理するサンプル数）\n",
        "logging_dir = './logs' # ログ出力用のディレクトリ（主にエラー確認用）\n",
        "\n",
        "# トークナイザーとモデルの準備\n",
        "model_name = \"tohoku-nlp/bert-base-japanese-v3\"\n",
        "tokenizer = AutoTokenizer.from_pretrained(model_name)\n",
        "model = AutoModelForSequenceClassification.from_pretrained(model_name, num_labels=num_labels)\n",
        "\n",
        "# データセットのトークナイズ\n",
        "train_encodings = tokenizer(train_texts, truncation=True, padding=True, max_length=max_length)\n",
        "dev_encodings = tokenizer(dev_texts, truncation=True, padding=True, max_length=max_length)\n",
        "test_encodings = tokenizer(test_texts, truncation=True, padding=True, max_length=max_length)\n",
        "\n",
        "# 動作確認\n",
        "# 'input_ids', 'token_type_ids', 'attention_mask'をキーとするリストとして保存されている。\n",
        "# ['input_ids'][0] は、0番目のみを出力指定。\n",
        "print(train_encodings.keys())\n",
        "print(train_encodings['input_ids'][0]) # サンプル0番目\n",
        "print(train_encodings['attention_mask'][0])"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        },
        "id": "Sa_T0Xmro_xi",
        "outputId": "67dce31e-f4b5-4a6c-a3b3-26735ab0a334"
      },
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "'[CLS] ( 笑 ) [SEP]'"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "string"
            }
          },
          "metadata": {},
          "execution_count": 8
        }
      ],
      "source": [
        "# input_ids をデコードして元の文章を確認\n",
        "tokenizer.decode([2, 23, 4374, 24, 3])"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## LLM用にデータを整形\n",
        "今回は分類タスクとして学習させたい。しかしtokenizerではテキストに対する前処理しか行われておらず、教師ラベルは別に用意している。これらを使いやすい形（Dataset型）にまとめ直している。\n",
        "\n",
        "print文では、Dataset型の例としてtrain_dataset[0]を出力している。\n",
        "- トークン系列分用意するデータ（同じ長さで揃える必要がある）\n",
        "  - `input_ids`: 入力文をトークナイズした結果（トークンのID列）。\n",
        "  - `tokey_type_ids`: BERT系では2文の対で用意することを前提としている。その2文を区別するためのフィルタ設定。単一文の場合は全て0（今回はこれ）。2文ある場合、文2のトークンは1になる。\n",
        "  - `attention_mask`: 一般的には「どのトークンに注意を向けるか」を0（無視する）,1（注意を向ける）で設定している。ここでは実トークンがある部分を1に、パディングで意味の無い部分を0として設定している。\n",
        "- 教師データ\n",
        "  - `labels`: Trainerと連動した設定。`train_dataset=train_dataset` と設定していると、train_dataset内の\"labels\"を自動で参照し、損失を計算するようになっている。違う名目でラベルを設定したい場合には DataCollatorもしくはTrainerをカスタマイズする必要があります。"
      ],
      "metadata": {
        "id": "5Kkp8ndD2YgO"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 9,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "A6qMHL_so_xi",
        "outputId": "10fd6b68-9dcf-4583-8d5d-8459163ed776"
      },
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "{'input_ids': tensor([   2,   23, 4374,   24,    3,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n",
            "           0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0]), 'token_type_ids': tensor([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
            "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
            "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
            "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), 'attention_mask': tensor([1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
            "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
            "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n",
            "        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]), 'labels': tensor(1)}\n"
          ]
        }
      ],
      "source": [
        "class SentimentDataset(torch.utils.data.Dataset):\n",
        "    '''サンプル毎に input_ids, token_type_ids, attention_mask, labels を設定。\n",
        "    '''\n",
        "    def __init__(self, encodings, labels):\n",
        "        self.encodings = encodings\n",
        "        self.labels = labels\n",
        "\n",
        "    def __getitem__(self, idx):\n",
        "        item = {key: torch.tensor(val[idx]) for key, val in self.encodings.items()}\n",
        "        item['labels'] = torch.tensor(self.labels[idx])\n",
        "        return item\n",
        "\n",
        "    def __len__(self):\n",
        "        return len(self.labels)\n",
        "\n",
        "train_dataset = SentimentDataset(train_encodings, train_labels)\n",
        "dev_dataset = SentimentDataset(dev_encodings, dev_labels)\n",
        "test_dataset = SentimentDataset(test_encodings, test_labels)\n",
        "\n",
        "# 動作確認\n",
        "# サンプル毎に input_ids, token_type_ids, attention_mask, labels を用意した\n",
        "print(train_dataset[0])"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 学習\n",
        "エポック毎に出力しているログは、学習データに対する損失(training loss)、検証データに対する損失(validation loss)、正解率(accuracy)、F1スコア(F1)、適合率(precision)、再現率(recall)。\n",
        "\n",
        "ログを確認すると、基本的には学習データに対する損失は減り続けている。しかし検証データに対する損失は途中から「逆に増えている」ことを確認できる。これが[過学習（過剰適合; over-fitting）](https://en.wikipedia.org/wiki/Overfitting#Machine_learning)だ。ここでは特別なことはせずに指定したエポック数の学習を続け、最終モデルを用いた検証を行うこととした。\n",
        "\n",
        "- TrainingArgumentsで用いているパラメータ\n",
        "- TrainingArgumentsの補足\n",
        "  - 設定可能な項目多数のため、詳細は[huggingfaceの公式ドキュメント](https://huggingface.co/docs/transformers/ja/main_classes/trainer)推奨。ここでは利用したパラメータだけ説明する。\n",
        "  - `output_dir`: チェックポイント（学習済みモデル）やログを保存する出力先ディレクトリを指定。\n",
        "    - チェックポイントとは、別のパラメータ「save_strategy = \"epoch\"」として指定したタイミングのモデルのこと。今回はepochと指定しているため1エポック毎にモデルが保存されている。\n",
        "    - 必要に応じてこれらのチェックポイントからモデルを復元することも可能。モデル読み込み時にファイルを指定するだけで良い。このためファインチューニングしたモデルをファイル保存しておきたいならば、resultsフォルダ内のチェックポイントを保存しておくか、最終モデルである sentiment_model を保存しておくと良いだろう。\n",
        "    - ダウンロードするというよりは、Googleドライブへのアクセス許可を与え、自身のドライブ内に保存する方が良いだろう。\n",
        "  - `num_train_epochs`: 学習を繰り返すエポック数。1エポックは全データを1周すること。\n",
        "  - `per_device_train_batch_size`: 学習時に1デバイス（GPU/CPU）あたりで処理するバッチサイズ。\n",
        "  - `per_device_eval_batch_size`: 評価時のバッチサイズ。\n",
        "  - `warmup_steps`: 指定した初期ステップ数（〜500ステップまで）は学習率を徐々に増やす。デフォルトでは0から指定した学習率まで線形単調増加。\n",
        "  - `weight_decay`: L2正則化による過学習抑制のための調整項。\n",
        "  - `logging_dir`: TensorBoard用ログの出力先。\n",
        "  - `logging_steps`: 指定ステップ毎に損失などのログを記録。\n",
        "  - `eval_strategy`: 評価を行うタイミング（今回は1エポック終了毎）。\n",
        "  - `save_strategy`: モデル保存タイミング。\n",
        "  - `report_to`: 学習をどこに送るか。今回は外部ログ連携無し。"
      ],
      "metadata": {
        "id": "mQ_k7mli3E-P"
      }
    },
    {
      "cell_type": "code",
      "execution_count": 10,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 473
        },
        "id": "c1Yyr28Do_xi",
        "outputId": "7ad6b7c5-ab25-40c7-a860-b4479139a084"
      },
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ],
            "text/html": [
              "\n",
              "    <div>\n",
              "      \n",
              "      <progress value='2430' max='2430' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
              "      [2430/2430 13:12, Epoch 10/10]\n",
              "    </div>\n",
              "    <table border=\"1\" class=\"dataframe\">\n",
              "  <thead>\n",
              " <tr style=\"text-align: left;\">\n",
              "      <th>Epoch</th>\n",
              "      <th>Training Loss</th>\n",
              "      <th>Validation Loss</th>\n",
              "      <th>Accuracy</th>\n",
              "      <th>F1</th>\n",
              "      <th>Precision</th>\n",
              "      <th>Recall</th>\n",
              "    </tr>\n",
              "  </thead>\n",
              "  <tbody>\n",
              "    <tr>\n",
              "      <td>1</td>\n",
              "      <td>0.404300</td>\n",
              "      <td>0.408381</td>\n",
              "      <td>0.847122</td>\n",
              "      <td>0.792012</td>\n",
              "      <td>0.821642</td>\n",
              "      <td>0.776139</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>2</td>\n",
              "      <td>0.290400</td>\n",
              "      <td>0.370082</td>\n",
              "      <td>0.859712</td>\n",
              "      <td>0.815932</td>\n",
              "      <td>0.820656</td>\n",
              "      <td>0.811538</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>3</td>\n",
              "      <td>0.196200</td>\n",
              "      <td>0.432191</td>\n",
              "      <td>0.877698</td>\n",
              "      <td>0.838691</td>\n",
              "      <td>0.845239</td>\n",
              "      <td>0.837207</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>4</td>\n",
              "      <td>0.151200</td>\n",
              "      <td>0.478974</td>\n",
              "      <td>0.884892</td>\n",
              "      <td>0.844025</td>\n",
              "      <td>0.846112</td>\n",
              "      <td>0.845028</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>5</td>\n",
              "      <td>0.079300</td>\n",
              "      <td>0.555178</td>\n",
              "      <td>0.871403</td>\n",
              "      <td>0.831201</td>\n",
              "      <td>0.832901</td>\n",
              "      <td>0.829776</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>6</td>\n",
              "      <td>0.052700</td>\n",
              "      <td>0.722724</td>\n",
              "      <td>0.863309</td>\n",
              "      <td>0.824431</td>\n",
              "      <td>0.823894</td>\n",
              "      <td>0.826944</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>7</td>\n",
              "      <td>0.001300</td>\n",
              "      <td>0.758387</td>\n",
              "      <td>0.875000</td>\n",
              "      <td>0.831257</td>\n",
              "      <td>0.835224</td>\n",
              "      <td>0.829333</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>8</td>\n",
              "      <td>0.023000</td>\n",
              "      <td>0.835225</td>\n",
              "      <td>0.875899</td>\n",
              "      <td>0.828396</td>\n",
              "      <td>0.838685</td>\n",
              "      <td>0.821027</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>9</td>\n",
              "      <td>0.000300</td>\n",
              "      <td>0.864122</td>\n",
              "      <td>0.875899</td>\n",
              "      <td>0.831851</td>\n",
              "      <td>0.837495</td>\n",
              "      <td>0.826545</td>\n",
              "    </tr>\n",
              "    <tr>\n",
              "      <td>10</td>\n",
              "      <td>0.000600</td>\n",
              "      <td>0.866264</td>\n",
              "      <td>0.875899</td>\n",
              "      <td>0.831269</td>\n",
              "      <td>0.838046</td>\n",
              "      <td>0.824955</td>\n",
              "    </tr>\n",
              "  </tbody>\n",
              "</table><p>"
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ],
            "text/html": [
              "\n",
              "    <div>\n",
              "      \n",
              "      <progress value='35' max='35' style='width:300px; height:20px; vertical-align: middle;'></progress>\n",
              "      [35/35 00:02]\n",
              "    </div>\n",
              "    "
            ]
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "Test Accuracy: 0.8553345388788427\n",
            "Test F1 Score: 0.8221032582050153\n",
            "Test Precision: 0.8452179386146287\n",
            "Test Recall: 0.8034550381672684\n"
          ]
        }
      ],
      "source": [
        "# トレーニングの設定\n",
        "training_args = TrainingArguments(\n",
        "    output_dir=output_dir,\n",
        "    num_train_epochs=num_train_epochs,\n",
        "    per_device_train_batch_size=batch_size,\n",
        "    per_device_eval_batch_size=batch_size,\n",
        "    warmup_steps=500,\n",
        "    weight_decay=0.01,\n",
        "    logging_dir=logging_dir,\n",
        "    logging_steps=10,\n",
        "    eval_strategy=\"epoch\",\n",
        "    save_strategy=\"epoch\",\n",
        "    report_to=\"none\" # wandbを使わない\n",
        ")\n",
        "\n",
        "# 精度の計算\n",
        "def compute_metrics(p):\n",
        "    pred, labels = p\n",
        "    pred = np.argmax(pred, axis=1)\n",
        "    precision, recall, f1, _ = precision_recall_fscore_support(labels, pred, average='macro')\n",
        "    acc = accuracy_score(labels, pred)\n",
        "    return {\n",
        "        'accuracy': acc,\n",
        "        'f1': f1,\n",
        "        'precision': precision,\n",
        "        'recall': recall\n",
        "    }\n",
        "\n",
        "# トレーナーの設定\n",
        "trainer = Trainer(\n",
        "    model=model,\n",
        "    args=training_args,\n",
        "    train_dataset=train_dataset,\n",
        "    eval_dataset=dev_dataset,\n",
        "    compute_metrics=compute_metrics\n",
        ")\n",
        "\n",
        "# モデルのトレーニング\n",
        "trainer.train()\n",
        "\n",
        "# モデルの保存\n",
        "trainer.save_model(\"./sentiment_model\")\n",
        "\n",
        "# テストセットでの評価\n",
        "results = trainer.evaluate(eval_dataset=test_dataset)\n",
        "\n",
        "# 結果の表示\n",
        "print(f\"Test Accuracy: {results['eval_accuracy']}\")\n",
        "print(f\"Test F1 Score: {results['eval_f1']}\")\n",
        "print(f\"Test Precision: {results['eval_precision']}\")\n",
        "print(f\"Test Recall: {results['eval_recall']}\")"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## テストデータに対する詳細結果"
      ],
      "metadata": {
        "id": "rvOyFqp_5fhs"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# テストデータに対する詳細結果\n",
        "from sklearn.metrics import classification_report, confusion_matrix, ConfusionMatrixDisplay\n",
        "#import numpy as np\n",
        "\n",
        "predictions, labels, _ = trainer.predict(test_dataset)\n",
        "predicted_labels = np.argmax(predictions, axis=1)\n",
        "labels = ['negative', 'normal', 'positive']\n",
        "\n",
        "# 分類レポートの表示\n",
        "print(classification_report(test_labels, predicted_labels, target_names=labels))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 187
        },
        "id": "UGxJIbUKy1QY",
        "outputId": "f0f1eacd-ac69-4986-a856-f5cafd105afe"
      },
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ],
            "text/html": []
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "              precision    recall  f1-score   support\n",
            "\n",
            "    negative       0.91      0.79      0.85        78\n",
            "      normal       0.74      0.67      0.70       139\n",
            "    positive       0.89      0.95      0.92       336\n",
            "\n",
            "    accuracy                           0.86       553\n",
            "   macro avg       0.85      0.80      0.82       553\n",
            "weighted avg       0.85      0.86      0.85       553\n",
            "\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# 混同行列の表示\n",
        "conf_matrix = confusion_matrix(test_labels, predicted_labels)\n",
        "disp = ConfusionMatrixDisplay(confusion_matrix=conf_matrix, display_labels=labels)\n",
        "disp.plot(cmap='Blues')\n",
        "disp.ax_.set_title('Confusion Matrix')"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 489
        },
        "id": "kDwMrlHszDFO",
        "outputId": "70e4dbd4-5cdb-4724-8234-3ca60b638d85"
      },
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Text(0.5, 1.0, 'Confusion Matrix')"
            ]
          },
          "metadata": {},
          "execution_count": 12
        },
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 640x480 with 2 Axes>"
            ],
            "image/png": "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\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## 具体的な失敗例\n",
        "ラベルは「ネガティブ0、ノーマル1、ポジティブ2」に付け直していることに注意。"
      ],
      "metadata": {
        "id": "zA2OEeFy1KLz"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "### 学習データに対する誤り\n",
        "以下の通り1件しか誤りがない。学習データに対しては極めて的鉄な予測が可能なモデルになっているようだ。"
      ],
      "metadata": {
        "id": "9dwmMt0qCXHa"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# 学習データに対する予測誤り\n",
        "\n",
        "predictions, labels, _ = trainer.predict(train_dataset)\n",
        "predicted_labels = np.argmax(predictions, axis=1)\n",
        "\n",
        "# 誤った予測のサンプルを抽出\n",
        "incorrect_indices = [i for i, (true, pred) in enumerate(zip(train_labels, predicted_labels)) if true != pred]\n",
        "\n",
        "# 誤った予測のサンプルを出力\n",
        "for i in incorrect_indices:\n",
        "    print(f\"正解ラベル: {train_labels[i]}, 予測ラベル: {predicted_labels[i]}, テキスト: {train_texts[i]}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 51
        },
        "id": "O0lpUg_q0Wo0",
        "outputId": "9b603e71-8ab4-4029-d279-63343b71f6ef"
      },
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ],
            "text/html": []
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 家族旅行で利用させていただきました。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 東京出張時に利用しました。\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "### テストデータに対する誤り\n",
        "テストデータのサンプル数は学習データより少ないにも関わらず、失敗事例数は多い。"
      ],
      "metadata": {
        "id": "PTEkRb78CZgQ"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "# テストデータに対する予測誤り\n",
        "\n",
        "predictions, labels, _ = trainer.predict(test_dataset)\n",
        "predicted_labels = np.argmax(predictions, axis=1)\n",
        "\n",
        "# 誤った予測のサンプルを抽出\n",
        "incorrect_indices = [i for i, (true, pred) in enumerate(zip(test_labels, predicted_labels)) if true != pred]\n",
        "\n",
        "# 誤った予測のサンプルを出力\n",
        "for i in incorrect_indices:\n",
        "    print(f\"正解ラベル: {test_labels[i]}, 予測ラベル: {predicted_labels[i]}, テキスト: {test_texts[i]}\")"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 1000
        },
        "id": "J_TGLzSh0oG-",
        "outputId": "a970742e-38c9-4271-d128-4772984043a9"
      },
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<IPython.core.display.HTML object>"
            ],
            "text/html": []
          },
          "metadata": {}
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "正解ラベル: 1, 予測ラベル: 2, テキスト: お心遣いありがとうございました。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: と感じてしまいました。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 再訪です。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 二度目です。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: お疲れ様です。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: (^ω^\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 対応ありがとうございました。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 加湿器もありました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: コンビニも近かったです。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 長々と失礼しました。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 定宿にします。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 朝食は食べませんでした。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 良かった所。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: お待ちしておりました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 思わず笑ってしまいました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 大人の宿です。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 間違いないホテルです。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 迷わず予約しました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 足湯もありました。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: おかしいです。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 料理は期待通りでした。\n",
            "正解ラベル: 1, 予測ラベル: 0, テキスト: 好みの問題ですが。\n",
            "正解ラベル: 1, 予測ラベル: 0, テキスト: リゾートホテルではありません。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: また機会があれば...。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 朝食付きをお勧めします。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: そんなに気になりませんでした。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 立地は問題なしです。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 食べたかったなぁ。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 天気は雨。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 安ければまた利用します。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: はあったものの美味しく頂きました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 泊まる分には問題ありません。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: マンションのようなホテルでした。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 理解できません。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 餅っ!\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: とにかくすごい!\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 出張で利用させてもらっています。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: お風呂とトイレは別。\n",
            "正解ラベル: 1, 予測ラベル: 0, テキスト: がゴロゴロ。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 風呂は温泉です。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 一人旅で利用いたしました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: それ以外は◎。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 午後9時すぎから朝8時までなので1000円くらいだといいですね。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 女性専用ルームだったので、アメニティーやナノスチーマーやフットマッサージまで。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 時間で管理してるなら案内出して欲しいです。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 朝食は、お粥とチーズオムレツをお願いし、サラダに、ヨーグルトとフルーツ三昧。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 他にいいところが空いていればそっちを選択するかもですね。\n",
            "正解ラベル: 1, 予測ラベル: 0, テキスト: ただ朝のバイキングで席を指定され並んでいた所、私達の席を隣のテーブルとくっつけていて、家族連れが座りました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: そこがチョット残念な思いをしただけで他の食事、お風呂などは大変満足させていただきました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 料理もおいしかったし,お風呂の洗面付近の清潔感は素晴らしかったので,期待していかなければそれなりに満足できたのかもしれません。\n",
            "正解ラベル: 1, 予測ラベル: 0, テキスト: この金額でシャワーが赤青の蛇口じゃないところは初めてかも。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: チェックアウト12時のプランでしたが、10時までの料金をホテルで支払い、その後は精算機でとのことでした。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 4ヵ月の子どもと一緒の旅行だったので、部屋食にしたが、全体的に同じような味付けで、これ!\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: まだ使ってない洗面所で、気になりました。\n",
            "正解ラベル: 1, 予測ラベル: 0, テキスト: 8時過ぎになると人が少なってきます。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: フロントの方たちの笑顔があれば、90点なのですが、85点の満足の宿でした。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 部屋は4人部屋で大変広く、7人で2次会が出来ました、アジアンリゾート風ですね・・良かったですその他テニスやパターゴルフ、散策、夏はプールなどがあり宿泊者が楽しめる配慮が随所にありますが、子供いわくゲーセンは信じられない位しょぼい(笑)\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 夜フルーツが無いのと、朝お粥が有れば年配の方は喜ぶと思います。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: フロントも全く同じで何コールしてもでない。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 朝食のメニューも変わっていて前からあった和食・洋食にエビチーズドリアセット・ロコモコ丼セットの4種類になっていました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 大浴場が利用できたのが、ここに決めたポイントです。\n",
            "正解ラベル: 0, 予測ラベル: 2, テキスト: 身体の大きい人は大変そう。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 他はパーフェクトです。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: ほとんど寝るだけだったので、特に不便はありませんでした。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: この宿に泊まって一番感じる事は、御主人、女将さんの人柄です。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 120センチのセミダブルでしたので、夫とふたりでもこれならOKと思いました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: チッックインが遅くなることと雨が降っていたため夕食を済ませてからホテルに着きましたが、カレーのサービスを行っていました。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 18:00の予約で入って料理をとったところ保温トレーの中の料理はどれもぬるい程度の温度で、松茸茶碗蒸しは容器が冷たい程で驚きました。\n",
            "正解ラベル: 0, 予測ラベル: 1, テキスト: 粉コーヒーでもいいのでいつでも飲めるようになってればなぁ。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 全てはフロントの方の心遣いにあると思います。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: シングルルームを2部屋予約しましたが、当日部屋が空いてるとの事で大きな部屋に変更してくださいました。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: 料理はみんなきれいに盛られ、おいしかったですが、なにか一つ地のもので、「ここでしか食べられない」とか「何か特化したもの」があったらさらに良かったと思います。\n",
            "正解ラベル: 2, 予測ラベル: 1, テキスト: お風呂場にタオルの設置があったらいいなと思うのと、朝食会場が宿泊者の人数の割に狭いのが少し惜しい気がしましたが、いいホテルに泊まって気持ちよく過ごせました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 朝食は長い列ができていたが、案外すぐに呼ばれた。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 海沿いの立地のためか日の出スポットらしく元旦に続々前回道路に人が集まってました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: あと、お宿横には酒屋さん!\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 温泉が深夜男女入替のため、チェックイン後とチェックアウト後に入浴すると両方楽しめます。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 温泉チケット付きのプランでしたので目の前の温泉にいきました。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 他は完璧だと思う。\n",
            "正解ラベル: 1, 予測ラベル: 2, テキスト: 夕食の際、誕生日の特別デザートを用意頂いたり、希望すればチャンチャンコを貸して頂くこともできるようでした。\n"
          ]
        }
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.9.6"
    },
    "colab": {
      "provenance": [],
      "gpuType": "T4"
    },
    "widgets": {
      "application/vnd.jupyter.widget-state+json": {
        "e1e113c9b2034983a48c322b9c77fd83": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_72f0f6f3095345b5998e699d5d6c7cb6",
              "IPY_MODEL_325f14486f4142da983aa43855195e40",
              "IPY_MODEL_613e973f5cf54f21884da91545d2b0e2"
            ],
            "layout": "IPY_MODEL_72a7bc647e1f46efa345547143d49a46"
          }
        },
        "72f0f6f3095345b5998e699d5d6c7cb6": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_e5b548bc39e141fb8b23388142032b3f",
            "placeholder": "​",
            "style": "IPY_MODEL_0349448fe7eb4ff595ecf438d7c79574",
            "value": "tokenizer_config.json: 100%"
          }
        },
        "325f14486f4142da983aa43855195e40": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_6dbb7b01e3af46c09d3e39385aee4fa0",
            "max": 251,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_20f695e8bb7f49568881f214a1833f96",
            "value": 251
          }
        },
        "613e973f5cf54f21884da91545d2b0e2": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_f7ab322a9018409bac6c0716ca82c39f",
            "placeholder": "​",
            "style": "IPY_MODEL_65b40695869c472bbe05a97534f77e96",
            "value": " 251/251 [00:00&lt;00:00, 7.34kB/s]"
          }
        },
        "72a7bc647e1f46efa345547143d49a46": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "e5b548bc39e141fb8b23388142032b3f": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "0349448fe7eb4ff595ecf438d7c79574": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "6dbb7b01e3af46c09d3e39385aee4fa0": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "20f695e8bb7f49568881f214a1833f96": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "f7ab322a9018409bac6c0716ca82c39f": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "65b40695869c472bbe05a97534f77e96": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "6accad342c3f477cb9113c70452b0738": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_4be71da5a98c4b58a798180629ed853d",
              "IPY_MODEL_1c8069f42fe24988930203d7765e25dd",
              "IPY_MODEL_d0b22e266aa74c6b896eaac59bdf10d2"
            ],
            "layout": "IPY_MODEL_c31e201f9b3a4bcf8c61e74f477076d7"
          }
        },
        "4be71da5a98c4b58a798180629ed853d": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_d256ad649a2c4fc98535ed481531a739",
            "placeholder": "​",
            "style": "IPY_MODEL_28a0f9c0e7804686870308200ee4caa1",
            "value": "vocab.txt: 100%"
          }
        },
        "1c8069f42fe24988930203d7765e25dd": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_ceb7fccbd47643f886b08f2d47ee1eea",
            "max": 231026,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_46947fe9e2a1463daf82ba854b255a8b",
            "value": 231026
          }
        },
        "d0b22e266aa74c6b896eaac59bdf10d2": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_9a0b334b526f47e7ab9f840e13a1806e",
            "placeholder": "​",
            "style": "IPY_MODEL_2df113687bf148ec8796f2f1f41b9196",
            "value": " 231k/231k [00:00&lt;00:00, 1.89MB/s]"
          }
        },
        "c31e201f9b3a4bcf8c61e74f477076d7": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "d256ad649a2c4fc98535ed481531a739": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "28a0f9c0e7804686870308200ee4caa1": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "ceb7fccbd47643f886b08f2d47ee1eea": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "46947fe9e2a1463daf82ba854b255a8b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "9a0b334b526f47e7ab9f840e13a1806e": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "2df113687bf148ec8796f2f1f41b9196": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "04ef6e02b51247b08e651397fcee0d42": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_2e8d4f2f77fa4a3b9fb2d0eb1ac5cc74",
              "IPY_MODEL_66b6fd8426e6422d8feb0cb22294896d",
              "IPY_MODEL_c47a8602ac144b40bb07211f167bddf4"
            ],
            "layout": "IPY_MODEL_fa799fafd1f447589ed648eb32771baa"
          }
        },
        "2e8d4f2f77fa4a3b9fb2d0eb1ac5cc74": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_61fa4dc07cc742c9995c5ffbcc95225e",
            "placeholder": "​",
            "style": "IPY_MODEL_32a12c03610c4d718a00472249d24a15",
            "value": "config.json: 100%"
          }
        },
        "66b6fd8426e6422d8feb0cb22294896d": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_f9f3e94cb6af4b14b062f32e257022dc",
            "max": 472,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_5a43ce8d466047609e97f112ba63d85e",
            "value": 472
          }
        },
        "c47a8602ac144b40bb07211f167bddf4": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_74c94a9dc8194c8c902d989ed9269230",
            "placeholder": "​",
            "style": "IPY_MODEL_3bdd49a6dec04b5aa484ba8b8c583ebd",
            "value": " 472/472 [00:00&lt;00:00, 13.7kB/s]"
          }
        },
        "fa799fafd1f447589ed648eb32771baa": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "61fa4dc07cc742c9995c5ffbcc95225e": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "32a12c03610c4d718a00472249d24a15": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "f9f3e94cb6af4b14b062f32e257022dc": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "5a43ce8d466047609e97f112ba63d85e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "74c94a9dc8194c8c902d989ed9269230": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "3bdd49a6dec04b5aa484ba8b8c583ebd": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "3e70c1d2d83c46fb845e8159a70950d0": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_5d894253ea5b435389ab72f749b82cfb",
              "IPY_MODEL_0489dc7134ea4a52a382eb1bd0ead726",
              "IPY_MODEL_5338b621a4304a0d8fd32c9b8a6c8fad"
            ],
            "layout": "IPY_MODEL_bdf3717814b24b59abf1d7f1ad3ac115"
          }
        },
        "5d894253ea5b435389ab72f749b82cfb": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_bb67b2b1e3b44bb8a1b2c9315735aee9",
            "placeholder": "​",
            "style": "IPY_MODEL_0962a495fdf94d83a1f3f0567caf8052",
            "value": "pytorch_model.bin: 100%"
          }
        },
        "0489dc7134ea4a52a382eb1bd0ead726": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_6f0c662fa67e49529e4c0754bcc9648e",
            "max": 447406217,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_1dce1e6afd394576b07d2fae5187cb17",
            "value": 447406217
          }
        },
        "5338b621a4304a0d8fd32c9b8a6c8fad": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_25a1abc6014044059177088de6d71d51",
            "placeholder": "​",
            "style": "IPY_MODEL_155cdc297d984f0483928f9dafc5e3be",
            "value": " 447M/447M [00:02&lt;00:00, 207MB/s]"
          }
        },
        "bdf3717814b24b59abf1d7f1ad3ac115": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "bb67b2b1e3b44bb8a1b2c9315735aee9": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "0962a495fdf94d83a1f3f0567caf8052": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "6f0c662fa67e49529e4c0754bcc9648e": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "1dce1e6afd394576b07d2fae5187cb17": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "25a1abc6014044059177088de6d71d51": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "155cdc297d984f0483928f9dafc5e3be": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "0b52104a96164b68b605914303968a4b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HBoxModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HBoxModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HBoxView",
            "box_style": "",
            "children": [
              "IPY_MODEL_1e03065f13c0421eac2b67a2636a735c",
              "IPY_MODEL_4f4305820d304fd59f9ad41c6708f2d3",
              "IPY_MODEL_dd9a9a5b7366478fb05e0887498e0c8c"
            ],
            "layout": "IPY_MODEL_8135925fe02446139bcd40f0c835b67d"
          }
        },
        "1e03065f13c0421eac2b67a2636a735c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_8c8b3f690f934266b1f37debc4a43e63",
            "placeholder": "​",
            "style": "IPY_MODEL_3a41f0df8a124c67920e78971c21c93e",
            "value": "model.safetensors: 100%"
          }
        },
        "4f4305820d304fd59f9ad41c6708f2d3": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "FloatProgressModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "FloatProgressModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "ProgressView",
            "bar_style": "success",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_a395af14f2214165a69ac588cce57049",
            "max": 447362824,
            "min": 0,
            "orientation": "horizontal",
            "style": "IPY_MODEL_6cbe1ec6340c4c82b33eaaf919c8ae5b",
            "value": 447362824
          }
        },
        "dd9a9a5b7366478fb05e0887498e0c8c": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "HTMLModel",
          "model_module_version": "1.5.0",
          "state": {
            "_dom_classes": [],
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "HTMLModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/controls",
            "_view_module_version": "1.5.0",
            "_view_name": "HTMLView",
            "description": "",
            "description_tooltip": null,
            "layout": "IPY_MODEL_50779aa05b71429c9b0ea78c784fcfe4",
            "placeholder": "​",
            "style": "IPY_MODEL_b52ca6f490554505b5190a0a42fa083a",
            "value": " 447M/447M [00:05&lt;00:00, 90.9MB/s]"
          }
        },
        "8135925fe02446139bcd40f0c835b67d": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "8c8b3f690f934266b1f37debc4a43e63": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "3a41f0df8a124c67920e78971c21c93e": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        },
        "a395af14f2214165a69ac588cce57049": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "6cbe1ec6340c4c82b33eaaf919c8ae5b": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "ProgressStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "ProgressStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "bar_color": null,
            "description_width": ""
          }
        },
        "50779aa05b71429c9b0ea78c784fcfe4": {
          "model_module": "@jupyter-widgets/base",
          "model_name": "LayoutModel",
          "model_module_version": "1.2.0",
          "state": {
            "_model_module": "@jupyter-widgets/base",
            "_model_module_version": "1.2.0",
            "_model_name": "LayoutModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "LayoutView",
            "align_content": null,
            "align_items": null,
            "align_self": null,
            "border": null,
            "bottom": null,
            "display": null,
            "flex": null,
            "flex_flow": null,
            "grid_area": null,
            "grid_auto_columns": null,
            "grid_auto_flow": null,
            "grid_auto_rows": null,
            "grid_column": null,
            "grid_gap": null,
            "grid_row": null,
            "grid_template_areas": null,
            "grid_template_columns": null,
            "grid_template_rows": null,
            "height": null,
            "justify_content": null,
            "justify_items": null,
            "left": null,
            "margin": null,
            "max_height": null,
            "max_width": null,
            "min_height": null,
            "min_width": null,
            "object_fit": null,
            "object_position": null,
            "order": null,
            "overflow": null,
            "overflow_x": null,
            "overflow_y": null,
            "padding": null,
            "right": null,
            "top": null,
            "visibility": null,
            "width": null
          }
        },
        "b52ca6f490554505b5190a0a42fa083a": {
          "model_module": "@jupyter-widgets/controls",
          "model_name": "DescriptionStyleModel",
          "model_module_version": "1.5.0",
          "state": {
            "_model_module": "@jupyter-widgets/controls",
            "_model_module_version": "1.5.0",
            "_model_name": "DescriptionStyleModel",
            "_view_count": null,
            "_view_module": "@jupyter-widgets/base",
            "_view_module_version": "1.2.0",
            "_view_name": "StyleView",
            "description_width": ""
          }
        }
      }
    },
    "accelerator": "GPU"
  },
  "nbformat": 4,
  "nbformat_minor": 0
}