{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "a4c0ff93",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>text</th>\n",
       "      <th>label</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>واقعا حیف وقت که بنویسم سرویس دهیتون شده افتضاح</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>قرار بود ۱ ساعته برسه ولی نیم ساعت زودتر از مو...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>قیمت این مدل اصلا با کیفیتش سازگاری نداره، فقط...</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>عالللی بود همه چه درست و به اندازه و کیفیت خوب...</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>شیرینی وانیلی فقط یک مدل بود.</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "                                                text  label\n",
       "0    واقعا حیف وقت که بنویسم سرویس دهیتون شده افتضاح      0\n",
       "1  قرار بود ۱ ساعته برسه ولی نیم ساعت زودتر از مو...      1\n",
       "2  قیمت این مدل اصلا با کیفیتش سازگاری نداره، فقط...      0\n",
       "3  عالللی بود همه چه درست و به اندازه و کیفیت خوب...      1\n",
       "4                      شیرینی وانیلی فقط یک مدل بود.      1"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "\n",
    "df = pd.read_csv('Persian_sentiment.csv')\n",
    "\n",
    "df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "f9a3266b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['label'].unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "8752a1a7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.DataFrame'>\n",
      "RangeIndex: 56700 entries, 0 to 56699\n",
      "Data columns (total 2 columns):\n",
      " #   Column  Non-Null Count  Dtype\n",
      "---  ------  --------------  -----\n",
      " 0   text    56700 non-null  str  \n",
      " 1   label   56700 non-null  int64\n",
      "dtypes: int64(1), str(1)\n",
      "memory usage: 886.1 KB\n"
     ]
    }
   ],
   "source": [
    "df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "7b8112d5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "text     0\n",
       "label    0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df.isna().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "f33a8ec9",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "label\n",
       "0    28350\n",
       "1    28350\n",
       "Name: count, dtype: int64"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df['label'].value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "a98543d2",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "\n",
    "label_counts = df['label'].value_counts()\n",
    "labels = ['bad sentiment', 'good sentiment']\n",
    "\n",
    "plt.figure(1, (5,5))\n",
    "sns.barplot(x=labels  , y=label_counts, palette=['#A253A6', \"#FF8400\"], hue=labels)\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "996b2d6d",
   "metadata": {},
   "outputs": [],
   "source": [
    "X  = df['text']\n",
    "y = df['label']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "6418e8e0",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "a9921dab",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.feature_extraction.text import TfidfVectorizer\n",
    "\n",
    "vectorizer = TfidfVectorizer()\n",
    "\n",
    "# نمونه\n",
    "# vectorizer.fit(X_train)\n",
    "\n",
    "# X_train_vec = vectorizer.transform(X_train)\n",
    "\n",
    "\n",
    "X_train_vec = vectorizer.fit_transform(X_train)\n",
    "\n",
    "X_test_vec = vectorizer.transform(X_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "ae3dd542",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>#sk-container-id-2 {\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-container-id-2.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-container-id-2.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-container-id-2 {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 pre {\n",
       "  padding: 0;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 input.sk-hidden--visually {\n",
       "  border: 0;\n",
       "  clip: rect(1px 1px 1px 1px);\n",
       "  clip: rect(1px, 1px, 1px, 1px);\n",
       "  height: 1px;\n",
       "  margin: -1px;\n",
       "  overflow: hidden;\n",
       "  padding: 0;\n",
       "  position: absolute;\n",
       "  width: 1px;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 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-container-id-2 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-container-id-2 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-container-id-2 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-container-id-2 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-container-id-2 div.sk-parallel-item {\n",
       "  display: flex;\n",
       "  flex-direction: column;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:first-child::after {\n",
       "  align-self: flex-end;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:last-child::after {\n",
       "  align-self: flex-start;\n",
       "  width: 50%;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-parallel-item:only-child::after {\n",
       "  width: 0;\n",
       "}\n",
       "\n",
       "/* Serial-specific style estimator block */\n",
       "\n",
       "#sk-container-id-2 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-container-id-2 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-container-id-2 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-container-id-2 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-container-id-2 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-container-id-2 label.sk-toggleable__label-arrow:hover:before {\n",
       "  color: var(--sklearn-color-text);\n",
       "}\n",
       "\n",
       "/* Toggleable content - dropdown */\n",
       "\n",
       "#sk-container-id-2 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-container-id-2 div.sk-toggleable__content.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 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-container-id-2 div.sk-toggleable__content.fitted pre {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 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-container-id-2 input.sk-toggleable__control:checked~label.sk-toggleable__label-arrow:before {\n",
       "  content: \"▾\";\n",
       "}\n",
       "\n",
       "/* Pipeline/ColumnTransformer-specific style */\n",
       "\n",
       "#sk-container-id-2 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-container-id-2 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-container-id-2 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-container-id-2 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-container-id-2 div.sk-label label.sk-toggleable__label,\n",
       "#sk-container-id-2 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-container-id-2 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-container-id-2 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-container-id-2 div.sk-label label {\n",
       "  font-family: monospace;\n",
       "  font-weight: bold;\n",
       "  line-height: 1.2em;\n",
       "}\n",
       "\n",
       "#sk-container-id-2 div.sk-label-container {\n",
       "  text-align: center;\n",
       "}\n",
       "\n",
       "/* Estimator-specific */\n",
       "#sk-container-id-2 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-container-id-2 div.sk-estimator.fitted {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-0);\n",
       "}\n",
       "\n",
       "/* on hover */\n",
       "#sk-container-id-2 div.sk-estimator:hover {\n",
       "  /* unfitted */\n",
       "  background-color: var(--sklearn-color-unfitted-level-2);\n",
       "}\n",
       "\n",
       "#sk-container-id-2 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-container-id-2 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-container-id-2 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-container-id-2 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-container-id-2 a.estimator_doc_link.fitted:hover {\n",
       "  /* fitted */\n",
       "  background-color: var(--sklearn-color-fitted-level-3);\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 {\n",
       "    background-color: #e0e0e0;\n",
       "}\n",
       "\n",
       ".estimator-table table td {\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 {\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",
       "/*\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",
       "/* \"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",
       "/* 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",
       "}\n",
       "</style><body><div id=\"sk-container-id-2\" class=\"sk-top-container\"><div class=\"sk-text-repr-fallback\"><pre>KNeighborsClassifier(n_neighbors=3)</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\"><div class=\"sk-estimator fitted sk-toggleable\"><input class=\"sk-toggleable__control sk-hidden--visually\" id=\"sk-estimator-id-2\" type=\"checkbox\" checked><label for=\"sk-estimator-id-2\" class=\"sk-toggleable__label fitted sk-toggleable__label-arrow\"><div><div>KNeighborsClassifier</div></div><div><a class=\"sk-estimator-doc-link fitted\" rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.neighbors.KNeighborsClassifier.html\">?<span>Documentation for KNeighborsClassifier</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><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_neighbors',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#:~:text=n_neighbors,-int%2C%20default%3D5\">\n",
       "            n_neighbors\n",
       "            <span class=\"param-doc-description\">n_neighbors: int, default=5<br><br>Number of neighbors to use by default for :meth:`kneighbors` queries.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">3</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('weights',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#:~:text=weights,-%7B%27uniform%27%2C%20%27distance%27%7D%2C%20callable%20or%20None%2C%20default%3D%27uniform%27\">\n",
       "            weights\n",
       "            <span class=\"param-doc-description\">weights: {'uniform', 'distance'}, callable or None, default='uniform'<br><br>Weight function used in prediction.  Possible values:<br><br>- 'uniform' : uniform weights.  All points in each neighborhood<br>  are weighted equally.<br>- 'distance' : weight points by the inverse of their distance.<br>  in this case, closer neighbors of a query point will have a<br>  greater influence than neighbors which are further away.<br>- [callable] : a user-defined function which accepts an<br>  array of distances, and returns an array of the same shape<br>  containing the weights.<br><br>Refer to the example entitled<br>:ref:`sphx_glr_auto_examples_neighbors_plot_classification.py`<br>showing the impact of the `weights` parameter on the decision<br>boundary.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;uniform&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('algorithm',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#:~:text=algorithm,-%7B%27auto%27%2C%20%27ball_tree%27%2C%20%27kd_tree%27%2C%20%27brute%27%7D%2C%20default%3D%27auto%27\">\n",
       "            algorithm\n",
       "            <span class=\"param-doc-description\">algorithm: {'auto', 'ball_tree', 'kd_tree', 'brute'}, default='auto'<br><br>Algorithm used to compute the nearest neighbors:<br><br>- 'ball_tree' will use :class:`BallTree`<br>- 'kd_tree' will use :class:`KDTree`<br>- 'brute' will use a brute-force search.<br>- 'auto' will attempt to decide the most appropriate algorithm<br>  based on the values passed to :meth:`fit` method.<br><br>Note: fitting on sparse input will override the setting of<br>this parameter, using brute force.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;auto&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('leaf_size',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#:~:text=leaf_size,-int%2C%20default%3D30\">\n",
       "            leaf_size\n",
       "            <span class=\"param-doc-description\">leaf_size: int, default=30<br><br>Leaf size passed to BallTree or KDTree.  This can affect the<br>speed of the construction and query, as well as the memory<br>required to store the tree.  The optimal value depends on the<br>nature of the problem.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">30</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('p',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#:~:text=p,-float%2C%20default%3D2\">\n",
       "            p\n",
       "            <span class=\"param-doc-description\">p: float, default=2<br><br>Power parameter for the Minkowski metric. When p = 1, this is equivalent<br>to using manhattan_distance (l1), and euclidean_distance (l2) for p = 2.<br>For arbitrary p, minkowski_distance (l_p) is used. This parameter is expected<br>to be positive.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">2</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('metric',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#:~:text=metric,-str%20or%20callable%2C%20default%3D%27minkowski%27\">\n",
       "            metric\n",
       "            <span class=\"param-doc-description\">metric: str or callable, default='minkowski'<br><br>Metric to use for distance computation. Default is \"minkowski\", which<br>results in the standard Euclidean distance when p = 2. See the<br>documentation of `scipy.spatial.distance<br><https://docs.scipy.org/doc/scipy/reference/spatial.distance.html>`_ and<br>the metrics listed in<br>:class:`~sklearn.metrics.pairwise.distance_metrics` for valid metric<br>values.<br><br>If metric is \"precomputed\", X is assumed to be a distance matrix and<br>must be square during fit. X may be a :term:`sparse graph`, in which<br>case only \"nonzero\" elements may be considered neighbors.<br><br>If metric is a callable function, it takes two arrays representing 1D<br>vectors as inputs and must return one value indicating the distance<br>between those vectors. This works for Scipy's metrics, but is less<br>efficient than passing the metric name as a string.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">&#x27;minkowski&#x27;</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('metric_params',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#:~:text=metric_params,-dict%2C%20default%3DNone\">\n",
       "            metric_params\n",
       "            <span class=\"param-doc-description\">metric_params: dict, default=None<br><br>Additional keyword arguments for the metric function.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "\n",
       "        <tr class=\"default\">\n",
       "            <td><i class=\"copy-paste-icon\"\n",
       "                 onclick=\"copyToClipboard('n_jobs',\n",
       "                          this.parentElement.nextElementSibling)\"\n",
       "            ></i></td>\n",
       "            <td class=\"param\">\n",
       "        <a class=\"param-doc-link\"\n",
       "            rel=\"noreferrer\" target=\"_blank\" href=\"https://scikit-learn.org/1.8/modules/generated/sklearn.neighbors.KNeighborsClassifier.html#:~:text=n_jobs,-int%2C%20default%3DNone\">\n",
       "            n_jobs\n",
       "            <span class=\"param-doc-description\">n_jobs: int, default=None<br><br>The number of parallel jobs to run for neighbors search.<br>``None`` means 1 unless in a :obj:`joblib.parallel_backend` context.<br>``-1`` means using all processors. See :term:`Glossary <n_jobs>`<br>for more details.<br>Doesn't affect :meth:`fit` method.</span>\n",
       "        </a>\n",
       "    </td>\n",
       "            <td class=\"value\">None</td>\n",
       "        </tr>\n",
       "    \n",
       "                  </tbody>\n",
       "                </table>\n",
       "            </details>\n",
       "        </div>\n",
       "    </div></div></div></div></div><script>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",
       "    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",
       "/**\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-2');</script></body>"
      ],
      "text/plain": [
       "KNeighborsClassifier(n_neighbors=3)"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "knn = KNeighborsClassifier(n_neighbors=3)\n",
    "\n",
    "knn.fit(X_train_vec, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "ab003e1f",
   "metadata": {},
   "outputs": [],
   "source": [
    "knn_pred = knn.predict(X_test_vec)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "492ea15a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7602292768959436\n"
     ]
    }
   ],
   "source": [
    "from sklearn.metrics import accuracy_score, classification_report, confusion_matrix\n",
    "\n",
    "print(accuracy_score(y_test, knn_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "bdf0879b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "              precision    recall  f1-score   support\n",
      "\n",
      "           0       0.72      0.85      0.78      5670\n",
      "           1       0.82      0.67      0.74      5670\n",
      "\n",
      "    accuracy                           0.76     11340\n",
      "   macro avg       0.77      0.76      0.76     11340\n",
      "weighted avg       0.77      0.76      0.76     11340\n",
      "\n"
     ]
    }
   ],
   "source": [
    "print(classification_report(y_test, knn_pred))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "325e8270",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(1, (5,5))\n",
    "sns.heatmap(confusion_matrix(y_test, knn_pred), annot=True, cmap='Greens', fmt='d', cbar=False, \n",
    "            xticklabels=labels, yticklabels=labels)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "563eaaa0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1])"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test = vectorizer.transform(['انسان خوب'])\n",
    "knn.predict(test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "017d40a1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.7584126984126984\n"
     ]
    }
   ],
   "source": [
    "df_valid = pd.read_csv('validation_Persian_sentiment.csv')\n",
    "\n",
    "X_valid = df_valid['text']\n",
    "X_valid_vec = vectorizer.transform(X_valid)\n",
    "\n",
    "knn_pred_valid = knn.predict(X_valid_vec)\n",
    "\n",
    "\n",
    "y_valid = df_valid['label']\n",
    "print(accuracy_score(y_valid, knn_pred_valid))"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
