{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "1692e9a3-ad20-46c3-b3b3-ed1eddecc998", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "from IPython.display import display # عشان يعرض جدول بشكل مرتب في Jupyter [web:432]\n", "import matplotlib.pyplot as plt\n", "import matplotlib.image as mpimg\n", "from IPython.display import Image\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "8511af7e-3263-4834-b0f4-73589345431e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
URLContentAuthorTweet_TextSpam_Ham
0https://twitter.com/AlArabiya/status/136664148...NaNNaNسي إن إن تستعد إدارة الرئيس بايدن لفرض عقوبات ...NaN
1https://twitter.com/skynewsarabia/status/13639...NaNNaNحكم يتصدى لكرة في طريقها لمرمى في لقطة كوميدية...NaN
2https://twitter.com/AlArabiya/status/136497388...NaNNaNتابعونا على العربية عبر برنامج بانوراما ال بتو...NaN
3https://twitter.com/AlArabiya/status/136074035...NaNNaNخبير بفريق التحقيق في منظمة الصحة العالمية بكي...NaN
4https://twitter.com/AlArabiya/status/136636818...NaNNaNبالوثائق تعرف على أهم الاتفاقيات التاريخية لتر...NaN
5https://twitter.com/AlArabiya/status/136563882...NaNNaNالإمارات تعلن وقوفها التام مع السعودية في جهود...NaN
6https://twitter.com/skynewsarabia/status/13641...NaNNaNشحنة جديدة من لقاح كورونا الصيني تصل مطار القاهرةNaN
7NaNNaNNaNالان متاح لدينا شهاده ايلتس معتمده بدون اختبار...NaN
8https://twitter.com/emaratalyoum/status/135908...NaNNaNحبس موظف تحرش بطفل في الألعاب المائية الإمارات...NaN
9https://twitter.com/skynewsarabia/status/13638...NaNNaNامتلاك هاتف محمول بين عقلية الماضي والحاضرNaN
10https://twitter.com/skynewsarabia/status/13622...NaNNaNبعد إقفال الحضانات ماذا اكتشف الأهل في أطفالهمNaN
11https://twitter.com/emaratalyoum/status/136380...NaNNaNمشاهد من فعاليات معرض جلفود في مركز دبي التجار...NaN
12https://twitter.com/emaratalyoum/status/136375...NaNNaNإقامة دبي تدشن رسميا مشروع رحلة المسافر الذكي ...NaN
13https://twitter.com/AlArabiya/status/136053895...NaNNaNوصلت إلى أدنى مستوى لها منذ أكتوبر وكالة الصحا...NaN
14https://twitter.com/skynewsarabia/status/13606...NaNNaNمبان ومكاتب تهتز شاهد زلزال يضرب فوكوشيما اليا...NaN
15https://twitter.com/AlArabiya/status/136182244...NaNNaNنائب مساعد وزير الخارجية الأميركي السابق لشؤون...NaN
16NaNNaNNaNبعد تجربة التطبيق صراحة التطبيق جبار يشتغل الق...NaN
17https://twitter.com/emaratalyoum/status/136570...NaNNaNفوز التعاون ومصفوت في دوري الدرجة الأولى الإما...NaN
18https://twitter.com/AlArabiya/status/136056912...NaNNaNبرهم صالح العراق يحتاج إصلاحا شاملا ويجب عدم ا...NaN
19https://twitter.com/AlArabiya/status/136380836...NaNNaNمقتل السفير الإيطالي في الكونغو بعد هجوم استهد...NaN
\n", "
" ], "text/plain": [ " URL Content Author \\\n", "0 https://twitter.com/AlArabiya/status/136664148... NaN NaN \n", "1 https://twitter.com/skynewsarabia/status/13639... NaN NaN \n", "2 https://twitter.com/AlArabiya/status/136497388... NaN NaN \n", "3 https://twitter.com/AlArabiya/status/136074035... NaN NaN \n", "4 https://twitter.com/AlArabiya/status/136636818... NaN NaN \n", "5 https://twitter.com/AlArabiya/status/136563882... NaN NaN \n", "6 https://twitter.com/skynewsarabia/status/13641... NaN NaN \n", "7 NaN NaN NaN \n", "8 https://twitter.com/emaratalyoum/status/135908... NaN NaN \n", "9 https://twitter.com/skynewsarabia/status/13638... NaN NaN \n", "10 https://twitter.com/skynewsarabia/status/13622... NaN NaN \n", "11 https://twitter.com/emaratalyoum/status/136380... NaN NaN \n", "12 https://twitter.com/emaratalyoum/status/136375... NaN NaN \n", "13 https://twitter.com/AlArabiya/status/136053895... NaN NaN \n", "14 https://twitter.com/skynewsarabia/status/13606... NaN NaN \n", "15 https://twitter.com/AlArabiya/status/136182244... NaN NaN \n", "16 NaN NaN NaN \n", "17 https://twitter.com/emaratalyoum/status/136570... NaN NaN \n", "18 https://twitter.com/AlArabiya/status/136056912... NaN NaN \n", "19 https://twitter.com/AlArabiya/status/136380836... NaN NaN \n", "\n", " Tweet_Text Spam_Ham \n", "0 سي إن إن تستعد إدارة الرئيس بايدن لفرض عقوبات ... NaN \n", "1 حكم يتصدى لكرة في طريقها لمرمى في لقطة كوميدية... NaN \n", "2 تابعونا على العربية عبر برنامج بانوراما ال بتو... NaN \n", "3 خبير بفريق التحقيق في منظمة الصحة العالمية بكي... NaN \n", "4 بالوثائق تعرف على أهم الاتفاقيات التاريخية لتر... NaN \n", "5 الإمارات تعلن وقوفها التام مع السعودية في جهود... NaN \n", "6 شحنة جديدة من لقاح كورونا الصيني تصل مطار القاهرة NaN \n", "7 الان متاح لدينا شهاده ايلتس معتمده بدون اختبار... NaN \n", "8 حبس موظف تحرش بطفل في الألعاب المائية الإمارات... NaN \n", "9 امتلاك هاتف محمول بين عقلية الماضي والحاضر NaN \n", "10 بعد إقفال الحضانات ماذا اكتشف الأهل في أطفالهم NaN \n", "11 مشاهد من فعاليات معرض جلفود في مركز دبي التجار... NaN \n", "12 إقامة دبي تدشن رسميا مشروع رحلة المسافر الذكي ... NaN \n", "13 وصلت إلى أدنى مستوى لها منذ أكتوبر وكالة الصحا... NaN \n", "14 مبان ومكاتب تهتز شاهد زلزال يضرب فوكوشيما اليا... NaN \n", "15 نائب مساعد وزير الخارجية الأميركي السابق لشؤون... NaN \n", "16 بعد تجربة التطبيق صراحة التطبيق جبار يشتغل الق... NaN \n", "17 فوز التعاون ومصفوت في دوري الدرجة الأولى الإما... NaN \n", "18 برهم صالح العراق يحتاج إصلاحا شاملا ويجب عدم ا... NaN \n", "19 مقتل السفير الإيطالي في الكونغو بعد هجوم استهد... NaN " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "Shape (rows, cols): (2241, 5)\n", "Spam_Ham\n", "spam 830\n", "ham 776\n", "NaN 635\n", "Name: count, dtype: int64\n" ] } ], "source": [ "# ==== Paths ====\n", "csv_path = r\"C:\\Users\\Thwaib-PC\\Desktop\\All_Projects\\archive\\.ipynb_checkpoints\\All_Datasets_Reorganized-checkpoint.csv\"\n", "\n", "\n", "# ==== Load ====\n", "df = pd.read_csv(csv_path, encoding=\"utf-8-sig\") \n", "\n", "# ==== Drop columns ====\n", "cols_to_drop = [\"Time\", \"Date_2\",\"Date\"] # غيّر القائمة حسب الأعمدة اللي بدك تحذفها\n", "df = df.drop(columns=cols_to_drop, errors=\"ignore\") # errors=ignore ما يعمل خطأ إذا العمود مش موجود [web:340]\n", "\n", "# ==== Show results in notebook ====\n", "display(df.head(20)) # عرض أول 20 صف [web:360]\n", "print(\"Shape (rows, cols):\", df.shape)\n", "if \"Spam_Ham\" in df.columns:\n", " print(df[\"Spam_Ham\"].value_counts(dropna=False)) # إحصاء labels\n", "\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "6f5e0fb9-2ddc-4e86-ac96-239f5f9df4eb", "metadata": {}, "outputs": [], "source": [ "# Create author labels: spam / not_spam\n", "tmp = df[df[\"Author\"].notna() & df[\"Spam_Ham\"].isin([\"spam\", \"ham\"])].copy()\n", "tmp[\"is_spam\"] = (tmp[\"Spam_Ham\"] == \"spam\").astype(int)\n", "\n", "authors = tmp.groupby(\"Author\")[\"is_spam\"].mean().reset_index()\n", "authors[\"author_label\"] = authors[\"is_spam\"].ge(0.5).map({True: \"spam\", False: \"not_spam\"})\n", "\n", "# Save to Excel file\n", "authors[[\"Author\", \"author_label\"]].to_excel(\"authors_labels.xlsx\", index=False, engine=\"openpyxl\")\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "9418b16b-f3b1-4646-8efb-0c72ded68c29", "metadata": {}, "outputs": [], "source": [ "df = df.drop(columns=[\"Author\"], errors=\"ignore\") # drop column if exists [web:340][web:381]\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "b7f60e74-538c-43c0-97bc-4483facad000", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
URLContentTweet_TextSpam_Ham
0https://twitter.com/AlArabiya/status/136664148...NaNسي إن إن تستعد إدارة الرئيس بايدن لفرض عقوبات ...NaN
1https://twitter.com/skynewsarabia/status/13639...NaNحكم يتصدى لكرة في طريقها لمرمى في لقطة كوميدية...NaN
2https://twitter.com/AlArabiya/status/136497388...NaNتابعونا على العربية عبر برنامج بانوراما ال بتو...NaN
3https://twitter.com/AlArabiya/status/136074035...NaNخبير بفريق التحقيق في منظمة الصحة العالمية بكي...NaN
4https://twitter.com/AlArabiya/status/136636818...NaNبالوثائق تعرف على أهم الاتفاقيات التاريخية لتر...NaN
5https://twitter.com/AlArabiya/status/136563882...NaNالإمارات تعلن وقوفها التام مع السعودية في جهود...NaN
6https://twitter.com/skynewsarabia/status/13641...NaNشحنة جديدة من لقاح كورونا الصيني تصل مطار القاهرةNaN
7NaNNaNالان متاح لدينا شهاده ايلتس معتمده بدون اختبار...NaN
8https://twitter.com/emaratalyoum/status/135908...NaNحبس موظف تحرش بطفل في الألعاب المائية الإمارات...NaN
9https://twitter.com/skynewsarabia/status/13638...NaNامتلاك هاتف محمول بين عقلية الماضي والحاضرNaN
10https://twitter.com/skynewsarabia/status/13622...NaNبعد إقفال الحضانات ماذا اكتشف الأهل في أطفالهمNaN
11https://twitter.com/emaratalyoum/status/136380...NaNمشاهد من فعاليات معرض جلفود في مركز دبي التجار...NaN
12https://twitter.com/emaratalyoum/status/136375...NaNإقامة دبي تدشن رسميا مشروع رحلة المسافر الذكي ...NaN
13https://twitter.com/AlArabiya/status/136053895...NaNوصلت إلى أدنى مستوى لها منذ أكتوبر وكالة الصحا...NaN
14https://twitter.com/skynewsarabia/status/13606...NaNمبان ومكاتب تهتز شاهد زلزال يضرب فوكوشيما اليا...NaN
15https://twitter.com/AlArabiya/status/136182244...NaNنائب مساعد وزير الخارجية الأميركي السابق لشؤون...NaN
16NaNNaNبعد تجربة التطبيق صراحة التطبيق جبار يشتغل الق...NaN
17https://twitter.com/emaratalyoum/status/136570...NaNفوز التعاون ومصفوت في دوري الدرجة الأولى الإما...NaN
18https://twitter.com/AlArabiya/status/136056912...NaNبرهم صالح العراق يحتاج إصلاحا شاملا ويجب عدم ا...NaN
19https://twitter.com/AlArabiya/status/136380836...NaNمقتل السفير الإيطالي في الكونغو بعد هجوم استهد...NaN
\n", "
" ], "text/plain": [ " URL Content \\\n", "0 https://twitter.com/AlArabiya/status/136664148... NaN \n", "1 https://twitter.com/skynewsarabia/status/13639... NaN \n", "2 https://twitter.com/AlArabiya/status/136497388... NaN \n", "3 https://twitter.com/AlArabiya/status/136074035... NaN \n", "4 https://twitter.com/AlArabiya/status/136636818... NaN \n", "5 https://twitter.com/AlArabiya/status/136563882... NaN \n", "6 https://twitter.com/skynewsarabia/status/13641... NaN \n", "7 NaN NaN \n", "8 https://twitter.com/emaratalyoum/status/135908... NaN \n", "9 https://twitter.com/skynewsarabia/status/13638... NaN \n", "10 https://twitter.com/skynewsarabia/status/13622... NaN \n", "11 https://twitter.com/emaratalyoum/status/136380... NaN \n", "12 https://twitter.com/emaratalyoum/status/136375... NaN \n", "13 https://twitter.com/AlArabiya/status/136053895... NaN \n", "14 https://twitter.com/skynewsarabia/status/13606... NaN \n", "15 https://twitter.com/AlArabiya/status/136182244... NaN \n", "16 NaN NaN \n", "17 https://twitter.com/emaratalyoum/status/136570... NaN \n", "18 https://twitter.com/AlArabiya/status/136056912... NaN \n", "19 https://twitter.com/AlArabiya/status/136380836... NaN \n", "\n", " Tweet_Text Spam_Ham \n", "0 سي إن إن تستعد إدارة الرئيس بايدن لفرض عقوبات ... NaN \n", "1 حكم يتصدى لكرة في طريقها لمرمى في لقطة كوميدية... NaN \n", "2 تابعونا على العربية عبر برنامج بانوراما ال بتو... NaN \n", "3 خبير بفريق التحقيق في منظمة الصحة العالمية بكي... NaN \n", "4 بالوثائق تعرف على أهم الاتفاقيات التاريخية لتر... NaN \n", "5 الإمارات تعلن وقوفها التام مع السعودية في جهود... NaN \n", "6 شحنة جديدة من لقاح كورونا الصيني تصل مطار القاهرة NaN \n", "7 الان متاح لدينا شهاده ايلتس معتمده بدون اختبار... NaN \n", "8 حبس موظف تحرش بطفل في الألعاب المائية الإمارات... NaN \n", "9 امتلاك هاتف محمول بين عقلية الماضي والحاضر NaN \n", "10 بعد إقفال الحضانات ماذا اكتشف الأهل في أطفالهم NaN \n", "11 مشاهد من فعاليات معرض جلفود في مركز دبي التجار... NaN \n", "12 إقامة دبي تدشن رسميا مشروع رحلة المسافر الذكي ... NaN \n", "13 وصلت إلى أدنى مستوى لها منذ أكتوبر وكالة الصحا... NaN \n", "14 مبان ومكاتب تهتز شاهد زلزال يضرب فوكوشيما اليا... NaN \n", "15 نائب مساعد وزير الخارجية الأميركي السابق لشؤون... NaN \n", "16 بعد تجربة التطبيق صراحة التطبيق جبار يشتغل الق... NaN \n", "17 فوز التعاون ومصفوت في دوري الدرجة الأولى الإما... NaN \n", "18 برهم صالح العراق يحتاج إصلاحا شاملا ويجب عدم ا... NaN \n", "19 مقتل السفير الإيطالي في الكونغو بعد هجوم استهد... NaN " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(df.head(20)) # عرض أول 20 صف [web:516]\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "1f434714-a226-4228-892d-365b86e385da", "metadata": {}, "outputs": [], "source": [ "# rows without spam/ham label\n", "testing_df = df[df[\"Spam_Ham\"].isna()].copy() # select missing labels [web:537]\n", "\n", "# save to Excel\n", "testing_df.to_excel(\"Testing Model.xlsx\", index=False, engine=\"openpyxl\") # export to Excel [web:536]\n" ] }, { "cell_type": "code", "execution_count": 7, "id": "6545e6b2-ba8a-424c-9ca3-8cfd8d3642ad", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "\n", "u = df[\"URL\"].astype(str).str.lower()\n", "\n", "df[\"URL_Source\"] = np.select(\n", " [\n", " u.str.contains(\"twitter.com\", na=False) | u.str.contains(\"x.com\", na=False),\n", " u.str.contains(\"youtube.com\", na=False) | u.str.contains(\"youtu.be\", na=False),\n", " ],\n", " [\"twitter\", \"youtube\"],\n", " default=\"other\",\n", ")\n" ] }, { "cell_type": "code", "execution_count": 8, "id": "27027f3c-0516-4d7a-ada9-f34693749ad3", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
URLContentTweet_TextSpam_HamURL_Source
0https://twitter.com/AlArabiya/status/136664148...سي إن إن تستعد إدارة الرئيس بايدن لفرض عقوبات ...سي إن إن تستعد إدارة الرئيس بايدن لفرض عقوبات ...NaNtwitter
1https://twitter.com/skynewsarabia/status/13639...حكم يتصدى لكرة في طريقها لمرمى في لقطة كوميدية...حكم يتصدى لكرة في طريقها لمرمى في لقطة كوميدية...NaNtwitter
2https://twitter.com/AlArabiya/status/136497388...تابعونا على العربية عبر برنامج بانوراما ال بتو...تابعونا على العربية عبر برنامج بانوراما ال بتو...NaNtwitter
3https://twitter.com/AlArabiya/status/136074035...خبير بفريق التحقيق في منظمة الصحة العالمية بكي...خبير بفريق التحقيق في منظمة الصحة العالمية بكي...NaNtwitter
4https://twitter.com/AlArabiya/status/136636818...بالوثائق تعرف على أهم الاتفاقيات التاريخية لتر...بالوثائق تعرف على أهم الاتفاقيات التاريخية لتر...NaNtwitter
5https://twitter.com/AlArabiya/status/136563882...الإمارات تعلن وقوفها التام مع السعودية في جهود...الإمارات تعلن وقوفها التام مع السعودية في جهود...NaNtwitter
6https://twitter.com/skynewsarabia/status/13641...شحنة جديدة من لقاح كورونا الصيني تصل مطار القاهرةشحنة جديدة من لقاح كورونا الصيني تصل مطار القاهرةNaNtwitter
7NaNالان متاح لدينا شهاده ايلتس معتمده بدون اختبار...الان متاح لدينا شهاده ايلتس معتمده بدون اختبار...NaNother
8https://twitter.com/emaratalyoum/status/135908...حبس موظف تحرش بطفل في الألعاب المائية الإمارات...حبس موظف تحرش بطفل في الألعاب المائية الإمارات...NaNtwitter
9https://twitter.com/skynewsarabia/status/13638...امتلاك هاتف محمول بين عقلية الماضي والحاضرامتلاك هاتف محمول بين عقلية الماضي والحاضرNaNtwitter
10https://twitter.com/skynewsarabia/status/13622...بعد إقفال الحضانات ماذا اكتشف الأهل في أطفالهمبعد إقفال الحضانات ماذا اكتشف الأهل في أطفالهمNaNtwitter
11https://twitter.com/emaratalyoum/status/136380...مشاهد من فعاليات معرض جلفود في مركز دبي التجار...مشاهد من فعاليات معرض جلفود في مركز دبي التجار...NaNtwitter
12https://twitter.com/emaratalyoum/status/136375...إقامة دبي تدشن رسميا مشروع رحلة المسافر الذكي ...إقامة دبي تدشن رسميا مشروع رحلة المسافر الذكي ...NaNtwitter
13https://twitter.com/AlArabiya/status/136053895...وصلت إلى أدنى مستوى لها منذ أكتوبر وكالة الصحا...وصلت إلى أدنى مستوى لها منذ أكتوبر وكالة الصحا...NaNtwitter
14https://twitter.com/skynewsarabia/status/13606...مبان ومكاتب تهتز شاهد زلزال يضرب فوكوشيما اليا...مبان ومكاتب تهتز شاهد زلزال يضرب فوكوشيما اليا...NaNtwitter
15https://twitter.com/AlArabiya/status/136182244...نائب مساعد وزير الخارجية الأميركي السابق لشؤون...نائب مساعد وزير الخارجية الأميركي السابق لشؤون...NaNtwitter
16NaNبعد تجربة التطبيق صراحة التطبيق جبار يشتغل الق...بعد تجربة التطبيق صراحة التطبيق جبار يشتغل الق...NaNother
17https://twitter.com/emaratalyoum/status/136570...فوز التعاون ومصفوت في دوري الدرجة الأولى الإما...فوز التعاون ومصفوت في دوري الدرجة الأولى الإما...NaNtwitter
18https://twitter.com/AlArabiya/status/136056912...برهم صالح العراق يحتاج إصلاحا شاملا ويجب عدم ا...برهم صالح العراق يحتاج إصلاحا شاملا ويجب عدم ا...NaNtwitter
19https://twitter.com/AlArabiya/status/136380836...مقتل السفير الإيطالي في الكونغو بعد هجوم استهد...مقتل السفير الإيطالي في الكونغو بعد هجوم استهد...NaNtwitter
\n", "
" ], "text/plain": [ " URL \\\n", "0 https://twitter.com/AlArabiya/status/136664148... \n", "1 https://twitter.com/skynewsarabia/status/13639... \n", "2 https://twitter.com/AlArabiya/status/136497388... \n", "3 https://twitter.com/AlArabiya/status/136074035... \n", "4 https://twitter.com/AlArabiya/status/136636818... \n", "5 https://twitter.com/AlArabiya/status/136563882... \n", "6 https://twitter.com/skynewsarabia/status/13641... \n", "7 NaN \n", "8 https://twitter.com/emaratalyoum/status/135908... \n", "9 https://twitter.com/skynewsarabia/status/13638... \n", "10 https://twitter.com/skynewsarabia/status/13622... \n", "11 https://twitter.com/emaratalyoum/status/136380... \n", "12 https://twitter.com/emaratalyoum/status/136375... \n", "13 https://twitter.com/AlArabiya/status/136053895... \n", "14 https://twitter.com/skynewsarabia/status/13606... \n", "15 https://twitter.com/AlArabiya/status/136182244... \n", "16 NaN \n", "17 https://twitter.com/emaratalyoum/status/136570... \n", "18 https://twitter.com/AlArabiya/status/136056912... \n", "19 https://twitter.com/AlArabiya/status/136380836... \n", "\n", " Content \\\n", "0 سي إن إن تستعد إدارة الرئيس بايدن لفرض عقوبات ... \n", "1 حكم يتصدى لكرة في طريقها لمرمى في لقطة كوميدية... \n", "2 تابعونا على العربية عبر برنامج بانوراما ال بتو... \n", "3 خبير بفريق التحقيق في منظمة الصحة العالمية بكي... \n", "4 بالوثائق تعرف على أهم الاتفاقيات التاريخية لتر... \n", "5 الإمارات تعلن وقوفها التام مع السعودية في جهود... \n", "6 شحنة جديدة من لقاح كورونا الصيني تصل مطار القاهرة \n", "7 الان متاح لدينا شهاده ايلتس معتمده بدون اختبار... \n", "8 حبس موظف تحرش بطفل في الألعاب المائية الإمارات... \n", "9 امتلاك هاتف محمول بين عقلية الماضي والحاضر \n", "10 بعد إقفال الحضانات ماذا اكتشف الأهل في أطفالهم \n", "11 مشاهد من فعاليات معرض جلفود في مركز دبي التجار... \n", "12 إقامة دبي تدشن رسميا مشروع رحلة المسافر الذكي ... \n", "13 وصلت إلى أدنى مستوى لها منذ أكتوبر وكالة الصحا... \n", "14 مبان ومكاتب تهتز شاهد زلزال يضرب فوكوشيما اليا... \n", "15 نائب مساعد وزير الخارجية الأميركي السابق لشؤون... \n", "16 بعد تجربة التطبيق صراحة التطبيق جبار يشتغل الق... \n", "17 فوز التعاون ومصفوت في دوري الدرجة الأولى الإما... \n", "18 برهم صالح العراق يحتاج إصلاحا شاملا ويجب عدم ا... \n", "19 مقتل السفير الإيطالي في الكونغو بعد هجوم استهد... \n", "\n", " Tweet_Text Spam_Ham URL_Source \n", "0 سي إن إن تستعد إدارة الرئيس بايدن لفرض عقوبات ... NaN twitter \n", "1 حكم يتصدى لكرة في طريقها لمرمى في لقطة كوميدية... NaN twitter \n", "2 تابعونا على العربية عبر برنامج بانوراما ال بتو... NaN twitter \n", "3 خبير بفريق التحقيق في منظمة الصحة العالمية بكي... NaN twitter \n", "4 بالوثائق تعرف على أهم الاتفاقيات التاريخية لتر... NaN twitter \n", "5 الإمارات تعلن وقوفها التام مع السعودية في جهود... NaN twitter \n", "6 شحنة جديدة من لقاح كورونا الصيني تصل مطار القاهرة NaN twitter \n", "7 الان متاح لدينا شهاده ايلتس معتمده بدون اختبار... NaN other \n", "8 حبس موظف تحرش بطفل في الألعاب المائية الإمارات... NaN twitter \n", "9 امتلاك هاتف محمول بين عقلية الماضي والحاضر NaN twitter \n", "10 بعد إقفال الحضانات ماذا اكتشف الأهل في أطفالهم NaN twitter \n", "11 مشاهد من فعاليات معرض جلفود في مركز دبي التجار... NaN twitter \n", "12 إقامة دبي تدشن رسميا مشروع رحلة المسافر الذكي ... NaN twitter \n", "13 وصلت إلى أدنى مستوى لها منذ أكتوبر وكالة الصحا... NaN twitter \n", "14 مبان ومكاتب تهتز شاهد زلزال يضرب فوكوشيما اليا... NaN twitter \n", "15 نائب مساعد وزير الخارجية الأميركي السابق لشؤون... NaN twitter \n", "16 بعد تجربة التطبيق صراحة التطبيق جبار يشتغل الق... NaN other \n", "17 فوز التعاون ومصفوت في دوري الدرجة الأولى الإما... NaN twitter \n", "18 برهم صالح العراق يحتاج إصلاحا شاملا ويجب عدم ا... NaN twitter \n", "19 مقتل السفير الإيطالي في الكونغو بعد هجوم استهد... NaN twitter " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "\n", "# Content: اعتبر الفارغ/المسافات كأنه مفقود\n", "df[\"Content\"] = df[\"Content\"].replace(r\"^\\s*$\", pd.NA, regex=True)\n", "\n", "# عبّي Content من Tweet_Text فقط إذا Content مفقود\n", "df[\"Content\"] = df[\"Content\"].fillna(df[\"Tweet_Text\"])\n", "\n", "display(df.head(20)) # عرض أول 20 صف [web:516]\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "529a11bb-abfe-4230-806e-c3e094175083", "metadata": {}, "outputs": [], "source": [ "cols_to_drop = [\"URL\"] # غيّر القائمة حسب الأعمدة اللي بدك تحذفها\n", "df = df.drop(columns=cols_to_drop, errors=\"ignore\") # errors=ignore ما يعمل خطأ إذا العمود مش موجود [web:340]" ] }, { "cell_type": "code", "execution_count": 10, "id": "2d3da75d-477b-4099-b0fd-10f8dcf88493", "metadata": {}, "outputs": [], "source": [ "df = df.drop(columns=[\"URL\",\"Tweet_Text\"], errors=\"ignore\") # drop column if exists [web:340][web:381]" ] }, { "cell_type": "code", "execution_count": 11, "id": "75ee74c1-3b89-4ea7-9908-4e067dc0335b", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ContentSpam_HamURL_Source
0سي إن إن تستعد إدارة الرئيس بايدن لفرض عقوبات ...NaNtwitter
1حكم يتصدى لكرة في طريقها لمرمى في لقطة كوميدية...NaNtwitter
2تابعونا على العربية عبر برنامج بانوراما ال بتو...NaNtwitter
3خبير بفريق التحقيق في منظمة الصحة العالمية بكي...NaNtwitter
4بالوثائق تعرف على أهم الاتفاقيات التاريخية لتر...NaNtwitter
5الإمارات تعلن وقوفها التام مع السعودية في جهود...NaNtwitter
6شحنة جديدة من لقاح كورونا الصيني تصل مطار القاهرةNaNtwitter
7الان متاح لدينا شهاده ايلتس معتمده بدون اختبار...NaNother
8حبس موظف تحرش بطفل في الألعاب المائية الإمارات...NaNtwitter
9امتلاك هاتف محمول بين عقلية الماضي والحاضرNaNtwitter
10بعد إقفال الحضانات ماذا اكتشف الأهل في أطفالهمNaNtwitter
11مشاهد من فعاليات معرض جلفود في مركز دبي التجار...NaNtwitter
12إقامة دبي تدشن رسميا مشروع رحلة المسافر الذكي ...NaNtwitter
13وصلت إلى أدنى مستوى لها منذ أكتوبر وكالة الصحا...NaNtwitter
14مبان ومكاتب تهتز شاهد زلزال يضرب فوكوشيما اليا...NaNtwitter
15نائب مساعد وزير الخارجية الأميركي السابق لشؤون...NaNtwitter
16بعد تجربة التطبيق صراحة التطبيق جبار يشتغل الق...NaNother
17فوز التعاون ومصفوت في دوري الدرجة الأولى الإما...NaNtwitter
18برهم صالح العراق يحتاج إصلاحا شاملا ويجب عدم ا...NaNtwitter
19مقتل السفير الإيطالي في الكونغو بعد هجوم استهد...NaNtwitter
\n", "
" ], "text/plain": [ " Content Spam_Ham URL_Source\n", "0 سي إن إن تستعد إدارة الرئيس بايدن لفرض عقوبات ... NaN twitter\n", "1 حكم يتصدى لكرة في طريقها لمرمى في لقطة كوميدية... NaN twitter\n", "2 تابعونا على العربية عبر برنامج بانوراما ال بتو... NaN twitter\n", "3 خبير بفريق التحقيق في منظمة الصحة العالمية بكي... NaN twitter\n", "4 بالوثائق تعرف على أهم الاتفاقيات التاريخية لتر... NaN twitter\n", "5 الإمارات تعلن وقوفها التام مع السعودية في جهود... NaN twitter\n", "6 شحنة جديدة من لقاح كورونا الصيني تصل مطار القاهرة NaN twitter\n", "7 الان متاح لدينا شهاده ايلتس معتمده بدون اختبار... NaN other\n", "8 حبس موظف تحرش بطفل في الألعاب المائية الإمارات... NaN twitter\n", "9 امتلاك هاتف محمول بين عقلية الماضي والحاضر NaN twitter\n", "10 بعد إقفال الحضانات ماذا اكتشف الأهل في أطفالهم NaN twitter\n", "11 مشاهد من فعاليات معرض جلفود في مركز دبي التجار... NaN twitter\n", "12 إقامة دبي تدشن رسميا مشروع رحلة المسافر الذكي ... NaN twitter\n", "13 وصلت إلى أدنى مستوى لها منذ أكتوبر وكالة الصحا... NaN twitter\n", "14 مبان ومكاتب تهتز شاهد زلزال يضرب فوكوشيما اليا... NaN twitter\n", "15 نائب مساعد وزير الخارجية الأميركي السابق لشؤون... NaN twitter\n", "16 بعد تجربة التطبيق صراحة التطبيق جبار يشتغل الق... NaN other\n", "17 فوز التعاون ومصفوت في دوري الدرجة الأولى الإما... NaN twitter\n", "18 برهم صالح العراق يحتاج إصلاحا شاملا ويجب عدم ا... NaN twitter\n", "19 مقتل السفير الإيطالي في الكونغو بعد هجوم استهد... NaN twitter" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(df.head(20)) # عرض أول 20 صف [web:516]\n" ] }, { "cell_type": "code", "execution_count": 12, "id": "597e922c-3539-46c9-b3a7-bb7abe5a38fa", "metadata": {}, "outputs": [], "source": [ "# df هو DataFrame تبعك\n", "df.to_excel(\"dataset_clean.xlsx\", index=False)\n" ] }, { "cell_type": "code", "execution_count": 13, "id": "b8080466-f439-4d08-b764-c33e39e677c9", "metadata": {}, "outputs": [], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "# استخدم فقط الصفوف اللي عليها ليبل\n", "labeled_df = df[df[\"Spam_Ham\"].notna()].copy()\n", "labeled_df[\"Spam_Ham\"] = labeled_df[\"Spam_Ham\"].astype(str).str.strip().str.lower()\n", "labeled_df = labeled_df[labeled_df[\"Spam_Ham\"].isin([\"spam\", \"ham\"])].copy()\n", "\n", "# Split: 15% Test (stratified)\n", "train_val_df, test_df = train_test_split(\n", " labeled_df,\n", " test_size=0.15,\n", " random_state=42,\n", " stratify=labeled_df[\"Spam_Ham\"]\n", ")\n", "\n", "# Val = 15% من الإجمالي => 15/85 من train_val\n", "val_size_from_train_val = 0.15 / 0.85\n", "\n", "train_df, val_df = train_test_split(\n", " train_val_df,\n", " test_size=val_size_from_train_val,\n", " random_state=42,\n", " stratify=train_val_df[\"Spam_Ham\"]\n", ")\n", "\n", "X_train, y_train = train_df[\"Content\"], train_df[\"Spam_Ham\"]\n", "X_val, y_val = val_df[\"Content\"], val_df[\"Spam_Ham\"]\n", "X_test, y_test = test_df[\"Content\"], test_df[\"Spam_Ham\"]\n" ] }, { "cell_type": "code", "execution_count": null, "id": "afdccd7c-8fac-4e7f-85b5-c8d144e07c4c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== Validation report ===\n", " precision recall f1-score support\n", "\n", " ham 0.9508 0.9915 0.9707 117\n", " spam 0.9916 0.9516 0.9712 124\n", "\n", " accuracy 0.9710 241\n", " macro avg 0.9712 0.9715 0.9710 241\n", "weighted avg 0.9718 0.9710 0.9710 241\n", "\n", "=== Test report ===\n", " precision recall f1-score support\n", "\n", " ham 0.9187 0.9741 0.9456 116\n", " spam 0.9746 0.9200 0.9465 125\n", "\n", " accuracy 0.9461 241\n", " macro avg 0.9466 0.9471 0.9461 241\n", "weighted avg 0.9477 0.9461 0.9461 241\n", "\n", "Validation CM:\n", " [[116 1]\n", " [ 6 118]]\n", "Test CM:\n", " [[113 3]\n", " [ 10 115]]\n" ] } ], "source": [ "from sklearn.feature_extraction.text import TfidfVectorizer\n", "from sklearn.pipeline import Pipeline, FeatureUnion\n", "from sklearn.linear_model import LogisticRegression\n", "from sklearn.metrics import classification_report, confusion_matrix\n", "\n", "# TF-IDF: word ngrams (1,2)\n", "word_vec = TfidfVectorizer(analyzer=\"word\", ngram_range=(1,2), min_df=2, max_df=0.95)\n", "\n", "# TF-IDF: char ngrams (3,5)\n", "char_vec = TfidfVectorizer(analyzer=\"char\", ngram_range=(3,5), min_df=2, max_df=0.95)\n", "\n", "features = FeatureUnion([\n", " (\"word\", word_vec),\n", " (\"char\", char_vec),\n", "])\n", "\n", "baseline_lr = Pipeline([\n", " (\"features\", features),\n", " (\"clf\", LogisticRegression(max_iter=2000, class_weight=\"balanced\"))\n", "])\n", "\n", "baseline_lr.fit(X_train, y_train)\n", "\n", "# توقعات\n", "val_pred = baseline_lr.predict(X_val)\n", "test_pred = baseline_lr.predict(X_test)\n", "\n", "print(\"=== Validation report ===\")\n", "print(classification_report(y_val, val_pred, digits=4))\n", "\n", "print(\"=== Test report ===\")\n", "print(classification_report(y_test, test_pred, digits=4))\n", "\n", "# Confusion matrices \n", "labels = [\"ham\", \"spam\"] \n", "cm_val = confusion_matrix(y_val, val_pred, labels=labels)\n", "cm_test = confusion_matrix(y_test, test_pred, labels=labels)\n", "\n", "print(\"Validation CM:\\n\", cm_val)\n", "print(\"Test CM:\\n\", cm_test)\n" ] }, { "cell_type": "code", "execution_count": 15, "id": "a5ada451-9f8f-481d-8fd2-ec23632fd83a", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAp8AAAF2CAYAAAAoS/PfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASQ9JREFUeJzt3XlcFeXix/HvAWVVQBERDEHNjVwwt1xwKZfctVuZdXMpTStvGjdNy0As5VpJmrmk5XK1XCorS9OUNCtNy6VMUzNByxRwAwUF5Mzvj36c6wlQNucIfd6v13nVec4zM88MnIevM/M8YzEMwxAAAABgAidHNwAAAAB/H4RPAAAAmIbwCQAAANMQPgEAAGAawicAAABMQ/gEAACAaQifAAAAMA3hEwAAAKYhfAIAAMA0hE/ABCEhIRoyZIjt/ZYtW2SxWLRly5brLtuxY0d17NixRNszadIkWSyWEl1nWVKU45OQkCCLxaLFixffmEb9TSxevFgWi0UJCQm2shvxHcD/DBkyRCEhIY5uBv5GCJ9wqJw/NN9//32+dXL+qOe8nJycVLlyZXXv3l3bt28v0fbExsbKYrFo06ZN+dZZsGCBLBaL1qxZU6LbLmnp6emaNGlSgQKuo+WE8ZxX+fLlVatWLQ0aNEhHjx51dPNKjX379slisWjnzp351unYsaPdsXZ3d1fjxo01Y8YMWa1WE1t748yaNUve3t7KysrKt87Vx+DqV7Vq1Wx1Tp48qfHjx6tTp06qWLFigf/BCODayjm6AUBBDRw4UD169FB2drYOHz6sOXPmqFOnTvruu+/UqFGjEtnGAw88oLFjx+rdd99V586d86zz7rvvytfXV927dy/ydtq3b69Lly7JxcWlyOu4nvT0dEVHR0tSrrNGEydO1Pjx42/YtovqqaeeUosWLZSVlaXdu3dr/vz5Wrt2rfbt26fAwEDT2lGU4xMcHKxLly6pfPnyN6hV17d27VpVrVpVLVq0uGa9W265RTExMZKk06dP691339XTTz+t5ORkTZkyxYym3lBr165V165dr/uz6NKliwYNGmRX5u7ubvv/Q4cOadq0aapTp44aNWpU4v/YBf6uCJ8oNW6//Xb985//tL0PDw9X9+7dNXfuXM2ZM6dEthEYGKhOnTpp9erVmjt3rlxdXe0+P3HihLZu3arHHnusWCHDyclJbm5uxW1ukZUrV07lyt18X//w8HDde++9kqShQ4eqbt26euqpp7RkyRJNmDAhz2XS0tLk6elZou0oyvGxWCwO/ZlK0rp169S9e/fr3jLg7e1t910aOXKk6tevr1mzZmny5Mlydna+0U29YdLT0/Xll19q7ty5161bt25du+PwV82aNdOZM2dUuXJlvf/++7rvvvtKsqklwmq1KjMz0+G/e0BhcNkdpVZ4eLgk6ddffy3R9f7zn/9USkqK1q5dm+uzFStWyGq16qGHHpIkvfrqq2rTpo18fX3l7u6uZs2a6f3337/uNvK753P+/PmqXbu23N3d1bJlS3311Ve5ls3MzFRkZKSaNWsmb29veXp6Kjw8XJs3b7bVSUhIkJ+fnyQpOjradklx0qRJkvK+p/HKlSt68cUXVbt2bbm6uiokJETPPfecMjIy7OqFhISoV69e+vrrr9WyZUu5ubmpVq1a+u9//5urrb/++muxfj533nmnJCk+Pt6u3QcOHNCDDz6oSpUqqV27drb6y5YtU7NmzeTu7q7KlSvrgQce0G+//ZZrvTt27FCPHj1UqVIleXp6qnHjxpo5c6bt87yOz8aNG9WuXTv5+PioQoUKqlevnp577jnb5/nd8/nFF18oPDxcnp6e8vHxUd++ffXzzz/b1cnZ3pEjRzRkyBD5+PjI29tbQ4cOVXp6eoGO1fnz57Vt2zb17NmzQPWv5ubmphYtWujChQtKSkqy+6ykjumPP/6oIUOGqFatWnJzc1O1atX0yCOP6MyZM4Vu77XExcUpIyOjWFcmclSsWFGVK1cu8vIdO3ZUw4YNtWvXLrVp00bu7u6qWbOm5s2bl6tuRkaGoqKidOutt8rV1VVBQUEaN25cru+fxWLRqFGj9M477+i2226Tq6ur1q9ff812fPbZZ+rQoYMqVqwoLy8vtWjRQu++++41lylo33a974X0520Qt912mzw8PFSpUiU1b978uttH2Ub4RKmVMyChUqVKJbree+65R25ubnl2ju+++66Cg4PVtm1bSdLMmTPVtGlTTZ48WVOnTlW5cuV033335Rlcr+ftt9/WiBEjVK1aNb388stq27at+vTpk+sPfWpqqt566y117NhR06ZN06RJk5ScnKxu3bpp7969kiQ/Pz/bmZ/+/ftr6dKlWrp0qe655558tz9s2DBFRkbq9ttv12uvvaYOHTooJiZGDzzwQK66R44c0b333qsuXbpo+vTpqlSpkoYMGaL9+/fb1bvrrrt01113FfpY5MgJrr6+vnbl9913n9LT0zV16lQNHz5ckjRlyhQNGjRIderUUWxsrMaMGaO4uDi1b99e58+fty27ceNGtW/fXgcOHNDo0aM1ffp0derUSZ9++mm+7di/f7969eqljIwMTZ48WdOnT1efPn30zTffXLP9mzZtUrdu3ZSUlKRJkyYpIiJC27ZtU9u2be0G1OS4//77deHCBcXExOj+++/X4sWLbbdOXM+GDRtksVjUtWvXAtX/q5zw7OPjYysryWO6ceNGHT16VEOHDtWsWbP0wAMPaMWKFerRo4cMwyhSm/Oybt06NWvWTP7+/tete/nyZZ0+fdru9dewV1znzp1Tjx491KxZM7388su65ZZb9Pjjj2vhwoW2OlarVX369NGrr76q3r17a9asWerXr59ee+01DRgwINc6v/jiCz399NMaMGCAZs6cec3BQosXL1bPnj119uxZTZgwQf/5z38UFhZ23cBakL6tIN+LBQsW6KmnnlJoaKhmzJih6OhohYWFaceOHYU4iihzDMCBFi1aZEgyvvvuu3zrxMfHG5KM6OhoIzk52Th16pTx1VdfGS1atDAkGe+9916Jt+u+++4z3NzcjJSUFFvZwYMHDUnGhAkTbGXp6el2y2VmZhoNGzY07rzzTrvy4OBgY/Dgwbb3mzdvNiQZmzdvti1XtWpVIywszMjIyLDVmz9/viHJ6NChg63sypUrdnUMwzDOnTtn+Pv7G4888oitLDk52ZBkREVF5dq/qKgo4+qv/969ew1JxrBhw+zqPfPMM4Yk44svvrDbF0nG1q1bbWVJSUmGq6ur8e9//zvXfgcHB+fa/l/lHI+FCxcaycnJxh9//GGsXbvWCAkJMSwWi+33I6fdAwcOtFs+ISHBcHZ2NqZMmWJXvm/fPqNcuXK28itXrhg1a9Y0goODjXPnztnVtVqt+R6f1157zZBkJCcn57sPOb+nixYtspWFhYUZVatWNc6cOWMr++GHHwwnJydj0KBBubZ39c/PMAyjf//+hq+vb77bvNrDDz9s93uSnw4dOhj169c3kpOTjeTkZOPgwYPG2LFjDUlGz549bfVK+pj+9btiGIaxfPnyXL9LOX1CfHy8XZsLsm+GYRg1atTI83f+ryTl+br653e19957z+47WxAdOnQwJBnTp0+3lWVkZNh+LzIzMw3DMIylS5caTk5OxldffWW3/Lx58wxJxjfffGPXbicnJ2P//v3X3f758+eNihUrGq1atTIuXbpk99nVP5vBgwfn+p4WpG8ryPeib9++xm233XbdtuLvhTOfKDWioqLk5+enatWqKTw8XD///LOmT59uu0ewJP3zn//U5cuXtXr1altZzpnQnEvukv3ghHPnziklJUXh4eHavXt3obb3/fffKykpSSNHjrQbhDRkyBB5e3vb1XV2drbVsVqtOnv2rK5cuaLmzZsXers51q1bJ0mKiIiwK//3v/8tSbnO5IaGhtpue5D+PNNar169XCPTExIS8jzDl59HHnlEfn5+CgwMVM+ePZWWlqYlS5aoefPmdvVGjhxp93716tWyWq26//777c5iVatWTXXq1LHdkrBnzx7Fx8drzJgxdmf4JF3zPsmcuh9//HGBR4SfPHlSe/fu1ZAhQ+wu3TZu3FhdunSxHfNr7Vd4eLjOnDmj1NTUa27LarVq/fr1Bb7kfvDgQfn5+cnPz0/169fXK6+8oj59+tjdMlDSx/Tq70rOGcc77rhDkor8e/tXP/30k44fP17g49C3b19t3LjR7tWtW7cSaUuOcuXKacSIEbb3Li4uGjFihJKSkrRr1y5J0nvvvacGDRqofv36dsc657aTq2+pkaQOHTooNDT0utveuHGjLly4oPHjx+e6J/R69wUXpG8ryPfCx8dHv//+u7777rvrthd/H4RPlBqPPfaYNm7cqE8++USdOnXSxYsXNW7cOLVq1eqaU8tcvnxZY8eOVXBwsFxdXRUaGqpPPvnErs6FCxc0ZswYBQcHy93dXVOnTpWXl5fdpfcFCxaoQoUKat++vSwWi/bu3atPP/1Ud9xxh9zc3FS5cmXb5e6UlJRC7duxY8ckSXXq1LErz5ly6K+WLFmixo0by83NTb6+vvLz89PatWsLvd2rt+/k5KRbb73VrrxatWry8fGxtS9HjRo1cq2jUqVKOnfuXJG2nyMyMlIbN27UF198oR9//FF//PGHHn744Vz1atasaff+l19+kWEYqlOnji1U5bx+/vln232MOZfxGzZsWKh2DRgwQG3bttWwYcPk7++vBx54QKtWrbpmEM05ZvXq1cv1WYMGDXT69GmlpaXZlf/1uObcUnK94/rd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fW3vFy1aZEgyjhw5YisbMWKE4eHhYVy4cMFW1q1bN2PEiBEl3HoAKLxdu3YZkoyEhIRcnw0ePNioXLmykZaWZiubO3euUaFCBSM7OzvP9SUnJxuSjH379hmGYRjx8fGGJOOtt96y1Vm+fLkhyYiLi7OVxcTEGPXq1Sup3cLfCGc+Ueo1btzY7n1AQICSkpIkSZs2bdJdd92l6tWrq2LFinr44Yd15swZpaen2+p7eHiodu3atvf+/v4KCQlRhQoV7Mpy1gkAjtSkSRPdddddatSoke677z4tWLBA586ds/vcw8PD9r5169a6ePGifvvtN0nSL7/8ooEDB6pWrVry8vJSSEiIpD8fj321q/vWnEdoN2rUyK6MfhFFQfhEqVe+fHm79xaLRVarVQkJCerVq5caN26sDz74QLt27dLs2bMlye7+p7yWz2+dAOBozs7O2rhxoz777DOFhoZq1qxZqlevnuLj4wu0fO/evXX27FktWLBAO3bs0I4dOyTZ94uSfd9osVjyLKNfRFGUc3QDgBtl165dslqtmj59upyc/vx31qpVqxzcKgAoPovForZt26pt27aKjIxUcHCwPvzwQ0nSDz/8oEuXLsnd3V2S9O2336pChQoKCgrSmTNndOjQIS1YsEDh4eGSpK+//tph+4G/J8Inyqxbb71VWVlZmjVrlnr37q1vvvlG8+bNc3SzAKBYduzYobi4OHXt2lVVq1bVjh07lJycrAYNGujHH39UZmamHn30UU2cOFEJCQmKiorSqFGj5OTkpEqVKsnX11fz589XQECAjh8/rvHjxzt6l/A3w2V3lFlNmjRRbGyspk2bpoYNG+qdd95RTEyMo5sFAMXi5eWlrVu3qkePHqpbt64mTpyo6dOnq3v37pKku+66S3Xq1FH79u01YMAA9enTxzYFnZOTk1asWKFdu3apYcOGevrpp/XKK684cG/wd2QxjP+fmwEAAJRqQ4YM0fnz5/XRRx85uilAvjjzCQAAANMQPgEAAGAaLrsDAADANJz5BAAAgGkInwAAADAN4RMAAACmIXwCAADANIRPAAAAmIbwCQAAANMQPgEAAGAawicAAABMQ/gEAACAaf4PyqLWC6wP8S0AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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lP2HY046duwoSdmWx546daokFXiNhLxOUx0wYIDKly+vF198UYcPH862/8yZM5o4caIkKSoqSl5eXpo+fbrTn8HChQuVlJRk6noO1apVkyRt27bN0Xbp0iUtWbLE6bjz589nqyI0bNhQknLtJvH09FTbtm31r3/9y2mcSmJiolasWKF7771XQUFBJjxFdtWqVdO0adM0adIk3XXXXbkeZ8V37UamTp2qHTt2aN68eXr11Vd1zz336Nlnn9V///tfl6+N4oVRO5Akvffee9q4cWO29hdeeOFPz3vhhRc0bdo0vfHGG7n+plhQNptNvXr10uuvvy5JmjBhgtP+Bx54QFOnTlX79u3Vq1cvnTlzRjNnzlT16tX1n//8J1/3KlmypCZOnKhnnnlG9913nx599FHFxcVp0aJF2cZgdOrUSR988IG6deumBx54QHFxcZozZ47q1KnjVI739fVVnTp1tHr1at12220qU6aM6tatq7p162a7f4MGDdS3b1/NmzdPFy5cUMuWLfXtt99qyZIl6tq1q1q3bp2v58mSNUX1RgM9S5curQ8//FAdO3ZUw4YNnVby3Lt3r1auXKmmTZtKuvab/6hRoxQTE6P27dvrwQcf1KFDhzRr1iw1adLEaUCnq9q2batKlSqpf//+eumll+Tp6an33ntPZcuW1fHjxx3HLVmyRLNmzVK3bt1UrVo1Xbx4UfPnz1dQUJAjecvJxIkTtWnTJt17770aOHCgSpQooblz5yotLc1prQ4r3Oj/Lcma79qfOXjwoMaMGaPo6Gh17txZ0rUku2HDhho4cKDWrFmTv4dE8VZ0E1hwM8iafpfblpCQ4Jim+tZbb+V4jejoaMPT09M4evSo6fEdOHDAkGR4e3sb58+fz7Z/4cKFRo0aNQxvb2+jVq1axqJFi3Kc2nijaapZZs2aZVSpUsXw9vY2GjdubGzbts1o2bKl0zRVu91uvP7660blypUNb29v44477jDWr1+f45S/HTt2GI0aNTK8vLycphHmFGNGRoYRExNjVKlSxShZsqQRERFhjBo1ykhNTc32LA888EC2P4vr48w6Ni/TVLOcPHnSGDp0qHHbbbcZPj4+hp+fn9GoUSPjtddec5oybBjXpqXWqlXLKFmypBEaGmo8++yz2f4btWzZ0rj99tuz3SenPyvlME3VMAxjz549xt133214eXkZ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ly6SpKVLlyo0NFTr1q3TY4895kKwzvJdwbhe5cqV1b17d5ILAAAskpyc7LSlpaXleNxHH32kxo0b6+GHH1a5cuV0xx13aP78+Y79cXFxOn36tKKiohxtwcHBuvvuu7Vz505TY85TBWP69Ol5vuDzzz9f4GAAALiV2OTi21T/98+IiAin9nHjxmn8+PHZjv/55581e/ZsDRs2TK+88op27dql559/Xl5eXurbt69Onz4tSQoNDXU6LzQ01LHPLHlKMN555508Xcxms5FgAABgsoSEBKeVsr29vXM8zm63q3Hjxnr99dclSXfccYd++OEHzZkzp9Bf+5GnBCNr1gh+9393tVIJm1dRhwFY4rOTTDnHrSv5ol2lbyukm5n0srOgoKA8vYqjfPnyqlOnjlNb7dq19f7770uSwsLCJEmJiYkqX76845jExEQ1bNiw4HHmwOUxGAAAIBeFvJJns2bNdOjQIae2w4cPq3LlypKuDfgMCwvT5s2bHfuTk5MVGxurpk2b5vvx/oxLLzsDAAA3j6FDh+qee+7R66+/rkceeUTffvut5s2bp3nz5km6NpRhyJAhmjhxomrUqKEqVapozJgxCg8PV9euXU2NhQQDAACrFPI01SZNmujDDz/UqFGjNGHCBFWpUkXTpk1zeo3HiBEjdOnSJT399NO6cOGC7r33Xm3cuFE+Pj4uBJodCQYAABYp6Gqcfzw/vzp16qROnTrlfk2bTRMmTNCECRMKHlgeMAYDAACYrkAJxvbt29WnTx81bdpUJ06ckCQtW7ZMX331lanBAQDg1orx69rznWC8//77ateunXx9ffXdd985VhNLSkpyzLsFAAAiwciPiRMnas6cOZo/f75KlizpaG/WrJn27t1ranAAAMA95XuQ56FDh9SiRYts7cHBwbpw4YIZMQEAcEsoikGeN4t8VzDCwsJ09OjRbO1fffWVqlatakpQAADcErJW8nRlc1P5TjCeeuopvfDCC4qNjZXNZtPJkye1fPlyDR8+XM8++6wVMQIA4J6K8RiMfHeRjBw5Una7XW3atNHly5fVokULeXt7a/jw4XruueesiBEAALiZfCcYNptNf/vb3/TSSy/p6NGjSklJUZ06dRQQEGBFfAAAuK3iPAajwCt5enl5ZXtjGwAA+INCXir8ZpLvBKN169ay2XIfdLJlyxaXAgIAAO4v3wnG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2y+//JLtuOPHj+vkyZMKDw933MfDw0M1a9ZUaGiowsPD9fPPP6t37975uj+AwsMgT6AI9e7dW3/5y1/UpUsXbd++XXFxcdq6dauef/55/frrr5KkF154QW+88YbWrVunn376SQMHDvzTNSwiIyPVt29f9evXT+vWrXNcc82aNZKkypUry2azaf369Tp79qxSUlIUGBio4cOHa+jQoVqyZImOHTumvXv3asaMGY6BkwMGDNCRI0f00ksv6dChQ1qxYoUWL16cr+etUaOGjh8/rlWrVunYsWOaPn16jgNWfXx81LdvX+3fv1/bt2/X888/r0ceeURhYWGSpJiYGE2aNEnTp0/X4cOH9f3332vRokWaOnVqvuIBYB0SDKAI+fn5adu2bapUqZK6d++u2rVrq3///kpNTXVUNF588UU9/vjj6tu3r5o2barAwEB169btT687e/ZsPfTQQxo4cKBq1aqlp556SpcuXZIkVahQQTExMRo5cqRCQ0M1ePBgSdKrr76qMWPGaNKkSapdu7bat2+vTz75RFWqVJF0bVzE+++/r3Xr1qlBgwaaM2eOXn/99Xw974MPPqihQ4dq8ODBatiwoXbs2KExY8ZkO6569erq3r27OnbsqLZt26p+/fpO01CffPJJLViwQIsWLVK9evXUsmVLLV682BErgKJnM3IbKQYAAFBAVDAAAIDpSDAAAIDpSDAAAIDpSDAAAIDpSDAAAIDpSDAAAIDpSDAAAIDpSDAAAIDpSDAAAIDpSDAAAIDpSDAAAIDpSDAAAIDp/h9Ar12NmADrDAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAp8AAAF2CAYAAAAoS/PfAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjgsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvwVt1zgAAAAlwSFlzAAAPYQAAD2EBqD+naQAASABJREFUeJzt3XlcVNXj//H3gLKoLG5siuKWu5C45JaWJqlp5scyrVRMy5Iy6ZNJqWifisw0cy/L5VeZmq2fNI1Qs8UstzITlxQ1E8QNDRSQub8//DBfJ0CBgTuir+fjMQ+dM+fec+7AnHlzl3MthmEYAgAAAEzg4uwOAAAA4MZB+AQAAIBpCJ8AAAAwDeETAAAApiF8AgAAwDSETwAAAJiG8AkAAADTED4BAABgGsInAAAATEP4BFCmTJo0SRaLpUjLJCUlyWKxaPHixaXTqRvE4sWLZbFYlJSUZCvr0qWLunTp4rQ+Xe+GDh2qkJAQZ3cDKFGET1zXcr8st2zZUmCd3GCS+3BxcVGVKlXUo0cPbdq0qUT706VLF7u2CnpMmjSpRNqbO3euw4Frw4YNdn0rX7686tatq8GDB+vAgQMl0s8bwc6dO2WxWPTTTz8VWOefvx+enp5q0aKFZsyYIavVamJvS8+sWbPk4+Oj7OzsAusU9LkICAiw1Tl27JjGjRun2267TV5eXrJYLNqwYYMJWwDAUeWc3QHgWjFw4ED17NlTOTk52rt3r+bOnavbbrtNP//8s5o3b14ibTz//PMaPny47fnPP/+smTNn6rnnnlPjxo1t5S1atCiR9ubOnatq1app6NChDq/rySefVOvWrZWdna1t27bprbfe0qpVq7Rz504FBQU53tlCGj9+vMaNG1ekZWrXrq3z58+rfPnypdSrq1u1apX8/PzUunXrK9arWbOm4uLiJEknTpzQ0qVLNWbMGKWmpuqll14yo6ulatWqVerevftVfxZ33HGHBg8ebFfm6elp+/+ePXs0ZcoUNWjQQM2bNy/xPxQBlB7CJ/A/LVu21IMPPmh73qlTJ/Xo0UPz5s3T3LlzS6SNO+64w+65h4eHZs6cqTvuuOOaP3TZqVMn9e/fX5IUGRmpm266SU8++aSWLFmimJiYfJdJT09XxYoVS7Qf5cqVU7lyRRu6LBaLPDw8SrQfRbV69Wr16NHjqqcM+Pj42P0ejhw5Uo0aNdKsWbP0wgsvyNXVtbS7WmoyMjL0zTffaN68eVete9NNN9m9D/8UHh6ukydPqkqVKlq5cqXuvffekuxqibBarcrKynL67x5wreGwO1CATp06SZL++OMP09v+8ssv1alTJ1WsWFFeXl7q1auXdu3aZVcnOTlZkZGRqlmzptzd3RUYGKi7777bdj5eSEiIdu3apW+++cZ22PLygPvHH384tG233367JOngwYOS/u9czN9//12DBg1S5cqV1bFjR1v99957T+Hh4fL09FSVKlV0//3368iRI3nWu3nzZvXs2VOVK1dWxYoV1aJFC73xxhu21/M75zM+Pl4dO3aUr6+vKlWqpIYNG+q5556zvV7QOZ/r1q2zvc++vr66++67tXv3brs6ue3t379fQ4cOla+vr3x8fBQZGamMjIxCvVdnzpzRDz/8oF69ehWq/uU8PDzUunVrnTt3TsePH7d7raTe019//VVDhw5V3bp15eHhoYCAAA0bNkwnT54scn+vJCEhQZmZmerRo4fD6/Ly8lKVKlWKvXyXLl3UrFkzbd26Ve3bt5enp6fq1Kmj+fPn56mbmZmp2NhY1a9fX+7u7goODtbYsWOVmZlpV89isSgqKkrvv/++mjZtKnd3d61Zs+aK/fjyyy/VuXNneXl5ydvbW61bt9bSpUuvuMxrr72m9u3bq2rVqvL09FR4eLhWrlyZp97VPhfSpdMgmjZtqgoVKqhy5cpq1arVVdsHHMWeT6AAuSGucuXKprb77rvvasiQIYqIiNCUKVOUkZGhefPmqWPHjtq+fbvt4oN//etf2rVrl5544gmFhITo+PHjio+P1+HDhxUSEqIZM2boiSeeUKVKlfT8889Lkvz9/W3tdO3a1W47iyo3uFatWtWu/N5771WDBg308ssvyzAMSdJLL72kCRMm6L777tPw4cOVmpqqWbNm6dZbb9X27dvl6+sr6dKX5V133aXAwECNHj1aAQEB2r17t7744guNHj06337s2rVLd911l1q0aKEXXnhB7u7u2r9/v77//vsr9v/rr79Wjx49VLduXU2aNEnnz5/XrFmz1KFDB23bti3PRR733Xef6tSpo7i4OG3btk1vv/22/Pz8NGXKlKu+V2vXrpXFYlH37t2vWjc/ueE5932SSvY9jY+P14EDBxQZGamAgADt2rVLb731lnbt2qUff/yxyBd4FWT16tUKDw+3+z0syIULF3TixAm7Mi8vL7m7u5dIXyTp9OnT6tmzp+677z4NHDhQK1as0GOPPSY3NzcNGzZM0qW9l3369NF3332nRx55RI0bN9bOnTv1+uuva+/evfr000/t1rlu3TqtWLFCUVFRqlat2hUvFlq8eLGGDRumpk2bKiYmRr6+vtq+fbvWrFmjQYMGFbjcG2+8oT59+uiBBx5QVlaWli1bpnvvvVdffPGF7Q+cwnwuFixYoCeffFL9+/fX6NGjdeHCBf3666/avHnzFdsHHGYA17FFixYZkoyff/65wDoHDx40JBmTJ082UlNTjeTkZOPbb781WrdubUgyPvzww1Lr34cffmhIMtavX28YhmGcO3fO8PX1NUaMGGFXLzk52fDx8bGVnz592pBkTJ069Yrrb9q0qdG5c+d8X6tdu7ZRu3btq/Zx/fr1hiRj4cKFRmpqqvHXX38Zq1atMkJCQgyLxWJ7b2NjYw1JxsCBA+2WT0pKMlxdXY2XXnrJrnznzp1GuXLlbOUXL1406tSpY9SuXds4ffq0XV2r1Wr7f247uV5//XVDkpGamlrgNuT+jBctWmQrCwsLM/z8/IyTJ0/ayn755RfDxcXFGDx4cJ72hg0bZrfOe+65x6hatWqBbV7uoYceKvDncLnOnTsbjRo1MlJTU43U1FQjMTHReOaZZwxJRq9evWz1Svo9zcjIyNOXDz74wJBkbNy40VaW+3k6ePCgXZ8Ls22GYRi1atUyYmNjr1pPUr6Py39+l/vn56gwOnfubEgypk2bZivLzMy0/V5kZWUZhmEY7777ruHi4mJ8++23dsvPnz/fkGR8//33dv12cXExdu3addX2z5w5Y3h5eRlt27Y1zp8/b/fa5T+bIUOG5Pmc/vPnlZWVZTRr1sy4/fbbbWWF+VzcfffdRtOmTa/aV6Ckcdgd+J/Y2FhVr15dAQEB6tSpk3bv3q1p06bZznM0Q3x8vM6cOaOBAwfqxIkTtoerq6vatm2r9evXS7p04YWbm5s2bNig06dPF6utpKSkIu31HDZsmKpXr66goCD16tVL6enpWrJkiVq1amVXb+TIkXbPP/74Y1mtVt1333122xQQEKAGDRrYtmn79u06ePCgnnrqKbs9fJKuuOctt+5nn31W6CvCjx07ph07dmjo0KF2h25btGihO+64Q6tXr86zzD+3q1OnTjp58qTOnj17xbasVqvWrFlT6EPuiYmJql69uqpXr65GjRpp6tSp6tOnj90pAyX9nl5+IU/uHsdbbrlFkrRt27ZC9ftqfvvtNx0+fLjQ78Pdd9+t+Ph4u0dERESJ9CVXuXLl9Oijj9qeu7m56dFHH9Xx48e1detWSdKHH36oxo0bq1GjRnbvde5pJ7nvda7OnTurSZMmV207Pj5e586d07hx4/KcE3q1Pc2X/7xOnz6ttLQ0derUye5nVZjPha+vr/7880/9/PPPV+0vUJI47A78zyOPPKJ7771XFy5c0Lp16zRz5kzl5ORcdbmcnBylpqbalVWpUkVubm5F7sO+ffsk/d/5lP/k7e0tSXJ3d9eUKVP09NNPy9/fX7fccovuuusuDR482G46mpI0ceJEderUSa6urqpWrZoaN26c74U/derUsXu+b98+GYahBg0a5Lve3Kuecw/jN2vWrEj9GjBggN5++20NHz5c48aNU9euXdWvXz/1799fLi75/3196NAhSVLDhg3zvNa4cWOtXbs2z8VStWrVsquXezrG6dOnbT+X/Pz8889KTU0tdOgKCQnRggULZLVa9ccff+ill15SamqqXUAp6ff01KlTmjx5spYtW5bnvNK0tLRC9ftqVq1aJX9//zx/rBSkZs2a6tatW4m0XZCgoKA8F8TddNNNki79cXbLLbdo37592r17t6pXr57vOv75fv3z978gxf19l6QvvvhCL774onbs2GF33unlobUwn4tnn31WX3/9tdq0aaP69eure/fuGjRokDp06FDkPgFFQfgE/qdBgwa2L7u77rpLrq6utnkEr/SFeeTIkTxfOOvXry/W1eu5eyjefffdfEPk5WHvqaeeUu/evfXpp59q7dq1mjBhguLi4rRu3TrdfPPNRW77apo3b16oMHD5Xhnp0jZZLBZ9+eWX+V6pXalSJYf65enpqY0bN2r9+vVatWqV1qxZo+XLl+v222/XV199VWJXhxe0HuN/57UWZPXq1QoJCSnU3jBJqlixot373KFDB7Vs2VLPPfecZs6cKank39P77rtPP/zwg5555hmFhYWpUqVKslqtuvPOO0tsftHVq1frzjvvLLHzR81itVrVvHlzTZ8+Pd/Xg4OD7Z7/8/e/pH377bfq06ePbr31Vs2dO1eBgYEqX768Fi1aZHehUGE+F40bN9ae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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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fvihJk2apNjYWH3yySe6/vrri3zvgjRs2FD79u1TVlaW8zdms3h6eubbbhjGZc/Nb4CnpDxJoc1m01tvvaWdO3dq/fr1+vDDD3Xfffdpzpw52rlzpwICAooeeD7ceZY/GjRokBYtWqTAwED94x//cKkE/dH//d//aejQoerTp4/GjRun0NBQeXp6KjY2tkgDk729vQu8R35+/PFHZyL8zTffFPo8oCRRwcAV7amnnlJgYGCeGRJ/Fh4erk2bNrlsxR3wVrduXUlSaGiooqKi8mx/Tlrq1q2rxx9/XB999JG+/fZbZWVlac6cOc79Bf0QLopevXrpt99+K9Q0yZo1a0qSEhISXNqzsrKUmJjo3G+GSxWCP89OKahL4m9/+5tmzpyp3bt3a+XKldq/f79Wr16d77FVqlSRn59fnueQpO+//14eHh6KjIx07wEKMGjQIB0/flwHDx4ssHtEkt566y3VqVNH77zzju6++25FR0crKipKmZmZLseZ8TVwicPh0NChQ2W32/Wvf/1Lr7/+utvrdABWIMHAFS04OFj//Oc/9eGHH2rfvn0FHufj45MnESjuzJPo6GjZ7XbNmjUr3/ECl6Y9ZmRk5PlBUrduXQUGBrqU/v39/QtcZbOw01QfeughRURE6PHHH9fBgwfz7D958qRmzJghSYqKipKXl5fi4uJcfnN/5ZVXdO7cuXxnQxTXpWRs27Ztzrb09HQtX77c5bgzZ87kqSK0aNFCkgrsJvH09FTXrl31n//8x2WcyokTJ7Rq1Sq1b99edrvdhKfIq27dupo3b55iY2N14403FnjcpYrJH58tPj4+z+qzl2aFmLHa6ty5c7V9+3a99NJLmj59um666SY9/PDD+uWXX9y+NmAmukhQYl599VVt3LgxT/tjjz32l+c99thjmjdvnp5++ukCf9s1k91u16JFi3T33Xfrhhtu0J133qkqVaroyJEjeu+999SuXTu98MILOnjwoLp06aIBAwaocePGqlChgtauXasTJ07ozjvvdF6vZcuWWrRokWbMmKF69eopNDTU2adf2GmqISEhWrt2rXr06KEWLVq4rOS5d+9evf7662rbtq2ki7/5P/nkk4qJiVG3bt10++23KyEhQQsXLlTr1q1dBnS6q2vXrqpRo4aGDRumcePGydPTU6+++qrz7+uS5cuXa+HCherbt6/q1q2r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SDBQ4pYvXy5/f3/Fx8dr9uzZmjZtmjZt2iTp4rte4uLitH//fi1fvlyffPKJxo8f73J+RkaG4uLitHr1am3cuFFbt25V37599f777+v999/Xa6+9phdffFFvvfVWaTweypHjx49r4MCBuu+++3TgwAFt3bpV/fr1c74GfPPmzc72119/Xe+8845iYmKc56enp2vMmDHavXu3Nm/eLA8PD/Xt21cOh8PlPlOmTNHEiRO1d+9eVahQQYMGDdL48eP1/PPP67PPPtOhQ4c0efLkEn124LIMoAR16tTJaN++vUtb69atjSeeeCLf4998802jcuXKzs9Lly41JBmHDh1ytv3zn/80/Pz8jPPnzzvboqOjjX/+858mRw+42rNnjyHJSEpKyrNvyJAhRqVKlYz09HRn26JFi4yAgAAjNzc33+udOnXKkGR88803hmEYRmJioiHJePnll53HvP7664YkY/Pmzc622NhYo0GDBmY9FmAKKhgocc2aNXP5HBERoZMnT0qSPv74Y3Xp0kXVqlVTYGCg7r77bv3666/KyMhwHu/n56e6des6P4eFhalWrVoKCAhwabt0TcAqzZs3V5cuXdS0aVP9/e9/15IlS3TmzBmX/X5+fs7Pbdu2VVpampKTkyVJP/zwgwYOHKg6derIbrerVq1akqQjR4643OeP/2bCwsIkSU2bNnVp4+sdVxoSDJS4ihUruny22WxyOBxKSkpSz5491axZM7399tvas2ePFixYIEku/db5nV/QNQEreXp6atOmTfrggw/UuHFjzZ8/Xw0aNFBiYmKhzu/Vq5dOnz6tJUuWKD4+XvHx8ZJcv94l1695m82Wbxtf77jSVCjtAIBL9uzZI4fDoTlz5sjD42Luu2bNmlKOCvhrNptN7dq1U7t27TR58mTVrFlTa9eulSR9/fXX+u233+Tr6ytJ2rlzpwICAhQZGalff/1VCQkJWrJkiTp06CBJ+vzzz0vtOQCzkWDgilGvXj1lZ2dr/vz56tWrl7744gstXry4tMMCChQfH6/Nmzera9euCg0NVXx8vE6dOqVGjRrpv//9r7KysjRs2DBNnDhRSUlJmjJlikaOHCkPDw+FhISocuXKeumllxQREaEjR45owoQJpf1IgGnoIsEVo3nz5po7d66eeeYZNWnSRCtXrlRsbGxphwUUyG63a9u2berRo4fq16+viRMnas6cOerevbskqUuXLrr22mvVsWNH/eMf/9Dtt9/unJbt4eGh1atXa8+ePWrSpIlGjx6tf//736X4NIC5eF07AFhg6NChOnv2rNatW1faoQClggoGAAAwHQkGAAAwHV0kAADAdFQwAACA6UgwAACA6UgwAACA6UgwAACA6UgwgDJo6NCh6tOnj/PzzTffrFGjRpV4HFu3bpXNZtPZs2cLPMZmsxVpLYipU6eqRYsWbsWVlJQkm82mffv2uXUdAMVHggGYZOjQobLZbLLZbPLy8lK9evU0bdo05eTkWH7vd955R9OnTy/UsYVJCgDAXbyLBDBRt27dtHTpUl24cEHvv/++RowYoYoVK+rJJ5/Mc2xWVpa8vLxMuW+lSpVMuQ4AmIUKBmAib29vhYeHq2bNmnr44YcVFRWld999V9Lv3RozZ85U1apV1aBBA0lScnKyBgwYoODgYFWqVEm9e/dWUlKS85q5ubkaM2aMgoODVblyZY0fP15/Xr7mz10kFy5c0BNPPKHIyEh5e3urXr16euWVV5SUlKTOnTtLkkJCQmSz2TR06FBJksPhUGxsrGrXri1fX181b95cb731lst93n//fdWvX1++vr7q3LmzS5yF9cQTT6h+/fry8/NTnTp1NGnSJGVnZ+c57sUXX1RkZKT8/Pw0YMAAnTt3zmX/yy+/rEaNGsnHx0cNGzbUwoULixwLAOuQYAAW8vX1VVZWlvPz5s2blZCQoE2bNmnDhg3Kzs5WdHS0AgMD9dlnn+mLL75QQECAunXr5jxvzpw5WrZsmV599VV9/vnnOn36tPN14AW555579PrrrysuLk4HDhzQiy++6HxN+Ntvvy1JSkhI0PHjx/X8889LkmJjY7VixQotXrxY+/fv1+jRo3XXXXfp008/lXQxEerXr5969eqlffv26f777y/W2z8DAwO1bNkyfffdd3r++ee1ZMkSPffccy7HHDp0SGvWrNH69eu1ceNGffXVVxo+fLhz/8qVKzV58mTNnDlTBw4c0KxZszRp0iQtX768yPEAsIgBwBRDhgwxevfubRiGYTgcDmPTpk2Gt7e3MXbsWOf+sLAw48KFC85zXnvtNaNBgwaGw+Fwtl24cMHw9fU1PvzwQ8MwDCMiIsKYPXu2c392drZRvXp1570MwzA6depkPPbYY4ZhGEZCQoIhydi0aVO+cW7ZssWQZJw5c8bZlpmZafj5+Rnbt293OXbYsGHGwIEDDcMwjCeffNJo3Lixy/4nnngiz7X+TJKxdu3aAvf/+9//Nlq2bOn8PGXKFMPT09P4+eefnW0ffPCB4eHhYRw/ftwwDMOoW7eusWrVKpfrTJ8+3Wjbtq1hGIaRmJhoSDK++uqrAu8LwFqMwQBMtGHDBgUEBCg7O1sOh0ODBg1yvp5bkpo2beoy7uLrr7/WoUOHFBgY6HKdzMxMHT58WOfOndPx48fVpk0b574KFSqoVatWebpJLtm3b588PT3VqVOnQsd96NAhZWRk6NZbb3Vpz8rK0vXXXy9JOnDggEscktS2bdtC3+OSN954Q3FxcTp8+LDS0tKUk5Mju93uckyNGjVUrVo1l/s4HA4lJCQoMDBQhw8f1rBhw/TAAw84j8nJyVFQUFCR4wFgDRIMwESdO3fWokWL5OXlpapVq6pCBdd/Yv7+/i6f09LS1LJlS61cuTLPtapUqVKsGHx9fYt8TlpamiTpvffec/nBLl0cV2KWHTt2aPDgwYqJiVF0dLSCgoK0evVqzZkzp8ixLlmyJE/C4+npaVqsANxDggGYyN/fX/Xq1Sv08TfccIPeeOMNhYaG5vkt/pKIiAjFx8erY8eOki7+pr5nzx7dcMMN+R7ftGlTORwOffrpp4qKisqz/1IFJTc319nWuHFjeXt768iRIwVWPho1auQcsHrJzp07L/+Qf7B9+3bVrFlTTz31lLPtp59+ynPckSNHdOzYMVWtWtV5Hw8PDzVo0EBhYWGqWrWqfvzxRw0ePLhI9wdQchjkCZSiwYMH65prrlHv3r312WefKTExUVu3btWjjz6qn3/+WZL02GOP6emnn9a6dev0/fffa/jw4X+5hkWtWrU0ZMgQ3XfffVq3bp3zmmvWrJEk1axZUzabTRs2bNCpU6eUlpamwMBAjR07VqNHj9by5ct1+PBh7d27V/Pnz3cOnHzooYf0ww8/aNy4cUpISNCqVau0bNmyIj3vtddeqyNHjmj16tU6fPiw4uLi8h2w6uPjoyFDhujrr7/WZ599pkcffVQDBgxQeHi4JCkmJkaxsbGKi4vTwYMH9c0332jp0qWaO3dukeIBYB0SDKAU+fn5adu2bapRo4b69eunRo0aadiwYcrMzHRWNB5//HHdfffdGjJkiNq2bavAwED17dv3L6+7aNEi3XHHHRo+fLgaNmyoBx54QOnp6ZKkatWqKSYmRhMmTFBYWJhGjhwpSZo+fbomTZqk2NhYNWrUSN26ddN7772n2rVrS7o4LuLtt9/WunXr1Lx5cy1evFizZs0q0vPefvvtGj16tEaOHKkWLVpo+/btmjRpUp7j6tWrp379+qlHjx7q2rWrmjVr5jIN9f7779fLL7+spUuXqmnTpurUqZOWLVvmjBVA6bMZBY0UAwAAKCYqGAAAwHQkGAAAwHQkGAAAwHQkGAAAwHQkGAAAwHQkGAAAwHQkGAAAwHQkGAAAwHQkGAAAwHQkGAAAwHQkGAAAwHQkGAAAwHT/D8KUaqUT8zXLAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "from sklearn.metrics import precision_recall_fscore_support, confusion_matrix, ConfusionMatrixDisplay\n", "\n", "def plot_metrics_and_cm(y_true, y_pred, labels=(\"ham\",\"spam\"), title_prefix=\"Validation\",\n", " show_values=True, value_fmt=\"{:.3f}\", value_fontsize=10):\n", " # per-class metrics\n", " p, r, f1, _ = precision_recall_fscore_support(\n", " y_true, y_pred, labels=list(labels), zero_division=0\n", " )\n", "\n", " x = np.arange(len(labels))\n", " width = 0.25\n", "\n", " plt.figure(figsize=(8,4))\n", "\n", " b1 = plt.bar(x - width, p, width, label=\"Precision\")\n", " b2 = plt.bar(x, r, width, label=\"Recall\")\n", " b3 = plt.bar(x + width, f1, width, label=\"F1\")\n", "\n", " plt.xticks(x, labels)\n", " plt.ylim(0, 1)\n", " plt.title(f\"{title_prefix}: Precision / Recall / F1 per class\")\n", " plt.legend()\n", " plt.grid(axis=\"y\", alpha=0.2)\n", "\n", " # --- ADD NUMBERS ON TOP OF BARS ---\n", " if show_values:\n", " ax = plt.gca()\n", " ax.bar_label(b1, labels=[value_fmt.format(v) for v in p], padding=3, fontsize=value_fontsize)\n", " ax.bar_label(b2, labels=[value_fmt.format(v) for v in r], padding=3, fontsize=value_fontsize)\n", " ax.bar_label(b3, labels=[value_fmt.format(v) for v in f1], padding=3, fontsize=value_fontsize)\n", "\n", " plt.show()\n", "\n", " # confusion matrix\n", " cm = confusion_matrix(y_true, y_pred, labels=list(labels))\n", " disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=list(labels))\n", " disp.plot(values_format=\"d\")\n", " plt.title(f\"{title_prefix}: Confusion Matrix\")\n", " plt.show()\n", "\n", "# رسومات للـ Logistic Regression\n", "plot_metrics_and_cm(y_val, val_pred, labels=(\"ham\",\"spam\"), title_prefix=\"LR - Validation\")\n", "plot_metrics_and_cm(y_test, test_pred, labels=(\"ham\",\"spam\"), title_prefix=\"LR - Test\")\n" ] }, { "cell_type": "code", "execution_count": 16, "id": "b7c6723c-032a-4268-aa7f-5d6894b4ab23", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== LinearSVC Validation report ===\n", " precision recall f1-score support\n", "\n", " ham 0.9504 0.9829 0.9664 117\n", " spam 0.9833 0.9516 0.9672 124\n", "\n", " accuracy 0.9668 241\n", " macro avg 0.9669 0.9673 0.9668 241\n", "weighted avg 0.9674 0.9668 0.9668 241\n", "\n", "=== LinearSVC Test report ===\n", " precision recall f1-score support\n", "\n", " ham 0.9431 1.0000 0.9707 116\n", " spam 1.0000 0.9440 0.9712 125\n", "\n", " accuracy 0.9710 241\n", " macro avg 0.9715 0.9720 0.9710 241\n", "weighted avg 0.9726 0.9710 0.9710 241\n", "\n", "Validation CM:\n", " [[115 2]\n", " [ 6 118]]\n", "Test CM:\n", " [[116 0]\n", " [ 7 118]]\n" ] } ], "source": [ "from sklearn.feature_extraction.text import TfidfVectorizer\n", "from sklearn.pipeline import Pipeline, FeatureUnion\n", "from sklearn.svm import LinearSVC\n", "from sklearn.metrics import classification_report, confusion_matrix\n", "\n", "# نفس الـ TF-IDF اللي استخدمته مع الـ Logistic Regression\n", "word_vec = TfidfVectorizer(analyzer=\"word\", ngram_range=(1,2), min_df=2, max_df=0.95)\n", "char_vec = TfidfVectorizer(analyzer=\"char\", ngram_range=(3,5), min_df=2, max_df=0.95)\n", "\n", "features = FeatureUnion([\n", " (\"word\", word_vec),\n", " (\"char\", char_vec),\n", "])\n", "\n", "svc_model = Pipeline([\n", " (\"features\", features),\n", " (\"clf\", LinearSVC(class_weight=\"balanced\"))\n", "])\n", "\n", "svc_model.fit(X_train, y_train)\n", "\n", "svc_val_pred = svc_model.predict(X_val)\n", "svc_test_pred = svc_model.predict(X_test)\n", "\n", "print(\"=== LinearSVC Validation report ===\")\n", "print(classification_report(y_val, svc_val_pred, digits=4))\n", "\n", "print(\"=== LinearSVC Test report ===\")\n", "print(classification_report(y_test, svc_test_pred, digits=4))\n", "\n", "labels = [\"ham\", \"spam\"] # عدّلها لو تسمياتك مختلفة\n", "print(\"Validation CM:\\n\", confusion_matrix(y_val, svc_val_pred, labels=labels))\n", "print(\"Test CM:\\n\", confusion_matrix(y_test, svc_test_pred, labels=labels))\n" ] }, { "cell_type": "code", "execution_count": 17, "id": "cf31208e-6681-4f4d-8fb3-32f1797f1221", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Note: you may need to restart the kernel to use updated packages.\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "WARNING: Ignoring invalid distribution ~atplotlib (C:\\Users\\Thwaib-PC\\anaconda3\\Lib\\site-packages)\n", "WARNING: Ignoring invalid distribution ~atplotlib (C:\\Users\\Thwaib-PC\\anaconda3\\Lib\\site-packages)\n", "WARNING: Ignoring invalid distribution ~atplotlib (C:\\Users\\Thwaib-PC\\anaconda3\\Lib\\site-packages)\n" ] } ], "source": [ "%pip install -q --upgrade transformers accelerate datasets ipywidgets tqdm scikit-learn\n" ] }, { "cell_type": "code", "execution_count": 18, "id": "5129e3c0-6526-4673-a6df-cf419d1f8054", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1124 241 241\n" ] } ], "source": [ "from sklearn.model_selection import train_test_split\n", "\n", "labeled_df = df[df[\"Spam_Ham\"].notna()].copy()\n", "labeled_df[\"Spam_Ham\"] = labeled_df[\"Spam_Ham\"].astype(str).str.strip().str.lower()\n", "labeled_df = labeled_df[labeled_df[\"Spam_Ham\"].isin([\"spam\", \"ham\"])].copy()\n", "\n", "train_val_df, test_df = train_test_split(\n", " labeled_df,\n", " test_size=0.15,\n", " random_state=42,\n", " stratify=labeled_df[\"Spam_Ham\"]\n", ")\n", "\n", "val_size_from_train_val = 0.15 / 0.85\n", "train_df, val_df = train_test_split(\n", " train_val_df,\n", " test_size=val_size_from_train_val,\n", " random_state=42,\n", " stratify=train_val_df[\"Spam_Ham\"]\n", ")\n", "\n", "print(len(train_df), len(val_df), len(test_df))\n" ] }, { "cell_type": "code", "execution_count": 19, "id": "02e0ab3a-071b-46e1-9e7f-0ad3c8c7a07e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Contentlabel
0Hi.Check out and share our songs.1
1Her voice sounds weird and plus she's cute...0
2Check out this video on YouTube:Qq1
3http://www.twitch.tv/daconnormc1
4**CHECK OUT MY NEW MIXTAPE**** **CHECK OUT MY ...1
\n", "
" ], "text/plain": [ " Content label\n", "0 Hi.Check out and share our songs. 1\n", "1 Her voice sounds weird and plus she's cute... 0\n", "2 Check out this video on YouTube:Qq 1\n", "3 http://www.twitch.tv/daconnormc 1\n", "4 **CHECK OUT MY NEW MIXTAPE**** **CHECK OUT MY ... 1" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "train_dl = train_df[[\"Content\", \"Spam_Ham\"]].rename(columns={\"Spam_Ham\": \"label\"}).copy()\n", "val_dl = val_df[[\"Content\", \"Spam_Ham\"]].rename(columns={\"Spam_Ham\": \"label\"}).copy()\n", "test_dl = test_df[[\"Content\", \"Spam_Ham\"]].rename(columns={\"Spam_Ham\": \"label\"}).copy()\n", "\n", "label2id = {\"ham\": 0, \"spam\": 1}\n", "id2label = {0: \"ham\", 1: \"spam\"}\n", "\n", "for d in (train_dl, val_dl, test_dl):\n", " d[\"label\"] = d[\"label\"].astype(str).str.strip().str.lower().map(label2id)\n", "\n", "train_dl = train_dl.dropna(subset=[\"label\"]).reset_index(drop=True)\n", "val_dl = val_dl.dropna(subset=[\"label\"]).reset_index(drop=True)\n", "test_dl = test_dl.dropna(subset=[\"label\"]).reset_index(drop=True)\n", "\n", "train_dl[\"label\"] = train_dl[\"label\"].astype(int)\n", "val_dl[\"label\"] = val_dl[\"label\"].astype(int)\n", "test_dl[\"label\"] = test_dl[\"label\"].astype(int)\n", "\n", "train_dl.head()\n" ] }, { "cell_type": "code", "execution_count": 20, "id": "5c00b022-7a24-4e66-b49f-e88fb4c048d3", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "65197145a2504981a7af84b58b5e213d", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Map: 0%| | 0/1124 [00:00,\n", "ignore_data_skip=False,\n", "include_for_metrics=[],\n", "include_inputs_for_metrics=False,\n", "include_num_input_tokens_seen=no,\n", "include_tokens_per_second=False,\n", "jit_mode_eval=False,\n", "label_names=None,\n", "label_smoothing_factor=0.0,\n", "learning_rate=2e-05,\n", "length_column_name=length,\n", "liger_kernel_config=None,\n", "load_best_model_at_end=True,\n", "local_rank=0,\n", "log_level=passive,\n", "log_level_replica=warning,\n", "log_on_each_node=True,\n", "logging_dir=./distilbert_spam\\runs\\Jan11_13-35-12_thwaib,\n", "logging_first_step=False,\n", "logging_nan_inf_filter=True,\n", "logging_steps=500,\n", "logging_strategy=IntervalStrategy.STEPS,\n", "lr_scheduler_kwargs={},\n", "lr_scheduler_type=SchedulerType.LINEAR,\n", "max_grad_norm=1.0,\n", "max_steps=-1,\n", "metric_for_best_model=f1,\n", "mp_parameters=,\n", "neftune_noise_alpha=None,\n", "no_cuda=False,\n", "num_train_epochs=5,\n", "optim=OptimizerNames.ADAMW_TORCH_FUSED,\n", "optim_args=None,\n", "optim_target_modules=None,\n", "output_dir=./distilbert_spam,\n", "overwrite_output_dir=False,\n", "parallelism_config=None,\n", "past_index=-1,\n", "per_device_eval_batch_size=32,\n", "per_device_train_batch_size=16,\n", "prediction_loss_only=False,\n", "project=huggingface,\n", "push_to_hub=False,\n", "push_to_hub_model_id=None,\n", "push_to_hub_organization=None,\n", "push_to_hub_token=,\n", "ray_scope=last,\n", "remove_unused_columns=True,\n", "report_to=[],\n", "restore_callback_states_from_checkpoint=False,\n", "resume_from_checkpoint=None,\n", "run_name=None,\n", "save_on_each_node=False,\n", "save_only_model=False,\n", "save_safetensors=True,\n", "save_steps=500,\n", "save_strategy=SaveStrategy.EPOCH,\n", "save_total_limit=None,\n", "seed=42,\n", "skip_memory_metrics=True,\n", "tf32=None,\n", "torch_compile=False,\n", "torch_compile_backend=None,\n", "torch_compile_mode=None,\n", "torch_empty_cache_steps=None,\n", "torchdynamo=None,\n", "tpu_metrics_debug=False,\n", "tpu_num_cores=None,\n", "trackio_space_id=trackio,\n", "use_cpu=False,\n", "use_legacy_prediction_loop=False,\n", "use_liger_kernel=False,\n", "use_mps_device=False,\n", "warmup_ratio=0.0,\n", "warmup_steps=0,\n", "weight_decay=0.01,\n", ")" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from transformers import TrainingArguments\n", "\n", "common_args = dict(\n", " output_dir=\"./distilbert_spam\",\n", " learning_rate=2e-5,\n", " per_device_train_batch_size=16,\n", " per_device_eval_batch_size=32,\n", " num_train_epochs=5,\n", " weight_decay=0.01,\n", " save_strategy=\"epoch\",\n", " load_best_model_at_end=True,\n", " metric_for_best_model=\"f1\",\n", " greater_is_better=True,\n", " report_to=\"none\",\n", " disable_tqdm=True\n", ")\n", "\n", "training_args = None\n", "errors = []\n", "\n", "# جرّب evaluation_strategy\n", "try:\n", " training_args = TrainingArguments(**common_args, evaluation_strategy=\"epoch\")\n", "except TypeError as e:\n", " errors.append((\"evaluation_strategy\", str(e)))\n", "\n", "# جرّب eval_strategy (بعض النسخ الجديدة)\n", "if training_args is None:\n", " try:\n", " training_args = TrainingArguments(**common_args, eval_strategy=\"epoch\")\n", " except TypeError as e:\n", " errors.append((\"eval_strategy\", str(e)))\n", "\n", "# جرّب evaluate_during_training (نسخ قديمة جدًا)\n", "if training_args is None:\n", " try:\n", " training_args = TrainingArguments(**common_args, evaluate_during_training=True)\n", " except TypeError as e:\n", " errors.append((\"evaluate_during_training\", str(e)))\n", "\n", "if training_args is None:\n", " raise RuntimeError(\"ولا خيار اشتغل. الأخطاء:\\n\" + \"\\n\".join([f\"{k}: {msg}\" for k, msg in errors]))\n", "\n", "training_args\n" ] }, { "cell_type": "code", "execution_count": 22, "id": "20bcb31e-9159-42db-af0f-47bd745ab610", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "WARNING: Ignoring invalid distribution ~atplotlib (C:\\Users\\Thwaib-PC\\anaconda3\\Lib\\site-packages)\n", "WARNING: Ignoring invalid distribution ~atplotlib (C:\\Users\\Thwaib-PC\\anaconda3\\Lib\\site-packages)\n", "WARNING: Ignoring invalid distribution ~atplotlib (C:\\Users\\Thwaib-PC\\anaconda3\\Lib\\site-packages)\n" ] } ], "source": [ "!pip -q install -U transformers accelerate datasets scikit-learn\n" ] }, { "cell_type": "code", "execution_count": 23, "id": "4fff81f3-5a17-4fad-8d7c-f12b0f407545", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from datasets import Dataset\n", "from transformers import AutoTokenizer, AutoModelForSequenceClassification, TrainingArguments, Trainer, DataCollatorWithPadding\n", "from sklearn.metrics import accuracy_score, f1_score\n" ] }, { "cell_type": "code", "execution_count": 24, "id": "8c852afc-107a-4392-9362-f55b8bab8a6f", "metadata": {}, "outputs": [], "source": [ "MODELNAME = \"distilbert-base-uncased\"\n", "MAXLEN = 128\n" ] }, { "cell_type": "code", "execution_count": 25, "id": "7e358f4d-1ca2-4861-9b21-5843747b263e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "OK: (1124, 3) (241, 3) (241, 3)\n" ] } ], "source": [ "import pandas as pd\n", "import numpy as np\n", "from sklearn.model_selection import train_test_split\n", "\n", "# 1) اقرأ الداتا (استخدم نفس مسارك)\n", "csv_path = r\"C:\\Users\\Thwaib-PC\\Desktop\\All_Projects\\archive\\.ipynb_checkpoints\\All_Datasets_Reorganized-checkpoint.csv\"\n", "df = pd.read_csv(csv_path, encoding=\"utf-8-sig\")\n", "\n", "# 2) وحّد اسم عمود الليبل (عشان ما تختلف)\n", "if \"Spam_Ham\" in df.columns:\n", " df = df.rename(columns={\"Spam_Ham\": \"SpamHam\"})\n", "\n", "# 3) جهّز Content (لو Content فاضي استخدم TweetText)\n", "df[\"Content\"] = df[\"Content\"].replace(r\"^\\s*$\", pd.NA, regex=True)\n", "if \"TweetText\" in df.columns:\n", " df[\"Content\"] = df[\"Content\"].fillna(df[\"TweetText\"])\n", "\n", "# 4) Drop اللي مش لازم\n", "df = df.drop(columns=[\"Time\",\"Date_2\",\"Date\",\"Author\",\"URL\",\"TweetText\"], errors=\"ignore\")\n", "\n", "# 5) labeled only\n", "labeleddf = df[df[\"SpamHam\"].notna()].copy()\n", "labeleddf[\"SpamHam\"] = labeleddf[\"SpamHam\"].astype(str).str.strip().str.lower()\n", "labeleddf = labeleddf[labeleddf[\"SpamHam\"].isin([\"spam\",\"ham\"])].copy()\n", "\n", "# 6) split -> (هذا اللي كان ناقص عندك)\n", "trainvaldf, testdf = train_test_split(\n", " labeleddf, test_size=0.15, random_state=42, stratify=labeleddf[\"SpamHam\"]\n", ")\n", "val_size_from_trainval = 0.15 / 0.85\n", "traindf, valdf = train_test_split(\n", " trainvaldf, test_size=val_size_from_trainval, random_state=42, stratify=trainvaldf[\"SpamHam\"]\n", ")\n", "\n", "print(\"OK:\", traindf.shape, valdf.shape, testdf.shape)\n" ] }, { "cell_type": "code", "execution_count": 26, "id": "6266c1d3-43fc-431a-bcbe-8eadb82e8fc9", "metadata": {}, "outputs": [], "source": [ "# لازم تكون موجودة عندك من النوتبوك: traindf, valdf, testdf\n", "# كل واحد فيهم فيه عمودين: Content و SpamHam (spam/ham)\n", "\n", "label2id = {\"ham\": 0, \"spam\": 1}\n", "id2label = {0: \"ham\", 1: \"spam\"}\n", "\n", "for d in (traindf, valdf, testdf):\n", " d[\"SpamHam\"] = d[\"SpamHam\"].astype(str).str.strip().str.lower().map(label2id).astype(int)\n" ] }, { "cell_type": "code", "execution_count": 27, "id": "33dcc164-0bc5-4a08-99ae-a081b7dc4241", "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "fd50f7eab1ed4a069c6e3f1aad7c4950", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Map: 0%| | 0/1124 [00:00 7\u001b[0m trainer\u001b[38;5;241m.\u001b[39msave_model(save_dir) \n\u001b[0;32m 8\u001b[0m tokenizer\u001b[38;5;241m.\u001b[39msave_pretrained(save_dir) \u001b[38;5;66;03m# tokenizer files\u001b[39;00m\n\u001b[0;32m 10\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mSaved to:\u001b[39m\u001b[38;5;124m\"\u001b[39m, save_dir)\n", "\u001b[1;31mNameError\u001b[0m: name 'trainer' is not defined" ] } ], "source": [ "import os\n", "\n", "save_dir = r\"C:\\Users\\Thwaib-PC\\Desktop\\All_Projects\\archive\" \n", "\n", "os.makedirs(save_dir, exist_ok=True)\n", "\n", "trainer.save_model(save_dir) \n", "tokenizer.save_pretrained(save_dir) # tokenizer files\n", "\n", "print(\"Saved to:\", save_dir)\n", "print(\"Files:\", os.listdir(save_dir))\n" ] }, { "cell_type": "code", "execution_count": null, "id": "a856573a-63bb-4a98-bb83-d7c49e6b694f", "metadata": {}, "outputs": [], "source": [ "import os\n", "\n", "save_dir = r\"C:\\Users\\Thwaib-PC\\Desktop\\All_Projects\\archive\\artifacts\\distilbert_final\"\n", "os.makedirs(save_dir, exist_ok=True)\n", "\n", "trainer.save_model(save_dir)\n", "tokenizer.save_pretrained(save_dir)\n", "\n", "print(\"Saved to:\", save_dir)\n", "print(\"Files:\", os.listdir(save_dir))\n" ] }, { "cell_type": "code", "execution_count": null, "id": "a43c8256-ff0f-4f82-acb7-769e661d3f58", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "b78ebd12-3ae2-46f0-aaa1-2b54841d3df0", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "f5fbc685-4e84-40e4-a058-2872709323c2", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "ee35f1b3-6762-4645-9394-02d93e9e9d53", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.7" } }, "nbformat": 4, "nbformat_minor": 5 }