{"cells":[{"cell_type":"code","execution_count":null,"id":"a863de04","metadata":{"id":"a863de04","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1747890369225,"user_tz":-540,"elapsed":213,"user":{"displayName":"TOMA Naruaki","userId":"11747312442870110137"}},"outputId":"a8e435f8-8f2f-4bad-f32b-8db8de585d1a"},"outputs":[{"output_type":"stream","name":"stdout","text":["Python 3.11.12\n","Thu May 22 05:06:09 AM UTC 2025\n"]}],"source":["!python --version\n","!date"]},{"cell_type":"markdown","id":"71c33fbe","metadata":{"id":"71c33fbe"},"source":["# JGLUE（日本語言語理解ベンチマーク） + word2vec編"]},{"cell_type":"markdown","id":"ef5bab7c","metadata":{"id":"ef5bab7c"},"source":["## 前提\n","- [report4_preprocessing.ipynb](./report4_preprocessing.ipynb)を実行すると前処理された3つのpklファイル（preprocessed_{train,val,test}.pkl）が作成される。この3つのファイルをPCにダウンロードしておき、本コードを実行する環境で参照できるようにアップロードすること。\n","- `utils.py` も別途アップロードすること。"]},{"cell_type":"code","execution_count":null,"id":"bd24e08f","metadata":{"id":"bd24e08f","outputId":"215ba730-8863-4397-b658-6abbc84e3769","colab":{"base_uri":"https://localhost:8080/","height":459},"executionInfo":{"status":"ok","timestamp":1747890369590,"user_tz":-540,"elapsed":352,"user":{"displayName":"TOMA Naruaki","userId":"11747312442870110137"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":["                    sent1                   sent2  \\\n","0  二人の男性がジャンボジェット機を見ています。    2人の男性が、白い飛行機を眺めています。   \n","1    2人の男性が、白い飛行機を眺めています。  二人の男性がジャンボジェット機を見ています。   \n","2      男性が子供を抱き上げて立っています。    坊主頭の男性が子供を抱いて立っています。   \n","3    坊主頭の男性が子供を抱いて立っています。      男性が子供を抱き上げて立っています。   \n","4       草地の上で牛と男性が立っています。     農場で白い牛が男性の隣に立っています。   \n","\n","                                                 bow  \\\n","0  二人 の 男性 が ジャンボジェット 機 を 見 て い ます 。 [SEP] 2人 の 男...   \n","1  2人 の 男性 が 、 白い 飛行機 を 眺め て い ます 。 [SEP] 二人 の 男性...   \n","2  男性 が 子供 を 抱き上げ て 立っ て い ます 。 [SEP] 坊主頭 の 男性 が ...   \n","3  坊主頭 の 男性 が 子供 を 抱い て 立っ て い ます 。 [SEP] 男性 が 子供...   \n","4  草地 の 上 で 牛 と 男性 が 立っ て い ます 。 [SEP] 農場 で 白い 牛 ...   \n","\n","                                                 w2v  label  \n","0  [0.050462592, -0.13604076, 0.010860913, -0.197...      2  \n","1  [0.088041924, -0.08648207, 0.014981923, -0.196...      2  \n","2  [0.056786165, -0.1304283, 0.013041455, -0.1172...      2  \n","3  [0.042833548, -0.12648883, 0.002992845, -0.119...      0  \n","4  [0.13754506, -0.074033, 0.013317642, -0.165398...      2  "],"text/html":["\n","  <div id=\"df-1a3fab20-c381-43e2-bfe6-415523fdbd15\" 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>sent1</th>\n","      <th>sent2</th>\n","      <th>bow</th>\n","      <th>w2v</th>\n","      <th>label</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>二人の男性がジャンボジェット機を見ています。</td>\n","      <td>2人の男性が、白い飛行機を眺めています。</td>\n","      <td>二人 の 男性 が ジャンボジェット 機 を 見 て い ます 。 [SEP] 2人 の 男...</td>\n","      <td>[0.050462592, -0.13604076, 0.010860913, -0.197...</td>\n","      <td>2</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>2人の男性が、白い飛行機を眺めています。</td>\n","      <td>二人の男性がジャンボジェット機を見ています。</td>\n","      <td>2人 の 男性 が 、 白い 飛行機 を 眺め て い ます 。 [SEP] 二人 の 男性...</td>\n","      <td>[0.088041924, -0.08648207, 0.014981923, -0.196...</td>\n","      <td>2</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>男性が子供を抱き上げて立っています。</td>\n","      <td>坊主頭の男性が子供を抱いて立っています。</td>\n","      <td>男性 が 子供 を 抱き上げ て 立っ て い ます 。 [SEP] 坊主頭 の 男性 が ...</td>\n","      <td>[0.056786165, -0.1304283, 0.013041455, -0.1172...</td>\n","      <td>2</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>坊主頭の男性が子供を抱いて立っています。</td>\n","      <td>男性が子供を抱き上げて立っています。</td>\n","      <td>坊主頭 の 男性 が 子供 を 抱い て 立っ て い ます 。 [SEP] 男性 が 子供...</td>\n","      <td>[0.042833548, -0.12648883, 0.002992845, -0.119...</td>\n","      <td>0</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>草地の上で牛と男性が立っています。</td>\n","      <td>農場で白い牛が男性の隣に立っています。</td>\n","      <td>草地 の 上 で 牛 と 男性 が 立っ て い ます 。 [SEP] 農場 で 白い 牛 ...</td>\n","      <td>[0.13754506, -0.074033, 0.013317642, -0.165398...</td>\n","      <td>2</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-1a3fab20-c381-43e2-bfe6-415523fdbd15')\"\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-1a3fab20-c381-43e2-bfe6-415523fdbd15 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-1a3fab20-c381-43e2-bfe6-415523fdbd15');\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-ddee8c3d-1481-43c3-84c3-c7a003669620\">\n","      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-ddee8c3d-1481-43c3-84c3-c7a003669620')\"\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-ddee8c3d-1481-43c3-84c3-c7a003669620 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_train","summary":"{\n  \"name\": \"df_train\",\n  \"rows\": 20073,\n  \"fields\": [\n    {\n      \"column\": \"sent1\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 16983,\n        \"samples\": [\n          \"\\u7537\\u6027\\u304c\\u3001\\u30d5\\u30ea\\u30b9\\u30d3\\u30fc\\u3092\\u6295\\u3052\\u3088\\u3046\\u3068\\u3057\\u3066\\u3044\\u307e\\u3059\\u3002\",\n          \"\\u767d\\u3044\\u98db\\u884c\\u6a5f\\u304c\\u6ed1\\u8d70\\u8def\\u306b\\u99d0\\u6a5f\\u3057\\u3066\\u3044\\u307e\\u3059\\u3002\",\n          \"\\u30aa\\u30d5\\u30ed\\u30fc\\u30c9\\u30d0\\u30a4\\u30af\\u306b\\u4e8c\\u4eba\\u4e57\\u308a\\u3092\\u3057\\u3066\\u3044\\u307e\\u3059\\u3002\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"sent2\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 17009,\n        \"samples\": [\n          \"\\u30ea\\u30d5\\u30a9\\u30fc\\u30e0\\u3057\\u3066\\u30c8\\u30a4\\u30ec\\u306e\\u7a93\\u304b\\u3089\\u5149\\u304c\\u3055\\u3059\\u3088\\u3046\\u306b\\u3057\\u305f\\u3044\\u3002\",\n          \"\\u30cd\\u30c3\\u30c8\\u306e\\u5411\\u3053\\u3046\\u5074\\u3067\\u3001\\u91ce\\u7403\\u306e\\u8a66\\u5408\\u304c\\u884c\\u308f\\u308c\\u3066\\u3044\\u307e\\u3059\\u3002\",\n          \"\\u7537\\u6027\\u304c\\u30b8\\u30e3\\u30f3\\u30d7\\u3057\\u3066\\u30d5\\u30ea\\u30b9\\u30d4\\u30fc\\u3092\\u53d6\\u3063\\u3066\\u3044\\u307e\\u3059\\u3002\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"bow\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 19992,\n        \"samples\": [\n          \"\\u99ac \\u306b \\u4e57\\u3063 \\u305f \\u9a0e\\u624b \\u304c \\u969c\\u5bb3\\u7269 \\u3092 \\u98db\\u3073\\u8d8a\\u3048 \\u306a\\u304c\\u3089 \\u62f3\\u9283 \\u3092 \\u69cb\\u3048 \\u3066 \\u3044 \\u307e\\u3059 \\u3002 [SEP] \\u4eba \\u3092 \\u4e57\\u305b \\u305f \\u99ac \\u304c \\u969c\\u5bb3\\u7269 \\u3092 \\u30b8\\u30e3\\u30f3\\u30d7 \\u3057 \\u3066 \\u3044 \\u307e\\u3059 \\u3002\",\n          \"\\u30b5\\u30d0\\u30f3\\u30ca \\u306b \\u4e00 \\u982d \\u306e \\u30ad\\u30ea\\u30f3 \\u304c \\u305f\\u3063 \\u3066 \\u3044 \\u307e\\u3059 \\u3002 [SEP] \\u67af\\u308c\\u8349 \\u3082 \\u76ee\\u7acb\\u3064 \\u8349\\u539f \\u306b \\u30ad\\u30ea\\u30f3 \\u304c \\u4e00 \\u982d \\u305f\\u3063 \\u3066 \\u3044 \\u307e\\u3059 \\u3002\",\n          \"\\u9ed2 \\u3068 \\u30aa\\u30ec\\u30f3\\u30b8 \\u306b \\u5857\\u3089 \\u308c \\u305f \\u30d0\\u30a4\\u30af \\u304c \\u5c55\\u793a \\u3055 \\u308c \\u3066 \\u3044 \\u307e\\u3059 \\u3002 [SEP] \\u30e2\\u30fc\\u30bf\\u30fc\\u30b7\\u30e7\\u30fc \\u3067 \\u30d0\\u30a4\\u30af \\u304c \\u5c55\\u793a \\u3055 \\u308c \\u3066 \\u3044 \\u307e\\u3059 \\u3002\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"w2v\",\n      \"properties\": {\n        \"dtype\": \"object\",\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 2,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          2,\n          0,\n          1\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{},"execution_count":8}],"source":["from utils import *\n","\n","# 前処理済みデータ読み込み\n","df_train = get_data(\"preprocessed_train.pkl\")\n","df_val = get_data(\"preprocessed_val.pkl\")\n","df_test = get_data(\"preprocessed_test.pkl\")\n","\n","# 中身の確認\n","df_train.head()"]},{"cell_type":"code","execution_count":null,"id":"4d624db4","metadata":{"id":"4d624db4","outputId":"d3fcd22f-f2dd-4ac7-bd9b-241bfe1b628e","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1747890369597,"user_tz":-540,"elapsed":5,"user":{"displayName":"TOMA Naruaki","userId":"11747312442870110137"}}},"outputs":[{"output_type":"stream","name":"stdout","text":["train_labels:  Counter({2: 11193, 1: 6004, 0: 2876})\n","val_labels:  Counter({2: 1350, 1: 735, 0: 349})\n","test_labels:  Counter({2: 1365, 1: 776, 0: 367})\n"]}],"source":["# データセット毎のラベル分布チェック\n","\n","import collections\n","print(\"train_labels: \", collections.Counter(df_train[\"label\"]))\n","print(\"val_labels: \", collections.Counter(df_val[\"label\"]))\n","print(\"test_labels: \", collections.Counter(df_test[\"label\"]))"]},{"cell_type":"markdown","id":"011b3817","metadata":{"id":"011b3817"},"source":["## case 2: word2vec平均 + MLP\n","やや工夫した実装例として、spacy(ja_ginza) による分散ベクトルを用いた分類器も構築してみた。学習器はMLPclassifier（1層、ユニット数128）のシンプルなNNを用いている。\n","- (1) 前提文、仮説文をトークンに分け、それぞれの分散ベクトルを取得。\n","- (2) 全トークンの分散ベクトルから平均ベクトルを求める。これを特徴ベクトルとする。\n","- (3) MLPで学習。\n","\n","基本的には case 1 と同じ実装だが、dfに保存しているベクトルが文字列として認識されてしまうため、リストに変換（to_list()）した上で利用している点に注意してください。"]},{"cell_type":"code","execution_count":null,"id":"0b702031","metadata":{"id":"0b702031","outputId":"0ebc3f61-d673-438c-adac-96f43482e011","colab":{"base_uri":"https://localhost:8080/","height":713},"executionInfo":{"status":"ok","timestamp":1747890366900,"user_tz":-540,"elapsed":10492,"user":{"displayName":"TOMA Naruaki","userId":"11747312442870110137"}}},"outputs":[{"output_type":"stream","name":"stderr","text":["/usr/local/lib/python3.11/dist-packages/sklearn/neural_network/_multilayer_perceptron.py:691: ConvergenceWarning: Stochastic Optimizer: Maximum iterations (10) reached and the optimization hasn't converged yet.\n","  warnings.warn(\n"]},{"output_type":"stream","name":"stdout","text":["=== word2vec平均 + MLP ===\n","               precision    recall  f1-score   support\n","\n","   entailment       0.55      0.06      0.10       367\n","contradiction       0.57      0.40      0.47       776\n","      neutral       0.61      0.86      0.71      1365\n","\n","     accuracy                           0.60      2508\n","    macro avg       0.58      0.44      0.43      2508\n"," weighted avg       0.59      0.60      0.55      2508\n","\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 640x480 with 2 Axes>"],"image/png":"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FcqVKyfMmDFDWLduncrPLfu1z+vh4+OTo9+EhARBT09PACD8/vvvuZ47MTFRmDhxolCpUiVBR0dHKFu2rNCgQQNh/vz5QlpamtguIyNDmDdvnlClShVBR0dHsLS0FNq2bStcunQp137Vye09LkVe7/Hc+s/tdgt5PbLfC3n9LnhXZmamYGtrK0yePDnf10CfFpkg8N78RFT6+fr64vbt2yo3/ySSateuXejVqxfu3buX67dAEGVjYEVEn4TIyEhUrlwZQUFBaNiwYVEPh0oYT09PNG7c+L3TzkQMrIiIiIg0hLsCiYiIiDSEgRURERGRhjCwIiIiItIQBlZEREREGsIbhBKArO8Pe/r0KYyMjPgFo0REJZAgCEhMTISdnZ1GvkMxNykpKUhLS9NIXzo6OtDV1dVIX8UJAysCADx9+hQODg5FPQwiIiqgR48ewd7eXuP9pqSkQM/IAshI1kh/NjY2ePDgQakLrhhYEQCIXyYbfj8SRkbG72lNJV1qemZRD4E+ovsxSUU9BPoIXicl4ovG1VS+HFyT0tLSgIxkKNx9AC2dgnWWmYbomxuQlpbGwIpKp+zpPyMj4xzfpUalDwOrT4tBMpfTfkoKfTmHti5kBQysBFnpfU8ysCIiIiLpZAAKGryV4qW8DKyIiIhIOpk861HQPkqp0ntlRERERB8ZM1ZEREQknUymganA0jsXyMCKiIiIpONUoFql98qIiIiIPjJmrIiIiEg6TgWqxcCKiIiI8kEDU4GleMKs9F4ZERER0UfGjBURERFJx6lAtRhYERERkXTcFahW6b0yIiIioo+MGSsiIiKSjlOBajGwIiIiIuk4FagWAysiIiKSjhkrtUpvyEhERET0kTFjRURERNJxKlAtBlZEREQknUymgcCKU4FERERE9B7MWBEREZF0clnWo6B9lFIMrIiIiEg6rrFSq/ReGREREdFHxowVERERScf7WKnFwIqIiIik41SgWqX3yoiIiIg+MmasiIiISDpOBarFwIqIiIik41SgWgysiIiISDpmrNQqvSEjERER0UfGjBURERFJx6lAtRhYERERkXScClSr9IaMRERERB8ZM1ZERESUDxqYCizFeR0GVkRERCQdpwLVKr0hIxEREdFHxowVERERSSeTaWBXYOnNWDGwIiIiIul4uwW1Su+VEREREX1kzFgRERGRdFy8rhYD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BYmJiShXrhxatGiRrwyWv78/vvvuO1SsWBGpqalq0+Cfguchy97bZvzAdhg/kLuCSoNWDauiVcOqedb3aFcfPdrV/4gjIk04vn3me9vY25aF/9heedZXrmCHXwK+1+SwiHKQCZ/6py4ByFpjZWJigqfP4gs0DUklQ2o679vzKbkTnfT+RlTivU5MQItajnj16lWh/B7P/pww+3od5DoFuw+gMi0ZL//wLbSxFqUSn7EiIiKij0cTa6xK882rGVgRERGRZAys1CvxX2lDREREVFwwY0VERETScVegWgysiIiISDJOBarHqUAiIiIiDWHGioiIiCRjxko9BlZEREQkGQMr9TgVSERERKQhzFgRERGRZMxYqcfAioiIiKTj7RbU4lQgERERkYYwY0VERESScSpQPQZWREREJBkDK/UYWBEREZFkDKzU4xorIiIiIg1hxoqIiIik465AtRhYERERkWScClSPU4FEREREGsKMFREREUnGjJV6DKyIiIhIMhk0EFiV4kVWnAokIiIi0hBmrIiIiEgyTgWqx8CKiIiIpOPtFtTiVCARERGRhjBjRURERJJxKlA9BlZEREQkGQMr9RhYERERkWQyWdajoH2UVlxjRURERKQhzFgRERGRZFkZq4JOBWpoMMUQAysiIiKSTgNTgbzdAhERERG9FzNWREREJBl3BarHwIqIiIgk465A9TgVSERERKQhzFgRERGRZHK5DHJ5wVJOQgGPL84YWBEREZFknApUj1OBRERERBrCjBURERFJxl2B6jGwIiIiIsk4FageAysiIiKSjBkr9bjGioiIiEhDmLEiIiIiyZixUo+BFREREUnGNVbqcSqQiIiISEOYsSIiIiLJZNDAVCBKb8qKGSsiIiKSLHsqsKCP/MjMzMSUKVPg7OwMPT09VKxYETNmzIAgCGIbQRAwdepU2NraQk9PDy1btsSdO3dU+omLi0Pv3r1hbGwMU1NT+Pr6IikpSRMvi4iBFRERERVrc+bMwS+//ILly5cjLCwMc+bMwdy5c7Fs2TKxzdy5c7F06VKsWrUKISEhMDAwgLe3N1JSUsQ2vXv3xo0bN3D48GHs2bMHJ0+exKBBgzQ6Vk4FEhERkWRFsSvwzJkz6NSpE9q3bw8AcHJywh9//IHz588DyMpWLV68GJMnT0anTp0AABs3boS1tTV27dqFnj17Iiws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\n"},"metadata":{}}],"source":["# ===============================\n","# ✅ 2. word2vec平均 + MLP\n","# ===============================\n","from sklearn.neural_network import MLPClassifier\n","\n","mlp = MLPClassifier(hidden_layer_sizes=(128,), max_iter=10)\n","mlp.fit(df_train[\"w2v\"].to_list(), df_train[\"label\"]) # to_listで与える\n","pred_w2v = mlp.predict(df_test[\"w2v\"].to_list())      # to_listで与える\n","\n","print(\"=== word2vec平均 + MLP ===\")\n","print(classification_report(df_test[\"label\"],\n","                            pred_w2v,\n","                            target_names=label2id.keys()))\n","plot_confusion(\"word2vec + MLP\",\n","               df_test[\"label\"],\n","               pred_w2v,\n","               labels=list(label2id.keys()))"]},{"cell_type":"code","execution_count":null,"id":"00e415c6","metadata":{"id":"00e415c6","outputId":"fc65448c-4380-41f6-c689-88229a155de5","colab":{"base_uri":"https://localhost:8080/","height":906},"executionInfo":{"status":"ok","timestamp":1747891861817,"user_tz":-540,"elapsed":105,"user":{"displayName":"TOMA Naruaki","userId":"11747312442870110137"}}},"outputs":[{"output_type":"execute_result","data":{"text/plain":["                                               sent1  \\\n","0  二つの白いさらにはグリーンピースと細切れの野菜があり、その向こうには渋い顔をした子供が座って...   \n","1                           黄色と赤の電車がホームに停車しているところです。   \n","2                      青いTシャツを着た男の子が砂浜でフリスビーを投げています。   \n","3                            来週、路上の手前に白い消火栓ができる予定です。   \n","4                   大型タンカーの浮かぶ海で、カモメが大きく翼を広げ、飛んでいます。   \n","5                       オレンジ色の服を着た人が、テニスラケットを持っています。   \n","6                     ソファに座る二人の男性の隣で男性がテレビゲームをしています。   \n","7                                 海でサーフィンをしている人がいます。   \n","8                             老婆と若い娘がキッチンに並んで立っています。   \n","\n","                            sent2  true_label  pred_label true_label_name  \\\n","0      野菜の入った容器の前で子供がしかめっ面をしています。           0           2      entailment   \n","1          カラフルな電車が駅のホームに止まっています。           0           2      entailment   \n","2          青い服を着た子供がフリスビーを投げています。           0           1      entailment   \n","3             路上の手前に白い消火栓が建っています。           1           2   contradiction   \n","4  クルーザーの浮かぶ湖で、サギが大きく翼を広げ、飛んでいます。           1           2   contradiction   \n","5    オレンジ色の服を着た人が、テニスラケットを捨てています。           1           2   contradiction   \n","6            ソファーに二人が座り一人は立っています。           2           1         neutral   \n","7             海でサーフィンをしている男性がいます。           2           1         neutral   \n","8             二人の人がフライパンの中を見ています。           2           1         neutral   \n","\n","  pred_label_name  \n","0         neutral  \n","1         neutral  \n","2   contradiction  \n","3         neutral  \n","4         neutral  \n","5         neutral  \n","6   contradiction  \n","7   contradiction  \n","8   contradiction  "],"text/html":["\n","  <div id=\"df-bbc96ee3-c705-420f-a534-4a2dc2ae332d\" 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>sent1</th>\n","      <th>sent2</th>\n","      <th>true_label</th>\n","      <th>pred_label</th>\n","      <th>true_label_name</th>\n","      <th>pred_label_name</th>\n","    </tr>\n","  </thead>\n","  <tbody>\n","    <tr>\n","      <th>0</th>\n","      <td>二つの白いさらにはグリーンピースと細切れの野菜があり、その向こうには渋い顔をした子供が座って...</td>\n","      <td>野菜の入った容器の前で子供がしかめっ面をしています。</td>\n","      <td>0</td>\n","      <td>2</td>\n","      <td>entailment</td>\n","      <td>neutral</td>\n","    </tr>\n","    <tr>\n","      <th>1</th>\n","      <td>黄色と赤の電車がホームに停車しているところです。</td>\n","      <td>カラフルな電車が駅のホームに止まっています。</td>\n","      <td>0</td>\n","      <td>2</td>\n","      <td>entailment</td>\n","      <td>neutral</td>\n","    </tr>\n","    <tr>\n","      <th>2</th>\n","      <td>青いTシャツを着た男の子が砂浜でフリスビーを投げています。</td>\n","      <td>青い服を着た子供がフリスビーを投げています。</td>\n","      <td>0</td>\n","      <td>1</td>\n","      <td>entailment</td>\n","      <td>contradiction</td>\n","    </tr>\n","    <tr>\n","      <th>3</th>\n","      <td>来週、路上の手前に白い消火栓ができる予定です。</td>\n","      <td>路上の手前に白い消火栓が建っています。</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>contradiction</td>\n","      <td>neutral</td>\n","    </tr>\n","    <tr>\n","      <th>4</th>\n","      <td>大型タンカーの浮かぶ海で、カモメが大きく翼を広げ、飛んでいます。</td>\n","      <td>クルーザーの浮かぶ湖で、サギが大きく翼を広げ、飛んでいます。</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>contradiction</td>\n","      <td>neutral</td>\n","    </tr>\n","    <tr>\n","      <th>5</th>\n","      <td>オレンジ色の服を着た人が、テニスラケットを持っています。</td>\n","      <td>オレンジ色の服を着た人が、テニスラケットを捨てています。</td>\n","      <td>1</td>\n","      <td>2</td>\n","      <td>contradiction</td>\n","      <td>neutral</td>\n","    </tr>\n","    <tr>\n","      <th>6</th>\n","      <td>ソファに座る二人の男性の隣で男性がテレビゲームをしています。</td>\n","      <td>ソファーに二人が座り一人は立っています。</td>\n","      <td>2</td>\n","      <td>1</td>\n","      <td>neutral</td>\n","      <td>contradiction</td>\n","    </tr>\n","    <tr>\n","      <th>7</th>\n","      <td>海でサーフィンをしている人がいます。</td>\n","      <td>海でサーフィンをしている男性がいます。</td>\n","      <td>2</td>\n","      <td>1</td>\n","      <td>neutral</td>\n","      <td>contradiction</td>\n","    </tr>\n","    <tr>\n","      <th>8</th>\n","      <td>老婆と若い娘がキッチンに並んで立っています。</td>\n","      <td>二人の人がフライパンの中を見ています。</td>\n","      <td>2</td>\n","      <td>1</td>\n","      <td>neutral</td>\n","      <td>contradiction</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-bbc96ee3-c705-420f-a534-4a2dc2ae332d')\"\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-bbc96ee3-c705-420f-a534-4a2dc2ae332d 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-bbc96ee3-c705-420f-a534-4a2dc2ae332d');\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-2a7c4a16-c35f-48a5-a75e-a72e0a7a1719\">\n","      <button class=\"colab-df-quickchart\" onclick=\"quickchart('df-2a7c4a16-c35f-48a5-a75e-a72e0a7a1719')\"\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-2a7c4a16-c35f-48a5-a75e-a72e0a7a1719 button');\n","          quickchartButtonEl.style.display =\n","            google.colab.kernel.accessAllowed ? 'block' : 'none';\n","        })();\n","      </script>\n","    </div>\n","\n","  <div id=\"id_4a5f5a5c-22ed-481a-8a2e-e0ad4ee16a67\">\n","    <style>\n","      .colab-df-generate {\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-generate: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","      [theme=dark] .colab-df-generate {\n","        background-color: #3B4455;\n","        fill: #D2E3FC;\n","      }\n","\n","      [theme=dark] .colab-df-generate: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","    <button class=\"colab-df-generate\" onclick=\"generateWithVariable('mis_df')\"\n","            title=\"Generate code using this dataframe.\"\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","    <path d=\"M7,19H8.4L18.45,9,17,7.55,7,17.6ZM5,21V16.75L18.45,3.32a2,2,0,0,1,2.83,0l1.4,1.43a1.91,1.91,0,0,1,.58,1.4,1.91,1.91,0,0,1-.58,1.4L9.25,21ZM18.45,9,17,7.55Zm-12,3A5.31,5.31,0,0,0,4.9,8.1,5.31,5.31,0,0,0,1,6.5,5.31,5.31,0,0,0,4.9,4.9,5.31,5.31,0,0,0,6.5,1,5.31,5.31,0,0,0,8.1,4.9,5.31,5.31,0,0,0,12,6.5,5.46,5.46,0,0,0,6.5,12Z\"/>\n","  </svg>\n","    </button>\n","    <script>\n","      (() => {\n","      const buttonEl =\n","        document.querySelector('#id_4a5f5a5c-22ed-481a-8a2e-e0ad4ee16a67 button.colab-df-generate');\n","      buttonEl.style.display =\n","        google.colab.kernel.accessAllowed ? 'block' : 'none';\n","\n","      buttonEl.onclick = () => {\n","        google.colab.notebook.generateWithVariable('mis_df');\n","      }\n","      })();\n","    </script>\n","  </div>\n","\n","    </div>\n","  </div>\n"],"application/vnd.google.colaboratory.intrinsic+json":{"type":"dataframe","variable_name":"mis_df","summary":"{\n  \"name\": \"mis_df\",\n  \"rows\": 9,\n  \"fields\": [\n    {\n      \"column\": \"sent1\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 9,\n        \"samples\": [\n          \"\\u6d77\\u3067\\u30b5\\u30fc\\u30d5\\u30a3\\u30f3\\u3092\\u3057\\u3066\\u3044\\u308b\\u4eba\\u304c\\u3044\\u307e\\u3059\\u3002\",\n          \"\\u9ec4\\u8272\\u3068\\u8d64\\u306e\\u96fb\\u8eca\\u304c\\u30db\\u30fc\\u30e0\\u306b\\u505c\\u8eca\\u3057\\u3066\\u3044\\u308b\\u3068\\u3053\\u308d\\u3067\\u3059\\u3002\",\n          \"\\u30aa\\u30ec\\u30f3\\u30b8\\u8272\\u306e\\u670d\\u3092\\u7740\\u305f\\u4eba\\u304c\\u3001\\u30c6\\u30cb\\u30b9\\u30e9\\u30b1\\u30c3\\u30c8\\u3092\\u6301\\u3063\\u3066\\u3044\\u307e\\u3059\\u3002\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"sent2\",\n      \"properties\": {\n        \"dtype\": \"string\",\n        \"num_unique_values\": 9,\n        \"samples\": [\n          \"\\u6d77\\u3067\\u30b5\\u30fc\\u30d5\\u30a3\\u30f3\\u3092\\u3057\\u3066\\u3044\\u308b\\u7537\\u6027\\u304c\\u3044\\u307e\\u3059\\u3002\",\n          \"\\u30ab\\u30e9\\u30d5\\u30eb\\u306a\\u96fb\\u8eca\\u304c\\u99c5\\u306e\\u30db\\u30fc\\u30e0\\u306b\\u6b62\\u307e\\u3063\\u3066\\u3044\\u307e\\u3059\\u3002\",\n          \"\\u30aa\\u30ec\\u30f3\\u30b8\\u8272\\u306e\\u670d\\u3092\\u7740\\u305f\\u4eba\\u304c\\u3001\\u30c6\\u30cb\\u30b9\\u30e9\\u30b1\\u30c3\\u30c8\\u3092\\u6368\\u3066\\u3066\\u3044\\u307e\\u3059\\u3002\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"true_label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 0,\n        \"max\": 2,\n        \"num_unique_values\": 3,\n        \"samples\": [\n          0,\n          1,\n          2\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"pred_label\",\n      \"properties\": {\n        \"dtype\": \"number\",\n        \"std\": 0,\n        \"min\": 1,\n        \"max\": 2,\n        \"num_unique_values\": 2,\n        \"samples\": [\n          1,\n          2\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"true_label_name\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 3,\n        \"samples\": [\n          \"entailment\",\n          \"contradiction\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    },\n    {\n      \"column\": \"pred_label_name\",\n      \"properties\": {\n        \"dtype\": \"category\",\n        \"num_unique_values\": 2,\n        \"samples\": [\n          \"contradiction\",\n          \"neutral\"\n        ],\n        \"semantic_type\": \"\",\n        \"description\": \"\"\n      }\n    }\n  ]\n}"}},"metadata":{},"execution_count":15}],"source":["# 検証データに対する失敗事例分析\n","pred_w2v = mlp.predict(df_val[\"w2v\"].to_list())\n","mis_df, mis_all_df = show_misclassified_examples(\n","    df_val[\"sent1\"], df_val[\"sent2\"], df_val[\"label\"], pred_w2v, id2label\n",")\n","\n","mis_df"]},{"cell_type":"code","execution_count":null,"id":"24e4088a","metadata":{"id":"24e4088a"},"outputs":[],"source":["# 検証データに対する全失敗事例をExcelファイルとして出力\n","\n","true_label = df_val[\"label\"].map(id2label)\n","pred_label = pd.Series(pred_w2v).map(id2label)\n","\n","mis_all_df = pd.DataFrame({\n","    \"sent1\":df_val[\"sent1\"],\n","    \"sent2\":df_val[\"sent2\"],\n","    \"true_label\":df_val[\"label\"],\n","    \"w2v_pred_label\":pred_w2v,\n","    \"true_label_name\":true_label,\n","    \"w2v_pred_label_name\":pred_label\n","})\n","\n","mis_all_df.to_excel(\"mis_all_df_word2vec.xlsx\")"]}],"metadata":{"kernelspec":{"display_name":"deep","language":"python","name":"python3"},"language_info":{"codemirror_mode":{"name":"ipython","version":3},"file_extension":".py","mimetype":"text/x-python","name":"python","nbconvert_exporter":"python","pygments_lexer":"ipython3","version":"3.9.6"},"colab":{"provenance":[]}},"nbformat":4,"nbformat_minor":5}