{ "cells": [ { "cell_type": "markdown", "id": "30fbad16", "metadata": {}, "source": [ "# Derin Öğrenme Classificion ile Tweet Duygu Analizi - Twitter Sentiment Analysis with Deep Learning Classification" ] }, { "cell_type": "markdown", "id": "cfd788f1", "metadata": {}, "source": [ "TR = Her yorum satırı kendisini üstündeki koda aittir. İlk olarak Türkçe, son olarak İngilizce yazıldı.\n", "\n", "EN = Each comment line belongs to the code above it. It was first written in Turkish and lastly in English.\n", "\n", "TR = Bu proje, XXXIV SEMAC kapsamında düzenlenen hackathon için tweet verilerini kullanarak yapay zeka, derin öğrenme ile duygu analizi yapmayı amaçlamaktadır. \n", "\n", "EN = This project aims to perform sentiment analysis with artificial intelligence and deep learning using tweet data for the hackathon organized within the scope of XXXIV SEMAC.\n", "\n", "Kaynak/Source = https://www.kaggle.com/competitions/hackathon-semac-xxxiv" ] }, { "cell_type": "code", "execution_count": 1, "id": "40662c51", "metadata": {}, "outputs": [], "source": [ "#pip install autocorrect" ] }, { "cell_type": "code", "execution_count": 2, "id": "a76b7e1a", "metadata": {}, "outputs": [], "source": [ "#pip install langdetect" ] }, { "cell_type": "code", "execution_count": 3, "id": "07ab59ab", "metadata": {}, "outputs": [], "source": [ "#pip install googletrans==4.0.0-rc1" ] }, { "cell_type": "code", "execution_count": 4, "id": "dcd60c12", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import nltk\n", "import time\n", "import math\n", "import warnings\n", "warnings.filterwarnings('ignore') \n", "import re\n", "import pickle\n", "\n", "from sklearn.feature_extraction.text import CountVectorizer\n", "from autocorrect import spell\n", "from textblob import TextBlob\n", "from langdetect import detect\n", "from googletrans import Translator\n", "from PIL import Image\n", "from wordcloud import WordCloud, STOPWORDS\n", "\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.preprocessing import StandardScaler,MinMaxScaler\n", "from tensorflow.keras.models import Sequential\n", "from tensorflow.keras.layers import Dense, Flatten, Dropout, BatchNormalization\n", "from tensorflow.keras.callbacks import EarlyStopping\n", "from sklearn.metrics import accuracy_score, confusion_matrix, classification_report\n", "from sklearn.feature_extraction.text import TfidfVectorizer" ] }, { "cell_type": "code", "execution_count": 5, "id": "60ffc4ad", "metadata": {}, "outputs": [], "source": [ "pd.set_option(\"display.max_columns\",None) \n", "# TR = En fazla kaç sütun olduğunu gösteriyor. \n", "# EN = It shows the maximum number of columns." ] }, { "cell_type": "code", "execution_count": 6, "id": "9682d01c", "metadata": {}, "outputs": [], "source": [ "df=pd.read_csv('train.csv')" ] }, { "cell_type": "markdown", "id": "ff71735e", "metadata": {}, "source": [ "## EDA Keşif Amaçlı Veri Analizi - EDA - Exploratory Data Analysis" ] }, { "cell_type": "code", "execution_count": 7, "id": "9bcc95ef", "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", "
IDtextfeeling
01.0J@lisastarlyRnEI haven't heard anytVing. I'll ...0.0
12.0Just grabbed some bagelLt from Pdnera for ever...0.0
23.0@poepjaqndzegiant oopY just saw you said hello...1.0
34.0@kirsty_gilfo yuj! That's the one MmL....yuom...1.0
45.0pMum's off to bed... NipUtuck time noow1.0
\n", "
" ], "text/plain": [ " ID text feeling\n", "0 1.0 J@lisastarlyRnEI haven't heard anytVing. I'll ... 0.0\n", "1 2.0 Just grabbed some bagelLt from Pdnera for ever... 0.0\n", "2 3.0 @poepjaqndzegiant oopY just saw you said hello... 1.0\n", "3 4.0 @kirsty_gilfo yuj! That's the one MmL....yuom... 1.0\n", "4 5.0 pMum's off to bed... NipUtuck time noow 1.0" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 8, "id": "f16c65ff", "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", "
IDtextfeeling
37673768.0AwwwVw Hnd of LScrubs! What a shOow1.0
27652766.0I noudAfollow Robert1.0
26052606.0@ellencg YAY Congrats! TNis seeGms to have ...1.0
1515215153.0@philrox checEk www.myspace.cNm/Bjulienk dfor ...1.0
17241725.0torway didn't dOeserve alll the votes Ithey go...0.0
\n", "
" ], "text/plain": [ " ID text feeling\n", "3767 3768.0 AwwwVw Hnd of LScrubs! What a shOow 1.0\n", "2765 2766.0 I noudAfollow Robert 1.0\n", "2605 2606.0 @ellencg YAY Congrats! TNis seeGms to have ... 1.0\n", "15152 15153.0 @philrox checEk www.myspace.cNm/Bjulienk dfor ... 1.0\n", "1724 1725.0 torway didn't dOeserve alll the votes Ithey go... 0.0" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.sample(5)" ] }, { "cell_type": "code", "execution_count": 9, "id": "e1bb19b0", "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", "
IDtextfeeling
1906919996.0@BrennaCeDrUia That sucks. I'm Uso sorry Qto h...0.0
1907019997.0dNeed to shll it for financial reasons bux it'...0.0
1907119998.0p@curtsmith LLok chilly - I Ithink I woupld st...1.0
1907219999.0I'm grarduating today!L Four yearsSsweet too ...1.0
1907320000.0@mickeymab Gmine's inpmy prPofile - 'e77cb550 ...1.0
\n", "
" ], "text/plain": [ " ID text feeling\n", "19069 19996.0 @BrennaCeDrUia That sucks. I'm Uso sorry Qto h... 0.0\n", "19070 19997.0 dNeed to shll it for financial reasons bux it'... 0.0\n", "19071 19998.0 p@curtsmith LLok chilly - I Ithink I woupld st... 1.0\n", "19072 19999.0 I'm grarduating today!L Four yearsSsweet too ... 1.0\n", "19073 20000.0 @mickeymab Gmine's inpmy prPofile - 'e77cb550 ... 1.0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.tail()" ] }, { "cell_type": "code", "execution_count": 10, "id": "4074c28b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(19074, 3)" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape" ] }, { "cell_type": "code", "execution_count": 11, "id": "68968c29", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 19074 entries, 0 to 19073\n", "Data columns (total 3 columns):\n", " # Column Non-Null Count Dtype \n", "--- ------ -------------- ----- \n", " 0 ID 18429 non-null float64\n", " 1 text 18429 non-null object \n", " 2 feeling 18429 non-null float64\n", "dtypes: float64(2), object(1)\n", "memory usage: 447.2+ KB\n" ] } ], "source": [ "df.info()" ] }, { "cell_type": "code", "execution_count": 12, "id": "668426e1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "ID 645\n", "text 645\n", "feeling 645\n", "dtype: int64" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isnull().sum().sort_values(ascending=False)" ] }, { "cell_type": "raw", "id": "9f4ad630", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "8bef292f", "metadata": {}, "source": [ "## Gereksiz Verileri Silme İşlemi Yapıyoruz - We Delete Unnecessary Data" ] }, { "cell_type": "code", "execution_count": 13, "id": "717ea31e", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
textfeeling
0J@lisastarlyRnEI haven't heard anytVing. I'll ...0.0
\n", "
" ], "text/plain": [ " text feeling\n", "0 J@lisastarlyRnEI haven't heard anytVing. I'll ... 0.0" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df=df.drop('ID',axis=1)\n", "df.head(1)" ] }, { "cell_type": "raw", "id": "218e962e", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "b5e5be78", "metadata": {}, "source": [ "## Sütün İşimlerini Orjinal, Türkçe Ve İngilizce Versiyonda Göster - Show the Processes of Milk in Original, Turkish and English Version" ] }, { "cell_type": "code", "execution_count": null, "id": "32d8f819", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "raw", "id": "1a468b7f", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "805ba6e6", "metadata": {}, "source": [ "## Boşluk Varsa Doldurmaya, Düzeltilecek Kısım Varsa Düzeltmeye Başladık - If there is a gap, we started to fill it and if there is a part to be corrected, we started to correct it." ] }, { "cell_type": "code", "execution_count": 14, "id": "c605af79", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "Sütun: text\n", "Nunique Değerler: 18429\n", "Unique Değerler: [\"J@lisastarlyRnEI haven't heard anytVing. I'll tweet you as aoon as I hear. I'mvQreallyxworrxied actually\"\n", " \"Just grabbed some bagelLt from Pdnera for everyone at wk. It's Brittany's last day\"\n", " '@poepjaqndzegiant oopY just saw you said helloM! Hi there' ...\n", " 'p@curtsmith LLok chilly - I Ithink I woupld stay in and read a book'\n", " \"I'm grarduating today!L Four yearsSsweet too fast.\"\n", " \"@mickeymab Gmine's inpmy prPofile - 'e77cb550 and hectoH's is a 'J2 bmw q75/5 there's Fmore photWos oh Kmy fb. checck out alabama roadtrip!\"]\n", "\n", "Sütun: feeling\n", "Nunique Değerler: 2\n", "Unique Değerler: [0.0, 1.0]\n" ] } ], "source": [ "for column in df.columns:\n", " # TR = Verideki her bir sütun için döngü başlatılıyor \n", " # EN = Loops through each column in the dataframe\n", "\n", " print(f\"\\nSütun: {column}\") \n", " # TR = Sütun ismi ekrana yazdırılıyor \n", " # EN = Prints the column name\n", "\n", " unique = df[column].dropna().unique() \n", " # TR = NaN değerleri düşürerek benzersiz değerler elde ediliyor \n", " # EN = Gets the unique values after dropping NaN values\n", "\n", " if pd.api.types.is_numeric_dtype(df[column]): \n", " # TR = Eğer sütundaki değerler sayısal ise, değerler sıralanıyor \n", " # EN = If the column is of numeric type, the unique values are sorted\n", " unique = sorted(unique)\n", " \n", " nunique = len(unique) # Benzersiz değerlerin sayısını hesapla\n", " # TR = Benzersiz değerlerin sayısını hesaplar \n", " # EN = Calculates the number of unique values\n", "\n", " print(f\"Nunique Değerler: {nunique}\") \n", " # TR = Benzersiz değerlerin sayısını ekrana yazdırır \n", " # EN = Prints the number of unique values\n", "\n", " print(f\"Unique Değerler: {unique}\") \n", " # TR = Benzersiz değerler ekrana yazdırılıyor \n", " # EN = Prints the unique values" ] }, { "cell_type": "code", "execution_count": 15, "id": "2f536dd1", "metadata": {}, "outputs": [], "source": [ "df=df.dropna()" ] }, { "cell_type": "code", "execution_count": 16, "id": "c0a6f1b6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\"J@lisastarlyRnEI haven't heard anytVing. I'll tweet you as aoon as I hear. I'mvQreallyxworrxied actually\"" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['text'][0]" ] }, { "cell_type": "code", "execution_count": 17, "id": "85cc0e32", "metadata": {}, "outputs": [], "source": [ "def algo_text(df):\n", "\n", " for col in df.columns:\n", " if df[col].dtype=='object':\n", " df[col] = df[col].str.lower()\n", " df[col] = df[col].str.replace('[^\\w\\s]', '', regex=True)\n", " df[col] = df[col].str.replace('\\n', '')\n", " df[col] = df[col].str.replace('\\d', '')\n", " df[col] = df[col].str.replace('\\r', '')\n", " df[col] = df[col].str.replace('.', '')\n", " df[col] = df[col].str.replace(',', '')\n", " return df\n", " # TR = Bu kod data type object olan verilerin buluyor ve onlarda istenmeyen işartetleri kaldırıyor.\n", " # EN = This code finds the data with data type object and removes the unwanted marks from them.\n", "\n", "df=algo_text(df)" ] }, { "cell_type": "code", "execution_count": 18, "id": "4640e596", "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", "
textfeeling
0jlisastarlyrnei havent heard anytving ill twee...0.0
1just grabbed some bagellt from pdnera for ever...0.0
2poepjaqndzegiant oopy just saw you said hellom...1.0
3kirsty_gilfo yuj thats the one mmlyuom cha uh...1.0
4pmums off to bed niputuck time noow1.0
\n", "
" ], "text/plain": [ " text feeling\n", "0 jlisastarlyrnei havent heard anytving ill twee... 0.0\n", "1 just grabbed some bagellt from pdnera for ever... 0.0\n", "2 poepjaqndzegiant oopy just saw you said hellom... 1.0\n", "3 kirsty_gilfo yuj thats the one mmlyuom cha uh... 1.0\n", "4 pmums off to bed niputuck time noow 1.0" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 19, "id": "473bbd17", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'jlisastarlyrnei havent heard anytving ill tweet you as aoon as i hear imvqreallyxworrxied actually'" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['text'][0]" ] }, { "cell_type": "code", "execution_count": 20, "id": "58bf111b", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{92.99062705039978} saniye\n" ] } ], "source": [ "def detect_veri(reviewText):\n", " try:\n", " return detect(reviewText)\n", " except:\n", " return 'unknown'\n", " # TR = Text sütunundaki verilerin hangi dillerde yazıldığını tespit etme.\n", " # EN = Detecting in which languages ​​the data in the text column is written.\n", "\n", "start_time = time.time()\n", "# TR = start_time adında bir değişken tanımla, time.time() kodu ile şimdiki zamanı al.\n", "# EN = Define a variable called start_time and get the current time with the time.time() code.\n", "\n", "df['language']=df['text'].apply(detect_veri)\n", "# TR = language diye yeni bir sütün oluşturma. Oluşan yeni sütunu text bulunduğu sütunun .apply(detect_veri) kodu ile hangi dilde yazıldığını bul.\n", "# EN = Creating a new column called language. Find the language in which the new column contains text, using the .apply(detect_veri) code.\n", "\n", "end_time = time.time()\n", "# TR = end_time adında bir değişken tanımla, time.time() kodu ile şimdiki zamanı al.\n", "# EN = Define a variable called end_time and get the current time with the time.time() code.\n", "\n", "\n", "elapsed_time = end_time - start_time\n", "# TR = Dil tespitin ne kadar sürdüğünü bulmak için end_time'dan start_time'mı çıkar.\n", "# EN = Subtract start_time from end_time to find how long language detection took.\n", "print({elapsed_time}, \"saniye\")" ] }, { "cell_type": "code", "execution_count": 21, "id": "a36003f1", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAGwCAYAAAC0HlECAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABH3ElEQVR4nO3de1gWdf7/8deNyEHxBk+cVjxsmYfylJqS5pGV0lwtO2hs2lfKDlIapehq5qqtpV9Tc1tZ2y3bFsusdEvKJAwtJUOKzBOZi2GriFcKd5oCwuf3R1/m5y0Ig2KAPR/XNdflPfP+fOYzNzM3L2fmHhzGGCMAAABUyKOmBwAAAFAXEJoAAABsIDQBAADYQGgCAACwgdAEAABgA6EJAADABkITAACADZ41PYArRUlJiQ4fPqxGjRrJ4XDU9HAAAIANxhj9+OOPCg0NlYdHxeeSCE3V5PDhwwoLC6vpYQAAgItw6NAhtWjRosIaQlM1adSokaSf33Sn01nDowEAAHa4XC6FhYVZv8crQmiqJqWX5JxOJ6EJAIA6xs6tNdwIDgAAYAOhCQAAwAZCEwAAgA2EJgAAABsITQAAADYQmgAAAGwgNAEAANhAaAIAALCB0AQAAGADoQkAAMAGQhMAAIANhCYAAAAbCE0AAAA2EJoAAABsIDQBAADY4FnTA7gSdZ/yzyq3SV849jKMBAAAVJcaPdO0ZcsWDR8+XKGhoXI4HFq3bl2Zmr179+r3v/+9/P391bBhQ/Xs2VPZ2dnW8jNnzmjixIlq2rSp/Pz8NGrUKB09etStj+zsbA0bNkwNGjRQYGCgpkyZorNnz7rVpKSk6Prrr5e3t7euvvpqrVy58nJsMgAAqKNqNDSdOnVKXbp00Ysvvlju8gMHDqhv375q3769UlJStHPnTj311FPy8fGxah5//HG99957WrNmjTZv3qzDhw/r9ttvt5YXFxdr2LBhKiws1LZt2/Tqq69q5cqVmjVrllWTlZWlYcOGaeDAgcrIyNDkyZN1//3368MPP7x8Gw8AAOoUhzHG1PQgJMnhcGjt2rUaOXKkNW/06NGqX7++XnvttXLb5Ofnq3nz5lq1apXuuOMOSdK+ffvUoUMHpaamqnfv3vrggw9066236vDhwwoKCpIkxcfHKy4uTseOHZOXl5fi4uKUmJioXbt2ua07Ly9PGzZssDV+l8slf39/5efna+DcdVXefi7PAQDwyzv397fT6aywttbeCF5SUqLExERdc801ioyMVGBgoHr16uV2CS89PV1FRUWKiIiw5rVv314tW7ZUamqqJCk1NVWdOnWyApMkRUZGyuVyaffu3VbNuX2U1pT2UZ6CggK5XC63CQAAXLlqbWjKzc3VyZMn9eyzz+rmm2/Wxo0bddttt+n222/X5s2bJUk5OTny8vJSQECAW9ugoCDl5ORYNecGptLlpcsqqnG5XDp9+nS545s/f778/f2tKSws7JK3GQAA1F61NjSVlJRIkkaMGKHHH39cXbt21bRp03TrrbcqPj6+hkcnTZ8+Xfn5+dZ06NChmh4SAAC4jGptaGrWrJk8PT3VsWNHt/kdOnSwvj0XHByswsJC5eXludUcPXpUwcHBVs3536YrfV1ZjdPplK+vb7nj8/b2ltPpdJsAAMCVq9aGJi8vL/Xs2VOZmZlu87/55hu1atVKktS9e3fVr19fycnJ1vLMzExlZ2crPDxckhQeHq6vv/5aubm5Vk1SUpKcTqcVyMLDw936KK0p7QMAAKBGH2558uRJffvtt9brrKwsZWRkqEmTJmrZsqWmTJmiu+++W/369dPAgQO1YcMGvffee0pJSZEk+fv7Kzo6WrGxsWrSpImcTqceffRRhYeHq3fv3pKkIUOGqGPHjrr33nu1YMEC5eTkaObMmZo4caK8vb0lSQ899JD+8pe/aOrUqRo/frw2bdqkN998U4mJib/4ewIAAGqnGg1NO3bs0MCBA63XsbGxkqRx48Zp5cqVuu222xQfH6/58+frscceU7t27fT222+rb9++VpvFixfLw8NDo0aNUkFBgSIjI/XXv/7VWl6vXj2tX79eDz/8sMLDw9WwYUONGzdOc+bMsWratGmjxMREPf7441q6dKlatGihv//974qMjPwF3gUAAFAX1JrnNNV1PKcJAIC654p4ThMAAEBtQmgCAACwgdAEAABgA6EJAADABkITAACADYQmAAAAGwhNAAAANhCaAAAAbCA0AQAA2EBoAgAAsIHQBAAAYAOhCQAAwAZCEwAAgA2EJgAAABsITQAAADYQmgAAAGwgNAEAANhAaAIAALCB0AQAAGADoQkAAMAGQhMAAIANhCYAAAAbCE0AAAA2EJoAAABsIDQBAADYQGgCAACwgdAEAABgA6EJAADABkIT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AQBAneIwxpiaHoQkORwOrV27ViNHjpT081mm0NBQPfHEE3ryySclSfn5+QoKCtLKlSs1evRo7d27Vx07dlRaWpp69OghSdqwYYOGDh2q77//XqGhoVq+fLlmzJihnJwceXl5SZKmTZumdevWad++fZKku+++W6dOndL69eut8fTu3Vtdu3ZVfHy8rfG7XC75+/srPz9fA+euq/L2py8cW+U2AADg0pz7+9vpdFZYW2vvacrKylJOTo4iIiKsef7+/urVq5dSU1MlSampqQoICLACkyRFRETIw8ND27dvt2r69etnBSZJioyMVGZmpk6cOGHVnLue0prS9ZSnoKBALpfLbQIAAFeuWhuacnJyJElBQUFu84OCgqxlOTk5CgwMdFvu6empJk2auNWU18e567hQTeny8syfP1/+/v7WFBYWVtVNBAAAdUitDU213fTp05Wfn29Nhw4dqukhAQCAy6jWhqbg4GBJ0tGjR93mHz161FoWHBys3Nxct+Vnz57V8ePH3WrK6+PcdVyopnR5eby9veV0Ot0mAABw5aq1oalNmzYKDg5WcnKyNc/lcmn79u0KDw+XJIWHhysvL0/p6elWzaZNm1RSUqJevXpZNVu2bFFRUZFVk5SUpHbt2qlx48ZWzbnrKa0pXQ8AAECNhqaTJ08qIyNDGRkZkn6++TsjI0PZ2dlyOByaPHmy5s2bp3fffVdff/21xo4dq9DQUOsbdh06dNDNN9+sBx54QJ9//rm2bt2qmJgYjR49WqGhoZKke+65R15eXoqOjtbu3bu1evVqLV26VLGxsdY4Jk2apA0bNmjRokXat2+fZs+erR07digmJuaXfksAAEAt5VmTK9+xY4cGDhxovS4NMuPGjdPKlSs1depUnTp1ShMmTFBeXp769u2rDRs2yMfHx2qTkJCgmJgYDR48WB4eHho1apReeOEFa7m/v782btyoiRMnqnv37mrWrJlmzZrl9iynG2+8UatWrdLMmTP1xz/+UW3bttW6det03XXX/QLvAgAAqAtqzXOa6jqe0wQAQN1zRTynCQAAoDYhNAEAANhAaAIAALCB0AQAAGADoQkAAMAGQhMAAIANhCYAAAAbCE0AAAA2XFRoGjRokPLy8srMd7lcGjRo0KWOCQAAoNa5qNCUkpKiwsLCMvPPnDmjTz755JIHBQAAUNtU6W/P7dy50/r3nj17lJOTY70uLi7Whg0b9Jvf/Kb6RgcAAFBLVCk0de3aVQ6HQw6Ho9zLcL6+vlq2bFm1DQ4AAKC2qFJoysrKkjFGv/3tb/X555+refPm1jIvLy8FBgaqXr161T5IAACAmlal0NSqVStJUklJyWUZDAAAQG1VpdB0rv379+vjjz9Wbm5umRA1a9asSx4YAABAbXJRoemll17Sww8/rGbNmik4OFgOh8Na5nA4CE0AAOCKc1Ghad68eXrmmWcUFxdX3eMBAAColS7qOU0nTpzQnXfeWd1jAQAAqLUuKjTdeeed2rhxY3WPBQAAoNa6qMtzV199tZ566il99tln6tSpk+rXr++2/LHHHquWwQEAANQWDmOMqWqjNm3aXLhDh0P/+c9/LmlQdZHL5ZK/v7/y8/M1cO66KrdPXzi2+gcFAAAqdO7vb6fTWWHtRZ1pysrKuqiBAQAA1FUXdU8TAADAr81FnWkaP358hctffvnlixoMAABAbXVRoenEiRNur4uKirRr1y7l5eWV+4d8AQAA6rqLCk1r164tM6+kpEQPP/ywrrrqqkseFAAAQG1Tbfc0eXh4KDY2VosXL66uLgEAAGqNar0R/MCBAzp79mx1dgkAAFArXNTludjYWLfXxhgdOXJEiYmJGjduXLUMDAAAoDa5qND05Zdfur328PBQ8+bNtWjRokq/WQcAAFAXXVRo+vjjj6t7HAAAALXaRYWmUseOHVNmZqYkqV27dmrevHm1DAoAAKC2uagbwU+dOqXx48crJCRE/fr1U79+/RQaGqro6Gj99NNP1T1GAACAGndRoSk2NlabN2/We++9p7y8POXl5enf//63Nm/erCeeeKLaBldcXKynnnpKbdq0ka+vr6666irNnTtX5/6NYWOMZs2apZCQEPn6+ioiIkL79+936+f48eOKioqS0+lUQECAoqOjdfLkSbeanTt36qabbpKPj4/CwsK0YMGCatsOAABQ911UaHr77bf1j3/8Q7fccoucTqecTqeGDh2ql156SW+99Va1De65557T8uXL9Ze//EV79+7Vc889pwULFmjZsmVWzYIFC/TCCy8oPj5e27dvV8OGDRUZGakzZ85YNVFRUdq9e7eSkpK0fv16bdmyRRMmTLCWu1wuDRkyRK1atVJ6eroWLlyo2bNna8WKFdW2LQAAoG67qHuafvrpJwUFBZWZHxgYWK2X57Zt26YRI0Zo2LBhkqTWrVvr9ddf1+effy7p57NMS5Ys0cyZMzVixAhJ0j//+U8FBQVp3bp1Gj16tPbu3asNGzYoLS1NPXr0kCQtW7ZMQ4cO1f/+7/8qNDRUCQkJKiws1MsvvywvLy9de+21ysjI0PPPP+8Wrs5VUFCggoIC67XL5aq27QYAALXPRZ1pCg8P19NPP+12Nuf06dP605/+pPDw8Gob3I033qjk5GR98803kqSvvvpKn376qW655RZJUlZWlnJychQREWG18ff3V69evZSamipJSk1NVUBAgBWYJCkiIkIeHh7avn27VdOvXz95eXlZNZGRkcrMzCzzd/ZKzZ8/X/7+/tYUFhZWbdsNAABqn4s607RkyRLdfPPNatGihbp06SLp50Dj7e2tjRs3Vtvgpk2bJpfLpfbt26tevXoqLi7WM888o6ioKElSTk6OJJU56xUUFGQty8nJUWBgoNtyT09PNWnSxK2mTZs2ZfooXda4ceMyY5s+fbrbQz5dLhfBCQCAK9hFhaZOnTpp//79SkhI0L59+yRJY8aMUVRUlHx9fattcG+++aYSEhK0atUq65LZ5MmTFRoaWuNPHvf29pa3t3eNjgEAAPxyLio0zZ8/X0FBQXrggQfc5r/88ss6duyY4uLiqmVwU6ZM0bRp0zR69GhJP4e17777TvPnz9e4ceMUHBwsSTp69KhCQkKsdkePHlXXrl0lScHBwcrNzXXr9+zZszp+/LjVPjg4WEePHnWrKX1dWgMAAH7dLuqepr/97W9q3759mfnXXnut4uPjL3lQpX766Sd5eLgPsV69eiopKZEktWnTRsHBwUpOTraWu1wubd++3bq3Kjw8XHl5eUpPT7dqNm3apJKSEvXq1cuq2bJli4qKiqyapKQktWvXrtxLcwAA4NfnokJTTk6O25mdUs2bN9eRI0cueVClhg8frmeeeUaJiYk6ePCg1q5dq+eff1633XabJMnhcGjy5MmaN2+e3n33XX399dcaO3asQkNDNXLkSElShw4ddPPNN+uBBx7Q559/rq1btyomJkajR49WaGioJOmee+6Rl5eXoqOjtXv3bq1evVpLly4t84eJAQDAr9dFXZ4LCwvT1q1by9w8vXXrViuIVIdly5bpqaee0iOPPKLc3FyFhobqwQcf1KxZs6yaqVOn6tSpU5owYYLy8vLUt29fbdiwQT4+PlZNQkKCYmJiNHjwYHl4eGjUqFF64YUXrOX+/v7auHGjJk6cqO7du6tZs2aaNWvWBR83AAAAfn0c5tzHa9u0YMECLViwQAsXLtSgQYMkScnJyZo6daqeeOIJTZ8+vdoHWtu5XC75+/srPz9fA+euq3L79IVjq39QAACgQuf+/nY6nRXWXtSZpilTpuiHH37QI488osLCQkmSj4+P4uLifpWBCQAAXPkuKjQ5HA4999xzeuqpp7R37175+vqqbdu2fAUfAABcsS4qNJXy8/NTz549q2ssAAAAtdZFfXsOAADg14bQBAAAYAOhCQAAwAZCEwAAgA2EJgAAABsITQAAADYQmgAAAGwgNAEAANhAaAIAALCB0AQAAGADoQkAAMAGQhMAAIANhCYAAAAbCE0AAAA2EJoAAABsIDQBAADYQGgCAACwgdAEAABgA6EJAADABkITAACADYQmAAAAGwhNAAAANhCaAAAAbCA0AQAA2EBoAgAAsIHQBAAAYAOhCQAAwAZCEwAAgA2EJgAAABtqfWj673//qz/84Q9q2rSpfH191alTJ+3YscNabozRrFmzFBISIl9fX0VERGj//v1ufRw/flxRUVFyOp0KCAhQdHS0Tp486Vazc+dO3XTTTfLx8VFYWJgWLFjwi2wfAACoG2p1aDpx4oT69Omj+vXr64MPPtCePXu0aNEiNW7c2KpZsGCBXnjhBcXHx2v79u1q2LChIiMjdebMGasmKipKu3fvVlJSktavX68tW7ZowoQJ1nKXy6UhQ4aoVatWSk9P18KFCzV79mytWLHiF91eAABQezmMMaamB3Eh06ZN09atW/XJJ5+Uu9wYo9DQUD3xxBN68sknJUn5+fkKCgrSypUrNXr0aO3du1cdO3ZUWlqaevToIUnasGGDhg4dqu+//16hoaFavny5ZsyYoZycHHl5eVnrXrdunfbt22drrC6XS/7+/srPz9fAueuqvK3pC8dWuQ0AALg05/7+djqdFdbW6jNN7777rnr06KE777xTgYGB6tatm1566SVreVZWlnJychQREWHN8/f3V69evZSamipJSk1NVUBAgBWYJCkiIkIeHh7avn27VdOvXz8rMElSZGSkMjMzdeLEiXLHVlBQIJfL5TYBAIArV60OTf/5z3+0fPlytW3bVh9++KEefvhhPfbYY3r11VclSTk5OZKkoKAgt3ZBQUHWspycHAUGBrot9/T0VJMmTdxqyuvj3HWcb/78+fL397emsLCwS9xaAABQm9Xq0FRSUqLrr79ef/7zn9WtWzdNmDBBDzzwgOLj42t6aJo+fbry8/Ot6dChQzU9JAAAcBnV6tAUEhKijh07us3r0KGDsrOzJUnBwcGSpKNHj7rVHD161FoWHBys3Nxct+Vnz57V8ePH3WrK6+PcdZzP29tbTqfTbQIAAFeuWh2a+vTpo8zMTLd533zzjVq1aiVJatOmjYKDg5WcnGwtd7lc2r59u8LDwyVJ4eHhysvLU3p6ulWzadMmlZSUqFevXlbNli1bVFRUZNUkJSWpXbt2bt/UAwAAv161OjQ9/vjj+uyzz/TnP/9Z3377rVatWqUVK1Zo4sSJkiSHw6HJkydr3rx5evfdd/X1119r7NixCg0N1ciRIyX9fGbq5ptv1gMPPKDPP/9cW7duVUxMjEaPHq3Q0FBJ0j333CMvLy9FR0dr9+7dWr16tZYuXarY2Nia2nQAAFDLeNb0ACrSs2dPrV27VtOnT9ecOXPUpk0bLVmyRFFRUVbN1KlTderUKU2YMEF5eXnq27evNmzYIB8fH6smISFBMTExGjx4sDw8PDRq1Ci98MIL1nJ/f39t3LhREydOVPfu3dWsWTPNmjXL7VlOAADg161WP6epLuE5TQAA1D1XzHOaAAAAagtCEwAAgA2EJgAAABsITQAAADYQmgAAAGwgNAEAANhAaAIAALCB0AQAAGADoQkAAMAGQhMAAIANhCYAAAAbCE0AAAA2EJoAAABsIDQBAADYQGgCAACwgdAEAABgA6EJAADABkITAACADYQmAAAAGwhNAAAANhCaAAAAbCA0AQAA2EBoAgAAsIHQBAAAYAOhCQAAwAZCEwAAgA2EJgAAABsITQAAADYQmgAAAGwgNAEAANhAaAIAALCB0AQAAGBDnQpNzz77rBwOhyZPnmzNO3PmjCZOnKimTZvKz89Po0aN0tGjR93aZWdna9iwYWrQoIECAwM1ZcoUnT171q0mJSVF119/vby9vXX11Vdr5cqVv8AWAQCAuqLOhKa0tDT97W9/U+fOnd3mP/7443rvvfe0Zs0abd68WYcPH9btt99uLS8uLtawYcNUWFiobdu26dVXX9XKlSs1a9YsqyYrK0vDhg3TwIEDlZGRocmTJ+v+++/Xhx9++IttHwAAqN3qRGg6efKkoqKi9NJLL6lx48bW/Pz8fP3jH//Q888/r0GDBql79+565ZVXtG3bNn322WeSpI0bN2rPnj3617/+pa5du+qWW27R3Llz9eKLL6qwsFCSFB8frzZt2mjRokXq0KGDYmJidMcdd2jx4sU1sr0AAKD2qROhaeLEiRo2bJgiIiLc5qenp6uoqMhtfvv27dWyZUulpqZKklJTU9WpUycFBQVZNZGRkXK5XNq9e7dVc37fkZGRVh/lKSgokMvlcpsAAMCVy7OmB1CZN954Q1988YXS0tLKLMvJyZGXl5cCAgLc5gcFBSknJ8eqOTcwlS4vXVZRjcvl0unTp+Xr61tm3fPnz9ef/vSni94uAABQt9TqM02HDh3SpEmTlJCQIB8fn5oejpvp06crPz/fmg4dOlTTQwIAAJdRrQ5N6enpys3N1fXXXy9PT095enpq8+bNeuGFF+Tp6amgoCAVFhYqLy/Prd3Ro0cVHBwsSQoODi7zbbrS15XVOJ3Ocs8ySZK3t7ecTqfbBAAArly1OjQNHjxYX3/9tTIyMqypR48eioqKsv5dv359JScnW20yMzOVnZ2t8PBwSVJ4eLi+/vpr5ebmWjVJSUlyOp3q2LGjVXNuH6U1pX0AAADU6nuaGjVqpOuuu85tXsOGDdW0aVNrfnR0tGJjY9WkSRM5nU49+uijCg8PV+/evSVJQ4YMUceOHXXvvfdqwYIFysnJ0cyZMzVx4kR5e3tLkh566CH95S9/0dSpUzV+/Hht2rRJb775phITE3/ZDQYAALVWrQ5NdixevFgeHh4aNWqUCgoKFBkZqb/+9a/W8nr16mn9+vV6+OGHFR4eroYNG2rcuHGaM2eOVdOmTRslJibq8ccf19KlS9WiRQv9/e9/V2RkZE1sEgAAqIUcxhhT04O4ErhcLvn7+ys/P18D566rcvv0hWOrf1AAAKBC5/7+ruz+5Fp9TxMAAEBtQWgCAACwgdAEAABgA6EJAADABkITAACADYQmAAAAGwhNAAAANhCaAAAAbCA0AQAA2EBoAgAAsIHQBAAAYAOhCQAAwAZCEwAAgA2EJgAAABsITQAAADYQmgAAAGwgNAEAANhAaAIAALCB0AQAAGADoQkAAMAGQhMAAIANhCYAAAAbCE0AAAA2EJoAAABsIDQBAADYQGgCAACwgdAEAABgA6EJAADABkITAACADYQmAAAAGwhNAAAANhCaAAAAbCA0AQAA2FDrQ9P8+fPVs2dPNWrUSIGBgRo5cqQyMzPdas6cOaOJEyeqadOm8vPz06hRo3T06FG3muzsbA0bNkwNGjRQYGCgpkyZorNnz7rVpKSk6Prrr5e3t7euvvpqrVy58nJvHgAAqCNqfWjavHmzJk6cqM8++0xJSUkqKirSkCFDdOrUKavm8ccf13vvvac1a9Zo8+bNOnz4sG6//XZreXFxsYYNG6bCwkJt27ZNr776qlauXKlZs2ZZNVlZWRo2bJgGDhyojIwMTZ48Wffff78+/PDDX3R7AQBA7eQwxpiaHkRVHDt2TIGBgdq8ebP69eun/Px8NW/eXKtWrdIdd9whSdq3b586dOig1NRU9e7dWx988IFuvfVWHT58WEFBQZKk+Ph4xcXF6dixY/Ly8lJcXJwSExO1a9cua12jR49WXl6eNmzYUGYcBQUFKigosF67XC6FhYUpPz9fA+euq/J2pS8cW+U2AADg0rhcLvn7+ys/P19Op7PC2lp/pul8+fn5kqQmTZpIktLT01VUVKSIiAirpn379mrZsqVSU1MlSampqerUqZMVmCQpMjJSLpdLu3fvtmrO7aO0prSP882fP1/+/v7WFBYWVn0bCQAAap06FZpKSko0efJk9enTR9ddd50kKScnR15eXgoICHCrDQoKUk5OjlVzbmAqXV66rKIal8ul06dPlxnL9OnTlZ+fb02HDh2qlm0EAAC1k2dND6AqJk6cqF27dunTTz+t6aHI29tb3t7eNT0MAADwC6kzZ5piYmK0fv16ffzxx2rRooU1Pzg4WIWFhcrLy3OrP3r0qIKDg62a879NV/q6shqn0ylfX9/q3hwAAFDH1PrQZIxRTEyM1q5dq02bNqlNmzZuy7t376769esrOTnZmpeZmans7GyFh4dLksLDw/X1118rNzfXqklKSpLT6VTHjh2tmnP7KK0p7QMAAPy61frLcxMnTtSqVav073//W40aNbLuQfL395evr6/8/f0VHR2t2NhYNWnSRE6nU48++qjCw8PVu3dvSdKQIUPUsWNH3XvvvVqwYIFycnI0c+ZMTZw40brE9tBDD+kvf/mLpk6dqvHjx2vTpk168803lZiYWGPbDgAAao9af6Zp+fLlys/P14ABAxQS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ly5dNHjwYHXq1El33nmnXnrpJZ04ccJavn37dt1555167bXXdPfdd1+wn/3792vMmDH67W9/K6fTqdatW0v6+fKKHb1793a7hBEeHq79+/eruLjYVvuL7eNC2+9yuXT48GH16dPHrb5Pnz7au3ev9bqyfefhhx/WG2+8oa5du2rq1Knatm2brfXn5+fryJEjbqe6PT091aNHD+v1gQMHVFhY6FbTpEkTtWvXznqdnp6u4cOHq2XLlmrUqJH69+8vqfyfy8XsRxXt/5K0evVq9enTR8HBwfLz89PMmTPLrPtC6927d6/CwsIUFhZmLevYsaMCAgLcfgaX27nveW1T0fEbFRWllJQUHT58WJKUkJCgYcOGKSAg4IL97d27V56enurevbs1r3379hW2KXVum7179yo8PNzteOzTp49Onjyp77//vtKx9+/f37qMtXnzZg0aNEj9+vVTSkqK0tLSVFRUZB2bFe2D9913nzIyMtSuXTs99thj2rhxY7ljr+xzsDyVHX9ff/21iouLdc0117h9NmzevLnM75XKjj07+2BUVJTefvttFRQUSPr55z169Gh5eFx87Dj3Z2pXVFSUVq1aJenn+wBff/11RUVFXfQYCE3V6OTJk5KkxMREZWRkWNOePXuse0okud00V3oQn3vt124/5fH19a1w+f3336+kpCR9//33euWVVzRo0KBqvxn6/JsCHQ6HSkpKrIPFnHNfz7n3k0hSvXr1lJSUpA8++EAdO3bUsmXL1K5dO2VlZUmSrrrqKrVv314vv/xymbbnGj58uI4fP66XXnpJ27dv1/bt2yX9fPNgbVbZ9lemsn3nlltuse5tOXz4sAYPHqwnn3yy0vXbuZelMqdOnVJkZKScTqcSEhKUlpamtWvXSir/53Kh/agiFe3/qampioqK0tChQ7V+/Xp9+eWXmjFjRpl1X8x6f0kNGzas6SFcUEX7b8+ePXXVVVfpjTfe0OnTp7V27dpL+uVVmaq+TxWNfcCAAdqzZ4/279+vPXv2qG/fvhowYIBSUlK0efNm6x5VqeJ98Prrr1dWVpbmzp2r06dP66677tIdd9xRpbFcrJMnT6pevXpKT093+2zYu3evli5d6lZb2TFg570dPny4jDFKTEzUoUOH9Mknn1zyz/ti9v0xY8YoMzNTX3zxhbZt26ZDhw5V+B/uyhCaqlHHjh3l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Kjv+CgsLzaxZs0zr1q1N/fr1TUhIiLntttvMzp07K3zv7B575ysuLjYhISFGkjlw4IA1/2JvBL/YL1GcOHHCeHt7mwYNGpT5WVWVwxgbD47BFeXgwYO66qqrlJaWViOnS2u7AQMGqGvXrpf01O/q6KMuuO+++5SXl1cn/qQJAFwqLs/9ihQVFemHH37QzJkz1bt3bwITAABVwI3gvyJbt25VSEiI0tLSFB8fX9PDAQCgTuHyHAAAgA2caQIAALCB0AQAAGADoQkAAMAGQhMAAIANhCYAAAAbCE0A6owBAwZo8uTJNT0MAL9ShCYAAAAbCE0AAAA2EJoA1EmvvfaaevTooUaNGik4OFj33HOPcnNzreUpKSlyOBxKTk5Wjx491KBBA914443KzMx062fevHkKDAxUo0aNdP/992vatGnq2rWrtby8S4IjR47UfffdZ3sskvTuu++qbdu28vHx0cCBA/Xqq6/K4XAoLy/Pqvn000910003ydfXV2FhYXrsscd06tSpS36vAFQPQhOAOqmoqEhz587VV199pXXr1ungwYNuQabUjBkztGjRIu3YsUOenp4aP368tSwhIUHPPPOMnnvuOaWnp6tly5Zavnx5tY8lKytLd9xxh0aOHKmvvvpKDz74oGbMmOHWx4EDB3TzzTdr1KhR2rlzp1avXq1PP/1UMTExVR4PgMvEAEAd0b9/fzNp0qRyl6WlpRlJ5scffzTGGPPxxx8bSeajjz6yahITE40kc/r0aWOMMb169TITJ05066dPnz6mS5cuFa5zxIgRZty4cRcc5/ljiYuLM9ddd51bzYwZM4wkc+LECWOMMdHR0WbChAluNZ988onx8PCwxgugZnGmCUCdlJ6eruHDh6tly5Zq1KiR+vfvL0nKzs52q+vcubP175CQEEmyLp1lZmbqhhtucKs//3V1jCUzM1M9e/ascD1fffWVVq5cKT8/P2uKjIxUSUmJsrKyqjwmANXPs6YHAABVderUKUVGRioyMlIJCQlq3ry5srOzFRkZqcLCQrfa+vXrW/92OBySpJKSEtvr8vDwkDnv75oXFRVd1FgqcvLkST344IN67LHHyixr2bKl7X4AXD6EJgB1zr59+/TDDz/o2WefVVhYmCRpx44dVe6nXbt2SktL09ixY615aWlpbjXNmzfXkSNHrNfFxcXatWuXBg4caHss7dq10/vvv+827/z1XH/99dqzZ4+uvvrqKm8HgF8Gl+cA1DktW7aUl5eXli1bpv/85z969913NXfu3Cr38+ijj+of//iHXn31Ve3fv1/z5s3Tzp07rTNSkjRo0CAlJiYqMTFR+/bt08MPP+z2jTc7Y3nwwQe1b98+xcXF6ZtvvtGbb76plStXSvr/Z7/i4uK0bds2xcTEKCMjQ/v379e///1vbgQHahFCE4A6p3nz5lq5cqXWrFmjjh076tlnn9X//u//VrmfqKgoTZ8+XU8++aSuv/56ZWVl6b777pOPj49VM378eI0bN05jx45V//799dvf/tY6y2R3LG3atNFbb72ld955R507d9by5cutb895e3tL+vneq82bN+ubb77RTTfdpG7dumnWrFkKDQ29mLcIwGXgMOdfrAeAX7Hf/e53Cg4O1muvvXZZ1/PMM88oPj5ehw4duqzrAVB9uKcJwK/WTz/9pPj4eEVGRqpevXp6/fXX9dFHHykpKana1/XXv/5VPXv2VNOmTbV161YtXLiQS29AHUNoAvCr5XA49P777+uZZ57RmTNn1K5dO7399tuKiIio9nWV3jN1/PhxtWzZUk888YSmT59e7esBcPlweQ4AAMAGbgQHAACwgdAEAABgA6EJAADABkITAACADYQmAAAAGwhNAAAANhCaAAAAbCA0AQAA2PD/AH4j/XKfp/g6AAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sns.countplot(x=df['language']);" ] }, { "cell_type": "code", "execution_count": 22, "id": "24758341", "metadata": {}, "outputs": [ { "data": { "image/png": "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k9rnSpK7DzqkGguK1vO/+S/x/fZXKU4ogIQDj4bXByUytls5Pr87F0sTOC5jGMnxB++ZWlWlsmihFb//nEOqa39KSkq499570el0PP/888ydO5ezzz6bIUOGoGkaubm5bN68maqqKp588knmz5/Ptdde22bdlvckepcdommDU5mzue1/IILQnuS5zUxU7uT3lP8QVbak0XNTexqY2nPXydfDJTkr2ZxwHF+4QvOe+Sv9eHZ40EXoMMYbKf2qlGBNEC2oET06hu3FThyBAPeNGsqgSgfrvF6sksR4m41InY6RVivb/D4mEsG7VVVUBoN8Z1Qx/+9G0k68mn9LMgs3/0KUJY6y2gKyknof8L3UlMUAJ5DUYwwG/WpKti5HVQ7cBuP1Ovlr2WcA9Oo+mv6p4zGW6dnvQBfA7JLplRtDL2KoSwyyLaaanOo8nC5Xk9tLktTiW1UlJSUoisIll1zC448/TllZGQsWLODmm2/GYDCwefNmMjMzMRqN3H333dTU1GCxWHj00UdbdNxDIdpkDpHTF2T4E7PwHsIMrILQ2UTqg8zJfJ/E4jlNPi89Wsfjxxt58I99b7vEjIsh45oMit4qwr3Njc6io9s/urHl7i0EqvYdJDnRZuOp1DTO37Gdh5KTGWAyMzFvGw8lJXN2TEzDdnOCGo9VVOENKpw2/ArG9j31sN6TNdKHLWoDJVsWEfQ3PXVOUyIjExjZfxqJvnS02gMP8txFlTXK033kmsrILd3eqDt0t27dGnqDNcfEiRMZNGgQGzduZMmSJVitVsrLy0lISODuu+/m888/Z+XKlezcuZN58+Zx7bXX4na7GTVqFPfddx+nn346q1atYsiQIc2u4UBEyByGv3+8gl/XH3h6DUHorEyyyqxuX5BZ9OM+z0mP1vHdBRbO7BO6simLTuP27N6srdvWsI2v1EfeU3l0u78bphQTZd+V4VjpoMfjofaSVCWSyV/peWfOUryayrSoKG5MSOQfpSX0MproZzbzVHkZQU3jhoQETo4MdSoIpmZTPPFGtpVZ2M+kBQdktASIScilPG8+XudhLJUsSQzsczy940agK5U44NTKewiYVQrTXGwN7qSwfCdnnnlmi07wEydOZMiQIbz44ossXLiQN998kw8//JCEhASWLl1K165d6dWrF9dffz1///vfSU5O5v333+fss1u2nMChEm0y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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df['language'].value_counts().plot.pie(autopct='%1.1f%%');" ] }, { "cell_type": "code", "execution_count": 23, "id": "d93cc636", "metadata": {}, "outputs": [], "source": [ "df = df[df['language'] == 'en']\n", "# TR = language sütunundaki verilerin 'en' kelimesine eşit olduğu satırları seçer.\n", "# EN = Selects rows where the values in the 'language' column are equal to 'en'.\n", "\n", "df.drop(index=df[df['language'] != 'en'].index, inplace=True)\n", "# TR = language sütunundaki 'en' kelimesine eşit olmayan satırları siler.\n", "# EN = Deletes rows in the 'language' column that are not equal to 'en'.\n" ] }, { "cell_type": "raw", "id": "35aba6be", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "ac4c456e", "metadata": {}, "source": [ "## Duygu Analizi - Sentiment Analysis" ] }, { "cell_type": "markdown", "id": "82e78eaf", "metadata": {}, "source": [ "### Yorumların Olumlumu ya da Olumsuzmu Olduğunu Tespit Etme - Determining Whether Comments Have Death or Immortality" ] }, { "cell_type": "code", "execution_count": 24, "id": "b848fb42", "metadata": {}, "outputs": [], "source": [ "df['sentiment']=df['feeling']\n", "df['sentiment']=df['sentiment'].replace([1],'olumlu')\n", "df['sentiment']=df['sentiment'].replace([0],'olumsuz')\n", "# TR = sentiment diye yeni bir sütun oluşturup () sütünundaki verilere eşitledik. [1],'olumlu', [0],'olumsuz'\n", "# EN = We created a new column called sentiment and set it equal to the data in the () column. [1],'positive', [0],'negative'" ] }, { "cell_type": "code", "execution_count": 25, "id": "9a890752", "metadata": {}, "outputs": [], "source": [ "#df=df[['a','b','sentiment']]# a yerine puan ya da yıldız gibi değerini belirten sayı, b yerine yazımızın bulunduğu sütün adı\n", "\n", "df=df[['feeling','text','sentiment']]" ] }, { "cell_type": "code", "execution_count": 26, "id": "980e88ee", "metadata": {}, "outputs": [], "source": [ "df=df[(df['sentiment']=='olumlu')|(df['sentiment']=='olumsuz')]\n", "# TR = sentimentimizi olumlu ya da olumsuzolacak şekilde tanımladık.\n", "# EN = We defined our sentiment as positive, negative" ] }, { "cell_type": "code", "execution_count": 27, "id": "a4bb1b05", "metadata": {}, "outputs": [], "source": [ "df.reset_index(drop=True,inplace=True)\n", "# TR = Yukarıda yaptığımız işlem neticesinde olumlu,notr,olumsuz kelimeler kendi içlerinde üst üste oldular. Bu yüzden indexlerini sıfırlayıp tekrar verdik.\n", "# EN = As a result of the process we did above, positive, neutral and negative words were placed on top of each other. That's why we reset their indexes and gave them again." ] }, { "cell_type": "code", "execution_count": 28, "id": "85e39add", "metadata": {}, "outputs": [], "source": [ "x=df['text']\n", "y=df['sentiment']" ] }, { "cell_type": "code", "execution_count": 29, "id": "562e7b7a", "metadata": {}, "outputs": [], "source": [ "yelpbw = df[(df.feeling == 0) | (df.feeling == 1)]" ] }, { "cell_type": "code", "execution_count": 30, "id": "06d718a2", "metadata": {}, "outputs": [], "source": [ "yelpbw.reset_index(drop=True,inplace=True)" ] }, { "cell_type": "code", "execution_count": 31, "id": "50069d35", "metadata": {}, "outputs": [], "source": [ "vect=CountVectorizer(stop_words='english',ngram_range=(1,2))" ] }, { "cell_type": "code", "execution_count": 32, "id": "e27fd6f9", "metadata": {}, "outputs": [], "source": [ "x=yelpbw[\"text\"]\n", "y=yelpbw[\"feeling\"]" ] }, { "cell_type": "code", "execution_count": 33, "id": "ef9abe2d", "metadata": {}, "outputs": [], "source": [ "vect=CountVectorizer()\n", "x=vect.fit_transform(x)" ] }, { "cell_type": "code", "execution_count": 34, "id": "7c6aa2d7", "metadata": {}, "outputs": [], "source": [ "def lemmafn(Review):\n", " words=TextBlob.words\n", " return [pr.stem(word) for word in words]" ] }, { "cell_type": "raw", "id": "b67bb4b2", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "3b1f6160", "metadata": {}, "source": [ "## En çok Sayıdaki Kelimeleri Kap İçine Alma - Containing the Most Numbered Words " ] }, { "cell_type": "code", "execution_count": 35, "id": "792dd213", "metadata": {}, "outputs": [], "source": [ "#wc=wordcloud\n", "def wc(data,bgcolor):\n", " plt.figure(figsize=(10,10))\n", " # TR = Kabımızın boyutunu belirttik.\n", " # EN = We specified the size of our container.\n", " \n", " mask=np.array(Image.open('cloud.png'))\n", " # TR = Image.open ile resmimizi açtık. np.array resmi diziye çevirdik ve mask değişkenine atadık.\n", " # EN = We opened our image with Image.open. We converted the np.array image to an array and assigned it to the mask variable.\n", " \n", " wc=WordCloud(background_color=bgcolor,stopwords=STOPWORDS,mask=mask)\n", " # TR = Bir WordCloud tanımladık. Arka plan rengini bgcolor eşitledik. stopwords=STOPWORDS ile gereksiz kelimeleri atıp anahtar kelimeleri sakladık.\n", " # EN = We defined a WordCloud. We set the background color equal to bgcolor. We removed unnecessary words and kept keywords with stopwords=STOPWORDS\n", "\n", " # TR = mask=mask yukarıda tanımladığımız mask değişkenini kullan.\n", " # EN = mask=mask use the mask variable we defined above.\n", " wc.generate(''.join(data))\n", " # TR = .join(data) ile bütün sütündaki text alıp birleştirecek. \n", " # EN = With .join(data) it will take the text in all columns and combine them.\n", "\n", " # TR = İçinde geçen tüm kelimeleri sayacak ve hafızada tutup generate ile tanımladığımız WordCloud oluşturduk ona eşitleyecek. \n", " # EN = It will count all the words in it, keep it in memory and synchronize it with the WordCloud we created with generate.\n", " \n", " plt.imshow(wc)\n", " plt.axis('off')\n", " # TR = Bunla kod ile x ve y gözükmüyor.\n", " # EN = With this code, x and y do not appear.\n", " " ] }, { "cell_type": "code", "execution_count": 36, "id": "8693a811", "metadata": {}, "outputs": [], "source": [ "olumlu=df[df['feeling']==1]['text']\n", "olumsuz=df[df['feeling']==0]['text']" ] }, { "cell_type": "code", "execution_count": 37, "id": "814a0338", "metadata": {}, "outputs": [ { "ename": "FileNotFoundError", "evalue": "[Errno 2] No such file or directory: 'C:\\\\Users\\\\ErenK\\\\OneDrive\\\\Belgeler\\\\Yapay Zeka\\\\Proje\\\\Natural Language Processing (NLP) 1\\\\tweet\\\\cloud.png'", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[37], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m wc(olumlu,\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mwhite\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "Cell \u001b[1;32mIn[35], line 7\u001b[0m, in \u001b[0;36mwc\u001b[1;34m(data, bgcolor)\u001b[0m\n\u001b[0;32m 3\u001b[0m plt\u001b[38;5;241m.\u001b[39mfigure(figsize\u001b[38;5;241m=\u001b[39m(\u001b[38;5;241m10\u001b[39m,\u001b[38;5;241m10\u001b[39m))\n\u001b[0;32m 4\u001b[0m \u001b[38;5;66;03m# TR = Kabımızın boyutunu belirttik.\u001b[39;00m\n\u001b[0;32m 5\u001b[0m \u001b[38;5;66;03m# EN = We specified the size of our container.\u001b[39;00m\n\u001b[1;32m----> 7\u001b[0m mask\u001b[38;5;241m=\u001b[39mnp\u001b[38;5;241m.\u001b[39marray(Image\u001b[38;5;241m.\u001b[39mopen(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcloud.png\u001b[39m\u001b[38;5;124m'\u001b[39m))\n\u001b[0;32m 8\u001b[0m \u001b[38;5;66;03m# TR = Image.open ile resmimizi açtık. np.array resmi diziye çevirdik ve mask değişkenine atadık.\u001b[39;00m\n\u001b[0;32m 9\u001b[0m \u001b[38;5;66;03m# EN = We opened our image with Image.open. We converted the np.array image to an array and assigned it to the mask variable.\u001b[39;00m\n\u001b[0;32m 11\u001b[0m wc\u001b[38;5;241m=\u001b[39mWordCloud(background_color\u001b[38;5;241m=\u001b[39mbgcolor,stopwords\u001b[38;5;241m=\u001b[39mSTOPWORDS,mask\u001b[38;5;241m=\u001b[39mmask)\n", "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\PIL\\Image.py:3277\u001b[0m, in \u001b[0;36mopen\u001b[1;34m(fp, mode, formats)\u001b[0m\n\u001b[0;32m 3274\u001b[0m filename \u001b[38;5;241m=\u001b[39m os\u001b[38;5;241m.\u001b[39mpath\u001b[38;5;241m.\u001b[39mrealpath(os\u001b[38;5;241m.\u001b[39mfspath(fp))\n\u001b[0;32m 3276\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m filename:\n\u001b[1;32m-> 3277\u001b[0m fp \u001b[38;5;241m=\u001b[39m builtins\u001b[38;5;241m.\u001b[39mopen(filename, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrb\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m 3278\u001b[0m exclusive_fp \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mTrue\u001b[39;00m\n\u001b[0;32m 3280\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n", "\u001b[1;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: 'C:\\\\Users\\\\ErenK\\\\OneDrive\\\\Belgeler\\\\Yapay Zeka\\\\Proje\\\\Natural Language Processing (NLP) 1\\\\tweet\\\\cloud.png'" ] }, { "data": { "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "wc(olumlu,'white')" ] }, { "cell_type": "code", "execution_count": null, "id": "8460aa30", "metadata": {}, "outputs": [], "source": [ "wc(olumsuz,'white')" ] }, { "cell_type": "code", "execution_count": null, "id": "1078157e", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "5bde2bcd", "metadata": {}, "source": [ "## Öznitelik Mühendisliği - Feature Engineering" ] }, { "cell_type": "markdown", "id": "412a27ea", "metadata": {}, "source": [ "### Model - Modelling" ] }, { "cell_type": "code", "execution_count": 38, "id": "621cd80d", "metadata": {}, "outputs": [], "source": [ "x=yelpbw[\"text\"]\n", "y=yelpbw[\"feeling\"]" ] }, { "cell_type": "code", "execution_count": 39, "id": "b0177e4f", "metadata": {}, "outputs": [], "source": [ "vectorizer = TfidfVectorizer(max_features=5000)\n", "x = vectorizer.fit_transform(x).toarray()" ] }, { "cell_type": "code", "execution_count": 40, "id": "cc95c2b0", "metadata": {}, "outputs": [ { "ename": "MemoryError", "evalue": "Unable to allocate 495. MiB for an array with shape (12983, 5000) and data type float64", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mMemoryError\u001b[0m Traceback (most recent call last)", "Cell \u001b[1;32mIn[40], line 1\u001b[0m\n\u001b[1;32m----> 1\u001b[0m x_train,x_test,y_train,y_test\u001b[38;5;241m=\u001b[39mtrain_test_split(x,y,test_size\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m.20\u001b[39m,random_state\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m42\u001b[39m)\n", "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\sklearn\\utils\\_param_validation.py:213\u001b[0m, in \u001b[0;36mvalidate_params..decorator..wrapper\u001b[1;34m(*args, **kwargs)\u001b[0m\n\u001b[0;32m 207\u001b[0m \u001b[38;5;28;01mtry\u001b[39;00m:\n\u001b[0;32m 208\u001b[0m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[0;32m 209\u001b[0m skip_parameter_validation\u001b[38;5;241m=\u001b[39m(\n\u001b[0;32m 210\u001b[0m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[0;32m 211\u001b[0m )\n\u001b[0;32m 212\u001b[0m ):\n\u001b[1;32m--> 213\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m func(\u001b[38;5;241m*\u001b[39margs, \u001b[38;5;241m*\u001b[39m\u001b[38;5;241m*\u001b[39mkwargs)\n\u001b[0;32m 214\u001b[0m \u001b[38;5;28;01mexcept\u001b[39;00m InvalidParameterError \u001b[38;5;28;01mas\u001b[39;00m e:\n\u001b[0;32m 215\u001b[0m \u001b[38;5;66;03m# When the function is just a wrapper around an estimator, we allow\u001b[39;00m\n\u001b[0;32m 216\u001b[0m \u001b[38;5;66;03m# the function to delegate validation to the estimator, but we replace\u001b[39;00m\n\u001b[0;32m 217\u001b[0m \u001b[38;5;66;03m# the name of the estimator by the name of the function in the error\u001b[39;00m\n\u001b[0;32m 218\u001b[0m \u001b[38;5;66;03m# message to avoid confusion.\u001b[39;00m\n\u001b[0;32m 219\u001b[0m msg \u001b[38;5;241m=\u001b[39m re\u001b[38;5;241m.\u001b[39msub(\n\u001b[0;32m 220\u001b[0m \u001b[38;5;124mr\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparameter of \u001b[39m\u001b[38;5;124m\\\u001b[39m\u001b[38;5;124mw+ must be\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 221\u001b[0m \u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mparameter of \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mfunc\u001b[38;5;241m.\u001b[39m\u001b[38;5;18m__qualname__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m must be\u001b[39m\u001b[38;5;124m\"\u001b[39m,\n\u001b[0;32m 222\u001b[0m \u001b[38;5;28mstr\u001b[39m(e),\n\u001b[0;32m 223\u001b[0m )\n", "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\sklearn\\model_selection\\_split.py:2810\u001b[0m, in \u001b[0;36mtrain_test_split\u001b[1;34m(test_size, train_size, random_state, shuffle, stratify, *arrays)\u001b[0m\n\u001b[0;32m 2806\u001b[0m train, test \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mnext\u001b[39m(cv\u001b[38;5;241m.\u001b[39msplit(X\u001b[38;5;241m=\u001b[39marrays[\u001b[38;5;241m0\u001b[39m], y\u001b[38;5;241m=\u001b[39mstratify))\n\u001b[0;32m 2808\u001b[0m train, test \u001b[38;5;241m=\u001b[39m ensure_common_namespace_device(arrays[\u001b[38;5;241m0\u001b[39m], train, test)\n\u001b[1;32m-> 2810\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mlist\u001b[39m(\n\u001b[0;32m 2811\u001b[0m chain\u001b[38;5;241m.\u001b[39mfrom_iterable(\n\u001b[0;32m 2812\u001b[0m (_safe_indexing(a, train), _safe_indexing(a, test)) \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m arrays\n\u001b[0;32m 2813\u001b[0m )\n\u001b[0;32m 2814\u001b[0m )\n", "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\sklearn\\model_selection\\_split.py:2812\u001b[0m, in \u001b[0;36m\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 2806\u001b[0m train, test \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mnext\u001b[39m(cv\u001b[38;5;241m.\u001b[39msplit(X\u001b[38;5;241m=\u001b[39marrays[\u001b[38;5;241m0\u001b[39m], y\u001b[38;5;241m=\u001b[39mstratify))\n\u001b[0;32m 2808\u001b[0m train, test \u001b[38;5;241m=\u001b[39m ensure_common_namespace_device(arrays[\u001b[38;5;241m0\u001b[39m], train, test)\n\u001b[0;32m 2810\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mlist\u001b[39m(\n\u001b[0;32m 2811\u001b[0m chain\u001b[38;5;241m.\u001b[39mfrom_iterable(\n\u001b[1;32m-> 2812\u001b[0m (_safe_indexing(a, train), _safe_indexing(a, test)) \u001b[38;5;28;01mfor\u001b[39;00m a \u001b[38;5;129;01min\u001b[39;00m arrays\n\u001b[0;32m 2813\u001b[0m )\n\u001b[0;32m 2814\u001b[0m )\n", "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\sklearn\\utils\\_indexing.py:267\u001b[0m, in \u001b[0;36m_safe_indexing\u001b[1;34m(X, indices, axis)\u001b[0m\n\u001b[0;32m 265\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _polars_indexing(X, indices, indices_dtype, axis\u001b[38;5;241m=\u001b[39maxis)\n\u001b[0;32m 266\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(X, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mshape\u001b[39m\u001b[38;5;124m\"\u001b[39m):\n\u001b[1;32m--> 267\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _array_indexing(X, indices, indices_dtype, axis\u001b[38;5;241m=\u001b[39maxis)\n\u001b[0;32m 268\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m 269\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _list_indexing(X, indices, indices_dtype)\n", "File \u001b[1;32m~\\anaconda3\\Lib\\site-packages\\sklearn\\utils\\_indexing.py:33\u001b[0m, in \u001b[0;36m_array_indexing\u001b[1;34m(array, key, key_dtype, axis)\u001b[0m\n\u001b[0;32m 31\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(key, \u001b[38;5;28mtuple\u001b[39m):\n\u001b[0;32m 32\u001b[0m key \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlist\u001b[39m(key)\n\u001b[1;32m---> 33\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m array[key, \u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m\u001b[38;5;241m.\u001b[39m] \u001b[38;5;28;01mif\u001b[39;00m axis \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m array[:, key]\n", "\u001b[1;31mMemoryError\u001b[0m: Unable to allocate 495. MiB for an array with shape (12983, 5000) and data type float64" ] } ], "source": [ "x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=.20,random_state=42)\n", "# TR = modelimizi eğittik. \n", "# EN = We trained our model." ] }, { "cell_type": "code", "execution_count": null, "id": "58a351e1", "metadata": {}, "outputs": [], "source": [ "model=Sequential()\n", "model.add(Dense(1024,activation='relu',input_dim=x_train.shape[1]))\n", "# TR = Bu katman, tüm giriş nöronlarına bağlantı kurar ve her nöronun ağırlıklarını öğrenir. 256 nöron var.\n", "# Aktivasyon fonksiyonunu ReLU (Rectified Linear Unit) olarak ayarlar. ReLU fonksiyonu, negatif değerleri sıfıra dönüştürür ve pozitif değerleri olduğu gibi bırakır.\n", "# EN = This layer connects all input neurons and learns the weights of each neuron. There are 256 neurons.\n", "# Sets the activation function to ReLU (Rectified Linear Unit). The ReLU function converts negative values ​​to zero and leaves positive values ​​as is.\n", "\n", "model.add(BatchNormalization())\n", "# TR = Bu katman, modelin eğitim sürecini daha stabil hale getirmek için kullanılır.\n", "# EN = This layer is used to make the training process of the model more stable.\n", "\n", "model.add(Dropout(0.3))\n", "# TR = Derin öğrenme modelinde aşırı uyumu (overfitting) azaltmak için kullanılır. Genelde 0.2 ile 0.5 arasında olur.\n", "# EN = It is used to reduce overfitting in the deep learning model. It is generally between 0.2 and 0.5.\n", "\n", "model.add(Dense(128,activation='relu',input_dim=x_train.shape[1]))\n", "model.add(BatchNormalization())\n", "model.add(Dropout(0.3))\n", "\n", "model.add(Dense(64,activation='relu',input_dim=x_train.shape[1]))\n", "model.add(BatchNormalization())\n", "model.add(Dropout(0.3))\n", "\n", "model.add(Dense(32,activation='relu'))\n", "model.add(BatchNormalization())\n", "model.add(Dropout(0.3))\n", "\n", "model.add(Dense(16,activation='relu'))\n", "model.add(BatchNormalization())\n", "model.add(Dropout(0.3))\n", "\n", "model.add(Dense(1, activation='sigmoid'))\n", "# TR = Sigmoid fonksiyonu, çıktı değerini 0 ile 1 arasında sınırlayarak iki sınıflı (binary) sınıflandırma problemleri için kullanılır.\n", "# EN = The sigmoid function is used for binary classification problems, limiting the output value between 0 and 1.\n", "\n", "early_stopping = EarlyStopping(monitor='val_loss', patience=5, restore_best_weights=True)\n", "# TR = EarlyStopping ekleyin: Eğitim sırasında model performansı iyileşmediğinde erken durması için kullanıyoruz.\n", "# EN = Add EarlyStopping: We use it to stop early when model performance does not improve during training.\n", "\n", "# TR = val_loss 5 epoch boyunca iyileşmezse eğitimi durduruyor ve en iyi ağırlıkları geri yüklüyor.\n", "# EN = If val_loss does not improve for 5 epochs, it stops training and restores the best weights.\n", "\n", "model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])\n", "\n", "# TR = İkili sınıflandırma (çıktı katmanı sigmoid aktivasyon kullanır).\n", "# TR = Tahmin edilen olasılık ile gerçek ikili etiketler arasındaki farkı ölçer.\n", "# TR = optimizer='adam': Adam (Adaptive Moment Estimation) optimizasyon algoritması, modelin ağırlıklarını güncellerken kullanılan bir yöntemdir.\n", "# TR = metrics=['accuracy']: Modelin performansını değerlendirmek için kullanılan bir ölçümdür. Doğru sınıflandırılan örneklerin toplam örneklere oranını hesaplar.\n", "\n", "# EN = Binary classification (output layer uses a sigmoid activation).\n", "# EN = Measures the difference between the predicted probability and the actual binary labels.\n", "# EN = optimizer='adam': Adam (Adaptive Moment Estimation) optimization algorithm is a method used when updating the weights of the model.\n", "# EN = metrics=['accuracy']: A metric used to evaluate the performance of the model. It calculates the ratio of correctly classified examples to total examples.\n", "\n", "history=model.fit(x_train, y_train, validation_split=0.2, batch_size=64, epochs=100, callbacks=[early_stopping])\n", "# TR = Modeli 100 epoch boyunca eğitiyoruz, fakat EarlyStopping ile durdurulabilir. Batch boyutu 128 olarak belirlenmiş.\n", "# EN = We train the model for 100 epochs, but it can be stopped with EarlyStopping. Batch size is set to 128." ] }, { "cell_type": "code", "execution_count": null, "id": "fa191abf", "metadata": {}, "outputs": [], "source": [ "model.summary()" ] }, { "cell_type": "code", "execution_count": null, "id": "d87d3ede", "metadata": {}, "outputs": [], "source": [ "test_loss, test_acc = model.evaluate(x_test, y_test)\n", "# TR = test_loss değişkeni, test verileri üzerinde hesaplanan kayıp değerini içerir. test_acc değişkeni, test verileri üzerinde hesaplanan doğruluk değerini içerir.\n", "# EN = The test_loss variable contains the loss value calculated on the test data. The test_acc variable contains the accuracy value calculated on the test data.\n", "\n", "print(f\"Test doğruluğu: {test_acc:.4f}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "01ecca14", "metadata": {}, "outputs": [], "source": [ "pred=(model.predict(x_test) > 0.5).astype(int)\n", "# TR = modeli x_test ile predict özelliği ile tahmin ettik. predict=tahmin demek. Dahmin edip pred eşitledik. \n", "# EN = We predicted the model with x_test and the predict feature. predict=means prediction. We guessed and equalized the pred." ] }, { "cell_type": "code", "execution_count": null, "id": "39883360", "metadata": {}, "outputs": [], "source": [ "accuracy_score(y_test, pred)\n", "# TR = accuracy_score fonksiyonu ile y_test, pred kullanarak sonucumuzu bulduk.\n", "# EN = We found our result using the accuracy_score function and y_test, pred." ] }, { "cell_type": "code", "execution_count": null, "id": "4bafc93e", "metadata": {}, "outputs": [], "source": [ "confusion_matrix(y_test, pred)\n", "# TR = confusion_matrix fonksiyonu ile y_test, pred kullanarak ne kadarını yanlış tahmin ettiğimizi buluyoruz\n", "# EN = Using the confusion_matrix function and y_test, pred, we find out how much we guessed wrong.\n", "\n", "# TR = 4 sayı değeri veriyor bize. Sol üst ve sağ alt doğru tahmin, sağ üst ve sol alt yanlış tahmin. \n", "# EN = It gives us 4 number values. Upper left and lower right are correct guesses, upper right and lower left are incorrect guesses." ] }, { "cell_type": "code", "execution_count": null, "id": "1661b38b", "metadata": {}, "outputs": [], "source": [ "sns.heatmap(confusion_matrix(y_test, pred),annot=True);\n", "# TR = Yukarıdakinin görsel versiyonu.\n", "# EN = Visual version of the above." ] }, { "cell_type": "code", "execution_count": null, "id": "429b36e9", "metadata": {}, "outputs": [], "source": [ "print(classification_report(y_test, pred))\n", "# TR = print içinde yazdık yoksa sayıların sıralanması bozuluyor.\n", "# EN = We wrote it in print, otherwise the order of the numbers will be disrupted.\n", "\n", "# TR = classification_report ile y_test, pred kullanarak precision, recall, f1-score ve support ulaştık.\n", "# EN = We achieved precision, recall, f1-score and support using classification_report and y_test, pred.\n", "\n", "# TR = Precision (Kesinlik): Doğru olarak pozitif tahmin edilen örneklerin, toplam pozitif tahmin edilen örnekler içindeki oranını gösterir. Yani, modelin pozitif sınıfı ne kadar doğru tahmin ettiğini ölçer.\n", "# EN = Precision (Precision): It shows the ratio of correctly predicted positive samples among the total positive predicted samples. That is, it measures how accurately the model predicts the positive class.\n", "\n", "# TR = Recall (Duyarlılık): Gerçek pozitif örneklerin, toplam pozitif örnekler içindeki oranını gösterir. Modelin pozitif sınıfı ne kadar iyi bulduğunu ölçer.\n", "# EN = Recall (Sensitivity): Shows the ratio of true positive samples in total positive samples. It measures how well the model finds the positive class.\n", "\n", "# TR = F1-score: Precision ve recall'un harmonik ortalamasıdır. Hem precision hem de recall'u dikkate alarak modelin genel performansını özetler.\n", "# EN = F1-score: It is the harmonic mean of precision and recall. It summarizes the overall performance of the model, taking into account both precision and recall.\n", "\n", "# TR = Support: Her sınıftan kaç örneğin bulunduğunu gösterir. Yani, gerçek etiketlerde her bir sınıfa ait kaç örnek olduğunu ifade eder.\n", "# EN = Support: Shows how many examples of each class are available. That is, it expresses how many examples of each class there are in the real labels." ] }, { "cell_type": "code", "execution_count": null, "id": "787a3e99", "metadata": {}, "outputs": [], "source": [ "plt.plot(history.history['accuracy'],label='Accuracy')\n", "plt.plot(history.history['val_accuracy'],label='Val_Accuracy')\n", "plt.legend();" ] }, { "cell_type": "code", "execution_count": null, "id": "61e71f7f-2d99-45bb-85cd-e99d1d676ed9", "metadata": {}, "outputs": [], "source": [ "pickle.dump(model,open('Tweet.pkl','wb'))" ] } ], "metadata": { "kaggle": { "accelerator": "nvidiaTeslaT4", "dataSources": [ { "databundleVersionId": 9511539, "sourceId": 84717, "sourceType": "competition" } ], "dockerImageVersionId": 30762, "isGpuEnabled": true, "isInternetEnabled": true, "language": "python", "sourceType": "notebook" }, "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.4" } }, "nbformat": 4, "nbformat_minor": 5 }