{ "metadata": { "kernelspec": { "name": "python", "display_name": "Python (Pyodide)", "language": "python" }, "language_info": { "codemirror_mode": { "name": "python", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8" } }, "nbformat_minor": 5, "nbformat": 4, "cells": [ { "id": "61a20a1b", "cell_type": "code", "source": "import pandas as pd\nimport numpy as np\nimport seaborn as sns\nimport re\nimport nltk\nfrom nltk.stem.isri import ISRIStemmer\nimport string\nimport matplotlib.pyplot as plt\nfrom sklearn.impute import SimpleImputer\nfrom sklearn.preprocessing import StandardScaler, MinMaxScaler\nfrom sklearn import svm\nfrom sklearn.model_selection import train_test_split, cross_val_score, KFold\nfrom sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier\nfrom sklearn.metrics import classification_report, confusion_matrix\nfrom sklearn.feature_extraction.text import TfidfVectorizer\nfrom sklearn.svm import SVC\nfrom sklearn.linear_model import LogisticRegression\nfrom sklearn import metrics\nfrom nltk.corpus import stopwords\nfrom nltk.tokenize import word_tokenize\nfrom sklearn.naive_bayes import ComplementNB, MultinomialNB\nfrom tashaphyne.stemming import ArabicLightStemmer\nimport pyarabic.araby as araby\nimport unicodedata\nfrom sklearn.tree import DecisionTreeClassifier\nfrom sklearn.neural_network import MLPClassifier\nfrom sklearn.preprocessing import LabelEncoder\nfrom sklearn.utils.class_weight import compute_class_weight", "metadata": {}, "outputs": [], "execution_count": 6 }, { "id": "f69753ff", "cell_type": "code", "source": "# Read the two CSV files into DataFrames\ncombined_df = pd.read_csv(r\"C:\\Users\\moner\\Downloads\\merged_file.csv\")\n\n# Combine the two DataFrames\n#combined_df = pd.concat([data_df1, data_df2])\n\n# Reset the index of the combined DataFrame\ncombined_df = combined_df.reset_index(drop=True)\n\n# Now, 'combined_df' contains the data from both data sets.\nimport pyarabic.araby as araby\ncombined_df.head()\n#Drop any rows with missing values in the LABEL\ndata_df.dropna(subset=['LABEL'], inplace=True)", "metadata": {}, "outputs": [], "execution_count": 118 }, { "id": "b000b964", "cell_type": "code", "source": "combined_df['LABEL'].value_counts()", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2 2067\n", "0 1756\n", "Name: LABEL, dtype: int64" ] }, "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 119 }, { "id": "71f8d462", "cell_type": "code", "source": "# Drop any duplicate rows based on the tweet column\ncombined_df.drop_duplicates(keep='first', inplace=True)\ncombined_df.drop_duplicates(subset='Tweet', keep='first', inplace=True)", "metadata": {}, "outputs": [], "execution_count": 120 }, { "id": "7f171fef", "cell_type": "code", "source": "combined_df['Tweet']", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 اولا الله يوفقهم ان شاءالله وثانيا الرياضة شي ...\n", "1 الاحظ شكثر الحريم اللي يمشون على ممشى البحر وف...\n", "2 حلو بما اننه عجبتش الرياضة استمري فيها وما بس ...\n", "3 طيب يا غبي مصارعة الحريم للحريم ؟؟ ولا فيها ام...\n", "4 اذا مافيه الا هاالعلاج مالك الاتصبرين كم شهر ل...\n", " ... \n", "3818 لن اتزوج بنت تتابع كوره انتهى\n", "3819 اخذ واعطي مع البنت بكل شي الا كرة القدم اطلعي ...\n", "3820 البنت و كرة القدم خطان متوازيان لا يلتقيان ف ا...\n", "3821 تفقد البنت ٪ من انوثتها حينما تتابع كرة القدم\n", "3822 المكياج للنساء فقط كرة القدم للرجال فقط الموضو...\n", "Name: Tweet, Length: 3796, dtype: object" ] }, "execution_count": 121, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 121 }, { "id": "b97696f5", "cell_type": "code", "source": "my_emojis = {\n \"🙂\":\"يبتسم\",\n \"😂\":\"يضحك\",\n \"💔\":\"قلب حزين\",\n \"🙂\":\"يبتسم\",\n \"🤭\":\"حياء\", \n \"❤️\":\"حب\",\n \"❤\":\"حب\",\n \"😍\":\"حب\",\n \"😭\":\"يضحك\",\n \"😢\":\"حزن\",\n \"😔\":\"حزن\", \n \"♥\":\"حب\",\n \"💜\":\"حب\",\n \"😅\":\"يضحك\",\n \"🙁\":\"حزين\",\n \"💕\":\"حب\",\n \"💙\":\"حب\",\n \"😞\":\"حزين\",\n \"😊\":\"سعادة\",\n \"👏\":\"يصفق\",\n \"👌\":\"احسنت\",\n \"😴\":\"ينام\",\n \"😀\":\"يضحك\",\n \"😌\":\"مرتاح\",\n \"🌹\":\"وردة\",\n \"🙈\":\"حب\",\n \"😄\":\"يضحك\",\n \"😐\":\"محايد\",\n \"✌\":\"منتصر\",\n \"✨\":\"نجمه\",\n \"🤔\":\"تفكير\",\n \"😏\":\"يستهزء\",\n \"😒\":\"يستهزء\",\n \"🙄\":\"ملل\",\n \"😕\":\"عصبية\",\n \"😃\":\"يضحك\",\n \"🌸\":\"وردة\",\n \"😓\":\"حزن\",\n \"💞\":\"حب\",\n \"💗\":\"حب\",\n \"😑\":\"منزعج\",\n \"💭\":\"تفكير\",\n \"😎\":\"ثقة\",\n \"💛\":\"حب\",\n \"😩\":\"حزين\",\n \"💪\":\"عضلات\",\n \"👍\":\"موافق\",\n \"🙏🏻\":\"رجاء طلب\",\n \"😳\":\"مصدوم\",\n \"👏🏼\":\"تصفيق\",\n \"🎶\":\"موسيقي\",\n \"🌚\":\"صمت\",\n \"💚\":\"حب\",\n \"🙏\":\"رجاء طلب\",\n \"💘\":\"حب\",\n \"🍃\":\"سلام\",\n \"☺\":\"يضحك\",\n \"🐸\":\"ضفدع\",\n \"😶\":\"مصدوم\",\n \"✌️\":\"مرح\",\n \"✋🏻\":\"توقف\",\n \"😉\":\"غمزة\",\n \"🌷\":\"حب\",\n \"🙃\":\"مبتسم\",\n \"😫\":\"حزين\",\n \"😨\":\"مصدوم\",\n \"🎼 \":\"موسيقي\",\n \"🍁\":\"مرح\",\n \"🍂\":\"مرح\",\n \"💟\":\"حب\",\n \"😪\":\"حزن\",\n \"😆\":\"يضحك\",\n \"😣\":\"استياء\",\n \"☺️\":\"حب\",\n \"😱\":\"كارثة\",\n \"😁\":\"يضحك\",\n \"😖\":\"استياء\",\n \"🏃🏼\":\"يجري\",\n \"😡\":\"غضب\",\n \"🚶\":\"يسير\",\n \"🤕\":\"مرض\",\n \"‼️\":\"تعجب\",\n \"🕊\":\"طائر\",\n \"👌🏻\":\"احسنت\",\n \"❣\":\"حب\",\n \"🙊\":\"مصدوم\",\n \"💃\":\"سعادة مرح\",\n \"💃🏼\":\"سعادة مرح\",\n \"😜\":\"مرح\",\n \"👊\":\"ضربة\",\n \"😟\":\"استياء\",\n \"💖\":\"حب\",\n \"😥\":\"حزن\",\n \"🎻\":\"موسيقي\",\n \"✒\":\"يكتب\",\n \"🚶🏻\":\"يسير\",\n \"💎\":\"الماس\",\n \"😷\":\"وباء مرض\",\n \"☝\":\"واحد\",\n \"🚬\":\"تدخين\",\n \"💐\" : \"ورد\",\n \"🌞\" : \"شمس\",\n \"👆\" : \"الاول\",\n \"⚠️\" :\"تحذير\",\n \"🤗\" : \"احتواء\",\n \"✖️\": \"غلط\",\n \"📍\" : \"مكان\", \n \"👸\" : \"ملكه\",\n \"👑\" : \"تاج\",\n \"✔️\" : \"صح\",\n \"💌\": \"قلب\",\n \"😲\" : \"مندهش\",\n \"💦\": \"ماء\",\n \"🚫\" : \"خطا\",\n \"👏🏻\" : \"برافو\",\n \"🏊\" :\"يسبح\",\n \"👍🏻\": \"تمام\",\n \"⭕️\" :\"دائره كبيره\",\n \"🎷\" : \"ساكسفون\",\n \"👋\": \"تلويح باليد\",\n \"✌🏼\": \"علامه النصر\",\n \"🌝\":\"مبتسم\",\n \"➿\" : \"عقده مزدوجه\",\n \"💪🏼\" : \"قوي\",\n \"📩\": \"تواصل معي\",\n \"☕️\": \"قهوه\",\n \"😧\" : \"قلق و صدمة\",\n \"🗨\": \"رسالة\", \n \"❗️\" :\"تعجب\",\n \"🙆🏻\": \"اشاره موافقه\",\n \"👯\" :\"اخوات\",\n \"©\" : \"رمز\",\n \"👵🏽\" :\"سيده عجوزه\",\n \"🐣\": \"كتكوت\", \n \"🙌\": \"تشجيع\",\n \"🙇\": \"شخص ينحني\",\n \"👐🏽\":\"ايدي مفتوحه\", \n \"👌🏽\": \"بالظبط\",\n \"⁉️\" : \"استنكار\",\n \"⚽️\": \"كوره\",\n \"🕶\" :\"حب\",\n \"🎈\" :\"بالون\", \n \"🎀\": \"ورده\",\n \"💵\": \"فلوس\", \n \"😋\": \"جائع\",\n \"😛\": \"يغيظ\",\n \"😠\": \"غاضب\",\n \"✍🏻\": \"يكتب\",\n \"🌾\": \"ارز\",\n \"👣\": \"اثر قدمين\",\n \"❌\":\"رفض\",\n \"🍟\":\"طعام\",\n \"👬\":\"صداقة\",\n \"🐰\":\"ارنب\", \n \"☂\":\"مطر\",\n \"⚜\":\"مملكة فرنسا\",\n \"🐑\":\"خروف\",\n \"🗣\":\"صوت مرتفع\",\n \"👌🏼\":\"احسنت\",\n \"☘\":\"مرح\",\n \"😮\":\"صدمة\",\n \"😦\":\"قلق\",\n \"⭕\":\"الحق\",\n \"✏️\":\"قلم\",\n \"ℹ\":\"معلومات\",\n \"🙍🏻\":\"رفض\",\n \"⚪️\":\"نضارة نقاء\",\n \"🐤\":\"حزن\",\n \"💫\":\"مرح\",\n \"💝\":\"حب\",\n \"🍔\":\"طعام\",\n \"❤︎\":\"حب\",\n \"✈️\":\"سفر\",\n \"🏃🏻‍♀️\":\"يسير\",\n \"🍳\":\"ذكر\",\n \"🎤\":\"مايك غناء\",\n \"🎾\":\"كره\",\n \"🐔\":\"دجاجة\",\n \"🙋\":\"سؤال\",\n \"💉\":\"دواء\",\n \"🙏🏼\":\"رجاء طلب\",\n \"💂🏿 \":\"حارس\",\n \"🎬\":\"سينما\",\n \"♦️\":\"مرح\",\n \"💡\":\"قكرة\",\n \"‼\":\"تعجب\",\n \"👼\":\"طفل\",\n \"🔑\":\"مفتاح\",\n \"♥️\":\"حب\",\n \"🕋\":\"كعبة\",\n \"🐓\":\"دجاجة\",\n \"💩\":\"معترض\",\n \"👽\":\"فضائي\",\n \"☔️\":\"مطر\",\n \"🍷\":\"عصير\",\n \"🌟\":\"نجمة\",\n \"☁️\":\"سحب\",\n \"👃\":\"معترض\",\n \"🌺\":\"مرح\",\n \"🔪\":\"سكينة\",\n \"♨\":\"سخونية\",\n \"👊🏼\":\"ضرب\",\n \"✏\":\"قلم\",\n \"🚶🏾‍♀️\":\"يسير\",\n \"👊\":\"ضربة\",\n \"◾️\":\"وقف\",\n \"😚\":\"حب\",\n \"🔸\":\"مرح\",\n \"👎🏻\":\"لا يعجبني\",\n \"👊🏽\":\"ضربة\",\n \"😙\":\"حب\",\n \"🎥\":\"تصوير\",\n \"👉\":\"جذب انتباه\",\n \"👏🏽\":\"يصفق\",\n \"💪🏻\":\"عضلات\",\n \"🏴\":\"اسود\",\n \"🔥\":\"حريق\", \n \"😬\":\"عدم الراحة\", \n \"👊🏿\":\"يضرب\", \n \"🌿\":\"ورقه شجره\", \n \"✋🏼\":\"كف ايد\", \n \"👐\":\"ايدي مفتوحه\", \n \"☠️\":\"وجه مرعب\", \n \"🎉\":\"يهنئ\", \n \"🔕\" :\"صامت\",\n \"😿\":\"وجه حزين\", \n \"☹️\":\"وجه يائس\",\n \"😘\" :\"حب\", \n \"😰\" :\"خوف و حزن\",\n \"🌼\":\"ورده\", \n \"💋\": \"بوسه\",\n \"👇\":\"لاسفل\", \n \"❣️\":\"حب\", \n \"🎧\":\"سماعات\",\n \"📝\":\"يكتب\", \n \"😇\":\"ملاك\", \n \"😈\":\"رعب\", \n \"🏃\":\"يجري\", \n \"✌🏻\":\"علامه النصر\", \n \"🔫\":\"يضرب\", \n \"❗️\":\"تعجب\",\n \"👎\":\"غير موافق\", \n \"🔐\":\"قفل\", \n \"👈\":\"لليمين\",\n \"™\":\"رمز\", \n \"🚶🏽\":\"يتمشي\", \n \"😯\":\"متفاجأ\", \n \"✊\":\"يد مغلقه\", \n \"😻\":\"اعجاب\", \n \"🙉\" :\"قرد\", \n \"👧\":\"طفله صغيره\", \n \"🔴\":\"دائره حمراء\", \n \"🏽\":\"قوه\", \n \"💤\":\"ينام\", \n \"👀\":\"ينظر\", \n \"✍🏻\":\"يكتب\", \n \"❄️\":\"تلج\",\n \"💀\":\"رعب\", \n \"😤\":\"وجه عابس\", \n \"🖋\":\"قلم\", \n \"🎩\":\"كاب\", \n \"☕️\":\"قهوه\", \n \"😹\":\"ضحك\", \n \"💓\":\"حب\", \n \"☄️ \":\"نار\", \n \"👻\":\"رعب\",\n \"🤣\":\"ضحك\",\n }", "metadata": {}, "outputs": [], "execution_count": 122 }, { "id": "59ae2dee", "cell_type": "code", "source": "# Remove special characters\narabic_punctuations = '''`÷×؛<>_()*&^%][ـ،/:\"؟.,'{}~¦+|!”…“–ـ'''\nenglish_punctuations = string.punctuation\npunctuations_list = arabic_punctuations + english_punctuations\n\ndef remove_punctuations(text):\n if isinstance(text, str):\n # Replace underscore (_) with a space before removing other punctuations\n text = text.replace('_', ' ')\n translator = str.maketrans('', '', punctuations_list)\n text = re.sub(r'[!\\\"#$%&\\'()*+,-./:;<=>?@[\\\\]^`{|}~]', ' ', text)\n return text.strip() # Remove leading and trailing spaces\n else:\n return text # Return the input value if it's not a string\n# Tokenization\n\ndef tokenize_tweet(tweet):\n if isinstance(tweet, str):\n # Tokenize the tweet into individual words\n tokens = nltk.word_tokenize(tweet)\n return tokens\n else:\n return []\n\ndef remove_stop_words(text):\n stop_words = set(stopwords.words('arabic'))\n words = word_tokenize(text)\n words = [word for word in words if word not in stop_words and word.isalpha()]\n return \" \".join(words)\n\ndef remove_non_arabic(text):\n return re.sub(r'[^\\u0600-\\u06FF\\s]', '', text)\n\n# stemming\ndef stem_tokens(tokens):\n stemmer = ArabicLightStemmer()\n stemmed = [stemmer.light_stem(token) for token in tokens]\n return ' '.join(stemmed)\n\n# Normalization\ndef normalize_arabic(text):\n text = text.strip()\n# text = re.sub('[إأآ]', 'ا', text) # Normalize Alef characters\n# text = re.sub('[ٱٲٳإ]', 'ا', text) # Normalize special Alef characters\n\n# text = re.sub('[ة]', 'ه', text) # Normalize Ta Marbuta characters to Ha\n\n\n\n\n # Normalize Arabic text by removing diacritics and normalizing characters\n text = unicodedata.normalize('NFKD', text)\n text = re.sub(r'[\\u0610-\\u061A\\u064B-\\u0652\\u06D6-\\u06DC\\u06DF\\u06E0\\u06E4-\\u06E7\\u06E9\\u06EA\\u06ED]', '', text)\n \n\n\n\n \n # Remove longation\n text = re.sub(r'(.)\\1+', r\"\\1\\1\", text) \n \n #Strip vowels from a text, include Shadda.\n text = araby.strip_tashkeel(text)\n \n #Strip diacritics from a text, include harakats and small lettres The striped marks are\n text = araby.strip_diacritics(text)\n text=''.join([i for i in text if not i.isdigit()])\n \n # remove repeated letters\n text = re.sub(r'(\\w)\\1{2,}', r'\\1', text)\n \n return text.strip() # Remove leading and trailing spaces\nimport re\n\ndef convert_emojis(tweet):\n if isinstance(tweet, str):\n for emot in my_emojis:\n pattern = re.escape(emot) # Escape special characters in emot\n replacement = \" \".join(my_emojis[emot].replace(\",\", \"\").replace(\":\", \"\").split())\n tweet = re.sub(f'({pattern})(?!\\w)', rf' {replacement} ',tweet)\n return tweet\n else:\n return tweet if tweet is not None else \"\"\ndef processPost(tweet):\n # Convert emojis\n tweet = convert_emojis(tweet)\n \n # Remove punctuations from the tweet\n tweet = remove_punctuations(tweet)\n\n # Tokenize the cleaned tweet\n tokens = tokenize_tweet(tweet)\n \n # Remove non-Arabic characters\n tokens = remove_non_arabic(' '.join(tokens)).split()\n\n # Normalize Arabic text\n tokens = normalize_arabic(' '.join(tokens)).split()\n \n return ' '.join(tokens) # Join the processed words back into a single string\n\ncombined_df['clean_text'] = combined_df['Tweet'].apply(processPost)", "metadata": {}, "outputs": [], "execution_count": 123 }, { "id": "645df7a1", "cell_type": "code", "source": "combined_df.to_csv ('cleaned_50Tweet.csv',encoding='utf-8-sig')", "metadata": {}, "outputs": [ { "ename": "PermissionError", "evalue": "[Errno 13] Permission denied: 'cleaned_50Tweet.csv'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mPermissionError\u001b[0m Traceback (most recent call last)", "\u001b[1;32m~\\AppData\\Local\\Temp/ipykernel_17220/4198889860.py\u001b[0m in \u001b[0;36m\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mcombined_df\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mto_csv\u001b[0m \u001b[1;33m(\u001b[0m\u001b[1;34m'cleaned_50Tweet.csv'\u001b[0m\u001b[1;33m,\u001b[0m\u001b[0mencoding\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'utf-8-sig'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m", "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\pandas\\core\\generic.py\u001b[0m in \u001b[0;36mto_csv\u001b[1;34m(self, path_or_buf, sep, na_rep, float_format, columns, header, index, index_label, mode, encoding, compression, quoting, quotechar, line_terminator, chunksize, date_format, doublequote, escapechar, decimal, errors, storage_options)\u001b[0m\n\u001b[0;32m 3464\u001b[0m )\n\u001b[0;32m 3465\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m-> 3466\u001b[1;33m return DataFrameRenderer(formatter).to_csv(\n\u001b[0m\u001b[0;32m 3467\u001b[0m \u001b[0mpath_or_buf\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 3468\u001b[0m \u001b[0mline_terminator\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mline_terminator\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\pandas\\io\\formats\\format.py\u001b[0m in \u001b[0;36mto_csv\u001b[1;34m(self, path_or_buf, encoding, sep, columns, index_label, mode, compression, quoting, quotechar, line_terminator, chunksize, date_format, doublequote, escapechar, errors, storage_options)\u001b[0m\n\u001b[0;32m 1103\u001b[0m \u001b[0mformatter\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfmt\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1104\u001b[0m )\n\u001b[1;32m-> 1105\u001b[1;33m \u001b[0mcsv_formatter\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msave\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 1106\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 1107\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mcreated_buffer\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\pandas\\io\\formats\\csvs.py\u001b[0m in \u001b[0;36msave\u001b[1;34m(self)\u001b[0m\n\u001b[0;32m 235\u001b[0m \"\"\"\n\u001b[0;32m 236\u001b[0m \u001b[1;31m# apply compression and byte/text conversion\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 237\u001b[1;33m with get_handle(\n\u001b[0m\u001b[0;32m 238\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 239\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmode\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;32m~\\anaconda3\\lib\\site-packages\\pandas\\io\\common.py\u001b[0m in \u001b[0;36mget_handle\u001b[1;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[0;32m 700\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mioargs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mencoding\u001b[0m \u001b[1;32mand\u001b[0m \u001b[1;34m\"b\"\u001b[0m \u001b[1;32mnot\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mioargs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmode\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 701\u001b[0m \u001b[1;31m# Encoding\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 702\u001b[1;33m handle = open(\n\u001b[0m\u001b[0;32m 703\u001b[0m \u001b[0mhandle\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 704\u001b[0m \u001b[0mioargs\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmode\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n", "\u001b[1;31mPermissionError\u001b[0m: [Errno 13] Permission denied: 'cleaned_50Tweet.csv'" ] } ], "execution_count": 124 }, { "id": "69e08c99", "cell_type": "code", "source": "# Check for null values in the DataFrame\nnull_counts = combined_df.isnull().sum()\n\n# Display the number of null values for each column\nprint(null_counts)\n", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Tweet 0\n", "LABEL 0\n", "P+D+PFN: 0\n", "P+SMN: 0\n", "C+P+D+SMN: 0\n", " ..\n", "P+DFN: 0\n", "NEGPART: 0\n", "C+IMPV+PRO: 0\n", "EMPH+PSTV: 0\n", "clean_text 0\n", "Length: 265, dtype: int64\n" ] } ], "execution_count": 125 }, { "id": "ac66c38f", "cell_type": "code", "source": "# remove the \"unwanted\" class\ncombined_df['LABEL'] = combined_df['LABEL'].astype(int)\ncombined_df = combined_df[(combined_df['LABEL'] != 3) & (data_df['LABEL'] != 1)]", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\moner\\AppData\\Local\\Temp/ipykernel_17220/3413781754.py:3: UserWarning: Boolean Series key will be reindexed to match DataFrame index.\n", " combined_df = combined_df[(combined_df['LABEL'] != 3) & (data_df['LABEL'] != 1)]\n" ] } ], "execution_count": 150 }, { "id": "aefc9aa7", "cell_type": "code", "source": "combined_df", "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", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
TweetLABELP+D+PFN:P+SMN:C+P+D+SMN:B-PER:PRSV+PRO:Q:DMN:C+PRO:...DMN+PRO:VOC+ALLAH:P+FWN:NEG+PRSV:EMPH+NEG:P+DFN:NEGPART:C+IMPV+PRO:EMPH+PSTV:clean_text
0اولا الله يوفقهم ان شاءالله وثانيا الرياضة شي ...000001000...000000000اولا الله يوفقهم ان شاءالله وثانيا الرياضة شي ...
1الاحظ شكثر الحريم اللي يمشون على ممشى البحر وف...000000000...000000000الاحظ شكثر الحريم اللي يمشون على ممشى البحر وف...
2حلو بما اننه عجبتش الرياضة استمري فيها وما بس ...000010000...000000000حلو بما اننه عجبتش الرياضة استمري فيها وما بس ...
3طيب يا غبي مصارعة الحريم للحريم ؟؟ ولا فيها ام...000000000...000000000طيب يا غبي مصارعة الحريم للحريم ؟؟ ولا فيها ام...
4اذا مافيه الا هاالعلاج مالك الاتصبرين كم شهر ل...001011100...000000000اذا مافيه الا هاالعلاج مالك الاتصبرين كم شهر ل...
..................................................................
3816غصب ان الحريم موجودات ضحك سبق و قلتوا ان الحرم...200000000...000000000غصب ان الحريم موجودات ضحك سبق و قلتوا ان الحرم...
3817ابعدو الحريم عن كرة القدم ارجوكم اعيدو الحريم ...200002000...000000000ابعدو الحريم عن كرة القدم ارجوكم اعيدو الحريم ...
3818لن اتزوج بنت تتابع كوره انتهى200000000...000000000لن اتزوج بنت تتابع كوره انتهى
3819اخذ واعطي مع البنت بكل شي الا كرة القدم اطلعي ...200000000...000000000اخذ واعطي مع البنت بكل شي الا كرة القدم اطلعي ...
3820البنت و كرة القدم خطان متوازيان لا يلتقيان ف ا...200000000...000000000البنت و كرة القدم خطان متوازيان لا يلتقيان ف ا...
\n", "

3697 rows × 265 columns

\n", "
" ], "text/plain": [ " Tweet LABEL P+D+PFN: \\\n", "0 اولا الله يوفقهم ان شاءالله وثانيا الرياضة شي ... 0 0 \n", "1 الاحظ شكثر الحريم اللي يمشون على ممشى البحر وف... 0 0 \n", "2 حلو بما اننه عجبتش الرياضة استمري فيها وما بس ... 0 0 \n", "3 طيب يا غبي مصارعة الحريم للحريم ؟؟ ولا فيها ام... 0 0 \n", "4 اذا مافيه الا هاالعلاج مالك الاتصبرين كم شهر ل... 0 0 \n", "... ... ... ... \n", "3816 غصب ان الحريم موجودات ضحك سبق و قلتوا ان الحرم... 2 0 \n", "3817 ابعدو الحريم عن كرة القدم ارجوكم اعيدو الحريم ... 2 0 \n", "3818 لن اتزوج بنت تتابع كوره انتهى 2 0 \n", "3819 اخذ واعطي مع البنت بكل شي الا كرة القدم اطلعي ... 2 0 \n", "3820 البنت و كرة القدم خطان متوازيان لا يلتقيان ف ا... 2 0 \n", "\n", " P+SMN: C+P+D+SMN: B-PER: PRSV+PRO: Q: DMN: C+PRO: ... DMN+PRO: \\\n", "0 0 0 0 1 0 0 0 ... 0 \n", "1 0 0 0 0 0 0 0 ... 0 \n", "2 0 0 1 0 0 0 0 ... 0 \n", "3 0 0 0 0 0 0 0 ... 0 \n", "4 1 0 1 1 1 0 0 ... 0 \n", "... ... ... ... ... .. ... ... ... ... \n", "3816 0 0 0 0 0 0 0 ... 0 \n", "3817 0 0 0 2 0 0 0 ... 0 \n", "3818 0 0 0 0 0 0 0 ... 0 \n", "3819 0 0 0 0 0 0 0 ... 0 \n", "3820 0 0 0 0 0 0 0 ... 0 \n", "\n", " VOC+ALLAH: P+FWN: NEG+PRSV: EMPH+NEG: P+DFN: NEGPART: C+IMPV+PRO: \\\n", "0 0 0 0 0 0 0 0 \n", "1 0 0 0 0 0 0 0 \n", "2 0 0 0 0 0 0 0 \n", "3 0 0 0 0 0 0 0 \n", "4 0 0 0 0 0 0 0 \n", "... ... ... ... ... ... ... ... \n", "3816 0 0 0 0 0 0 0 \n", "3817 0 0 0 0 0 0 0 \n", "3818 0 0 0 0 0 0 0 \n", "3819 0 0 0 0 0 0 0 \n", "3820 0 0 0 0 0 0 0 \n", "\n", " EMPH+PSTV: clean_text \n", "0 0 اولا الله يوفقهم ان شاءالله وثانيا الرياضة شي ... \n", "1 0 الاحظ شكثر الحريم اللي يمشون على ممشى البحر وف... \n", "2 0 حلو بما اننه عجبتش الرياضة استمري فيها وما بس ... \n", "3 0 طيب يا غبي مصارعة الحريم للحريم ؟؟ ولا فيها ام... \n", "4 0 اذا مافيه الا هاالعلاج مالك الاتصبرين كم شهر ل... \n", "... ... ... \n", "3816 0 غصب ان الحريم موجودات ضحك سبق و قلتوا ان الحرم... \n", "3817 0 ابعدو الحريم عن كرة القدم ارجوكم اعيدو الحريم ... \n", "3818 0 لن اتزوج بنت تتابع كوره انتهى \n", "3819 0 اخذ واعطي مع البنت بكل شي الا كرة القدم اطلعي ... \n", "3820 0 البنت و كرة القدم خطان متوازيان لا يلتقيان ف ا... \n", "\n", "[3697 rows x 265 columns]" ] }, "execution_count": 151, "metadata": {}, "output_type": "execute_result" } ], "execution_count": 151 }, { "id": "591ed234", "cell_type": "code", "source": "\n# Separate features and labels\nx = combined_df[[\"P+D+PFN:\", \"P+SMN:\", \"B-PER:\", \"PRSV+PRO:\", \"Q:\", \"DMN:\", \"C+PRO:\", \"B-PROPH:\", \"C+D+SMAJ:\", \"EXC+PSTV+ALLAH:\", \"C+SFAJ:\", \"C+D+PFN:\", \"C+T+PRO:\", \"B-MISC:\", \"FUT+PRSV+PRO:\", \"PMN:\", \"SFN:\", \"D+FWN:\", \"C+NEG:\", \"C+ACC+PRO:\", \"ACC+PREV:\", \"CERT:\", \"D+DFAJ:\", \"P+PIN:\", \"C+PRSV:\", \"D+PMN:\", \"T+PRO:\", \"C+SMN:\", \"P+DM:\", \"C:\", \"C+PRSV+PRO:\", \"AJNM:\", \"C+PMN:\", \"P+B-ORG:\", \"D+PMAJ:\", \"REL+PRO:\", \"P+SMN+PRO:\", \"NEG:\", \"EXC:\", \"PREV:\", \"DM+D+SFN:\", \"NM:\", \"NEG+SMN:\", \"B-AWARD:\", \"D+PIAJ:\", \"PRSV:\", \"D+DFN:\", \"AJCMP:\", \"DM:\", \"PFN+PRO:\", \"C+COND:\", \"D+DMN:\", \"LC+PRO:\", \"PIN+PRO:\", \"SMN+PRO:\", \"C+P+B-LOC:\", \"PPRSV:\", \"C+PPSTV:\", \"P:\", \"VOC:\", \"SFAJ:\", \"C+VOC:\", \"ACC+PRO:\", \"P+NQ+PRO:\", \"DMAJ:\", \"IMPV:\", \"PSTV+PRO:\", \"C+IMPV:\", \"PRP:\", \"C+B-LOC:\", \"P+PIN+PRO:\", \"C+P+PRO:\", \"C+D+SFAJ:\", \"AJCMP+PRO:\", \"I-LOC:\", \"B-EVENT:\", \"P+D+NQ:\", \"C+Q+P:\", \"P+PMN+PRO:\", \"I-PER:\", \"NPART+PRO:\", \"Q+P+PRO:\", \"PIAJ:\", \"C+P:\", \"C+PFN+PRO:\", \"P+D+SMN:\", \"C+P+SMN:\", \"C+LC:\", \"EXH:\", \"AV:\", \"C+PIN:\", \"INDEF:\", \"ALLAH+VOC:\", \"C+C:\", \"B-MONTH:\", \"LC:\", \"DFAJ:\", \"B-TIME:\", \"PIN:\", \"D+PFN:\", \"P+ACC+PRO:\", \"FUT:\", \"REL+PSTV:\", \"D+SFAJ:\", \"C+P+REL:\", \"Q+PRO:\", \"I-EVENT:\", \"D+SMN:\", \"NPART:\", \"PMAJ:\", \"REL:\", \"DMN+PRO:\", \"P+PFN+PRO:\", \"C+D+NQ:\", \"C+FWN:\", \"VOC+ALLAH:\", \"D+PIN:\", \"C+DM:\", \"AB:\", \"B-TITLE:\", \"C+CERT:\", \"P+D+SFN:\", \"P+FWN:\", \"P+PRO:\", \"VOC+SMN:\", \"IJ:\", \"P+AJCMP:\", \"NEG+PRSV:\", \"C+Q:\", \"P+B-PER:\", \"PRO:\", \"D+SMAJ:\", \"P+B-LOC:\", \"C+D+FWN:\", \"IMPV+PRO:\", \"D+AJCMP:\", \"C+P+DM:\", \"EMPH+NEG:\", \"C+SFN+PRO:\", \"D+SMN+P+ALLAH:\", \"EXL:\", \"C+PSTV:\", \"PPSTV:\", \"SMN:\", \"C+PSTV+PRO:\", \"VPART+PRSV:\", \"OATH+ALLAH:\", \"C+PIN+PRO:\", \"ALLAH:\", \"P+PFN:\", \"RET:\", \"C+NQ+PRO:\", \"PURP+PRSV:\", \"C+NM:\", \"COND:\", \"NEG+PSTV:\", \"P+NEG:\", \"D+AJNM:\", \"C+D+SMN:\", \"NQ:\", \"P+SUB:\", \"NQ+PRO:\", \"P+DFN:\", \"P+AJNM:\", \"PSTV:\", \"PX:\", \"P+SFN+PRO:\", \"P+SFN:\", \"C+B-PER:\", \"C+AV:\", \"C+P+NQ:\", \"C+D+PIN:\", \"D+NQ:\", \"C+D+PMN:\", \"PFAJ:\", \"NEG+P:\", \"INTG+PRO:\", \"C+SMAJ:\", \"FUT+PRSV:\", \"PFN:\", \"P+ALLAH:\", \"NEGPART:\", \"C+ACC:\", \"C+T:\", \"P+AV:\", \"P+REL:\", \"C+PFN:\", \"C+REL:\", \"DFN:\", \"SUB:\", \"C+PPRSV:\", \"B-DAY:\", \"P+D+PIN:\", \"VOC+SFN+PRO:\", \"C+P+D+SFN:\", \"C+ALLAH:\", \"I-ORG:\", \"FWN:\", \"C+SFN:\", \"D+NM:\", \"D+PFAJ:\", \"P+ACC:\", \"T:\", \"P+D+PMN:\", \"D:\", \"DM+D+SMN:\", \"SMAJ+PRO:\", \"SFN+PRO:\", \"P+NQ:\", \"C+IMPV+PRO:\", \"C+SMN+PRO:\", \"C+SUB:\", \"SMAJ:\", \"C+P+SFN:\", \"C+P+ALLAH:\", \"B-ORG:\", \"B-NATIONALITY:\", \"C+B-ORG:\", \"C+NQ:\", \"EMPH+PSTV:\", \"B-LOC:\", \"RES:\", \"D+SFN:\", \"C+D+SFN:\", \"ACC:\", \"C+P+D+SMN:\", \"C+P+NEG:\", \"EXP:\", \"FUT+PPRSV:\", \"C+VPART+PRSV:\", \"P+DMN:\", \"P+D+FWN:\", \"PSTV+ALLAH:\", \"IMPV+P+PRO:\", \"SUB+NEG:\", \"C+D+NM:\", \"P+NM:\", \"D+DMAJ:\", \"P+PMN:\", \"C+D+AJCMP:\", \"C+D+AJNM:\", \"C+AJCMP+PRO:\", \"P+T:\", \"C+AJCMP:\", \"C+AJNM:\", \"C+B-NATIONALITY:\", \"C+NEG+SMN:\", \"C+B-EVENT:\", \"P+B-EVENT:\", \"C+NEG+PRO:\", \"C+P+SUB:\", \"VPART+PRSV+PRO:\", \"C+FUT+PRSV:\", \"B-CLAN:\", \"I-LANG:\", \"REM+NEG:\", \"NM+PRO:\", \"DFN+PRO:\", \"PMN+PRO:\", \"C+PMN+PRO:\", \"P+B-LANG:\", \"NEG+P+PRO:\" ]]\ny = combined_df['LABEL']\n\n\n# Split data into train and test sets\nX_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.30, random_state=42)", "metadata": {}, "outputs": [], "execution_count": 152 }, { "id": "5c939928", "cell_type": "code", "source": "clf = DecisionTreeClassifier()\n\n# Fit the classifier on the training data\nclf.fit(X_train, y_train)\n\n# Make predictions on the test data\ny_pred = clf.predict(X_test)\n\n\n\nprint(classification_report(y_test, y_pred))\n\naccuracy = accuracy_score(y_test, y_pred)\nprint(\"Accuracy:\", accuracy)", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.76 0.75 0.75 534\n", " 2 0.77 0.78 0.77 576\n", "\n", " accuracy 0.76 1110\n", " macro avg 0.76 0.76 0.76 1110\n", "weighted avg 0.76 0.76 0.76 1110\n", "\n", "Accuracy: 0.7648648648648648\n" ] } ], "execution_count": 153 }, { "id": "7cb53abc", "cell_type": "code", "source": "from sklearn.metrics import classification_report\nfrom sklearn.preprocessing import LabelEncoder\nimport xgboost as xgb\nfrom imblearn.under_sampling import RandomUnderSampler\n\ndef balance__classes(X, y):\n sampler = RandomUnderSampler(random_state=40)\n X_balanced, y_balanced = sampler.fit_resample(X, y)\n return X_balanced, y_balanced\n\n# Balance the classes by undersampling the majority class\nX_train_balanced, y_train_balanced = balance__classes(X_train, y_train)\n\n# Encode the target variable as binary values\nlabel_encoder = LabelEncoder()\ny_train_binary = label_encoder.fit_transform(y_train_balanced)\n\n# Train XGBoost classifier with balanced classes\nclf = xgb.XGBClassifier(scale_pos_weight=(y_train_binary == 0).sum() / (y_train_binary == 1).sum())\nclf.fit(X_train_balanced, y_train_binary)\n\n# Encode the test set labels as binary values\ny_test_binary = label_encoder.transform(y_test)\n\n# Make predictions on test set\ny_pred = clf.predict(X_test)\n\n# Print classification report\nprint(classification_report(y_test_binary, y_pred))\naccuracy = accuracy_score(y_test_binary, y_pred)\nprint(\"Test Accuracy:\", accuracy)", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.86 0.75 0.80 534\n", " 1 0.79 0.89 0.84 576\n", "\n", " accuracy 0.82 1110\n", " macro avg 0.83 0.82 0.82 1110\n", "weighted avg 0.82 0.82 0.82 1110\n", "\n", "Test Accuracy: 0.8198198198198198\n" ] } ], "execution_count": 154 }, { "id": "44a8cea3", "cell_type": "code", "source": "# Train Support Vector Machine classifier\nclf = SVC(kernel='linear', C=3)\nclf.fit(X_train, y_train)\n\n# Make predictions on test set\ny_pred = clf.predict(X_test)\n\n# Print classification report\nprint(classification_report(y_test, y_pred))\naccuracy = accuracy_score(y_test , y_pred)\nprint(\"Test Accuracy:\", accuracy)", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.90 0.71 0.79 534\n", " 2 0.77 0.93 0.84 576\n", "\n", " accuracy 0.82 1110\n", " macro avg 0.84 0.82 0.82 1110\n", "weighted avg 0.83 0.82 0.82 1110\n", "\n", "Test Accuracy: 0.8207207207207208\n" ] } ], "execution_count": 155 }, { "id": "1190b35d", "cell_type": "code", "source": "from sklearn.ensemble import RandomForestClassifier\nfrom sklearn.metrics import classification_report\nfrom sklearn.model_selection import train_test_split\n\n\n# Train a Random Forest classifier\nclf = RandomForestClassifier(n_estimators=100, random_state=42)\nclf.fit(X_train, y_train)\n\n# Make predictions on the test set\ny_pred = clf.predict(X_test)\n\n# Print classification report\nprint(classification_report(y_test, y_pred))\n\naccuracy = accuracy_score(y_test , y_pred)\nprint(\"Test Accuracy:\", accuracy)", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " precision recall f1-score support\n", "\n", " 0 0.91 0.73 0.81 534\n", " 2 0.79 0.94 0.86 576\n", "\n", " accuracy 0.84 1110\n", " macro avg 0.85 0.83 0.83 1110\n", "weighted avg 0.85 0.84 0.83 1110\n", "\n", "Test Accuracy: 0.836036036036036\n" ] } ], "execution_count": 160 }, { "id": "7a4917f7", "cell_type": "code", "source": "import seaborn as sns\nimport matplotlib.pyplot as plt\nfrom sklearn.metrics import confusion_matrix\n\n# Compute the confusion matrix\ncm = confusion_matrix(y_test , y_pred)\n\n# Create a heatmap using Seaborn\nsns.heatmap(cm, annot=True, fmt=\"d\", cmap=\"Blues\")\n\n# Create a confusion matrix with the correct labels\ncm = confusion_matrix(y_test , y_pred)\n\n# Create a heatmap using Seaborn and specify the tick labels\nplt.figure(figsize=(10, 10))\nsns.set(font_scale=1.8)\nsns.heatmap(cm, annot=True, fmt='d', cmap='Blues', cbar=False, annot_kws={\"size\": 18, \"weight\": \"bold\"}, linewidths=0.5,\n xticklabels=['0', '1'], yticklabels=['0', '1'])\n\nplt.xlabel('Predicted', fontsize=20)\nplt.ylabel('Actual', fontsize=20)\nplt.tick_params(axis='both', which='major', labelsize=18)\nplt.show()\n\n", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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AFadFQ63n/zkJyu0rqqqKt/73vf+7YEAAFi6FQ63a665Zrn7q6qqUqlUhBsAwCqywuH2hz/8Yanb586dm9deey033HBDOnbsmF/+8pcrazYAAD5khcOtb9++y90/YMCADBgwIH/4wx9y8skn/8eDAQCwuBW+HMhHadeuXfbbb7/ccccdK+suAQD4kJUWbkmycOHCxT4WCwCAlWelhdsjjzySO++8M126dFlZdwkAwIf8x+e4VSqVzJ07N7W1talUKjn22GNX2nAAAHxghcNtvfXWW+r2qqqqdOjQIV26dMnAgQOzxx57rKzZAAD4kJXykVcAAKx6K3zEbciQIdlxxx3Tp0+fZa556KGH8uCDD+acc85ZKcOtbPNqGnoCYG3TvHHSYofBDT0GsJaZ+48hS92+wm9OGDJkSP72t78td83DDz+cYcOGfbzJAABYIcs84nb99dfn5ptvXmzbjTfemAceeGCp6xcuXJhXXnklm2222cqdEACAJMsJt4MOOiiXXnpp/XXZqqqqMnXq1EydOnXpd9S4cTp16pSzzjpr1UwKALCOW2a4rbfeennsscfqv+/Ro0cGDx6cwYOdywEA0BA+1ofMb7rppkvdN3/+/DRr1mylDQUAwJJW+M0Jffv2zezZs3PiiSdm6NChi+3bddddc8IJJ+T1119f6QMCALDICofbmDFjMmjQoDz00EOZMWNG/fZ58+alV69eefTRR3PYYYdl3Lhxq2RQAIB13QqH28UXX5xKpZIbbrhhsY+1at68ea666qpce+21mTt3bi666KJVMigAwLpuhcNt1KhROfDAA7PDDjssdf8OO+yQAw44IE888cRKGw4AgA+scLjNmTMnTZo0We6aVq1aZf78+f/xUAAALGmFw23rrbfOww8/nNmzZy91//z58/PII4+kS5cuK204AAA+sMLhdvjhh+f111/PCSeckFGjRqW2tjZJUldXl2eeeSYnnnhiXnvttRx++OGrbFgAgHXZCl/H7bDDDsuoUaNy0003ZdCgQWnUqFGaNWuW+fPnp7a2NpVKJYcddlgGDRq0KucFAFhnVVUqlcrHucETTzyRu+66K2PGjMnMmTPTsmXLdOvWLZ///Oezyy675KWXXkrXrl1X1bz/kXk1DT0BsLZp3jhpsYNPlAFWrrn/GLLU7St8xO19O+20U3baaafFts2ZMyd33313Dj/88DzzzDN5/vnn/70pAQBYpo8dbh82atSoDB06NPfcc0/mzp2bSqWSNm3arKzZAAD4kI8dbtOnT8+wYcNy8803Z+zYsalUKqmurs7OO++cQw89NPvuu++qmBMAYJ23wuH2+OOPZ+jQoXnggQeycOHCvH9q3I477pjzzz8/nTp1WmVDAgDwEeE2adKk3Hrrrbnlllvy+uuvp1KppEOHDtl///1z4IEH5ktf+lI6d+4s2gAAVoNlhtsJJ5yQRx99NDU1NWndunUOPvjgHHDAAdlll11SXb3Cl38DAGAlWWa4jRw5Mi1atMg3v/nNHHfccWnatOnqnAsAgP9jmYfOdt111yxYsCBDhgzJbrvtllNOOSUPPPBAFixYsDrnAwDgPcs84nbFFVdk6tSpueOOO3L77bfnnnvuyfDhw9OqVavss88++dznPrc65wQAWOet8CcnjBkzJrfddlvuuuuuTJ06NVVVVUmS7bbbLmeeeWZ22GGHVTroyuCTE4CVzScnAKvCsj454WN/5FVdXV0effTRDBs2LCNGjMi8efNSVVWVTTfdNAMGDMiAAQPSpUuXlTL0yibcgJVNuAGrwkoLtw+bPXt2hg8fnmHDhuWpp56qvxjvmvqRV8INWNmEG7AqrLTPKv2wVq1a5Qtf+EK+8IUv5I033sjtt9+eO++88z+5SwAAluE/OuJWGkfcgJXNETdgVVjWETdX0gUAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAoROOGHgAawqOPPJzLL/tNRo8ZnRbNm2fP/nvnpFNOS9t27fLk3/6aY79+1HJvf8VVf0ifvjuupmmBNdFDV5+SnbbvssT2MePeyicPPTdJsu8u2+Z7x+6X3t03y5x5C3LnQ//KD341LO/MnLPYbT63+3Y587j9s+1WnTJj1rzcPuKf+fGQOzNj1tzV8lwoh3BjnTPyoQdz0rdPTKVSSZLMmzs3t94yNKNHP5/rbhy6QvfRqlWrVTkiUIDunTde7v4DPtsrQy86PtXVi17catWiWY4+dJds32PzfPbIC1NXt+jvoCMO7JvLz/5K/boWzZvmhMM/m52275w9v/aLzJu/cNU+EYoi3FjnXPKri1KpVNJru9750dnn5NFH/pxfXfTzPP/cc7nnrjuz338dkPtHPLzYbWrranP80V/LhAmvZeDhX8q2PXs10PTAmqDTBm2zfpuWSZI9v/bzTHjznfp9C2tqkyRnD/58qqur8+Qz43PiOTdkv122zbnfPTif3naLDDqgT264629p3qxJfnrqYamurs5tD/wj5/zm7hy6z6fygxMOyCd7bJ5vf3nPXPj7+xvkObJmco4b65QZ06dnyuTJSZLvnnxqunXvkaOPPT5t2rRNkowa9Y80bdo0G2288WI/HnpwRCZMeC0bbbxxTj7t9IZ8CsAaoEeXRUfb6urq8vfnXsvrk6fX/5g87d2s36ZlOm2w6O+VH1w8LM++9EZ+fvUDmTZjdpJkx96d63/u0G7REfwzL7o9L7zyVv7nt/fkqWfHJ0m+fGDf1fzMWNM54sY6pW27dvnzY3/Na6++mo07dUqS1NTUZMGC+UmSJk2aLHGbadOm5TdDLk6SDP72SWnZsuXqGxhYI23bZdHfH29NnZma2rp0aNcq78ycU//y5zsz52SzPc9Il807ZuJb05MkjRpVp3nTRX/HLFxYkyTp1LFN/X2+MXl6/df/HD0xn+m1Zbp33jitWzXPu7PnrYZnRQkccWOdtMUnPpGmTZtm5owZ+fmF52fevHmpqqrKfx1w4BJrb/rfG/Luu++mU6dN8rkBn2+AaYE1zftH3NZr2SyvjjgvEx+6IBMfuiDfO27/xda9MmFqFiysSbvWLXLBKYekZYumqaury033/j1JMmPWB0G22cbr13+9wfrr1X+9Raf2q/KpUBhH3Fhn1dbWZs/P9ktNTU0aN26cM848K723/+Ria2pqanLLzTclSQ7/0hFp1KhRA0wKrGm2eS/c2qzXon7b+m1a5kcnHpjWLZvlrF8Nq99eXV2V10acnyZNGmXhwtqceuHQ/O2Z8UmSvz0zLvMXLEyzpk1y9uAB+c7//G8+3fMT2X+3nvW3b92q2ep5UhTBETfWWVMmT05NTc1731XlqaeezIzp0xdb8/DIhzJ50qRUV1fnoEMOW+0zAmum1ydPzysTpuSyP/45W+17Vrof8MM8MeqVJMm3v9w/G3/oJdBNNmibJk0W/aevkkp2+3TX+jc2vD19di69YWSS5Iv7fTpv/vnC3PWbwWn8of8kvv/yKyTCjXVYmzZtcvNtd+R3V16d9duvn/uG35PTTzt5sTV/uu/eJEnv3tunfXsvVwCLfPXMq9Pz82fn5PNvyhtTZuS1N6flx5felSRp0qRRdv7kB9d3e2fmnHzmi+flv75xcaa+Mytf3O/TufaCo+v3/+DiO/LTK+/LrDmLzrUdNWZiLr7uwfr9M53fxoc06EulRx21/IucLk1VVVWuueaaVTAN65qWrVqla7fuSZKvHPnVXPTzC/PE449lxvTpaduuXZLk8cceTZLs+tndG2pMoBBvTplR/3XzZh+80Wn23AV5buwbSZIh1z+U804+JHvt1CPrt2mZd2bOSaVSyY+G3JlzL7snbdZrnrenz87ZgwckSWpr6zL+9bdX7xNhjdag4bbFFlvk5ptvTlVVVTbccEPnD7HKvTx2bH5/5e/y1ptv5rwLfpaNNtooST70kmky/713mL766vhMf++l0569tlvtswJrpk4btM0V5xyZTTZolx8NuSN3PPSvJEmPzhvVrxk/8e1ccc6R2Xzj9vn696/OG+9FXePGH/w717xZk7Rq0TQnfmmPbLbx+vn9LX/JqDETkyS7fXrrJMk/x0x0AV4W06Dhdu6552b77bfPD3/4w/Tr1y8/+clPGnIc1gHtO7TP8LvvSm1tbc49+0f5zsmnZNJbb+b66/6QJNlq667ZcMNFf/m+8vLY+tt1e+/IHMCbU2akR+eNs8mG7XLeSYfk7RmzU1dbybnfPThJMvqVtzL2tck5fP/PpHHjRrn4rEH54SV3ZLON18+3jtgjSfLc2Dfqj9Cd+KU9snHHNtlykw454xe3ZsAevbPzJ7dKklxz+2MN8RRZg1VV3v/cnwY0ZMiQXHrppfnlL3+Z/fbbb5U9zryaj17D2u/Ky3+bi3/5iyW2N2/ePJdd/vvs8KlPJ0luuP7aXHDeuWnSpEme+uezq3tMCtG8cdJih8ENPQar2YF7bJc//vy4+o+pet+ChTX5/Ld+nYeffDGnHb1vzvn2kpcQmjN3QQ785pA8/t6bGb7zlf654NRDl1g34onR+fy3LvXmhHXU3H8MWer2NSLc6urqcvDBB2fOnDm5//77l/iDsLIIN95337335Nprrs64V15Oknz6M33yrW+flO49etSvueJ3l+WSX12UDh065sE//6WhRmUNJ9zWXbt+eut8/7j/Su/um6Vpk0b52zPj89+/vqv+Uh9Jctg+O+Q7X+lf/7mmjzw9Nv/967vyzIuvL3Zfg4/YI8d9cbds0al93pg8Pdff9bf87Ko/ZcFC/3Ctq9bocEuSBQsWZP78+WnduvUqewzhBqxswg1YFZYVbmvMBXibNm2apk2bNvQYAABrLNdxAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADAChEVaVSqTT0EAAAfDRH3AAACiHcAAAKIdwAAAoh3AAACiHcAAAKIdwAAAoh3AAACiHcAAAKIdwAAAoh3OA9EyZMyODBg9O3b9/07ds3p59+eqZNm9bQYwFrkR/84Ac58sgjG3oMCta4oQeANcE777yTr371q1mwYEGOPfbY1NbW5sorr8yYMWMydOjQNG3atKFHBAo3dOjQDB06NH379m3oUSiYcIMkV199dd56663ceeed2WqrrZIk22+/fb7+9a/n9ttvz8CBAxt4QqBUtbW1+c1vfpMhQ4Y09CisBbxUCknuvvvu9O3btz7akqRfv37p3Llz7r777gacDCjZ/Pnzc8ghh+SSSy7JQQcdlI022qihR6Jwwo113owZMzJhwoT07NlziX09e/bMs88+2wBTAWuD+fPnZ9asWbnoootywQUXpHFjL3Txn/E7iHXepEmTkmSp/xPeYIMNMmvWrLz77rtp3br16h4NKNx6662X+++/X7Cx0jjixjpv9uzZSZIWLVossa9Zs2ZJkjlz5qzWmYC1Q3V1tWhjpRJurPPq6uo+ck11tT8qADQ8/xqxzmvVqlWSReei/F/vb3t/DQA0JOHGOm+TTTZJkkyZMmWJfZMnT06bNm3SsmXL1T0WACxBuLHOa9OmTTbbbLM899xzS+x7/vnn06tXrwaYCgCWJNwgyb777pvHH388L7/8cv22xx57LOPGjcsBBxzQgJMBwAe81QWSHHfccRk2bFi+9rWv5eijj878+fNzxRVXpGfPnjnooIMaejwASOKIGyRJ2rdvn+uuuy49evTIxRdfnGuuuSZ77713rrjiCp9TCsAao6pSqVQaeggAAD6aI24AAIUQbgAAhRBuAACFEG4AAIUQbgAAhRBuAACFEG4AAIUQbsAa65JLLkn37t2X+NGzZ8/suOOOOfLIIzNs2LDVNs/MmTPTvXv3HHnkkfXbbr311nTv3j1XX331v3Wfd911VyZMmLCSJvzAQQcdlO7du6/0+wUalo+8AtZ4e+21V7bZZpv672tqajJt2rQMHz48p59+el555ZWcfPLJDTLbNttsk8GDB+eTn/zkx77thRdemCuuuCK33377Sp8LWDsJN2CNt/fee+fQQw9dYvsxxxyTQw45JJdffnkGDhyYTTfddLXPts022ywWlR/H22+/vZKnAdZ2XioFirXllltmr732Sm1tbR599NGGHgdglRNuQNE22mijJMn06dPrzzcbPnx4jjnmmGy33XbZc889688hmzVrVn72s59l7733Tq9evbLbbrvlRz/60VKPfE2cODGnnXZa+vXrlx122CGDBw/OG2+8scS6ZZ3jNnr06Jx88snZZZddssMOO+SQQw7JzTffnPc/Hrp///657bbbkiQHH3xw+vfvX3/bSqWSG2+8MYccckh69+6dPn365IQTTsjzzz+/xOPPmzcvv/jFL9K/f//07t07AwcOzJNPPvnv/WICazwvlQJFe+2115IsCri6urokybnnnpsNN9wwRx55ZCZOnJjNN9887777bo444oi8+OKL2XnnnbPvvvtm4sSJuemmm/LII4/kf//3f7PhhhsmSd56660MGjQoU6dOTf/+/bPJJpvkkUceybHHHrtCMz3++OM54YQTUltbm7322iubbLJJRo4cmbPOOitvvPFGvvOd7+Soo47KbbfdltGjR+fwww9Ply5d6m9/xhlnZNiwYenatWsGDRqUuXPnZvjw4Rk0aFB++9vfZuedd06S1NXV5bjjjsvf/va39O7dO/vss0+eeeaZHH300WnRosXK/GUG1hQVgDXUxRdfXOnWrVvllltuWer+f/3rX5Vtt9220rt378rbb79dueWWWyrdunWrfPazn63MmTNnsbU//vGPK926datcd911i21/4IEHKt26dat85zvfqd92+umnV7p161a59dZb67fNnj278pWvfKXSrVu3yle+8pX67e8/5lVXXVWpVCqVmpqaSv/+/Svbbbdd5emnn65fN2/evMqAAQMq22yzTWXq1KmVSqVSOeOMMyrdunWrPP/88/Xr7rnnnkq3bt0qp5xySmXhwoX121977bVK3759K7vttltl/vz5lUqlUrn55psr3bp1q5x55pmV2tra+rUXXHBBpVu3bpVu3bot/xcYKI4jbsAa74EHHsjrr79e/31NTU3GjRuXkSNHpqamJt///vfTvn37+v277777Ykecampqcvvtt6dr16758pe/vNh977XXXvnUpz6VP/3pT5k1a1aaNm2a+++/P127ds0hhxxSv65ly5Y57bTTMnDgwOXO+s9//jMTJ07MwIEDs8MOO9Rvb9asWb73ve9l1KhRmT9//jJvf/PNNydJzjrrrDRu/MFf0ZtvvnkGDRqUyy67LI899lj22GOP3H333amqqsqpp56a6uoPznw56aSTctNNN+Xdd99d7qxAeYQbsMYbMWJERowYUf99kyZN0q5du+yyyy758pe/nF133XWx9f/33aXjxo3LnDlzUltbm0suuWSJ+58/f35qa2szZsyYtGvXLnPmzEmvXr2WWNerV680adJkubOOHj06SZZ6eZB+/fqlX79+y739c889l2bNmuX6669fYt+4ceOSJC+88EL22GOPjB49Optsskk6dOiw2LqmTZumZ8+eeeKJJ5b7WEB5hBuwxvvJT36y1MuBLEuzZs0W+37mzJlJkldeeSVDhgxZ5u1mzJiRqqqqJEmrVq2W2N+oUaOst956y33s9x/ro9Yty7vvvpuampqPnPP9x/q/0fa+tm3b/luPD6zZhBuw1ns/wg466KD89Kc/Xe7al19+OUmW+jJjpVLJ3Llzl3v7li1bJklmz569xL6FCxemUqmkadOmy719q1atMnLkyOU+TpK0adNmmS+Hzpkz5yNvD5TH5UCAtV7nzp3TtGnTPPfcc/WX4/iwq6++Or/+9a/zzjvvZIsttkjr1q3zj3/8Y4l1Y8eOzbx585b7WN26dUuS/Otf/1pi3/Dhw7P99tvXf1LC+0f3Pqx79+556623MmXKlCX2PfTQQ7nooovqX47t2bNn3nzzzSUuU1JbW5sXXnhhuXMCZRJuwFqvWbNmOeCAAzJ27NhcddVVi+3761//mp/+9Ke55ZZb0rZt2zRp0iQHHnhgXnvttcXWLliwID//+c8/8rH69OmTTp06ZdiwYYvF04IFC3L11Venurq6/nIe77/5YOHChfXrDjnkkFQqlZxzzjlZsGBB/fbJkyfnxz/+cX73u9/VH9V7/80T559//mL3ceWVV2bq1Kkr/OsDlMNLpcA64Ywzzsg//vGPXHDBBRkxYkR69+6dSZMm5f7770/jxo1z3nnn1b8z8+STT87jjz+e888/P48++mi22mqrPP7445k+ffoS58/9X+/f1ze+8Y0MGjQo++yzTzp06JCRI0dm/PjxOfPMM+svGvz+z+eff3769euXwYMH59BDD82DDz6Y++67L2PGjMluu+2WmpqaDB8+PNOnT8+pp56aLbbYIklywAEH5L777su9996bcePGZeedd87YsWPzxBNPZNNNN13snbjA2sERN2Cd0L59+9x00005+uijM2nSpFx77bV56qmn0r9//9x0003Zcccd69e2bds2N954YwYNGpQxY8bkj3/8Yzp27Jirr756ueenva9fv3658cYbs/POO+fhhx/O9ddfnxYtWuSCCy7I1772tfp1RxxxRHbZZZc8++yzufbaazN79uxUVVXl4osvzllnnZUWLVpk6NChGT58eLbeeutceumlOf744xd7rF/84hc57bTTsmDBgtx4442ZMmVKhgwZkh49eqy0XztgzVFVWdoJHwAArHEccQMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKIRwAwAohHADACiEcAMAKMT/D5eL0y+BDvW4AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "execution_count": 163 }, { "id": "edf7a1c7", "cell_type": "code", "source": "", "metadata": {}, "outputs": [], "execution_count": null } ] }