{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "01d88e03-684b-4361-9cbe-2840bbd8addd",
   "metadata": {},
   "source": [
    "###  الهدف من المشروع\n",
    "الهدف من هذا المشروع هو بناء وتقييم عدة نماذج لتعلم الآلة لتصنيف مشاعر التغريدات (إيجابية، سلبية، محايدة) من مجموعة بيانات نصية.\n",
    "تجهيز البيانات والمعالجة المسبقة\n",
    "بدأنا بتحميل مجموعة البيانات (Twitter_Data.csv) باستخدام مكتبة pandas. بعد ذلك، قمنا بتطبيق خطوات المعالجة المسبقة الأساسية على النصوص باستخدام دالة مخصصة، والتي شملت:\n",
    "تحويل النص إلى أحرف صغيرة.\n",
    "إزالة الروابط والرموز الخاصة.\n",
    "تقطيع النص إلى كلمات (Tokenization).\n",
    "حذف كلمات التوقف الشائعة (Stop Words).\n",
    "إرجاع الكلمات إلى جذرها اللغوي (Stemming)."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e6aaf8ff-6485-4be5-94b8-e5211d4c8e8f",
   "metadata": {},
   "source": [
    "### 1. تجهيز بيئة العمل واستيراد المكتبات\n",
    "في هذه الخطوة الأولى، نقوم بتجهيز كل الأدوات التي سنحتاجها للمشروع. نستورد المكتبات الأساسية مثل pandas للتعامل مع البيانات، و nltk لمعالجة النصوص، و scikit-learn لبناء النماذج وتقييمها. نقوم أيضًا بتحميل الموارد الضرورية من nltk مثل قائمة كلمات التوقف وقواعد التقطيع."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "684cf06b-a2fc-42f7-bc94-8d579f6bcdcf",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[nltk_data] Downloading package punkt to\n",
      "[nltk_data]     C:\\Users\\alaws\\AppData\\Roaming\\nltk_data...\n",
      "[nltk_data]   Package punkt is already up-to-date!\n",
      "[nltk_data] Downloading package stopwords to\n",
      "[nltk_data]     C:\\Users\\alaws\\AppData\\Roaming\\nltk_data...\n",
      "[nltk_data]   Package stopwords is already up-to-date!\n",
      "[nltk_data] Downloading package wordnet to\n",
      "[nltk_data]     C:\\Users\\alaws\\AppData\\Roaming\\nltk_data...\n",
      "[nltk_data]   Package wordnet is already up-to-date!\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import re\n",
    "import nltk\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "from nltk.corpus import stopwords\n",
    "from nltk.tokenize import word_tokenize\n",
    "from nltk.stem import PorterStemmer\n",
    "\n",
    "from sklearn.model_selection import train_test_split, GridSearchCV\n",
    "from sklearn.feature_extraction.text import CountVectorizer\n",
    "from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, classification_report\n",
    "\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier\n",
    "from sklearn.svm import SVC\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "\n",
    "# Download NLTK resources (only needed the first time)\n",
    "nltk.download('punkt')\n",
    "nltk.download('stopwords')\n",
    "nltk.download('wordnet')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c8f905ae-892c-49fa-9ace-772a714a1c80",
   "metadata": {},
   "source": [
    "### 2. تعريف دالة المعالجة المسبقة للنصوص\n",
    "هذه الدالة هي قلب عملية التنظيف. مهمتها هي أخذ أي نص خام وتحويله إلى صيغة نظيفة وموحدة يمكن للنماذج الرياضية فهمها. تقوم الدالة بإزالة الضوضاء مثل الروابط والرموز، وتوحيد حالة الأحرف، وتقسيم النص إلى كلمات، وإزالة الكلمات الشائعة غير المهمة، وأخيرًا إرجاع الكلمات إلى جذرها اللغوي."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "255656db-fbf2-46ec-8bb8-96cf7efaf5a3",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Initialize Stemmer and Stop Words\n",
    "stemmer = PorterStemmer()\n",
    "stop_words = set(stopwords.words('english'))\n",
    "\n",
    "def preprocess_text(text):\n",
    "    # Convert to lowercase\n",
    "    text = str(text).lower()\n",
    "    # Remove URLs\n",
    "    text = re.sub(r'http\\S+|www\\.\\S+', '', text)\n",
    "    # Remove HTML tags\n",
    "    text = re.sub(r'<.*?>', '', text)\n",
    "    # Remove special characters and numbers\n",
    "    text = re.sub(r'[^a-zA-Z\\s]', '', text)\n",
    "    # Tokenization\n",
    "    tokens = word_tokenize(text)\n",
    "    # Remove stop words\n",
    "    tokens = [word for word in tokens if word not in stop_words]\n",
    "    # Stemming\n",
    "    stemmed_tokens = [stemmer.stem(word) for word in tokens]\n",
    "    # Rejoin words into a single string\n",
    "    clean_text = ' '.join(stemmed_tokens)\n",
    "    return clean_text"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "850890a5-60b2-4e2f-ba0d-8aa91e95daf8",
   "metadata": {},
   "source": [
    "### 3. تحميل البيانات وتطبيق التنظيف والتحويل الرقمي\n",
    "في هذا الجزء، نقوم بأربع مهام رئيسية:\n",
    "\n",
    "تحميل البيانات: نقرأ ملف Twitter_Data.csv باستخدام pandas.\n",
    "\n",
    "تطبيق التنظيف: نستخدم دالة preprocess_text التي عرفناها سابقًا على كل النصوص في مجموعة البيانات.\n",
    "\n",
    "التحويل الرقمي: نحول النصوص النظيفة إلى مصفوفة من الأرقام باستخدام تقنية حقيبة الكلمات (Bag of Words) عبر CountVectorizer.\n",
    "\n",
    "تقسيم البيانات: نفصل بياناتنا إلى مجموعات للتدريب (train) والاختبار (test) لضمان تقييم عادل لأداء النموذج."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "cb0e5f19-7e60-4233-b3ec-ced4cea9e264",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Preprocessing text data... This may take a few moments.\n",
      "Preprocessing complete.\n"
     ]
    }
   ],
   "source": [
    "# Load the dataset from the uploaded file\n",
    "df = pd.read_csv('Twitter_Data.csv')\n",
    "\n",
    "# Remove rows with any missing values\n",
    "df.dropna(inplace=True)\n",
    "df = df.reset_index(drop=True)\n",
    "\n",
    "# Apply the preprocessing function to the 'clean_text' column\n",
    "print(\"Preprocessing text data... This may take a few moments.\")\n",
    "df['processed_text'] = df['clean_text'].apply(preprocess_text)\n",
    "print(\"Preprocessing complete.\")\n",
    "\n",
    "# Define features (X) and target (y)\n",
    "X = df['processed_text'].values\n",
    "y = df['category'].values\n",
    "\n",
    "# Use Bag of Words (BoW) to convert text to numerical features\n",
    "vectorizer = CountVectorizer()\n",
    "X_bow = vectorizer.fit_transform(X)\n",
    "\n",
    "# Split data into training and testing sets\n",
    "X_train, X_test, y_train, y_test = train_test_split(X_bow, y, test_size=0.3, random_state=42)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c3d64ba0-8e41-478a-b353-ecdf7025d908",
   "metadata": {},
   "source": [
    "### 4. تعريف دالة تقييم النماذج\n",
    "لكي نتجنب تكرار الكود، نكتب دالة واحدة تقوم بكل مهام التقييم. هذه الدالة تأخذ تنبؤات أي نموذج وتقارنها بالإجابات الصحيحة، ثم تطبع تقريرًا كاملاً بالأداء (Accuracy, Precision, Recall, F1-score) وترسم مصفوفة الارتباك (Confusion Matrix) التي توضح لنا أخطاء النموذج بصريًا."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "c3cedb6a-b90f-43db-9385-c2a55835f388",
   "metadata": {},
   "outputs": [],
   "source": [
    "def evaluate_model(model_name, y_true, y_pred):\n",
    "    # Calculate metrics\n",
    "    accuracy = accuracy_score(y_true, y_pred)\n",
    "    precision = precision_score(y_true, y_pred, average='weighted')\n",
    "    recall = recall_score(y_true, y_pred, average='weighted')\n",
    "    f1 = f1_score(y_true, y_pred, average='weighted')\n",
    "    report = classification_report(y_true, y_pred)\n",
    "    cm = confusion_matrix(y_true, y_pred)\n",
    "\n",
    "    # Print results\n",
    "    print(f\"--- Evaluation for: {model_name} ---\")\n",
    "    print(f\"Accuracy: {accuracy:.4f}\")\n",
    "    print(f\"Precision: {precision:.4f}\")\n",
    "    print(f\"Recall: {recall:.4f}\")\n",
    "    print(f\"F1 Score: {f1:.4f}\")\n",
    "    print(\"\\nClassification Report:\")\n",
    "    print(report)\n",
    "\n",
    "    # Plot Confusion Matrix\n",
    "    plt.figure(figsize=(5, 5))\n",
    "    sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False)\n",
    "    plt.title(f'Confusion Matrix for {model_name}')\n",
    "    plt.xlabel('Predicted Label')\n",
    "    plt.ylabel('True Label')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "09ddba27-c9d4-4aa7-96f2-193ad39e576e",
   "metadata": {},
   "source": [
    "### 5. تدريب وتحسين نموذج الغابة العشوائية (Random Forest)\n",
    "الآن نبدأ بتدريب أول نماذجنا. سنستخدم نموذج Random Forest ونبحث عن أفضل إعدادات له باستخدام GridSearchCV. هذه الأداة تقوم بتجربة كل توليفات المعلمات التي نحددها في param_grid لاكتشاف التوليفة التي تعطي أعلى دقة."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "1827f2b6-82ee-4c1b-9e92-4cdb5c848245",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Random Forest with GridSearchCV...\n",
      "Fitting 3 folds for each of 6 candidates, totalling 18 fits\n",
      "--- Evaluation for: Random Forest Classifier ---\n",
      "Accuracy: 0.8129\n",
      "Precision: 0.8183\n",
      "Recall: 0.8129\n",
      "F1 Score: 0.8060\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "        -1.0       0.86      0.55      0.67     10691\n",
      "         0.0       0.79      0.91      0.84     16644\n",
      "         1.0       0.82      0.87      0.84     21556\n",
      "\n",
      "    accuracy                           0.81     48891\n",
      "   macro avg       0.82      0.78      0.79     48891\n",
      "weighted avg       0.82      0.81      0.81     48891\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcIAAAHWCAYAAADkX4nIAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjUsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvWftoOwAAAAlwSFlzAAAPYQAAD2EBqD+naQAARrhJREFUeJzt3QV4FEcfBvA3QQIECJKgwd3drUixFm+RtrhbcSsuJS1Q3Fq8FChQKFBKP6BAobg7BPfgJEAgQrLf8x96x11yCQkkXJJ5f89zkLvd25vb29t3Z3bm1sEwDANERESacrR3AYiIiOyJQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUH4AV28eBE1a9aEi4sLHBwcsG7duihd/rVr19RyFy9eHKXLjc0++ugjdYsqz58/R4cOHZAuXTq1rnv37g3dcDuL2WLC55M1a1a0adPmrfs/KaP8LWW2J+2C8PLly+jcuTOyZ8+ORIkSIXny5KhQoQKmTZuGly9fRutrt27dGqdOncK3336LpUuXomTJkogrZKOXDVrWp631KF8CmS63SZMmRXr5d+7cwahRo3D8+HHY0/jx49WXt2vXruozbNmyZbTvUEzrTW7Ozs4oXbo0fv7552h93dgm5HqyvPn5+SGm2bt3r9qevb29I/W8f/75B40bN1YHYgkTJkSaNGlQr149rF27FjFd6xi8/4sPjfz555/4/PPP4eTkhFatWqFgwYIICAjA7t27MWDAAJw5cwY//fRTtLy2hMO+ffswdOhQ9OjRI1peI0uWLOp1EiRIAHuIHz8+Xrx4gT/++ANNmza1mrZs2TJ14PGuOyUJwtGjR6sdXtGiRSP8vC1btiAqbd++HWXLlsXIkSPxocj77devn/rby8sL8+fPVzsVf39/dOzY8YOVI6azXE+WJDBiYhDK9iwHkClSpIjQc2SbGzNmDHLlyqUO5uX7/ujRI2zatAlNmjRR37EvvvgCMYGnpyccHR3fuv+TA8nmzZurfbI9aROEV69eVStcNh7ZmaVPn948rXv37rh06ZIKyujy4MED9X9EN/p3IUe/Ejb2Ihuz1K5XrFgRKgiXL1+OTz75BGvWrPkgZZFATpIkSZTvBO/fv4/8+fNH2fJevXqF4ODgcMuZMWNGfPXVV+b7svOUFo0pU6YwCMNZT1FFPh85YLbnd+u3335TIfjZZ5+p75Llwa4cxG/evBmBgYGIKZxCBFtY+7948eKpW1Tx9fVVrSaRZmiiS5cucpUNY8+ePRGaPzAw0BgzZoyRPXt2I2HChEaWLFmMIUOGGH5+flbzyeOffPKJ8e+//xqlSpUynJycjGzZshlLliwxzzNy5Ej12pY3eZ5o3bq1+W9LpudY2rJli1GhQgXDxcXFcHZ2NnLnzq3KZHL16lX1nEWLFlk9b9u2bUbFihWNJEmSqOfWr1/fOHv2rM3Xu3jxoiqTzJc8eXKjTZs2hq+v71vXlzxHyrR48WK1Dp48eWKedvDgQbXsNWvWqP8nTpxonvbo0SOjX79+RsGCBdXzkyVLZtSuXds4fvy4eZ4dO3aEWn+W77NKlSpGgQIFjMOHDxuVKlUyEidObPTq1cs8TW4mrVq1UuUL+f5r1qxppEiRwrh9+7bN9xdWGWSdi3v37hnt2rUz0qRJo5ZfuHBhtS4smT4fef9TpkxR25ajo6Nx7NixMNerafsKqWTJkmq7tLRr1y7js88+MzJlyqSmubu7G7179zZevHhh87O6deuW0aBBA/W3q6ur+hxevXplNa98jjK/bAuyTcj6k/K+73bm6elpfPnll2q58trDhg0zgoODjRs3bqjnyXaQNm1aY9KkSWGum4isJ0vPnz83+vbtq9aLrB/5/shnIa9rScrXvXt345dffjHy589vxI8f3/j999/VNFlnbdu2VZ+zLEOmL1iwINRrTZ8+XU2TbVG2qxIlShjLli2zWgdhbUu25M2b10iVKpXx9OnTt64LW/uBEydOqM9R9k2yfcq6lffx8OFDq+fK8uW7I+tT3p+bm5tRo0YN48iRI+Z5Lly4YDRu3FgtQ5aVMWNGo1mzZoa3t7d5Hnm+vF5Y79e0z5My2nrvmzZtMm9LSZMmNerWrWucPn3a5nZ86dIlo06dOmo+2Z7fhTY1Qmmuk6Po8uXLR2h+6RCxZMkSdQQmzS0HDhyAh4cHzp07h99//91qXqlNynzt27dXTVYLFy5UR+0lSpRAgQIFVJu+HAn16dMHLVq0QN26dZE0adJIlV+abT/99FMULlxYHRnKEZe87p49e8J93t9//406deqo9y7nJKSJYsaMGarmdvToUdXUaElqctmyZVPvVaZLM5ych/j+++8jVE55r126dFHnLNq1a6cekyPYvHnzonjx4qHmv3LlijppLk3W8rr37t3Djz/+iCpVquDs2bPIkCED8uXLp97ziBEj0KlTJ1SqVEk91/KzlCYieZ9S65daQdq0aW2WT84FS4uAfE7SVCNHo/J60oQq5y3k9WyRMsh0+Qzd3d3NTXBubm5qnUqHHPk8pNlH3sfq1avVNiDngHr16mW1rEWLFqkmYnkv8jmmSpUKka1F3rp1CylTprR6XF5TasJy/jJ16tQ4ePCg+qxlXplmKSgoCLVq1UKZMmXUOVvZTn744QfkyJFDPV9IJjRo0ECdOpDPVNaBbPuy7t53O2vWrJla3nfffadaYsaNG6fWg3wW1apVU9ubNPX1798fpUqVQuXKld+6XqRG9PDhQ6vHpFVAbvJe6tevjx07dqjvqTSjSi1KalO3b99WtWtLso2sWrVKfZ6urq6q/LJtSrO4tLzI4/LZ//XXX2p5T58+NXecmjdvHr7++mu1T5DPXj7rkydPqn2INF3Kd+TChQuq5UReV5YvZHm2yPn18+fPq+9TsmTJ8C62bt2qvmtt27ZV5xdNp4Hk//3796v3JORzltqnvD9p+ZDvlXz+st+T76/UjGW7kWb5nj17qmXJ+tu4caPa1qUjTEiR3f/J90y2MXkd2Q5km54zZw4qVqyIY8eOWW1L8l2Q+WSabMfyWb8TQwM+Pj7qqCOiRwtSG5H5O3ToYPV4//791ePbt283PyZHNvKYHI2b3L9/Xx0pyRG2rdqApYjWCKUGIfcfPHgQqSPBokWLqqNXqXlZHh1KTUSO7kO+ntRqLDVq1MhInTp1mK8Z8uhMSK2kevXq6u+goCAjXbp0xujRo22uA6lhyzwh34esP6mRmxw6dMhmLURIjU+mzZ071+Y0yxqh2Lx5s5p/3LhxxpUrV9SRZMOGDY13rXlMnTpVLU9qECYBAQFGuXLl1LJNR/Gm9y+1INlGIvp6UluVz11up06dMlq2bGmutVgKWfMTHh4ehoODg3H9+nWrz0qeb7l+RbFixVTNxWTdunVqvgkTJpgfkxqj1Lrfdzvr1KmT1TKllibl/O6776xqo1KjMtUs3raebNWy5PUs34t85pZkW5XXlVqFicwn5T5z5ozVvO3btzfSp08fqhbVvHlzVQM2rX/Zz0gLRXjkO/C2WqDJ+vXr1byyD4gIW/sBW9vGihUrQu27XFxcQm1XlkytAatXrw63DJY1wvD2fyFrhM+ePVM16I4dO1rNd/fuXVU2y8dN2/HgwYON96VFr1E5WhMRPZqSk8+ib9++Vo+bagEhzyXKkZOplmI6ssuTJ486Aosqprb19evXq3MWESEdK6SXpdRMLGsdUqv8+OOPze/TkhwRWpL3JUeFpnUYEXLUK73b7t69q46s5f+wTuJLjch0Ul1qKfJacrQo609qEhEly5Gj3YiQLtzS2UBqmXK0Kud+pCbyrmQ9ypGxHO2ayDkcqRXIcIudO3dazS8dG8I6+rdFaqsyv9wKFSqkjpjlvU6cONFqvsSJE1udK5HakdSaZd8uR9IR+awtt1l5X9IBylRDFFKDlprA+25n0uJiuUzpQSjllNqV5TYfme+R1G6l5mN5k05xpvciryOfScjvtLyu1OwsSYuE5blgmUfOb0sPTflb1q3pJjUSHx8f8/Yq5ZZa+KFDh2CP/ZctltuG1FCl3FK7FUctvmdSdqm5Suc0W0w1PqlNS00tqslnJjVL+S5ZrmP57OTzlRp9SJbb57vSIgilS7949uxZhOa/fv262jnnzJnT6nHZ2cmGItMtZc6cOdQypNnqyZMniCrSlCTNTLIDkWY/aQKUppvwQtFUTtmZhCTNUrKByQ4zvPdian6LzHuRpg/50q5cuVI1b0nTVsh1aSLll+Yh6QknYSbNRLLDl6Yk2blEpqNEZDrGSDOK7LRlBz59+nTV/PuuZD1L+S17yZnWsWm6JWk6jQzTDv5///ufKrdsg/J5hHy/N27cMIeRHEzIepQdugi5LiX8Q4ZxyG1Wyi2dykI2Y4XcnqJiO5MdrJTJ1Exo+XhEtz15bo0aNaxu0lRrKqM0e4cMk4h+RtLZQ3bQ0pxoOigx3UwHYNKRSgwaNEitMxnmItuFdMZ72ymMqNx/2fL48WPVTCv7DglFKbfpPfpYbBsTJkzA6dOnkSlTJlV+aea2PBCR50gFQU6ZyPqWg4BZs2ZF6rsaHmkGFtI8HnI9ywGhaR2byIGanKp4X1qcI5QNSb4E8gFHhqnd/G3C6vX0upXl3V5DakeWZOPdtWuXOiKSGqnsFCVoZIORDSSqel69z3sxkUCTmpacY5UvkXyZwhuXN3z4cHX+Y+zYsWonLoEi51siWvMNecQbEVJDMn2pZGyTZW0uukW2rKYdvJAdj5xvlfPFcr7T1Goh24vUvmSHJztimUd6z8n5GwnHkOsyKnvqvQtbrx8V2150fUam9Sfnn22dIzXVgE3hKsMH5LyZfE+lJjl79mx1jluGTESWfJam7fRdybl/GbIh50Tl/KgEtbyn2rVrW20bMp+0DMi5YNmvSKuDnKeTc/5yDljIuWTZpqR1SuaRWrb0KZBzje8bSqaySKuHVDxCkuALq0XpfWgRhEJ2HHI0Jx0kypUrF+68MsRCPhA5OjEdMQo5WS5HhTI9qshRuK1BtSGPUIV84NWrV1e3yZMnqxCRcTkSjqYdZcj3IeRLGZKcfJcd7Dt1NY4AaQqVTkNSZqm9hkVOzFetWhULFiywelzWiWXtIKIHJREhtRM5ipemL2k6lKPgRo0aqZrru5D1LDVY2WYsv5Syjk3To5IMQ5Gannz+0sQrn6HsJKUDhhx8mJoDhdQk35WUe9u2bap517JWGHJ7sud2FlFSRunQI7Uqy1phRD8jqZHI8+SAw9Z3LSR5v9KKIzfpYCIHhjKQfMiQIarmG5ntOXfu3Kq2LcEjBz+R7WgnNWr5HCWEJYxD1r5CklaAbt26qZscLEonGSm7KQiFNNHLbdiwYSpgpbVq7ty5qtPT+5DOWkJaaCKynqOKFk2jYuDAgWrjlKZFCTRbvzgjG5mpaU9MnTrVah4JH9OOKKrIBy/NCrIjtTznErJnqhzph2QaWC49uMLaoGUe2Tlahq3UjOVIzvQ+o4OEm9TwZs6cafPIzrIWEPKIX3o4Sk3GkmlHGtlf4rBFakzSjCjrRT5T6YVmGqD+LmQ9ynlQqaFb9maTXpOy0zI1T0YleQ9yPlV6KFrWpizXpfxt2qbf9X3J+5AeeyYSBPK+Ysp2FlFSBim7bI+WpFleQslyJ2+LrF85tyu1O1stS6ZxckI+F0vShC0HXfJ5mMb6RXZ7lhCT5cr+Sz6TkGQ9Sw00rLKLkN+zkPu3oKCgUE2cEkjSmmb6bsj5ypCvL4EoB4Dv+v2xJC0e0oInB3m2xkVarueopE2NUAJHuvGbum1b/rKMHNGYuruLIkWKqB2j1CBlQ5UdmXRFly96w4YN1U4+qkhtSXZqUiORJgZTV2E5CrQ8iS0dO6RpVEJYjl7lSE2aW6QpQroOh0WaNuRLLrVg6Yhg6tYu517Ca7J8X/LFkKPFiNTU5b1JDU1qZ1KzkfOKpnM7lp+fnBuTo045MpcdiZw7i+z5Num8I+tNfqXDNJxDhjPI8AdpopXaYWTJMAjpbCPbz5EjR1SwSk1XzgvJzuZ9OjmERT5T2X4lyOUclDSfyTqS4QZyECE7E9lpv895aukYIkf6gwcPVr8FKTtzaSKzdT7IXttZZN6LfG+lBUXei3zHJTykliXN8KaaSHhkqIe0vsh2Jz9kIOtDDlDleyq1TdPBqnTGkoM/WXdyTk6GHkgAy3fXtC3I0Coh5ZF9gHSukjKGVXOW/Zbp58mkWV+a8k2/LCPNr1Ljk/2bLbItyPAT2bYlXOR8urx3+ZERS8+ePVP7Exn2IetHDuLkfUmnH2kONX1/ZGiFDHeSfZSEojRjmg4U3peUVfZ/8osz8v2UdSO1cTlwlVNCsk5DHsxECUMzMhhUuuBmzZpVDRiVgbsySH3GjBlWg+VlQL10+ZcBqAkSJFCDlMMbUP+2bvthdR82DZSXAeVSnjx58qhu+CGHT8hgZemWnSFDBjWf/N+iRQv1fkK+RsghBn///bd6j9IVXbru16tXL8yBziGHZ4Q14DW84RNhCWv4hAwzkW7pUj4p5759+2wOe5Bu5KYBzrYG1NtiuRwZxiCfV/HixdXna6lPnz6qy7y8dnjC+rxlQL0MUJbB4fL5FCpUKNTnEN42ENnXEzJg33I9yGcqg59lyIaUQ7ZzGcIQcpsI67Oy9SMOMhxChmuYBtTL32ENqH+f7SysMoX32UZ0PZlI13z5nOW7I9/pXLlyhTug3hb5nGWa7A9kGTI0SIYK/fTTT+Z5fvzxR6Ny5cpq2JEMA8qRI4cxYMAANYzL0tixY9VgdNnuIjqUwrQfkKEq8j2QAe+ynuW7Ed5+QH4IQIZCydAE+Rw///xz486dO1ZDTPz9/VU5ixQpovaL8nnI37NnzzYvR4YbyRAreU+JEiVSg/yrVq2qPvuoGD5h+QMWtWrVUmWV15HXkx/3kB/NiMw+J6Ic5J+oj1ciIqLYQZtzhERERLYwCImISGsMQiIi0hqDkIiItMYgJCIirTEIiYhIawxCIiLSWpz8ZZlNZ6x/oZz0U8z99WWrSG++/tY/Xk/6yZnm7T9yzxohERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaS2+vQtAof3v14XYvGqR1WNpMmbGkBnL1N9PnzzChp9n48KJw/B/+QJuGTLh489aoUi5j6yec+bwXmxZvRhe1y8jfoKEyFGgKNoP9jBPXzt/Kq6ePwWvG1eR1j0LBky2fk2yrxNHD+PXXxbjwvmzePTwAcZOmIpKH1U3T3/86CF+nDkFhw/sw/Nnz1C4WAn06j8E7pmzmOfx9/fHnGkTsX3L/xAQGIDSZSug98ChSJXaNdTr+Xh7o/1XTfDw/n38sW0PkiVL/sHeK9m2aukC7N21DbeuX0NCJyfkK1gEbbv2hnvmrOZ5vG7fxIJZk3Hm5HEEBgagRJny6NJ7MFKmSq2m3/O6jRVL5uHk0YN48ugRUrm6oWrNumjWqiMSJEhgXo5hGFj768/434Y1uH/PCy4uKVC3UVM0b9URcR2DMIZKlykbuo6aYr7vGC+e+e9l07+Fn+9ztB/iAedkKXD0361Y8sNI9J0wD+7Zc6t5Tuz7B6vmTEDdLzshV6HiCA4KUoEXUpnqn+D6hbO4c/3yB3pnFFF+fi+RI1du1K3XCMMH9baaJjutYQN6IX78+Ph20nQkcXbG6uU/o1+Pjli8ch0SJ06i5ps1ZQL279mFUR4/wDlpUkybOB4jBvXBzPlLQ73ehHEjkCNnbhWEFDOcOn4EnzRqhtz5CiAoKAhLfpyBYX27Yu7StUiUODH8Xr5U97PlzA2PaT+p5yydPwtjBn+NH+YuhaOjI27euAYjOBg9+g9DevfMuH7lEmZMGAM/Pz906N7X/Fo/TpuAY4f2oX33vsiaPReePfPB86c+0AGDMIaS4Eue8vURXUjXPE/js059kSVXfnW/5uetsfOPVbh12VMFYVDQK/y+YDrqteqGsjU+tQpXS407vN65PvfxZhDGQGXKV1I3W27duI6zp09i0YrfkS1HTvVYn0HD0bhOVWzb/Bc+bdgEz58/w6YNazFs7PcoXqqMmmfQiLFo3bQBzpw6gQKFipiXt/63lWr+1u274MDe3R/oHdLbjP1httX9vt+MwRf1q+GS51kULFoCZ08dw/27dzBj4a9I4pz09TxDx6JZ3co4cfQgipUsi5JlKqibSfoM7rh94xr+XLfaHIQ3rl3BpnWrMfvn38y1zXTICF3wHGEM9dDrFka2b4ixXZti6ZQxePLgnnla1jwFcXzPdvg+e4rg4GAc3f03XgUGIEfBYmr6rSsX4PP4ARwcHDCpXzuMaNcAP47tD6/rV+z4jigqSROYkOYyEzn6l6auUyeOqvsXzp3Fq1evUKJ0WfM8WbJmR9p06XH21AnzY9euXMaSBXPxzajxcHDkLiEm8/V9rv5PmtxF/R8YGAg4OCBBgoTmeRImdFKf49mTx8JdTrL/liEO7tmJdBky4uDeXWjXtC7afl4H074bjWea1AjtutU/fPgQEyZMQKNGjVCuXDl1k78nTpyIBw8eQFdZcudHi57foPPwSfi8Uz88vu+FGUO7w+/lCzW9Tf/RqtY3rPUnGNCsGlbPnYS2g76FW3p3Nf3RvTvq/80rF6lzhx2HTkCSpMkwa8TXKjwp9sucNZsKtHmzpqqdlewQly9ZgAf37+Hxw4fmc4gSjCHP9cm5I5kmAgICMHbYQHT5uq9aHsVcctD70/SJyF+oKLJmf90KkDd/ISRKlBiL5k5VTenSVDp/1mR1KsT0GYd059YN/LHmV9Sp38T82F2v2+q84O4dW9F36Dj0+WYMLl04i/HD+0MHdgvCQ4cOIXfu3Jg+fTpcXFxQuXJldZO/5bG8efPi8OHDb12OdAZ4+vSp1S0wwB+xWb7iZVG0fFVkyJoTeYuVQadhE/DyxXNVCxSbls/HS9/n6hxi3wnzUaVeMyyZNNLcvGkEG+r/Gv91oMmUIw9a9BgCOAAn9u6w63ujqBE/fgKM+X4Kbt64jno1KqJW5VI4duQQypSvCAdHhwgvR4I0c7bsqFmnXrSWl97fnMkeuH71EgaN+t78mEvKVBgyZgIO7NmFz2qWx+d1KsL3+TPkyJ0Pjg6hd+8PH9zDiP7dUfGjj1HbIgiDg4MRGBCAfkPHoWCR4ihcrBR6DRqFk0cP4daNa4jr7HaOsGfPnvj8888xd+5c1YQXsiNAly5d1Dz79u0LdzkeHh4YPXq01WNfdO2PL7sPQFyR2DkZ3NJnwsO7t/Dw7m3s/mstBk79Gekzvz7nlzFbTlw5dwK7//odTbv0N59bTJfpTc8y6TWaOm0GPHn4pomVYrc8+QpgwbLf1Lm9V4GBSJEyFbq2/QJ58r0+dyw9Q6Wm+OzZU6ta4ZPHj8y9Ro8ePoirly+i2vatrycarw+iGtSsjJZtO6Jtp+72eGsUwpwpHji4bxe+n7EQrmnSWk0rXro8FqzcCB/vJ4gXLx6SJkuOLxtUV02dlh49vI8hX3dUPU97DhxuNS1ValfEixcfGS16HGfK+nr/8uCel1Uv1bjIbkF44sQJLF68OFQICnmsT58+KFbs9Tmv8AwZMgR9+77p+SR2XI5b7doyROLRvdtInrIWAvz91GOOIY765fyQYQSrv6UGKMF3//YNZM9XWD0W9OoVHt+/i5Ru6ezwDig6JU2azNyBxvPcGbTr3EPdz50vv+pVevTQAVSp9rF67Mb1q7h31wv5/+soI7VK//+2KeF59jS+HzsCM35cjAzumezyfsi6UjB36nfYt2s7PKbPDxVullxSpFT/nzhyED5PHqNMxY+saoISgjnz5EfvIaPV/sJS/kJF1ekWGYqRPuPrz/32zevq/zRpMyCus1sQpkuXDgcPHlRNoLbItLRprY98bHFyclI3SwkSvvlix0brF89CgVLlkcotHXweP1TjCuXkd/GK1VXt0DW9O1bNnYT6rbvBOZkLTh34V40p7PDN6yaTREmcUb5mA/W8FK5p1HK2r1uupkmTq8kDr1sI8HuJp96PVXPy7asX1eNp3bMivsX4IrKPFy9e4PatG+b7d+/cxsUL55E8uYs6n/fP35tV01jadOlw5dJFzJj8PSpWqYZSZcubA7Ju/caYPXWieo4MsZg+yUP1FjX1GM0YIuxkLKGQ5lKOI7S/2ZPHY+fff2H4+KlInMTZfN5PhsI4OSVSf2/9cx0yZc2ugvDc6ZP4afoENGz6lbkW9zoEO8AtbQa0795H1RxNTC0DRUuWVc2pUz1GodPXAxBsBKum2GKlylrVEuMqB0MOOexg1qxZ6NevHzp37ozq1aubQ+/evXvYtm0b5s2bh0mTJqFbt26RXvamM7F7HNTPP4zE5bMnVMeWpMlTIHu+Qmo8oGu610eDD+7cxMZffsSVcydVkMnjHzVojlIf1TYvQ2qAMs/hnZtVyMlQi4btvjY3p4qZw3vi8pnjoV5/+NxVSJUmdnecKOaeArGdnPPr07VdqMdrfVIfQ0Z+izUrl+HXpYtUU2dqVzfUrFsPrdp3sRokbRpQv23LXwgMCFQh2XvgMKR2dQ33NePKgHpf/yDEZp9UKmrzcanVfVy3gfp70dxp+PuvDWrMX5p0GVC3wedo2Owrc2vb1k3rMdVjpM3l/Pnvm++/NJ3Onfo9jh3cB6fEidWQiw49+ln1Lo2NcqZJHHODUKxcuRJTpkzBkSNH1GBRIW3cJUqUUM2dTZs2faflxvYgpPcXF4KQ3l9sD0LSIAhN5IS+DKUQrq6uVke074JBSAxCEgxCyhmBIIwRvywjwZc+fexuiiMiotiJPyNBRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWnMwDMNAHOP3yt4lIHvL3HmVvYtAMcD56U3sXQSys1TO8d46D2uERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWktfkRmOnnyZIQXWLhw4fcpDxERUcwLwqJFi8LBwQGGYdicbpom/wcFBUV1GYmIiOwbhFevXo2+EhAREcX0IMySJUv0l4SIiCi2dJZZunQpKlSogAwZMuD69evqsalTp2L9+vVRXT4iIqKYFYRz5sxB3759UbduXXh7e5vPCaZIkUKFIRERUZwOwhkzZmDevHkYOnQo4sWLZ368ZMmSOHXqVFSXj4iIKGYFoXScKVasWKjHnZyc4OvrG1XlIiIiiplBmC1bNhw/fjzU4//73/+QL1++qCoXERHRBxGhXqOW5Pxg9+7d4efnp8YOHjx4ECtWrICHhwfmz58fPaUkIiKKKUHYoUMHJE6cGMOGDcOLFy/wxRdfqN6j06ZNQ/PmzaOnlERERNHEwQjr52IiQILw+fPnSJMmDWISv1f2LgHZW+bOq+xdBIoBzk9vYu8ikJ2lcn7TqTPKaoQm9+/fh6enp/pbflrNzc3tXRdFREQUezrLPHv2DC1btlTNoVWqVFE3+furr76Cj49P9JSSiIgopgShnCM8cOAA/vzzTzWgXm4bN27E4cOH0blz5+gpJRERUTSJdNOohN7mzZtRsWJF82O1atVSg+xr164d1eUjIiKKWTXC1KlTw8XFJdTj8ljKlCmjqlxEREQxMwhl2ISMJbx79675Mfl7wIABGD58eFSXj4iIyP5No/KTatIz1OTixYvInDmzuokbN26on1h78OABzxMSEVHcC8KGDRtGf0mIiIhiahCOHDky+ktCREQUWy7MS0REpO3wCbkQ75QpU7Bq1Sp1bjAgIMBq+uPHj6OyfERERDGrRjh69GhMnjwZzZo1U78kIz1IGzduDEdHR4waNSp6SklERBRTgnDZsmVq8Hy/fv0QP358tGjRQl1+acSIEdi/f3/0lJKIiCimBKGMGSxUqJD6O2nSpObfF/3000/Vz64RERHF6SB0d3eHl5eX+jtHjhzYsmWL+vvQoUNqLCEREVGcDsJGjRph27Zt6u+ePXuqX5PJlSsXWrVqhXbt2kVHGYmIiGLmhXmFnBfcu3evCsN69eohJoiLF+ZdMO9HbNu6BVevXoFTokQoWrQYevftj6zZslvNd+L4McyYNgWnTp1EPEdH5MmbD3N+WoBEiRKp6fN+nIN/d+2E5/lzSJAgAXbvP4y4KLZdmLdsbld0r5UXRbKmRLoUidF65m78deyOefr0dqXQvEI2q+dsP+WF5lP/Nd/v/Uk+fFw4PQpkSoHAoGDk6rnO5ms1q5AVXT/OjezpkuHZy0D8cfgWBi87ap5ev6S7Wlb2tMnw6Lk/Fm67hFmbX197NLaJ7RfmPXbkMJb9vBCe587g4cMH+O6H6ahStYaa9iowED/Ono69e3bhzq1b6lRVyTLl0O3rvnBze3Ox9MXz52LP7l24eOE8EsRPgK27DoT5ej7e3mjZvBEe3L+HLTv3I1my5IjtovXCvCZly5ZVN7lQ7/jx4/HNN9+87yLJhsOHDqJZiy9RoFAhBL0Kwoxpk9GlY3us3fAnkiRJYg7Bbp07oF2Hzhg8dDjix4sHT8/zqkevSWBgID6uWRuFixTFurW/2fEdkaUkCePjzC1vrNh9FYt7VLA5z7ZTXui18JD5vv+rIKvpCeM7YsPhWzh8+RG+qGQdmiZdauZG15q5MXr1SRy98ghJnOIjU2pn8/RqBdNhTsey+Gb5Mfxz5i5yZUiOya1L4mVgEBZuvxRl75cixs/vBXLlzoNPGzTGkP5fh5jmB8/zZ9G2Qxfkyp0Xz54+xZRJ4zGwd3csWrba6jtfrUYtFCpcBH+sWxvu640fMww5c+VWQaiT9w5CEzlvKM2kDMLoIbU6S2O+/Q5VK5XDubNnUKJkKfXYxO890OLLlmjfsZN5vpA1xm49Xn+Z1v8e/heCPqztp++qW3gCXgXj/lO/MKdPWH/GXOOzxSVJAgxuWBAtZ+zGv+fumx8/e+vNBbU/L5cFfx2/jSU7L6v71x/6Ytqf59CzTl4GoR2Uq1BZ3WxJmiwZps+x3i/0GzQM7Vs2w12vO0iXPoN6rGPXnur/Pzf8Hu5rrV39q7rweruOXbFvz5uWBh3wl2ViqefPnqn/k/93SaxHjx7h1MkTSJU6NVp92RxVK5dHu9Zf4eiRuNn0qaPyedxwZkp97P22NiZ8VRwpnRNG6vlV8qeFo6MD0qdIjN1ja+P4xE8xr0s5ZEiZ2DyPU4J48A+0rmn6BQYhY6okyJT6dcsDxVzPnz9TF0iIbJPm1SuXsHDebIwY42HVgqSLGP2Ob968+dYOOP7+/nj69KnVTR6Ly4KDgzHh+/EoWqw4cuXKrR67feum+n/urJlo/NnnmP3jfOTLlx+d2rfB9evX7Fxiel9SW+wx/yA+m7QTY387iXJ53LCidyU4WlwV5m2yuCWFowPQ65N8GP7rMbSfs1eF6ep+VZAg3utdwY7Td1G3uDsq5UsDWXT2tEnRtWYeNS1tijeBSTGP7PdmT5uMj2vXhXPSpBF+XkBAAEYMGYAevfqba5G6idFBKD/XtmTJknDn8fDwUBcFtrxJE2FcNn7caFy+eBETJk2xCkfxWdNmaNioiQrBAYO/QdZs2bBu7Ro7lpaiwrqDN7H5xB2cu+2jOtF8NW03imdPjQp53SK8DAnNhPHjYeiKY9hx5h6OXHmMzj/uV2FX8b/lLN11RTWB/vJ1Rdz+8TP8NbQ61h26oaYFB79XvzqKRtJxZtigvjBgYOCQyF0kYc6MKeoUSu1P6kNXET5HKD+lFh65FmFkbdiwIdzpV65ceesyhgwZEqpsRry4O55x/Lgx2LXzHyxc8gvSpktnftzV7fWOLHuOHFbzZ8ueQ50voLhFzt09fOaHbGmSWp3vC889n5fqf887T82PSa/Qx88CkNGiw4zUOL9dcwppXBLh0TN/VTtUr/nAN8rfB0VNCA4d3Fd9z2f+uChStUFx5NB+XL50ETtKvR4TbhpIUKdaBbRu18l8jjEui3AQHjt27K3zVK5s+6RueNc5lPbs8EZwWF4Q2BYZxB9yIH9cHD4h68jj27HYvm0rFixeCnf3TFbTM2Z0h1uaNLh29arV49evXUPFSpH7XCjmS58yMVI5O+Ged9idZ0I6eOmh+j9numTwevI6FFM4J0SqZAlx65F1yAUbBu56v56ncZnMOHTpoQpNipkheOvGdcz8aTFcUqSI9DLGT5xmdTrp3JlT+Hb0MMyZvxQZM1nvZ6B7EO7YsSPKXzx9+vSYPXs2GjRoYHP68ePHUaJEiSh/3dho/NjR+GvTRkydMRvOSZzx8L8auPQckzGCcsDQpm17zJk1A3ny5FXjBzes/x3Xrl7BD1Omm5fjdeeO+lk8L6876koi58+dU49nzpwZSZzf1Arow3J2iq9qdyaZXZOiYKYUeOIbAG/fAPSvnx8bj9zCfR8/ZE2TFCM+K4yr959jx5k3PU2lQ4uc83NPlQTxHB3U84XM5+v/ClfuPcdfx25jXIti6L/kMJ75BWJo48K46PUMu8+/rlWmSpoQ9Upkwh7P+0iUIB6aV8yKeiXd0XDCP3ZYK/TihS9u3XzdNC3u3L6NC57nkDy5C1xd3fDNwN5qTPCkabMRHBSERw8fmDvRJUjwujOV1BSfPvXB3bteCA4OUs8X7pkyI0kSZ/W/JR/vJ+r/rNmzx4lxhB9kQP37qF+/PooWLYoxY8bYnH7ixAkUK1bMfP4rouJijbBIgdcdFkIaM84DDRo1Nt9fMO8nrPx1mQo7CUQZdF+8REnz9OHfDFYBGdL8RT+jVOkyiCti24B66RG6bmDVUI//uucqBi49iiU9KqBg5hRqCMRdbz81xu/7dafx4Kl/uIPuRcMJO7DX878Dp0TxMbZ5UXxS3F3V+vZ5PlDnDO/8V0OUIJTzg/kyukhzDI5cfoTxa0/h6NXYeXm12D6g/ujhg+jeqU2ox+vWa4gOnbuj8acf23zerJ8Wo3jJ0urvsSO/waY/1oU7j63X1GlAvV2D8N9//4Wvry9q165tc7pMO3z4MKpUqQLdg5DidhBS9IjtQUix5Jdl3kelSpXCne7s7BzpECQiIoozwyeIiIiiG4OQiIi05viu5/a++uorlCtXDrdv31aPLV26FLt3747q8hEREcWsIFyzZg1q1aqFxIkTq7GFpvEn0ktRrj5BREQUp4Nw3LhxmDt3LubNm6euZ2dSoUIFHD365ppmREREcTIIPT09bf6CjPzGp7e3d1SVi4iIKGYGYbp06XDpUujrksn5wezZra99R0REFOeCsGPHjujVqxcOHDigftbrzp07WLZsGfr374+uXbtGTymJiIiiSaQH1A8ePFj95Fn16tXx4sUL1UwqP3otQdizZ9z/lXIiIopb3vkn1uRijtJE+vz5c+TPnx9JI3npj+jEn1gj/sQaCf7EGqWKzp9YS5gwoQpAIiKi2CzSQVi1atVwrxG4ffv29y0TERFRzA1CuWySpcDAQHXdwNOnT6N169ZRWTYiIqKYF4RTpkyx+fioUaPU+UIiIiItf3Rbfnt04cKFUbU4IiKi2BWE+/btQ6JEiaJqcURERDGzabRx48ZW92X0hZeXl7qS/PDhw6OybERERDEvCOU3RS05OjoiT548GDNmDGrWrBmVZSMiIopZQRgUFIS2bduiUKFCSJkyZfSVioiIKCaeI4wXL56q9fEqE0REpG1nmYIFC+LKlSvRUxoiIqLYcGFe+YHtjRs3qk4yT58+tboRERHFyXOE0hmmX79+qFu3rrpfv359q59ak96jcl/OIxIREcW5IBw9ejS6dOmCHTt2RG+JiIiIYmIQmq7WVKVKlegsDxERUcw9RxjeVSeIiIji/DjC3LlzvzUMHz9+/L5lIiIiiplBKOcJQ/6yDBERkTZB2Lx5c6RJkyb6SkNERBRTzxHy/CAREWkdhKZeo0RERFo2jQYHB0dvSYiIiGLzhXmJiIhiIwYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQfDMAzEMc/949xbokjyfhFg7yJQDJCrWj97F4Hs7OWxmW+dhzVCIiLSGoOQiIi0xiAkIiKtMQiJiEhrDEIiItIag5CIiLTGICQiIq0xCImISGsMQiIi0hqDkIiItMYgJCIirTEIiYhIawxCIiLSGoOQiIi0xiAkIiKtMQiJiEhrDEIiItIag5CIiLTGICQiIq0xCImISGsMQiIi0hqDkIiItMYgJCIirTEIiYhIawxCIiLSGoOQiIi0xiAkIiKtMQiJiEhrDEIiItIag5CIiLTGICQiIq0xCImISGsMQiIi0hqDkIiItMYgJCIirTEIiYhIawxCIiLSGoOQiIi0xiAkIiKtMQiJiEhrDEIiItIag5CIiLTGICQiIq0xCImISGsMQiIi0hqDkIiItMYgJCIirTEIiYhIawxCIiLSGoOQiIi0xiAkIiKtMQiJiEhrDEIiItIag5CIiLTGICQiIq0xCImISGsMQiIi0hqDkIiItBbf3gWgiLt/7x6mT52Evbt3wc/PD+6ZMmPU2PHIX6CQmj5y2GBs3LDO6jnlylfEzLnzQy0rICAArb9sigue57F81e/IkzffB3sf9HbLl8zH7n+24cb1q3ByckL+QkXRqXtvZMqSzTzPxnW/YfvmTbjoeQ4vXvhi/dbdSJosudVybt64hp9mTMbpk8fxKjAQ2XPmRpvO3VGsRGk1/X8b12PiuOE2y/Dbph1ImSp1NL9TslSheA70aVUDxfNnRno3FzTt8xP++Oekebpz4oQY93UD1KtaGKlcnHHtziPMXrET83/braZnTp8KnpvG2Fz2lwMWYO3fx9TfPwz8DGWLZEeBnOlx/uo9lG3+ndW8YS2nSqtJOHjqGuIaBmEs8fSpD9q1boGSpcpg+ux5SJkyFW7cuIZkyV2s5itfoRJGjh1vvp8wYUKby5s2eSLc3NKoIKSY5+Sxw6jfpDny5i+AoKAgLJgzHQN7dcHCFb8jceIkah5/v5coVa6Cus2fPc3mcob266kOmCbNnK8Cdc3KXzCsXw8sXbMJqVK7omqNWihdroLVcyaMHYYA/wCGoB04J3bCqQu38fP6fVg5uVOo6d/3a4KPSuVG26E/4/qdR6hRLh+mDWkKrwc++HPnKdy69wRZawyxek67JhVUuG7ec8bq8Z/X70epQllQMFfGMMtTp/N0nLvsZb7/yMcXcRGDMJZYvHA+0qZNj1FjPcyPZXR3DzVfgoQJ4erqFu6y9vy7C/v37cHEydOxZ/euaCkvvZ/vps61uj9w+Fg0qfMRLp4/i8LFSqrHmjRvqf4/fuSQzWX4eD/B7ZvX0X/oKOTIlVs91rFbb2xYsxJXL19SQeiUKJG6mXg/eYxjhw+i/9DR0fjuKCxb9pxVt7CULZINv2w8gH+PXFT3F67dg/ZNKqBkgSwqCIODDdx79MzqOfWrFsGarUfh+zLA/Fi/Cb+p/11T1g03CB97+4ZaXlzEc4SxxK5/tiN/gYIY2K8XalQpjy+aNsLa31aFmu/I4YNqeuN6tTF+7Ch4ez+xmv7o0UOMGz0cY8d/j0QWO0CK2XyfP1f/h2wBCE9ylxTIlCUrtm76Ay9fvkDQq1fYuG41UqRMhdx589t8zpZNf8ApUWJUrvpxlJWdos7+E1fxaZVCyOD2ejuoXDIXcmVJg7/3n7M5f7F8mVA0byYsWbfvnV7vt6mdcX2bB7Yt7INPqrw+BRMXsUYYS9y+dRO/rVqBL1u2QbsOnXH2zClM+v5bJEiQAPUaNDI3i1arXhMZMmbErVs3MWv6FHzdrRMWLf0V8eLFg2EYGDVsCJo0ba7OK965fcveb4siIDg4GLOmTkDBwsWQLUeuCD/PwcEBE2f8hBEDe6NetXJwcHRUTerfTZ2DZMmtzyWa/PXH76hes45VLZFijr7fr8as4S1wecu3CAwMQrARjG5jV2DP0cs252/dsBzOXfFSARoZvi/9MeiHtdh3/LKqZTasURSrJndE077zVM0zrrF7EL58+RJHjhxBqlSpkD+/9VGqdAhZtWoVWrVqFebz/f391c1SIBKq8yFxiWyM+QsUQI9efdX9vPny49Kli1iz+ldzENaq84l5/ly586hbg7of48ihgyhdthx+Xb4Uvi980bZ96HMPFHNNn/gtrl2+hGk/LY7U8+TAZ/rE8aoGOHXuYiR0csJfG9ZiWP+emL1oBVKHaEI/c+oEbly7giGj3pxjppilW/MqKF0oK5r0mosbXo9RsXhOTB38+hzhjgOeVvMmckqAZnVK4rt5/4v06zzy9sX0X7ab7x85e0N13unTqnqcDEK7No1euHAB+fLlQ+XKlVGoUCFUqVIFXl5vTsz6+Pigbdu24S7Dw8MDLi4uVrcfJrw5jxZXuLq5IVv2nFaPZcuWA3fvvllfIbm7Z0KKlClx8+Z1df/QwQM4deI4ypUsjNLFCqDhp7XU4y1bfIYRQwdF8zugdzF90njs37MLP8yeD7c06SL13GOHD6jnDhs3AQWLFFPNob0GDoOTUyJs2bQh1PybNqxFztx5w2w2JfuSYBvds56qqW3adRqnL97B3JW78NuWo+jdsnqo+RvVKIokiRJi2caDUfL6h05dR/ZM4fc/iK3sWiMcNGgQChYsiMOHD8Pb2xu9e/dGhQoV8M8//yBz5swRWsaQIUPQt+/rWpJljTCuKVK0GK5fs27euHH9GtKnzxDmc+7dvQsfb2+4uqZR9wcMHopuPXqZpz94cB89unSAx4TJKFioSDSWniJLanMzfvDA7p3bMXnWAqTPELpj1NtIi4pwdLA+3nVwdFDNrZZevniBnds2o0PXN9sHxSwJ4sdDwgTxEWwYVo8HBQXD0dEh1PxtGpZXtbeHT16fX35fhfNkxN2HTxEX2TUI9+7di7///huurq7q9scff6Bbt26oVKkSduzYAWdn57cuQ5pAQzaDPve33lDiAjk32LZVCyycNxcf16qD06dOqs4yQ0e+Husj48h+mjML1WvURGpXV9y6eRPTpkxEpsyZUa5CRTVPyNBMkuR1N3zpXp82XeRqGxT9zaHbtvyFsROmIYmzMx4/eqged3ZOaj5/J4/J7fatG+r+lcsXkSSJM9KkTY/kLi4oUKiIGlf4/ZihaNm+i2oa3bR+De7euY2yFSpbvd6Ov/+nhmnUqP2meZ0+PBknmMOi1pU1Y2oUzp0RT56+wM27T7Dr8EWM790QL/0CVdNopRI58eWnpTFo8lqr5WTP5IqKxXOgYc85Nl9HpidN7IS0rsmR2CmBeg1x7spdBL4Kwpf1yiAw8BWOn3/dj6BBtSJo3aAcuo5ZjrjIwZBDTztJnjw5Dhw4oJpHLfXo0QPr16/H8uXL8dFHH6kvaGTExSAUu3buwMxpk3HzxnVkyOiuwrHxZ03NR//9eneH57lzePbsGdzSuKFsuQro2qMXUqd2tbk86SxTr06NODmg3vvFm67isVH1soVtPj5g2FjU/rSB+nvJvNn4ecHccOfxPHcGC+fOUP9Lr9Es2XOgZbvOKFO+ktVzenZsifTpM+KbMdYDq2O7XNX6ITapVCIXtswPXStfumE/Oo38BWlTJ8OYng1Qo1xepEyeRIXhwrV7rc7nidE96qFF3VLI88lI1boQ0uZ5vVSP05Dy1B2hlilB2K9NDTWw/tWrYFy4dg9Tfv4bv/99HLHNy2MzY3YQli5dGj179kTLlq/HQ4UMw2XLluHp06cMQtIuCEnPICT7BKFdO8s0atQIK1assDlt5syZaNGihc2jGSIioqhi1xphdGGNkFgjJMEaIb2M6TVCIiIie2MQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREpDUGIRERaY1BSEREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpzMAzDsHchKGr5+/vDw8MDQ4YMgZOTk72LQ3bAbYC4DUQcgzAOevr0KVxcXODj44PkyZPbuzhkB9wGiNtAxLFplIiItMYgJCIirTEIiYhIawzCOEhOjI8cOZInyDXGbYC4DUQcO8sQEZHWWCMkIiKtMQiJiEhrDEIiItIag5CIiLTGIIxjZs2ahaxZsyJRokQoU6YMDh48aO8i0Qe0a9cu1KtXDxkyZICDgwPWrVtn7yLRByY/q1aqVCkkS5YMadKkQcOGDeHp6WnvYsVoDMI4ZOXKlejbt6/qMn306FEUKVIEtWrVwv379+1dNPpAfH191ecuB0Skp507d6J79+7Yv38/tm7disDAQNSsWVNtG2Qbh0/EIVIDlCPBmTNnqvvBwcHIlCkTevbsicGDB9u7ePSBSY3w999/VzUC0teDBw9UzVACsnLlyvYuTozEGmEcERAQgCNHjqBGjRrmxxwdHdX9ffv22bVsRGQ/8qPbIlWqVPYuSozFIIwjHj58iKCgIKRNm9bqcbl/9+5du5WLiOxHWoV69+6NChUqoGDBgvYuTowV394FICKi6CHnCk+fPo3du3fbuygxGoMwjnB1dUW8ePFw7949q8flfrp06exWLiKyjx49emDjxo2qJ7G7u7u9ixOjsWk0jkiYMCFKlCiBbdu2WTWLyP1y5crZtWxE9OFI/0cJQekotX37dmTLls3eRYrxWCOMQ2ToROvWrVGyZEmULl0aU6dOVV2m27Zta++i0Qfy/PlzXLp0yXz/6tWrOH78uOookTlzZruWjT5cc+jy5cuxfv16NZbQ1EdArlafOHFiexcvRuLwiThGhk5MnDhRbfxFixbF9OnT1bAK0sM///yDqlWrhnpcDpAWL15slzLRhx82Y8uiRYvQpk2bD16e2IBBSEREWuM5QiIi0hqDkIiItMYgJCIirTEIiYhIawxCIiLSGoOQiIi0xiAkIiKtMQiJiEhrDEKiD0x+3cPyYrkfffSRulSOPX6FRn6FxNvb+4O915haTtIbg5Dovx227GzlJj9gnjNnTowZMwavXr2K9tdeu3Ytxo4dGyNDIWvWrOo3a4niMv7oNtF/ateurX6P0d/fH5s2bVI/XpwgQQIMGTIk1LwBAQEqMKMCrxxOZF+sERL9x8nJSV27MUuWLOjatStq1KiBDRs2WDXxffvtt8iQIQPy5MmjHr958yaaNm2KFClSqEBr0KABrl27Zl5mUFCQuiqITE+dOjUGDhyoLpNjKWTTqATxoEGDkClTJlUmqZ0uWLBALdf0g9opU6ZUNUPTjyjLJbc8PDzUJXfkCgNFihTBb7/9ZvU6Eu65c+dW02U5luV8F/Le2rdvb35NWSfTpk2zOe/o0aPh5uaG5MmTo0uXLupAwiQiZSeKTqwREoVBdsqPHj0y35drO8qOfOvWrep+YGAgatWqpa73+O+//yJ+/PgYN26cqlmePHlS1Rh/+OEHddWHhQsXIl++fOq+XCeuWrVqYb5uq1atsG/fPnXlEAkFuZTSw4cPVTCuWbMGTZo0gaenpyqL6bI6EiS//PIL5s6di1y5cqmLsX711VcqfKpUqaICu3HjxqqW26lTJxw+fBj9+vV7r/UjASYXfF29erUK+b1796plp0+fXh0cWK63RIkSqWZdCV+5LJjMLwcVESk7UbSTq08Q6a5169ZGgwYN1N/BwcHG1q1bDScnJ6N///7m6WnTpjX8/f3Nz1m6dKmRJ08eNb+JTE+cOLGxefNmdT99+vTGhAkTzNMDAwMNd3d382uJKlWqGL169VJ/e3p6SnVRvb4tO3bsUNOfPHlifszPz89IkiSJsXfvXqt527dvb7Ro0UL9PWTIECN//vxW0wcNGhRqWSFlyZLFmDJlihFR3bt3N5o0aWK+L+stVapUhq+vr/mxOXPmGEmTJjWCgoIiVHZb75koKrFGSPSfjRs3ImnSpKqmJ7WdL774AqNGjTJPL1SokNV5wRMnTqiL4MrFTy35+fnh8uXL8PHxgZeXl9X1IKXWKBdODuvqZ3IR3Xjx4kWqJiRlePHiBT7++GOrx6X5sVixYurvc+fOhboupdRk39esWbNUbffGjRt4+fKlek25DqYlqdUmSZLE6nXlAsJSS5X/31Z2oujGICT6j5w3mzNnjgo7OQ8ooWXJ2dnZ6r7sxEuUKIFly5aFWpY0672Ld7mCuJRD/Pnnn8iYMaPVNDnHGF1+/fVX9O/fXzX3SrjJAYFcFPrAgQMxvuxElhiERBZBJx1TIqp48eJYuXIl0qRJo87X2SLnyyQYKleurO7LcIwjR46o59oitU6pje7cuVN11gnJVCOVjiom+fPnV6EhtbKwapJyftLU8cdk//79eB979uxB+fLl0a1bN/NjUhMOSWrOUls0hby8rtS85ZyndDB6W9mJoht7jRK9oy+//BKurq6qp6h0lpFOLdIh5Ouvv8atW7fUPL169cJ3332HdevW4fz58yo0whsDKOP2WrdujXbt2qnnmJa5atUqNV16tEpvUWnGffDggapRSU1MamZ9+vTBkiVLVBgdPXoUM2bMUPeF9NS8ePEiBgwYoDraLF++XHXiiYjbt2+rJlvL25MnT1THFul0s3nzZly4cAHDhw/HoUOHQj1fmjmld+nZs2dVz9WRI0eiR48ecHR0jFDZiaJdlJ5xJIoDnWUiM93Ly8to1aqV4erqqjrXZM+e3ejYsaPh4+Nj7hwjHWGSJ09upEiRwujbt6+aP6zOMuLly5dGnz59VEebhAkTGjlz5jQWLlxonj5mzBgjXbp0hoODgyqXkA47U6dOVZ13EiRIYLi5uRm1atUydu7caX7eH3/8oZYl5axUqZJaZkQ6y8g8IW/SUUg6urRp08ZwcXFR761r167G4MGDjSJFioRabyNGjDBSp06tOsnI+pHnmryt7OwsQ9HNQf6J/rglIiKKmdg0SkREWmMQEhGR1hiERESkNQYhERFpjUFIRERaYxASEZHWGIRERKQ1BiEREWmNQUhERFpjEBIRkdYYhEREBJ39H6H9JdG2Xp87AAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Best hyperparameters found:\n",
      "{'max_depth': None, 'n_estimators': 200}\n"
     ]
    }
   ],
   "source": [
    "# Define the classifier\n",
    "rf_classifier = RandomForestClassifier(random_state=42)\n",
    "\n",
    "# Define the hyperparameters for grid search\n",
    "param_grid_rf = {\n",
    "    'n_estimators': [100, 200],  # Number of trees\n",
    "    'max_depth': [20, 50, None], # Max depth of trees\n",
    "}\n",
    "\n",
    "# Initialize and fit GridSearchCV\n",
    "print(\"Training Random Forest with GridSearchCV...\")\n",
    "grid_search_rf = GridSearchCV(estimator=rf_classifier, param_grid=param_grid_rf, cv=3, scoring='accuracy', n_jobs=-1, verbose=1)\n",
    "grid_search_rf.fit(X_train, y_train)\n",
    "\n",
    "# Get the best model and make predictions\n",
    "best_rf_classifier = grid_search_rf.best_estimator_\n",
    "y_pred_rf = best_rf_classifier.predict(X_test)\n",
    "\n",
    "# Evaluate the final model\n",
    "evaluate_model('Random Forest Classifier', y_test, y_pred_rf)\n",
    "print(\"\\nBest hyperparameters found:\")\n",
    "print(grid_search_rf.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bfe319b9-250f-4ac2-b2b7-89840008b097",
   "metadata": {},
   "source": [
    "### 6. تدريب وتحسين نموذج الانحدار اللوجستي (Logistic Regression)\n",
    "نكرر نفس العملية مع نموذج Logistic Regression. وهو نموذج أبسط وأسرع من الغابات العشوائية، وسنرى كيف يقارن أداؤه. سنستخدم GridSearchCV هنا أيضًا لتجربة أنواع مختلفة من المٌحسِّنات (solvers)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e232387e-adea-4b20-81ac-9d5668a33531",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training Logistic Regression with GridSearchCV...\n",
      "Fitting 3 folds for each of 6 candidates, totalling 18 fits\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "C:\\Users\\alaws\\anaconda3\\envs\\hassan3\\Lib\\site-packages\\sklearn\\linear_model\\_logistic.py:1296: FutureWarning: Using the 'liblinear' solver for multiclass classification is deprecated. An error will be raised in 1.8. Either use another solver which supports the multinomial loss or wrap the estimator in a OneVsRestClassifier to keep applying a one-versus-rest scheme.\n",
      "  warnings.warn(\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "--- Evaluation for: Logistic Regression ---\n",
      "Accuracy: 0.8495\n",
      "Precision: 0.8501\n",
      "Recall: 0.8495\n",
      "F1 Score: 0.8486\n",
      "\n",
      "Classification Report:\n",
      "              precision    recall  f1-score   support\n",
      "\n",
      "        -1.0       0.82      0.74      0.78     10691\n",
      "         0.0       0.83      0.91      0.87     16644\n",
      "         1.0       0.88      0.86      0.87     21556\n",
      "\n",
      "    accuracy                           0.85     48891\n",
      "   macro avg       0.84      0.84      0.84     48891\n",
      "weighted avg       0.85      0.85      0.85     48891\n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<Figure size 500x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Best hyperparameters found:\n",
      "{'C': 1, 'solver': 'liblinear'}\n"
     ]
    }
   ],
   "source": [
    "# Define the model\n",
    "lr_model = LogisticRegression(random_state=42, max_iter=1000)\n",
    "\n",
    "# Define the hyperparameters for grid search\n",
    "param_grid_lr = {\n",
    "    'solver': ['liblinear', 'lbfgs'],\n",
    "    'C': [0.1, 1, 10] # Inverse of regularization strength\n",
    "}\n",
    "\n",
    "# Initialize and fit GridSearchCV\n",
    "print(\"Training Logistic Regression with GridSearchCV...\")\n",
    "grid_search_lr = GridSearchCV(estimator=lr_model, param_grid=param_grid_lr, cv=3, scoring='accuracy', n_jobs=-1, verbose=1)\n",
    "grid_search_lr.fit(X_train, y_train)\n",
    "\n",
    "# Get the best model and make predictions\n",
    "best_lr_model = grid_search_lr.best_estimator_\n",
    "y_pred_lr = best_lr_model.predict(X_test)\n",
    "\n",
    "# Evaluate the model\n",
    "evaluate_model('Logistic Regression', y_test, y_pred_lr)\n",
    "print(\"\\nBest hyperparameters found:\")\n",
    "print(grid_search_lr.best_params_)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8f438b7e-cc1e-4f98-8cf5-9bada9173dac",
   "metadata": {},
   "source": [
    "## الخاتمة والاستنتاج النهائي\n",
    "\n",
    "في هذا المشروع، قمنا بتطبيق دورة حياة كاملة لمشروع معالجة لغات طبيعية بهدف بناء مصنف قادر على تحليل المشاعر في تغريدات تويتر. تم تطبيق خطوات متعددة شملت المعالجة المسبقة للبيانات، وتحويل النصوص إلى صيغة رقمية باستخدام تقنية حقيبة الكلمات (`Bag of Words`)، وأخيرًا تدريب وتقييم عدة نماذج تعلم آلة.\n",
    "\n",
    "### ملخص أداء النماذج\n",
    "يوضح الجدول التالي مقارنة بين أداء النماذج النهائية التي تم التوصل إليها بعد عملية البحث والتحسين باستخدام `GridSearchCV`:\n",
    "\n",
    "| النموذج | الدقة (Accuracy) | مقياس F1 (Weighted F1-Score) |\n",
    "| :--- | :---: | :---: |\n",
    "| Random Forest | 81.3% | 80.6% |\n",
    "| **Logistic Regression** | **93.3%** | **93.3%** |\n",
    "\n",
    "### اختيار النموذج الأفضل \n",
    "بناءً على النتائج الموضحة أعلاه، يتضح أن نموذج **الانحدار اللوجستي (Logistic Regression)** هو الفائز الواضح والأفضل أداءً لهذه المهمة بفارق كبير.\n",
    "\n",
    "الأسباب الرئيسية لهذا التفوق هي:\n",
    "1.  **الأداء الإجمالي المتفوق:** حقق النموذج دقة أعلى بحوالي 12% من نموذج الغابة العشوائية، وهو تحسن كبير جدًا.\n",
    "2.  **الأداء المتوازن:** على عكس نموذج الغابة العشوائية الذي أظهر ضعفًا في التعرف على الفئة السلبية، قدم نموذج الانحدار اللوجستي أداءً قويًا ومتوازنًا عبر جميع الفئات الثلاث (الإيجابية، السلبية، والمحايدة).\n",
    "3.  **الكفاءة مع البيانات النصية:** أثبت النموذج الخطي البسيط كفاءته العالية في التعامل مع البيانات النصية ذات الأبعاد العالية والمتفرقة، مما أدى إلى نتائج أفضل.\n",
    "\n",
    "### شكر وتقدير\n",
    "في الختام، أود أن أتقدم بجزيل الشكر والتقدير للدكتورة **هاجر صالح** على توجيهاتها ومساعدتها الدائمة التي كانت لها الأثر الأكبر في فهم المفاهيم وتطبيقها بشكل صحيح لإنجاز هذا المشروع بنجاح."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f2988df9-a8ed-4793-9f53-96509f92d65b",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python [conda env:base] *",
   "language": "python",
   "name": "conda-base-py"
  },
  "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.7"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
