{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "id": "N4dWppBK_JSt"
      },
      "outputs": [],
      "source": [
        "import pandas as pd\n",
        "import numpy as np\n",
        "import re\n",
        "import string\n",
        "import nltk\n",
        "from nltk.corpus import stopwords\n",
        "from sklearn.model_selection import train_test_split\n",
        "from sklearn.feature_extraction.text import TfidfVectorizer\n",
        "from sklearn.linear_model import LogisticRegression\n",
        "from sklearn.naive_bayes import MultinomialNB\n",
        "from sklearn.svm import LinearSVC\n",
        "from sklearn.metrics import classification_report, accuracy_score"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "# Download stopwords\n",
        "nltk.download('stopwords')\n",
        "\n",
        "# Step 2: Load dataset\n",
        "df = pd.read_csv(\"dataset.csv\")  # Replace with your actual file path\n",
        "df.columns = ['text', 'label']   # Ensure correct column names\n",
        "\n",
        "# Step 3: Preprocess text\n",
        "stop_words = set(stopwords.words('english'))\n",
        "\n",
        "def preprocess(text):\n",
        "    text = str(text).lower()\n",
        "    text = re.sub(f\"[{re.escape(string.punctuation)}]\", \"\", text)  # remove punctuation\n",
        "    tokens = text.split()\n",
        "    tokens = [word for word in tokens if word not in stop_words]\n",
        "    return \" \".join(tokens)\n",
        "\n",
        "df['clean_text'] = df['text'].apply(preprocess)\n",
        "\n",
        "# Step 4: Train-test split\n",
        "X_train, X_test, y_train, y_test = train_test_split(df['clean_text'], df['label'], test_size=0.2, random_state=42)\n",
        "\n",
        "# Step 5: Feature extraction using TF-IDF\n",
        "vectorizer = TfidfVectorizer()\n",
        "X_train_vec = vectorizer.fit_transform(X_train)\n",
        "X_test_vec = vectorizer.transform(X_test)\n",
        "\n",
        "# Step 6: Model training and evaluation\n",
        "\n",
        "# Logistic Regression\n",
        "print(\"\\n🔵 Logistic Regression\")\n",
        "lr = LogisticRegression(max_iter=1000)\n",
        "lr.fit(X_train_vec, y_train)\n",
        "lr_preds = lr.predict(X_test_vec)\n",
        "print(classification_report(y_test, lr_preds))\n",
        "print(\"Accuracy:\", accuracy_score(y_test, lr_preds))\n",
        "\n",
        "# Multinomial Naive Bayes\n",
        "print(\"\\n🟢 Multinomial Naive Bayes\")\n",
        "nb = MultinomialNB()\n",
        "nb.fit(X_train_vec, y_train)\n",
        "nb_preds = nb.predict(X_test_vec)\n",
        "print(classification_report(y_test, nb_preds))\n",
        "print(\"Accuracy:\", accuracy_score(y_test, nb_preds))\n",
        "\n",
        "# Support Vector Machine (Linear)\n",
        "print(\"\\n🟣 Linear SVM\")\n",
        "svm = LinearSVC()\n",
        "svm.fit(X_train_vec, y_train)\n",
        "svm_preds = svm.predict(X_test_vec)\n",
        "print(classification_report(y_test, svm_preds))\n",
        "print(\"Accuracy:\", accuracy_score(y_test, svm_preds))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "trKGHyJhSPio",
        "outputId": "d0588d3b-64aa-4aa5-d37f-c9f73fbd8349"
      },
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "[nltk_data] Downloading package stopwords to /root/nltk_data...\n",
            "[nltk_data]   Unzipping corpora/stopwords.zip.\n"
          ]
        },
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "\n",
            "🔵 Logistic Regression\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "       anger       0.90      0.81      0.86       427\n",
            "        fear       0.86      0.76      0.81       397\n",
            "         joy       0.81      0.96      0.88      1021\n",
            "        love       0.90      0.61      0.73       296\n",
            "     sadness       0.90      0.94      0.92       946\n",
            "    surprise       0.88      0.47      0.61       113\n",
            "\n",
            "    accuracy                           0.86      3200\n",
            "   macro avg       0.88      0.76      0.80      3200\n",
            "weighted avg       0.87      0.86      0.86      3200\n",
            "\n",
            "Accuracy: 0.8628125\n",
            "\n",
            "🟢 Multinomial Naive Bayes\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "       anger       0.93      0.29      0.44       427\n",
            "        fear       0.92      0.22      0.36       397\n",
            "         joy       0.60      0.99      0.74      1021\n",
            "        love       1.00      0.03      0.06       296\n",
            "     sadness       0.70      0.93      0.80       946\n",
            "    surprise       1.00      0.01      0.02       113\n",
            "\n",
            "    accuracy                           0.66      3200\n",
            "   macro avg       0.86      0.41      0.40      3200\n",
            "weighted avg       0.76      0.66      0.58      3200\n",
            "\n",
            "Accuracy: 0.6609375\n",
            "\n",
            "🟣 Linear SVM\n",
            "              precision    recall  f1-score   support\n",
            "\n",
            "       anger       0.89      0.88      0.88       427\n",
            "        fear       0.87      0.85      0.86       397\n",
            "         joy       0.89      0.94      0.91      1021\n",
            "        love       0.83      0.74      0.78       296\n",
            "     sadness       0.93      0.93      0.93       946\n",
            "    surprise       0.88      0.70      0.78       113\n",
            "\n",
            "    accuracy                           0.89      3200\n",
            "   macro avg       0.88      0.84      0.86      3200\n",
            "weighted avg       0.89      0.89      0.89      3200\n",
            "\n",
            "Accuracy: 0.891875\n"
          ]
        }
      ]
    }
  ]
}