diff --git a/Contributor_demos/Sarcasm Detection/Ivy_Sarcasm_Detection_Demo b/Contributor_demos/Sarcasm Detection/Ivy_Sarcasm_Detection_Demo new file mode 100644 index 00000000..4a19d011 Binary files /dev/null and b/Contributor_demos/Sarcasm Detection/Ivy_Sarcasm_Detection_Demo differ diff --git a/Contributor_demos/Sarcasm Detection/Ivy_Sarcasm_Detection_Demo_weights.hdf5 b/Contributor_demos/Sarcasm Detection/Ivy_Sarcasm_Detection_Demo_weights.hdf5 new file mode 100644 index 00000000..aa59ef75 Binary files /dev/null and b/Contributor_demos/Sarcasm Detection/Ivy_Sarcasm_Detection_Demo_weights.hdf5 differ diff --git a/Contributor_demos/Sarcasm Detection/contributors.txt b/Contributor_demos/Sarcasm Detection/contributors.txt new file mode 100644 index 00000000..d5c3c6c4 --- /dev/null +++ b/Contributor_demos/Sarcasm Detection/contributors.txt @@ -0,0 +1,2 @@ +Omkar "Omickeyee" https://github.com/omickeyee +Kacper "Bubble" https://github.com/Kacper-W-Kozdon diff --git a/Contributor_demos/Sarcasm Detection/kaggle-sarcasm-detection-using-the-ivy-library.ipynb b/Contributor_demos/Sarcasm Detection/kaggle-sarcasm-detection-using-the-ivy-library.ipynb new file mode 100644 index 00000000..fa757271 --- /dev/null +++ b/Contributor_demos/Sarcasm Detection/kaggle-sarcasm-detection-using-the-ivy-library.ipynb @@ -0,0 +1 @@ +{"metadata":{"colab":{"provenance":[]},"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"language_info":{"name":"python","version":"3.10.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceId":36545,"sourceType":"datasetVersion","datasetId":1309}],"dockerImageVersionId":30674,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# DEPENDANCIES AND SETUP","metadata":{"id":"s2B-C0ETR8j-"}},{"cell_type":"markdown","source":"Installing kaggle and uploading the API key necessary to use it.","metadata":{"id":"lVY3Z4myS1O4"}},{"cell_type":"code","source":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n for filename in filenames:\n print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\"\n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"id":"GRXT-eQOLn0q","execution":{"iopub.status.busy":"2024-04-18T11:35:01.674141Z","iopub.execute_input":"2024-04-18T11:35:01.674377Z","iopub.status.idle":"2024-04-18T11:35:01.685910Z","shell.execute_reply.started":"2024-04-18T11:35:01.674357Z","shell.execute_reply":"2024-04-18T11:35:01.684921Z"},"trusted":true},"execution_count":55,"outputs":[{"name":"stdout","text":"/kaggle/input/sarcasm/train-balanced-sarc.csv.gz\n/kaggle/input/sarcasm/train-balanced-sarcasm.csv\n/kaggle/input/sarcasm/test-balanced.csv\n/kaggle/input/sarcasm/test-unbalanced.csv\n","output_type":"stream"}]},{"cell_type":"code","source":"!pip install -q kaggle\n# from google.colab import files\n# from google.colab import userdata\nimport os\n# files.upload(); #Upload kaggle.json - you can get from the kaggle account settings, from the API section.","metadata":{"id":"7R4luV8tSDFn","execution":{"iopub.status.busy":"2024-04-18T11:34:23.281041Z","iopub.execute_input":"2024-04-18T11:34:23.281363Z","iopub.status.idle":"2024-04-18T11:34:35.419251Z","shell.execute_reply.started":"2024-04-18T11:34:23.281334Z","shell.execute_reply":"2024-04-18T11:34:35.418137Z"},"trusted":true},"execution_count":45,"outputs":[{"name":"stderr","text":"huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\nTo disable this warning, you can either:\n\t- Avoid using `tokenizers` before the fork if possible\n\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n","output_type":"stream"}]},{"cell_type":"code","source":"# UNCOMMENT BELOW IF YOU'RE RUNNING THE NOTEBOOK OUTSIDE KAGGLE\n\n# kaggle_api_key = open('kaggle.json', \"w+\")\n# kaggle_api_key.write('') # kaggle.json - you can get it from the kaggle account settings, from the API section.\n# !mkdir ~/.kaggle\n# !cp kaggle.json ~/.kaggle/\n# !chmod 600 ~/.kaggle/kaggle.json\n# !kaggle datasets list","metadata":{"id":"F39aDC9VLn0u","execution":{"iopub.status.busy":"2024-04-18T11:34:35.420885Z","iopub.execute_input":"2024-04-18T11:34:35.421252Z","iopub.status.idle":"2024-04-18T11:34:35.426035Z","shell.execute_reply.started":"2024-04-18T11:34:35.421217Z","shell.execute_reply":"2024-04-18T11:34:35.425033Z"},"trusted":true},"execution_count":46,"outputs":[]},{"cell_type":"markdown","source":"Installing packages necessary to use torch's transformers.","metadata":{"id":"GRyxyRkNqONt"}},{"cell_type":"code","source":"!pip install tqdm boto3 requests regex sentencepiece sacremoses botocore>=1.34.79","metadata":{"id":"yhD653HGqOj2","execution":{"iopub.status.busy":"2024-04-18T11:34:35.428253Z","iopub.execute_input":"2024-04-18T11:34:35.428564Z","iopub.status.idle":"2024-04-18T11:34:47.739677Z","shell.execute_reply.started":"2024-04-18T11:34:35.428532Z","shell.execute_reply":"2024-04-18T11:34:47.738644Z"},"trusted":true},"execution_count":47,"outputs":[{"name":"stderr","text":"huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\nTo disable this warning, you can either:\n\t- Avoid using `tokenizers` before the fork if possible\n\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n","output_type":"stream"}]},{"cell_type":"markdown","source":"To use the API, credentials need to be copied into the kaggle folder. If everything works, the output will show the list of available datasets.","metadata":{"id":"aCN2c1DGTbVM"}},{"cell_type":"markdown","source":"import json","metadata":{"id":"P1aQHs-9Tkt2"}},{"cell_type":"code","source":"import json","metadata":{"execution":{"iopub.status.busy":"2024-04-18T11:34:47.741170Z","iopub.execute_input":"2024-04-18T11:34:47.741482Z","iopub.status.idle":"2024-04-18T11:34:47.746319Z","shell.execute_reply.started":"2024-04-18T11:34:47.741456Z","shell.execute_reply":"2024-04-18T11:34:47.745387Z"},"trusted":true},"execution_count":48,"outputs":[]},{"cell_type":"markdown","source":"Preparing the ivy library.","metadata":{"id":"_Sf8EImZT6kZ"}},{"cell_type":"code","source":"#Insert the correct user when cloning the repos. Make sure that they are up-to-date.\n\n!git clone \"https://github.com/Kacper-W-Kozdon/demos.git\"\n# !git clone \"https://github.com/Kacper-W-Kozdon/ivy.git\"\n!pip install -U -q paddlepaddle ivy accelerate>=0.21.0 2>/dev/null # If ran in a notebook with only cpu enabled, edit \"paddlepaddle-gpu\" to \"paddlepaddle\"","metadata":{"id":"7DMn3EoEUBGQ","execution":{"iopub.status.busy":"2024-04-18T11:34:47.747572Z","iopub.execute_input":"2024-04-18T11:34:47.747900Z","iopub.status.idle":"2024-04-18T11:35:01.612423Z","shell.execute_reply.started":"2024-04-18T11:34:47.747870Z","shell.execute_reply":"2024-04-18T11:35:01.611179Z"},"trusted":true},"execution_count":49,"outputs":[{"name":"stderr","text":"huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\nTo disable this warning, you can either:\n\t- Avoid using `tokenizers` before the fork if possible\n\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n","output_type":"stream"},{"name":"stdout","text":"fatal: destination path 'demos' already exists and is not an empty directory.\n","output_type":"stream"},{"name":"stderr","text":"huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...\nTo disable this warning, you can either:\n\t- Avoid using `tokenizers` before the fork if possible\n\t- Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)\n","output_type":"stream"}]},{"cell_type":"markdown","source":"Next: import the ivy library and get the dataset.","metadata":{"id":"y1sA3gFuWjDE"}},{"cell_type":"code","source":"import ivy","metadata":{"id":"_NUgteS_Dluc","execution":{"iopub.status.busy":"2024-04-18T11:35:01.614221Z","iopub.execute_input":"2024-04-18T11:35:01.614630Z","iopub.status.idle":"2024-04-18T11:35:01.619392Z","shell.execute_reply.started":"2024-04-18T11:35:01.614593Z","shell.execute_reply":"2024-04-18T11:35:01.618329Z"},"trusted":true},"execution_count":50,"outputs":[]},{"cell_type":"markdown","source":"Import the libraries suggested in the model which is to be transpiled.","metadata":{"id":"UKN-VX8QXDEG"}},{"cell_type":"code","source":"# Import necessary libraries\nimport pandas as pd # For data manipulation and analysis\nimport gc # For garbage collection to manage memory\nimport re # For regular expressions\nimport numpy as np # For numerical operations and arrays\nimport tensorflow as tf\nimport torch # PyTorch library for deep learning\nimport paddle","metadata":{"id":"1-LVDQOELn0x","execution":{"iopub.status.busy":"2024-04-18T11:35:01.620672Z","iopub.execute_input":"2024-04-18T11:35:01.621461Z","iopub.status.idle":"2024-04-18T11:35:01.631363Z","shell.execute_reply.started":"2024-04-18T11:35:01.621429Z","shell.execute_reply":"2024-04-18T11:35:01.630372Z"},"trusted":true},"execution_count":51,"outputs":[]},{"cell_type":"code","source":"# Libraries to accompany torch's transformers\nimport tqdm\nimport boto3\nimport requests\nimport regex\nimport sentencepiece\nimport sacremoses\n\nimport warnings # For handling warnings\nwarnings.filterwarnings(\"ignore\") # Ignore warning messages\n\nfrom transformers import AutoModel, AutoTokenizer # Transformers library for natural language processing\n# from transformers import TextDataset, LineByLineTextDataset, DataCollatorForLanguageModeling, \\\n# pipeline, Trainer, TrainingArguments, DataCollatorWithPadding # Transformers components for text processing\nfrom transformers import TextDataset, LineByLineTextDataset, DataCollatorForLanguageModeling, \\\npipeline, TrainingArguments, DataCollatorWithPadding\nfrom transformers import AutoModelForSequenceClassification # Transformer model for sequence classification\n\nimport accelerate\n\n# from nlp import Dataset # Import custom 'Dataset' class for natural language processing tasks\nfrom imblearn.over_sampling import RandomOverSampler # For oversampling to handle class imbalance\n# import datasets # Import datasets library\n# from datasets import Dataset, Image, ClassLabel # Import custom 'Dataset', 'ClassLabel', and 'Image' classes\nfrom transformers import pipeline # Transformers library for pipelines\nfrom bs4 import BeautifulSoup # For parsing HTML content\n\nimport matplotlib.pyplot as plt # For data visualization\nimport itertools # For working with iterators\nfrom sklearn.metrics import ( # Import various metrics from scikit-learn\n accuracy_score, # For calculating accuracy\n roc_auc_score, # For ROC AUC score\n confusion_matrix, # For confusion matrix\n classification_report, # For classification report\n f1_score # For F1 score\n)\n\n# from datasets import load_metric # Import load_metric function to load evaluation metrics\n\nfrom tqdm import tqdm # For displaying progress bars\n\ntqdm.pandas() # Enable progress bars for pandas operations","metadata":{"id":"19rgBXHJXHFu","execution":{"iopub.status.busy":"2024-04-18T11:35:01.634372Z","iopub.execute_input":"2024-04-18T11:35:01.634653Z","iopub.status.idle":"2024-04-18T11:35:01.644352Z","shell.execute_reply.started":"2024-04-18T11:35:01.634630Z","shell.execute_reply":"2024-04-18T11:35:01.643480Z"},"trusted":true},"execution_count":52,"outputs":[]},{"cell_type":"code","source":"device = \"gpu:0\" if torch.cuda.is_available() else \"cpu\"\n# This line checks if a CUDA-enabled GPU is available.\n# If a GPU is available, it sets the device to \"gpu:0\" (the first GPU).\n# If no GPU is available, it sets the device to \"cpu\".\n\nivy.set_default_device(device)\n# This line sets the default device for Ivy operations.\n# Ivy will use the device specified above (either \"gpu:0\" or \"cpu\") for all computations.\n\nivy.set_soft_device_mode(True)\n# This line enables Ivy's \"soft device mode\".\n# In soft device mode, Ivy will attempt to automatically move tensors to the correct device\n# when performing operations involving tensors on different devices.\n# This can simplify tensor management and device handling in certain cases.\n","metadata":{"id":"bXr9tGFLGRPI","execution":{"iopub.status.busy":"2024-04-18T11:35:01.645624Z","iopub.execute_input":"2024-04-18T11:35:01.646036Z","iopub.status.idle":"2024-04-18T11:35:01.659129Z","shell.execute_reply.started":"2024-04-18T11:35:01.646005Z","shell.execute_reply":"2024-04-18T11:35:01.658011Z"},"trusted":true},"execution_count":53,"outputs":[]},{"cell_type":"code","source":"print(ivy.default_device())\n# This line prints the current default device set in Ivy.\n# It will print either \"gpu:0\" or \"cpu\", depending on the device specified earlier.\n\nprint(ivy.num_gpus())\n# This line prints the number of CUDA-enabled GPUs available on the system.\n# If one or more GPUs are available, it will print the number of GPUs.\n# If no GPU is available, it will print 0.\n\nprint(torch.cuda.is_available())\n# This line checks if PyTorch can access a CUDA-enabled GPU.\n# PyTorch is a popular machine learning library, and it uses CUDA for GPU acceleration.\n# If a CUDA-enabled GPU is available and PyTorch can access it, this line will print True.\n# If no CUDA-enabled GPU is available or PyTorch cannot access it, this line will print False.","metadata":{"id":"ijs6fSKL9QZ4","execution":{"iopub.status.busy":"2024-04-18T11:35:59.644311Z","iopub.execute_input":"2024-04-18T11:35:59.645116Z","iopub.status.idle":"2024-04-18T11:35:59.650992Z","shell.execute_reply.started":"2024-04-18T11:35:59.645082Z","shell.execute_reply":"2024-04-18T11:35:59.649951Z"},"trusted":true},"execution_count":56,"outputs":[{"name":"stdout","text":"gpu:0\n2\nTrue\n","output_type":"stream"}]},{"cell_type":"markdown","source":"Set the seeds.","metadata":{"id":"JU7qbxYdsVlK"}},{"cell_type":"code","source":"tf.keras.utils.set_random_seed(0)\n# This line sets a seed value for the random number generator used by TensorFlow and Keras.\n# Setting a seed allows you to reproduce the same results across different runs.\n# In this case, the seed is set to 0, which is a common value used for reproducibility.\n\ntorch.manual_seed(0)\n# This line sets the seed for the random number generator used by PyTorch.\n# Similar to the TensorFlow seed, it helps ensure reproducibility of results.\n# The seed value is set to 0 here.\n\npaddle.seed(0)\n# This line sets the seed for the random number generator used by PaddlePaddle.\n# PaddlePaddle is another deep learning framework, and setting the seed ensures reproducibility.\n# Again, the seed value is set to 0 for consistency across frameworks.","metadata":{"id":"HxD1xridsU_l","execution":{"iopub.status.busy":"2024-04-18T11:36:03.490320Z","iopub.execute_input":"2024-04-18T11:36:03.490657Z","iopub.status.idle":"2024-04-18T11:36:03.498653Z","shell.execute_reply.started":"2024-04-18T11:36:03.490633Z","shell.execute_reply":"2024-04-18T11:36:03.497473Z"},"trusted":true},"execution_count":57,"outputs":[{"execution_count":57,"output_type":"execute_result","data":{"text/plain":""},"metadata":{}}]},{"cell_type":"markdown","source":"Get the API key for ivy transpiler from your account and upload it to the project. Move it to the correct directory.","metadata":{"id":"zwU4oNrkXyxT"}},{"cell_type":"code","source":"pwd","metadata":{"id":"VT4kcIOKLn00","execution":{"iopub.status.busy":"2024-04-18T11:27:28.816298Z","iopub.execute_input":"2024-04-18T11:27:28.816789Z","iopub.status.idle":"2024-04-18T11:27:28.824734Z","shell.execute_reply.started":"2024-04-18T11:27:28.816757Z","shell.execute_reply":"2024-04-18T11:27:28.823849Z"},"trusted":true},"execution_count":13,"outputs":[{"execution_count":13,"output_type":"execute_result","data":{"text/plain":"'/kaggle/working'"},"metadata":{}}]},{"cell_type":"markdown","source":"First we're loading the tokenizer and the model from torch. All of the basic set-up instructions can be found here: https://colab.research.google.com/github/pytorch/pytorch.github.io/blob/master/assets/hub/huggingface_pytorch-transformers.ipynb#scrollTo=72d8f2de","metadata":{"id":"DWCnfosUshGK"}},{"cell_type":"code","source":"tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', 'bert-base-cased')\n","metadata":{"id":"2rZY3rhisgXZ","execution":{"iopub.status.busy":"2024-04-18T11:27:28.825748Z","iopub.execute_input":"2024-04-18T11:27:28.826013Z","iopub.status.idle":"2024-04-18T11:27:35.762810Z","shell.execute_reply.started":"2024-04-18T11:27:28.825990Z","shell.execute_reply":"2024-04-18T11:27:35.762021Z"},"trusted":true},"execution_count":14,"outputs":[{"name":"stderr","text":"Downloading: \"https://github.com/huggingface/pytorch-transformers/zipball/main\" to /root/.cache/torch/hub/main.zip\n","output_type":"stream"},{"output_type":"display_data","data":{"text/plain":"tokenizer_config.json: 0%| | 0.00/49.0 [00:00\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
labeltitle
4723471Isn't gentrification wonderful?
6014140He's still alive and older than you so take tips
6646000cow-erkraut.
2997091The Q could stand for Quality!
3393781I can't believe the gays did this to him!
\n"},"metadata":{}}]},{"cell_type":"markdown","source":"# DATASET AND MODEL OVERVIEW","metadata":{"id":"bXFPiT6SgPob"}},{"cell_type":"code","source":"!echo -n API_KEY > .ivy/key.pem","metadata":{"id":"cXATe1TGLn01","execution":{"iopub.status.busy":"2024-04-18T11:27:44.919364Z","iopub.execute_input":"2024-04-18T11:27:44.919646Z","iopub.status.idle":"2024-04-18T11:27:45.890356Z","shell.execute_reply.started":"2024-04-18T11:27:44.919622Z","shell.execute_reply":"2024-04-18T11:27:45.889212Z"},"trusted":true},"execution_count":17,"outputs":[{"name":"stdout","text":"/bin/bash: .ivy/key.pem: No such file or directory\n","output_type":"stream"}]},{"cell_type":"code","source":"def count_words(text: str) -> int:\n return len(text.split())\n\ndef count_symbols(text: str) -> int:\n return len(\"\".join(text.split()))\n\ndef symbol_to_word_ratio(text: str) -> float:\n return count_symbols(text)/count_words(text)\n\ndef upper_lower_ratio(text: str) -> float:\n text = \"\".join(text.split())\n return sum(1 for c in text if c.isupper())/(max([sum(1 for c in text if c.islower()), 1]))\n\ndf['word_count'] = df[\"title\"].apply(count_words)\ndf['symbol_count'] = df[\"title\"].apply(count_symbols)\ndf[\"upper_lower_ratio\"] = df[\"title\"].apply(upper_lower_ratio)\ndf[\"symbol_to_word_ratio\"] = df[\"title\"].apply(symbol_to_word_ratio)\ndf.sample(5)","metadata":{"id":"BVA6U5Y0c7vg","execution":{"iopub.status.busy":"2024-04-18T11:27:45.892087Z","iopub.execute_input":"2024-04-18T11:27:45.893004Z","iopub.status.idle":"2024-04-18T11:28:01.866409Z","shell.execute_reply.started":"2024-04-18T11:27:45.892967Z","shell.execute_reply":"2024-04-18T11:28:01.865554Z"},"trusted":true},"execution_count":18,"outputs":[{"execution_count":18,"output_type":"execute_result","data":{"text/plain":" label title word_count \\\n627321 0 How do people keep getting matches on Tinder? 8 \n378524 0 Same thing happened to me, so it's definitely ... 13 \n96238 0 I agree with you, but too much of a good thing... 17 \n598116 0 'Twas a joke I do believe. 6 \n217680 0 [M] it will get bigger depending on luck of th... 11 \n\n symbol_count upper_lower_ratio symbol_to_word_ratio \n627321 38 0.057143 4.750000 \n378524 62 0.017241 4.769231 \n96238 53 0.020000 3.117647 \n598116 21 0.117647 3.500000 \n217680 42 0.025641 3.818182 ","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
labeltitleword_countsymbol_countupper_lower_ratiosymbol_to_word_ratio
6273210How do people keep getting matches on Tinder?8380.0571434.750000
3785240Same thing happened to me, so it's definitely ...13620.0172414.769231
962380I agree with you, but too much of a good thing...17530.0200003.117647
5981160'Twas a joke I do believe.6210.1176473.500000
2176800[M] it will get bigger depending on luck of th...11420.0256413.818182
\n
"},"metadata":{}}]},{"cell_type":"markdown","source":"A few plots to see some some characteristics of the data.","metadata":{"id":"YY9ru5DbJqxa"}},{"cell_type":"code","source":"df_no_sarc = df.where(df[\"label\"] == 0)\ndf_no_sarc = df_no_sarc.where(df_no_sarc[\"word_count\"] <= 51)\ndf_sarc = df.where(df[\"label\"] == 1)\ndf_sarc = df_sarc.where(df_sarc[\"word_count\"] <= 51)\ndf_no_sarc = df_no_sarc[np.isfinite(df_no_sarc[\"word_count\"])]\ndf_sarc = df_sarc[np.isfinite(df_sarc[\"word_count\"])]\nplt.style.use('_mpl-gallery-nogrid')\n\nhist_df_no_sarc, bin_edges_no = np.histogram(df_no_sarc[\"word_count\"].values, density=True)\nhist_df_sarc, bin_edges = np.histogram(df_sarc[\"word_count\"].values, density=True)\n# plot:\nfig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))\n\nbin_mids_no = [(bin_edges_no[i+1] + bin_edges_no[i])/2 for i in range(len(bin_edges_no) - 1)]\nbin_mids = [(bin_edges[i+1] + bin_edges[i])/2 for i in range(len(bin_edges) - 1)]\nax1.bar(bin_mids_no, hist_df_no_sarc, width=bin_edges_no[1] - bin_edges_no[0])\nax2.bar(bin_mids, hist_df_sarc, width=bin_edges[1] - bin_edges[0])\nax1.set_title(\"Hist no sarcasm\")\nax1.set_ylabel(\"density\")\nax1.set_xlabel(\"word count\")\nax1.set_xticks(bin_edges_no)\nax1.grid(True)\nax2.set_title(\"Hist sarcasm\")\nax2.set_xlabel(\"word count\")\nax2.set_xticks(bin_edges)\nax2.grid(True)\nplt.show()","metadata":{"id":"_LEHSFedgIBq","execution":{"iopub.status.busy":"2024-04-18T11:28:01.867545Z","iopub.execute_input":"2024-04-18T11:28:01.867816Z","iopub.status.idle":"2024-04-18T11:28:02.893326Z","shell.execute_reply.started":"2024-04-18T11:28:01.867793Z","shell.execute_reply":"2024-04-18T11:28:02.892139Z"},"trusted":true},"execution_count":19,"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAABOMAAAI6CAYAAABl+YwAAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABniUlEQVR4nO3dfVhUdf7/8Re3IibeoaBWYkUqopCSBll0g0LZGrlLSG0qubp3JC3FpqZiWZG76eqmRbZZ7q6urt2wlS5JrLSVk4ZgZqXdGmUNSFoofssJzu+Pfs42OiAgnJmDz8d1cW185nPOvN9nqP3w4tz4GIZhCAAAAAAAAEC78/V0AQAAAAAAAMCZgjAOAAAAAAAAMAlhHAAAAAAAAGASwjgAAAAAAADAJIRxAAAAAAAAgEkI4wAAAAAAAACTEMYBAAAAAAAAJiGMAwAAAAAAAExCGAcAAAAAAACYhDAOQLuJiIjQ1KlTPV0GAAAAvBzrRgBnEsI4AM3y1FNPycfHR2VlZW5fv+KKKxQdHX3a77Np0yYtWLDgtPcDAAAAz2DdCABNI4wD0G727t2rxx9/vEXbbNq0Sffcc087VQQAAABvxLoRwJnE39MFAOi4OnXq5OkSLOH7779XQ0ODAgMDPV0KAACAR1h93djQ0KBjx44pKCjI06UAsADOjAPQbk6894fD4dA999yjyMhIBQUFqVevXhozZoyKi4slSVOnTtWKFSskST4+Ps6vU73Hddddp9dee02jRo1SUFCQzjvvPP31r389ae7HH3+stLQ09ezZU8HBwbrkkku0cePGZvVSXFysMWPGqHv37jrrrLM0aNAgzZkzx/n6sWPHNH/+fI0cOVLdunVTly5ddNlll2nLli0u+9m3b598fHz00EMPaenSpTr//PPVqVMnvfvuu5KkPXv26MYbb1Tv3r3VuXNnDRo0SHfffbdz+08//VS/+c1vNGjQIHXu3Fm9evVSWlqa9u3b5/I+pzrWx4/3WWedpcrKSl133XU666yz1L9/f+dn8Pbbb+uqq65Sly5dNGDAAK1du7ZZxwoAAKClzFg3lpWVKTk5WaGhoercubMGDhyoW2+91WXOQw89pISEBPXq1UudO3fWyJEj9fTTT5+0Lx8fH2VlZWnNmjUaOnSoOnXqpKKiIknS/v37NW3aNPXr10+dOnXSwIED9etf/1rHjh2TJB08eFB33nmnhg0bprPOOkshISG65ppr9NZbb530Pg8//LCGDh2q4OBg9ejRQ3FxcS5rsgULFsjHx0fvv/++fv7zn6tbt27q3bu35s2bJ8Mw9Nlnn+n6669XSEiIwsPDtXjx4mZ8GgDaG2fGAWiRb775RjU1NSeNOxyOU267YMEC5efn6xe/+IVGjRql2tpalZWVqby8XGPHjtUvf/lLffHFFyouLtbf/va3Ztf04Ycf6mc/+5mmTZumKVOmaNWqVZo6dapGjhypoUOHSpKqqqqUkJCgo0ePaubMmerVq5dWr16tCRMm6Omnn9YNN9zQ6P7feecdXXfddRo+fLjuvfdederUSR9++KFef/1155za2lr95S9/UUZGhqZPn67Dhw/riSeeUHJysrZv367Y2FiXfT755JP69ttvNWPGDHXq1Ek9e/bUrl27dNlllykgIEAzZsxQRESEPvroI73wwgu6//77JUlvvvmmtm7dqkmTJunss8/Wvn379Oijj+qKK67Qu+++q+Dg4GYd6+Pq6+t1zTXX6PLLL9cf/vAHrVmzRllZWerSpYvuvvtu3XzzzZo4caIKCgo0efJkxcfHa+DAgc3+bAAAwJnLm9aN1dXVGjdunHr37q1Zs2ape/fu2rdvn5599lmXecuWLdOECRN0880369ixY1q3bp3S0tL04osvavz48S5z//Of/+if//ynsrKyFBoaqoiICH3xxRcaNWqUvv76a82YMUODBw/W/v379fTTT+vo0aMKDAzUxx9/rMLCQqWlpWngwIGqqqrSY489psTERL377rvq16+fJOnxxx/XzJkz9bOf/UzZ2dn69ttvtWvXLm3btk033XSTSy3p6ekaMmSIHnzwQW3cuFH33Xefevbsqccee0xXXXWVFi1apDVr1ujOO+/UxRdfrMsvv/yUxwxAOzIAoBmefPJJQ1KTX0OHDnXZZsCAAcaUKVOc38fExBjjx49v8n1++9vfGi35T9OAAQMMScZ///tf51h1dbXRqVMn44477nCO3X777YYk49VXX3WOHT582Bg4cKARERFh1NfXN/oef/rTnwxJxoEDBxqd8/333xvfffedy9ihQ4eMsLAw49Zbb3WOffLJJ4YkIyQkxKiurnaZf/nllxtdu3Y1Pv30U5fxhoYG5z8fPXr0pPe22WyGJOOvf/2rc6w5x3rKlCmGJOOBBx5wqblz586Gj4+PsW7dOuf4nj17DElGXl5ek/sEAADwxnXjc889Z0gy3nzzzSbnnbjWOnbsmBEdHW1cddVVLuOSDF9fX+Odd95xGZ88ebLh6+vr9n2Or+m+/fbbk9aen3zyidGpUyfj3nvvdY5df/31Jx2nE+Xl5RmSjBkzZjjHvv/+e+Pss882fHx8jAcffNA5fnyd9+PjDMAzuEwVQIusWLFCxcXFJ30NHz78lNt2795d77zzjj744IM2rSkqKkqXXXaZ8/vevXtr0KBB+vjjj51jmzZt0qhRozRmzBjn2FlnnaUZM2Zo3759zstEG6tbkv71r3+poaHB7Rw/Pz/nPd8aGhp08OBBff/994qLi1N5eflJ83/605+qd+/ezu8PHDig//73v7r11lt17rnnusz98SUXnTt3dv6zw+HQV199pQsuuEDdu3d3eZ+WHOtf/OIXLtsNGjRIXbp00Y033ugcHzRokLp37+5yTAEAAJriTevG4+u5F198sckz83681jp06JC++eYbXXbZZW7Xc4mJiYqKinJ+39DQoMLCQv3kJz9RXFzcSfOPr+k6deokX98ffhWvr6/XV1995bwNyonruc8//1xvvvnmKfv78XrOz89PcXFxMgxD06ZNc9nfiWtkAJ5BGAegRUaNGqWkpKSTvnr06HHKbe+99159/fXXuvDCCzVs2DDl5uZq165dp13TieGVJPXo0UOHDh1yfv/pp59q0KBBJ80bMmSI8/XGpKen69JLL9UvfvELhYWFadKkSfrnP/95UjC3evVqDR8+3Hlfk969e2vjxo365ptvTtrniZd6Hl8URUdHN9Gp9H//93+aP3++zjnnHHXq1EmhoaHq3bu3vv76a5f3ae6xDgoKcgkFJalbt246++yzT7rvSrdu3VyOKQAAQFO8ad2YmJion/70p7rnnnsUGhqq66+/Xk8++aS+++47l3kvvviiLrnkEgUFBalnz57q3bu3Hn300Wat5w4cOKDa2tpTrucaGhr0pz/9SZGRkS7ruV27drm8z1133aWzzjpLo0aNUmRkpH7729+63Cblx05cD3fr1k1BQUEKDQ09aZz1HOB5hHEATHP55Zfro48+0qpVqxQdHa2//OUvGjFihP7yl7+c1n79/PzcjhuGcVr7Pa5z587673//q5dfflm33HKLdu3apfT0dI0dO1b19fWSpL///e+aOnWqzj//fD3xxBMqKipScXGxrrrqKrdn0/34r64tcdttt+n+++/XjTfeqH/+85/avHmziouL1atXL5f3ae6xbuzYtfcxBQAAaEpbrxt9fHz09NNPy2azKSsrS/v379ett96qkSNH6siRI5KkV199VRMmTFBQUJAeeeQRbdq0ScXFxbrpppvcroFau5574IEHlJOTo8svv1x///vf9dJLL6m4uFhDhw51Wc8NGTJEe/fu1bp16zRmzBg988wzGjNmjPLy8k7ap7u1G+s5wHsRxgEwVc+ePZWZmal//OMf+uyzzzR8+HAtWLDA+fqpnoLVWgMGDNDevXtPGt+zZ4/z9ab4+vrq6quv1pIlS/Tuu+/q/vvv13/+8x/n01KffvppnXfeeXr22Wd1yy23KDk5WUlJSfr222+bVd95550nSdq9e3eT855++mlNmTJFixcv1s9+9jONHTtWY8aM0ddff33S3FMdawAAAG/WHuvGSy65RPfff7/Kysq0Zs0avfPOO1q3bp0k6ZlnnlFQUJBeeukl3XrrrbrmmmuUlJTU7H337t1bISEhzVrPXXnllXriiSc0adIkjRs3TklJSW7Xc126dFF6erqefPJJVVZWavz48br//vubvcYE4J0I4wCY5quvvnL5/qyzztIFF1zgcnlAly5dJMntYuR0XHvttdq+fbtsNptzrK6uTitXrlRERITL/T5OdPDgwZPGjj8d9Xjtx//y+OO/NG7bts3l/ZrSu3dvXX755Vq1apUqKytdXvvxPv38/E76a+bDDz/sPEPvuOYcawAAAG/V1uvGQ4cOnbSGcree8/HxcVlX7du3T4WFhc2q2dfXV6mpqXrhhRdUVlZ20uvH39/dem7Dhg3av3+/y9iJxyAwMFBRUVEyDKNZT6QF4L38PV0AgDNHVFSUrrjiCo0cOVI9e/ZUWVmZnn76aWVlZTnnjBw5UpI0c+ZMJScny8/PT5MmTTrt9541a5b+8Y9/6JprrtHMmTPVs2dPrV69Wp988omeeeYZ50103bn33nv13//+V+PHj9eAAQNUXV2tRx55RGeffbbzgRDXXXednn32Wd1www0aP368PvnkExUUFCgqKsp56cOp/PnPf9aYMWM0YsQIzZgxQwMHDtS+ffu0ceNG7dy50/k+f/vb39StWzdFRUXJZrPp5ZdfVq9evVz21ZxjDQAA4K3aet24evVqPfLII7rhhht0/vnn6/Dhw3r88ccVEhKia6+9VpI0fvx4LVmyRCkpKbrppptUXV2tFStW6IILLmj2/eoeeOABbd68WYmJiZoxY4aGDBmiL7/8Uhs2bNBrr72m7t2767rrrtO9996rzMxMJSQk6O2339aaNWucV0ocN27cOIWHh+vSSy9VWFiY3nvvPS1fvlzjx49X165dW3NYAXgJwjgAppk5c6aef/55bd68Wd99950GDBig++67T7m5uc45EydO1G233aZ169bp73//uwzDaJMwLiwsTFu3btVdd92lhx9+WN9++62GDx+uF154QePHj29y2wkTJmjfvn1atWqVampqFBoaqsTERN1zzz3q1q2bJGnq1Kmy2+167LHH9NJLLykqKkp///vftWHDBpWWljarxpiYGL3xxhuaN2+eHn30UX377bcaMGCAy1NNly1bJj8/P61Zs0bffvutLr30Ur388stKTk522VdzjjUAAIC3aut1Y2JiorZv365169apqqpK3bp106hRo7RmzRrngxiuuuoqPfHEE3rwwQd1++23a+DAgVq0aJH27dvX7DCuf//+2rZtm+bNm6c1a9aotrZW/fv31zXXXKPg4GBJ0pw5c1RXV6e1a9dq/fr1GjFihDZu3KhZs2a57OuXv/yl1qxZoyVLlujIkSM6++yzNXPmTM2dO7c1hxSAF/ExuHsjAAAAAAAAYAruGQcAAAAAAACYhDAOAAAAAAAAMAlhHAAAAAAAAGASwjgAAAAAAADAJIRxAAAAAAAAgEkI4wAAAAAAAACT+Hu6AE9raGjQF198oa5du8rHx8fT5QAAAIszDEOHDx9Wv3795OvL3z29GetAAADQVlqyBjzjw7gvvvhC55xzjqfLAAAAHcxnn32ms88+29NloAmsAwEAQFtrzhrwjA/junbtKumHgxUSEtLm+3c4HNq8ebPGjRungICANt+/GejB86xev2T9Hqxev0QP3sDq9UvW78GM+mtra3XOOec41xjwXqwDT83qPVi9fsn6PVi9fsn6PVi9fokevIHV65fav4eWrAHP+DDu+CUJISEh7bYICw4OVkhIiKV/YOnBs6xev2T9Hqxev0QP3sDq9UvW78HM+rns0fuxDjw1q/dg9fol6/dg9fol6/dg9folevAGVq9fMq+H5qwBuZEJAAAAAAAA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"},"metadata":{}}]},{"cell_type":"code","source":"df_no_sarc = df.where(df[\"label\"] == 0)\ndf_no_sarc = df_no_sarc.where(df_no_sarc[\"symbol_count\"] <= 201)\ndf_sarc = df.where(df[\"label\"] == 1)\ndf_sarc = df_sarc.where(df_sarc[\"symbol_count\"] <= 201)\ndf_no_sarc = df_no_sarc[np.isfinite(df_no_sarc[\"symbol_count\"])]\ndf_sarc = df_sarc[np.isfinite(df_sarc[\"symbol_count\"])]\nplt.style.use('_mpl-gallery-nogrid')\n\nhist_df_no_sarc, bin_edges_no = np.histogram(df_no_sarc[\"symbol_count\"].values, density=True)\nhist_df_sarc, bin_edges = np.histogram(df_sarc[\"symbol_count\"].values, density=True)\n# plot:\nfig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))\n\nbin_mids_no = [(bin_edges_no[i+1] + bin_edges_no[i])/2 for i in range(len(bin_edges_no) - 1)]\nbin_mids = [(bin_edges[i+1] + bin_edges[i])/2 for i in range(len(bin_edges) - 1)]\nax1.bar(bin_mids_no, hist_df_no_sarc, width=bin_edges_no[1] - bin_edges_no[0])\nax2.bar(bin_mids, hist_df_sarc, width=bin_edges[1] - bin_edges[0])\nax1.set_title(\"Hist no sarcasm\")\nax1.set_ylabel(\"density\")\nax1.set_xlabel(\"symbol count\")\nax1.set_xticks(bin_edges_no)\nax1.grid(True)\nax2.set_title(\"Hist sarcasm\")\nax2.set_xlabel(\"symbol count\")\nax2.set_xticks(bin_edges)\nax2.grid(True)\nplt.show()","metadata":{"id":"RcYhYzfygLc9","execution":{"iopub.status.busy":"2024-04-18T11:28:02.894545Z","iopub.execute_input":"2024-04-18T11:28:02.894873Z","iopub.status.idle":"2024-04-18T11:28:03.849902Z","shell.execute_reply.started":"2024-04-18T11:28:02.894846Z","shell.execute_reply":"2024-04-18T11:28:03.848948Z"},"trusted":true},"execution_count":20,"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAABOsAAAI6CAYAAAB2Lsz0AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB9D0lEQVR4nOzdf1zV9f3//zsgeMAEf8bxRwoV80f+IOEtwShbQ6BoSTVSayrkW9cWhfGeTQ3BqeUsNTQtsqXTTzmd1ZilI06Y1eYJU7Sy0n5ptNxBnSmFGUc53z/8craTRwQEzuult+vl4kV5vh6v5+vxOHDkyYPXDz+Xy+USAAAAAAAAAJ/z93UCAAAAAAAAAE6jWQcAAAAAAAAYBM06AAAAAAAAwCBo1gEAAAAAAAAGQbMOAAAAAAAAMAiadQAAAAAAAIBB0KwDAAAAAAAADIJmHQAAAAAAAGAQNOsAAAAAAAAAg6BZB8CnIiIilJmZ6es0AAAAYHCsGwFcLGjWAWgxf/zjH+Xn56ft27d73X799ddr0KBB532cTZs2adasWec9DwAAAHyDdSMAnB3NOgA+tXfvXj3zzDNN2mfTpk363e9+10oZAQAAwIhYNwK4WLTzdQIALm7t27f3dQqmcPLkSdXV1SkoKMjXqQAAAPiE2deNdXV1qq2tlcVi8XUqAAyOM+sA+NQP7z3idDr1u9/9TlFRUbJYLOratasSExNls9kkSZmZmVq2bJkkyc/Pz/3nXMe4+eab9fe//13Dhw+XxWLR5ZdfrtWrV58R+/nnnysjI0NdunRRSEiIrrnmGm3cuLFRtdhsNiUmJqpTp0665JJL1K9fP82YMcO9vba2Vvn5+YqJiVFYWJg6dOiga6+9Vq+//rrHPPv375efn58WLFigwsJCXXHFFWrfvr0+/PBDSdKePXt0xx13qHv37goODla/fv300EMPuff/4osv9Otf/1r9+vVTcHCwunbtqoyMDO3fv9/jOOd6retf70suuUSVlZW6+eabdckll6hXr17uz8H777+vG264QR06dFDfvn21Zs2aRr1WAAAATdUW68bt27crJSVF3bp1U3BwsCIjI3X33Xd7xCxYsEAJCQnq2rWrgoODFRMToxdeeOGMufz8/JSdna3nn39eV111ldq3b6+SkhJJ0ldffaWJEyeqZ8+eat++vSIjI/WrX/1KtbW1kqQjR47oN7/5jQYPHqxLLrlEoaGhuvHGG/Xuu++ecZwnnnhCV111lUJCQtS5c2fFxsZ6rMlmzZolPz8/ffzxx/rFL36hsLAwde/eXTNnzpTL5dKXX36pUaNGKTQ0VFarVQsXLmzEZwNAa+LMOgAt7tixYzp8+PAZ406n85z7zpo1S/PmzdP//u//avjw4aqurtb27dtVUVGhkSNH6pe//KUOHDggm82m//f//l+jc/r000/185//XBMnTtSECRO0YsUKZWZmKiYmRldddZUkqaqqSgkJCTp+/Ljuv/9+de3aVatWrdItt9yiF154QbfeeutZ5//ggw908803a8iQIZo9e7bat2+vTz/9VP/4xz/cMdXV1frDH/6gsWPHatKkSfrmm2/07LPPKiUlRdu2bVN0dLTHnCtXrtSJEyc0efJktW/fXl26dNF7772na6+9VoGBgZo8ebIiIiL02Wef6eWXX9bDDz8sSXrnnXe0detWjRkzRr1799b+/fv11FNP6frrr9eHH36okJCQRr3W9U6dOqUbb7xR1113nR599FE9//zzys7OVocOHfTQQw/prrvu0m233aaioiKNHz9e8fHxioyMbPTnBgAAXLyMtG48ePCgkpOT1b17d02bNk2dOnXS/v379dJLL3nELV68WLfccovuuusu1dbWau3atcrIyNArr7yitLQ0j9jNmzfrz3/+s7Kzs9WtWzdFRETowIEDGj58uI4eParJkyerf//++uqrr/TCCy/o+PHjCgoK0ueff67i4mJlZGQoMjJSVVVVevrppzVixAh9+OGH6tmzpyTpmWee0f3336+f//znysnJ0YkTJ/Tee++pvLxcd955p0cuo0eP1oABA/T73/9eGzdu1Ny5c9WlSxc9/fTTuuGGGzR//nw9//zz+s1vfqP/+Z//0XXXXXfO1wxAK3EBQAtZuXKlS1KDf6666iqPffr27euaMGGC++OhQ4e60tLSGjzOvffe62rKf199+/Z1SXK9+eab7rGDBw+62rdv7/q///s/99iUKVNcklxvvfWWe+ybb75xRUZGuiIiIlynTp066zEef/xxlyTXoUOHzhpz8uRJ1/fff+8x9vXXX7vCw8Ndd999t3ts3759Lkmu0NBQ18GDBz3ir7vuOlfHjh1dX3zxhcd4XV2d+9/Hjx8/49h2u90lybV69Wr3WGNe6wkTJrgkuR555BGPnIODg11+fn6utWvXusf37NnjkuQqKChocE4AAAAjrhv/8pe/uCS53nnnnQbjfrjWqq2tdQ0aNMh1ww03eIxLcvn7+7s++OADj/Hx48e7/P39vR6nfk134sSJM9ae+/btc7Vv3941e/Zs99ioUaPOeJ1+qKCgwCXJNXnyZPfYyZMnXb1793b5+fm5fv/737vH69d5//06A2h7XAYLoMUtW7ZMNpvtjD9Dhgw5576dOnXSBx98oE8++aRFcxo4cKCuvfZa98fdu3dXv3799Pnnn7vHNm3apOHDhysxMdE9dskll2jy5Mnav3+/+zLUs+UtSX/9619VV1fnNSYgIMB9z7m6ujodOXJEJ0+eVGxsrCoqKs6Iv/3229W9e3f3x4cOHdKbb76pu+++W3369PGI/e9LOoKDg93/djqd+ve//60rr7xSnTp18jhOU17r//3f//XYr1+/furQoYPuuOMO93i/fv3UqVMnj9cUAACgIUZaN9av51555ZUGz+z777XW119/rWPHjunaa6/1up4bMWKEBg4c6P64rq5OxcXF+tnPfqbY2Ngz4uvXdO3bt5e//+kf10+dOqV///vf7tus/HA9989//lPvvPPOOev77/VcQECAYmNj5XK5NHHiRI/5frhGBtD2aNYBaHHDhw9XUlLSGX86d+58zn1nz56to0eP6kc/+pEGDx6sqVOn6r333jvvnH7Y3JKkzp076+uvv3Z//MUXX6hfv35nxA0YMMC9/WxGjx6tH//4x/rf//1fhYeHa8yYMfrzn/98RuNu1apVGjJkiPu+Kt27d9fGjRt17NixM+b84aWk9YumQYMGNVCp9N133yk/P1+XXXaZ2rdvr27duql79+46evSox3Ea+1pbLBaPpqEkhYWFqXfv3mfc9yUsLMzjNQUAAGiIkdaNI0aM0O23367f/e536tatm0aNGqWVK1fq+++/94h75ZVXdM0118hisahLly7q3r27nnrqqUat5w4dOqTq6upzrufq6ur0+OOPKyoqymM9995773kc57e//a0uueQSDR8+XFFRUbr33ns9bsPy3364Hg4LC5PFYlG3bt3OGGc9B/gWzToAhnLdddfps88+04oVKzRo0CD94Q9/0LBhw/SHP/zhvOYNCAjwOu5yuc5r3nrBwcF688039dprr2ncuHF67733NHr0aI0cOVKnTp2SJD333HPKzMzUFVdcoWeffVYlJSWy2Wy64YYbvJ6N99+/tW2K++67Tw8//LDuuOMO/fnPf1ZpaalsNpu6du3qcZzGvtZne+1a+zUFAABoSEuvG/38/PTCCy/IbrcrOztbX331le6++27FxMTo22+/lSS99dZbuuWWW2SxWPTkk09q06ZNstlsuvPOO72ugZq7nnvkkUeUm5ur6667Ts8995xeffVV2Ww2XXXVVR7ruQEDBmjv3r1au3atEhMT9eKLLyoxMVEFBQVnzOlt7cZ6DjAmmnUADKdLly7KysrSn/70J3355ZcaMmSIZs2a5d5+rqd4NVffvn21d+/eM8b37Nnj3t4Qf39//fSnP9WiRYv04Ycf6uGHH9bmzZvdT3t94YUXdPnll+ull17SuHHjlJKSoqSkJJ04caJR+V1++eWSpN27dzcY98ILL2jChAlauHChfv7zn2vkyJFKTEzU0aNHz4g912sNAABgZK2xbrzmmmv08MMPa/v27Xr++ef1wQcfaO3atZKkF198URaLRa+++qruvvtu3XjjjUpKSmr03N27d1doaGij1nM/+clP9Oyzz2rMmDFKTk5WUlKS1/Vchw4dNHr0aK1cuVKVlZVKS0vTww8/3Og1JgDjoVkHwFD+/e9/e3x8ySWX6Morr/S4/KBDhw6S5HWxcj5uuukmbdu2TXa73T1WU1Oj5cuXKyIiwuN+Iz905MiRM8bqn+5an3v9by7/+zeV5eXlHsdrSPfu3XXddddpxYoVqqys9Nj233MGBASc8dvQJ554wn2GX73GvNYAAABG1dLrxq+//vqMNZS39Zyfn5/Humr//v0qLi5uVM7+/v5KT0/Xyy+/rO3bt5+xvf743tZz69ev11dffeUx9sPXICgoSAMHDpTL5WrUE3UBGFM7XycAAP9t4MCBuv766xUTE6MuXbpo+/bteuGFF5Sdne2OiYmJkSTdf//9SklJUUBAgMaMGXPex542bZr+9Kc/6cYbb9T999+vLl26aNWqVdq3b59efPFF901+vZk9e7befPNNpaWlqW/fvjp48KCefPJJ9e7d2/3AiptvvlkvvfSSbr31VqWlpWnfvn0qKirSwIED3ZdWnMuSJUuUmJioYcOGafLkyYqMjNT+/fu1ceNG7dq1y32c//f//p/CwsI0cOBA2e12vfbaa+ratavHXI15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Hj2qxMRElZSUyGKxuGOef/55ZWdn66c//an8/f11++23a8mSJW1XOAAAwEWMNSAAAMBZuOAzb7zxhuvmm2929ejRwyXJ9Ze//MXXKTXokUceccXGxrouueQSV/fu3V2jRo1y7dmzxyPm6aefdo0YMcLVsWNHlyTX119/7ZtkG2HevHkuSa6cnBz3mBny/+c//+m66667XF26dHFZLBbXoEGDXO+88457+4svvugaOXKkq0uXLi5Jrp07d/ouWS9OnjzpysvLc0VERLgsFovr8ssvd82ePdtVV1fnjjFaDed6r9bV1blmzpzpslqtLovF4vrpT3/q+vjjjz1i5s6d64qPj3cFBwe7wsLC2i55V8P519bWuh588EHXoEGDXCEhIa4ePXq4xo0b5/rqq68Mk7/L1bT/L3/5y1+6JLkef/xxj3Gjfg7qffjhh66f/exnrtDQUFdISIgrNjbW9cUXX7i3+/r/p3PV8M0337juvfdeV69evVwWi8U1YMAA11NPPeUR48saGvM97LvvvnP9+te/dnXp0sXVoUMH12233eZyOBweMffdd59r2LBhrqCgINfQoUPbLH9ceMy0DrzQ1oAuF+tAX2ANaLw1lBnWgWZfA7pc5l8HsgY8ra3XgD69Z93FrqamRkOHDtWyZct8nUqjvPHGG7r33nv19ttvy2azyel0Kjk5WTU1Ne6Y48ePKzU1VTNmzPBhpuf2zjvv6Omnn9aQIUM8xo2e/9dff60f//jHCgwM1N/+9jd9+OGHWrhwoTp37uyOqampUWJioubPn+/DTM9u/vz5euqpp7R06VJ99NFHmj9/vh599FE98cQT7hij1XCu9+qjjz6qJUuWqKioSOXl5erQoYNSUlJ04sQJd0xtba0yMjL0q1/9qq3Sdmso/+PHj6uiokIzZ85URUWFXnrpJe3du1e33HKLR5wv85ca///lX/7yF7399tteL2cz6udAkj777DMlJiaqf//+2rJli9577z3NnDnT42wgX///dK4acnNzVVJSoueee04fffSRpkyZouzsbG3YsMEd48saGvM97IEHHtDLL7+s9evX64033tCBAwd02223nTHX3XffrdGjR7dl+rgAmWkdeCGtASXWgb7CGtB4aygzrAPNvgaUzL8OZA34H226Bmz1diAaRQb/jao3Bw8edElyvfHGG2dse/311w37G8lv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"},"metadata":{}}]},{"cell_type":"code","source":"df_no_sarc = df.where(df[\"label\"] == 0)\ndf_no_sarc = df_no_sarc.where(df_no_sarc[\"upper_lower_ratio\"] <= 0.3)\ndf_sarc = df.where(df[\"label\"] == 1)\ndf_sarc = df_sarc.where(df_sarc[\"upper_lower_ratio\"] <= 0.3)\ndf_no_sarc = df_no_sarc[np.isfinite(df_no_sarc[\"upper_lower_ratio\"])]\ndf_sarc = df_sarc[np.isfinite(df_sarc[\"upper_lower_ratio\"])]\nplt.style.use('_mpl-gallery-nogrid')\n\nhist_df_no_sarc, bin_edges_no = np.histogram(df_no_sarc[\"upper_lower_ratio\"].values, density=True)\nhist_df_sarc, bin_edges = np.histogram(df_sarc[\"upper_lower_ratio\"].values, density=True)\n# plot:\nfig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))\n\nbin_mids_no = [(bin_edges_no[i+1] + bin_edges_no[i])/2 for i in range(len(bin_edges_no) - 1)]\nbin_mids = [(bin_edges[i+1] + bin_edges[i])/2 for i in range(len(bin_edges) - 1)]\nax1.bar(bin_mids_no, hist_df_no_sarc, width=bin_edges_no[1] - bin_edges_no[0])\nax2.bar(bin_mids, hist_df_sarc, width=bin_edges[1] - bin_edges[0])\nax1.set_title(\"Hist no sarcasm\")\nax1.set_ylabel(\"density\")\nax1.set_xlabel(\"upper/lower ratio\")\nax1.set_xticks(bin_edges_no)\nax1.grid(True)\nax2.set_title(\"Hist sarcasm\")\nax2.set_xlabel(\"upper/lower ratio\")\nax2.set_xticks(bin_edges)\nax2.grid(True)\nplt.show()","metadata":{"id":"vvKbuhLaDaSP","execution":{"iopub.status.busy":"2024-04-18T11:28:03.851301Z","iopub.execute_input":"2024-04-18T11:28:03.851603Z","iopub.status.idle":"2024-04-18T11:28:04.803526Z","shell.execute_reply.started":"2024-04-18T11:28:03.851578Z","shell.execute_reply":"2024-04-18T11:28:04.802560Z"},"trusted":true},"execution_count":21,"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAABNYAAAI6CAYAAADrI8V8AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABZEklEQVR4nO3dd5hUhdk/7meBXTpLFViVYkVQUVEMNtBQJKioiSUxBks0b5QosbyaRMTYSTEYQ7DElgQlRhGNJspGsQZBBOwiKNgBOyKvOsL5/ZEf83WlCIednTly39fFleyZM2c+z6zKw4fZmbIkSZIAAAAAANZLvWIHAAAAAIAsUqwBAAAAQAqKNQAAAABIQbEGAAAAACko1gAAAAAgBcUaAAAAAKSgWAMAAACAFBRrAAAAAJCCYg0AAAAAUlCsAeukS5cuccwxxxQ7BgAAJc7eCGxMFGuwEbrhhhuirKwsZsyYsdrb+/XrF9tvv/0GP84///nPOO+88zb4OgAAFIe9EWDtFGvAOpkzZ05cc80163Wff/7zn/HLX/6yQIkAAChF9kZgY9Kg2AGAbGjYsGGxI2TC559/HitWrIiKiopiRwEAKIqs740rVqyIzz77LBo1alTsKEAGeMUasE6+/F4ZuVwufvnLX8bWW28djRo1ijZt2sRee+0V1dXVERFxzDHHxNixYyMioqysLP/rqx7jgAMOiEceeSR69+4djRo1ii222CL+/Oc/r3Luyy+/HIcddli0bt06mjRpEt/4xjfi7rvvXqdZqqurY6+99oqWLVtGs2bNYtttt42f//zn+ds/++yzOPfcc6NXr15RWVkZTZs2jb333jumTJlS4zoLFiyIsrKy+M1vfhNjxoyJLbfcMho2bBjPPfdcRES88MILcfjhh0e7du2icePGse2228YvfvGL/P1feeWVOOmkk2LbbbeNxo0bR5s2beKwww6LBQsW1Hicr3quVz7fzZo1i1dffTUOOOCAaNasWWy66ab578HTTz8d++23XzRt2jQ6d+4cN9100zo9VwAA66su9sYZM2bEoEGDom3bttG4cePo2rVrHHfccTXO+c1vfhN77LFHtGnTJho3bhy9evWKW2+9dZVrlZWVxfDhw2P8+PHRo0ePaNiwYdxzzz0REfHGG2/E8ccfH1VVVdGwYcPo2rVr/PjHP47PPvssIiLee++9OOOMM2KHHXaIZs2aRYsWLWLw4MHx5JNPrvI4V1xxRfTo0SOaNGkSrVq1il133bXGTnbeeedFWVlZvPjii/H9738/Kisro127djFy5MhIkiRee+21GDp0aLRo0SI6dOgQv/3tb9fhuwEUmleswUbsww8/jHfeeWeV47lc7ivve95558Ull1wSP/zhD6N3796xZMmSmDFjRsycOTMGDBgQP/rRj+LNN9+M6urq+Mtf/rLOmebNmxff+c534vjjj49hw4bFddddF8ccc0z06tUrevToERERixYtij322COWLVsWp5xySrRp0yZuvPHGOOigg+LWW2+NQw45ZI3Xf/bZZ+OAAw6IHXfcMc4///xo2LBhzJs3Lx599NH8OUuWLIk//elP8d3vfjdOOOGE+Oijj+Laa6+NQYMGxfTp02OnnXaqcc3rr78+PvnkkzjxxBOjYcOG0bp163jqqadi7733jvLy8jjxxBOjS5cu8dJLL8U//vGPuOiiiyIi4vHHH4///Oc/ceSRR8Zmm20WCxYsiHHjxkW/fv3iueeeiyZNmqzTc73S8uXLY/DgwbHPPvvEr371qxg/fnwMHz48mjZtGr/4xS/iqKOOikMPPTSuvPLK+MEPfhB9+vSJrl27rvP3BgDYeJXS3rh48eIYOHBgtGvXLs4+++xo2bJlLFiwICZOnFjjvMsvvzwOOuigOOqoo+Kzzz6LCRMmxGGHHRZ33XVXDBkypMa5999/f9xyyy0xfPjwaNu2bXTp0iXefPPN6N27d3zwwQdx4oknRrdu3eKNN96IW2+9NZYtWxYVFRXx8ssvx6RJk+Kwww6Lrl27xqJFi+Kqq66Kvn37xnPPPRdVVVUREXHNNdfEKaecEt/5znfi1FNPjU8++SSeeuqpmDZtWnzve9+rkeWII46I7bbbLi699NK4++6748ILL4zWrVvHVVddFfvtt1+MHj06xo8fH2eccUbstttusc8++3zlcwYUUAJsdK6//vokItb6q0ePHjXu07lz52TYsGH5r3v27JkMGTJkrY9z8sknJ+vzn5nOnTsnEZE89NBD+WOLFy9OGjZsmJx++un5YyNGjEgiInn44Yfzxz766KOka9euSZcuXZLly5ev8TF+97vfJRGRvP3222s85/PPP08+/fTTGsfef//9pH379slxxx2XPzZ//vwkIpIWLVokixcvrnH+PvvskzRv3jx55ZVXahxfsWJF/v8vW7ZslceeOnVqEhHJn//85/yxdXmuhw0blkREcvHFF9fI3Lhx46SsrCyZMGFC/vgLL7yQREQyatSotV4TAKAU98bbb789iYjk8ccfX+t5X961Pvvss2T77bdP9ttvvxrHIyKpV69e8uyzz9Y4/oMf/CCpV6/eah9n5U73ySefrLJ7zp8/P2nYsGFy/vnn548NHTp0lefpy0aNGpVERHLiiSfmj33++efJZpttlpSVlSWXXnpp/vjKPe+LzzNQHH4UFDZiY8eOjerq6lV+7bjjjl9535YtW8azzz4bc+fOrdVM3bt3j7333jv/dbt27WLbbbeNl19+OX/sn//8Z/Tu3Tv22muv/LFmzZrFiSeeGAsWLMj/KOaackdE3HHHHbFixYrVnlO/fv38e6StWLEi3nvvvfj8889j1113jZkzZ65y/re//e1o165d/uu33347HnrooTjuuOOiU6dONc794o81NG7cOP//c7lcvPvuu7HVVltFy5YtazzO+jzXP/zhD2vcb9ttt42mTZvG4Ycfnj++7bbbRsuWLWs8pwAAa1NKe+PKfe6uu+5a6yvmvrhrvf/++/Hhhx/G3nvvvdp9rm/fvtG9e/f81ytWrIhJkybFgQceGLvuuusq56/c6Ro2bBj16v33j9XLly+Pd999N/9WI1/e515//fV4/PHHv3K+L+5z9evXj1133TWSJInjjz++xvW+vCMDxaFYg41Y7969o3///qv8atWq1Vfe9/zzz48PPvggttlmm9hhhx3izDPPjKeeemqDM325iIqIaNWqVbz//vv5r1955ZXYdtttVzlvu+22y9++JkcccUTsueee8cMf/jDat28fRx55ZNxyyy2rlGw33nhj7Ljjjvn3AWnXrl3cfffd8eGHH65yzS//OOXKBeerPnr+//7v/+Lcc8+NzTffPBo2bBht27aNdu3axQcffFDjcdb1uW7UqFGNgi8iorKyMjbbbLNV3qeksrKyxnMKALA2pbQ39u3bN7797W/HL3/5y2jbtm0MHTo0rr/++vj0009rnHfXXXfFN77xjWjUqFG0bt062rVrF+PGjVunfe7tt9+OJUuWfOU+t2LFivjd734XW2+9dY197qmnnqrxOGeddVY0a9YsevfuHVtvvXWcfPLJNd6K5Iu+vA9XVlZGo0aNom3btqsct89B8SnWgFT22WefeOmll+K6666L7bffPv70pz/FLrvsEn/605826Lr169df7fEkSTbouis1btw4Hnroofj3v/8dRx99dDz11FNxxBFHxIABA2L58uUREfHXv/41jjnmmNhyyy3j2muvjXvuuSeqq6tjv/32W+2r3L74t6Hr4yc/+UlcdNFFcfjhh8ctt9wSkydPjurq6mjTpk2Nx1nX53pNz12hn1MAgLWp7b2xrKwsbr311pg6dWoMHz483njjjTjuuOOiV69esXTp0oiIePjhh+Oggw6KRo0axR//+Mf45z//GdXV1fG9731vtTtQ2n3u4osvjtNOOy322Wef+Otf/xr33ntvVFdXR48ePWrsc9ttt13MmTMnJkyYEHvttVfcdtttsddee8WoUaNWuebqdjf7HJQuxRqQWuvWrePYY4+Nm2++OV577bXYcccd47zzzsvf/lWf5pRW586dY86cOascf+GFF/K3r029evXim9/8Zlx22WXx3HPPxUUXXRT3339//lM/b7311thiiy1i4sSJcfTRR8egQYOif//+8cknn6xTvi222CIiIp555pm1nnfrrbfGsGHD4re//W185zvfiQEDBsRee+0VH3zwwSrnftVzDQBQygqxN37jG9+Iiy66KGbMmBHjx4+PZ599NiZMmBAREbfddls0atQo7r333jjuuONi8ODB0b9//3W+drt27aJFixbrtM/tu+++ce2118aRRx4ZAwcOjP79+692n2vatGkcccQRcf3118err74aQ4YMiYsuumidd0ygNCnWgFTefffdGl83a9YsttpqqxovwW/atGlExGoXiw3xrW99K6ZPnx5Tp07NH/v444/j6quvji5dutR4f4wve++991Y5tvJTPldmX/k3gl/8G8Bp06bVeLy1adeuXeyzzz5x3XXXxauvvlrjti9es379+qv8LeMVV1yRf+XcSuvyXAMAlKra3hvff//9VXao1e1zZWVlNfaqBQsWxKRJk9Ypc7169eLggw+Of/zjHzFjxoxVbl/5+Kvb5/7+97/HG2+8UePYl5+DioqK6N69eyRJsk6frAqUrgbFDgBkU/fu3aNfv37Rq1evaN26dcyYMSNuvfXWGD58eP6cXr16RUTEKaecEoMGDYr69evHkUceucGPffbZZ8fNN98cgwcPjlNOOSVat24dN954Y8yfPz9uu+22/BvIrs75558fDz30UAwZMiQ6d+4cixcvjj/+8Y+x2Wab5T8M4YADDoiJEyfGIYccEkOGDIn58+fHlVdeGd27d8//eMFX+f3vfx977bVX7LLLLnHiiSdG165dY8GCBXH33XfH7Nmz84/zl7/8JSorK6N79+4xderU+Pe//x1t2rSpca11ea4BAEpVbe+NN954Y/zxj3+MQw45JLbccsv46KOP4pprrokWLVrEt771rYiIGDJkSFx22WWx//77x/e+971YvHhxjB07Nrbaaqt1fn+3iy++OCZPnhx9+/aNE088Mbbbbrt466234u9//3s88sgj0bJlyzjggAPi/PPPj2OPPTb22GOPePrpp2P8+PH5n2BYaeDAgdGhQ4fYc889o3379vH888/HH/7whxgyZEg0b948zdMKlAjFGpDKKaecEnfeeWdMnjw5Pv300+jcuXNceOGFceaZZ+bPOfTQQ+MnP/lJTJgwIf76179GkiS1Uqy1b98+/vOf/8RZZ50VV1xxRXzyySex4447xj/+8Y8YMmTIWu970EEHxYIFC+K6666Ld955J9q2bRt9+/aNX/7yl1FZWRkREcccc0wsXLgwrrrqqrj33nuje/fu8de//jX+/ve/xwMPPLBOGXv27BmPPfZYjBw5MsaNGxeffPJJdO7cucanc15++eVRv379GD9+fHzyySex5557xr///e8YNGhQjWuty3MNAFCqantv7Nu3b0yfPj0mTJgQixYtisrKyujdu3eMHz8+/yEE++23X1x77bVx6aWXxogRI6Jr164xevToWLBgwToXa5tuumlMmzYtRo4cGePHj48lS5bEpptuGoMHD44mTZpERMTPf/7z+Pjjj+Omm26Kv/3tb7HLLrvE3XffHWeffXaNa/3oRz+K8ePHx2WXXRZLly6NzTbbLE455ZQ455xz0jylQAkpS7zbIQAAAACsN++xBgAAAAApKNYAAAAAIAXFGgAAAACkoFgDAAAAgBQUawAAAACQgmINAAAAAFJoUOwAtWnFihXx5ptvRvPmzaOsrKzYcQCAjEuSJD766KOoqqqKevX8fWSpsgMCALVpfXbAr1Wx9uabb8bmm29e7BgAwNfMa6+9FptttlmxY7AGdkAAoBDWZQf8WhVrzZs3j4j/Dt6iRYtav34ul4vJkyfHwIEDo7y8vNavXxfMUHxZzx+R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5JFHRkTEDjvsEK+88kpccsklayzWysvLM/sHBNbd1+H7nPUZsp4/IvszZD1/hBlKQdbzRxRuhvW5Zr1af3QAANhAy5Yti3r1aq6q9evXjxUrVhQpEQDAqrxiDQCAknPggQfGRRddFJ06dYoePXrErFmz4rLLLovjjjuu2NEAAPIUawAAlJwrrrgiRo4cGSeddFIsXrw4qqqq4kc/+lGce+65xY4GAJCnWAMAoOQ0b948xowZE2PGjCl2FACANfIeawAAAACQQqpibcoUHzUOAAAAwMYtVbG2//77x5ZbbhkXXnhhvPbaa7WdCQAAAABKXqpi7Y033ojhw4fHrbfeGltssUUMGjQobrnllvjss89qOx8AAAAAlKRUxVrbtm3jpz/9acyePTumTZsW22yzTZx00klRVVUVp5xySjz55JO1nRMAAAAASsoGf3jBLrvsEj/72c9i+PDhsXTp0rjuuuuiV69esffee8ezzz5bGxkBAAAAoOSkLtZyuVzceuut8a1vfSs6d+4c9957b/zhD3+IRYsWxbx586Jz585x2GGH1WZWAAAAACgZDdLc6Sc/+UncfPPNkSRJHH300fGrX/0qtt9++/ztTZs2jd/85jdRVVVVa0EBAAAAoJSkKtaee+65uOKKK+LQQw+Nhg0brvactm3bxpQpUzYoHAAAAACUqlQ/Cjpq1Kg47LDDVinVPv/883jooYciIqJBgwbRt2/fDU8IAAAAACUoVbG27777xnvvvbfK8Q8//DD23XffDQ4FAAAAAKUuVbGWJEmUlZWtcvzdd9+Npk2bbnAoAAAAACh16/Uea4ceemhERJSVlcUxxxxT40dBly9fHk899VTssccetZsQAAAAAErQehVrlZWVEfHfV6w1b948GjdunL+toqIivvGNb8QJJ5xQuwkBAAAAoAStV7F2/fXXR0REly5d4owzzvBjnwAAAABstNarWFtp1KhRtZ0DAAAAADJlnYu1XXbZJe67775o1apV7Lzzzqv98IKVZs6cWSvhAAAAAKBUrXOxNnTo0PyHFRx88MGFygMAAAAAmbDOxdoXf/zTj4ICAAAAsLGrl+ZOr732Wrz++uv5r6dPnx4jRoyIq6++utaCAQAAAEApS1Wsfe9734spU6ZERMTChQujf//+MX369PjFL34R559/fq0GBAAAAIBSlKpYe+aZZ6J3794REXHLLbfEDjvsEP/5z39i/PjxccMNN9RmPgAAAAAoSamKtVwul/8gg3//+99x0EEHRUREt27d4q233qq9dAAAAABQolIVaz169Igrr7wyHn744aiuro79998/IiLefPPNaNOmTa0GBAAAAIBSlKpYGz16dFx11VXRr1+/+O53vxs9e/aMiIg777wz/yOiAAAAAPB11iDNnfr16xfvvPNOLFmyJFq1apU/fuKJJ0aTJk1qLRwAAAAAlKpUxVpERP369WuUahERXbp02dA8AAAAAJAJqX4UdNGiRXH00UdHVVVVNGjQIOrXr1/jFwAAAAB83aV6xdoxxxwTr776aowcOTI6duwYZWVltZ0LAAAAAEpaqmLtkUceiYcffjh22mmnWo4DAAAAANmQ6kdBN99880iSpLazAAAAAEBmpCrWxowZE2effXYsWLCgluMAAAAAQDak+lHQI444IpYtWxZbbrllNGnSJMrLy2vc/t5779VKOAAAAAAoVamKtTFjxtRyDAAAAADIllTF2rBhw2o7BwAAAABkSqr3WIuIeOmll+Kcc86J7373u7F48eKIiPjXv/4Vzz77bK2FAwAAAIBSlapYe/DBB2OHHXaIadOmxcSJE2Pp0qUREfHkk0/GqFGjajUgAAAAAJSiVMXa2WefHRdeeGFUV1dHRUVF/vh+++0Xjz32WK2FAwAAAIBSlapYe/rpp+OQQw5Z5fgmm2wS77zzzgaHAgAAAIBSl6pYa9myZbz11lurHJ81a1ZsuummGxwKAAAAAEpdqmLtyCOPjLPOOisWLlwYZWVlsWLFinj00UfjjDPOiB/84Ae1nREAAAAASk6qYu3iiy+Obt26xeabbx5Lly6N7t27x9577x177LFHnHPOObUa8I033ojvf//70aZNm2jcuHHssMMOMWPGjFp9DAAAAABYXw3S3KmioiKuueaaOPfcc+Ppp5+OpUuXxs477xxbb711rYZ7//33Y88994x99903/vWvf0W7du1i7ty50apVq1p9HAAAAABYX+tcrJ122mlrvf2LnwZ62WWXpU/0BaNHj47NN988rr/++vyxrl271sq1AQAAAGBDrHOxNmvWrBpfz5w5Mz7//PPYdtttIyLixRdfjPr160evXr1qLdydd94ZgwYNisMOOywefPDB2HTTTeOkk06KE044Ya33y+Vykcvlai3HF69L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f/zxSYsWLZLFixfXev5CzTBv3rykdevWyZlnnpnMnDkzmTdvXnLHHXes8ZqlNsOKFSuSb3zjG8nee++dTJ8+PXnhhReSE088MenUqVOydOnSouefPn16csYZZyQ333xz0qFDh+R3v/vdKucMGjQouf7665NnnnkmmT17dvKtb32rYPkLNcOoUaOSHj16JG+99Vb+19tvv52Z/BdddFHSpk2b5K677krmz5+f/P3vf0+aNWuWXH755SUxw/e+971k7NixyaxZs5Lnn38+OeaYY5LKysrk9ddfz5/z5z//OfnlL3+ZXHPNNUlEJLNmzSpI9kLOsNLEiROTnj17JlVVVav9fpVq/i/+8//WW28l1113XVJWVpa89NJLJTHDlClTkokTJybPPfdcMm/evGTMmDFJ/fr1k3vuuSd/Tl3+vkx2ZH0HLNQMdbkH2gGLvwOmmaHU9sCs74CFmqEu90A7YPF3wELNUJd7YNZ3wI26WOvdu3dy8skn579evnx5UlVVlVxyySWrPf/www9PhgwZUuPY7rvvnvzoRz9KkuS/vxl26NAh+fWvf52//YMPPkgaNmyY3HzzzSWff3U+/PDDJCKSf//737UT+ksKMcMRRxyRfP/73y9I3tWp7RnmzJmTRETyzDPP1Lhmu3btkmuuuabo+b+oc+fO6/QbxOLFi5OISB588MENibpGhZhh1KhRSc+ePWsx5ZoVIv+QIUOS4447rsaxQw89NDnqqKM2OO/qbMgMSZIkn3/+edK8efPkxhtvXOW2+fPn18lSVagZXn/99WTTTTdNnnnmmXX+dyaNQn4PVho6dGiy3377bXDWNdnQGZIkSXbeeefknHPOSZKk7n9fJjuyvgMmSfb3QDvgfxVzB0yS7O+BWd8BkyT7e6AdsPg7YJJkfw/M+g6YiR8FLYTPPvssnnjiiejfv3/+WL169aJ///4xderU1d5n6tSpNc6PiBg0aFD+/Pnz58fChQtrnFNZWRm77777Gq9ZSvlX9xhXX311VFZWRs+ePWsv/BeuX9szrFixIu6+++7YZpttYtCgQbHJJpvE7rvvHpMmTar1/IWa4dNPP42IiEaNGtW4ZsOGDeORRx4pev40Pvzww4iIaN26da1dc6VCzjB37tyoqqqKLbbYIo466qiC/ChJofLvsccecd9998WLL74YERFPPvlkPPLIIzF48OAN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T3/6U2y33XbRqFGj6NatW/zxj39cZd6//e1v0bdv32jUqFGMHz9+tblWPncHHXRQNG3aNC666KJYvnx5HH/88dG1a9do3LhxbLvttnH55Zfn73PeeefFjTfeGHfccUeUlZVFWVlZPPDAA6v9EYAHH3wwevfuHQ0bNoyOHTvG2WefHZ9//vlqswAAfJE98L/sgcB6SwD+f507d05+97vf1TjWs2fPZNSoUfmvIyJp06ZNcs011yRz5sxJzjnnnKR+/frJc889lyRJksyfPz+JiGSzzTZLbr311uS5555LfvjDHybNmzdP3nnnnSRJkuT9999P2rVrl/zsZz9Lnn/++WTmzJnJgAEDkn333Tf/OH379k2aNWuWnHnmmckLL7yQvPDCC/nbdt111+Smm25KkiRJrr/++qSysjJ/28SJE5Py8vJk7NixyZw5c5Lf/va3Sf369ZP7778/SZIkufPOO5PKysrk888/T5IkSQ4++OCkbdu2yVlnnZUkSZK8/vrrSUQkc+fOTZIkSf76178mHTt2TG677bbk5ZdfTm677bakdevWyQ033FBj3i5duuTPefPNN1f7/EZEsskmmyTXXXdd8tJLLyWvvPJK8tlnnyXnnntu8vjjjycvv/xy8te//jVp0qRJ8re//S1JkiT56KOPksMPPzzZf//9k7feeit56623kk8//TT/uLNmzcrnbtKkSXLSSSclzz//fHL77bcnbdu2rfG9AwBYE3ugPRBIR7EG5K3rQvU///M/Nc7Zfffdkx//+MdJkvy/BePSSy/N357L5ZLNNtssGT16dJIkSXLBBRckAwcOrHGN1157LYmIZM6cOUmS/Heh2nnnnVfJ+PrrrycVFRXJ+++/nyTJqgvVHnvskZxwwgk17nPYYYcl3/rWt5Ik+e8yV69eveTxxx9PVqxYkbRu3Tq55JJLkt133z1Jkv8uUJtuumn+vltuuWV+eVvpggsuSPr06VNj3jFjxqyS9csiIhkxYsRXnnfyyScn3/72t/NfDxs2LBk6dGiNc768UP385z9Ptt1222TFihX5c8aOHZs0a9YsWb58+Vc+JgCwcbMH2gOBdPwoKLDe+vTps8rXzz///BrPadCgQey66675c5588smYMmVKNGvWLP+rW7duERHx0ksv5e/Xq1evVR77zjvvjL322muNnwD1/PPPx5577lnj2J577pl/7JYtW0bPnj3jgQceiKeffjoqKirixBNPjFmzZsXSpUvjwQcfzL9nx8cffxwvvfRSHH/88TWyXnjhhTVyRkTsuuuua3y+vuq8sWPHRq9evaJdu3bRrFmzuPrqq+PVV19dp+t9ce4+ffpEWVlZjbmXLl0ar7/++npdCwBgTeyB9kCgJu92COTVq1cvkiSpcWxD3lh1TZYuXRoHHnhgjB49epXbOnbsmP//TZs2XeX2O++8Mw466KANevx+/frFAw88EA0bNoy+fftG69atY7vttotHHnkkHnzwwTj99NPzOSMirrnmmth9991rXKN+/fo1vl5d1tX58nkTJkyIM844I377299Gnz59onnz5vHrX/86pk2blnY8AID1Zg+0BwLpeMUakNeuXbt466238l8vWbIk5s+fv8p5jz322Cpfb7fddms85/PPP48nnngif84uu+wSzz77bHTp0iW22mqrGr/WtpgsXbo0pkyZEkOHDl3jOdttt108+uijNY49+uij0b179/zXffv2jUceeSTuu+++6NevX0T8d8m6+eab48UXX8wfa9++fVRVVcXLL7+8Ss6uXbuuMcP6ePTRR2OPPfaIk046KXbeeefYaqutVvlb0IqKili+fPlar7PddtvF1KlTayzEjz76aDRv3jw222yzWskKAHx92QPtgUA6ijUgb7/99ou//OUv8fDDD8fTTz8dw4YNW+Vv5CIi/v73v8d1110XL774YowaNSqmT58ew4cPr3HO2LFj4/bbb48XXnghTj755Hj//ffjuOOOi4iIk08+Od5777347ne/G48//ni89NJLce+998axxx671sXhnnvuiW222Sa6dOmyxnPOPPPMuOGGG2LcuHExd+7cuOyyy2LixIlxxhln5M/ZZ5994qOPPoq77rqrxkI1fvz46NixY2yzzTb5c3/5y1/GJZdcEr///e/jxRdfjKeffjquv/76uOyyy9blKf1KW2+9dcyYMSPuvffeePHFF2PkyJHx+OOP1zinS5cu8dRTT8WcOXPinXfeWe3fHp900knx2muvxU9+8pN44YUX4o477ohRo0bFaaedFvXq+U89ALB29kB7IJBScd/iDSglH374YXLEEUckLVq0SDbffPPkhhtuWO2b1o4dOzYZMGBA0rBhw6RLly75Ty5Kkv/3Zqo33XRT0rt376SioiLp3r17/tOYVnrxxReTQw45JGnZsmXSuHHjpFu3bsmIESPyb7rat2/f5NRTT61xn+9///vJL37xixrHvvymtUmSJH/84x+TLbbYIikvL0+22Wab5M9//vMqs/bs2TPp0KFD/ut33303KSsrS4488shVzh0/fnyy0047JRUVFUmrVq2SffbZJ5k4cWKNeVe+eezaRERy++231zj2ySefJMccc0xSWVmZtGzZMvnxj3+cnH322UnPnj3z5yxevDgZMGBA0qxZsyQikilTpqz2cR944IFkt912SyoqKpIOHTokZ511VpLL5b4yFwCAPdAeCKRTliRf+kF6gLUoKyuL22+/PQ4++ODV3r5gwYLo2rVrzJo1K3baaadae9zPP/882rdvH//617+id+/etXZdAADWjT0QYFVeFwpkwnvvvRc//elPY7fddit2FAAA6pA9EChlPhUUyIRNNtkkzjnnnGLHAACgjtkDgVLmR0EBAAAAIAU/CgoAAAAAKSjWAAAAACAFxRoAAAAApKBYAwAAAIAUFGsAAAAAkIJiDQAAAABSUKwBAAAAQAqKNQAAAABI4f8DXPEAac/Bb5sAAAAASUVORK5CYII="},"metadata":{}}]},{"cell_type":"code","source":"df_no_sarc = df.where(df[\"label\"] == 0)\ndf_no_sarc = df_no_sarc.where(df_no_sarc[\"symbol_to_word_ratio\"] <= 11)\ndf_sarc = df.where(df[\"label\"] == 1)\ndf_sarc = df_sarc.where(df_sarc[\"symbol_to_word_ratio\"] <= 11)\ndf_no_sarc = df_no_sarc[np.isfinite(df_no_sarc[\"symbol_to_word_ratio\"])]\ndf_sarc = df_sarc[np.isfinite(df_sarc[\"symbol_to_word_ratio\"])]\nplt.style.use('_mpl-gallery-nogrid')\n\nhist_df_no_sarc, bin_edges_no = np.histogram(df_no_sarc[\"symbol_to_word_ratio\"].values, density=True)\nhist_df_sarc, bin_edges = np.histogram(df_sarc[\"symbol_to_word_ratio\"].values, density=True)\n# plot:\nfig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))\n\nbin_mids_no = [(bin_edges_no[i+1] + bin_edges_no[i])/2 for i in range(len(bin_edges_no) - 1)]\nbin_mids = [(bin_edges[i+1] + bin_edges[i])/2 for i in range(len(bin_edges) - 1)]\nax1.bar(bin_mids_no, hist_df_no_sarc, width=bin_edges_no[1] - bin_edges_no[0])\nax2.bar(bin_mids, hist_df_sarc, width=bin_edges[1] - bin_edges[0])\nax1.set_title(\"Hist no sarcasm\")\nax1.set_ylabel(\"density\")\nax1.set_xlabel(\"symbols/words ratio\")\nax1.set_xticks(bin_edges_no)\nax1.grid(True)\nax2.set_title(\"Hist sarcasm\")\nax2.set_xlabel(\"symbols/words ratio\")\nax2.set_xticks(bin_edges)\nax2.grid(True)\nplt.show()","metadata":{"id":"HkuIzb1JF1U1","execution":{"iopub.status.busy":"2024-04-18T11:28:04.804629Z","iopub.execute_input":"2024-04-18T11:28:04.804912Z","iopub.status.idle":"2024-04-18T11:28:05.795170Z","shell.execute_reply.started":"2024-04-18T11:28:04.804888Z","shell.execute_reply":"2024-04-18T11:28:05.794061Z"},"trusted":true},"execution_count":22,"outputs":[{"output_type":"display_data","data":{"text/plain":"
","image/png":"iVBORw0KGgoAAAANSUhEUgAABNoAAAI6CAYAAADxHyXyAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABWkUlEQVR4nO3de5hVdaE//vdwvyuIgqKB4hUvoBCGl7RCyMxLnZTMk4imPUc5ahz7ppWSt/BKmKGkhXpM01LrlJYykpgWSV5I80JpIqYCaioKP2Vk1u+PjnOcABlwzezZ+Ho9zzyw116X92fPDHzmPXutVVMURREAAAAA4H1pU+kAAAAAALA+ULQBAAAAQAkUbQAAAABQAkUbAAAAAJRA0QYAAAAAJVC0AQAAAEAJFG0AAAAAUAJFGwAAAACUQNEGAAAAACVQtAHrZMCAATnqqKMqHQMAgCpg7gh8UCjagFx99dWpqanJ/fffv8rn99133+y0007v+zi/+tWv8q1vfet97wcAgMoxdwRYPUUbsE7mzZuXK6+8cq22+dWvfpUzzzyzmRIBANBamTsCHxTtKh0AqE4dO3asdISq8Pbbb6e+vj4dOnSodBQAgIqp9rljfX19li9fnk6dOlU6CtDKeUcbsE7+9TobdXV1OfPMM7PNNtukU6dO2WijjbLXXnultrY2SXLUUUdl6tSpSZKampqGjzUd49Of/nTuvffeDB8+PJ06dcpWW22V//7v/15p3b/97W859NBD06tXr3Tp0iUf+chHcttttzVpLLW1tdlrr72y4YYbplu3btluu+3y9a9/veH55cuX54wzzsjQoUOzwQYbpGvXrtl7771z1113NdrP/PnzU1NTk4suuihTpkzJwIED07Fjxzz22GNJkieeeCKHHXZYNt5443Tu3DnbbbddvvGNbzRs/8wzz+T444/Pdtttl86dO2ejjTbKoYcemvnz5zc6zppe63de727dumXBggX59Kc/nW7duqVfv34Nn4NHHnkkH//4x9O1a9f0798/119/fZNeKwCAddESc8f7778/o0ePTu/evdO5c+dsueWWOfrooxutc9FFF2WPPfbIRhttlM6dO2fo0KG56aabVtpXTU1Nxo8fn+uuuy477rhjOnbsmNtvvz1J8txzz+WYY47JZpttlo4dO2bLLbfMf/zHf2T58uVJkn/84x855ZRTsvPOO6dbt27p0aNH9t9///zpT39a6TiXXnppdtxxx3Tp0iU9e/bMsGHDGs3LvvWtb6WmpiZ/+ctf8u///u/ZYIMNsvHGG+f0009PURR59tlnc/DBB6dHjx7p27dvLr744iZ8NoDm5B1tQIPXXnstL7300krL6+rq1rjtt771rUyaNClf+tKXMnz48CxZsiT3339/Hnzwwey333758pe/nOeffz61tbW59tprm5zpySefzOc+97kcc8wxGTt2bKZPn56jjjoqQ4cOzY477pgkWbRoUfbYY48sW7YsJ554YjbaaKNcc801Oeigg3LTTTflM5/5zGr3/+ijj+bTn/50dtlll5x11lnp2LFjnnzyyfzud79rWGfJkiX5wQ9+kMMPPzzHHntsXn/99fzwhz/M6NGjM2fOnAwZMqTRPq+66qq8+eabOe6449KxY8f06tUrDz/8cPbee++0b98+xx13XAYMGJCnnnoqv/zlL3PuuecmSf74xz/m97//fT7/+c9n8803z/z583P55Zdn3333zWOPPZYuXbo06bV+x4oVK7L//vvnox/9aC644IJcd911GT9+fLp27ZpvfOMbOeKII/LZz34206ZNy5FHHpkRI0Zkyy23bPLnBgD4YGtNc8fFixdn1KhR2XjjjXPqqadmww03zPz583PLLbc0Wu+SSy7JQQcdlCOOOCLLly/PDTfckEMPPTS33nprDjjggEbr/uY3v8lPfvKTjB8/Pr17986AAQPy/PPPZ/jw4Xn11Vdz3HHHZfvtt89zzz2Xm266KcuWLUuHDh3yt7/9LT//+c9z6KGHZsstt8yiRYvy/e9/P/vss08ee+yxbLbZZkmSK6+8MieeeGI+97nP5aSTTsqbb76Zhx9+OPfdd1++8IUvNMoyZsyY7LDDDjnvvPNy22235ZxzzkmvXr3y/e9/Px//+Mdz/vnn57rrrsspp5ySD3/4w/noRz+6xtcMaCYF8IF31VVXFUne82PHHXdstE3//v2LsWPHNjwePHhwccABB7zncU444YRibf7Z6d+/f5Gk+O1vf9uwbPHixUXHjh2L//qv/2pYdvLJJxdJinvuuadh2euvv15sueWWxYABA4oVK1as9hjf+c53iiTFiy++uNp13n777eKtt95qtOyVV14p+vTpUxx99NENy55++ukiSdGjR49i8eLFjdb/6Ec/WnTv3r145plnGi2vr69v+PuyZctWOvbs2bOLJMV///d/Nyxryms9duzYIknx7W9/u1Hmzp07FzU1NcUNN9zQsPyJJ54okhQTJ058z30CABRF65w7/uxnPyuSFH/84x/fc71/nW8tX7682GmnnYqPf/zjjZYnKdq0aVM8+uijjZYfeeSRRZs2bVZ5nHfmdW+++eZK88+nn3666NixY3HWWWc1LDv44INXep3+1cSJE4skxXHHHdew7O233y4233zzoqampjjvvPMalr8z13v36wy0PKeOAg2mTp2a2tralT522WWXNW674YYb5tFHH81f//rXUjMNGjQoe++9d8PjjTfeONttt13+9re/NSz71a9+leHDh2evvfZqWNatW7ccd9xxmT9/fsOpm6vLnST/8z//k/r6+lWu07Zt24ZrrNXX1+cf//hH3n777QwbNiwPPvjgSuv/27/9WzbeeOOGxy+++GJ++9vf5uijj86HPvShRuu++xSIzp07N/y9rq4uL7/8crbeeutsuOGGjY6zNq/1l770pUbbbbfddunatWsOO+ywhuXbbbddNtxww0avKQDAmrSmueM7c7pbb731Pd9R9+751iuvvJLXXnste++99yrndPvss08GDRrU8Li+vj4///nPc+CBB2bYsGErrf/OvK5jx45p0+afP2qvWLEiL7/8csPlSf51Tvf3v/89f/zjH9c4vnfP6dq2bZthw4alKIocc8wxjfb3r/NkoOUp2oAGw4cPz8iRI1f66Nmz5xq3Peuss/Lqq69m2223zc4775yvfvWrefjhh993pn8tppKkZ8+eeeWVVxoeP/PMM9luu+1WWm+HHXZoeH51xowZkz333DNf+tKX0qdPn3z+85/PT37yk5VKt2uuuSa77LJLwzVENt5449x222157bXXVtrnv55++c5kZ023uf///r//L2eccUa22GKLdOzYMb17987GG2+cV199tdFxmvpad+rUqVHhlyQbbLBBNt9885WucbLBBhs0ek0BANakNc0d99lnn/zbv/1bzjzzzPTu3TsHH3xwrrrqqrz11luN1rv11lvzkY98JJ06dUqvXr2y8cYb5/LLL2/SnO7FF1/MkiVL1jinq6+vz3e+851ss802jeZ0Dz/8cKPjfO1rX0u3bt0yfPjwbLPNNjnhhBMaXb7k3f51TrzBBhukU6dO6d2790rLzemgshRtQCk++tGP5qmnnsr06dOz00475Qc/+EF22223/OAHP3hf+23btu0qlxdF8b72+47OnTvnt7/9be6888588YtfzMMPP5wxY8Zkv/32y4oVK5IkP/rRj3LUUUdl4MCB+eEPf5jbb789tbW1+fjHP77Kd8G9+zela+M///M/c+655+awww7LT37yk8yYMSO1tbXZaKONGh2nqa/16l675n5NAQDWpOy5Y01NTW666abMnj0748ePz3PPPZejjz46Q4cOzRtvvJEkueeee3LQQQelU6dOueyyy/KrX/0qtbW1+cIXvrDKedC6zum+/e1vZ8KECfnoRz+aH/3oR7njjjtSW1ubHXfcsdGcbocddsi8efNyww03ZK+99srNN9+cvfbaKxMnTlxpn6uav5nTQeukaANK06tXr4wbNy4//vGP8+yzz2aXXXbJt771rYbn13SnqHXVv3//zJs3b6XlTzzxRMPz76VNmzb5xCc+kcmTJ+exxx7Lueeem9/85jcNdxW96aabstVWW+WWW27JF7/4xYwePTojR47Mm2++2aR8W221VZLkz3/+83uud9NNN2Xs2LG5+OKL87nPfS777bdf9tprr7z66qsrrbum1xoAoLVrjrnjRz7ykZx77rm5//77c9111+XRRx/NDTfckCS5+eab06lTp9xxxx05+uijs//++2fkyJFN3vfGG2+cHj16NGlO97GPfSw//OEP8/nPfz6jRo3KyJEjVzmn69q1a8aMGZOrrroqCxYsyAEHHJBzzz23yfNMoPVRtAGlePnllxs97tatW7beeutGb9fv2rVrkqxykvF+fOpTn8qcOXMye/bshmVLly7NFVdckQEDBjS6tsa/+sc//rHSsnfuIvpO9nd+W/ju3w7ed999jY73XjbeeON89KMfzfTp07NgwYJGz717n23btl3pN5CXXnppwzvr3tGU1xoAoDUre+74yiuvrDSPWtWcrqamptHcav78+fn5z3/epMxt2rTJIYcckl/+8pe5//77V3r+neOvak7305/+NM8991yjZf/6GnTo0CGDBg1KURRNunMr0Dq1q3QAYP0waNCg7Lvvvhk6dGh69eqV+++/PzfddFPGjx/fsM7QoUOTJCeeeGJGjx6dtm3b5vOf//z7Pvapp56aH//4x9l///1z4oknplevXrnmmmvy9NNP5+abb264GO2qnHXWWfntb3+bAw44IP3798/ixYtz2WWXZfPNN2+4ucKnP/3p3HLLLfnMZz6TAw44IE8//XSmTZuWQYMGNZyKsCbf/e53s9dee2W33XbLcccdly233DLz58/Pbbfdlrlz5zYc59prr80GG2yQQYMGZfbs2bnzzjuz0UYbNdpXU15rAIDWrOy54zXXXJPLLrssn/nMZzJw4MC8/vrrufLKK9OjR4986lOfSpIccMABmTx5cj75yU/mC1/4QhYvXpypU6dm6623bvL14b797W9nxowZ2WeffXLcccdlhx12yAsvvJCf/vSnuffee7Phhhvm05/+dM4666yMGzcue+yxRx555JFcd911DWc5vGPUqFHp27dv9txzz/Tp0yePP/54vve97+WAAw5I9+7d1+VlBVoBRRtQihNPPDG/+MUvMmPGjLz11lvp379/zjnnnHz1q19tWOezn/1s/vM//zM33HBDfvSjH6UoilKKtj59+uT3v/99vva1r+XSSy/Nm2++mV122SW//OUvc8ABB7zntgcddFDmz5+f6dOn56WXXkrv3r2zzz775Mwzz8wGG2yQJDnqqKOycOHCfP/7388dd9yRQYMG5Uc/+lF++tOfZtasWU3KOHjw4PzhD3/I6aefnssvvzxvvvlm+vfv3+jun5dccknatm2b6667Lm+++Wb23HPP3HnnnRk9enSjfTXltQYAaM3Knjvus88+mTNnTm644YYsWrQoG2ywQYYPH57rrruu4aYGH//4x/PDH/4w5513Xk4++eRsueWWOf/88zN//vwmF239+vXLfffdl9NPPz3XXXddlixZkn79+mX//fdPly5dkiRf//rXs3Tp0lx//fW58cYbs9tuu+W2227Lqaee2mhfX/7yl3Pddddl8uTJeeONN7L55pvnxBNPzDe/+c11eUmBVqKmcKVEAAAAAHjfXKMNAAAAAEqgaAMAAACAEijaAAAAAKAEijYAAAAAKIGiDQAAAABKoGgDAAAAgBK0q3SA5lRfX5/nn38+3bt3T01NTaXjAABVriiKvP7669lss83Spo3fV7Zm5oEAQFnWZg64Xhdtzz//fLbYYotKxwAA1jPPPvtsNt9880rH4D2YBwIAZWvKHHC9Ltq6d++e5J8vRI8ePZrlGHV1dZkxY0ZGjRqV9u3bN8sxmlO150+qfwzVnj8xhtag2vMn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AwAAAIASKNoAAAAAoASKNgAAAAAogaINAAAAAEqwTkXbXXfdVXYOAAAAAKhq61S0ffKTn8zAgQNzzjnn5Nlnny07EwAAAABUnXUq2p577rmMHz8+N910U7baaquMHj06P/nJT7J8+fKy8wEAAABAVVinoq137975yle+krlz5+a+++7Ltttum+OPPz6bbbZZTjzxxPzpT38qOycAAAAAtGrv+2YIu+22W0477bSMHz8+b7zxRqZPn56hQ4dm7733zqOPPlpGRgAAAABo9da5aKurq8tNN92UT33qU+nfv3/uuOOOfO9738uiRYvy5JNPpn///jn00EPLzAoAAAAArVa7ddnoP//zP/PjH/84RVHki1/8Yi644ILstNNODc937do1F110UTbbbLPSggIAAABAa7ZORdtjjz2WSy+9NJ/97GfTsWPHVa7Tu3fv3HXXXe8rHAAAAABUi3U6dXTixIk59NBDVyrZ3n777fz2t79NkrRr1y777LPP+08IAAAAAFVgnYq2j33sY/nHP/6x0vLXXnstH/vYx953KAAAAACoNutUtBVFkZqampWWv/zyy+natev7DgUAAAAA1WatrtH22c9+NklSU1OTo446qtGpoytWrMjDDz+cPfbYo9yEAAAAAFAF1qpo22CDDZL88x1t3bt3T+fOnRue69ChQz7ykY/k2GOPLTchAAAAAFSBtSrarrrqqiTJgAEDcsoppzhNFAAAAAD+11oVbe+YOHFi2TkAAAAAoKo1uWjbbbfdMnPmzPTs2TO77rrrKm+G8I4HH3ywlHAAAAAAUC2aXLQdfPDBDTc/OOSQQ5orDwAAAABUpSYXbe8+XdSpowAAAADQWJt12ejZZ5/N3//+94bHc+bMycknn5wrrriitGAAAAAAUE3WqWj7whe+kLvuuitJsnDhwowcOTJz5szJN77xjZx11lmlBgQAAACAarBORduf//znDB8+PEnyk5/8JDvvvHN+//vf57rrrsvVV19dZj4AAAAAqArrVLTV1dU13BjhzjvvzEEHHZQk2X777fPCCy+Ulw4AAAAAqsQ6FW077rhjpk2blnvuuSe1tbX55Cc/mSR5/vnns9FGG5UaEAAAAACqwToVbeeff36+//3vZ999983hhx+ewYMHJ0l+8YtfNJxSCgAAAAAfJO3WZaN99903L730UpYsWZKePXs2LD/u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ijYAAAAAKIGiDQAAAABKoGgDAAAAgBIo2gAAAACgBIo2AAAAACiBog0AAAAASqBoAwAAAIASKNoAAAAAoASKNgAAAAAogaINAAAAAEqgaAMAAACAEijaAAAAAKAEijYAAAAAKIGiDQAAAABKoGgDAAAAgBIo2gAAAACgBIo2AAAAACiBog0AAAAASqBoAwAAAIASKNoAAAAAoASKNgAAAAAogaINAAAAAEqgaAMAAACAEijaAAAAAKAEijYAAAAAKIGiDQAAAABKoGgDAAAAgBIo2gAAAACgBO0qHQCAcpw0u11Omj2j0jHel0tGVDoBAADAuvOONgAAAAAogaINAAAAAEqgaAMAAACAEijaAAAAAKAEboYAAAAAVazab4rlhlisT7yjDQAAAABK4B1tVP1vPwAAAABaA+9oAwAAAIASKNoAAAAAoASKNgAAAAAogaINAAAAAErgZggAtBrVfnMWt6YHAIAPNu9oAwAAAIASKNoAAAAAoASKNgAAAAAogWu0AQDAB1S1XxsTWD+sD/8WuVYv71C0AUBJ1odJYlL9YzDRBQCgUpw6CgAAAAAl8I42AAAAgPdhfTizwVkB5WgVRdvUqVNz4YUXZuHChRk8eHAuvfTSDB8+fLXr//SnP83pp5+e+fPnZ5tttsn555+fT33qUy2YuLH14RsKAKClVfscEADWJ9XebbSWorDip47eeOONmTBhQiZOnJgHH3wwgwcPzujRo7N48eJVrv/73/8+hx9+eI455pg89NBDOeSQQ3LIIYfkz3/+cwsnBwBgXZkDAgDro4oXbZMnT86xxx6bcePGZdCgQZk2bVq6dOmS6dOnr3L9Sy65JJ/85Cfz1a9+NTvssEPOPvvs7Lbbbvne977XwskBAFhX5oAAwPqooqeOLl++PA888EBOO+20hmVt2rTJyJEjM3v27FVuM3v27EyYMKHRstGjR+fnP//5SusWRZEk+cc//pG6urrygr9LXV1d6t9a1iz7BgDW3rJlb+fll19O+/btS9/366+/nuT/5hism+aeAybNPw+sq6vLf85anv+cterjAwAtq7XMAStatL300ktZsWJF+vTp02h5nz598sQTT6xym4ULF65y/YULF6607jsvxJZbbllSYgCgtftCCxzj9ddfzwYbbNACR1o/NfccMDEPBIAPmtYyB2wVN0NoLptttlmeffbZdO/ePTU1NZWOAwBUuaIo8vrrr2ezzTardBTWwDwQACjL2swBK1q09e7dO23bts2iRYsaLV+0aFH69u27ym369u3b5PXbtGmTzTffvLzAAMAHnneyvX/NPQdMzAMBgHI1dQ5Y0ZshdOjQIUOHDs3MmTMbltXX12fmzJkZMWLV92UdMWJEo/WTpLa2drXrAwDQupgDAgDrq4qfOjphwoSMHTs2w4YNy/DhwzNlypQsXbo048aNS5IceeSR6devXyZNmpQkOemkk7LPPvvk4osvzgEHHJAbbrgh999/f6644opKDgMAgLVgDggArI8qXrSNGTMmL774Ys4444wsXLgwQ4YMye23395wsdsFCxakTZv/e+PdHnvskeuvvz7f/OY38/Wvfz3bbLNNfv7zn2ennXaq1BAAAFhL5oAAwPqooqeOvmP8+PF55pln8tZbb+W+++7L7rvv3vDcrFmzcvXVVzda/9BDD828efPy1ltv5c9//nM+9alPtXDi5Le//W0OPPDAbLbZZqmpqVntreVbq0mTJuXDH/5wunfvnk022SSHHHJI5s2bV+lYa+Xyyy/PLrvskh49eqRHjx4ZMWJEfv3rX1c61jo777zzUlNTk5NPPrnSUZrsW9/6Vmpqahp9bL/99pWOtVaee+65/Pu//3s22mijdO7cOTvvvHPuv//+SsdqsgEDBqz0OaipqckJJ5xQ6WhNsmLFipx++unZcsst07lz5wwcODBnn312k26b3Zq8/vrrOfnkk9O/f/907tw5e+yxR/74xz9WOtZqren/sKIocsYZZ2TTTTdN586dM3LkyPz1r3+tTNhVWFP+W265JaNGjcpGG22UmpqazJ07tyI5WTNzwJZnDtj6mANWTjXPA6t9DpisH/NAc8CWVw3zwFZRtFWjpUuXZvDgwZk6dWqlo6yTu+++OyeccEL+8Ic/pLa2NnV1dRk1alSWLl1a6WhNtvnmm+e8887LAw88kPvvvz8f//jHc/DBB+fRRx+tdLS19sc//jHf//73s8suu1Q6ylrbcccd88ILLzR83HvvvZWO1GSvvPJK9txzz7Rv3z6//vWv89hjj+Xiiy9Oz549Kx2tyf74xz82ev1ra2uT/POH0Wpw/vnn5/LLL8/3vve9PP744zn//PNzwQUX5NJLL610tLXypS99KbW1tbn22mvzyCOPZNSoURk5cmSee+65SkdbpTX9H3bBBRfku9/9bqZNm5b77rsvXbt2zejRo/Pmm2+2cNJVW1P+pUuXZq+99sr555/fwsn4IDAHrDxzwNahmueASfXPA6t9DpisH/NAc8CWVxXzwIL3LUnxs5/9rNIx3pfFixcXSYq777670lHel549exY/+MEPKh1jrbz++uvFNttsU9TW1hb77LNPcdJJJ1U6UpNNnDixGDx4cKVjrLOvfe1rxV577VXpGKU66aSTioEDBxb19fWVjtIkBxxwQHH00Uc3WvbZz362OOKIIyqUaO0tW7asaNu2bXHrrbc2Wr7bbrsV3/jGNyqUqun+9f+w+vr6om/fvsWFF17YsOzVV18tOnbsWPz4xz+uQML39l7/Bz/99NNFkuKhhx5q0Ux8cJgDth7mgC2r2ueARbH+zQOrbQ5YFNU/DzQHrLzWOg/0jjaSJK+99lqSpFevXhVOsm5WrFiRG264IUuXLq26u4+dcMIJOeCAAzJy5MhKR1knf/3rX7PZZptlq622yhFHHJEFCxZUOlKT/eIXv8iwYcNy6KGHZpNNNsmuu+6aK6+8stKx1tny5cvzox/9KEcffXRqamoqHadJ9thjj8ycOTN/+ctfkiR/+tOfcu+992b//fevcLKme/vtt7NixYp06tSp0fLOnTtX3W/3k+Tpp5/OwoULG/2btMEGG2T33XfP7NmzK5gMaA7mgJVjDlhZ69M8sBrngEn1zwPNAVmdit8Mgcqrr6/PySefnD333LPqLij8yCOPZMSIEXnzzTfTrVu3/OxnP8ugQYMqHavJbrjhhjz44IOt+jz+97L77rvn6quvznbbbZcXXnghZ555Zvbee+/8+c9/Tvfu3Ssdb43+9re/5fLLL8+ECRPy9a9/PX/84x9z4oknpkOHDhk7dmyl4621n//853n11Vdz1FFHVTpKk5166qlZsmRJtt9++7Rt2zYrVqzIueeemyOOOKLS0Zqse/fuGTFiRM4+++zssMMO6dOnT3784x9n9uzZ2XrrrSsdb60tXLgwSRouSP+OPn36NDwHrB/MASvHHLDy1qd5YDXOAZPqnweaA7I6ijZywgkn5M9//nNVtu7bbbdd5s6dm9deey033XRTxo4dm7vvvrsqJlrPPvtsTjrppNTW1q70W5Bq8e7fNu2yyy7Zfffd079///zkJz/JMcccU8FkTVNfX59hw4bl29/+dpJk1113zZ///OdMmzat6iZYSfLDH/4w+++/fzbbbLNKR2myn/zkJ7nuuuty/fXXZ8cdd8zcuXNz8sknZ7PNNquqz8G1116bo48+Ov369Uvbtm2z22675fDDD88DDzxQ6WgAq2UOWBnmgK3D+jQPrMY5YLJ+zAPNAVkVp45+wI0fPz633npr7rrrrmy++eaVjrPWOnTokK233jpDhw7NpEmTMnjw4FxyySWVjtUkDzzwQBYvXpzddtst7dq1S7t27XL33Xfnu9/9btq1a5cVK1ZUOuJa23DDDbPtttvmySefrHSUJtl0001XmpDvsMMOVXfqQ5I888wzufPOO/OlL32p0lHWyle/+tWceuqp+fznP5+dd945X/ziF/OVr3wlkyZNqnS0tTJw4MDcfffdeeONN/Lss89mzpw5qaury1ZbbVXpaGutb9++SZJFixY1Wr5o0aKG54DqZw5YOeaArcP6Mg+s1jlgsn7MA80BWRVF2wdUURQZP358fvazn+U3v/lNttxyy0pHKkV9fX3eeuutSsdokk984hN55JFHMnfu3IaPYcOG5YgjjsjcuXPTtm3bSkdca2+88UaeeuqpbLrpppWO0iR77rln5s2b12jZX/7yl/Tv379CidbdVVddlU022SQHHHBApaOslWXLlqVNm8b/FbVt2zb19fUVSvT+dO3aNZtuumleeeWV3HHHHTn44IMrHWmtbbnllunbt29mzpzZsGzJkiW57777qu76R8DKzAErzxywdVhf5oHVOgdM1q95oDkg7+bU0XX0xhtvNPqNzdNPP525c+emV69e+dCHPlTBZE1zwgkn5Prrr8///M//pHv37g3nXG+wwQbp3LlzhdM1zWmnnZb9998/H/rQh/L666/n+uuvz6xZs3LHHXdUOlqTdO/efaXroXTt2jUbbbRR1Vwn5ZRTTsmBBx6Y/v375/nnn8/EiRPTtm3bHH744ZWO1iRf+cpXsscee+Tb3/52DjvssMyZMydXXHFFrrjiikpHWyv19fW56qqrMnbs2LRrV13/rB944IE599xz86EPfSg77rhjHnrooUyePDlHH310paOtlTvuuCNFUWS77bbLk08+ma9+9avZfvvtM27cuEpHW6U1/R928skn55xzzsk222yTLbfcMqeffno222yzHHLIIZUL/S5ryv+Pf/wjCxYsyPPPP58kDT9I9e3b129ked/MASvPHLDyqn0OmKwf88BqngMm68c80Byw5VXFPLDF73O6nrjrrruKJCt9jB07ttLRmmRV2ZMUV111VaWjNdnRRx9d9O/fv+jQoUOx8cYbF5/4xCeKGTNmVDrW+1Jtt3YfM2ZMsemmmxYdOnQo+vXrV4wZM6Z48sknKx1rrfzyl78sdtppp6Jjx47F9ttvX1xxxRWVjrTW7rjjjiJJMW/evEpHWWtLliwpTjrppOJDH/pQ0alTp2KrrbYqvvGNbxRvvfVWpaOtlRtvvLHYaqutig4dOhR9+/YtTjjhhOLVV1+tdKzVWtP/YfX19cXpp59e9OnTp+jYsWPxiU98olV9fa0p/1VXXbXK5ydOnFjR3KwfzAErzxyw8taHOWBRVP88sJrngEWxfswDzQFbXjXMA2uKoijKLO4AAAAA4IPINdoAAAAAoASKNgAAAAAogaINAAAAAEqgaAMAAACAEijaAAAAAKAEijYAAAAAKIGiDQAAAABKoGgDAAAAgBIo2oAWM2DAgEyZMuV97eNb3/pWhgwZUkqeltSacs+aNSs1NTV59dVXKx0FAPgAMAccUukYScwBoaUo2oD13jXXXJO99tqr0jEqYt99983JJ5/caNkee+yRF154IRtssEFlQgEAtABzwJMbLTMHhJahaAPWe//zP/+Tgw46qEWOVVdX1+qP06FDh/Tt2zc1NTUlJgIAaF3MARszB4SWoWiDD6ibbropO++8czp37pyNNtooI0eOzNKlS/Pb3/427du3z8KFCxutf/LJJ2fvvfdOklx99dXZcMMNc+utt2a77bZLly5d8rnPfS7Lli3LNddckwEDBqRnz5458cQTs2LFikb7ef3113P44Yena9eu6devX6ZOndro+QULFuTggw9Ot27d0qNHjxx22GFZtGjRascxa9asDB8+PF27ds2GG26YPffcM88880zD82+++WZmzJiRgw46KN/73vey0047NTz385//PDU1NZk2bVrDspEjR+ab3/xmw+PLL788AwcOTIcOHbLddtvl2muvbXT8mpqaXH755TnooIPStWvXnHvuuUmS8847L3369En37t1zzDHH5M0331yr3O82f/781NTU5MYbb8w+++yTTp065brrrsvLL7+cww8/PP369UuXLl2y884758c//nHDdkcddVTuvvvuXHLJJampqUlNTU3mz5+/ytMGbr755uy4447p2LFjBgwYkIsvvni1rzkAUL3MAc0BzQGhmRXAB87zzz9ftGvXrpg8eXLx9NNPFw8//HAxderU4vXXXy+Koii23Xbb4oILLmhYf/ny5UXv3r2L6dOnF0VRFFdddVXRvn37Yr/99isefPDB4u677y422mijYtSoUcVhhx1WPProo8Uvf/nLokOHDsUNN9zQsJ/+/fsX3bt3LyZNmlTMmzev+O53v1u0bdu2mDFjRlEURbFixYpiyJAhxV577VXcf//9xR/+8Idi6NChxT777NOwj4kTJxaDBw8uiqIo6urqig022KA45ZRTiieffLJ47LHHiquvvrp45plnGta/9dZbi2233bYoiqJ4+OGHi5qammLx4sVFURTFySefXPTu3bsYM2ZMwzi7dOlS1NbWFkVRFLfcckvRvn37YurUqcW8efOKiy++uGjbtm3xm9/8pmH/SYpNNtmkmD59evHUU08VzzzzTHHjjTcWHTt2LH7wgx8UTzzxRPGNb3yj6N69+1rlfrenn366SFIMGDCguPnmm4u//e1vxfPPP1/8/e9/Ly688MLioYceKp566qmG1/O+++4riqIoXn311WLEiBHFscceW7zwwgvFCy+8ULz99tvFXXfdVSQpXnnllaIoiuL+++8v2rRpU5x11lnFvHnziquuuqro3LlzcdVVVzXtCwoAqArmgOaA5oDQ/BRt8AH0wAMPFEmK+fPnr/L5888/v9hhhx0aHt98881Ft27dijfeeKMoin9OspIUTz75ZMM6X/7yl4suXbo0TNSKoihGjx5dfPnLX2543L9//+KTn/xko2ONGTOm2H///YuiKIoZM2YUbdu2LRYsWNDw/KOPPlokKebMmVMUReNJ1ssvv1wkKWbNmrXasR577LHFKaecUhRFUdTX1xcbbbRR8dOf/rQoiqIYMmRIMWnSpKJv375FURTFvffeW7Rv375YunRpURRFscceexTHHntso/0deuihxac+9amGx0mKk08+udE6I0aMKI4//vhGy3bfffe1yv1u70yypkyZssZ1DzjggOK//uu/Gh7vs88+xUknndRonX+dZH3hC18o9ttvv0brfPWrXy0GDRrUpHwAQHUwBzQHNAeE5ufUUfgAGjx4cD7xiU9k5513zqGHHporr7wyr7zySsPzRx11VJ588sn84Q9/SPLP0wQOO+ywdO3atWGdLl26ZODAgQ2P+/TpkwEDBqRbt26Nli1evLjRsUeMGLHS48cffzxJ8vjjj2eLLbbIFlts0fD8oEGDsuGGGzas8269evXKUUcdldGjR+fAAw/MJZdckhdeeKHh+aIo8stf/rLh2hw1NTX56Ec/mlmzZuXVV1/NY489luOPPz5vvfVWnnjiidx999358Ic/nC5dujTk2XPPPRsdc88991wpy7Bhwxo9fvzxx7P77ruvdtxryr06/3qcFStW5Oyzz87OO++cXr16pVu3brnjjjuyYMGCNe7rX/Ouapx//etfVzrtAwCoXuaA5oD/mtccEMqnaIMPoLZt26a2tja//vWvM2jQoFx66aXZbrvt8vTTTydJNtlkkxx44IG56qqrsmjRovz617/O0Ucf3Wgf7du3b/S4pqZmlcvq6+ubdSxXXXVVZs+enT322CM33nhjtt1224bJ4Zw5c/L2229njz32aFh/3333zaxZs3LPPfdk1113TY8ePRomXnfffXf22Weftc7w7slnGbmbepwLL7wwl1xySb72ta/lrrvuyty5czN69OgsX758rfMAAOs/c0BzQKD5KdrgA6qmpiZ77rlnzjzzzDz00EPp0KFDfvaznzU8/6UvfSk33nhjrrjiigwcOHCl33atq3+dSPzhD3/IDjvskCTZYYcd8uyzz+bZZ59teP6xxx7Lq6++mkGDBq12n7vuumtOO+20/P73v89OO+2U66+/Psk/7zR1wAEHpG3btg3r7rPPPnnsscfy05/+NPvuu2+Sf0687rzzzvzud79rWPZOnt/97neNjvW73/3uPbO8s9199933nuN+r9xN9bvf/S4HH3xw/v3f/z2DBw/OVlttlb/85S+N1unQocMafyO5unFuu+22jV47AKD6mQOaA747rzkglK9dpQMALe++++7LzJkzM2rUqGyyySa577778uKLLzZMdpJk9OjR6dGjR84555ycddZZpR37d7/7XS644IIccsghqa2tzU9/+tPcdtttSf55t6edd945RxxxRKZMmZK33347xx9/fPbZZ5+V3jKfJE8//XSuuOKKHHTQQdlss80yb968/PWvf82RRx6ZJPnFL36xUvZddtklPXv2zPXXX59bb701yT8nWaecckrDxPMdX/3qV3PYYYdl1113zciRI/PLX/4yt9xyS+688873HONJJ52Uo446KsOGDcuee+6Z6667Lo8++mi22mqrJuVuqm222SY33XRTfv/736dnz56ZPHlyFi1a1GgSOGDAgNx3332ZP39+unXrll69eq20n//6r//Khz/84Zx99tkZM2ZMZs+ene9973u57LLL1ioPANC6mQOaA76bOSA0k0pfJA5oeY899lgxevToYuONNy46duxYbLvttsWll1660nqnn3560bZt2+L5559vtPyqq64qNthgg0bL3n2B2neMHTu2OPjggxse9+/fvzjzzDOLQw89tOjSpUvRt2/f4pJLLmm0zTPPPFMcdNBBRdeuXYvu3bsXhx56aLFw4cJVHmfhwoXFIYccUmy66aZFhw4div79+xdnnHFGsWLFiuLJJ58sOnbs2HDx3nc7+OCDi3bt2jVctHfFihVFz549i4985CMrrXvZZZcVW221VdG+ffti2223Lf77v/+70fNJip/97GcrbXfuuecWvXv3Lrp161aMHTu2+H//7/81KfeqvHMh3IceeqjR8pdffrk4+OCDi27duhWbbLJJ8c1vfrM48sgjG73m8+bNKz7ykY8UnTt3LpIUTz/99EoXwi2KorjpppuKQYMGFe3bty8+9KEPFRdeeOEqswAA1csc0BzQHBCaX01RFEXlaj6gNTvmmGPy4osv5he/+EWlo6y1yZMn584778yvfvWrSkcBAKgq5oAA686po8BKXnvttTzyyCO5/vrrq3KClSSbb755TjvttErHAACoGuaAAO+fd7QBK9l3330zZ86cfPnLX853vvOdSscBAKAFmAMCvH+KNgAAAAAoQZtKBwAAAACA9YGiDQAAAABKoGgDAAAAgBIo2gAAAACgBIo2AAAAACiBog0AAAAASqBoAwAAAIASKNoAAAAAoAT/PzP0TRPbya6tAAAAAElFTkSuQmCC"},"metadata":{}}]},{"cell_type":"code","source":"gc.collect()","metadata":{"id":"nk3vK1u3FlZc","execution":{"iopub.status.busy":"2024-04-18T11:28:05.797052Z","iopub.execute_input":"2024-04-18T11:28:05.797736Z","iopub.status.idle":"2024-04-18T11:28:06.233266Z","shell.execute_reply.started":"2024-04-18T11:28:05.797700Z","shell.execute_reply":"2024-04-18T11:28:06.232423Z"},"trusted":true},"execution_count":23,"outputs":[{"execution_count":23,"output_type":"execute_result","data":{"text/plain":"24829"},"metadata":{}}]},{"cell_type":"markdown","source":"# BUILDING LSTM ON CORE IVY","metadata":{"id":"Vy7iZ8QnAS2-"}},{"cell_type":"code","source":"# dir(tokenizer)","metadata":{"id":"SEPdRlMT6Ybd","execution":{"iopub.status.busy":"2024-04-18T11:28:06.234636Z","iopub.execute_input":"2024-04-18T11:28:06.235287Z","iopub.status.idle":"2024-04-18T11:28:06.536280Z","shell.execute_reply.started":"2024-04-18T11:28:06.235254Z","shell.execute_reply":"2024-04-18T11:28:06.535318Z"},"trusted":true},"execution_count":24,"outputs":[]},{"cell_type":"markdown","source":"Setting up the device for the computations.","metadata":{"id":"hKaKQ1kRLn04"}},{"cell_type":"code","source":"#imports the cuDF library (CUDA Data Frame) into your Python environment.\nimport cudf","metadata":{"id":"RsojtOQNLn04","execution":{"iopub.status.busy":"2024-04-18T11:28:06.537638Z","iopub.execute_input":"2024-04-18T11:28:06.538100Z","iopub.status.idle":"2024-04-18T11:28:10.200722Z","shell.execute_reply.started":"2024-04-18T11:28:06.538068Z","shell.execute_reply":"2024-04-18T11:28:10.199918Z"},"trusted":true},"execution_count":25,"outputs":[]},{"cell_type":"code","source":"train_test_ratio = 0.9\nfrac_dataset = 0.02","metadata":{"id":"oj86qS4aLn05","execution":{"iopub.status.busy":"2024-04-18T11:28:10.201894Z","iopub.execute_input":"2024-04-18T11:28:10.202233Z","iopub.status.idle":"2024-04-18T11:28:10.207169Z","shell.execute_reply.started":"2024-04-18T11:28:10.202202Z","shell.execute_reply":"2024-04-18T11:28:10.206120Z"},"trusted":true},"execution_count":26,"outputs":[]},{"cell_type":"code","source":"#importing dataset and preprocessing\n\ndf = cudf.read_csv(\"/kaggle/input/sarcasm/train-balanced-sarcasm.csv\")\ndf = df.drop_duplicates()\ndf = df.rename(columns={'comment': 'title'})\ndf = df[['label', 'title']]\ndf = df[~df['label'].isnull()]\ndf = df[~df['title'].isnull()]\ndf.sample(frac=1).reset_index(drop=True)\ndf.sample(5)\n","metadata":{"id":"2ft2bHc1Ln05","execution":{"iopub.status.busy":"2024-04-18T11:28:10.208363Z","iopub.execute_input":"2024-04-18T11:28:10.208754Z","iopub.status.idle":"2024-04-18T11:28:12.509049Z","shell.execute_reply.started":"2024-04-18T11:28:10.208724Z","shell.execute_reply":"2024-04-18T11:28:12.507884Z"},"trusted":true},"execution_count":27,"outputs":[{"name":"stderr","text":"get_mempolicy: Operation not permitted\n","output_type":"stream"},{"execution_count":27,"output_type":"execute_result","data":{"text/plain":" label title\n427824 1 What an absolute fucking professional\n284023 1 I thought we still were at ddr4... Crazy world\n88830 1 I think if Jan were to leave tomorrow, he'd ge...\n331949 1 say bye to guild system.. they ninja-ed it\n573293 1 Overclocking is easy, just change a few bios s...","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
labeltitle
4278241What an absolute fucking professional
2840231I thought we still were at ddr4... Crazy world
888301I think if Jan were to leave tomorrow, he'd ge...
3319491say bye to guild system.. they ninja-ed it
5732931Overclocking is easy, just change a few bios s...
\n
"},"metadata":{}}]},{"cell_type":"code","source":"df_full = df # Create a copy of the original dataframe\ndf_size = len(df_full) # Get the total number of rows in the dataframe\nsplit = int(df_size * train_test_ratio * frac_dataset) # Calculate the split index for the training set\ncutoff = int(df_size * frac_dataset) # Calculate the cutoff index for the evaluation set\n\n# Split the dataframe into training and evaluation sets\ndf = df_full.iloc[:split,:] # Training set\ndf_eval = df_full.iloc[split:cutoff,:] # Evaluation set\n\nprint(len(df)) # Print the number of rows in the training set","metadata":{"id":"CSTVRW2DLn05","execution":{"iopub.status.busy":"2024-04-18T11:28:12.515674Z","iopub.execute_input":"2024-04-18T11:28:12.516006Z","iopub.status.idle":"2024-04-18T11:28:12.525496Z","shell.execute_reply.started":"2024-04-18T11:28:12.515978Z","shell.execute_reply":"2024-04-18T11:28:12.523331Z"},"trusted":true},"execution_count":28,"outputs":[{"name":"stdout","text":"18193\n","output_type":"stream"}]},{"cell_type":"code","source":"print(torch.cuda.is_available())\n# Check if PyTorch can access a CUDA-enabled GPU\n\ndevice = ivy.as_native_dev(\"gpu:0\")\n# Get the Ivy device object for \"gpu:0\" (the first CUDA-enabled GPU)\n\nivy.set_default_device(\"gpu:0\")\n# Set the default device in Ivy to \"gpu:0\"\n\nprint(ivy.default_device())\n# Print the current default device in Ivy\n\nivy.set_soft_device_mode(True)\n# Enable Ivy's soft device mode, which automatically moves tensors to the correct device\n\nprint(device)\n# Print the Ivy device object for \"gpu:0\"","metadata":{"id":"VQlQ4V_-Ln06","execution":{"iopub.status.busy":"2024-04-18T11:30:25.812984Z","iopub.execute_input":"2024-04-18T11:30:25.813692Z","iopub.status.idle":"2024-04-18T11:30:25.820231Z","shell.execute_reply.started":"2024-04-18T11:30:25.813663Z","shell.execute_reply":"2024-04-18T11:30:25.819307Z"},"trusted":true},"execution_count":42,"outputs":[{"name":"stdout","text":"True\ngpu:0\ncuda:0\n","output_type":"stream"}]},{"cell_type":"code","source":"print(tokenizer.vocab_size)\n# Print the size of the vocabulary (number of unique tokens) used by the tokenizer\n\nprint(tokenizer.all_special_tokens_extended)\n# Print a list of all special tokens (e.g., padding token, start/end of sequence tokens) used by the tokenizer, including those added by extensions\n\nprint(tokenizer.all_special_ids)\n# Print a list of token IDs corresponding to the special tokens used by the tokenizer\n\nprint(tokenizer.pad_token_id)\n# Print the token ID assigned to the padding token used by the tokenizer for padding sequences to a fixed length","metadata":{"id":"mKyWQmUR6grC","execution":{"iopub.status.busy":"2024-04-18T11:28:12.543418Z","iopub.execute_input":"2024-04-18T11:28:12.543769Z","iopub.status.idle":"2024-04-18T11:28:12.551887Z","shell.execute_reply.started":"2024-04-18T11:28:12.543743Z","shell.execute_reply":"2024-04-18T11:28:12.550739Z"},"trusted":true},"execution_count":30,"outputs":[{"name":"stdout","text":"28996\n['[UNK]', '[SEP]', '[PAD]', '[CLS]', '[MASK]']\n[100, 102, 0, 101, 103]\n0\n","output_type":"stream"}]},{"cell_type":"code","source":"sample = list(df.sample(8)[\"title\"].to_pandas())\n# Sample 8 rows from the \"title\" column of the DataFrame df, convert the result to a pandas Series, and store the values in the list sample\n\nprint(sample)\n# Print the sampled titles\n\ntokenizer(sample, add_special_tokens=True, padding=True, truncation=True)\n# Apply the tokenizer to the sampled titles","metadata":{"id":"_jEnXjjUOo7f","execution":{"iopub.status.busy":"2024-04-18T11:28:12.553586Z","iopub.execute_input":"2024-04-18T11:28:12.553976Z","iopub.status.idle":"2024-04-18T11:28:12.569607Z","shell.execute_reply.started":"2024-04-18T11:28:12.553943Z","shell.execute_reply":"2024-04-18T11:28:12.568576Z"},"trusted":true},"execution_count":31,"outputs":[{"name":"stdout","text":"['Yeah, based on the \"choices\", Kanye West looks appealing.', 'This was the year Roman started pumping money into their club, the year the BPL chsnged and not for the better.', 'Well, we don\\'t have a culture of our own, so I guess that\\'s why we should just abandon any of these so-called \"traditions\" right?', 'Also a bigger terminal velocity', \"Yeah let's just get over the fact that the president is a complete fucking manchild\", \"#'MURICA\", \"Because civil disobedience isn't a thing and it would be sooooo much work to convince people to not pay their federal taxes.\", 'Imaginary :c']\n","output_type":"stream"},{"execution_count":31,"output_type":"execute_result","data":{"text/plain":"{'input_ids': [[101, 2814, 117, 1359, 1113, 1103, 107, 9940, 107, 117, 14812, 3382, 1162, 1537, 2736, 17117, 119, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [101, 1188, 1108, 1103, 1214, 2264, 1408, 15486, 1948, 1154, 1147, 1526, 117, 1103, 1214, 1103, 21062, 2162, 22572, 1116, 18288, 1105, 1136, 1111, 1103, 1618, 119, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0], [101, 2119, 117, 1195, 1274, 112, 189, 1138, 170, 2754, 1104, 1412, 1319, 117, 1177, 146, 3319, 1115, 112, 188, 1725, 1195, 1431, 1198, 11092, 1251, 1104, 1292, 1177, 118, 1270, 107, 7181, 107, 1268, 136, 102], [101, 2907, 170, 6706, 6020, 10537, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [101, 2814, 1519, 112, 188, 1198, 1243, 1166, 1103, 1864, 1115, 1103, 2084, 1110, 170, 2335, 8750, 1299, 21289, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [101, 108, 112, 150, 19556, 9741, 1592, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [101, 2279, 2987, 4267, 7301, 18100, 2762, 112, 189, 170, 1645, 1105, 1122, 1156, 1129, 1177, 5658, 5658, 1277, 1250, 1106, 7627, 1234, 1106, 1136, 2653, 1147, 2877, 7538, 119, 102, 0, 0, 0, 0, 0, 0], [101, 146, 1918, 10533, 3113, 131, 172, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], 'token_type_ids': [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]], 'attention_mask': [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0], [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]}"},"metadata":{}}]},{"cell_type":"code","source":"# Import the Dataset class from the torch.utils.data module.\nfrom torch.utils.data import Dataset","metadata":{"id":"PU8tcMRKLn06","execution":{"iopub.status.busy":"2024-04-18T11:28:12.571056Z","iopub.execute_input":"2024-04-18T11:28:12.571341Z","iopub.status.idle":"2024-04-18T11:28:12.575936Z","shell.execute_reply.started":"2024-04-18T11:28:12.571318Z","shell.execute_reply":"2024-04-18T11:28:12.574863Z"},"trusted":true},"execution_count":32,"outputs":[]},{"cell_type":"code","source":"batch_size = 128\n\n# Define a custom dataset class named 'ivy_Dataset'.\nclass ivy_Dataset(Dataset):\n def __init__(self, df):\n # Initialize the dataset with the given dataframe 'df'.\n # Store the number of samples in the dataset.\n self.num_samples = df['title'].size\n # Extract 'title' and 'label' from the dataframe and store as data.\n self.data = [[entry[0], entry[1]] for entry in zip(df[\"title\"].to_pandas(), df[\"label\"].to_pandas())]\n\n def __getitem__(self, idx):\n # Retrieve and return the data at the given index 'idx'.\n title = self.data[idx][0]\n label = self.data[idx][1]\n return title, label\n\n def __len__(self):\n # Return the total number of samples in the dataset.\n return self.num_samples\n\n\n","metadata":{"id":"JEW-0sYgLn06","execution":{"iopub.status.busy":"2024-04-18T11:28:12.577339Z","iopub.execute_input":"2024-04-18T11:28:12.577812Z","iopub.status.idle":"2024-04-18T11:28:12.588255Z","shell.execute_reply.started":"2024-04-18T11:28:12.577778Z","shell.execute_reply":"2024-04-18T11:28:12.587345Z"},"trusted":true},"execution_count":33,"outputs":[]},{"cell_type":"code","source":"training_data = ivy_Dataset(df)# Access the label of the 10th data sample in the 'data_sample' list.\n","metadata":{"id":"3kEn6ka1Ln07","execution":{"iopub.status.busy":"2024-04-18T11:28:12.589385Z","iopub.execute_input":"2024-04-18T11:28:12.589758Z","iopub.status.idle":"2024-04-18T11:28:12.618589Z","shell.execute_reply.started":"2024-04-18T11:28:12.589724Z","shell.execute_reply":"2024-04-18T11:28:12.617910Z"},"trusted":true},"execution_count":34,"outputs":[]},{"cell_type":"code","source":"# Randomly sample 10 entries from the dataframe 'df' and store it as 'df_sample'.\ndf_sample = df.sample(10)\n\n# Extract 'title' and 'label' from the sampled dataframe and store as 'data_sample'.\ndata_sample = [[entry[0], entry[1]] for entry in zip(df_sample[\"title\"].to_pandas(), df_sample[\"label\"].to_pandas())]\n\n# Access the label of the 10th data sample in the 'data_sample' list.\ndata_sample[9][1]","metadata":{"id":"qzV0zScmLn07","execution":{"iopub.status.busy":"2024-04-18T11:28:12.619709Z","iopub.execute_input":"2024-04-18T11:28:12.620049Z","iopub.status.idle":"2024-04-18T11:28:12.633173Z","shell.execute_reply.started":"2024-04-18T11:28:12.620018Z","shell.execute_reply":"2024-04-18T11:28:12.632454Z"},"trusted":true},"execution_count":35,"outputs":[{"execution_count":35,"output_type":"execute_result","data":{"text/plain":"0"},"metadata":{}}]},{"cell_type":"code","source":"# Import the DataLoader class from the torch.utils.data module.\nfrom torch.utils.data import DataLoader\n\n# Create a DataLoader instance named 'train_dataloader' for the training data.\n# Set the batch size to 'batch_size', shuffle the data during each epoch.\ntrain_dataloader = DataLoader(training_data, batch_size=batch_size, shuffle=True)\n","metadata":{"id":"lupRA9BvLn07","execution":{"iopub.status.busy":"2024-04-18T11:28:12.634337Z","iopub.execute_input":"2024-04-18T11:28:12.634957Z","iopub.status.idle":"2024-04-18T11:28:12.639836Z","shell.execute_reply.started":"2024-04-18T11:28:12.634926Z","shell.execute_reply":"2024-04-18T11:28:12.638800Z"},"trusted":true},"execution_count":36,"outputs":[]},{"cell_type":"code","source":"def ivy_train_loader(dataset=df, batch_size=4):\n # Calculate the number of batches based on the dataset size and batch size.\n num_batches = int(len(dataset) / batch_size)\n\n # Generate batches of data using list comprehension.\n out = (\n (\n dataset[\"title\"][batch_idx * batch_size : batch_idx * batch_size + batch_size].to_pandas(),\n dataset[\"label\"][batch_idx * batch_size : batch_idx * batch_size + batch_size].to_pandas()\n )\n for batch_idx in range(num_batches)\n )\n\n return out\n\n# Create a loader using the ivy_train_loader function with the specified batch size.\nloader = ivy_train_loader(batch_size=batch_size)\n\n# Iterate over the loader with tqdm for progress tracking.\nfor batch_id, data in tqdm(enumerate(loader)):\n # Extract input and target data from the batch.\n x_data = data[0]\n y_data = data[1]\n\n # Print additional information or perform computations as needed.\n if batch_id == 10:\n break\n","metadata":{"id":"azrxUXP5Ln07","execution":{"iopub.status.busy":"2024-04-18T11:28:12.641140Z","iopub.execute_input":"2024-04-18T11:28:12.641465Z","iopub.status.idle":"2024-04-18T11:28:12.680173Z","shell.execute_reply.started":"2024-04-18T11:28:12.641437Z","shell.execute_reply":"2024-04-18T11:28:12.679246Z"},"trusted":true},"execution_count":37,"outputs":[{"name":"stderr","text":"10it [00:00, 371.74it/s]\n","output_type":"stream"}]},{"cell_type":"code","source":"# Iterate over the train_dataloader with tqdm for progress tracking.\nfor batch_id, data in tqdm(enumerate(train_dataloader)):\n # Extract input and target data from the batch.\n x_data = data[0]\n y_data = data[1]\n\n # Print additional information or perform computations as needed.\n if batch_id == 10:\n break\n","metadata":{"id":"5J1XVCUCLn07","execution":{"iopub.status.busy":"2024-04-18T11:28:12.681197Z","iopub.execute_input":"2024-04-18T11:28:12.681462Z","iopub.status.idle":"2024-04-18T11:28:12.735099Z","shell.execute_reply.started":"2024-04-18T11:28:12.681441Z","shell.execute_reply":"2024-04-18T11:28:12.734248Z"},"trusted":true},"execution_count":38,"outputs":[{"name":"stderr","text":"10it [00:00, 475.18it/s]\n","output_type":"stream"}]},{"cell_type":"markdown","source":"It seems that in this case just a simple generator is comparable or slightly faster than a proper data loader.","metadata":{"id":"Xcdx5-YbLn08"}},{"cell_type":"code","source":"def one_hot(args, num_classes=2):\n # Generate one-hot encoding for each element in 'args'.\n out = [[1 if idx == elem else 0 for idx in range(num_classes)] for elem in args]\n return out\n\ndef argmax(args):\n # Find the index of the maximum value in each array in 'args'.\n out = [ivy.argmax(elem) for elem in args]\n return out\n\n# Test the one_hot and argmax functions.\nprint(one_hot([0, 0, 1, 0]))\nprint(argmax(ivy.array([[0.49967843, 0.50032151],\n [0.49986687, 0.50013322],\n [0.49912587, 0.50087422],\n [0.50080854, 0.4991914 ],\n [0.50049627, 0.4995037 ],\n [0.4998956 , 0.50010443],\n [0.50008798, 0.49991205],\n [0.50053447, 0.49946556]])))","metadata":{"id":"SReEp9rmLn08","execution":{"iopub.status.busy":"2024-04-18T11:28:12.736323Z","iopub.execute_input":"2024-04-18T11:28:12.736736Z","iopub.status.idle":"2024-04-18T11:28:16.874645Z","shell.execute_reply.started":"2024-04-18T11:28:12.736705Z","shell.execute_reply":"2024-04-18T11:28:16.873497Z"},"trusted":true},"execution_count":39,"outputs":[{"name":"stdout","text":"[[1, 0], [1, 0], [0, 1], [1, 0]]\n[ivy.array(1), ivy.array(1), ivy.array(1), ivy.array(0), ivy.array(0), ivy.array(1), ivy.array(0), ivy.array(0)]\n","output_type":"stream"}]},{"cell_type":"code","source":"# Set the backend to \"torch\" for Ivy library.\nivy.set_backend(\"torch\")\n\n# Define various parameters and variables.\nnum_embeddings = tokenizer.vocab_size\nembedding_dim = 10\npad_token_id = tokenizer.pad_token_id\ninput_channels = embedding_dim\nnum_classes = 2\noutput_channels = 10\nnum_layers = 1\nmax_length = 128\nmax_length = max_length - 3\ntokenizer.model_max_length = max_length\neps = 1e-05\nbatch_size = 128\n\n# Generate testing input and labels.\ntesting_input = df.sample(batch_size)[\"title\"]\ntesting_labels = df.sample(batch_size)[\"label\"]\n\n# Calculate the linear input and output channels.\nlinear_input_channels = (tokenizer.model_max_length + 3) * batch_size * output_channels # 3 comes from the hidden states of the LSTM\nlinear_output_channels = num_classes * batch_size\n\n# Define the normalized shape.\nnormalized_shape = (num_classes)\n\n# Define a custom module for post-processing LSTM output.\nclass LSTM_postproc(Module):\n def __init__(self):\n super(LSTM_postproc, self).__init__()\n\n def _forward(self, args):\n lstm_output, lstm_state = args\n lstm_state_latest, lstm_state_hidden = lstm_state\n lstm_state_latest = ivy.array(lstm_state_latest)\n lstm_state_hidden = ivy.array([state for state in lstm_state_hidden][0])\n\n lstm_state = ivy.concat((lstm_state_latest, lstm_state_hidden), axis=0).reshape((batch_size, 3, -1))\n out = ivy.concat([lstm_output, lstm_state], axis=1)\n out = out.flatten()\n return out\n\n# Define a custom module for tokenizing input.\nclass Tokenizer(Module):\n def __init__(self, tokenizer):\n super(Tokenizer, self).__init__()\n self.tokenizer = tokenizer\n\n def _forward(self, args):\n args = list(args)\n return self.tokenizer(args, add_special_tokens=True, max_length=max_length, padding=\"max_length\", truncation=True)[\"input_ids\"]\n\n# Define a custom module for reshaping output.\nclass Reshaper(Module):\n def __init__(self):\n super(Reshaper, self).__init__()\n\n def _forward(self, args):\n return args.reshape((batch_size, num_classes))\n\n# Define a custom module for performing argmax operation.\nclass Argmax(Module):\n def __init__(self):\n super(Argmax, self).__init__()\n\n def _forward(self, args):\n return ivy.argmax(args, axis=-1)\n\n# Define a custom module for embedding.\nclass ivy_Embed(Module):\n def __init__(self, embedding):\n super(ivy_Embed, self).__init__()\n self.embedding = embedding\n\n def _forward(self, args):\n out = self.embedding(args).float()\n return out\n\n# Initialize the embedding layer.\nembedding = Embedding(num_embeddings, embedding_dim, pad_token_id)\n\n# Define the neural network architecture using Sequential.\nivy_LSTM = Sequential(\n ivy_Embed(embedding),\n LSTM(input_channels, output_channels, num_layers=num_layers, return_sequence=True, return_state=True, device=None, v=None, dtype=None),\n LSTM_postproc(),\n Linear(linear_input_channels, linear_output_channels, with_bias=True),\n Reshaper(),\n Sigmoid(),\n Softmax(),\n)\n","metadata":{"id":"4dQ2Recq9Xo8","execution":{"iopub.status.busy":"2024-04-18T11:28:16.875870Z","iopub.execute_input":"2024-04-18T11:28:16.876149Z","iopub.status.idle":"2024-04-18T11:28:17.438256Z","shell.execute_reply.started":"2024-04-18T11:28:16.876124Z","shell.execute_reply":"2024-04-18T11:28:17.436997Z"},"trusted":true},"execution_count":40,"outputs":[]},{"cell_type":"code","source":"def train_tokens_loader(dataset = df):\n train_loader = ivy_train_loader(dataset=dataset, batch_size=batch_size)\n ivy_tokenizer = Tokenizer(tokenizer)\n loaded_data = []\n data_dict = dict()\n for batch_id, data in tqdm(enumerate(train_loader)):\n\n x_data = ivy.array(ivy_tokenizer(data[0]), device=device).long()\n y_data = ivy.array(one_hot(list(data[1])), device=device)\n\n loaded_data.append([x_data, y_data])\n data_dict[f\"batch{batch_id}\"] = {\"x_data\": x_data, \"y_data\": y_data}\n \n loaded_data = ivy.array(loaded_data, device=device)\n return loaded_data, data_dict\n\nloaded_tokens, tokens_dict = train_tokens_loader(df_full)\n\nwith open(\"tokenized_dataset.json\", \"w\") as outfile: \n json.dump(tokens_dict, outfile)\n!cp \"tokenized_dataset.json\" \"/kaggle/working/demos/Contributor_demos/Sarcasm Detection/\"","metadata":{"execution":{"iopub.status.busy":"2024-04-18T11:36:24.496756Z","iopub.execute_input":"2024-04-18T11:36:24.497502Z"},"trusted":true},"execution_count":null,"outputs":[{"name":"stderr","text":"1it [00:17, 17.27s/it]","output_type":"stream"}]},{"cell_type":"code","source":"def train_ivy(model):\n logs = []\n learning_rate = 3e-4\n opt = SGD(lr=learning_rate, inplace=True, stop_gradients=True, trace_on_next_step=False)\n loss_fn = CrossEntropyLoss(axis=-1, epsilon=1e-07, reduction='mean')\n epochs = 2\n# grads = ivy.zeros_like(model.v)\n classifier = model\n ivy_tokenizer = Tokenizer(tokenizer)\n\n def loss(params):\n v, model, x, y = params\n predictions = model(x, v=v).flatten().to(device)\n return loss_fn(y, predictions)\n\n def one_hot(args, num_classes=2):\n # Convert labels to one-hot encoding.\n out = ivy.array([[1 if idx == elem else 0 for idx in range(num_classes)] for elem in args], device=device).flatten()\n return out.long()\n \n for epoch in range(epochs):\n # Iterate over the training loader for each epoch.\n for batch_id, data in tqdm(enumerate(loaded_tokens):\n\n x_data = ivy.array(ivy_tokenizer(data[0]), device=device).long()\n y_data = one_hot(list(data[1]))\n\n # Compute loss and gradients\n loss_val, grads = ivy.execute_with_gradients(loss, (model.v, model, x_data, y_data))\n\n # Update parameters using SGD optimizer\n model.v = opt.step(model.v, grads)\n\n if batch_id % 100 == 0:\n # Log loss values periodically\n logs.append([[epoch, batch_id, loss_val]])\n\n # opt.clear_grad()\n gc.collect()\n\n return logs, model\n","metadata":{"id":"1NqBJx51TYSd","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Train the Ivy LSTM model using the custom training function.\nlogs, ivy_LSTM = train_ivy(ivy_LSTM)\n","metadata":{"id":"7-5EmgSSLn0-","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Save the trained Ivy LSTM model.\nivy_LSTM.save(\"Ivy_Sarcasm_Detection_Demo\")\nivy_LSTM.save_weights(\"/kaggle/working/demos/Contributor_demos/Sarcasm Detection/Ivy_Sarcasm_Detection_Demo_weights.hdf5\")\n\n# Copy the saved model to the specified directory.\n!cp \"Ivy_Sarcasm_Detection_Demo\" \"/kaggle/working/demos/Contributor_demos/Sarcasm Detection/\"\n","metadata":{"id":"K4gP_H5OLn0_","execution":{"iopub.status.busy":"2024-04-16T16:40:14.616595Z","iopub.execute_input":"2024-04-16T16:40:14.617225Z","iopub.status.idle":"2024-04-16T16:40:16.202745Z","shell.execute_reply.started":"2024-04-16T16:40:14.617189Z","shell.execute_reply":"2024-04-16T16:40:16.200974Z"},"trusted":true},"execution_count":80,"outputs":[{"traceback":["\u001b[0;31m---------------------------------------------------------------------------\u001b[0m","\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)","Cell \u001b[0;32mIn[80], line 3\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;66;03m# Save the trained Ivy LSTM model.\u001b[39;00m\n\u001b[1;32m 2\u001b[0m ivy_LSTM\u001b[38;5;241m.\u001b[39msave(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIvy_Sarcasm_Detection_Demo\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m----> 3\u001b[0m \u001b[43mivy_LSTM\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msave_weights\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m/kaggle/working/demos/Contributor_demos/Sarcasm Detection/Ivy_Sarcasm_Detection_Demo_weights.hdf5\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 5\u001b[0m \u001b[38;5;66;03m# Copy the saved model to the specified directory.\u001b[39;00m\n\u001b[1;32m 6\u001b[0m get_ipython()\u001b[38;5;241m.\u001b[39msystem(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mcp \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mIvy_Sarcasm_Detection_Demo\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m \u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/kaggle/working/demos/Contributor_demos/Sarcasm Detection\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m'\u001b[39m)\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/ivy/stateful/module.py:428\u001b[0m, in \u001b[0;36mModule.save_weights\u001b[0;34m(self, weights_path)\u001b[0m\n\u001b[1;32m 416\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"Save the weights on the Module.\u001b[39;00m\n\u001b[1;32m 417\u001b[0m \n\u001b[1;32m 418\u001b[0m \u001b[38;5;124;03mParameters\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 425\u001b[0m \u001b[38;5;124;03mNone\u001b[39;00m\n\u001b[1;32m 426\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 427\u001b[0m os\u001b[38;5;241m.\u001b[39mmakedirs(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;241m.\u001b[39mjoin(weights_path\u001b[38;5;241m.\u001b[39msplit(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m/\u001b[39m\u001b[38;5;124m\"\u001b[39m)[:\u001b[38;5;241m-\u001b[39m\u001b[38;5;241m1\u001b[39m]), exist_ok\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mTrue\u001b[39;00m)\n\u001b[0;32m--> 428\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mv\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcont_to_disk_as_hdf5\u001b[49m\u001b[43m(\u001b[49m\u001b[43mweights_path\u001b[49m\u001b[43m)\u001b[49m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/ivy/data_classes/container/base.py:2020\u001b[0m, in \u001b[0;36mContainerBase.cont_to_disk_as_hdf5\u001b[0;34m(self, h5_obj_or_filepath, starting_index, mode, max_batch_size)\u001b[0m\n\u001b[1;32m 2018\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 2019\u001b[0m h5_group \u001b[38;5;241m=\u001b[39m h5_obj[key]\n\u001b[0;32m-> 2020\u001b[0m \u001b[43mvalue\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcont_to_disk_as_hdf5\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2021\u001b[0m \u001b[43m \u001b[49m\u001b[43mh5_group\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstarting_index\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_batch_size\u001b[49m\n\u001b[1;32m 2022\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2023\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 2024\u001b[0m value_as_np \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_cont_ivy\u001b[38;5;241m.\u001b[39mto_numpy(value)\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/ivy/data_classes/container/base.py:2020\u001b[0m, in \u001b[0;36mContainerBase.cont_to_disk_as_hdf5\u001b[0;34m(self, h5_obj_or_filepath, starting_index, mode, max_batch_size)\u001b[0m\n\u001b[1;32m 2018\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 2019\u001b[0m h5_group \u001b[38;5;241m=\u001b[39m h5_obj[key]\n\u001b[0;32m-> 2020\u001b[0m \u001b[43mvalue\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcont_to_disk_as_hdf5\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2021\u001b[0m \u001b[43m \u001b[49m\u001b[43mh5_group\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstarting_index\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_batch_size\u001b[49m\n\u001b[1;32m 2022\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2023\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 2024\u001b[0m value_as_np \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_cont_ivy\u001b[38;5;241m.\u001b[39mto_numpy(value)\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/ivy/data_classes/container/base.py:2020\u001b[0m, in \u001b[0;36mContainerBase.cont_to_disk_as_hdf5\u001b[0;34m(self, h5_obj_or_filepath, starting_index, mode, max_batch_size)\u001b[0m\n\u001b[1;32m 2018\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 2019\u001b[0m h5_group \u001b[38;5;241m=\u001b[39m h5_obj[key]\n\u001b[0;32m-> 2020\u001b[0m \u001b[43mvalue\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mcont_to_disk_as_hdf5\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 2021\u001b[0m \u001b[43m \u001b[49m\u001b[43mh5_group\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mstarting_index\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmax_batch_size\u001b[49m\n\u001b[1;32m 2022\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2023\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 2024\u001b[0m value_as_np \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_cont_ivy\u001b[38;5;241m.\u001b[39mto_numpy(value)\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/ivy/data_classes/container/base.py:2041\u001b[0m, in \u001b[0;36mContainerBase.cont_to_disk_as_hdf5\u001b[0;34m(self, h5_obj_or_filepath, starting_index, mode, max_batch_size)\u001b[0m\n\u001b[1;32m 2039\u001b[0m amount_to_write \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mmin\u001b[39m(this_batch_size, space_left)\n\u001b[1;32m 2040\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m i \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mrange\u001b[39m(amount_to_write):\n\u001b[0;32m-> 2041\u001b[0m \u001b[43mh5_obj\u001b[49m\u001b[43m[\u001b[49m\u001b[43mkey\u001b[49m\u001b[43m]\u001b[49m\u001b[43m[\u001b[49m\u001b[43mstarting_index\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mi\u001b[49m\u001b[43m \u001b[49m\u001b[43m:\u001b[49m\u001b[43m \u001b[49m\u001b[43mstarting_index\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[43mi\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m+\u001b[39;49m\u001b[43m \u001b[49m\u001b[38;5;241;43m1\u001b[39;49m\u001b[43m]\u001b[49m \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 2042\u001b[0m value_as_np[i : i \u001b[38;5;241m+\u001b[39m \u001b[38;5;241m1\u001b[39m]\n\u001b[1;32m 2043\u001b[0m )\n","File \u001b[0;32mh5py/_objects.pyx:54\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[0;34m()\u001b[0m\n","File \u001b[0;32mh5py/_objects.pyx:55\u001b[0m, in \u001b[0;36mh5py._objects.with_phil.wrapper\u001b[0;34m()\u001b[0m\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/h5py/_hl/dataset.py:997\u001b[0m, in \u001b[0;36mDataset.__setitem__\u001b[0;34m(self, args, val)\u001b[0m\n\u001b[1;32m 994\u001b[0m mshape \u001b[38;5;241m=\u001b[39m val\u001b[38;5;241m.\u001b[39mshape\n\u001b[1;32m 996\u001b[0m \u001b[38;5;66;03m# Perform the write, with broadcasting\u001b[39;00m\n\u001b[0;32m--> 997\u001b[0m mspace \u001b[38;5;241m=\u001b[39m h5s\u001b[38;5;241m.\u001b[39mcreate_simple(\u001b[43mselection\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mexpand_shape\u001b[49m\u001b[43m(\u001b[49m\u001b[43mmshape\u001b[49m\u001b[43m)\u001b[49m)\n\u001b[1;32m 998\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m fspace \u001b[38;5;129;01min\u001b[39;00m selection\u001b[38;5;241m.\u001b[39mbroadcast(mshape):\n\u001b[1;32m 999\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mid\u001b[38;5;241m.\u001b[39mwrite(mspace, fspace, val, mtype, dxpl\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_dxpl)\n","File \u001b[0;32m/opt/conda/lib/python3.10/site-packages/h5py/_hl/selections.py:264\u001b[0m, in \u001b[0;36mSimpleSelection.expand_shape\u001b[0;34m(self, source_shape)\u001b[0m\n\u001b[1;32m 262\u001b[0m eshape\u001b[38;5;241m.\u001b[39mappend(t)\n\u001b[1;32m 263\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 264\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCan\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt broadcast \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m -> \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m (source_shape, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39marray_shape)) \u001b[38;5;66;03m# array shape\u001b[39;00m\n\u001b[1;32m 266\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28many\u001b[39m([n \u001b[38;5;241m>\u001b[39m \u001b[38;5;241m1\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m n \u001b[38;5;129;01min\u001b[39;00m remaining_src_dims]):\n\u001b[1;32m 267\u001b[0m \u001b[38;5;66;03m# All dimensions from target_shape should either have been popped\u001b[39;00m\n\u001b[1;32m 268\u001b[0m \u001b[38;5;66;03m# to match the selection shape, or be 1.\u001b[39;00m\n\u001b[1;32m 269\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mTypeError\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mCan\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mt broadcast \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m -> \u001b[39m\u001b[38;5;132;01m%s\u001b[39;00m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m%\u001b[39m (source_shape, \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39marray_shape)) \u001b[38;5;66;03m# array shape\u001b[39;00m\n","\u001b[0;31mTypeError\u001b[0m: Can't broadcast (1, 10) -> (1, 3)"],"ename":"TypeError","evalue":"Can't broadcast (1, 10) -> (1, 3)","output_type":"error"}]},{"cell_type":"code","source":"with open('logs.csv','w',encoding = 'utf-8') as f:\n f.write(\"epoch, batch_id, loss_val\")\n for entry in logs:\n f.write(f\"{entry[0][0]}, {entry[0][1]}, {entry[0][2]}\")\n \n!cp logs.csv \"/kaggle/working/demos/Contributor_demos/Sarcasm Detection\"","metadata":{"execution":{"iopub.status.busy":"2024-04-16T16:40:16.203448Z","iopub.status.idle":"2024-04-16T16:40:16.203771Z","shell.execute_reply.started":"2024-04-16T16:40:16.203615Z","shell.execute_reply":"2024-04-16T16:40:16.203629Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Set the Ivy LSTM model to evaluation mode.\nivy_LSTM.eval()\n\n# Disable training mode for the Ivy LSTM model.\nivy_LSTM.train(False)\n","metadata":{"id":"2FFbG1JULn0_","execution":{"iopub.status.busy":"2024-04-16T16:40:16.205825Z","iopub.status.idle":"2024-04-16T16:40:16.206148Z","shell.execute_reply.started":"2024-04-16T16:40:16.205983Z","shell.execute_reply":"2024-04-16T16:40:16.205996Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def eval_ivy(model):\n logs = []\n learning_rate = 3e-5\n opt = SGD(lr=learning_rate, inplace=True, stop_gradients=True, trace_on_next_step=False)\n loss_fn = CrossEntropyLoss(axis=-1, epsilon=1e-07, reduction='mean')\n epochs = 2\n grads = ivy.zeros_like(model.v)\n classifier = model\n train_loader = ivy_train_loader(dataset=df_eval, batch_size=batch_size)\n ivy_tokenizer = Tokenizer(tokenizer)\n\n def loss(params):\n v, model, x, y = params\n predictions = model(x, v=v).flatten()\n return loss_fn(y, predictions)\n\n def one_hot(args, num_classes=2):\n # Convert labels to one-hot encoding.\n out = ivy.array([[1 if idx == elem else 0 for idx in range(num_classes)] for elem in args]).flatten()\n return out.long()\n \n for batch_id, data in tqdm(enumerate(loaded_data)):\n\n x_data = ivy.array(ivy_tokenizer(data[0])).long()\n y_data = one_hot(list(data[1])).long()\n\n # Compute predictions\n predictions = classifier(x_data).float()\n predictions = ivy.argmax(predictions, axis=-1).flatten().float()\n predictions = one_hot(list(predictions)).reshape(y_data.shape)\n\n # Compute accuracy\n acc = ivy.matmul(predictions.float(), y_data.float()).float() / batch_size\n\n # Compute loss\n loss_vals = loss((model.v, model, x_data, y_data))\n\n # Append loss and accuracy to logs\n logs.append([[loss_vals, acc]])\n\n # Clear gradients and release memory\n # opt.clear_grad()\n gc.collect()\n\n # Calculate mean loss and accuracy\n return ivy.mean(logs, axis=0)\n","metadata":{"id":"ePSJNSfvLn0_","execution":{"iopub.status.busy":"2024-04-16T16:40:16.207292Z","iopub.status.idle":"2024-04-16T16:40:16.207630Z","shell.execute_reply.started":"2024-04-16T16:40:16.207469Z","shell.execute_reply":"2024-04-16T16:40:16.207483Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Evaluate the Ivy LSTM model using the custom evaluation function.\nlogs_eval = eval_ivy(ivy_LSTM)","metadata":{"id":"xTk4aOCkLn0_","execution":{"iopub.status.busy":"2024-04-16T16:40:16.208901Z","iopub.status.idle":"2024-04-16T16:40:16.209210Z","shell.execute_reply.started":"2024-04-16T16:40:16.209058Z","shell.execute_reply":"2024-04-16T16:40:16.209071Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Print the evaluation results (mean loss and accuracy).\nprint(logs_eval)","metadata":{"id":"QOmaAFL4Ln1A","execution":{"iopub.status.busy":"2024-04-16T16:40:16.210638Z","iopub.status.idle":"2024-04-16T16:40:16.210957Z","shell.execute_reply.started":"2024-04-16T16:40:16.210799Z","shell.execute_reply":"2024-04-16T16:40:16.210813Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Print the number of samples in the evaluation dataset.\nprint(len(df_eval))","metadata":{"id":"GF2kHSbyLn1A","execution":{"iopub.status.busy":"2024-04-15T22:20:10.026322Z","iopub.execute_input":"2024-04-15T22:20:10.026720Z","iopub.status.idle":"2024-04-15T22:20:10.041169Z","shell.execute_reply.started":"2024-04-15T22:20:10.026665Z","shell.execute_reply":"2024-04-15T22:20:10.040254Z"},"trusted":true},"execution_count":139,"outputs":[{"name":"stdout","text":"50538\n","output_type":"stream"}]},{"cell_type":"code","source":"# Define the train-test split ratio.\ntrain_test_ratio = 0.95\n\n# Define the fraction of the dataset to use.\nfrac_dataset = 1\n\n# Calculate the size of the full dataset.\ndf_size = len(df_full)\n\n# Calculate the index to split the dataset for training and evaluation.\nsplit = int(df_size * train_test_ratio * frac_dataset)\n\n# Define the cutoff index for the dataset fraction.\ncutoff = int(df_size * frac_dataset)\n\n# Extract the training dataset.\ndf = df_full.iloc[:split,:]\n\n# Extract the evaluation dataset.\ndf_eval = df_full.iloc[split:cutoff,:]\n","metadata":{"id":"ZqOd0SD7Ln1A","execution":{"iopub.status.busy":"2024-04-15T22:20:10.043253Z","iopub.execute_input":"2024-04-15T22:20:10.043522Z","iopub.status.idle":"2024-04-15T22:20:10.051719Z","shell.execute_reply.started":"2024-04-15T22:20:10.043491Z","shell.execute_reply":"2024-04-15T22:20:10.050967Z"},"trusted":true},"execution_count":140,"outputs":[]},{"cell_type":"code","source":"# Train the Ivy LSTM model using the custom training function.\nlogs, ivy_LSTM = train_ivy(ivy_LSTM)","metadata":{"id":"r1FZJkc6Ln1A","execution":{"iopub.status.busy":"2024-04-15T22:20:10.052855Z","iopub.execute_input":"2024-04-15T22:20:10.053158Z"},"trusted":true},"execution_count":null,"outputs":[{"name":"stderr","text":"93it [04:31, 2.93s/it]","output_type":"stream"}]},{"cell_type":"code","source":"# Save the trained Ivy LSTM model.\nivy_LSTM.save(\"Ivy_Sarcasm_Detection_Demo\")\nivy_LSTM.save_weights(\"/kaggle/working/demos/Contributor_demos/Sarcasm Detection/Ivy_Sarcasm_Detection_Demo_weights.hdf5\")\n# Copy the saved model to the specified directory.\n!cp \"Ivy_Sarcasm_Detection_Demo\" /kaggle/working/demos/Contributor_demos/Sarcasm Detection\n","metadata":{"id":"h-2vjH8NLn1A","trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"with open('logs_full.csv','w',encoding = 'utf-8') as f:\n f.write(\"epoch, batch_id, loss_val\")\n for entry in logs:\n f.write(f\"{entry[0][0]}, {entry[0][1]}, {entry[0][2]}\")\n \n!cp logs.csv \"/kaggle/working/demos/Contributor_demos/Sarcasm Detection\"","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]} \ No newline at end of file diff --git a/Contributor_demos/Sarcasm Detection/logs.csv b/Contributor_demos/Sarcasm Detection/logs.csv new file mode 100644 index 00000000..28a7bdd7 --- /dev/null +++ b/Contributor_demos/Sarcasm Detection/logs.csv @@ -0,0 +1 @@ +epoch, batch_id, loss_val0, 0, ivy.array(0.34652316, dev=gpu:0)0, 100, ivy.array(0.34657605, dev=gpu:0)0, 200, ivy.array(0.34656865, dev=gpu:0)0, 300, ivy.array(0.34660537, dev=gpu:0)0, 400, ivy.array(0.34650582, dev=gpu:0)0, 500, ivy.array(0.34657182, dev=gpu:0)0, 600, ivy.array(0.34657007, dev=gpu:0)0, 700, ivy.array(0.34658008, dev=gpu:0)0, 800, ivy.array(0.346588, dev=gpu:0)0, 900, ivy.array(0.34657723, dev=gpu:0)0, 1000, ivy.array(0.34655271, dev=gpu:0)0, 1100, ivy.array(0.34657384, dev=gpu:0)0, 1200, ivy.array(0.34664949, dev=gpu:0)0, 1300, ivy.array(0.34648973, dev=gpu:0)0, 1400, ivy.array(0.34655848, dev=gpu:0)1, 0, ivy.array(0.34651978, dev=gpu:0)1, 100, ivy.array(0.34657322, dev=gpu:0)1, 200, ivy.array(0.34656644, dev=gpu:0)1, 300, ivy.array(0.34660367, dev=gpu:0)1, 400, ivy.array(0.34650583, dev=gpu:0)1, 500, ivy.array(0.34657063, dev=gpu:0)1, 600, ivy.array(0.34657082, dev=gpu:0)1, 700, ivy.array(0.34658015, dev=gpu:0)1, 800, ivy.array(0.34659015, dev=gpu:0)1, 900, ivy.array(0.34657967, dev=gpu:0)1, 1000, ivy.array(0.34655022, dev=gpu:0)1, 1100, ivy.array(0.34657131, dev=gpu:0)1, 1200, ivy.array(0.34664682, dev=gpu:0)1, 1300, ivy.array(0.34648872, dev=gpu:0)1, 1400, ivy.array(0.34655799, dev=gpu:0) \ No newline at end of file