diff --git "a/Assignment_2.ipynb" "b/Assignment_2.ipynb"
new file mode 100644--- /dev/null
+++ "b/Assignment_2.ipynb"
@@ -0,0 +1,2103 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "execution_count": 1,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "N3shQZoZPScM",
+ "outputId": "63642e05-bd32-4fd9-f029-8f50148a1e8a"
+ },
+ "outputs": [],
+ "source": [
+ "!pip install -U sentence_transformers --q"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 2,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "rcBH0FzwVOk6",
+ "outputId": "f5b4b762-9b30-4474-d1d0-7ba3ab68a2ef"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n",
+ "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip3 install --upgrade pip\u001b[0m\n",
+ "Note: you may need to restart the kernel to use updated packages.\n"
+ ]
+ }
+ ],
+ "source": [
+ "pip install datasets --q"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 3,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "y-pDMu97XyVd",
+ "outputId": "737160a3-2c34-4293-a129-bb053cd91117"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Collecting sentence-transformers\n",
+ " Using cached sentence_transformers-3.4.1-py3-none-any.whl.metadata (10 kB)\n",
+ "Requirement already satisfied: scikit-learn in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (1.4.1.post1)\n",
+ "Requirement already satisfied: pandas in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (2.2.1)\n",
+ "Collecting torch\n",
+ " Downloading torch-2.6.0-cp312-none-macosx_11_0_arm64.whl.metadata (28 kB)\n",
+ "Collecting transformers<5.0.0,>=4.41.0 (from sentence-transformers)\n",
+ " Downloading transformers-4.48.3-py3-none-any.whl.metadata (44 kB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m44.4/44.4 kB\u001b[0m \u001b[31m2.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[?25hRequirement already satisfied: tqdm in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from sentence-transformers) (4.67.1)\n",
+ "Requirement already satisfied: scipy in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from sentence-transformers) (1.12.0)\n",
+ "Requirement already satisfied: huggingface-hub>=0.20.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from sentence-transformers) (0.28.1)\n",
+ "Requirement already satisfied: Pillow in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from sentence-transformers) (10.2.0)\n",
+ "Requirement already satisfied: numpy<2.0,>=1.19.5 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from scikit-learn) (1.26.4)\n",
+ "Requirement already satisfied: joblib>=1.2.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from scikit-learn) (1.3.2)\n",
+ "Requirement already satisfied: threadpoolctl>=2.0.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from scikit-learn) (3.3.0)\n",
+ "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/markushenriksson/Library/Python/3.12/lib/python/site-packages (from pandas) (2.9.0.post0)\n",
+ "Requirement already satisfied: pytz>=2020.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pandas) (2024.1)\n",
+ "Requirement already satisfied: tzdata>=2022.7 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from pandas) (2024.1)\n",
+ "Requirement already satisfied: filelock in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from torch) (3.16.0)\n",
+ "Requirement already satisfied: typing-extensions>=4.10.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from torch) (4.10.0)\n",
+ "Collecting networkx (from torch)\n",
+ " Using cached networkx-3.4.2-py3-none-any.whl.metadata (6.3 kB)\n",
+ "Requirement already satisfied: jinja2 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from torch) (3.1.3)\n",
+ "Requirement already satisfied: fsspec in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from torch) (2024.2.0)\n",
+ "Requirement already satisfied: setuptools in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from torch) (69.1.1)\n",
+ "Collecting sympy==1.13.1 (from torch)\n",
+ " Using cached sympy-1.13.1-py3-none-any.whl.metadata (12 kB)\n",
+ "Collecting mpmath<1.4,>=1.1.0 (from sympy==1.13.1->torch)\n",
+ " Using cached mpmath-1.3.0-py3-none-any.whl.metadata (8.6 kB)\n",
+ "Requirement already satisfied: packaging>=20.9 in /Users/markushenriksson/Library/Python/3.12/lib/python/site-packages (from huggingface-hub>=0.20.0->sentence-transformers) (24.0)\n",
+ "Requirement already satisfied: pyyaml>=5.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from huggingface-hub>=0.20.0->sentence-transformers) (6.0.1)\n",
+ "Requirement already satisfied: requests in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from huggingface-hub>=0.20.0->sentence-transformers) (2.32.3)\n",
+ "Requirement already satisfied: six>=1.5 in /Users/markushenriksson/Library/Python/3.12/lib/python/site-packages (from python-dateutil>=2.8.2->pandas) (1.16.0)\n",
+ "Collecting regex!=2019.12.17 (from transformers<5.0.0,>=4.41.0->sentence-transformers)\n",
+ " Using cached regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl.metadata (40 kB)\n",
+ "Collecting tokenizers<0.22,>=0.21 (from transformers<5.0.0,>=4.41.0->sentence-transformers)\n",
+ " Downloading tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl.metadata (6.7 kB)\n",
+ "Collecting safetensors>=0.4.1 (from transformers<5.0.0,>=4.41.0->sentence-transformers)\n",
+ " Downloading safetensors-0.5.2-cp38-abi3-macosx_11_0_arm64.whl.metadata (3.8 kB)\n",
+ "Requirement already satisfied: MarkupSafe>=2.0 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from jinja2->torch) (2.1.5)\n",
+ "Requirement already satisfied: charset-normalizer<4,>=2 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (3.3.2)\n",
+ "Requirement already satisfied: idna<4,>=2.5 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (3.6)\n",
+ "Requirement already satisfied: urllib3<3,>=1.21.1 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (2.0.7)\n",
+ "Requirement already satisfied: certifi>=2017.4.17 in /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages (from requests->huggingface-hub>=0.20.0->sentence-transformers) (2024.2.2)\n",
+ "Using cached sentence_transformers-3.4.1-py3-none-any.whl (275 kB)\n",
+ "Downloading torch-2.6.0-cp312-none-macosx_11_0_arm64.whl (66.5 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m66.5/66.5 MB\u001b[0m \u001b[31m24.7 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
+ "\u001b[?25hUsing cached sympy-1.13.1-py3-none-any.whl (6.2 MB)\n",
+ "Downloading transformers-4.48.3-py3-none-any.whl (9.7 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m9.7/9.7 MB\u001b[0m \u001b[31m35.3 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m00:01\u001b[0m00:01\u001b[0m\n",
+ "\u001b[?25hUsing cached networkx-3.4.2-py3-none-any.whl (1.7 MB)\n",
+ "Using cached mpmath-1.3.0-py3-none-any.whl (536 kB)\n",
+ "Using cached regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl (284 kB)\n",
+ "Downloading safetensors-0.5.2-cp38-abi3-macosx_11_0_arm64.whl (408 kB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m408.9/408.9 kB\u001b[0m \u001b[31m27.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n",
+ "\u001b[?25hDownloading tokenizers-0.21.0-cp39-abi3-macosx_11_0_arm64.whl (2.6 MB)\n",
+ "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m2.6/2.6 MB\u001b[0m \u001b[31m36.1 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0ma \u001b[36m0:00:01\u001b[0m\n",
+ "\u001b[?25hInstalling collected packages: mpmath, sympy, safetensors, regex, networkx, torch, tokenizers, transformers, sentence-transformers\n",
+ "Successfully installed mpmath-1.3.0 networkx-3.4.2 regex-2024.11.6 safetensors-0.5.2 sentence-transformers-3.4.1 sympy-1.13.1 tokenizers-0.21.0 torch-2.6.0 transformers-4.48.3\n",
+ "\n",
+ "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.0\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m25.0.1\u001b[0m\n",
+ "\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpip3 install --upgrade pip\u001b[0m\n",
+ "Note: you may need to restart the kernel to use updated packages.\n"
+ ]
+ }
+ ],
+ "source": [
+ "pip install sentence-transformers scikit-learn pandas torch\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 4,
+ "metadata": {
+ "id": "m-tmgXuldd3C"
+ },
+ "outputs": [],
+ "source": [
+ "import seaborn as sns"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 5,
+ "metadata": {
+ "id": "1Z0mgYZEgjC4"
+ },
+ "outputs": [],
+ "source": [
+ "from sklearn.ensemble import RandomForestClassifier"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 6,
+ "metadata": {
+ "id": "aBmXLbZ4cc1U"
+ },
+ "outputs": [],
+ "source": [
+ "from sklearn.model_selection import train_test_split\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 7,
+ "metadata": {
+ "id": "LXkXdIWgUcWI"
+ },
+ "outputs": [],
+ "source": [
+ "from datasets import load_dataset, Dataset\n",
+ "import pandas as pd"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 8,
+ "metadata": {
+ "id": "AFkI23ySgtkV"
+ },
+ "outputs": [],
+ "source": [
+ "from sklearn.metrics import accuracy_score"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 9,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "ehvh1BJZWa_1",
+ "outputId": "212a5f82-885d-4e61-a73f-94dcf12a3a39"
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "ab0344420d964f64a16c911f17aae057",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "README.md: 0%| | 0.00/515 [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "9f86cbde053f4b9e91cff137a924082f",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "train-00000-of-00001.parquet: 0%| | 0.00/5.89M [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "2f6d00487331444299405cc97d4b18ea",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "Generating train split: 0%| | 0/61199 [00:00, ? examples/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " answer system_prompt \\\n",
+ "0 neutral You are a financial sentiment analysis expert.... \n",
+ "1 neutral You are a financial sentiment analysis expert.... \n",
+ "2 negative You are a financial sentiment analysis expert.... \n",
+ "3 positive You are a financial sentiment analysis expert.... \n",
+ "4 positive You are a financial sentiment analysis expert.... \n",
+ "\n",
+ " user_prompt task_type \n",
+ "0 According to Gran , the company has no plans t... sentiment_analysis \n",
+ "1 Technopolis plans to develop in stages an area... sentiment_analysis \n",
+ "2 The international electronic industry company ... sentiment_analysis \n",
+ "3 With the new production plant the company woul... sentiment_analysis \n",
+ "4 According to the company 's updated strategy f... sentiment_analysis \n"
+ ]
+ }
+ ],
+ "source": [
+ "df = load_dataset(\"NickyNicky/Finance_sentiment_and_topic_classification_En\")\n",
+ "\n",
+ "# Converting 'train' split to a Pandas DataFrame\n",
+ "df = pd.DataFrame(df['train'])\n",
+ "\n",
+ "\n",
+ "print(df.head())\n",
+ "\n",
+ "\n",
+ "df.to_csv(\"train_data.csv\", index=False)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 10,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 206
+ },
+ "id": "wS-PmD5WWnYC",
+ "outputId": "36732946-2bb0-4f58-f784-5619d77698b9"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " answer \n",
+ " system_prompt \n",
+ " user_prompt \n",
+ " task_type \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " neutral \n",
+ " You are a financial sentiment analysis expert.... \n",
+ " According to Gran , the company has no plans t... \n",
+ " sentiment_analysis \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " neutral \n",
+ " You are a financial sentiment analysis expert.... \n",
+ " Technopolis plans to develop in stages an area... \n",
+ " sentiment_analysis \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " negative \n",
+ " You are a financial sentiment analysis expert.... \n",
+ " The international electronic industry company ... \n",
+ " sentiment_analysis \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " positive \n",
+ " You are a financial sentiment analysis expert.... \n",
+ " With the new production plant the company woul... \n",
+ " sentiment_analysis \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " positive \n",
+ " You are a financial sentiment analysis expert.... \n",
+ " According to the company 's updated strategy f... \n",
+ " sentiment_analysis \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " answer system_prompt \\\n",
+ "0 neutral You are a financial sentiment analysis expert.... \n",
+ "1 neutral You are a financial sentiment analysis expert.... \n",
+ "2 negative You are a financial sentiment analysis expert.... \n",
+ "3 positive You are a financial sentiment analysis expert.... \n",
+ "4 positive You are a financial sentiment analysis expert.... \n",
+ "\n",
+ " user_prompt task_type \n",
+ "0 According to Gran , the company has no plans t... sentiment_analysis \n",
+ "1 Technopolis plans to develop in stages an area... sentiment_analysis \n",
+ "2 The international electronic industry company ... sentiment_analysis \n",
+ "3 With the new production plant the company woul... sentiment_analysis \n",
+ "4 According to the company 's updated strategy f... sentiment_analysis "
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df.head()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 11,
+ "metadata": {
+ "id": "cQ3tjGFTW5kE"
+ },
+ "outputs": [],
+ "source": [
+ "df.drop(['system_prompt', 'task_type'], axis=1, inplace=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 12,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 423
+ },
+ "id": "Va5867ATXAxD",
+ "outputId": "c258f546-d8af-4ba5-8228-3a07f2283baf"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " answer \n",
+ " user_prompt \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 \n",
+ " neutral \n",
+ " According to Gran , the company has no plans t... \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " neutral \n",
+ " Technopolis plans to develop in stages an area... \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " negative \n",
+ " The international electronic industry company ... \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " positive \n",
+ " With the new production plant the company woul... \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " positive \n",
+ " According to the company 's updated strategy f... \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 61194 \n",
+ " Treasuries | Corporate Debt \n",
+ " KfW credit line for Uniper could be raised to ... \n",
+ " \n",
+ " \n",
+ " 61195 \n",
+ " Treasuries | Corporate Debt \n",
+ " KfW credit line for Uniper could be raised to ... \n",
+ " \n",
+ " \n",
+ " 61196 \n",
+ " Treasuries | Corporate Debt \n",
+ " Russian https://t.co/R0iPhyo5p7 sells 1 bln r... \n",
+ " \n",
+ " \n",
+ " 61197 \n",
+ " Treasuries | Corporate Debt \n",
+ " Global ESG bond issuance posts H1 dip as supra... \n",
+ " \n",
+ " \n",
+ " 61198 \n",
+ " Treasuries | Corporate Debt \n",
+ " Brazil's Petrobras says it signed a $1.25 bill... \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
61199 rows × 2 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " answer \\\n",
+ "0 neutral \n",
+ "1 neutral \n",
+ "2 negative \n",
+ "3 positive \n",
+ "4 positive \n",
+ "... ... \n",
+ "61194 Treasuries | Corporate Debt \n",
+ "61195 Treasuries | Corporate Debt \n",
+ "61196 Treasuries | Corporate Debt \n",
+ "61197 Treasuries | Corporate Debt \n",
+ "61198 Treasuries | Corporate Debt \n",
+ "\n",
+ " user_prompt \n",
+ "0 According to Gran , the company has no plans t... \n",
+ "1 Technopolis plans to develop in stages an area... \n",
+ "2 The international electronic industry company ... \n",
+ "3 With the new production plant the company woul... \n",
+ "4 According to the company 's updated strategy f... \n",
+ "... ... \n",
+ "61194 KfW credit line for Uniper could be raised to ... \n",
+ "61195 KfW credit line for Uniper could be raised to ... \n",
+ "61196 Russian https://t.co/R0iPhyo5p7 sells 1 bln r... \n",
+ "61197 Global ESG bond issuance posts H1 dip as supra... \n",
+ "61198 Brazil's Petrobras says it signed a $1.25 bill... \n",
+ "\n",
+ "[61199 rows x 2 columns]"
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "df"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 13,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "a2PtcHIfeM5t",
+ "outputId": "2214b201-c68d-4112-d224-855bd7103213"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "(39641, 2)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# only want to keep rows where 'answer' is 'neutral', 'positive', or 'negative'\n",
+ "df_filtered = df[df[\"answer\"].isin([\"neutral\", \"positive\", \"negative\"])]\n",
+ "\n",
+ "# Showing the shape of the new DataFrame\n",
+ "print(df_filtered.shape)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 14,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "OzmsDZ-tZuGA",
+ "outputId": "cb743649-521b-45da-8c9a-182fff7584bd"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "(5946, 2)\n"
+ ]
+ }
+ ],
+ "source": [
+ "df_sampled = df_filtered.sample(frac=0.15, random_state=42) # 15% sample\n",
+ "print(df_sampled.shape) # Checking new size\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 466
+ },
+ "id": "kkaxAfyQdcgZ",
+ "outputId": "1fa73eb8-c4ea-4b0b-8288-7dcb3c517798"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 15,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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AACA8QhEAADAeAQiAABgPAIRAAAwHoEIAAAYj0AEAACMRyACAADGIxABAADjEYgAAIDxCEQAAMB4BCIAAGA8AhEAADAegQgAABiPQAQAAIzn1kCUkpKinj17qnHjxgoODtbw4cOVl5fnUhMVFSWbzeayjB8/3qWmoKBAsbGxatiwoYKDgzVt2jRduHDBpSYzM1Pdu3eXr6+v2rdvr9TU1Os9PQAAcINwayDKyspSYmKiNm/erPT0dJ0/f16DBg3SqVOnXOrGjRunI0eOWMvcuXOtscrKSsXGxurcuXPatGmTFi1apNTUVM2cOdOqyc/PV2xsrO6//37l5uZq8uTJGjt2rFatWlVncwUAAJ6rnjsPvnLlSpf11NRUBQcHKycnR3379rW2N2zYUKGhoZfcx+rVq7V371599dVXCgkJ0R133KEXXnhBM2bM0OzZs+Xj46OFCxeqbdu2mjdvniQpIiJCGzZs0Ouvv67o6OiL9llRUaGKigprvaysrDamCwAAPJRHPUNUWloqSWratKnL9iVLlqh58+a6/fbblZycrNOnT1tj2dnZ6tKli0JCQqxt0dHRKisr0549e6yagQMHuuwzOjpa2dnZl+wjJSVFAQEB1hIeHl4r8wMAAJ7JrVeIfqiqqkqTJ0/Wvffeq9tvv93a/sgjj6h169YKCwvTzp07NWPGDOXl5enjjz+WJBUWFrqEIUnWemFh4WVrysrKdObMGfn5+bmMJScnKykpyVovKysjFAEAcBPzmECUmJio3bt3a8OGDS7bn3rqKevrLl26qEWLFhowYIAOHDigW2+99br04uvrK19f3+uybwAA4Hk84pbZhAkTtGLFCq1du1YtW7a8bG2vXr0kSd9++60kKTQ0VEVFRS411evVzx39VI3dbr/o6hAAADCPWwOR0+nUhAkT9Mknn2jNmjVq27btz74mNzdXktSiRQtJksPh0K5du1RcXGzVpKeny263KzIy0qrJyMhw2U96erocDkctzQQAANzI3BqIEhMT9b//+79aunSpGjdurMLCQhUWFurMmTOSpAMHDuiFF15QTk6ODh48qM8//1zx8fHq27evunbtKkkaNGiQIiMj9dhjj2nHjh1atWqVnnvuOSUmJlq3vcaPH6//+7//0/Tp0/XNN9/orbfe0kcffaQpU6a4be4AAMBzuDUQvf322yotLVVUVJRa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rl16+eWXL3nl8Z577tEbb7whu91u/aycOnXqRXVxcXFavny5ysvLrW2rVq3S6dOn9Ytf/EKSlJKSosWLF2vhwoXas2ePpkyZokcffVRZWVnX49tzY3ICP9KvXz/nfffd57KtZ8+ezhkzZjjXr1/vtNvtzrNnz7qM33rrrc4//elPTqfT6RwzZoxz2LBhLuPPPPOMs1+/fi7HeOaZZ1xq1q5d65Tk/PTTT3+2x86dOzsXLFhgrbdu3dr5+uuv//zk4PGu9fzr1auXMzEx0WX83nvvdXbr1u0nj1lZWels3Lixc/ny5dY2Sc5PPvnEpW7WrFku+3nmmWec/fv3t9ZXrVrl9PX1dZ44ccLpdDqdCQkJzqeeesplH+vXr3d6eXk5z5w585P9wLP169fPGRER4ayqqrK2zZgxwxkREeH817/+5ZTk3LhxozX23XffOf38/JwfffSR0+l0Ort06eKcPXv2Jfdd/XOw+hz64IMPnAEBARfV/fBn3vnz553Nmzd3Ll682BofPXq0c+TIkU6n0+k8e/ass2HDhs5Nmza57CMhIcE5evToq57/zYorRLikrl27uqy3aNFCxcXF2rFjh8rLy9WsWTPreQp/f3/l5+frwIEDtXLsu+66y2W9vLxcU6dOVUREhAIDA+Xv7699+/Zxhegmdi3nX15enu6++26X1/94vaioSOPGjdNtt92mgIAA2e12lZeXX/U5FRcXp8zMTB0+fFjS91enYmNjrYdgd+zYodTUVJdeo6OjVVVVpfz8/Ks6FjxL7969ZbPZrHWHw6H9+/dr7969qlevnnr16mWNNWvWTB07dtS+ffskSZMmTdKLL76oe++9V7NmzdLOnTuvqZd69erpV7/6lZYsWSJJOnXqlD777DPrSuW3336r06dP64EHHnA5FxcvXlxrP7dvBjytikuqX7++y7rNZlNVVZXKy8vVokULZWZmXvSa6l8CXl5e1r30atWXiq9Eo0aNXNanTp2q9PR0vfrqq2rfvr38/Pz00EMP6dy5c1e8T9xYruX8uxJjxozRsWPHNH/+fLVu3Vq+vr5yOBxXfU717NlTt956qz788EM9/fTT+uSTT5SammqNl5eX67//+781adKki17bqlWrqzoWbh5jx45VdHS00tLStHr1aqWkpGjevHmaOHFijfcZFxenfv36qbi4WOnp6fLz81NMTIwkWbfS0tLSdMstt7i8jr+V9v8QiHBVunfvrsLCQtWrV8960PTHgoKCtHv3bpdtubm5Lr/kfHx8VFlZeUXH3Lhxox5//HHrXnh5ebkOHjxYo/5xY7uS869jx47atm2b4uPjrW0/fgZo48aNeuuttzRkyBBJ0qFDh/Tdd9+51NSvX/+KztG4uDgtWbJELVu2lJeXl2JjY1363bt3r9q3b3+lU8QNYsuWLS7r1c+iRUZG6sKFC9qyZYvuueceSdKxY8eUl5enyMhIqz48PFzjx4/X+PHjlZycrHffffeSgehKf1bec889Cg8P17Jly/Tll1/q4Ycftn7mRkZGytfXVwUFBerXr9+1TPumxi0zXJWBAwfK4XBo+PDhWr16tQ4ePKhNmzbpN7/5jbZv3y5J6t+/v7Zv367Fixdr//79mjVr1kUBqU2bNtqyZYsOHjyo7777TlVVVT95zNtuu00ff/yxcnNztWPHDj3yyCOXrcfN60rOv4kTJ+rPf/6zFi1apP379+vFF1/Uzp07XW5v3HbbbfrLX/6iffv2acuWLYqLi5Ofn5/Lsdq0aaOMjAwVFhbqxIkTP9lTXFycvv76a7300kt66KGHXP7HPWPGDG3atEkTJkxQbm6u9u/fr88++4yHqm8CBQUFSkpKUl5env76179qwYIFeuaZZ3Tbbbdp2LBhGjdunDZs2KAdO3bo0Ucf1S233KJhw4ZJ+v5dt6tWrVJ+fr6+/vprrV27VhEREZc8Tps2bVReXq6MjAx99913On369E/29Mgjj2jhwoVKT0+3bpdJUuPGjTV16lRNmTJFixYt0oEDB/T1119rwYIFWrRoUe1+Y25gBCJcFZvNpi+++EJ9+/bVE088oQ4dOmjUqFH697//rZCQEElSdHS0nn/+eU2fPl09e/bUyZMnXf63Ln1/G8zb21uRkZEKCgq67LMbr732mpo0aaJ77rlHQ4cOVXR0tLp3735d5wnPdCXnX1xcnJKTkzV16lR1795d+fn5evzxx9WgQQNrP3/+85914sQJde/eXY899pgmTZqk4OBgl2PNmzdP6enpCg8P15133vmTPbVv31533323du7c6fJLSPr+WaisrCz961//Up8+fXTnnXdq5syZCgsLq8XvCtwhPj5eZ86c0d13363ExEQ988wz1gclfvDBB+rRo4cefPBBORwOOZ1OffHFF9YVm8rKSiUmJioiIkIxMTHq0KGD3nrrrUse55577tH48eM1cuRIBQUFae7cuT/ZU1xcnPbu3atbbrlF9957r8vYCy+8oOeff14pKSnWcdPS0tS2bdta+o7c+GzOHz/sAQA3mQceeEChoaH6y1/+4u5WcBOIiorSHXfcwZ/OuMnwDBGAm8rp06e1cOFCRUdHy9vbW3/961/11VdfWZ9jBACXQiACcFOpvq320ksv6ezZs+rYsaP+8Y9/aODAge5uDYAH45YZAAAwHg9VAwAA4xGIAACA8QhEAADAeAQiAABgPAIRAAAwHoEIAAAYj0AEAACMRyACgOussrKSP0gMeDgCEYAbwsqVK3XfffcpMDBQzZo104MPPqgDBw5Ikg4ePCibzaaPP/5Y999/vxo2bKhu3bopOzvbev2///1vDR06VE2aNFGjRo3UuXNnffHFF5Kku+66S6+++qpVO3z4cNWvX1/l5eWSpP/85z+y2Wz69ttvJUkVFRWaOnWqbrnlFjVq1Ei9evVSZmam9frU1FQFBgbq888/V2RkpHx9fS/7B4wBuB+BCMAN4dSpU0pKStL27duVkZEhLy8v/eIXv3C58vKb3/xGU6dOVW5urjp06KDRo0frwoULkqTExERVVFRo3bp12rVrl15++WX5+/tLkvr162cFGqfTqfXr1yswMFAbNmyQJGVlZemWW25R+/btJUkTJkxQdna2PvzwQ+3cuVMPP/ywYmJitH//fquX06dP6+WXX9Z7772nPXv2KDg4uC6+TQBqiD/dAeCG9N133ykoKEi7du2Sv7+/2rZtq/fee08JCQmSpL1796pz587at2+fOnXqpK5du2rEiBGaNWvWRftavny5HnvsMR07dky7d+9WTEyMRo4cqQYNGuj3v/+9xo0bp9OnT2vJkiUqKChQu3btVFBQoLCwMGsfAwcO1N13363f/e53Sk1N1RNPPKHc3Fx169atzr4nAGqOK0QAbgj79+/X6NGj1a5dO9ntdrVp00aSXG5Fde3a1fq6RYsWkqTi4mJJ0qRJk/Tiiy/q3nvv1axZs7Rz506rtk+fPjp58qT++c9/KisrS/369VNUVJR11SgrK0tRUVGSpF27dqmyslIdOnSQv7+/tWRlZVm38CTJx8fHpR8Ano2/dg/ghjB06FC1bt1a7777rsLCwlRVVaXbb79d586ds2rq169vfW2z2STJuqU2duxYRUdHKy0tTatXr1ZKSormzZuniRMnKjAwUN26dVNmZqays7P1wAMPqG/fvho5cqT+9a9/af/+/erXr58kqby8XN7e3srJyZG3t7dLj9W34CTJz8/P6gGA5+MKEQCPd+zYMeXl5em5557TgAEDFBERoRMnTlz1fsLDwzV+/Hh9/PHHevbZZ/Xuu+9aY/369dPatWu1bt06RUVFqWnTpoqIiNBLL72kFi1aqEOHDpKkO++8U5WVlSouLlb79u1dltDQ0FqbM4C6RSAC4PGaNGmiZs2a6Z133tG3336rNWvWKCkp6ar2MXnyZK1atUr5+fn6+uuvtXbtWkVERFjjUVFRWrVqlerVq6dOnTpZ25YsWWJdHZKkDh06KC4uTvHx8fr444+Vn5+vrVu3KiUlRWlpabUzYQB1jkAEwON5eXnpww8/VE5Ojm6//XZNmTJFr7zyylXto7KyUomJiYqIiFBMTIw6dOigt956yxrv06ePqqqqXMJPVFSUKisrreeHqn3wwQeKj4/Xs88+q44dO2r48OHatm2bWrVqdU3zBOA+vMsMAAAYjytEAADAeAQiAABgPAIRAAAwHoEIAAAYj0AEAACMRyACAADGIxABAADjEYgAAIDxCEQAAMB4BCIAAGA8AhEAADDe/weCiimbenEpXAAAAABJRU5ErkJggg==",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "sns.countplot(x=df_sampled[\"answer\"])"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 16,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "e2DP6ekqfNbe",
+ "outputId": "3aacbc50-8554-40eb-9cdb-c949c30d634e"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "answer\n",
+ "negative 1236\n",
+ "neutral 1236\n",
+ "positive 1236\n",
+ "Name: count, dtype: int64\n",
+ "(3708, 2)\n"
+ ]
+ },
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "/var/folders/xc/v1l81vkx6fjc9wpqc0tsnl400000gn/T/ipykernel_11468/1830774783.py:5: DeprecationWarning: DataFrameGroupBy.apply operated on the grouping columns. This behavior is deprecated, and in a future version of pandas the grouping columns will be excluded from the operation. Either pass `include_groups=False` to exclude the groupings or explicitly select the grouping columns after groupby to silence this warning.\n",
+ " df_balanced = df_sampled.groupby(\"answer\").apply(lambda x: x.sample(min_class_count, random_state=42)).reset_index(drop=True)\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Undersampling each class to match the class with the smallest number of samples\n",
+ "min_class_count = df_sampled[\"answer\"].value_counts().min()\n",
+ "\n",
+ "# Sampling an equal number of rows from each class\n",
+ "df_balanced = df_sampled.groupby(\"answer\").apply(lambda x: x.sample(min_class_count, random_state=42)).reset_index(drop=True)\n",
+ "\n",
+ "# Showing the new class distribution\n",
+ "print(df_balanced[\"answer\"].value_counts())\n",
+ "print(df_balanced.shape)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "id": "dJosNJACYDCc"
+ },
+ "outputs": [
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "593c0e8a5f6b4b9495ff422cc2382975",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "modules.json: 0%| | 0.00/349 [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "850ce1db88c64b81802f2a60f45801d4",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "config_sentence_transformers.json: 0%| | 0.00/116 [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "8cfd7d7217a24485818919eebbca3cb2",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "README.md: 0%| | 0.00/10.7k [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "6aa8a1f649ec471ebe07ee374e80de62",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "sentence_bert_config.json: 0%| | 0.00/53.0 [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "cb49e7e953654af8af5fd5d22f78ce59",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "config.json: 0%| | 0.00/612 [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "12bb5d1510b1422582f091a49fa617a0",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "model.safetensors: 0%| | 0.00/90.9M [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "b9632a0063044733bd70e443fce6caed",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "tokenizer_config.json: 0%| | 0.00/350 [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "5d345282cdd6400d8bc229280df8766e",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "vocab.txt: 0%| | 0.00/232k [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "0473d385d77c406a94075d701d4565e1",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "tokenizer.json: 0%| | 0.00/466k [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "643a5bf87437468e8a168e55687814d5",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "special_tokens_map.json: 0%| | 0.00/112 [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ },
+ {
+ "data": {
+ "application/vnd.jupyter.widget-view+json": {
+ "model_id": "4560c43f64884ba9b236962626a1f784",
+ "version_major": 2,
+ "version_minor": 0
+ },
+ "text/plain": [
+ "1_Pooling%2Fconfig.json: 0%| | 0.00/190 [00:00, ?B/s]"
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "# Load model\n",
+ "from sentence_transformers import SentenceTransformer # import the SentenceTransformer class\n",
+ "model = SentenceTransformer(\"all-MiniLM-L6-v2\")\n",
+ "\n",
+ "# Converting text to embeddings\n",
+ "X = model.encode(df_balanced[\"user_prompt\"].tolist(), convert_to_numpy=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 18,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "mH4_pI6YZa3E",
+ "outputId": "667d2b0f-a60a-4afd-e2aa-270ef9d5b8de"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Label Mapping: {'negative': 0, 'neutral': 1, 'positive': 2}\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.preprocessing import LabelEncoder\n",
+ "\n",
+ "# Encode labels\n",
+ "label_encoder = LabelEncoder()\n",
+ "y = label_encoder.fit_transform(df_balanced[\"answer\"])\n",
+ "\n",
+ "# Saving the mapping\n",
+ "label_mapping = dict(zip(label_encoder.classes_, label_encoder.transform(label_encoder.classes_)))\n",
+ "print(\"Label Mapping:\", label_mapping)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 19,
+ "metadata": {
+ "id": "I5gpynBmZe1h"
+ },
+ "outputs": [],
+ "source": [
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 20,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/",
+ "height": 80
+ },
+ "id": "jCUXUqgRgdeJ",
+ "outputId": "8e27311c-e799-4a89-f319-f7b6f4e07e75"
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "RandomForestClassifier(random_state=42) In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org. "
+ ],
+ "text/plain": [
+ "RandomForestClassifier(random_state=42)"
+ ]
+ },
+ "execution_count": 20,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "clf = RandomForestClassifier(n_estimators=100, random_state=42)\n",
+ "clf.fit(X_train, y_train)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " precision recall f1-score support\n",
+ "\n",
+ " 0 0.66 0.52 0.58 277\n",
+ " 1 0.62 0.80 0.70 237\n",
+ " 2 0.55 0.52 0.54 228\n",
+ "\n",
+ " accuracy 0.61 742\n",
+ " macro avg 0.61 0.61 0.61 742\n",
+ "weighted avg 0.61 0.61 0.60 742\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sentence_transformers import SentenceTransformer\n",
+ "from sklearn.ensemble import RandomForestClassifier\n",
+ "from sklearn.model_selection import train_test_split\n",
+ "from sklearn.preprocessing import LabelEncoder\n",
+ "from sklearn.metrics import classification_report\n",
+ "\n",
+ "# Load model (already done)\n",
+ "model = SentenceTransformer(\"all-MiniLM-L6-v2\")\n",
+ "\n",
+ "# Converting text to embeddings\n",
+ "X = model.encode(df_balanced[\"user_prompt\"].tolist(), convert_to_numpy=True)\n",
+ "\n",
+ "# Encode labels (already done)\n",
+ "label_encoder = LabelEncoder()\n",
+ "y = label_encoder.fit_transform(df_balanced[\"answer\"])\n",
+ "\n",
+ "# Train-test split (already done)\n",
+ "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
+ "\n",
+ "# Initialize and train RandomForestClassifier\n",
+ "clf = RandomForestClassifier(n_estimators=100, random_state=42)\n",
+ "clf.fit(X_train, y_train)\n",
+ "\n",
+ "# Make predictions on the test set\n",
+ "y_pred = clf.predict(X_test)\n",
+ "\n",
+ "# Print classification report to evaluate performance\n",
+ "print(classification_report(y_test, y_pred))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 35,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
+ "To disable this warning, you can either:\n",
+ "\t- Avoid using `tokenizers` before the fork if possible\n",
+ "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
+ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
+ "To disable this warning, you can either:\n",
+ "\t- Avoid using `tokenizers` before the fork if possible\n",
+ "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
+ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
+ "To disable this warning, you can either:\n",
+ "\t- Avoid using `tokenizers` before the fork if possible\n",
+ "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
+ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
+ "To disable this warning, you can either:\n",
+ "\t- Avoid using `tokenizers` before the fork if possible\n",
+ "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
+ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
+ "To disable this warning, you can either:\n",
+ "\t- Avoid using `tokenizers` before the fork if possible\n",
+ "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
+ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
+ "To disable this warning, you can either:\n",
+ "\t- Avoid using `tokenizers` before the fork if possible\n",
+ "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
+ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
+ "To disable this warning, you can either:\n",
+ "\t- Avoid using `tokenizers` before the fork if possible\n",
+ "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
+ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
+ "To disable this warning, you can either:\n",
+ "\t- Avoid using `tokenizers` before the fork if possible\n",
+ "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n",
+ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
+ "To disable this warning, you can either:\n",
+ "\t- Avoid using `tokenizers` before the fork if possible\n",
+ "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Best Parameters: {'max_depth': 20, 'min_samples_split': 5, 'n_estimators': 200}\n"
+ ]
+ }
+ ],
+ "source": [
+ "from sklearn.model_selection import GridSearchCV\n",
+ "\n",
+ "param_grid = {\n",
+ " 'n_estimators': [50, 100, 200],\n",
+ " 'max_depth': [10, 20, 30],\n",
+ " 'min_samples_split': [2, 5, 10]\n",
+ "}\n",
+ "\n",
+ "grid_search = GridSearchCV(estimator=clf, param_grid=param_grid, cv=3, n_jobs=-1)\n",
+ "grid_search.fit(X_train, y_train)\n",
+ "print(\"Best Parameters:\", grid_search.best_params_)\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Random Forest Hyperparameters:\n",
+ "Number of Estimators (n_estimators): 200\n",
+ "Max Depth (max_depth): 20\n",
+ "Min Samples Split (min_samples_split): 5\n",
+ "Min Samples Leaf (min_samples_leaf): 1\n",
+ "Random State (random_state): 42\n",
+ "Max Features (max_features): sqrt\n"
+ ]
+ }
+ ],
+ "source": [
+ "# Print the hyperparameters of the trained model\n",
+ "print(\"Random Forest Hyperparameters:\")\n",
+ "print(f\"Number of Estimators (n_estimators): {clf.n_estimators}\")\n",
+ "print(f\"Max Depth (max_depth): {clf.max_depth}\")\n",
+ "print(f\"Min Samples Split (min_samples_split): {clf.min_samples_split}\")\n",
+ "print(f\"Min Samples Leaf (min_samples_leaf): {clf.min_samples_leaf}\")\n",
+ "print(f\"Random State (random_state): {clf.random_state}\")\n",
+ "print(f\"Max Features (max_features): {clf.max_features}\")\n",
+ "\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "RandomForestClassifier(max_depth=20, min_samples_split=5, n_estimators=200,\n",
+ " random_state=42) In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org. "
+ ],
+ "text/plain": [
+ "RandomForestClassifier(max_depth=20, min_samples_split=5, n_estimators=200,\n",
+ " random_state=42)"
+ ]
+ },
+ "execution_count": 57,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "from sklearn.ensemble import RandomForestClassifier\n",
+ "\n",
+ "# Updated parameters based on your best values\n",
+ "clf = RandomForestClassifier(\n",
+ " n_estimators=200, # Set number of trees to 200\n",
+ " max_depth=20, # Set max depth to 20\n",
+ " min_samples_split=5, # Set min samples split to 5\n",
+ " random_state=42, # Keep random state for reproducibility\n",
+ " max_features='sqrt', # Default 'sqrt' for Random Forest (best practice)\n",
+ " min_samples_leaf=1 # Default value is 1, change if needed\n",
+ ")\n",
+ "\n",
+ "# Train the model with the new parameters\n",
+ "clf.fit(X_train, y_train)\n",
+ "\n",
+ "# You can now use clf for prediction and evaluation as usual\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ " precision recall f1-score support\n",
+ "\n",
+ " 0 0.66 0.52 0.58 277\n",
+ " 1 0.62 0.80 0.70 237\n",
+ " 2 0.55 0.52 0.54 228\n",
+ "\n",
+ " accuracy 0.61 742\n",
+ " macro avg 0.61 0.61 0.61 742\n",
+ "weighted avg 0.61 0.61 0.60 742\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "print(classification_report(y_test, y_pred))\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAokAAAIjCAYAAABvUIGpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB11klEQVR4nO3dd1xT1/sH8E/CCAgSZIMDEVHBvcWFg4pi3a0LK+5RN9Vaal04aK3bqri3dW+to7iqIu6NiIpiLeBARDaS+/vDH/kaLypBYoL5vPvK62XOvTn3ySWkD88591yJIAgCiIiIiIjeItV2AERERESke5gkEhEREZEIk0QiIiIiEmGSSEREREQiTBKJiIiISIRJIhERERGJMEkkIiIiIhEmiUREREQkwiSRiIiIiESYJOqpqKgotGjRAnK5HBKJBLt27SrQ/h88eACJRILVq1cXaL+FWZMmTdCkSZMC6y85ORn9+vWDg4MDJBIJRo4cWWB950evXr1QunRprcagrk/5mUgkEkyaNKlA4/lcVq9eDYlEggcPHmg7FK2ZNGkSJBKJ1o5//PhxSCQSHD9+XKV93bp1qFChAoyMjGBpaQmg4L87iPKKSaIW3bt3DwMHDkSZMmVgYmICCwsLNGjQAPPmzUNaWppGj+3v74/r169j2rRpWLduHWrVqqXR431OvXr1gkQigYWFRa7nMSoqChKJBBKJBDNnzlS7///++w+TJk3ClStXCiDa/Js+fTpWr16NwYMHY926dfjuu+80erzSpUsrz9u7j/T0dI0euzB7+vQpRowYgQoVKsDU1BR2dnaoU6cOxo4di+TkZI0ee/r06QX+B+DntGjRIrX/0ExPT8ecOXNQt25dyOVymJiYoFy5chg6dCju3LmjmUALyO3bt9GrVy+4urpi2bJlWLp0qbZDIj1nqO0A9NX+/fvx7bffQiaToWfPnqhUqRIyMzNx6tQpjBkzBjdv3tTYF0RaWhrCwsIwbtw4DB06VCPHcHZ2RlpaGoyMjDTS/8cYGhoiNTUVe/fuRefOnVW2bdiwASYmJvlObP777z9MnjwZpUuXRrVq1fL8usOHD+freO9z9OhR1KtXDxMnTizQfj+kWrVq+OGHH0TtxsbGWLZsGRQKxWeLpSAU9M/kXQkJCahVqxaSkpLQp08fVKhQAc+fP8e1a9ewePFiDB48GObm5ho7/vTp0/HNN9+gffv2Ku3fffcdunbtCplMprFjF4RFixbBxsYGvXr1ytP+z549Q8uWLXHx4kV8/fXX6N69O8zNzREZGYlNmzZh6dKlyMzM1GzQedS4cWOkpaXB2NhY2Xb8+HEoFArMmzcPZcuWVbZr+nNK9D5MErUgOjoaXbt2hbOzM44ePQpHR0fltiFDhuDu3bvYv3+/xo7/9OlTAFAOZWiCRCKBiYmJxvr/GJlMhgYNGuDPP/8UJYkbN25E69atsX379s8SS2pqKooUKaLyP4OC8OTJE3h4eBRYf69fv4ZCofhgnMWLF0ePHj1y3SaVFr6BiYL+mbxrxYoViImJwenTp1G/fn2VbUlJSRo//vsYGBjAwMBAK8fWpF69euHy5cvYtm0bOnXqpLJtypQpGDdunJYiE5NKpaLvyCdPngAQfzcX5OdEoVAgMzNTq9/PVIgI9NkNGjRIACCcPn06T/tnZWUJQUFBQpkyZQRjY2PB2dlZCAwMFNLT01X2c3Z2Flq3bi38888/Qu3atQWZTCa4uLgIa9asUe4zceJEAYDKw9nZWRAEQfD391f++205r3nb4cOHhQYNGghyuVwwMzMTypUrJwQGBiq3R0dHCwCEVatWqbwuNDRUaNiwoVCkSBFBLpcLbdu2FW7dupXr8aKiogR/f39BLpcLFhYWQq9evYSUlJSPni9/f3/BzMxMWL16tSCTyYQXL14ot507d04AIGzfvl0AIPz+++/Kbc+fPxd++OEHoVKlSoKZmZlQtGhRoWXLlsKVK1eU+xw7dkx0/t5+n15eXkLFihWFCxcuCI0aNRJMTU2FESNGKLd5eXkp++rZs6cgk8lE779FixaCpaWl8Pjx41zf3/tiiI6OFgRBEOLj44U+ffoIdnZ2gkwmE6pUqSKsXr1apY+cn8/vv/8uzJkzRyhTpowglUqFy5cvv/e85ny+3ufdz8/bx1iyZIny81urVi3h3LlzKq+9evWq4O/vL7i4uAgymUywt7cXevfuLTx79kxlP3U/G+vWrRNq164tmJqaCpaWlkKjRo2EQ4cOKbe/+zPJyMgQxo8fL9SoUUOwsLAQihQpIjRs2FA4evSoqG8AwsSJE997PgRBEAYOHCgYGBgI2dnZH9wvx9mzZwUfHx/BwsJCMDU1FRo3biycOnUqX+cgt8+Iv7+/IAiCsGrVKpXPjCD87+d77NgxoWbNmoKJiYlQqVIl4dixY4IgCML27duFSpUqCTKZTKhRo4Zw6dIlUfwRERFCp06dhGLFigkymUyoWbOmsHv3bpV9co596tQpYdSoUYKNjY1QpEgRoX379sKTJ09U4nk3/rd/VrmdOwBC//7983Suc/teW7lypdC0aVPB1tZWMDY2Ftzd3YVFixaJXnv+/HmhRYsWgrW1tWBiYiKULl1a6N27t8o+f/75p1CjRg3B3NxcKFq0qFCpUiVh7ty5yu05v8c55ze395vz+Xr3cyoIgpCeni5MmDBBcHV1FYyNjYUSJUoIY8aMEf1/AYAwZMgQYf369YKHh4dgaGgo7Ny5M0/niIiVRC3Yu3cvypQpI6osvE+/fv2wZs0afPPNN/jhhx8QHh6O4OBgREREYOfOnSr73r17F9988w369u0Lf39/rFy5Er169ULNmjVRsWJFdOzYEZaWlhg1ahS6desGX19ftYe7bt68ia+//hpVqlRBUFAQZDIZ7t69i9OnT3/wdX///TdatWqFMmXKYNKkSUhLS8OCBQvQoEEDXLp0SXTRQ+fOneHi4oLg4GBcunQJy5cvh52dHX777bc8xdmxY0cMGjQIO3bsQJ8+fQC8qSJWqFABNWrUEO1///597Nq1C99++y1cXFwQHx+PJUuWwMvLC7du3YKTkxPc3d0RFBSECRMmYMCAAWjUqBEAqPwsnz9/jlatWqFr167o0aMH7O3tc41v3rx5OHr0KPz9/REWFgYDAwMsWbIEhw8fxrp16+Dk5JTr69zd3bFu3TqMGjUKJUqUUA7/2traIi0tDU2aNMHdu3cxdOhQuLi4YOvWrejVqxcSExMxYsQIlb5WrVqF9PR0DBgwADKZDFZWVh88p1lZWXj27JlKW5EiRVCkSJH3vmbjxo149eoVBg4cCIlEghkzZqBjx464f/++cjrCkSNHcP/+ffTu3RsODg7K6RY3b97E2bNnRRcY5OWzMXnyZEyaNAn169dHUFAQjI2NER4ejqNHj6JFixa5xpqUlITly5ejW7du6N+/P169eoUVK1bAx8cH586dU2t6AfBm2kV2djbWrVsHf3//D+579OhRtGrVCjVr1sTEiRMhlUqxatUqNGvWDP/88w/q1Kmj1jlYt24d+vXrhzp16mDAgAEAAFdX1w/GcPfuXXTv3h0DBw5Ejx49MHPmTLRp0wYhISH4+eef8f333wMAgoOD0blzZ0RGRioryDdv3kSDBg1QvHhx/PTTTzAzM8OWLVvQvn17bN++HR06dFA51rBhw1CsWDFMnDgRDx48wNy5czF06FBs3rwZADB37lwMGzYM5ubmygrg+36XAGDPnj0A8ElzcxcvXoyKFSuibdu2MDQ0xN69e/H9999DoVBgyJAhAN5U+1q0aAFbW1v89NNPsLS0xIMHD7Bjxw5lP0eOHEG3bt3QvHlz5c8jIiICp0+fFv0O5pg7dy7Wrl2LnTt3YvHixTA3N0eVKlVy3VehUKBt27Y4deoUBgwYAHd3d1y/fh1z5szBnTt3RPNQjx49ii1btmDo0KGwsbEpdBeYkRZpO0vVNy9fvhQACO3atcvT/leuXBEACP369VNpHz16tABApcKR85foyZMnlW1PnjwRZDKZ8MMPPyjb3q7wvC2vlcQ5c+YIAISnT5++N+7cKonVqlUT7OzshOfPnyvbrl69KkilUqFnz56i4/Xp00elzw4dOgjW1tbvPebb78PMzEwQBEH45ptvhObNmwuCIAjZ2dmCg4ODMHny5FzPQXp6uqjiEx0dLchkMiEoKEjZdv78+VyrpILw5i9+AEJISEiu296tBhw6dEgAIEydOlW4f/++YG5uLrRv3/6j71EQcq/szZ07VwAgrF+/XtmWmZkpeHp6Cubm5kJSUpLyfQEQLCwsVKo3HzsecqlO5VQ73ldJtLa2FhISEpTtu3fvFgAIe/fuVbalpqaKjvfnn3+KPs95/WxERUUJUqlU6NChg+hnqlAolP9+92fy+vVrISMjQ2X/Fy9eCPb29qJjvv3e3ycuLk6wtbUVAAgVKlQQBg0aJGzcuFFITEwUxeTm5ib4+PioxJeamiq4uLgIX331ldrnQBAEwczMTFk9fNv7KokAhDNnzijbcj6fpqamwsOHD5XtS5YsUamCCYIgNG/eXKhcubJKJUuhUAj169cX3NzcRMf29vZWea+jRo0SDAwMVM5NxYoVP1g9fPf9A1AZOfiQ3CqJuX0OfXx8hDJlyiif79y5UwAgnD9//r19jxgxQrCwsBBev3793n3erSS+HdO7363vfk7XrVsnSKVS4Z9//lHZLyQkRDRKBUCQSqXCzZs33xsL0fsUvklEhVxSUhIAoGjRonna/8CBAwCAgIAAlfac6tG7cxc9PDyU1S3gTXWpfPnyuH//fr5jflfOfJndu3fn+UKF2NhYXLlyBb169VKpVlWpUgVfffWV8n2+bdCgQSrPGzVqhOfPnyvPYV50794dx48fR1xcHI4ePYq4uDh07949131lMpmyKpKdnY3nz5/D3Nwc5cuXx6VLl/J8TJlMht69e+dp3xYtWmDgwIEICgpCx44dYWJigiVLluT5WO86cOAAHBwc0K1bN2WbkZERhg8fjuTkZJw4cUJl/06dOsHW1jbP/detWxdHjhxRefTs2fODr+nSpQuKFSumfJ7z+Xz7M2lqaqr8d3p6Op49e4Z69eoBQK7n/mOfjV27dkGhUGDChAmiuZIfWvbEwMBAOf9LoVAgISEBr1+/Rq1atdT6DOSwt7fH1atXMWjQILx48QIhISHo3r077OzsMGXKFAiCAAC4cuUKoqKi0L17dzx//hzPnj3Ds2fPkJKSgubNm+PkyZOi37WC+P14l4eHBzw9PZXP69atCwBo1qwZSpUqJWrP+RkmJCTg6NGj6Ny5M169eqWM//nz5/Dx8UFUVBQeP36scqwBAwao/CwaNWqE7OxsPHz4MF+xq/vdmpu3P4cvX77Es2fP4OXlhfv37+Ply5cA/vf9t2/fPmRlZeXaj6WlJVJSUnDkyJF8x/IhW7duhbu7OypUqKA818+ePUOzZs0AAMeOHVPZ38vLq0DnL5P+YJL4mVlYWAAAXr16laf9Hz58CKlUqnKlGwA4ODjA0tJS9IX69hd5jmLFiuHFixf5jFisS5cuaNCgAfr16wd7e3t07doVW7Zs+WDCmBNn+fLlRdvc3d2V/0N827vvJSfRUOe9+Pr6omjRoti8eTM2bNiA2rVri85lDoVCgTlz5sDNzQ0ymQw2NjawtbXFtWvXlP+DyIvixYurNdF85syZsLKywpUrVzB//nzY2dnl+bXvevjwIdzc3ESJkbu7u3L721xcXNTq38bGBt7e3iqPMmXKfPA1efk5JiQkYMSIEbC3t4epqSlsbW2VseV27j/W57179yCVSvP1P8Y1a9agSpUqMDExgbW1NWxtbbF//361PgNvc3R0xOLFixEbG4vIyEjMnz8ftra2mDBhAlasWAHgzbJMwJulqWxtbVUey5cvR0ZGhuj4BfH78a53+5TL5QCAkiVL5tqec6y7d+9CEASMHz9eFH/O1fc5F2VoKn51v1tzc/r0aXh7e8PMzAyWlpawtbXFzz//DOB/n0MvLy906tQJkydPho2NDdq1a4dVq1YhIyND2c/333+PcuXKoVWrVihRogT69OmDgwcP5juud0VFReHmzZuic12uXDkA4nOt7u85UQ7OSfzMLCws4OTkhBs3bqj1urwu+vq+KxZzKhb5OUZ2drbKc1NTU5w8eRLHjh3D/v37cfDgQWzevBnNmjXD4cOHC+yqyU95LzlkMhk6duyINWvW4P79+x9c/Hj69OkYP348+vTpgylTpsDKygpSqRQjR45Ua2mXt6sReXH58mXll/r169dVqoCapm6s+ZGXn2Pnzp1x5swZjBkzBtWqVYO5uTkUCgVatmyZ67kviM9GbtavX49evXqhffv2GDNmDOzs7GBgYIDg4GDcu3fvk/qWSCQoV64cypUrh9atW8PNzQ0bNmxAv379lO/x999/f++8x3fnDmviHLyvz48dKyf+0aNHw8fHJ9d93/3jrKDjr1ChAoA3v0Nvj6bk1b1799C8eXNUqFABs2fPRsmSJWFsbIwDBw5gzpw5yvcokUiwbds2nD17Fnv37sWhQ4fQp08fzJo1C2fPnoW5uTns7Oxw5coVHDp0CH/99Rf++usvrFq1Cj179sSaNWvy9f7eplAoULlyZcyePTvX7e8m9Z/j95y+TEwSteDrr7/G0qVLERYWpjK0kxtnZ2coFApERUUpq0EAEB8fj8TERDg7OxdYXMWKFUNiYqKoPbfhH6lUiubNm6N58+aYPXs2pk+fjnHjxuHYsWPw9vbO9X0AQGRkpGjb7du3YWNjAzMzs09/E7no3r07Vq5cCalUiq5du753v23btqFp06bK6k6OxMRE2NjYKJ8X5F0aUlJS0Lt3b3h4eKB+/fqYMWMGOnTogNq1a+erP2dnZ1y7dg0KhUKlmnj79m3ldl3z4sULhIaGYvLkyZgwYYKyPae6lh+urq5QKBS4deuWWhebbNu2DWXKlMGOHTtUfs4FvRZlmTJlUKxYMcTGxirjBd78EZnb709+fa47iuRUk42MjLQWf5s2bRAcHIz169fnK0ncu3cvMjIysGfPHpUq57tDtznq1auHevXqYdq0adi4cSP8/PywadMm9OvXD8CbZWvatGmDNm3aQKFQ4Pvvv8eSJUswfvz4945m5JWrqyuuXr2K5s2ba/WuMfTl43CzFvz4448wMzNDv379EB8fL9p+7949zJs3D8Cb4VLgzZVvb8v5C7J169YFFperqytevnyJa9euKdtiY2NFV1AnJCSIXpvzP+K3h1ze5ujoiGrVqmHNmjUqieiNGzdw+PBh5fvUhKZNm2LKlCn4448/4ODg8N79DAwMRFWMrVu3iuZS5SSzuSXU6ho7dixiYmKwZs0azJ49G6VLl4a/v/97z+PH+Pr6Ii4uTnmFKPBm/cMFCxbA3NwcXl5enxxzQcupKL177t/9zKujffv2kEqlCAoKElUiP1Spyi2W8PBwhIWF5SuO8PBw0TQKADh37hyeP3+unH5Rs2ZNuLq6YubMmbnehSVnbVN1mZmZFcjn9GPs7OzQpEkTLFmyRJn4vu1zxO/p6YmWLVti+fLlud5lJjMzE6NHj37v63P72b98+RKrVq1S2e/Fixeiz9C733/Pnz9X2S6VSpVXKuf3d/ttnTt3xuPHj7Fs2TLRtrS0tFw/c0T5wUqiFri6umLjxo3o0qUL3N3dVe64cubMGeWSJQBQtWpV+Pv7Y+nSpUhMTISXlxfOnTuHNWvWoH379mjatGmBxdW1a1eMHTsWHTp0wPDhw5GamorFixejXLlyKpP2g4KCcPLkSbRu3RrOzs548uQJFi1ahBIlSqBhw4bv7f/3339Hq1at4Onpib59+yqXwJHL5Rq9B65UKsUvv/zy0f2+/vprBAUFoXfv3qhfvz6uX7+ODRs2iObcubq6wtLSEiEhIShatCjMzMxQt25dtef9HD16FIsWLcLEiROVS/KsWrUKTZo0wfjx4zFjxgy1+gPeXAywZMkS9OrVCxcvXkTp0qWxbds2nD59GnPnzv2kSf2aYmFhgcaNG2PGjBnIyspC8eLFcfjwYURHR+e7z7Jly2LcuHGYMmUKGjVqhI4dO0Imk+H8+fNwcnJCcHBwrq/7+uuvsWPHDnTo0AGtW7dGdHQ0QkJC4OHhka9b6K1btw4bNmxAhw4dULNmTRgbGyMiIgIrV66EiYmJcr6bVCrF8uXL0apVK1SsWBG9e/dG8eLF8fjxYxw7dgwWFhbYu3ev2sevWbMm/v77b8yePRtOTk5wcXFRXnRS0BYuXIiGDRuicuXK6N+/P8qUKYP4+HiEhYXh33//xdWrV9Xus2bNmli8eDGmTp2KsmXLws7OTnlxRm7Wrl2LFi1aoGPHjmjTpg2aN28OMzMzREVFYdOmTYiNjX3vrThbtGihrP4NHDgQycnJWLZsGezs7FQS3zVr1mDRokXo0KEDXF1d8erVKyxbtgwWFhbKP3b79euHhIQENGvWDCVKlMDDhw+xYMECVKtWTWVEKL++++47bNmyBYMGDcKxY8fQoEEDZGdn4/bt29iyZQsOHTr0Rd1qlbSHSaKWtG3bFteuXcPvv/+O3bt3Y/HixZDJZKhSpQpmzZqF/v37K/ddvnw5ypQpg9WrV2Pnzp1wcHBAYGBggQ+BWVtbY+fOnQgICMCPP/6oXIMtKipKJUls27YtHjx4gJUrV+LZs2ewsbGBl5cXJk+erJzQnhtvb28cPHgQEydOxIQJE2BkZAQvLy/89ttvOjGx+ueff0ZKSgo2btyIzZs3o0aNGti/fz9++uknlf2MjIywZs0aBAYGYtCgQXj9+jVWrVql1nt49eoV+vTpg+rVq6vcBaJRo0YYMWIEZs2ahY4dOyqv8M0rU1NTHD9+HD/99BPWrFmDpKQklC9fHqtWrcrzrc20YePGjRg2bBgWLlwIQRDQokUL/PXXX+9dKzIvgoKC4OLiggULFmDcuHEoUqQIqlSp8sF19Hr16oW4uDgsWbIEhw4dgoeHB9avX4+tW7fi+PHjascwcOBAFClSBKGhodi9ezeSkpJga2uLFi1aIDAwENWrV1fu26RJE4SFhSmr3snJyXBwcEDdunUxcODA/JwCzJ49GwMGDMAvv/yCtLQ0+Pv7ayxJ9PDwwIULFzB58mSsXr0az58/h52dHapXr64yjUAdEyZMwMOHDzFjxgy8evUKXl5eH0wSbW1tcebMGSxatAibN2/GuHHjkJmZCWdnZ7Rt2/a9axQCby6q27ZtG3755ReMHj0aDg4OGDx4MGxtbZXrrAJQ/qG+adMmxMfHQy6Xo06dOtiwYYPyO6BHjx5YunQpFi1ahMTERDg4OKBLly6YNGlSgdyZSCqVYteuXZgzZ45ybcUiRYqgTJkyGDFihPICFqJPJRE+daY3EREREX1xOCeRiIiIiESYJBIRERGRCJNEIiIiIhJhkkhEREREIkwSiYiIiEiESSIRERERiTBJJCIiIiKRL3Ix7cazT2s7BCKRuR0razsEIhVhj8W32CTSpiENSmvt2KbVh2qs77TLf2isb01iJZGIiIiIRL7ISiIRERGRWiSsm72LSSIRERGRRKLtCHQO02YiIiIiEmElkYiIiIjDzSI8I0REREQkwkoiEREREeckirCSSEREREQirCQSERERcU6iCM8IEREREYmwkkhERETEOYkiTBKJiIiIONwswjNCRERERCKsJBIRERFxuFmElUQiIiIiEmElkYiIiIhzEkV4RoiIiIhIhJVEIiIiIs5JFGElkYiIiIhEWEkkIiIi4pxEESaJRERERBxuFmHaTEREREQirCQSERERcbhZhGeEiIiIiERYSSQiIiJiJVGEZ4SIiIhIh5w8eRJt2rSBk5MTJBIJdu3apbI9OTkZQ4cORYkSJWBqagoPDw+EhISo7JOeno4hQ4bA2toa5ubm6NSpE+Lj49WKg0kiERERkVSiuYeaUlJSULVqVSxcuDDX7QEBATh48CDWr1+PiIgIjBw5EkOHDsWePXuU+4waNQp79+7F1q1bceLECfz333/o2LGjWnFwuJmIiIhIh7Rq1QqtWrV67/YzZ87A398fTZo0AQAMGDAAS5Yswblz59C2bVu8fPkSK1aswMaNG9GsWTMAwKpVq+Du7o6zZ8+iXr16eYqDlUQiIiIiiVRjj4yMDCQlJak8MjIy8h1q/fr1sWfPHjx+/BiCIODYsWO4c+cOWrRoAQC4ePEisrKy4O3trXxNhQoVUKpUKYSFheX5OEwSiYiIiCQSjT2Cg4Mhl8tVHsHBwfkOdcGCBfDw8ECJEiVgbGyMli1bYuHChWjcuDEAIC4uDsbGxrC0tFR5nb29PeLi4vJ8HA43ExEREWlQYGAgAgICVNpkMlm++1uwYAHOnj2LPXv2wNnZGSdPnsSQIUPg5OSkUj38VEwSiYiIiDS4BI5MJvukpPBtaWlp+Pnnn7Fz5060bt0aAFClShVcuXIFM2fOhLe3NxwcHJCZmYnExESVamJ8fDwcHBzyfCwONxMREREVEllZWcjKyoJUqprCGRgYQKFQAABq1qwJIyMjhIaGKrdHRkYiJiYGnp6eeT4WK4lEREREEvWXqtGU5ORk3L17V/k8OjoaV65cgZWVFUqVKgUvLy+MGTMGpqamcHZ2xokTJ7B27VrMnj0bACCXy9G3b18EBATAysoKFhYWGDZsGDw9PfN8ZTPAJJGIiIhIp1y4cAFNmzZVPs+Zz+jv74/Vq1dj06ZNCAwMhJ+fHxISEuDs7Ixp06Zh0KBBytfMmTMHUqkUnTp1QkZGBnx8fLBo0SK14pAIgiAUzFvSHY1nn9Z2CEQicztW1nYIRCrCHidoOwQiFUMalNbasU1b/K6xvtMOj9FY35rEOYlEREREJMLhZiIiIiIdmpOoK5gkEhEREWlwCZzCimeEiIiIiERYSSQiIiLicLMIK4lEREREJMJKIhERERHnJIrwjBARERGRCCuJRERERJyTKMJKIhERERGJsJJIRERExDmJIkwSiYiIiJgkivCMEBEREZGITiWJmZmZiIyMxOvXr7UdChEREekTiURzj0JKJ5LE1NRU9O3bF0WKFEHFihURExMDABg2bBh+/fVXLUdHREREpH90IkkMDAzE1atXcfz4cZiYmCjbvb29sXnzZi1GRkRERHpBItXco5DSiQtXdu3ahc2bN6NevXqQvFWWrVixIu7du6fFyIiIiIj0k04kiU+fPoWdnZ2oPSUlRSVpJCIiItII5hsiOlEDrVWrFvbv3698npMYLl++HJ6entoKi4iIiEhv6UQlcfr06WjVqhVu3bqF169fY968ebh16xbOnDmDEydOaDs8IiIi+tIV4rmDmqITZ6Rhw4a4cuUKXr9+jcqVK+Pw4cOws7NDWFgYatasqe3wiIiI6EvHJXBEdKKSCACurq5YtmyZtsMgIiIiIuhIJdHb2xurV69GUlKStkMhIiIiPSSRSDT2KKx0IkmsWLEiAgMD4eDggG+//Ra7d+9GVlaWtsMiIiIi0ls6kSTOmzcPjx8/xq5du2BmZoaePXvC3t4eAwYM4IUrREREpHGsJIrpRJIIAFKpFC1atMDq1asRHx+PJUuW4Ny5c2jWrJm2QyMiIiLSOzpz4UqOuLg4bNq0CevXr8e1a9dQp04dbYdEREREX7rCW/DTGJ2oJCYlJWHVqlX46quvULJkSSxevBht27ZFVFQUzp49q+3wiIiIiPSOTlQS7e3tUaxYMXTp0gXBwcGoVauWtkMiIiIiPVKY5w5qik4kiXv27EHz5s0hlepEYZOIiIj0DJNEMZ1IEr/66itth0BEREREb9FaklijRg2EhoaiWLFiqF69+gcz+EuXLn3GyIiIiEjfsJIoprUksV27dpDJZMp/84dDREREpDu0liROnDhR+e9JkyZpKwwiIiIiFqtyoRNzEsuUKYPz58/D2tpapT0xMRE1atTA/fv3tRTZl6dqcQt0rVUc5e3NYWNujJ93R+DUvQTl9t6eJdGsvA3sisrwOltAZHwylp1+iIi4ZOU+RU0MMbJpGdQvUwwKATh59znmH7uPtCyFNt4SfYG2rVuK7euXqbQ5lXDGrBXbAACJCc+wYfl8XL8UjvTUVDiWdEb7rn1QtxEX3yfNUCiyEb5rPSLPhiLl5QuYWVrDo8FXqN2muzK5SH35Aqe3rUDMjYvISEuBU7lKaOI3BJb2xbUcPVH+6ESS+ODBA2RnZ4vaMzIy8O+//2ohoi+XiZEU956m4MDNeExr6y7a/uhFGuYevY//XqZDZihF5xrFMatTRXRbeREv014DAMa3KgdrMyMEbL8JQ6kEgT5uGP1VWUw5cOdzvx36gpVwLoNxvy5UPpca/O/ratHvk5Ca/AqjJ81GUbkcp48dwrzpgZi2YC1cypbXRrj0hbt4YAuuH9+Hr/qOhnVxZ8Q/iMLfK2bB2NQM1b5qD0EQsO+PyZAaGODr4ZNgbFIElw/vwM6ZP6HH1GUwkplo+y3Qx7CQKKLVJHHPnj3Kfx86dAhyuVz5PDs7G6GhoXBxcdFGaF+s8AeJCH+Q+N7tf99+pvL8jxPR+LqyPVxtzHDp0Us4W5minksx9N9wFZHxb6qLc4/dx4wOHlh04gGep2RqMnzSIwYGBrC0ssl1251b19B32E8oW6EiAKBj9774a8efiI6KYJJIGhF79xbKVPOES9W6AAALGwfcCT+G+OhIAEBi/GPE3YuA35QlsC5eGgDQ9LthWD6qKyLDj6FS41baCp0o37SaJLZv3x7Am3kA/v7+KtuMjIxQunRpzJo1SwuREQAYSiVoW9ker9Jf497TFABARceieJX+WpkgAsDFh4lQCICHozn+uZvwvu6I1BL3+BEGd2sFY2NjuLlXRtc+Q2Fj5wAAKOdRBWEnjqB6nQYoYl4UZ0/+jazMDHhUqanlqOlL5VjWAzdO/IUXcf+imEMJPI25h/+ibqJRl4EAgOzXWQAAAyNj5WskUikMDI0QG3WTSWIhwDmJYlpNEhWKN3PYXFxccP78edjY5F41oM/L06UYJrYuDxMjKZ6nZOKH7TfxMv3NULOVmTFepGap7J8tAK/Ss2BVxDi37ojUVrZCRQwaPRGOJZyRmPAM29cvw+Qf+mPGkk0wLWKGEeOCMX/6z+j/rTcMDAxgLDNBwMTf4VC8pLZDpy9ULd8uyExLxbpx/SCVSqFQKODZsRcqeL6ZB1vMoSSKWtvhzLaVaOY/AkYyE1w+vAPJL54hJZF/PFPhpBNzEqOjo/P92oyMDGRkZKi0KV5nQmrIhCW/Lj96ib7rr0Buaog2lR0w+evyGLjxGhLTsj7+YqICUK12A+W/ncu4oWyFShj2XRucPfk3mrZshy1rQpCS/Arjfl2IohaWOB92AvOmBWLirGUo5VJWi5HTlyrq/ElEnj2KlgN+glVxZzyNuYd//gyBuaU13Bt8BQNDQ7QeMgF/r5qNpcO+gUQqRUmP6nCuXBsQBG2HT3nASqKYTiSJAJCSkoITJ04gJiYGmZmq89qGDx/+3tcFBwdj8uTJKm2lWvSGs09fjcSpD9JfK/A4MR2PE4FbsXexsXcNtK5khw3nHyMhJRPFihip7G8gAYqaGCEhlfMRSTPMzIvCsUQpxP33CPH//YvDe7ZgxpJNKFnaFQDg7FoOkdcv4/Cereg3IlDL0dKX6NSWZajp2wXl6jYBANiUcMGr509wYf8muDd4c9cwu9Ju6D55MTJSU5D9OgtFLCyxecpw2JUup8XIKa+YJIrpRJJ4+fJl+Pr6IjU1FSkpKbCyssKzZ89QpEgR2NnZfTBJDAwMREBAgEqbb8hFTYesVyQSwNjwzX21b8a+QlETQ5SzM8OdJ2/mKdYoZQmpBLgVm/yhbojyLT0tFfH/PUaj5jbIyEgHANG93qUGBhAELsNEmvE6MwMSqWoSIZFKIeRSJZQVMQPw5mKWJw+iUK+Dv2gfosJAJ5LEUaNGoU2bNggJCYFcLsfZs2dhZGSEHj16YMSIER98rUwmU965JQeHmt/P1EiK4pamyueOchOUtTVDUnoWktJe47u6JXD6fgKeJ2dBbmqIDtUcYWMuw7E7b656fpiQhrPRL/DjV2UxK/QeDKQSjGxWBqGRz3hlMxWY9Uvnoka9RrC1c8SL50+xdd1SSA2kqN/EB0XMi8LBqSSWzwuGX/8RKGohx/kzx3H9UjjGBM3Rduj0hXKpVg/n921CUSs7WBd3xtOH93D50A5UbNRCuU/U+ZMwLSpHUSs7PHscjZMbQ1CmhiecK/GCqsKAlUQxiZDbn0GfmaWlJcLDw1G+fHlYWloiLCwM7u7uCA8Ph7+/P27fvq1Wf41nn9ZQpIVftRIWmN+5sqj9r5vxmPX3PUzwLQ93R3PITYyQlP4at+NeYW34v7gd/85i2s3KoEEZKygEASeiuJh2XsztKD7vlLv5039GxPXLSH71EhbyYihfsSq69Poe9k4lAACxj2OwacUfuH3zKjLSUmHvVBJff9MDjbx9tRx54RL2mBdU5FVmWirO7lyDe5fPIDUpEWaW1ihftwnqtPWDgeGbKThXjuzCpYNb/3+7FSp4eqNO2+7K7fRxQxqU1tqxrXv+qbG+n6/tptb+J0+exO+//46LFy8iNjYWO3fuVK4IkyMiIgJjx47FiRMn8Pr1a3h4eGD79u0oVaoUACA9PR0//PADNm3ahIyMDPj4+GDRokWwt7fPcxw6kSTa2trizJkzcHNzQ7ly5bBgwQL4+Pjg9u3bqFmzJlJSUtTqj0ki6SImiaRrmCSSrtFqkuivwSRxjXpJ4l9//YXTp0+jZs2a6NixoyhJvHfvHurUqYO+ffuiW7dusLCwwM2bN1GvXj3Y2dkBAAYPHoz9+/dj9erVkMvlGDp0KKRSKU6fznuOpBPDzdWrV8f58+fh5uYGLy8vTJgwAc+ePcO6detQqVIlbYdHRERE9Nm0atUKrVq9f23NcePGwdfXFzNmzFC2ubq6Kv/98uVLrFixAhs3bkSzZm+WaVq1ahXc3d1x9uxZ1KtXL09xSD++i+ZNnz4djo6OAIBp06ahWLFiGDx4MJ4+fYqlS5dqOToiIiL60kkkEo09MjIykJSUpPJ4d/m+vFIoFNi/fz/KlSsHHx8f2NnZoW7duti1a5dyn4sXLyIrKwve3t7KtgoVKqBUqVIICwvL87F0IkmsVasWmjZtCgCws7PDwYMHkZSUhIsXL6Jq1apajo6IiIgo/4KDgyGXy1UewcHB+erryZMnSE5Oxq+//oqWLVvi8OHD6NChAzp27IgTJ04AAOLi4mBsbAxLS0uV19rb2yMuLi7Px9KJ4WYiIiIibdLk1c25Ldf37soseZVzt7p27dph1KhRAIBq1arhzJkzCAkJgZeX16cF+xadSBKrV6+e6w9HIpHAxMQEZcuWRa9evZTVRiIiIqKCpMkkMbfl+vLLxsYGhoaG8PDwUGl3d3fHqVOnAAAODg7IzMxEYmKiSjUxPj4eDg4OeT6WTgw3t2zZEvfv34eZmRmaNm2Kpk2bwtzcHPfu3UPt2rURGxsLb29v7N69W9uhEhEREWmNsbExateujcjISJX2O3fuwNnZGQBQs2ZNGBkZITQ0VLk9MjISMTEx8PT0zPOxdKKS+OzZM/zwww8YP368SvvUqVPx8OFDHD58GBMnTsSUKVPQrl07LUVJREREXywdWks7OTkZd+/eVT6Pjo7GlStXYGVlhVKlSmHMmDHo0qULGjdujKZNm+LgwYPYu3cvjh8/DgCQy+Xo27cvAgICYGVlBQsLCwwbNgyenp55vrIZ0JF1EuVyOS5evIiyZcuqtN+9exc1a9bEy5cvcfv2bdSuXRuvXr36aH9cJ5F0EddJJF3DdRJJ12hznUS7vls01veTFZ3V2v/48eO5TrHz9/fH6tWrAQArV65EcHAw/v33X5QvXx6TJ09WKaTlLKb9559/qiymrc5ws05UEk1MTHDmzBlRknjmzBmYmJgAeDNRM+ffRERERAVJl27L16RJk1zvC/62Pn36oE+fPu/dbmJigoULF2LhwoX5jkMnksRhw4Zh0KBBuHjxImrXrg0AOH/+PJYvX46ff/4ZAHDo0CFUq1ZNi1ESERER6Q+dSBJ/+eUXuLi44I8//sC6desAAOXLl8eyZcvQvXt3AMCgQYMwePBgbYZJREREXyhdqiTqCp1IEgHAz88Pfn5+791uamr6GaMhIiIi0m86sQQOACQmJiqHlxMS3kymvnTpEh4/fqzlyIiIiOhLp8nb8hVWOlFJvHbtGry9vSGXy/HgwQP069cPVlZW2LFjB2JiYrB27Vpth0hERERfsMKczGmKTlQSAwIC0KtXL0RFRalcwezr64uTJ09qMTIiIiIi/aQTlcTz589jyZIlovbixYurdSNqIiIionxhIVFEJyqJMpkMSUlJovY7d+7A1tZWCxERERER6TedSBLbtm2LoKAgZGVlAXgzLyAmJgZjx45Fp06dtBwdERERfel44YqYTiSJs2bNQnJyMuzs7JCWlgYvLy+ULVsW5ubmmDZtmrbDIyIiItI7OjEnUS6X48iRIzh9+jSuXr2K5ORk1KhRA97e3toOjYiIiPRAYa74aYpOJIkAEBoaitDQUDx58gQKhQK3b9/Gxo0bAby5iTURERERfT46kSROnjwZQUFBqFWrFhwdHZnNExER0WfF3ENMJ5LEkJAQrF69Gt999522QyEiIiJ9xBxRRCcuXMnMzET9+vW1HQYRERER/T+dSBL79eunnH9IRERE9LlxCRwxnRhuTk9Px9KlS/H333+jSpUqMDIyUtk+e/ZsLUVGREREpJ90Ikm8du0aqlWrBgC4ceOGyrbCnIETERFR4cB8Q0wnksRjx45pOwQiIiIieotOJIlERERE2sRKophOXLhCRERERLqFlUQiIiLSe6wkijFJJCIiImKOKMLhZiIiIiISYSWRiIiI9B6Hm8VYSSQiIiIiEVYSiYiISO+xkijGSiIRERERibCSSERERHqPhUQxVhKJiIiISISVRCIiItJ7nJMoxiSRiIiI9B5zRDEONxMRERGRCCuJREREpPc43CzGSiIRERERibCSSERERHqPhUQxVhKJiIiISISVRCIiItJ7UilLie9iJZGIiIiIRFhJJCIiIr3HOYliTBKJiIhI73EJHDEONxMRERGRCCuJREREpPdYSBRjJZGIiIhIh5w8eRJt2rSBk5MTJBIJdu3a9d59Bw0aBIlEgrlz56q0JyQkwM/PDxYWFrC0tETfvn2RnJysVhxMEomIiEjvSSQSjT3UlZKSgqpVq2LhwoUf3G/nzp04e/YsnJycRNv8/Pxw8+ZNHDlyBPv27cPJkycxYMAAteLgcDMRERGRDmnVqhVatWr1wX0eP36MYcOG4dChQ2jdurXKtoiICBw8eBDnz59HrVq1AAALFiyAr68vZs6cmWtSmRtWEomIiEjvabKSmJGRgaSkJJVHRkZGvmNVKBT47rvvMGbMGFSsWFG0PSwsDJaWlsoEEQC8vb0hlUoRHh6e5+MwSSQiIiLSoODgYMjlcpVHcHBwvvv77bffYGhoiOHDh+e6PS4uDnZ2dipthoaGsLKyQlxcXJ6Pw+FmIiIi0nuavLo5MDAQAQEBKm0ymSxffV28eBHz5s3DpUuXNL62I5NEIiIi0nuaTLhkMlm+k8J3/fPPP3jy5AlKlSqlbMvOzsYPP/yAuXPn4sGDB3BwcMCTJ09UXvf69WskJCTAwcEhz8dikkhERERUSHz33Xfw9vZWafPx8cF3332H3r17AwA8PT2RmJiIixcvombNmgCAo0ePQqFQoG7dunk+FpNEIiIi0nu6tJh2cnIy7t69q3weHR2NK1euwMrKCqVKlYK1tbXK/kZGRnBwcED58uUBAO7u7mjZsiX69++PkJAQZGVlYejQoejatWuer2wGeOEKERERkU65cOECqlevjurVqwMAAgICUL16dUyYMCHPfWzYsAEVKlRA8+bN4evri4YNG2Lp0qVqxcFKIhEREek9TV8Eoo4mTZpAEIQ87//gwQNRm5WVFTZu3PhJcbCSSEREREQirCQSERGR3tOhQqLOYCWRiIiIiERYSSQiIiK9p0tzEnUFK4lEREREJMJKIhEREek9FhLFmCQSERGR3uNwsxiHm4mIiIhIhJVEIiIi0nssJIp9kUni4eENtB0CkUix2kO1HQKRiidn52s7BCLSYV9kkkhERESkDs5JFOOcRCIiIiISYSWRiIiI9B4LiWKsJBIRERGRCCuJREREpPc4J1GMSSIRERHpPeaIYhxuJiIiIiIRVhKJiIhI73G4WYyVRCIiIiISYSWRiIiI9B4riWKsJBIRERGRCCuJREREpPdYSBRjJZGIiIiIRFhJJCIiIr3HOYliTBKJiIhI7zFHFONwMxERERGJsJJIREREeo/DzWKsJBIRERGRCCuJREREpPdYSBRjJZGIiIiIRFhJJCIiIr0nZSlRhJVEIiIiIhJhJZGIiIj0HguJYkwSiYiISO9xCRwxDjcTERERkQgriURERKT3pCwkirCSSEREREQirCQSERGR3uOcRDFWEomIiIhIhJVEIiIi0nssJIqxkkhEREREIqwkEhERkd6TgKXEdzFJJCIiIr3HJXDEONxMRERERCJMEomIiEjvSSQSjT3UdfLkSbRp0wZOTk6QSCTYtWuXcltWVhbGjh2LypUrw8zMDE5OTujZsyf+++8/lT4SEhLg5+cHCwsLWFpaom/fvkhOTlYrDiaJRERERDokJSUFVatWxcKFC0XbUlNTcenSJYwfPx6XLl3Cjh07EBkZibZt26rs5+fnh5s3b+LIkSPYt28fTp48iQEDBqgVB+ckEhERkd7TpSVwWrVqhVatWuW6TS6X48iRIyptf/zxB+rUqYOYmBiUKlUKEREROHjwIM6fP49atWoBABYsWABfX1/MnDkTTk5OeYqDlUQiIiIiDcrIyEBSUpLKIyMjo8D6f/nyJSQSCSwtLQEAYWFhsLS0VCaIAODt7Q2pVIrw8PA898skkYiIiPSeVCLR2CM4OBhyuVzlERwcXCBxp6enY+zYsejWrRssLCwAAHFxcbCzs1PZz9DQEFZWVoiLi8tz3xxuJiIiItKgwMBABAQEqLTJZLJP7jcrKwudO3eGIAhYvHjxJ/f3LiaJREREpPc0OSdRJpMVSFL4tpwE8eHDhzh69KiyiggADg4OePLkicr+r1+/RkJCAhwcHPJ8DA43ExERkd7TpSVwPiYnQYyKisLff/8Na2trle2enp5ITEzExYsXlW1Hjx6FQqFA3bp183ycPFUSr127lucOq1Spkud9iYiIiEhVcnIy7t69q3weHR2NK1euwMrKCo6Ojvjmm29w6dIl7Nu3D9nZ2cp5hlZWVjA2Noa7uztatmyJ/v37IyQkBFlZWRg6dCi6du2a5yubAUAiCILwsZ2kUikkEgnet2vONolEguzs7DwfXFPSX2s7AiKxYrWHajsEIhVPzs7XdghEKorKtDfA+e3qSxrre2uvGmrtf/z4cTRt2lTU7u/vj0mTJsHFxSXX1x07dgxNmjQB8GYx7aFDh2Lv3r2QSqXo1KkT5s+fD3Nz8zzHkadKYnR0dJ47JCIiIqL8a9KkyXsLcwA+uC2HlZUVNm7c+Elx5ClJdHZ2/qSDEBEREekyqS6tpq0j8lXXXbduHRo0aAAnJyc8fPgQADB37lzs3r27QIMjIiIiIu1QO0lcvHgxAgIC4Ovri8TEROUcREtLS8ydO7eg4yMiIiLSOIkGH4WV2kniggULsGzZMowbNw4GBgbK9lq1auH69esFGhwRERERaYfai2lHR0ejevXqonaZTIaUlJQCCYqIiIjoc9LEeoaFndqVRBcXF1y5ckXUfvDgQbi7uxdETERERESflVSiuUdhpXYlMSAgAEOGDEF6ejoEQcC5c+fw559/Ijg4GMuXL9dEjERERET0mamdJPbr1w+mpqb45ZdfkJqaiu7du8PJyQnz5s1D165dNREjERERkUZxuFlM7SQRAPz8/ODn54fU1FQkJyfDzs6uoOMiIiIiIi3KV5IIAE+ePEFkZCSAN9m3ra1tgQVFRERE9DmxkCimdpL46tUrfP/99/jzzz+hUCgAAAYGBujSpQsWLlwIuVyep37mz8/7PUOHDx+ubphERERE9AnyNSfx8uXL2L9/Pzw9PQEAYWFhGDFiBAYOHIhNmzblqZ85c+bkaT+JRMIkkYiIiDSKcxLF1E4S9+3bh0OHDqFhw4bKNh8fHyxbtgwtW7bMcz/R0dHqHpqIiIiIPhO1k0Rra+tch5TlcjmKFStWIEERERERfU6FeT1DTVE7Sfzll18QEBCAdevWwcHBAQAQFxeHMWPGYPz48fkO5N9//8WePXsQExODzMxMlW2zZ8/Od79EREREH8PhZrE8JYnVq1dXOXlRUVEoVaoUSpUqBQCIiYmBTCbD06dPMXDgQLWDCA0NRdu2bVGmTBncvn0blSpVwoMHDyAIAmrUqKF2f0RERET0afKUJLZv316jQQQGBmL06NGYPHkyihYtiu3bt8POzg5+fn5qzXMkIiIiyg/WEcXylCROnDhRo0FERETgzz//fBOQoSHS0tJgbm6OoKAgtGvXDoMHD9bo8YmIiIhIlVTbAQCAmZmZch6io6Mj7t27p9z27NkzbYVFREREekIqkWjsUVipfeFKdnY25syZgy1btuR6kUlCQoLaQdSrVw+nTp2Cu7s7fH198cMPP+D69evYsWMH6tWrp3Z/RERERPRp1K4kTp48GbNnz0aXLl3w8uVLBAQEoGPHjpBKpZg0aVK+gpg9ezbq1q2r7L958+bYvHkzSpcujRUrVuSrTyIiIqK8kkg09yis1K4kbtiwAcuWLUPr1q0xadIkdOvWDa6urqhSpQrOnj2r9t1RsrOz8e+//6JKlSoA3gw9h4SEqBsWERERERUgtSuJcXFxqFy5MgDA3NwcL1++BAB8/fXX2L9/v9oBGBgYoEWLFnjx4oXaryUiIiIqCBKJRGOPwkrtJLFEiRKIjY0FALi6uuLw4cMAgPPnz0Mmk+UriEqVKuH+/fv5ei0RERERFTy1k8QOHTogNDQUADBs2DCMHz8ebm5u6NmzJ/r06ZOvIKZOnYrRo0dj3759iI2NRVJSksqDiIiISJM4J1FMIgiC8CkdnD17FmfOnIGbmxvatGmTrz6k0v/lqm+XZQVBgEQiQXZ2tlr9pb/OVxh6acWyJQg9chjR0fchMzFBtWrVMTJgNEq7lFHus23LZvx1YB8ibt1ESkoK/gk7DwsLCy1GXTgVqz1U2yHorAY1XDGqpzdqeJSCo60cnUctxd7j15Tb7ayKYuqIdvD2dIfc3BSnLt1FwIytuBfzVLlPn44N0KVVLVSrUAIW5qZwaDQGL5PTtPF2Co0nZ+drO4RCY9XypTgWegQPou9DJjNBlWrVMWzkDyjt4qLcZ0Cfnrh04bzK6zp+2wU/j5/0maMtvIrKtLcy3+DttzTW9+JOHhrrW5PUvnDlXfXq1UO9evXw5MkTTJ8+HT///LPafRw7duxTw6B8unD+HLp080PFypWR/TobC+bNxqD+fbFjz34UKVIEAJCenob6DRqhfoNGmD93lpYjpi+RmakM1+88xtrdYdg8e4Bo+5Y5A5D1OhvfjlyCpJR0DO/RDAdChqF6x6lITX+zDFcREyMcOXMLR87cwpTh7T73W6Av3KUL5/Ft1+7wqFgJ2dnZWDh/DoYO6outO/fB9P+/KwGgQ6dvMXDIMOVzExNTbYRLVCA+OUnMERsbi/Hjx+crSXRxcUHJkiVFkzsFQcCjR48KKkTKxeKlqksMBU37FU0beSLi1k3UrFUbANCjZy8AwPlz4Z87PNITh0/fwuHTuf8VX7aUHepWcUGNTlMRcT8OADB8+mY8+Hs6OreqidU7wwAAf2w8DgBoVNPts8RM+mVByDKV55OmBOOrJg0Qcesmavz/dyUAmJiYwMbG9nOHRwWgMA8La4pO3HHFxcUFT58+FbUnJCTA5a1SPmle8qtXAAALuVzLkRC9ITN+87dseub/5pEIgoDMzNeoX81VW2GRnktOzv278q8D+9C8sSc6d2iDP+bNRnoapzxQ4VVglcRPkTP38F3JyckwMTHRQkT6SaFQYMZv01Gteg24uZXTdjhEAIDIB3GIiU3AlGFtMXTqn0hJy8TwHk1RwqEYHGz4xwx9fgqFArNmBKNq9Roo+9Z3ZUvfr+Ho6ARbWztERUViwZxZePggGr/PWaDFaCmvCvNSNZqi1SQxICAAwJsfzPjx45Vz4IA3i2yHh4ejWrVqH+wjIyMDGRkZKm2CgSzfy/Hos+lTJ+NeVBRWr9uo7VCIlF6/VqDrD8uweKIfYk/+jtevs3E0PBIHT93k8BBpxW/TgnDvbhSWr96g0t7xm87Kf5ctVw42NrYY3L83/n0UgxIlS33uMIk+WZ6TxJyE7n1yGy7+mMuXLwN4U0m8fv06jI2NlduMjY1RtWpVjB49+oN9BAcHY/LkySpt48ZPxC8TJqkdjz6bPjUIJ08cx8o162Hv4KDtcIhUXI54hHpdf4WFuQmMjQzx7EUyTq4djYu3YrQdGumZ36ZPwamTJ7B01bqPfldWqvzmTmKPYpgkFgY6Mf9Ox+Q5ScxJ6D6kcePGah0856rm3r17Y968eflaViUwMFCUwAoGrCLmlSAICJ42BUdDj2DF6nUoUaKktkMieq+k5HQAgGspW9TwKIXJi/ZpOSLSF4IgYEbwVBw/+jeWrFiD4iVKfPQ1kZG3AQA2tryQhQqnPCeJmlymZtWqVfl+rUwmHlrmOol5N33KZPx1YB/mLlgEsyJmePb/FWHzokWV80GfPX2KZ8+e4VHMm6rN3ag7KFLEDI6OjpBbWmordPqCmJkaw7Xk//5HWrq4NaqUK44XSal4FPcCHb2r4+mLZDyKS0AlNyfMHPMN9h6/htCzt5WvsbcuCntrC7iWsgEAVHJzwquUdDyKe4EXSamf/T3Rl+W3aUE4+Nd+zJr3B4qYmeHZs///rjR/813576MYHDywDw0aeUEut0TUnUjM/v1X1KhZC27lyms5esoLzkkU++TFtAtCs2bNPrj96NGjavXHJDHvqlbM/csraGow2nXoCABYvHABQhb98cF96OO4mPb7NarphsPLR4ja1+05iwET1+P7bl4Y1dMbdtZFEfcsCRv2hSN46UFkvf7fQvvjBvril0G+oj76T1iH9Xu5fFNuuJh23tWq4p5r+8Qp09GmXQfExcViQuCPuHc3CmlpabB3cECTZt7oO2AwzM3NP3O0hZc2F9Meufv2x3fKp7ntKmisb03SiSRx1KhRKs+zsrJw5coV3LhxA/7+/pg3b55a/TFJJF3EJJF0DZNE0jVMEnWLTiyBM2fOnFzbJ02ahOTk5M8cDREREekbKUebRXT6Yp4ePXpg5cqV2g6DiIiISO/oRCXxfcLCwriYNhEREWkcL1wRy1eS+M8//2DJkiW4d+8etm3bhuLFi2PdunVwcXFBw4YN1e6vY0fVix8EQUBsbCwuXLiA8ePH5ydEIiIiIvoEag83b9++HT4+PjA1NcXly5eVdzt5+fIlpk+fnq8g5HK5ysPKygpNmjTBgQMHMHHixHz1SURERJRXUonmHoWV2pXEqVOnIiQkBD179sSmTZuU7Q0aNMDUqVPzFcSnrJNIRERERAVP7UpiZGRkrndWkcvlSExMzHcgiYmJWL58OQIDA5GQkAAAuHTpEh4/fpzvPomIiIjyQiLR3KOwUjtJdHBwwN27d0Xtp06dQpkyZfIVxLVr1+Dm5obffvsNM2fOVCabO3bsQGBgYL76JCIiIsorqUSisYe6Tp48iTZt2sDJyQkSiQS7du1S2S4IAiZMmABHR0eYmprC29sbUVFRKvskJCTAz88PFhYWsLS0RN++fdVeVlDtJLF///4YMWIEwsPDIZFI8N9//2HDhg0YPXo0Bg8erG53AICAgAD07t0bUVFRKlcz+/r64uTJk/nqk4iIiKgwSklJQdWqVbFw4cJct8+YMQPz589HSEgIwsPDYWZmBh8fH6Snpyv38fPzw82bN3HkyBHs27cPJ0+exIABA9SKQ+05iT/99BMUCgWaN2+O1NRUNG7cGDKZDKNHj8awYcPU7Q4AcP78eSxZskTUXrx4ccTFxeWrTyIiIqK80qWFo1u1aoVWrVrluk0QBMydOxe//PIL2rVrBwBYu3Yt7O3tsWvXLnTt2hURERE4ePAgzp8/j1q1agEAFixYAF9fX8ycORNOTk55ikPtcyKRSDBu3DgkJCTgxo0bOHv2LJ4+fYopU6ao25WSTCZDUlKSqP3OnTuwtbXNd79ERERE2paRkYGkpCSVR87qMOqKjo5GXFwcvL29lW1yuRx169ZFWFgYgDfrTFtaWioTRADw9vaGVCpFeHje72Wf78TZ2NgYHh4eqFOnziffvLxt27YICgpCVlYWgDeJaExMDMaOHYtOnTp9Ut9EREREH6PJC1eCg4NFy/0FBwfnK86cEVZ7e3uVdnt7e+W2uLg42NnZqWw3NDSElZWVWiO0ag83N23a9IOrkh89elTdLjFr1ix88803sLOzQ1paGry8vBAXF4d69eph2rRpavdHREREpCsCAwMREBCg0iaTybQUTd6pnSRWq1ZN5XlWVhauXLmCGzduwN/fP19ByOVyHDlyBKdPn8bVq1eRnJyMGjVqqJRSiYiIiDQlP1ch55VMJiuwpNDBwQEAEB8fD0dHR2V7fHy8MkdzcHDAkydPVF73+vVrJCQkKF+fF2oniXPmzMm1fdKkSWpfWv220NBQhIaG4smTJ1AoFLh9+zY2btwIAFi5cmW++yUiIiL6Uri4uMDBwQGhoaHKpDApKQnh4eHKVWY8PT2RmJiIixcvombNmgDejPQqFArUrVs3z8fK172bc9OjRw/UqVMHM2fOVPu1kydPRlBQEGrVqgVHR0feZJuIiIg+K11KPZKTk1XWpI6OjsaVK1dgZWWFUqVKYeTIkZg6dSrc3Nzg4uKC8ePHw8nJCe3btwcAuLu7o2XLlujfvz9CQkKQlZWFoUOHomvXrnm+shkowCQxLCxMZY1DdYSEhGD16tX47rvvCiocIiIiojzTpXssX7hwAU2bNlU+z5nP6O/vj9WrV+PHH39ESkoKBgwYgMTERDRs2BAHDx5UycM2bNiAoUOHonnz5pBKpejUqRPmz5+vVhxqJ4kdO3ZUeS4IAmJjY3HhwgWMHz9e3e4AAJmZmahfv36+XktERET0JWnSpAkEQXjvdolEgqCgIAQFBb13HysrK+W0vfxSewmcdy/htrKyQpMmTXDgwAFMnDgxX0H069fvk98IERERUX7p0m35dIValcTs7Gz07t0blStXRrFixQosiPT0dCxduhR///03qlSpAiMjI5Xts2fPLrBjEREREdHHqZUkGhgYoEWLFoiIiCjQJPHatWvKK3Ru3Lihso0XsRAREZGmMd0QU3tOYqVKlXD//n24uLgUWBDHjh0rsL6IiIiI6NOpPSdx6tSpGD16NPbt24fY2FjRvQiJiIiIChupRHOPwirPlcSgoCD88MMP8PX1BfDmfstvDwULggCJRILs7OyCj5KIiIiIPqs8J4mTJ0/GoEGDODRMREREXxwJCnHJT0PynCTmrNfj5eWlsWCIiIiItKEwDwtrilpzEnmlMREREZF+UOvq5nLlyn00UUxISPikgIiIiIg+N1YSxdRKEidPngy5XK6pWIiIiIhIR6iVJHbt2hV2dnaaioWIiIhIKzilTizPcxJ58oiIiIj0h9pXNxMRERF9aTgnUSzPSaJCodBkHERERESkQ9S+dzMRERHRl4az6sSYJBIREZHekzJLFFFrMW0iIiIi0g+sJBIREZHe44UrYqwkEhEREZEIK4lERESk9zglUYyVRCIiIiISYSWRiIiI9J4ULCW+i5VEIiIiIhJhJZGIiIj0HuckijFJJCIiIr3HJXDEONxMRERERCKsJBIREZHe4235xFhJJCIiIiIRVhKJiIhI77GQKMZKIhERERGJsJJIREREeo9zEsVYSSQiIiIiEVYSiYiISO+xkCjGJJGIiIj0HodWxXhOiIiIiEiElUQiIiLSexKON4uwkkhEREREIqwkEhERkd5jHVGMlUQiIiIiEmElkYiIiPQeF9MWYyWRiIiIiERYSSQiIiK9xzqiGCuJREREpPckEs091JGdnY3x48fDxcUFpqamcHV1xZQpUyAIgnIfQRAwYcIEODo6wtTUFN7e3oiKiirgM8IkkYiIiEhn/Pbbb1i8eDH++OMPRERE4LfffsOMGTOwYMEC5T4zZszA/PnzERISgvDwcJiZmcHHxwfp6ekFGguHm4mIiEjv6cpi2mfOnEG7du3QunVrAEDp0qXx559/4ty5cwDeVBHnzp2LX375Be3atQMArF27Fvb29ti1axe6du1aYLGwkkhERESkQRkZGUhKSlJ5ZGRk5Lpv/fr1ERoaijt37gAArl69ilOnTqFVq1YAgOjoaMTFxcHb21v5Grlcjrp16yIsLKxA42aSSERERHpPqsFHcHAw5HK5yiM4ODjXOH766Sd07doVFSpUgJGREapXr46RI0fCz88PABAXFwcAsLe3V3mdvb29cltB4XAzERERkQYFBgYiICBApU0mk+W675YtW7BhwwZs3LgRFStWxJUrVzBy5Eg4OTnB39//c4SrxCSRiIiI9J4m5yTKZLL3JoXvGjNmjLKaCACVK1fGw4cPERwcDH9/fzg4OAAA4uPj4ejoqHxdfHw8qlWrVqBxc7iZiIiISEekpqZCKlVNzwwMDKBQKAAALi4ucHBwQGhoqHJ7UlISwsPD4enpWaCxsJJIREREek83rm0G2rRpg2nTpqFUqVKoWLEiLl++jNmzZ6NPnz4A3lQ8R44cialTp8LNzQ0uLi4YP348nJyc0L59+wKNhUkiERERkY5YsGABxo8fj++//x5PnjyBk5MTBg4ciAkTJij3+fHHH5GSkoIBAwYgMTERDRs2xMGDB2FiYlKgsUiEt5fw/kKkv9Z2BERixWoP1XYIRCqenJ2v7RCIVBSVaW8W3LarsRrr+5uqjh/fSQd9kZXER8/TtB0CkcjpXdO1HQKRim9WnNd2CEQqDn1fV2vH5kUaYjwnRERERCTyRVYSiYiIiNShK7fl0yWsJBIRERGRCCuJREREpPdYRxRjJZGIiIiIRFhJJCIiIr3HKYlirCQSERERkQgriURERKT3pJyVKMIkkYiIiPQeh5vFONxMRERERCKsJBIREZHek3C4WYSVRCIiIiISYSWRiIiI9B7nJIqxkkhEREREIqwkEhERkd7jEjhirCQSERERkQgriURERKT3OCdRjEkiERER6T0miWIcbiYiIiIiEVYSiYiISO9xMW0xVhKJiIiISISVRCIiItJ7UhYSRVhJJCIiIiIRVhKJiIhI73FOohgriUREREQkwkoiERER6T2ukyjGJJGIiIj0HoebxTjcTEREREQirCQSERGR3uMSOGKsJBIRERGRCCuJREREpPc4J1GMlUQiIiIiEmElkYiIiPQel8ARYyWRiIiIiERYSSQiIiK9x0Ki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",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "import matplotlib.pyplot as plt\n",
+ "import seaborn as sns\n",
+ "from sklearn.metrics import confusion_matrix\n",
+ "\n",
+ "# Generate predictions on the test data\n",
+ "y_pred = clf.predict(X_test)\n",
+ "\n",
+ "# Create the confusion matrix\n",
+ "cm = confusion_matrix(y_test, y_pred)\n",
+ "\n",
+ "# Plot the confusion matrix\n",
+ "plt.figure(figsize=(8, 6))\n",
+ "sns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\", xticklabels=label_encoder.classes_, yticklabels=label_encoder.classes_)\n",
+ "plt.title(\"Confusion Matrix for Financial Sentiment Classifier\")\n",
+ "plt.xlabel(\"Predicted Label\")\n",
+ "plt.ylabel(\"True Label\")\n",
+ "plt.show()\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 41,
+ "metadata": {
+ "colab": {
+ "base_uri": "https://localhost:8080/"
+ },
+ "id": "v8DE8aAzg4jQ",
+ "outputId": "5ce78149-c53b-45f3-994f-5f6c7d21b819"
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Predicted Label: neutral\n"
+ ]
+ }
+ ],
+ "source": [
+ "new_texts = [\"The company is doing OK\"]\n",
+ "new_embeddings = model.encode(new_texts, convert_to_numpy=True)\n",
+ "predicted_label = clf.predict(new_embeddings)\n",
+ "\n",
+ "# Convert back to original label names\n",
+ "decoded_label = label_encoder.inverse_transform(predicted_label)\n",
+ "print(\"Predicted Label:\", decoded_label[0])\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "['random_forest_classifier.pkl']"
+ ]
+ },
+ "execution_count": 49,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "# Save SBERT model\n",
+ "\n",
+ "\n",
+ "# Save RandomForest model\n",
+ "import joblib\n",
+ "joblib.dump(clf, \"random_forest_classifier.pkl\") # Save the trained classifier model\n"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stderr",
+ "output_type": "stream",
+ "text": [
+ "huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\n",
+ "To disable this warning, you can either:\n",
+ "\t- Avoid using `tokenizers` before the fork if possible\n",
+ "\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n"
+ ]
+ },
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Requirement already satisfied: transformers in /opt/anaconda3/lib/python3.12/site-packages (4.45.2)\n",
+ "Requirement already satisfied: datasets in /opt/anaconda3/lib/python3.12/site-packages (3.1.0)\n",
+ "Requirement already satisfied: huggingface_hub in /opt/anaconda3/lib/python3.12/site-packages (0.26.2)\n",
+ "Requirement already satisfied: filelock in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (3.13.1)\n",
+ "Requirement already satisfied: numpy>=1.17 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (2.0.2)\n",
+ "Requirement already satisfied: packaging>=20.0 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (24.2)\n",
+ "Requirement already satisfied: pyyaml>=5.1 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (6.0.1)\n",
+ "Requirement already satisfied: regex!=2019.12.17 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (2023.10.3)\n",
+ "Requirement already satisfied: requests in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (2.32.3)\n",
+ "Requirement already satisfied: safetensors>=0.4.1 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (0.4.5)\n",
+ "Requirement already satisfied: tokenizers<0.21,>=0.20 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (0.20.3)\n",
+ "Requirement already satisfied: tqdm>=4.27 in /opt/anaconda3/lib/python3.12/site-packages (from transformers) (4.66.4)\n",
+ "Requirement already satisfied: pyarrow>=15.0.0 in /opt/anaconda3/lib/python3.12/site-packages (from datasets) (17.0.0)\n",
+ "Requirement already satisfied: dill<0.3.9,>=0.3.0 in /opt/anaconda3/lib/python3.12/site-packages (from datasets) (0.3.8)\n",
+ "Requirement already satisfied: pandas in /opt/anaconda3/lib/python3.12/site-packages (from datasets) (2.2.3)\n",
+ "Requirement already satisfied: xxhash in /opt/anaconda3/lib/python3.12/site-packages (from datasets) (3.5.0)\n",
+ "Requirement already satisfied: multiprocess<0.70.17 in /opt/anaconda3/lib/python3.12/site-packages (from datasets) (0.70.16)\n",
+ "Requirement already satisfied: fsspec<=2024.9.0,>=2023.1.0 in /opt/anaconda3/lib/python3.12/site-packages (from fsspec[http]<=2024.9.0,>=2023.1.0->datasets) (2024.3.1)\n",
+ "Requirement already satisfied: aiohttp in /opt/anaconda3/lib/python3.12/site-packages (from datasets) (3.9.5)\n",
+ "Requirement already satisfied: typing-extensions>=3.7.4.3 in /opt/anaconda3/lib/python3.12/site-packages (from huggingface_hub) (4.12.2)\n",
+ "Requirement already satisfied: aiosignal>=1.1.2 in /opt/anaconda3/lib/python3.12/site-packages (from aiohttp->datasets) (1.2.0)\n",
+ "Requirement already satisfied: attrs>=17.3.0 in /opt/anaconda3/lib/python3.12/site-packages (from aiohttp->datasets) (23.1.0)\n",
+ "Requirement already satisfied: frozenlist>=1.1.1 in /opt/anaconda3/lib/python3.12/site-packages (from aiohttp->datasets) (1.4.0)\n",
+ "Requirement already satisfied: multidict<7.0,>=4.5 in /opt/anaconda3/lib/python3.12/site-packages (from aiohttp->datasets) (6.0.4)\n",
+ "Requirement already satisfied: yarl<2.0,>=1.0 in /opt/anaconda3/lib/python3.12/site-packages (from aiohttp->datasets) (1.9.3)\n",
+ "Requirement already satisfied: charset-normalizer<4,>=2 in /opt/anaconda3/lib/python3.12/site-packages (from requests->transformers) (2.0.4)\n",
+ "Requirement already satisfied: idna<4,>=2.5 in /opt/anaconda3/lib/python3.12/site-packages (from requests->transformers) (3.7)\n",
+ "Requirement already satisfied: urllib3<3,>=1.21.1 in /opt/anaconda3/lib/python3.12/site-packages (from requests->transformers) (2.2.2)\n",
+ "Requirement already satisfied: certifi>=2017.4.17 in /opt/anaconda3/lib/python3.12/site-packages (from requests->transformers) (2024.8.30)\n",
+ "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/anaconda3/lib/python3.12/site-packages (from pandas->datasets) (2.9.0.post0)\n",
+ "Requirement already satisfied: pytz>=2020.1 in /opt/anaconda3/lib/python3.12/site-packages (from pandas->datasets) (2024.1)\n",
+ "Requirement already satisfied: tzdata>=2022.7 in /opt/anaconda3/lib/python3.12/site-packages (from pandas->datasets) (2023.3)\n",
+ "Requirement already satisfied: six>=1.5 in /opt/anaconda3/lib/python3.12/site-packages (from python-dateutil>=2.8.2->pandas->datasets) (1.16.0)\n"
+ ]
+ }
+ ],
+ "source": [
+ "!pip install transformers datasets huggingface_hub\n",
+ "\n",
+ "\n"
+ ]
+ }
+ ],
+ "metadata": {
+ "colab": {
+ "provenance": []
+ },
+ "kernelspec": {
+ "display_name": "Python 3",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.12.2"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 0
+}