{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Train your model\n",
    "\n",
    "Install the checkout's notebook dependencies first, following the README's\n",
    "**Run notebooks locally** instructions. Select the `GreatAI (local)` kernel.\n",
    "The default run uses a balanced subset of the bundled MAG data for speed.\n",
    "Set `GREAT_AI_NOTEBOOK_FULL=1` before starting Jupyter to use the full splits.\n",
    "Local subset results differ from the historical full-dataset results below."
   ],
   "id": "cell-0"
  },
  {
   "id": "37cb23a4",
   "cell_type": "markdown",
   "source": [
    "## Local setup\n",
    "\n",
    "Use Python 3.12 or 3.13 and install this checkout with `uv pip install --editable '.[notebooks]'`.\n",
    "See **Run notebooks locally** in the repository README for the kernel, execution order,\n",
    "and full-data options. Run related notebooks from the same working directory\n",
    "to share the default `.cache/` model store and `tracing_database.json` database.\n"
   ],
   "metadata": {}
  },
  {
   "id": "42ed923c",
   "cell_type": "code",
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-28T22:47:18.653947Z",
     "iopub.status.busy": "2026-10-28T22:47:18.653802Z",
     "iopub.status.idle": "2026-10-28T22:47:18.664778Z",
     "shell.execute_reply": "2026-10-28T22:47:18.663856Z"
    }
   },
   "execution_count": 1,
   "source": [
    "from docs.notebook_support import DATA_DIR, FULL_RUN, mag_lines"
   ],
   "outputs": []
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-28T22:47:18.667022Z",
     "iopub.status.busy": "2026-10-28T22:47:18.666820Z",
     "iopub.status.idle": "2026-10-28T22:47:18.669716Z",
     "shell.execute_reply": "2026-10-28T22:47:18.669055Z"
    }
   },
   "outputs": [],
   "source": [
    "# Dependencies are installed once in the environment; no in-kernel installation needed."
   ],
   "id": "cell-3"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "First, we have to get some data. After downloading it [from here](https://github.com/allenai/scibert/tree/master/data/text_classification/mag), we might notice that the dataset is in [JSON Lines](https://jsonlines.org/) format (each line is a separate JSON document). \n",
    "\n",
    "Let's write a function which takes a single line and returns the sentence and the corresponding label from it. Before returning, the sentence is also [cleaned](https://great-ai.schmelczer.dev/reference/utilities/#great_ai.utilities.clean.clean) to remove any LaTeX, XML, unicode, PDF-extraction artifacts."
   ],
   "id": "cell-4"
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-28T22:47:18.671242Z",
     "iopub.status.busy": "2026-10-28T22:47:18.671089Z",
     "iopub.status.idle": "2026-10-28T22:47:21.261086Z",
     "shell.execute_reply": "2026-10-28T22:47:21.260622Z"
    }
   },
   "outputs": [],
   "source": [
    "import json\n",
    "from great_ai.utilities import clean\n",
    "\n",
    "\n",
    "def preprocess(line):\n",
    "    data_point = json.loads(line)\n",
    "\n",
    "    sentence = data_point[\"text\"]\n",
    "    label = data_point[\"label\"]\n",
    "\n",
    "    return clean(sentence), label"
   ],
   "id": "cell-5"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Now, we can load the dataset and extract the *training* samples from it. Since we're impatient, we can do it in parallel using the [`simple_parallel_map`](https://great-ai.schmelczer.dev/reference/utilities/#great_ai.utilities.simple_parallel_map) function.\n",
    "\n",
    "> Open files in Python are iterable: in text mode, each iteration returns the next line."
   ],
   "id": "cell-6"
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-28T22:47:21.262422Z",
     "iopub.status.busy": "2026-10-28T22:47:21.262265Z",
     "iopub.status.idle": "2026-10-28T22:47:22.482973Z",
     "shell.execute_reply": "2026-10-28T22:47:22.482099Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  0%|          | 0/700 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  0%|          | 1/700 [00:00<01:30,  7.74it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 10%|█         | 71/700 [00:00<00:01, 352.47it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 20%|██        | 141/700 [00:00<00:01, 467.83it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 27%|██▋       | 190/700 [00:00<00:01, 475.11it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 34%|███▍      | 239/700 [00:00<00:00, 461.41it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 45%|████▌     | 316/700 [00:00<00:00, 538.41it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 53%|█████▎    | 371/700 [00:00<00:00, 523.75it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 61%|██████    | 424/700 [00:00<00:00, 504.26it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 80%|████████  | 561/700 [00:01<00:00, 697.72it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 90%|█████████ | 631/700 [00:01<00:00, 675.11it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "100%|██████████| 700/700 [00:01<00:00, 603.58it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "from great_ai.utilities import simple_parallel_map\n",
    "\n",
    "training_lines = mag_lines(DATA_DIR / \"train.txt\", None if FULL_RUN else 100)\n",
    "training_data = simple_parallel_map(preprocess, training_lines, concurrency=2)\n",
    "X_train = [d[0] for d in training_data]\n",
    "y_train = [d[1] for d in training_data]"
   ],
   "id": "cell-7"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's do the same for the *test* data."
   ],
   "id": "cell-8"
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-28T22:47:22.484582Z",
     "iopub.status.busy": "2026-10-28T22:47:22.484426Z",
     "iopub.status.idle": "2026-10-28T22:47:23.612412Z",
     "shell.execute_reply": "2026-10-28T22:47:23.611412Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  0%|          | 0/210 [00:00<?, ?it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  0%|          | 1/210 [00:00<00:27,  7.72it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "  6%|▌         | 12/210 [00:00<00:03, 61.14it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 16%|█▌        | 34/210 [00:00<00:01, 124.86it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 27%|██▋       | 56/210 [00:00<00:00, 156.07it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 37%|███▋      | 78/210 [00:00<00:00, 175.16it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 46%|████▌     | 96/210 [00:00<00:00, 173.89it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 58%|█████▊    | 122/210 [00:00<00:00, 197.51it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 69%|██████▊   | 144/210 [00:00<00:00, 202.19it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 84%|████████▍ | 177/210 [00:00<00:00, 231.71it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      " 96%|█████████▌| 201/210 [00:01<00:00, 230.89it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\r",
      "100%|██████████| 210/210 [00:01<00:00, 191.75it/s]"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\n"
     ]
    }
   ],
   "source": [
    "test_lines = mag_lines(DATA_DIR / \"test.txt\", None if FULL_RUN else 30)\n",
    "test_data = simple_parallel_map(preprocess, test_lines, concurrency=2)\n",
    "X_test = [d[0] for d in test_data]\n",
    "y_test = [d[1] for d in test_data]"
   ],
   "id": "cell-9"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "After obtaining some clean data, it's time to create and train a model on it. We are going to use [scikit-learn](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html) for this purpose.\n",
    "\n",
    "In this case, we opted for a [linear Support Vector Machine](https://scikit-learn.org/stable/modules/generated/sklearn.svm.LinearSVC.html) because it's known to be an adequate baseline for simple classification tasks."
   ],
   "id": "cell-10"
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-28T22:47:23.614164Z",
     "iopub.status.busy": "2026-10-28T22:47:23.614030Z",
     "iopub.status.idle": "2026-10-28T22:47:23.726757Z",
     "shell.execute_reply": "2026-10-28T22:47:23.726161Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>.sk-global {\n",
       "  /* Definition of color scheme common for light and dark mode */\n",
       "  --sklearn-color-text: #000;\n",
       "  --sklearn-color-text-muted: #666;\n",
       "  --sklearn-color-line: gray;\n",
       "  /* Definition of color scheme for unfitted estimators */\n",
       "  --sklearn-color-unfitted-level-0: #fff5e6;\n",
       "  --sklearn-color-unfitted-level-1: #f6e4d2;\n",
       "  --sklearn-color-unfitted-level-2: #ffe0b3;\n",
       "  --sklearn-color-unfitted-level-3: chocolate;\n",
       "  /* Definition of color scheme for fitted estimators */\n",
       "  --sklearn-color-fitted-level-0: #f0f8ff;\n",
       "  --sklearn-color-fitted-level-1: #d4ebff;\n",
       "  --sklearn-color-fitted-level-2: #b3dbfd;\n",
       "  --sklearn-color-fitted-level-3: cornflowerblue;\n",
       "}\n",
       "\n",
       ".sk-global.light {\n",
       "  /* Specific color for light theme */\n",
       "  --sklearn-color-text-on-default-background: black;\n",
       "  --sklearn-color-background: white;\n",
       "  --sklearn-color-border-box: black;\n",
       "  --sklearn-color-icon: #696969;\n",
       "}\n",
       "\n",
       ".sk-global.dark {\n",
       "  --sklearn-color-text-on-default-background: white;\n",
       "  --sklearn-color-background: #111;\n",
       "  --sklearn-color-border-box: white;\n",
       "  --sklearn-color-icon: #878787;\n",
       "}\n",
       "\n",
       ".sk-global {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       ".sk-global pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       ".sk-global input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip-path: inset(100%);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       ".sk-global div.sk-dashed-wrapped {\n",
       "  border: 1px dashed var(--sklearn-color-line);\n",
       "  margin: 0 0.4em 0.5em 0.4em;\n",
       "  box-sizing: border-box;\n",
       "  padding-bottom: 0.4em;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       ".sk-global div.sk-container {\n",
       "  /* jupyter's `normalize.less` sets `[hidden] { display: none; }`\n",
       "     but bootstrap.min.css set `[hidden] { display: none !important; }`\n",
       "     so we also need the `!important` here to be able to override the\n",
       "     default hidden behavior on the sphinx rendered scikit-learn.org.\n",
       "     See: https://github.com/scikit-learn/scikit-learn/issues/21755 */\n",
       "  display: inline-block !important;\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       ".sk-global div.sk-text-repr-fallback {\n",
       "  display: none;\n",
       "}\n",
       "\n",
       "div.sk-parallel-item,\n",
       "div.sk-serial,\n",
       "div.sk-item {\n",
       "  /* draw centered vertical line to link estimators */\n",
       "  background-image: linear-gradient(var(--sklearn-color-text-on-default-background), var(--sklearn-color-text-on-default-background));\n",
       "  background-size: 2px 100%;\n",
       "  background-repeat: no-repeat;\n",
       "  background-position: center center;\n",
       "}\n",
       "\n",
       "/* Parallel-specific style estimator block */\n",
       "\n",
       ".sk-global div.sk-parallel-item::after {\n",
       "  content: \"\";\n",
       "  width: 100%;\n",
       "  border-bottom: 2px solid var(--sklearn-color-text-on-default-background);\n",
       "  flex-grow: 1;\n",
       "}\n",
       "\n",
       ".sk-global div.sk-parallel {\n",
       "  display: flex;\n",
       "  align-items: stretch;\n",
       "  justify-content: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  position: relative;\n",
       "}\n",
       "\n",
       ".sk-global div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       ".sk-global div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       ".sk-global div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       ".sk-global div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       ".sk-global div.sk-serial {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "  align-items: center;\n",
       "  background-color: var(--sklearn-color-background);\n",
       "  padding-right: 1em;\n",
       "  padding-left: 1em;\n",
       "}\n",
       "\n",
       "\n",
       "/* Toggleable style: style used for estimator/Pipeline/ColumnTransformer box that is\n",
       "clickable and can be expanded/collapsed.\n",
       "- Pipeline and ColumnTransformer use this feature and define the default style\n",
       "- Estimators will overwrite some part of the style using the `sk-estimator` class\n",
       "*/\n",
       "\n",
       "/* Pipeline and ColumnTransformer style (default) */\n",
       "\n",
       ".sk-global div.sk-toggleable {\n",
       "  /* Default theme specific background. It is overwritten whether we have a\n",
       "  specific estimator or a Pipeline/ColumnTransformer */\n",
       "  background-color: var(--sklearn-color-background);\n",
       "}\n",
       "\n",
       "/* Toggleable label */\n",
       ".sk-global label.sk-toggleable__label {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  width: 100%;\n",
       "  margin-bottom: 0;\n",
       "  padding: 0.5em;\n",
       "  box-sizing: border-box;\n",
       "  text-align: center;\n",
       "  align-items: center;\n",
       "  justify-content: center;\n",
       "  gap: 0.5em;\n",
       "}\n",
       "\n",
       ".sk-global label.sk-toggleable__label .caption {\n",
       "  font-size: 0.6rem;\n",
       "  font-weight: lighter;\n",
       "  color: var(--sklearn-color-text-muted);\n",
       "}\n",
       "\n",
       ".sk-global label.sk-toggleable__label-arrow:before {\n",
       "  /* Arrow on the left of the label */\n",
       "  content: \"▸\";\n",
       "  float: left;\n",
       "  margin-right: 0.25em;\n",
       "  color: var(--sklearn-color-icon);\n",
       "}\n",
       "\n",
       ".sk-global label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       ".sk-global div.sk-toggleable__content {\n",
       "  display: none;\n",
       "  text-align: left;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       ".sk-global div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       ".sk-global div.sk-toggleable__content pre {\n",
       "  margin: 0.2em;\n",
       "  border-radius: 0.25em;\n",
       "  color: var(--sklearn-color-text);\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       ".sk-global div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       ".sk-global input.sk-toggleable__control:checked~div.sk-toggleable__content {\n",
       "  /* Expand drop-down */\n",
       "  display: block;\n",
       "  width: 100%;\n",
       "  overflow: visible;\n",
       "}\n",
       "\n",
       ".sk-global input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       ".sk-global div.sk-label input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       ".sk-global div.sk-label.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator-specific style */\n",
       "\n",
       "/* Colorize estimator box */\n",
       ".sk-global div.sk-estimator input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       ".sk-global div.sk-estimator.fitted input.sk-toggleable__control:checked~label.sk-toggleable__label {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       ".sk-global div.sk-label label.sk-toggleable__label,\n",
       ".sk-global div.sk-label label {\n",
       "  /* The background is the default theme color */\n",
       "  color: var(--sklearn-color-text-on-default-background);\n",
       "}\n",
       "\n",
       "/* On hover, darken the color of the background */\n",
       ".sk-global div.sk-label:hover label.sk-toggleable__label {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "/* Label box, darken color on hover, fitted */\n",
       ".sk-global div.sk-label.fitted:hover label.sk-toggleable__label.fitted {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Estimator label */\n",
       "\n",
       ".sk-global div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       ".sk-global div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       ".sk-global div.sk-estimator {\n",
       "  font-family: monospace;\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: 0.25em;\n",
       "  box-sizing: border-box;\n",
       "  margin-bottom: 0.5em;\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "}\n",
       "\n",
       ".sk-global div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       ".sk-global div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       ".sk-global div.sk-estimator.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       "/* Specification for estimator info (e.g. \"i\" and \"?\") */\n",
       "\n",
       "/* Common style for \"i\" and \"?\" */\n",
       "\n",
       ".sk-estimator-doc-link,\n",
       "a:link.sk-estimator-doc-link,\n",
       "a:visited.sk-estimator-doc-link {\n",
       "  float: right;\n",
       "  font-size: smaller;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1em;\n",
       "  height: 1em;\n",
       "  width: 1em;\n",
       "  text-decoration: none !important;\n",
       "  margin-left: 0.5em;\n",
       "  text-align: center;\n",
       "  /* unfitted */\n",
       "  border: var(--sklearn-color-unfitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted,\n",
       "a:link.sk-estimator-doc-link.fitted,\n",
       "a:visited.sk-estimator-doc-link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       "div.sk-estimator:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link:hover,\n",
       ".sk-estimator-doc-link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-unfitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "div.sk-estimator.fitted:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover,\n",
       "div.sk-label-container:hover .sk-estimator-doc-link.fitted:hover,\n",
       ".sk-estimator-doc-link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "  border: var(--sklearn-color-fitted-level-0) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-0);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       "/* Span, style for the box shown on hovering the info icon */\n",
       ".sk-estimator-doc-link span {\n",
       "  display: none;\n",
       "  z-index: 9999;\n",
       "  position: relative;\n",
       "  font-weight: normal;\n",
       "  right: .2ex;\n",
       "  padding: .5ex;\n",
       "  margin: .5ex;\n",
       "  width: min-content;\n",
       "  min-width: 20ex;\n",
       "  max-width: 50ex;\n",
       "  color: var(--sklearn-color-text);\n",
       "  box-shadow: 2pt 2pt 4pt #999;\n",
       "  /* unfitted */\n",
       "  background: var(--sklearn-color-unfitted-level-0);\n",
       "  border: .5pt solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link.fitted span {\n",
       "  /* fitted */\n",
       "  background: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-estimator-doc-link:hover span {\n",
       "  display: block;\n",
       "}\n",
       "\n",
       "/* \"?\"-specific style due to the `<a>` HTML tag */\n",
       "\n",
       ".sk-global a.estimator_doc_link {\n",
       "  float: right;\n",
       "  font-size: 1rem;\n",
       "  line-height: 1em;\n",
       "  font-family: monospace;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 1rem;\n",
       "  height: 1rem;\n",
       "  width: 1rem;\n",
       "  text-decoration: none;\n",
       "  /* unfitted */\n",
       "  color: var(--sklearn-color-unfitted-level-1);\n",
       "  border: var(--sklearn-color-unfitted-level-1) 1pt solid;\n",
       "}\n",
       "\n",
       ".sk-global a.estimator_doc_link.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "  border: var(--sklearn-color-fitted-level-1) 1pt solid;\n",
       "  color: var(--sklearn-color-fitted-level-1);\n",
       "}\n",
       "\n",
       "/* On hover */\n",
       ".sk-global a.estimator_doc_link:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-3);\n",
       "  color: var(--sklearn-color-background);\n",
       "  text-decoration: none;\n",
       "}\n",
       "\n",
       ".sk-global a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".sk-top-container.sk-global {\n",
       "  /* pydata-sphinx-theme hides overflow, so scrolling is disabled.\n",
       "   We need to set it to !important and add tabindex=\"0\" in the HTML\n",
       "   to allow keyboard-only users to navigate the display. */\n",
       "  overflow-x: scroll !important;\n",
       "  max-width: 100%;\n",
       "}\n",
       "\n",
       ".estimator-table {\n",
       "    font-family: monospace;\n",
       "}\n",
       "\n",
       ".estimator-table summary {\n",
       "    padding: .5rem;\n",
       "    cursor: pointer;\n",
       "}\n",
       "\n",
       ".estimator-table summary::marker {\n",
       "    font-size: 0.7rem;\n",
       "}\n",
       "\n",
       ".estimator-table details[open] {\n",
       "    padding-left: 0.1rem;\n",
       "    padding-right: 0.1rem;\n",
       "    padding-bottom: 0.3rem;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table {\n",
       "    margin-left: auto !important;\n",
       "    margin-right: auto !important;\n",
       "    margin-top: 0;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(odd) {\n",
       "    background-color: #fff;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:nth-child(even) {\n",
       "    background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".estimator-table .parameters-table tr:hover td {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table :is(td, th) {\n",
       "    border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "}\n",
       "\n",
       "/*\n",
       "    `table td`is set in notebook with right text-align.\n",
       "    We need to overwrite it.\n",
       "*/\n",
       ".estimator-table table td.param {\n",
       "    text-align: left;\n",
       "    position: relative;\n",
       "    padding: 0;\n",
       "}\n",
       "\n",
       ".user-set td {\n",
       "    color:rgb(255, 94, 0);\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td.value {\n",
       "    color:rgb(255, 94, 0);\n",
       "    background-color: transparent;\n",
       "}\n",
       "\n",
       ".default td, .estimator-table th {\n",
       "    color: black;\n",
       "    text-align: left !important;\n",
       "}\n",
       "\n",
       ".user-set td i,\n",
       ".default td i {\n",
       "    color: black;\n",
       "}\n",
       "\n",
       "td.fitted-att-type {\n",
       "    white-space: preserve nowrap;\n",
       "}\n",
       "\n",
       "/*\n",
       "    Styles for parameter documentation links\n",
       "    We need styling for visited so jupyter doesn't overwrite it\n",
       "*/\n",
       "a.param-doc-link,\n",
       "a.param-doc-link:link,\n",
       "a.param-doc-link:visited {\n",
       "    text-decoration: underline dashed;\n",
       "    text-underline-offset: .3em;\n",
       "    color: inherit;\n",
       "    display: block;\n",
       "    padding: .5em;\n",
       "}\n",
       "\n",
       "@supports(anchor-name: --doc-link) {\n",
       "    a.param-doc-link,\n",
       "    a.param-doc-link:link,\n",
       "    a.param-doc-link:visited {\n",
       "    anchor-name: --doc-link;\n",
       "    }\n",
       "}\n",
       "\n",
       "/* \"hack\" to make the entire area of the cell containing the link clickable */\n",
       "a.param-doc-link::before {\n",
       "    position: absolute;\n",
       "    content: \"\";\n",
       "    inset: 0;\n",
       "}\n",
       "\n",
       ".param-doc-description {\n",
       "    display: none;\n",
       "    position: absolute;\n",
       "    z-index: 9999;\n",
       "    left: 0;\n",
       "    padding: .5ex;\n",
       "    margin-left: 1.5em;\n",
       "    color: var(--sklearn-color-text);\n",
       "    box-shadow: .3em .3em .4em #999;\n",
       "    width: max-content;\n",
       "    text-align: left;\n",
       "    max-height: 10em;\n",
       "    overflow-y: auto;\n",
       "\n",
       "    /* unfitted */\n",
       "    background: var(--sklearn-color-unfitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-unfitted-level-3);\n",
       "}\n",
       "\n",
       "@supports(position-area: center right) {\n",
       "    .param-doc-description {\n",
       "    position-area: center right;\n",
       "    position: fixed;\n",
       "    margin-left: 0;\n",
       "    }\n",
       "}\n",
       "\n",
       "/* Fitted state for parameter tooltips */\n",
       ".fitted .param-doc-description {\n",
       "    /* fitted */\n",
       "    background: var(--sklearn-color-fitted-level-0);\n",
       "    border: thin solid var(--sklearn-color-fitted-level-3);\n",
       "}\n",
       "\n",
       ".param-doc-link:hover .param-doc-description {\n",
       "    display: block;\n",
       "}\n",
       "\n",
       ".copy-paste-icon {\n",
       "    background-image: url(data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCA0NDggNTEyIj48IS0tIUZvbnQgQXdlc29tZSBGcmVlIDYuNy4yIGJ5IEBmb250YXdlc29tZSAtIGh0dHBzOi8vZm9udGF3ZXNvbWUuY29tIExpY2Vuc2UgLSBodHRwczovL2ZvbnRhd2Vzb21lLmNvbS9saWNlbnNlL2ZyZWUgQ29weXJpZ2h0IDIwMjUgRm9udGljb25zLCBJbmMuLS0+PHBhdGggZD0iTTIwOCAwTDMzMi4xIDBjMTIuNyAwIDI0LjkgNS4xIDMzLjkgMTQuMWw2Ny45IDY3LjljOSA5IDE0LjEgMjEuMiAxNC4xIDMzLjlMNDQ4IDMzNmMwIDI2LjUtMjEuNSA0OC00OCA0OGwtMTkyIDBjLTI2LjUgMC00OC0yMS41LTQ4LTQ4bDAtMjg4YzAtMjYuNSAyMS41LTQ4IDQ4LTQ4ek00OCAxMjhsODAgMCAwIDY0LTY0IDAgMCAyNTYgMTkyIDAgMC0zMiA2NCAwIDAgNDhjMCAyNi41LTIxLjUgNDgtNDggNDhMNDggNTEyYy0yNi41IDAtNDgtMjEuNS00OC00OEwwIDE3NmMwLTI2LjUgMjEuNS00OCA0OC00OHoiLz48L3N2Zz4=);\n",
       "    background-repeat: no-repeat;\n",
       "    background-size: 14px 14px;\n",
       "    background-position: 0;\n",
       "    display: inline-block;\n",
       "    width: 14px;\n",
       "    height: 14px;\n",
       "    cursor: pointer;\n",
       "    border: none;\n",
       "    padding: 0;\n",
       "    background-color: transparent;\n",
       "}\n",
       "\n",
       ".copy-paste-icon:focus-visible {\n",
       "    outline: 1px solid currentColor;\n",
       "    outline-offset: 1px;\n",
       "}\n",
       "\n",
       ".features {\n",
       "  font-family: monospace;\n",
       "  cursor: pointer;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border: 1px dotted var(--sklearn-color-border-box);\n",
       "  border-radius: .20em;\n",
       "  margin-bottom: 0.5em;\n",
       "  font-size: inherit; /* Needed for jupyter */\n",
       "}\n",
       "\n",
       ".features.fitted {\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       ".features summary {\n",
       "  cursor: pointer;\n",
       "  display: flex;\n",
       "  margin-bottom: 0;\n",
       "  text-align: center;\n",
       "  align-items: center;\n",
       "  justify-content: center;\n",
       "  gap: 0.5em;\n",
       "  padding: .25em;\n",
       "}\n",
       "\n",
       ".features details[open] > summary {\n",
       "  color: var(--sklearn-color-text);\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "  border-radius: .20em 0 0 0;\n",
       "}\n",
       "\n",
       ".features.fitted details[open] > summary {\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "  border-radius: .20em 0 0 0;\n",
       "}\n",
       "\n",
       ".features details > summary .arrow::before {\n",
       "  content: \"▸\";\n",
       "  color: grey;\n",
       "}\n",
       "\n",
       ".features details[open] > summary .arrow::before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       ".features details:hover > summary {\n",
       "  margin: 0;\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       ".features.fitted details:hover > summary {\n",
       "  margin: 0;\n",
       "  background-color: var(--sklearn-color-fitted-level-2);\n",
       "}\n",
       "\n",
       ".features .features-container {\n",
       "  max-height: 10em;\n",
       "  overflow: auto;\n",
       "  scrollbar-width: thin;\n",
       "  padding: .25em 0.1rem;\n",
       "  background-color: var(--sklearn-color-unfitted-level-0);\n",
       "  border-radius: 0 0 .5em .5em;\n",
       "}\n",
       "\n",
       ".features.fitted .features-container {\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       ".features .image-container {\n",
       "  block-size: 1em;\n",
       "  inline-size: 1em;\n",
       "  padding: 0;\n",
       "  margin: 0%;\n",
       "  display: flex;\n",
       "  justify-content: center;\n",
       "  align-items: center;\n",
       "}\n",
       "\n",
       ".features .copy-paste-icon {\n",
       "  background-size: 1em 1em;\n",
       "  width: 1em;\n",
       "  height: 1em;\n",
       "  filter: grayscale(100%) opacity(60%);\n",
       "}\n",
       "\n",
       ".features .features-container table {\n",
       "  width: 100%;\n",
       "  margin: 0.01em;\n",
       "}\n",
       "\n",
       ".features .features-container table tr:nth-child(odd) {\n",
       "  background-color: #fff;\n",
       "}\n",
       "\n",
       ".features .features-container table tr:nth-child(even) {\n",
       "  background-color: #f6f6f6;\n",
       "}\n",
       "\n",
       ".features .features-container table tr:hover {\n",
       "  background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".features .features-container table {\n",
       "  table-layout: inherit;\n",
       "}\n",
       "\n",
       ".features .features-container table td {\n",
       "  text-align: left;\n",
       "  padding: 0 0.5em;\n",
       "  border: 1px solid rgba(106, 105, 104, 0.232);\n",
       "  white-space: nowrap;\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       ".total_features {\n",
       "  display: flex;\n",
       "  justify-content: center;\n",
       "  margin-top: 0.5em;\n",
       "}\n",
       "</style><body><div id=\"sk-container-id-1\" tabindex=\"0\" class=\"sk-top-container sk-global\"><div class=\"sk-text-repr-fallback\"><pre>Pipeline(steps=[(&#x27;tfidfvectorizer&#x27;, TfidfVectorizer()),\n",
       "                (&#x27;linearsvc&#x27;, LinearSVC(random_state=42))])</pre><b>In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. <br />On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.</b></div><div class=\"sk-container\" hidden><div class=\"sk-item sk-dashed-wrapped\"><div class=\"sk-label-container\"><div class=\"sk-label fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually sk-global\" id=\"sk-estimator-id-1\" type=\"checkbox\" ><label for=\"sk-estimator-id-1\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>Pipeline</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html\">?<span>Documentation for Pipeline</span></a><span class=\"sk-estimator-doc-link fitted\">i<span>Fitted</span></span></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"user-set\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy steps to clipboard\"\n",
       "                 onclick=\"copyToClipboard('steps',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-steps;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html#:~:text=steps,-list%20of%20tuples\">\n",
       "            steps\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-steps;\">\n",
       "            steps: list of tuples<br><br>List of (name of step, estimator) tuples that are to be chained in<br>sequential order. To be compatible with the scikit-learn API, all steps<br>must define `fit`. All non-last steps must also define `transform`. See<br>:ref:`Combining Estimators &lt;combining_estimators&gt;` for more details.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">[(&#x27;tfidfvectorizer&#x27;, ...), (&#x27;linearsvc&#x27;, ...)]</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy transform_input to clipboard\"\n",
       "                 onclick=\"copyToClipboard('transform_input',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-transform_input;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html#:~:text=transform_input,-list%20of%20str%2C%20default%3DNone\">\n",
       "            transform_input\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-transform_input;\">\n",
       "            transform_input: list of str, default=None<br><br>The names of the :term:`metadata` parameters that should be transformed by the<br>pipeline before passing it to the step consuming it.<br><br>This enables transforming some input arguments to ``fit`` (other than ``X``)<br>to be transformed by the steps of the pipeline up to the step which requires<br>them. Requirement is defined via :ref:`metadata routing &lt;metadata_routing&gt;`.<br>For instance, this can be used to pass a validation set through the pipeline.<br><br>You can only set this if metadata routing is enabled, which you<br>can enable using ``sklearn.set_config(enable_metadata_routing=True)``.<br><br>.. versionadded:: 1.6</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy memory to clipboard\"\n",
       "                 onclick=\"copyToClipboard('memory',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-memory;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html#:~:text=memory,-str%20or%20object%20with%20the%20joblib.Memory%20interface%2C%20default%3DNone\">\n",
       "            memory\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-memory;\">\n",
       "            memory: str or object with the joblib.Memory interface, default=None<br><br>Used to cache the fitted transformers of the pipeline. The last step<br>will never be cached, even if it is a transformer. By default, no<br>caching is performed. If a string is given, it is the path to the<br>caching directory. Enabling caching triggers a clone of the transformers<br>before fitting. Therefore, the transformer instance given to the<br>pipeline cannot be inspected directly. Use the attribute ``named_steps``<br>or ``steps`` to inspect estimators within the pipeline. Caching the<br>transformers is advantageous when fitting is time consuming. See<br>:ref:`sphx_glr_auto_examples_neighbors_plot_caching_nearest_neighbors.py`<br>for an example on how to enable caching.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy verbose to clipboard\"\n",
       "                 onclick=\"copyToClipboard('verbose',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-verbose;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html#:~:text=verbose,-bool%2C%20default%3DFalse\">\n",
       "            verbose\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-verbose;\">\n",
       "            verbose: bool, default=False<br><br>If True, the time elapsed while fitting each step will be printed as it<br>is completed.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    \n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Fitted attributes</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                    <tbody>\n",
       "                        <tr>\n",
       "                        <th>Name</th>\n",
       "                        <th>Type</th>\n",
       "                        <th>Value</th>\n",
       "                        </tr>\n",
       "                        \n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-classes_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.pipeline.Pipeline.html#:~:text=classes_,-ndarray%20of%20shape%20%28n_classes%2C%29\">\n",
       "            classes_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-classes_;\">\n",
       "            classes_: ndarray of shape (n_classes,)<br><br>The classes labels. Only exist if the last step of the pipeline is a<br>classifier.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">ndarray[&lt;U10](7,)</td>\n",
       "           <td>[&#x27;business&#x27;,&#x27;economics&#x27;,&#x27;geography&#x27;,...,&#x27;politics&#x27;,&#x27;psychology&#x27;,\n",
       " &#x27;sociology&#x27;]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "                    </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div><div class=\"sk-serial\"><div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually sk-global\" id=\"sk-estimator-id-2\" type=\"checkbox\" ><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>TfidfVectorizer</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html\">?<span>Documentation for TfidfVectorizer</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"tfidfvectorizer__\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy input to clipboard\"\n",
       "                 onclick=\"copyToClipboard('input',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-input;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=input,-%7B%27filename%27%2C%20%27file%27%2C%20%27content%27%7D%2C%20default%3D%27content%27\">\n",
       "            input\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-input;\">\n",
       "            input: {&#x27;filename&#x27;, &#x27;file&#x27;, &#x27;content&#x27;}, default=&#x27;content&#x27;<br><br>- If `&#x27;filename&#x27;`, the sequence passed as an argument to fit is<br>  expected to be a list of filenames that need reading to fetch<br>  the raw content to analyze.<br><br>- If `&#x27;file&#x27;`, the sequence items must have a &#x27;read&#x27; method (file-like<br>  object) that is called to fetch the bytes in memory.<br><br>- If `&#x27;content&#x27;`, the input is expected to be a sequence of items that<br>  can be of type string or byte.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;content&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy encoding to clipboard\"\n",
       "                 onclick=\"copyToClipboard('encoding',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-encoding;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=encoding,-str%2C%20default%3D%27utf-8%27\">\n",
       "            encoding\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-encoding;\">\n",
       "            encoding: str, default=&#x27;utf-8&#x27;<br><br>If bytes or files are given to analyze, this encoding is used to<br>decode.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;utf-8&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy decode_error to clipboard\"\n",
       "                 onclick=\"copyToClipboard('decode_error',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-decode_error;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=decode_error,-%7B%27strict%27%2C%20%27ignore%27%2C%20%27replace%27%7D%2C%20default%3D%27strict%27\">\n",
       "            decode_error\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-decode_error;\">\n",
       "            decode_error: {&#x27;strict&#x27;, &#x27;ignore&#x27;, &#x27;replace&#x27;}, default=&#x27;strict&#x27;<br><br>Instruction on what to do if a byte sequence is given to analyze that<br>contains characters not of the given `encoding`. By default, it is<br>&#x27;strict&#x27;, meaning that a UnicodeDecodeError will be raised. Other<br>values are &#x27;ignore&#x27; and &#x27;replace&#x27;.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;strict&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy strip_accents to clipboard\"\n",
       "                 onclick=\"copyToClipboard('strip_accents',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-strip_accents;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=strip_accents,-%7B%27ascii%27%2C%20%27unicode%27%7D%20or%20callable%2C%20default%3DNone\">\n",
       "            strip_accents\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-strip_accents;\">\n",
       "            strip_accents: {&#x27;ascii&#x27;, &#x27;unicode&#x27;} or callable, default=None<br><br>Remove accents and perform other character normalization<br>during the preprocessing step.<br>&#x27;ascii&#x27; is a fast method that only works on characters that have<br>a direct ASCII mapping.<br>&#x27;unicode&#x27; is a slightly slower method that works on any characters.<br>None (default) means no character normalization is performed.<br><br>Both &#x27;ascii&#x27; and &#x27;unicode&#x27; use NFKD normalization from<br>:func:`unicodedata.normalize`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy lowercase to clipboard\"\n",
       "                 onclick=\"copyToClipboard('lowercase',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-lowercase;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=lowercase,-bool%2C%20default%3DTrue\">\n",
       "            lowercase\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-lowercase;\">\n",
       "            lowercase: bool, default=True<br><br>Convert all characters to lowercase before tokenizing.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">True</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy preprocessor to clipboard\"\n",
       "                 onclick=\"copyToClipboard('preprocessor',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-preprocessor;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=preprocessor,-callable%2C%20default%3DNone\">\n",
       "            preprocessor\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-preprocessor;\">\n",
       "            preprocessor: callable, default=None<br><br>Override the preprocessing (string transformation) stage while<br>preserving the tokenizing and n-grams generation steps.<br>Only applies if ``analyzer`` is not callable.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy tokenizer to clipboard\"\n",
       "                 onclick=\"copyToClipboard('tokenizer',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-tokenizer;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=tokenizer,-callable%2C%20default%3DNone\">\n",
       "            tokenizer\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-tokenizer;\">\n",
       "            tokenizer: callable, default=None<br><br>Override the string tokenization step while preserving the<br>preprocessing and n-grams generation steps.<br>Only applies if ``analyzer == &#x27;word&#x27;``.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy analyzer to clipboard\"\n",
       "                 onclick=\"copyToClipboard('analyzer',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-analyzer;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=analyzer,-%7B%27word%27%2C%20%27char%27%2C%20%27char_wb%27%7D%20or%20callable%2C%20default%3D%27word%27\">\n",
       "            analyzer\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-analyzer;\">\n",
       "            analyzer: {&#x27;word&#x27;, &#x27;char&#x27;, &#x27;char_wb&#x27;} or callable, default=&#x27;word&#x27;<br><br>Whether the feature should be made of word or character n-grams.<br>Option &#x27;char_wb&#x27; creates character n-grams only from text inside<br>word boundaries; n-grams at the edges of words are padded with space.<br><br>If a callable is passed it is used to extract the sequence of features<br>out of the raw, unprocessed input.<br><br>.. versionchanged:: 0.21<br>    Since v0.21, if ``input`` is ``&#x27;filename&#x27;`` or ``&#x27;file&#x27;``, the data<br>    is first read from the file and then passed to the given callable<br>    analyzer.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;word&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy stop_words to clipboard\"\n",
       "                 onclick=\"copyToClipboard('stop_words',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-stop_words;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=stop_words,-%7B%27english%27%7D%2C%20list%2C%20default%3DNone\">\n",
       "            stop_words\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-stop_words;\">\n",
       "            stop_words: {&#x27;english&#x27;}, list, default=None<br><br>If a string, it is passed to _check_stop_list and the appropriate stop<br>list is returned. &#x27;english&#x27; is currently the only supported string<br>value.<br>There are several known issues with &#x27;english&#x27; and you should<br>consider an alternative (see :ref:`stop_words`).<br><br>If a list, that list is assumed to contain stop words, all of which<br>will be removed from the resulting tokens.<br>Only applies if ``analyzer == &#x27;word&#x27;``.<br><br>If None, no stop words will be used. In this case, setting `max_df`<br>to a higher value, such as in the range (0.7, 1.0), can automatically detect<br>and filter stop words based on intra corpus document frequency of terms.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy token_pattern to clipboard\"\n",
       "                 onclick=\"copyToClipboard('token_pattern',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-token_pattern;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=token_pattern,-str%2C%20default%3Dr%22%28%3Fu%29%5C%5Cb%5C%5Cw%5C%5Cw%2B%5C%5Cb%22\">\n",
       "            token_pattern\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-token_pattern;\">\n",
       "            token_pattern: str, default=r&quot;(?u)\\\\b\\\\w\\\\w+\\\\b&quot;<br><br>Regular expression denoting what constitutes a &quot;token&quot;, only used<br>if ``analyzer == &#x27;word&#x27;``. The default regexp selects tokens of 2<br>or more alphanumeric characters (punctuation is completely ignored<br>and always treated as a token separator).<br><br>If there is a capturing group in token_pattern then the<br>captured group content, not the entire match, becomes the token.<br>At most one capturing group is permitted.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;(?u)\\\\b\\\\w\\\\w+\\\\b&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy ngram_range to clipboard\"\n",
       "                 onclick=\"copyToClipboard('ngram_range',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-ngram_range;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=ngram_range,-tuple%20%28min_n%2C%20max_n%29%2C%20default%3D%281%2C%201%29\">\n",
       "            ngram_range\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-ngram_range;\">\n",
       "            ngram_range: tuple (min_n, max_n), default=(1, 1)<br><br>The lower and upper boundary of the range of n-values for different<br>n-grams to be extracted. All values of n such that min_n &lt;= n &lt;= max_n<br>will be used. For example an ``ngram_range`` of ``(1, 1)`` means only<br>unigrams, ``(1, 2)`` means unigrams and bigrams, and ``(2, 2)`` means<br>only bigrams.<br>Only applies if ``analyzer`` is not callable.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">(1, ...)</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy max_df to clipboard\"\n",
       "                 onclick=\"copyToClipboard('max_df',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-max_df;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=max_df,-float%20or%20int%2C%20default%3D1.0\">\n",
       "            max_df\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-max_df;\">\n",
       "            max_df: float or int, default=1.0<br><br>When building the vocabulary ignore terms that have a document<br>frequency strictly higher than the given threshold (corpus-specific<br>stop words).<br>If float in range [0.0, 1.0], the parameter represents a proportion of<br>documents, integer absolute counts.<br>This parameter is ignored if vocabulary is not None.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy min_df to clipboard\"\n",
       "                 onclick=\"copyToClipboard('min_df',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-min_df;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=min_df,-float%20or%20int%2C%20default%3D1\">\n",
       "            min_df\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-min_df;\">\n",
       "            min_df: float or int, default=1<br><br>When building the vocabulary ignore terms that have a document<br>frequency strictly lower than the given threshold. This value is also<br>called cut-off in the literature.<br>If float in range of [0.0, 1.0], the parameter represents a proportion<br>of documents, integer absolute counts.<br>This parameter is ignored if vocabulary is not None.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy max_features to clipboard\"\n",
       "                 onclick=\"copyToClipboard('max_features',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-max_features;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=max_features,-int%2C%20default%3DNone\">\n",
       "            max_features\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-max_features;\">\n",
       "            max_features: int, default=None<br><br>If not None, build a vocabulary that only consider the top<br>`max_features` ordered by term frequency across the corpus.<br>Otherwise, all features are used.<br><br>This parameter is ignored if vocabulary is not None.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy vocabulary to clipboard\"\n",
       "                 onclick=\"copyToClipboard('vocabulary',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-vocabulary;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=vocabulary,-Mapping%20or%20iterable%2C%20default%3DNone\">\n",
       "            vocabulary\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-vocabulary;\">\n",
       "            vocabulary: Mapping or iterable, default=None<br><br>Either a Mapping (e.g., a dict) where keys are terms and values are<br>indices in the feature matrix, or an iterable over terms. If not<br>given, a vocabulary is determined from the input documents.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy binary to clipboard\"\n",
       "                 onclick=\"copyToClipboard('binary',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-binary;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=binary,-bool%2C%20default%3DFalse\">\n",
       "            binary\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-binary;\">\n",
       "            binary: bool, default=False<br><br>If True, all non-zero term counts are set to 1. This does not mean<br>outputs will have only 0/1 values, only that the tf term in tf-idf<br>is binary. (Set `binary` to True, `use_idf` to False and<br>`norm` to None to get 0/1 outputs).</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy dtype to clipboard\"\n",
       "                 onclick=\"copyToClipboard('dtype',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-dtype;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=dtype,-dtype%2C%20default%3Dfloat64\">\n",
       "            dtype\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-dtype;\">\n",
       "            dtype: dtype, default=float64<br><br>Type of the matrix returned by fit_transform() or transform().</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&lt;class &#x27;numpy.float64&#x27;&gt;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy norm to clipboard\"\n",
       "                 onclick=\"copyToClipboard('norm',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-norm;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=norm,-%7B%27l1%27%2C%20%27l2%27%7D%20or%20None%2C%20default%3D%27l2%27\">\n",
       "            norm\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-norm;\">\n",
       "            norm: {&#x27;l1&#x27;, &#x27;l2&#x27;} or None, default=&#x27;l2&#x27;<br><br>Each output row will have unit norm, either:<br><br>- &#x27;l2&#x27;: Sum of squares of vector elements is 1. The cosine<br>  similarity between two vectors is their dot product when l2 norm has<br>  been applied.<br>- &#x27;l1&#x27;: Sum of absolute values of vector elements is 1.<br>  See :func:`~sklearn.preprocessing.normalize`.<br>- None: No normalization.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;l2&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy use_idf to clipboard\"\n",
       "                 onclick=\"copyToClipboard('use_idf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-use_idf;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=use_idf,-bool%2C%20default%3DTrue\">\n",
       "            use_idf\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-use_idf;\">\n",
       "            use_idf: bool, default=True<br><br>Enable inverse-document-frequency reweighting. If False, idf(t) = 1.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">True</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy smooth_idf to clipboard\"\n",
       "                 onclick=\"copyToClipboard('smooth_idf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-smooth_idf;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=smooth_idf,-bool%2C%20default%3DTrue\">\n",
       "            smooth_idf\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-smooth_idf;\">\n",
       "            smooth_idf: bool, default=True<br><br>Smooth idf weights by adding one to document frequencies, as if an<br>extra document was seen containing every term in the collection<br>exactly once. Prevents zero divisions.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">True</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy sublinear_tf to clipboard\"\n",
       "                 onclick=\"copyToClipboard('sublinear_tf',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-sublinear_tf;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=sublinear_tf,-bool%2C%20default%3DFalse\">\n",
       "            sublinear_tf\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-sublinear_tf;\">\n",
       "            sublinear_tf: bool, default=False<br><br>Apply sublinear tf scaling, i.e. replace tf with 1 + log(tf).</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">False</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    \n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Fitted attributes</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                    <tbody>\n",
       "                        <tr>\n",
       "                        <th>Name</th>\n",
       "                        <th>Type</th>\n",
       "                        <th>Value</th>\n",
       "                        </tr>\n",
       "                        \n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-fixed_vocabulary_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=fixed_vocabulary_,-bool\">\n",
       "            fixed_vocabulary_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-fixed_vocabulary_;\">\n",
       "            fixed_vocabulary_: bool<br><br>True if a fixed vocabulary of term to indices mapping<br>is provided by the user.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">bool</td>\n",
       "           <td>False</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-idf_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=idf_,-array%20of%20shape%20%28n_features%2C%29\">\n",
       "            idf_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-idf_;\">\n",
       "            idf_: array of shape (n_features,)<br><br>The inverse document frequency (IDF) vector; only defined<br>if ``use_idf`` is True.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">ndarray[float64](3636,)</td>\n",
       "           <td>[5.25,6.86,6.86,...,6.86,6.86,6.86]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-vocabulary_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.feature_extraction.text.TfidfVectorizer.html#:~:text=vocabulary_,-dict\">\n",
       "            vocabulary_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-vocabulary_;\">\n",
       "            vocabulary_: dict<br><br>A mapping of terms to feature indices.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">dict</td>\n",
       "           <td>{&#x27;00&#x27;: 0, &#x27;0864&#x27;: 1, &#x27;0973&#x27;: 2, &#x27;10&#x27;: 3, ...}</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "                    </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div>\n",
       "        <div class=\"features fitted\">\n",
       "          <details>\n",
       "            <summary>\n",
       "              <div class=\"arrow\"></div>\n",
       "              <div>100 of 3,636 features</div>\n",
       "              <div class=\"image-container\">\n",
       "                <button type=\"button\" class=\"copy-paste-icon\"\n",
       "                  title=\"Copy output features (max 100)\"\n",
       "                  aria-label=\"Copy output features (max 100)\"\n",
       "                  onclick=\"\n",
       "                  event.stopPropagation();\n",
       "                  event.preventDefault();\n",
       "                  copyFeatureNamesToClipboard(this);\n",
       "                  \"\n",
       "                >\n",
       "                </button>\n",
       "              </div>\n",
       "            </summary>\n",
       "            <div class=\"features-container\">\n",
       "                <table class=\"features-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr>\n",
       "          <td>00</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>0864</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>0973</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>10</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>100</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1120</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>12</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1258</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>14</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>14614</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1472454871</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>15</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1500</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1538</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1544</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1550</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1558</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>16</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>161pp</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1727</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1750</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1769</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1782</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>18</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1810</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1821</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1846</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1850</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1870</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1872</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1880</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1881</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1890</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>18th</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>19</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1907</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1909</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1919</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1920</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1924</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1933</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1940</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1950s</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1963</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1970</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1971</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1972</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1980</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1984</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1986</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1988</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1989</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1990</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1991</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1992</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1997</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1999</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>1st</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>20</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2001</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2002</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2003</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2005</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2006</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2007</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2008</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2009</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>200pp</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2011</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2013</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2014</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2015</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2016</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>2017</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>203</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>204</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>20th</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>21</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>22</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>234</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>24</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>242</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>247</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>25</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>251</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>267</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>269p</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>275</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>278</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>28</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>283</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>28332</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>29</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>295</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>299</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>30</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>300</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>302</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>31st</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "        <tr>\n",
       "          <td>338</td>\n",
       "        </tr>\n",
       "\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </div>\n",
       "          </details>\n",
       "        </div>\n",
       "    <div class=\"sk-item\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually sk-global\" id=\"sk-estimator-id-3\" type=\"checkbox\" ><label for=\"sk-estimator-id-3\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>LinearSVC</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html\">?<span>Documentation for LinearSVC</span></a></div></label><div class=\"sk-toggleable__content fitted\" data-param-prefix=\"linearsvc__\">\n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Parameters</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                  <tbody>\n",
       "                    \n",
       "        <tr class=\"user-set\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy random_state to clipboard\"\n",
       "                 onclick=\"copyToClipboard('random_state',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-random_state;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=random_state,-int%2C%20RandomState%20instance%20or%20None%2C%20default%3DNone\">\n",
       "            random_state\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-random_state;\">\n",
       "            random_state: int, RandomState instance or None, default=None<br><br>Controls the pseudo random number generation for shuffling the data for<br>the dual coordinate descent (if ``dual=True``). When ``dual=False`` the<br>underlying implementation of :class:`LinearSVC` is not random and<br>``random_state`` has no effect on the results.<br>Pass an int for reproducible output across multiple function calls.<br>See :term:`Glossary &lt;random_state&gt;`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">42</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy penalty to clipboard\"\n",
       "                 onclick=\"copyToClipboard('penalty',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-penalty;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=penalty,-%7B%27l1%27%2C%20%27l2%27%7D%2C%20default%3D%27l2%27\">\n",
       "            penalty\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-penalty;\">\n",
       "            penalty: {&#x27;l1&#x27;, &#x27;l2&#x27;}, default=&#x27;l2&#x27;<br><br>Specifies the norm used in the penalization. The &#x27;l2&#x27;<br>penalty is the standard used in SVC. The &#x27;l1&#x27; leads to ``coef_``<br>vectors that are sparse.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;l2&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy loss to clipboard\"\n",
       "                 onclick=\"copyToClipboard('loss',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-loss;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=loss,-%7B%27hinge%27%2C%20%27squared_hinge%27%7D%2C%20default%3D%27squared_hinge%27\">\n",
       "            loss\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-loss;\">\n",
       "            loss: {&#x27;hinge&#x27;, &#x27;squared_hinge&#x27;}, default=&#x27;squared_hinge&#x27;<br><br>Specifies the loss function. &#x27;hinge&#x27; is the standard SVM loss<br>(used e.g. by the SVC class) while &#x27;squared_hinge&#x27; is the<br>square of the hinge loss. The combination of ``penalty=&#x27;l1&#x27;``<br>and ``loss=&#x27;hinge&#x27;`` is not supported.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;squared_hinge&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy dual to clipboard\"\n",
       "                 onclick=\"copyToClipboard('dual',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-dual;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=dual,-%22auto%22%20or%20bool%2C%20default%3D%22auto%22\">\n",
       "            dual\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-dual;\">\n",
       "            dual: &quot;auto&quot; or bool, default=&quot;auto&quot;<br><br>Select the algorithm to either solve the dual or primal<br>optimization problem. Prefer dual=False when n_samples &gt; n_features.<br>`dual=&quot;auto&quot;` will choose the value of the parameter automatically,<br>based on the values of `n_samples`, `n_features`, `loss`, `multi_class`<br>and `penalty`. If `n_samples` &lt; `n_features` and optimizer supports<br>chosen `loss`, `multi_class` and `penalty`, then dual will be set to True,<br>otherwise it will be set to False.<br><br>.. versionchanged:: 1.3<br>   The `&quot;auto&quot;` option is added in version 1.3 and will be the default<br>   in version 1.5.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;auto&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy tol to clipboard\"\n",
       "                 onclick=\"copyToClipboard('tol',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-tol;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=tol,-float%2C%20default%3D1e-4\">\n",
       "            tol\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-tol;\">\n",
       "            tol: float, default=1e-4<br><br>Tolerance for stopping criteria.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0.0001</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy C to clipboard\"\n",
       "                 onclick=\"copyToClipboard('C',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-C;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=C,-float%2C%20default%3D1.0\">\n",
       "            C\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-C;\">\n",
       "            C: float, default=1.0<br><br>Regularization parameter. The strength of the regularization is<br>inversely proportional to C. Must be strictly positive.<br>For an intuitive visualization of the effects of scaling<br>the regularization parameter C, see<br>:ref:`sphx_glr_auto_examples_svm_plot_svm_scale_c.py`.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1.0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy multi_class to clipboard\"\n",
       "                 onclick=\"copyToClipboard('multi_class',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-multi_class;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=multi_class,-%7B%27ovr%27%2C%20%27crammer_singer%27%7D%2C%20default%3D%27ovr%27\">\n",
       "            multi_class\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-multi_class;\">\n",
       "            multi_class: {&#x27;ovr&#x27;, &#x27;crammer_singer&#x27;}, default=&#x27;ovr&#x27;<br><br>Determines the multi-class strategy if `y` contains more than<br>two classes.<br>``&quot;ovr&quot;`` trains n_classes one-vs-rest classifiers, while<br>``&quot;crammer_singer&quot;`` optimizes a joint objective over all classes.<br>While `crammer_singer` is interesting from a theoretical perspective<br>as it is consistent, it is seldom used in practice as it rarely leads<br>to better accuracy and is more expensive to compute.<br>If ``&quot;crammer_singer&quot;`` is chosen, the options loss, penalty and dual<br>will be ignored.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;ovr&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy fit_intercept to clipboard\"\n",
       "                 onclick=\"copyToClipboard('fit_intercept',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-fit_intercept;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=fit_intercept,-bool%2C%20default%3DTrue\">\n",
       "            fit_intercept\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-fit_intercept;\">\n",
       "            fit_intercept: bool, default=True<br><br>Whether or not to fit an intercept. If set to True, the feature vector<br>is extended to include an intercept term: `[x_1, ..., x_n, 1]`, where<br>1 corresponds to the intercept. If set to False, no intercept will be<br>used in calculations (i.e. data is expected to be already centered).</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">True</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy intercept_scaling to clipboard\"\n",
       "                 onclick=\"copyToClipboard('intercept_scaling',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-intercept_scaling;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=intercept_scaling,-float%2C%20default%3D1.0\">\n",
       "            intercept_scaling\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-intercept_scaling;\">\n",
       "            intercept_scaling: float, default=1.0<br><br>When `fit_intercept` is True, the instance vector x becomes ``[x_1,<br>..., x_n, intercept_scaling]``, i.e. a &quot;synthetic&quot; feature with a<br>constant value equal to `intercept_scaling` is appended to the instance<br>vector. The intercept becomes intercept_scaling * synthetic feature<br>weight. Note that liblinear internally penalizes the intercept,<br>treating it like any other term in the feature vector. To reduce the<br>impact of the regularization on the intercept, the `intercept_scaling`<br>parameter can be set to a value greater than 1; the higher the value of<br>`intercept_scaling`, the lower the impact of regularization on it.<br>Then, the weights become `[w_x_1, ..., w_x_n,<br>w_intercept*intercept_scaling]`, where `w_x_1, ..., w_x_n` represent<br>the feature weights and the intercept weight is scaled by<br>`intercept_scaling`. This scaling allows the intercept term to have a<br>different regularization behavior compared to the other features.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy class_weight to clipboard\"\n",
       "                 onclick=\"copyToClipboard('class_weight',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-class_weight;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=class_weight,-dict%20or%20%27balanced%27%2C%20default%3DNone\">\n",
       "            class_weight\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-class_weight;\">\n",
       "            class_weight: dict or &#x27;balanced&#x27;, default=None<br><br>Set the parameter C of class i to ``class_weight[i]*C`` for<br>SVC. If not given, all classes are supposed to have<br>weight one.<br>The &quot;balanced&quot; mode uses the values of y to automatically adjust<br>weights inversely proportional to class frequencies in the input data<br>as ``n_samples / (n_classes * np.bincount(y))``.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy verbose to clipboard\"\n",
       "                 onclick=\"copyToClipboard('verbose',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-verbose;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=verbose,-int%2C%20default%3D0\">\n",
       "            verbose\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-verbose;\">\n",
       "            verbose: int, default=0<br><br>Enable verbose output. Note that this setting takes advantage of a<br>per-process runtime setting in liblinear that, if enabled, may not work<br>properly in a multithreaded context.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">0</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><button type=\"button\" class=\"copy-paste-icon\"\n",
       "                 aria-label=\"Copy max_iter to clipboard\"\n",
       "                 onclick=\"copyToClipboard('max_iter',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></button></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-max_iter;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=max_iter,-int%2C%20default%3D1000\">\n",
       "            max_iter\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-max_iter;\">\n",
       "            max_iter: int, default=1000<br><br>The maximum number of iterations to be run.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">1000</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    \n",
       "        <div class=\"estimator-table\">\n",
       "            <details>\n",
       "                <summary>Fitted attributes</summary>\n",
       "                <table class=\"parameters-table\">\n",
       "                    <tbody>\n",
       "                        <tr>\n",
       "                        <th>Name</th>\n",
       "                        <th>Type</th>\n",
       "                        <th>Value</th>\n",
       "                        </tr>\n",
       "                        \n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-classes_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=classes_,-ndarray%20of%20shape%20%28n_classes%2C%29\">\n",
       "            classes_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-classes_;\">\n",
       "            classes_: ndarray of shape (n_classes,)<br><br>The unique classes labels.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">ndarray[&lt;U10](7,)</td>\n",
       "           <td>[&#x27;business&#x27;,&#x27;economics&#x27;,&#x27;geography&#x27;,...,&#x27;politics&#x27;,&#x27;psychology&#x27;,\n",
       " &#x27;sociology&#x27;]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-coef_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=coef_,-ndarray%20of%20shape%20%281%2C%20n_features%29%20if%20n_classes%20%3D%3D%202%20%20%20%20%20%20%20%20%20%20%20%20%20else%20%28n_classes%2C%20n_features%29\">\n",
       "            coef_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-coef_;\">\n",
       "            coef_: ndarray of shape (1, n_features) if n_classes == 2             else (n_classes, n_features)<br><br>Weights assigned to the features (coefficients in the primal<br>problem).<br><br>``coef_`` is a readonly property derived from ``raw_coef_`` that<br>follows the internal memory layout of liblinear.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">ndarray[float64](7, 3636)</td>\n",
       "           <td>[[ 0.18,-0.01,-0.04,...,-0.1 ,-0.1 ,-0.1 ],\n",
       " [-0.03,-0.  ,-0.  ,..., 0.58, 0.58, 0.58],\n",
       " [-0.13,-0.01,-0.03,...,-0.12,-0.12,-0.12],\n",
       " ...,\n",
       " [ 0.21, 0.14,-0.09,...,-0.08,-0.08,-0.08],\n",
       " [-0.16,-0.04,-0.06,...,-0.09,-0.09,-0.09],\n",
       " [ 0.13,-0.06, 0.27,...,-0.1 ,-0.1 ,-0.1 ]]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-intercept_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=intercept_,-ndarray%20of%20shape%20%281%2C%29%20if%20n_classes%20%3D%3D%202%20else%20%28n_classes%2C%29\">\n",
       "            intercept_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-intercept_;\">\n",
       "            intercept_: ndarray of shape (1,) if n_classes == 2 else (n_classes,)<br><br>Constants in decision function.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">ndarray[float64](7,)</td>\n",
       "           <td>[-0.7 ,-0.74,-0.65,...,-0.77,-0.72,-0.69]</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-n_features_in_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=n_features_in_,-int\">\n",
       "            n_features_in_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-n_features_in_;\">\n",
       "            n_features_in_: int<br><br>Number of features seen during :term:`fit`.<br><br>.. versionadded:: 0.24</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">int</td>\n",
       "           <td>3636</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "\n",
       "       <tr class=\"default\">\n",
       "           <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            style=\"anchor-name: --doc-link-n_iter_;\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.9/modules/generated/sklearn.svm.LinearSVC.html#:~:text=n_iter_,-int\">\n",
       "            n_iter_\n",
       "            <span class=\"param-doc-description\"\n",
       "            style=\"position-anchor: --doc-link-n_iter_;\">\n",
       "            n_iter_: int<br><br>Maximum number of iterations run across all classes.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "           <td class=\"fitted-att-type\">int</td>\n",
       "           <td>25</td>\n",
       "\n",
       "\n",
       "       </tr>\n",
       "    \n",
       "                    </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div></div></div><script>/*  Authors: The scikit-learn developers\n",
       " SPDX-License-Identifier: BSD-3-Clause\n",
       "*/\n",
       "\n",
       "function copyToClipboard(text, element) {\n",
       "    // Get the parameter prefix from the closest toggleable content\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${text}` : text;\n",
       "\n",
       "    const originalStyle = element.style;\n",
       "    const computedStyle = window.getComputedStyle(element);\n",
       "    const originalWidth = computedStyle.width;\n",
       "    const originalHTML = element.innerHTML.replace('Copied!', '');\n",
       "\n",
       "    navigator.clipboard.writeText(fullParamName)\n",
       "        .then(() => {\n",
       "            element.style.width = originalWidth;\n",
       "            element.style.color = 'green';\n",
       "            element.innerHTML = \"Copied!\";\n",
       "\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'red';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 2000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "\n",
       "document.querySelectorAll('.copy-paste-icon').forEach(function(element) {\n",
       "    const toggleableContent = element.closest('.sk-toggleable__content');\n",
       "    const paramPrefix = toggleableContent ? toggleableContent.dataset.paramPrefix : '';\n",
       "\n",
       "    const parent = element.parentElement;\n",
       "    if (!parent || !parent.nextElementSibling) {\n",
       "        console.warn('Expected copy-paste icon is missing from the DOM structure');\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    const paramName = element.parentElement.nextElementSibling\n",
       "        .textContent.trim().split(' ')[0];\n",
       "    const fullParamName = paramPrefix ? `${paramPrefix}${paramName}` : paramName;\n",
       "\n",
       "    element.setAttribute('title', fullParamName);\n",
       "});\n",
       "\n",
       "/**\n",
       " * Copy the list of feature names formatted as a Python list.\n",
       " *\n",
       " * @param {HTMLElement} element - The copy button inside a `.features` block; its siblings\n",
       " *   contain a `details` element and a table containing feature named.\n",
       " * @returns {boolean} Always returns `false` so callers can prevent the default click behavior.\n",
       " */\n",
       "function copyFeatureNamesToClipboard(element) {\n",
       "    var detailsElem = element.closest('.features').querySelector('details');\n",
       "    var wasOpen = detailsElem.open;\n",
       "    detailsElem.open = true;\n",
       "    var content = element.closest('.features').querySelector('tbody')\n",
       "                  .innerText.trim();\n",
       "    if (!wasOpen) detailsElem.open = false;\n",
       "    const rows = content.split('\\n').map(row => `    \"${row}\"`);\n",
       "    const formattedText = `[\\n${rows.join(',\\n')},\\n]`;\n",
       "    const originalHTML = element.innerHTML.replace('✔', '');\n",
       "    const originalStyle = element.style;\n",
       "    const copyMark = document.createElement('span');\n",
       "    copyMark.innerHTML = '✔';\n",
       "    copyMark.style.color = 'blue';\n",
       "    copyMark.style.fontSize = '1em';\n",
       "\n",
       "    navigator.clipboard.writeText(formattedText)\n",
       "        .then(() => {\n",
       "            element.style.display = 'none';\n",
       "            element.parentElement.appendChild(copyMark);\n",
       "\n",
       "            setTimeout(() => {\n",
       "                copyMark.remove();\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 1000);\n",
       "        })\n",
       "        .catch(err => {\n",
       "            console.error('Failed to copy:', err);\n",
       "            element.style.color = 'orange';\n",
       "            element.innerHTML = \"Failed!\";\n",
       "            setTimeout(() => {\n",
       "                element.innerHTML = originalHTML;\n",
       "                element.style = originalStyle;\n",
       "            }, 1000);\n",
       "        });\n",
       "    return false;\n",
       "}\n",
       "/**\n",
       " * Adapted from Skrub\n",
       " * https://github.com/skrub-data/skrub/blob/403466d1d5d4dc76a7ef569b3f8228db59a31dc3/skrub/_reporting/_data/templates/report.js#L789\n",
       " * @returns \"light\" or \"dark\"\n",
       " */\n",
       "function detectTheme(element) {\n",
       "    const body = document.querySelector('body');\n",
       "\n",
       "    // Check VSCode theme\n",
       "    const themeKindAttr = body.getAttribute('data-vscode-theme-kind');\n",
       "    const themeNameAttr = body.getAttribute('data-vscode-theme-name');\n",
       "\n",
       "    if (themeKindAttr && themeNameAttr) {\n",
       "        const themeKind = themeKindAttr.toLowerCase();\n",
       "        const themeName = themeNameAttr.toLowerCase();\n",
       "\n",
       "        if (themeKind.includes(\"dark\") || themeName.includes(\"dark\")) {\n",
       "            return \"dark\";\n",
       "        }\n",
       "        if (themeKind.includes(\"light\") || themeName.includes(\"light\")) {\n",
       "            return \"light\";\n",
       "        }\n",
       "    }\n",
       "\n",
       "    // Check Jupyter theme\n",
       "    if (body.getAttribute('data-jp-theme-light') === 'false') {\n",
       "        return 'dark';\n",
       "    } else if (body.getAttribute('data-jp-theme-light') === 'true') {\n",
       "        return 'light';\n",
       "    }\n",
       "\n",
       "    // Guess based on a parent element's color\n",
       "    const color = window.getComputedStyle(element.parentNode, null).getPropertyValue('color');\n",
       "    const match = color.match(/^rgb\\s*\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*\\)\\s*$/i);\n",
       "    if (match) {\n",
       "        const [r, g, b] = [\n",
       "            parseFloat(match[1]),\n",
       "            parseFloat(match[2]),\n",
       "            parseFloat(match[3])\n",
       "        ];\n",
       "\n",
       "        // https://en.wikipedia.org/wiki/HSL_and_HSV#Lightness\n",
       "        const luma = 0.299 * r + 0.587 * g + 0.114 * b;\n",
       "\n",
       "        if (luma > 180) {\n",
       "            // If the text is very bright we have a dark theme\n",
       "            return 'dark';\n",
       "        }\n",
       "        if (luma < 75) {\n",
       "            // If the text is very dark we have a light theme\n",
       "            return 'light';\n",
       "        }\n",
       "        // Otherwise fall back to the next heuristic.\n",
       "    }\n",
       "\n",
       "    // Fallback to system preference\n",
       "    return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n",
       "}\n",
       "\n",
       "\n",
       "function forceTheme(elementId) {\n",
       "    const estimatorElement = document.querySelector(`#${elementId}`);\n",
       "    if (estimatorElement === null) {\n",
       "        console.error(`Element with id ${elementId} not found.`);\n",
       "    } else {\n",
       "        const theme = detectTheme(estimatorElement);\n",
       "        estimatorElement.classList.add(theme);\n",
       "    }\n",
       "}\n",
       "\n",
       "forceTheme('sk-container-id-1');</script></body>"
      ],
      "text/plain": [
       "Pipeline(steps=[('tfidfvectorizer', TfidfVectorizer()),\n",
       "                ('linearsvc', LinearSVC(random_state=42))])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.pipeline import make_pipeline\n",
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "model = make_pipeline(TfidfVectorizer(), LinearSVC(random_state=42))\n",
    "# todo: hyperparameter-optimisation\n",
    "model.fit(X_train, y_train)"
   ],
   "id": "cell-11"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "It's already finished. Let's see how well it performs. But first, we need to [configure matplotlib](https://matplotlib.org/stable/tutorials/introductory/customizing.html) to make the charts more legible. \n",
    "> `ConfusionMatrixDisplay` relies on `matplotlib` for rendering."
   ],
   "id": "cell-12"
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-28T22:47:23.727782Z",
     "iopub.status.busy": "2026-10-28T22:47:23.727693Z",
     "iopub.status.idle": "2026-10-28T22:47:23.739633Z",
     "shell.execute_reply": "2026-10-28T22:47:23.739183Z"
    }
   },
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "\n",
    "%matplotlib inline\n",
    "plt.rcParams[\"figure.figsize\"] = (30, 15)\n",
    "plt.rcParams[\"figure.facecolor\"] = \"white\"\n",
    "plt.rcParams[\"font.size\"] = 12"
   ],
   "id": "cell-13"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Next, we check the quality of the model on the `test` split. We can use the classification report to check the common metrics, such as the macro F1-score. We also draw the confusion matrix to get some insights into the types of mistakes being made by the model."
   ],
   "id": "cell-14"
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-28T22:47:23.740364Z",
     "iopub.status.busy": "2026-10-28T22:47:23.740307Z",
     "iopub.status.idle": "2026-10-28T22:47:23.948937Z",
     "shell.execute_reply": "2026-10-28T22:47:23.948633Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "    business       0.50      0.53      0.52        30\n",
      "   economics       0.49      0.63      0.55        30\n",
      "   geography       0.44      0.37      0.40        30\n",
      "    medicine       0.67      0.60      0.63        30\n",
      "    politics       0.59      0.57      0.58        30\n",
      "  psychology       0.45      0.43      0.44        30\n",
      "   sociology       0.31      0.30      0.31        30\n",
      "\n",
      "    accuracy                           0.49       210\n",
      "   macro avg       0.49      0.49      0.49       210\n",
      "weighted avg       0.49      0.49      0.49       210\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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hg2L999/P1577bWafRctWhRf/epX484770zD9GbNmqX3u+iii+J73/te5P4z/fSDDz6IU045JQ3Rk2Mmx5k/f35cd911ccYZZ6zXY1fXuP/0pz8dN998cxqkH3DAAekx77333nj11VfT/ZKLAcnxqqqq4pe//GV8/vOfX+0Yu+yyS9x6661pwD9y5Mj04sGf//zn9OePuv3229PHSC42JI+x5557xoMPPhgtW64sq5Gciz/96U8xderUaNeuXa37HnPMMek5Ouigg+r1OaNuFRVV0bHD4mjZckV077YwyssKUVm5wumiCSjE1781Irp0WxI3/WhwWooHAO+TND3+ngRYs+bl+SgUcukCuUmg37XVoqgor4rysnyU5QqRL/hIMlRL/l9JWjEqFOm46tJk05tCoRBHHHFEzJs3Lw3Ce/XqlYbh559/fowfPz7atGlTa/8TTjghnZn+3HPP1cxMf/LJJ9NwvVu3bun9qo85adKkNJSvngV/6aWXxplnnpnud/jhh6/zYyeSGfk9evSIN998M72AkHxaIHH11VfX2i85zje/+c046aSTYty4cbHJJpvUOkbyc/UxxowZkwb9yb5//etfax1nxIgR0bt377R/yb7JuJNQ/+c//3lceOGF6T7/8z//E7/+9a/jd7/7Xfp9tWTfZHb/LbfcUue5Ty4+JK1ach7YMFOmto/bf7Nzzc8nHjsyLvjK8Jg/vzKefaGP00ujOffCf8fQvafFfXdvEf942GsRwPskTZW/JwHq1q/j7LjtsL/GI+O3iEsf2y8K/6mrv3vPKfHLwx9Mv79l+G5OH1BUmmxN/SSgT2afX3HFFWmonkjKxCQheTJT/qMB9/3335/OpF+11My+++4bxx13XNxwww3pz88++2y8+OKLcdlll9Uqa/P9738/fYxrrrlmnR+72ocffhhXXXVVzScCkhI71VasWJGG6I8//nj84x//iEGDBqWfDnjhhRdqHSMp87PqMZJyOsknDR5++OG0HM+q5s6dG1deeWXNvnvssUc69gceeKBmn5122ik+9alPxc9+9rNa9/3pT38aLVq0iOOPP77OsSTjbN++fU2rPgfUn3vu2zaqqnKx59BJTiuN5rRzXo/PHfVOPHBv37j91u08EwDeJ8kQf08CrPTZfhPShXLv+vd2NYF+4p9Tesb4WZ3i0C3HO1VA0WmyM/WT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3va9730vTj755GgoQn0AAAAAAErKxRdfHOecc85q2w888MCYMGFC7Lrrrh97/2XLlsWkSZPiuuuui6OPPrrWbZ07d46GJNQHAAAAACgFyWKyxbqgbGHddk+C94+G7yNHjkxn4H/+85+PTTbZZK2O06VLl9h8881jY1JTHwAAAACAkverX/0qPQdnnXVWkz4XQn0AAAAAAEra0qVL4/e//3307t07DjrooLW+349+9KMYOHBgbL/99nHSSSfF8OHDo6EJ9QEAAAAAKArz5s2r1ZKwfm3cf//9MWvWrDj99NOjrGztYvODDz44fvjDH8Z9990X1157bUydOjV23333uPPOO6MhCfUBAAAAAEqppn6xtojo1atXtG/fvqZdffXVa116p7y8PA3118bWW28dDz/8cBx11FGx7bbbprP7H3300Rg8eHCcd955MX/+/GgoQn0AAAAAAIrC5MmTY+7cuTXtsssu+8T7vPvuu/H444/HIYccEpttttlaPU5yAeCjmjVrFscdd1wa6DdkGZ5mDXZkAAAAAADYiNq1a5e2dXHHHXdEPp+PM888c4Mfv1WrVunXJUuWREMxUx8AAAAAgJJUKBTiN7/5TfTs2TOdqb+hkhn/uVwudthhh2goQn0AAAAAAErS448/HhMnTozTTjutzpI6iTFjxsTmm28e3/ve92q2XXXVVfHggw/G4sWL05+Tr1deeWXce++98T//8z/pRYKGovwOAAAAAEAJyBVWtmKUW89xJQvklpWVfewCucuWLYtJkybFrFmzarYdeuihcc0118QJJ5wQLVu2jJkzZ6bB/w033BAXXnhhNCShPgAAAAAAJen666+P66677mNn1m+zzTbxzjvv1KrVP3jw4Bg2bFhavueDDz5Ig/327dtvlD4L9QEAAAAAKEmbbbbZJ+7TvHnzdBZ+XZL6+T169IiNSU19AAAAAADICDP1AQAAAABKQVJ3vkhr6kexjqsOZuoDAAAAAEBGCPUBAAAAACAjhPoAAAAAAJARQn0AAAAAAMgIC+UCAAAAAJSAXGFlK0a5Ih1XXczUBwAAAACAjBDqAwAAAABARgj1AQAAAAAgI9TUBwAAAAAoBUnd+WKtPV+IkmGmPgAAAAAAZIRQHwAAAAAAMkKoDwAAAAAAGSHUBwAAAACAjLBQLgAAAABAKbBQblEwUx8AAAAAADJCqA8A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eX/961/j5ZdfjlNPPTX22muvorbTvXv3rHd+S9JTHwAAAACAsvKrX/2qQUA/qaysjDXXXDPGjh0bs2fPjrZKUB8AAAAAoBykvPOlPC2mGTNmxLPPPhvLL798dOjQoah1UvqdtPyQIUNizz33jMcffzyam6A+AAAAAAAlYfLkyQ2mmTNnFr3u//zP/8Snn36a5dpfmIqKith3333jyiuvzC4EXH/99Vnv/u222y7+/Oc/R3MS1AcAAAAAoCQMHDgwevXqVTedf/75Ra2XgvK/+93vYvvtt4+TTz55ocunND233HJL/Nd//VesuOKKseWWW8Y999wT3/zmN+PHP/5xTJo0KZqLgXIBAAAAACgJH374YfTs2bPueadOnRa6zu233x4/+MEPYvPNN48777wzy61fTE/9ubVr1y7rvf/Pf/4zRowYEd/5zneiOQjqAwAAAABQEnr27NkgqL8w9913X3zve9+LTTbZJB588MHo3r37Yr1/7UWE5hxoV1AfAAAAAKAcLKEBZdukQtP36+GHH4599tknNtxww3jooYeiR48ei12MdGEg9fRP22wucuoDAAAAAFBWhg8fHnvssUesv/76MWzYsAX27n/11VejX79+2UC6tdLff//73+Pzzz/PnqfH0047Le6999445ZRTYtlll222sgvqAwAAAABQVs4+++yYPn16jB49OoYMGZIF7etPH3/8cd2yVVVVWdB+6tSpdfMOOuigePTRR7MBc7t16xb9+/fPLg78+c9/jt/85jfNWnbpdwAAAAAAKCt33XXXAvPe9+nTp+7vddZZJyZOnBhdunSpm7f66qvH1Vdfnf2dgv0pl36HDh2iJQjqAwAAAACUAzn16/Tq1SuKlXLkp97787O4g+s2lfQ7AAAAAACQE4L6AAAAAACQE4L6AAAAAACQE4L6AAAAAACQEwbKBQAAAAAoB9URURGlu29lQk99AAAAAADICUF9AAAAAADICUF9AAAAAADICTn1AQAAAADKQEWhkE2lqKJE96sxeuoDAAAAAEBOCOoDAAAAAEBOCOoDAAAAAEBOCOoDAAAAAEBOGCgXAAAAAKAcpMFkS3VA2UKJ7lcj9NQHAAAAAICcENQHAAAAAICcENQHAAAAAICckFMfAAAAAKAcVBciKgqlu29lQk99AAAAAADICUF9AAAAAADICUF9AAAAAADICUF9AAAAAADICQPlAgAAAACUg0KhZipFhRLdr0boqQ8AAAAAADkhqA8AAAAAADkhqA8AAAAAADkhpz4AAAAAQFko4Zz6Uar7NS899QEAAAAAICcE9QEAAAAAICcE9QEAAAAAICcE9QEAAAAAICcMlAsAAAAAUA4KJTxQbqFE96sReuoDAAAAAEBOCOoDAAAAAEBOCOoDAAAAAEBOyKkPAAAAAFAOqlPe+UIJ71t50FMfAAAAAAByQlAfAAAAAAByQlAfAAAAAAByQlAfAAAAAABywkC5AAAAAADloFBdM5WiQonuVyP01AcAAAAAgJwQ1AcAAAAAgJwQ1AcAAAAAgJyQUx8AAAAAoBwUCjVTKSqU6H41Qk99AAAAAADICUF9AAAAAADICUF9AAAAAADICUF9AAAAAADICQPlAgAAAACUg+o0mGyhhPetPOipDwAAAAAAOSGoDwAAAAAAOSGoDwAAAAAAOSGnPrSAFQdPjsGrTIpOnebEx+O7xauj+kV1dYVjT6vp22d6rL7qZ9G799fx+Rdd47XRS8fkKZ19IrSK3TcfHV07z55n/vjPesZT/x7cKmWCdpWFWH/LqbHCkJkx5avKGPlkj5j0haYzratbp5mx6crjo1+P6fHB573iX+8uH3Oq9dOi5fnupi1aqtOM2GLAuOjb+ev4dHq3ePqjFWJaVcfWLha0PYVCzVSKCiW6X43wy2QxPPPMM9G1a9fYYIMNWnRd8uMbq30ZJ5z2cqwwaGqMeHbZmD6tfXzvkDdjxozK+MOvN4w3X+/T2kWkzFRWVsdPTxseKw76Ksa82yemTu0YO2z/TgwcOCluunXtuOnWdVq7iJShQ3Z8Kb6e2T6efXXFBvMnT+/UamWivPVeenac97d3o3uvOfH8Iz2zwP6JF4yLC08cFM8+2Ku1i0eZ2mPj0XHSTs/Fa+OWjrETescmq4yLE3d8Ln50/U4xYXL31i4eZcZ3N23NziuNiV9/64l4d1LveO2LfrHPKm/ELzZ7Kk548r/ihQnLtXbxAJY4Qf3FcPTRR8cqq6wSd911V4uuS34MWWVSTJ3SIY48YPv4/LMu2bxOnavit5cMj7PPfz5+8N3vxMyZ/hvScioqCvHAQ9+IF19q2LA9/pjn49CDRsUrry0Tr43u7yOhxb09rm9cevc3HXnahNP++EH0WGpOHLv9qjF1Us339A9/NS7OuPT9OOLbq8eE8Xr90bJ2WPft+Mluw+OUG3eMZ9/6zwXQFft9FeXTH422xnc3bcXgnl/FhVs8FsM+GBI/Hr5dFKIi2lVUx6VbD4tLt3kovnPn92LSLHclA6XFvZqLYcstt4wNN9xwyX0alJxXRvWLn526eV1AP5k5o30Me2BQ9O4zM9ZY+4tWLR/lp6qqcp6AfvLMPwdlj0NW+rIVSgXQdgxcZUZsNHRq3Pf/+tYF9JOb/rhMdOhUiF2+/3mrlo/y075yTvxo52fjgZdXbRDQT97/bKmYqJc+UOZ2G/x2dKysjj+/un4W0E+qC+3iz6+sH707zcx67QOUGl2EF8MVV1yx5D4JStJH4xq/Fbp795rc0RXS6tNGrLn6xKiujnj9zX6tXRTK1NJLTc/y86YUUR993jNGvrVczKrSTKHlrbfF1OzxtRe6NZj/xYQO8cn7HWO9zWteh5ay0eCPom+Pr+PJ11eKIf2/iPVW/CTaVRTi9Y/6xehxy/ggaDW+u2krBnSr+W4eP7VHg/njpvbMHr+57Pj4y+j1W6VsAM2l5H4tf/nll/H2229HdXV1rL766rHUUks1utyHH34Y77zzTnTr1i3WXXfd6NSp8by9kydPjldffTUqKytj7bXXzpYvJi9+sdtfnLK98sor2f6us8460bt373jxxRdj5syZsfnmm2evP/nkk1n5Ntlkk3nWfeONN+K9996L73znO9m+0XK6dJkdO+32XkyZ3CFGvyqnPq1jmf5TY8vNP4iOHebEykO+iCGDv4zfXbx5jHmnr4+EVtGt86xYfcWJ0aXj7Dhsp5ExZ05FnHvDtvHiW8v7RGhRywyclT1+9nGHeV6b+FGHGLTqTJ8ILeoby9bcHbLvZq/F6st9Fk+/OSi6dKyKU3d9Jv759gpx5t//K2a6CEor8N1NW/HFjJrUOst0nRZTJv0nfpKeJwN7TGm1skGbVCjhAWULUTZKKqh/+umnx5/+9KdYY401soD4W2+9Fbvvvns2rzYw/umnn8YhhxwSTzzxRBYw/+STT2LKlClx4YUXxhFHHFG3rWnTpsXJJ58c119/fay00krRp0+fLAh+6qmnximnnDLfvPjFbr8xxa77wQcfxJ577pkF5tNyn332WZx11llx0003Zeu8/PLL2XKp7LfcckuMHz8+evasuUJda7/99ov27dvHjjvuuISOPsUpxI9/OjL69Z8Rf/jNBlkqHmgNHTrMid5LfR1dulTFMv2nRWW7QnTqVOXDoFWcc9128e93l6173rPrjPjDcQ/E+Uc+FAedt19M+MoAkLSczl2rs8dZM+bNUjlzRru616GldO9cc6Fp7YET4oA/7RMff1XTrt9q9ffi9wc/GMds/0Jc/OC3fCC0KN/dtCXDPhgcR649Kg5c7bX4xYit6uZ/f/VXsseu7WvulAcoJSWTU3/YsGFZ8PvOO++MkSNHxvDhw+Pjjz+OzTbbLL7++utsmUKhEHvssUf8+9//zgLfI0aMyALkKTh/5JFHxj333FO3vf333z9uu+22bLtvvvlm/POf/4wxY8ZE9+7zDyw0ZfuLum7tcpMmTcqC+qlc6TEtn8pX33HHHRdTp06NG264ocH8p59+Ouvlf/jhhzdaltTbP92hUH9iyTj25H/HFkM/jjtuXjkefqBhTlRoSePG94qrr9so/nT5ZnHCKTvHw48NiRN/OCK22vx9HwQtrn5AP5k8vXNcdvdm0bVTVXxn44bfbdDcaoP5HTrO282nY6dCzJwhdx4ta2ZVzV21D45apS6gnwx/Y6V46+O+seP6b/tIaHG+u2lLXv5s2bjopU3igNVei6u2fSBOWO+FuHb7+2LD/p/EJ9O7xrTZBrgHSk/JBPVTL/pk5ZVXrpvXrl27LHBdm4InBfqfe+65OPPMM7PUPLXOPffcGDhwYFxwwQXZ8xQgv++++7Llhg4dWrdc6v2fguzzU+z2F2fdlFLnpZdeip/97GfZ/CSlzzn//POzXvr1pUF800WNyy+/vMH8yy67LDp37hwHHHBAo2VJ2+rVq1fdVPs+LJ4fHPNq/PdeY+Oe2wfH1Zeu43DSptx6x1pZupOtthDUp214/9Oa7+5lestfTsuaML4m7U7fZeft1ZfmTRgnMEDL+uTLmhzRn3zVMFd08tGXPaJfj+nRrsIdJLQ+3920pktf2Sh2vXe/eP7T5aJDu+p44L2VY/f79o0OFdXx9le9fThAySmZoP4OO+yQpZjZcsstsxQ5999/f5a6pr5//etf2eMWW2zRYH6HDh2y4HfKSZ88++yz2eM222zTpDIUu/3FWbf2cdNNN22wXAq+r7rqqvNsN/XWf+2117KLAcmECRPi9ttvj7322ivLw9+YdGEh3QlQO6Uc/yyegw8fHfscMCbuu3NwXHHxeg4nbY+Op7Qxy/Wt+Q7/fHLX1i4KZea1ETXjJ622wfQG83v0rorlBs+sex1aysj3BmSD2ffrUZMbur7+PafFF1M7R3WhZH7WkWO+u2ltb3/VJ65+bf34/Uubxa1j1ojBPb+Kvl1mxEMfDGntogEscSXT+ltxxRWzAW1T7vnU6z3lnE958NPzWbNq8lDOmDEje2wshU6PHj2y5dIAu7XpeubOQ78wxW5/cdZNqXHmt1xj81Lu/H79+tX11v/LX/6SbWt+qXeSNP5A2vf6E4tuvwPfiu8d8lYW0L/sD+s6lLSq5QZMjq5da+rE+vbY9Y2orCzEs8+7M4eWtXy/SdGjS8OBRzu0nxOH7/yvqJpTEY+95EcYLWvMK13jjZFdY5fvfx4dO/+n3bbnEROzgbfuv8GA4rSsTyf1iKfeWCn+a90x0bNLzW+GZJ2Bn8Tqy02MYf9exUdCi/LdTVv0jaW+aPC8U2VVnLXJMzFqYv/4x/vak9BAGiS3lKcyUVKjdKY0Meedd142pVzyl1xySdbrfJ111omTTjopBg0alC337rvvztOr/Z133okVVlghS9kzZEhNhZ8G2l1ttdWKfv9it78469amwknphuZOi/P+++/P0/s+BehTAP/3v/99fPTRR3HllVfG4MGDm3wXAotmi6Hj49CjR8dnEzvHpx93jb32b5gbeuSI/vHeu70cXlpMGhT33LMfj7fe7hvjP+4RHdpXx5prTIw1V58YN926Vjzx1GCfBi0qpdf5/Q8fiNff7x8fTOgVXTvPji3Xfj/69Pg6fnn9tvHhhJo0PNCSLjhhUPzm5nfi4nvfjuH3LxXLD5kZQ3f7Ki49a/n4cExnHwYt7td3DY1LDrsvbjjuthj2729El46z4783fCNeHLt8XDpsM58ILcp3N23RD9d5MXp2nBWjPusfXdpXxQ6D3o1Pv+4WRz2+k7uZgJJUMj31J06cOE+v9eOPPz77e9y4cdnjTjvtFF27dp0nx/yoUaOy3v377LNP9nznnXeOvn37ZgPvVlVVNVj2yy+/nG8Zit3+4qyblkv58K+++uoGy6UBfefOqV/rmGOOiTlz5mSD/6aLAT/4wQ+iokKujZYwZXLHuP2mVeLJR1eIpfrMjN5zTR07yX9Ky3pp1IA45sRd4+lnB8WcqnZZHv1HHx8chx61R1x34wY+DlrcyLeXj4PP3zcef3lwzKluF1/P7BDX/GOj2PvnB8RjL/1nnBxoSR+N7RRHbb1a3H7l0tl39djRnePobVeL+2/o54OgVXw5rUt8/7K94qJ/bB5Vc9rFV9M7x+l/2yF+eM2uMWN2zTgQ0FJ8d9MW/Wj4d+LPr64fVdXtYtLMTvHTf24d33tw9/hiRpfWLhpAsyiZnvp///vf45prrsnSzaSe7inFzHXXXZflmj/00EOzZVKg/oorrojDDjssyym/7777ZoHwX//617H++uvHOeecU5fu5uabb85S+KQc92n5lMonDWSbBql9/PHHGy1DsdtfnHVTKp2LL764bsDeXXbZJcaOHRvPPPNMNqjv3Bc3kpVWWim7UJEG/029/WuPB83v3y8tnU3QlsyeXRnPPDconnmutUsCNWbNbh9PjhoST45yRGg7ZkyvjEdu7dPaxYA6c6or4/HXhmQTtDbf3bRFIz5dPpsAykHJ9NQ/8cQT469//WuWD/+mm26KBx54ILbddtt48803Y6211qpb7uCDD46RI0dmge603IgRI+Lcc8/NBsetnzt+u+22i9dffz123XXXePjhh+Puu+/O1knbrZUG5d1www0blKPY7S/OukcddVR2YaGysjK7mFEoFLLlU8qh1Nu/MUceeWTdgMIplQ8AAAAAUGbSeJ+lPJWJikKKCJN76WNcbrnlsosRN9544zyvp5z6p5xyStx2222x9957N2nbkydPzu542G7IidG+stMSLDUsuure8w4MDa1p6oqNX1SF1tLttucdfNqULw77VmsXARroNKV8fviTD59uXDL9LikB1TNmxHs/PysmTZrUoKMp+VUb39u+/xHRvl3HKEVV1bPikQlXl8V56xsjp/8J55aC9Sldz2677dboOqkn/4ABA+b7OgAAAAAAbV/J5NQvJ48++mhccsklWY/7/v37xwsvvBAXXXRRlioo5eKvlcYVeOyxx+LJJ5/MlrnqqquiQwcDaQEAAAAA5JWgfg6lAXzTwL133nlnDBs2LLt1Jg0SvP/++0dFRUXdctOmTcuC/d27d49rr73WALkAAAAAADknqJ9TQ4cOzaYF6d27dzz44IMtViYAAAAAoA1Lw6uW6hCrhRLdr0bIqQ8AAAAAADkhqA8AAAAAADkhqA8AAAAAADkhpz4AAAAAQDmQU78k6KkPAAAAAAA5IagPAAAAAAA5IagPAAAA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9tu3dhEAWq0uUwfSWu1K7VCgFKnbAP5DUJ+y8eWXX8aNN94Y48ePz3o0ffe7340OHTrUvf7GG2/EFVdcEccff3ysssoqdfOrq6vjxz/+cfzXf/1X7LzzznXzv/jii7j99tvjvffey3oMpB5SW221VYOcfT//+c9jv/32i80337wuh/NvfvObOPjgg2PVVVfNyvP+++/H6quvHgcccEB07NhxnnJ/+umncdddd8W7774bPXr0yMqx6aabNlhmYWUpdhmWrMceeyyefvrpmDZtWvZ5p3MhfYZze+KJJ+KZZ56J6dOnZ+fm3nvv3eBcmDVrVtx9993x8ssvR0VFRWy44Yax2267Rfv27RvkOU3n9llnnZXlmEw5odP5veeee2bbnFtTt5nK+Oijj0bv3r3j0EMPjT59+mTLPPXUU/HII49Ely5d4sADD4xBgwbNkyv1tddei1/+8pdN3u+07bQv6VbZ9H9y9913r3tfmi4dy4ceeijatWuXHcv1118/CxCloOOuu+7a5Hqntt5Mt+NPmDAhll122ewcql9/NuW969ePaRs33XRTvP3223HUUUdlz1M9XCudJwMHDsy2Vf+cq7+NIUOGLLDOry+dY/OrjydPnpzV5amsu+yyyzzrpteWW265OProo5v0edC4JVHvNKUOTp/v3/72t+y7MS3zve99r9FtLWpd1th6Ta2vi90XWsei1DvF1p31zd2ufOutt+L888+vO89effXV7O9tt902215j7dBa6X3vueeeeOedd6Jfv36xww47NDj3tBlbT/364fHHH8/+73fu3DmrH9Zcc815ll9QW+mWW26J559/Pjs/5z4P//nPf2bnzY9+9KNYccUVi26b1VpSbc35KXbddJ7//e9/b1CHP/nkk1nZfvvb32bLL8pxoGmKrTOKrfsWVEctqG5blLp1SbdptRuBliSnPmUhNY5TMObDDz/MGonpi/db3/pW1iiolRoh6RbmcePGNVg3BfXT/PqD8aQG5korrRR//etfs6BCuv05DaD3/e9/f6G5T9O81NhMjYAUMEvbP+GEE2LHHXecp9ypkZl+IKb36dq1a3z00UcxdOjQBsGtYspSzDIsOem8Sj+q04+c1DBMn126YLTGGms0yN+dPodtttkmOzfHjh2bfTapMbnBBhtkgZsknbPrrbdeds6mc/frr7+OY489NjbeeOMs8Dp3ntOLLroo/vd//zf70ZKCYWlb6bG+pm4zBQ0uvfTSbJvpx2b6YZXO5XQOpfO59gdTeq+07YXlSi1mv9O5mf6PpHM+Ba7S/7+U+sKgpovmzDPPjC233DLefPPN7MfxqaeemtUH6fNLgcKm1jvJBRdcEGuttVYWUEi9ptJnnQLil1xyySK9d239mM7XdAE1BfRTsCydU2m9VIfVTt26dcsuOqQf8P/4xz/m2UYK+C6szq+V/o8uqD7u2bNnlq86lXtuaX4K1s6ZM2cRPxnmtiTqnWLr4PSZr7POOtm5nH6cp+/KnXbaKQtmzW1R67LG1mtKfV3svtB6mlrvFFt3zm3udmU635Zffvns7759+9bVj+kiWGPL10oXsQYPHhxXXXVVVFZWZvVsuiCR/r8l2oytq7Z++NWvfpV9fql+SL8b1l133awurG9hbaVevXrF73//+7jjjjvmeZ9f/OIXWR1aew4VU5/VWpJtzcYUu24K+KZA74UXXpjV4elcT+VPF0Lqj4vSlONA0xVbZxRb9y2sjppf3baodeuSbtNqNwItqgAl7JVXXimk03zFFVcsjB8/vm7+G2+8UejYsWPh2GOPrZv3j3/8I1v28ccfb7CN2bNnZ/PPOuusunnf//73C6uuumphzpw5DZZ99dVX6/7+8MMPs/Uuv/zyecqz8sorFz755JO6+bfeems2P5Wh/rY6dOjQoIzJgw8+mC171113FV2WYpZhyfne975X6N69e2HMmDENzqOtttqqsMEGG9TN23fffQtdu3YtjB49usH677zzTuHrr7/O/t5+++0LvXv3bnD+jh07Ntv+7rvvXjdv7733zuadc845dfOqqqoK6667bmGzzTZrsP2mbLNbt26Fc889t27e559/XujSpUthxx13LPzsZz+rm//ll19my5500kkN3uvwww8vLLPMMg3mLWy/33333ewcv/HGGxu8nt4j/b+iaZ544onseF5wwQV186qrqwtHHnlkNv8nP/lJk+ud4cOHZ89PP/30Bssdf/zxhXbt2hVefPHFJr/3/OrrSZMmzXffUt22wgorLFKd35T6+IYbbsjmPfbYYw3e/+CDDy507tw5OzdZMpZEvVNsHbztttsWBgwYUPjss8/q5v3rX//K6sf0edfWw4tal81vvabU18XuC62nKfVOsXVnY23Ixua9/fbb2byrrrpq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qKZBS998881o3759NgZAY/8PS/040HKKadNqNwItRVAfAAAAAAByQk59AAAAAADICUF9AAAAAADICUF9AAAAAADICUF9AAAAAADICUF9AAByY+21145dd921wbyllloqjj/++Gjr5WzM4pS9oqIizjjjjEVatznKAwAAtAxBfQAAivLcc89lgeTaqV27dtG3b9/YaaedYvjw4bk7ip07d46TTz65tYsBAADQJIL6AAA0yYUXXhiFQiFmz54djz32WHz++eex3XbbxT//+c9WOZJfffVVXHLJJa3y3gAAAC1NUB8AgEVSWVkZ6623Xlx99dVZgF9gHQAAoPkJ6gMAsFhWX3317PHDDz/MHg866KBYYYUV4rPPPosDDjggevfuHZtssknd8ukiwEYbbRRdunSJnj17Zul7Xn755QbbnDZtWpxwwgnRv3//6N69e5affty4cU3KA/+Xv/wlNt1002z9pZdeOvbee+9444034pNPPsnSB82cOTMuvvjiunRCO+64Y4P1l3Q5m3I8a8vUvn377FgeccQRMWHChEaXHzZsWKy//vpZOqHVVlst2+/GFLM/AABA2yeoDwDAYnnzzTezx4EDB9bNq66ujqOOOioOPfTQePfdd+uC7ikAfuKJJ8bhhx+eXQR4/fXXY/nll48tt9wyXnvttbr1UwD+b3/7WxaI/uijj+L000/Ptjdr1qyiynTsscfGcccdF/vtt18WyE9Tutjwxz/+MZZddtksfVCnTp3ipJNOyv5O04MPPli3fkuVszGprLVlmjx5ctx0003x/PPPxz777JMd1/peeeWVuOqqq+L222/PypkuoqQLAJdffnmD5YrdHwAAIAcKAABQhH/+85+F1Hy88MILs+dVVVWFUaNGFTbbbLNC+/btC8OHD8/mH3jggdlyt99+e4P1//Wvf2Xzzz///Abz03ZWX331wt577509f/TRR7PlrrrqqgbLPfLII9n8XXbZpcH8Xr16FY477ri6588//3y23C9/+csF7k+nTp0KJ5100jzzm6ucjZm77PPz4IMPZtt89dVX6+al50svvXRh+vTpDZbdddddC3369CnMmDGjSfvTlPIAAACtR099AACa5LTTTstSw3To0CGGDh0avXr1iocffjjr9V0rvZ5S0dR33333ZY/77rvvPLn5t95663jyySez548++mj2uNtuuzVYLg3Gm1LcLMz999+fPaZe64uipco5PyNHjow99tgjlllmmew966cGGjNmTINlt99++yydTn1p3S+++KIutU6x+wMAAORD+9YuAAAA+XLhhRfGqaeeusBlUg77jh07NpiXctknKe97UptipvbvFLxOPv/882jXrl22jbmlQPfC1OaeT+llFkVLlbMxKVXRVlttFdtss0088sgjscoqq2RB+2eeeSa7aJIGJF7Y+9TOS2MaNGV/AACAfNBTHwCAJS714p9bv379ssfx48dHVVVVzJkzJ8sRn6YUXK7NF9+3b9/s74kTJ86zjfkNFltfbZA9vc+iaKlyNua2226L6dOnx5VXXhnrrLNOXS/8sWPHNrr8p59+Ot95qXxN2R8AACAfBPUBAGgRtel4br755gUut+2222aP9957b4P5jz32WEyZMqXo90kD2C5It27dYubMma1WzgVJg/jWd/311ze6XOrNP2PGjAbz7r777ujdu3dssMEGTdofAAAgH6TfAQCgRWy22WZxwgknxJlnnpn1Ft9nn32y3uQp5UzK+556t//+97/PguXf+c534ic/+UmWSibl7R81alT22je+8Y2Fvs+mm24aRx99dJx33nnRtWvX2H///bMe70899VQMGzYsLrvssmy5tddeO5599tmsZ3v9NDYtVc7G7LTTTnHWWWfFj3/84/jtb3+bXXT43e9+l41b0JiNN944DjnkkDj//POjZ8+eccUVV2Rl/OMf/1h3YaDY/QEAAPJBT30AAFpMCjan1DK33357rLXWWtG/f/848MADY+rUqXH66adny6Qc73fccUd897vfjcMOOyyWXXbZLECfgvFz5+mfn8svvzwuvvjirLd+yku/xhprxI033hgnnnhi3TLp9RTsX2mllRoMRtuS5ZxbSrmT3jMNcjto0KAsv/5yyy2XXThozLrrrhuHHnpoNjhuGkMg9ehPgf3jjz++yccdAADIh4pC7ShZAAAAAABAm6anPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAA5ISgPgAAAAAARD78f2UC+TnZt+LxAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 3000x1500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn import metrics\n",
    "\n",
    "y_predicted = model.predict(X_test)\n",
    "\n",
    "print(metrics.classification_report(y_test, y_predicted))\n",
    "metrics.ConfusionMatrixDisplay.from_predictions(y_test, y_predicted)\n",
    "None"
   ],
   "id": "cell-15"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The recorded run achieves a test macro F1-score of about **0.69** on the MAG sentence-classification dataset, above the historical SciBERT baseline of **0.6571** associated with the [2019 SciBERT work](https://arxiv.org/abs/1903.10676). This compares a linear SVM with one historical baseline; it does not establish current state-of-the-art performance. A broader claim would require a current benchmark with comparable data splits, preprocessing, and metrics.\n",
    "\n",
    "You might wonder that *\"this is great, but besides some utility functions (`clean`, `simple_parallel_map`, ...) what more value does GreatAI add?\"*. This would be a valid argument because the scope of GreatAI actually only starts here.\n",
    "\n",
    "> Not coincidentally, this is the point where the scope of Data Science ends but it's still a grey zone for software engineering.\n",
    "\n",
    "In order to use this model in production, we have to make it available on some possibly shared infrastructure."
   ],
   "id": "cell-16"
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "execution": {
     "iopub.execute_input": "2026-10-28T22:47:23.949712Z",
     "iopub.status.busy": "2026-10-28T22:47:23.949648Z",
     "iopub.status.idle": "2026-10-28T22:47:23.983489Z",
     "shell.execute_reply": "2026-10-28T22:47:23.982773Z"
    }
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;226mEnvironment variable ENVIRONMENT is not set, defaulting to development mode ‼️\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;226mCannot find credentials files, defaulting to using ParallelTinyDbDriver\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;226mThe selected tracing database (ParallelTinyDbDriver) is not recommended for production\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;226mCannot find credentials files, defaulting to using LargeFileLocal\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;39mGreatAI (v0.1.11): configured ✅\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;39m  🔩 tracing_database: ParallelTinyDbDriver\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;39m  🔩 large_file_implementation: LargeFileLocal\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;39m  🔩 is_production: False\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;39m  🔩 should_log_exception_stack: True\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;39m  🔩 prediction_cache_size: 512\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;39m  🔩 dashboard_table_size: 50\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;226mYou still need to check whether you follow all best practices before trusting your deployment.\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;226m> Find out more at https://se-ml.github.io/practices\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;39mFetching cached versions of my-domain-predictor\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;39mFetching cached versions of my-domain-predictor\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;39mFetching cached versions of my-domain-predictor\u001b[0m\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[38;5;39mModel my-domain-predictor uploaded with version 0\u001b[0m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "'my-domain-predictor:0'"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from great_ai import save_model\n",
    "\n",
    "save_model(model, key=\"my-domain-predictor\")"
   ],
   "id": "cell-17"
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### [Let's continue by finishing the deployment in the next notebook.](https://great-ai.schmelczer.dev/tutorial/deploy)"
   ],
   "id": "cell-18"
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "GreatAI (local)",
   "language": "python",
   "name": "great-ai-local"
  },
  "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.13.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
