Skip to content

Instantly share code, notes, and snippets.

@XinyueZ
Created May 10, 2022 05:08
Show Gist options
  • Save XinyueZ/344a358801f72a56588fa45b82adaabd to your computer and use it in GitHub Desktop.
Save XinyueZ/344a358801f72a56588fa45b82adaabd to your computer and use it in GitHub Desktop.
sarcasm_Bi_LSTM.ipynb
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/XinyueZ/344a358801f72a56588fa45b82adaabd/sarcasm_bi_lstm.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Q2MY4-M1zuhV"
},
"source": [
"# Training a Sarcasm Detection Model using Bidirectional LSTMs\n",
"\n",
"In this lab, you will revisit the [News Headlines Dataset for Sarcasm Detection](https://www.kaggle.com/rmisra/news-headlines-dataset-for-sarcasm-detection/home) dataset and use it to train a Bi-LSTM Model.\n",
"\n",
"Kaggle: https://www.kaggle.com/devxinyue/training-a-sarcasm-detection-model-using-lstm/edit\n",
"\n",
"A similar lab for IMDB Reviews: https://drive.google.com/file/d/1A-Q47OhC5701bBX4R2Ggb0cbY34ZCnB7/view?usp=sharing\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "S-AgItE6z80t"
},
"source": [
"## Download the Dataset\n",
"\n",
"First, you will download the JSON file and extract the contents into lists."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "k_Wlz9i10Dmn",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "b5de897f-b7ca-4972-a367-2f2c3323808b"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Downloading...\n",
"From: https://drive.google.com/uc?id=1xRU3xY5-tkiPGvlz5xBJ18_pHWSRzI4v\n",
"To: /content/sarcasm.json\n",
"100% 5.64M/5.64M [00:00<00:00, 43.0MB/s]\n"
]
}
],
"source": [
"# Download the dataset\n",
"!gdown --id 1xRU3xY5-tkiPGvlz5xBJ18_pHWSRzI4v"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "Pr4R0I240GOh"
},
"outputs": [],
"source": [
"import json\n",
"\n",
"# Load the JSON file\n",
"with open(\"./sarcasm.json\", 'r') as f:\n",
" datastore = json.load(f)\n",
"\n",
"# Initialize the lists\n",
"sentences = []\n",
"labels = []\n",
"\n",
"# Collect sentences and labels into the lists\n",
"for item in datastore:\n",
" sentences.append(item['headline'])\n",
" labels.append(item['is_sarcastic'])"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "zN9-ojV55UCR"
},
"source": [
"## Split the Dataset\n",
"\n",
"You will then split the lists into train and test sets."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "50H0ZrJf035i",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "81c8e4b9-ced4-4cf3-d089-d7c939f09ad0"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"training_size 24038\n",
"testing_labels 2671\n"
]
}
],
"source": [
"sp = .9\n",
"training_size = int(len(sentences)*sp)\n",
"\n",
"print(f\"training_size {training_size}\")\n",
"\n",
"# Split the sentences\n",
"training_sentences = sentences[0:training_size]\n",
"testing_sentences = sentences[training_size:]\n",
"\n",
"# Split the labels\n",
"training_labels = labels[0:training_size]\n",
"testing_labels = labels[training_size:]\n",
"\n",
"\n",
"print(f\"testing_labels {len(testing_labels)}\")"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "MYVNY4tE5YbN"
},
"source": [
"## Data preprocessing\n",
"\n",
"Next, you will generate the vocabulary and padded sequences."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "hodsUZib1Ce7"
},
"outputs": [],
"source": [
"import numpy as np\n",
"from tensorflow.keras.preprocessing.text import Tokenizer\n",
"from tensorflow.keras.preprocessing.sequence import pad_sequences\n",
"\n",
"vocab_size = 10000\n",
"max_length = 120\n",
"trunc_type='post'\n",
"padding_type='post'\n",
"oov_tok = \"<OOV>\"\n",
"\n",
"# Initialize the Tokenizer class\n",
"tokenizer = Tokenizer(num_words=vocab_size, oov_token=oov_tok)\n",
"\n",
"# Generate the word index dictionary\n",
"tokenizer.fit_on_texts(training_sentences)\n",
"word_index = tokenizer.word_index\n",
"\n",
"# Generate and pad the training sequences\n",
"training_sequences = tokenizer.texts_to_sequences(training_sentences)\n",
"training_padded = pad_sequences(training_sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)\n",
"\n",
"# Generate and pad the testing sequences\n",
"testing_sequences = tokenizer.texts_to_sequences(testing_sentences)\n",
"testing_padded = pad_sequences(testing_sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)\n",
"\n",
"# Convert the labels lists into numpy arrays\n",
"training_labels = np.array(training_labels)\n",
"testing_labels = np.array(testing_labels)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "o23gJhj95el5"
},
"source": [
"## Build and Compile the Model\n",
"\n",
"The architecture here is almost identical to the one you used in the previous lab with the IMDB Reviews. Try to tweak the parameters and see how it affects the training time and accuracy (both training and validation)."
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "jGwXGIXvFhXW",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "18bd8a03-84d8-43a5-b700-52b206bbad8c"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Model: \"sequential\"\n",
"_________________________________________________________________\n",
" Layer (type) Output Shape Param # \n",
"=================================================================\n",
" embedding (Embedding) (None, 120, 16) 160000 \n",
" \n",
" bidirectional (Bidirectiona (None, 64) 12544 \n",
" l) \n",
" \n",
" dense (Dense) (None, 24) 1560 \n",
" \n",
" dense_1 (Dense) (None, 1) 25 \n",
" \n",
"=================================================================\n",
"Total params: 174,129\n",
"Trainable params: 174,129\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
]
}
],
"source": [
"import tensorflow as tf\n",
"\n",
"# Parameters\n",
"embedding_dim = 16\n",
"lstm_dim = 32\n",
"dense_dim = 24\n",
"reg_factor = 0.05\n",
"\n",
"# Model Definition with LSTM\n",
"model_lstm = tf.keras.Sequential([\n",
" tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),\n",
" tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(lstm_dim, kernel_regularizer=tf.keras.regularizers.L2(reg_factor))),\n",
" tf.keras.layers.Dense(dense_dim, activation='relu', kernel_regularizer=tf.keras.regularizers.L2(reg_factor)),\n",
" tf.keras.layers.Dense(1, activation='sigmoid')\n",
"])\n",
"\n",
"# Set the training parameters\n",
"model_lstm.compile(loss='binary_crossentropy',\n",
" optimizer=tf.keras.optimizers.Adam(learning_rate=0.00004, epsilon=1e-8), \n",
" metrics=['accuracy'])\n",
"\n",
"# Print the model summary\n",
"model_lstm.summary()"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "krcQGm7B5g9A"
},
"source": [
"## Train the Model"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "nEKV8EMj11BW",
"colab": {
"base_uri": "https://localhost:8080/"
},
"outputId": "0f8e1367-c077-4bf2-8094-85c19e6e779c"
},
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Epoch 1/30\n",
"752/752 [==============================] - 22s 18ms/step - loss: 4.4098 - accuracy: 0.5594 - val_loss: 3.6892 - val_accuracy: 0.5751\n",
"Epoch 2/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 3.1336 - accuracy: 0.5595 - val_loss: 2.6347 - val_accuracy: 0.5751\n",
"Epoch 3/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 2.2526 - accuracy: 0.5595 - val_loss: 1.9069 - val_accuracy: 0.5751\n",
"Epoch 4/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 1.6489 - accuracy: 0.5595 - val_loss: 1.4150 - val_accuracy: 0.5751\n",
"Epoch 5/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 1.2460 - accuracy: 0.5595 - val_loss: 1.0941 - val_accuracy: 0.5751\n",
"Epoch 6/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 0.9895 - accuracy: 0.5595 - val_loss: 0.8938 - val_accuracy: 0.5751\n",
"Epoch 7/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 0.8262 - accuracy: 0.5770 - val_loss: 0.7644 - val_accuracy: 0.6458\n",
"Epoch 8/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.7098 - accuracy: 0.7117 - val_loss: 0.6569 - val_accuracy: 0.7361\n",
"Epoch 9/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.6189 - accuracy: 0.7729 - val_loss: 0.5973 - val_accuracy: 0.7690\n",
"Epoch 10/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.5540 - accuracy: 0.8009 - val_loss: 0.5635 - val_accuracy: 0.7746\n",
"Epoch 11/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.5189 - accuracy: 0.8153 - val_loss: 0.5468 - val_accuracy: 0.7960\n",
"Epoch 12/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.4968 - accuracy: 0.8266 - val_loss: 0.5414 - val_accuracy: 0.7870\n",
"Epoch 13/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.4799 - accuracy: 0.8345 - val_loss: 0.5282 - val_accuracy: 0.7956\n",
"Epoch 14/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.4656 - accuracy: 0.8418 - val_loss: 0.5183 - val_accuracy: 0.7978\n",
"Epoch 15/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.4527 - accuracy: 0.8474 - val_loss: 0.5079 - val_accuracy: 0.8091\n",
"Epoch 16/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.4415 - accuracy: 0.8542 - val_loss: 0.5012 - val_accuracy: 0.8076\n",
"Epoch 17/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.4304 - accuracy: 0.8578 - val_loss: 0.4976 - val_accuracy: 0.8094\n",
"Epoch 18/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.4195 - accuracy: 0.8622 - val_loss: 0.4921 - val_accuracy: 0.8109\n",
"Epoch 19/30\n",
"752/752 [==============================] - 12s 17ms/step - loss: 0.4091 - accuracy: 0.8686 - val_loss: 0.4863 - val_accuracy: 0.8139\n",
"Epoch 20/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 0.3991 - accuracy: 0.8724 - val_loss: 0.4816 - val_accuracy: 0.8158\n",
"Epoch 21/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 0.3895 - accuracy: 0.8777 - val_loss: 0.4776 - val_accuracy: 0.8199\n",
"Epoch 22/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.3791 - accuracy: 0.8815 - val_loss: 0.4683 - val_accuracy: 0.8252\n",
"Epoch 23/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 0.3700 - accuracy: 0.8849 - val_loss: 0.4638 - val_accuracy: 0.8263\n",
"Epoch 24/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 0.3612 - accuracy: 0.8900 - val_loss: 0.4581 - val_accuracy: 0.8278\n",
"Epoch 25/30\n",
"752/752 [==============================] - 12s 17ms/step - loss: 0.3526 - accuracy: 0.8920 - val_loss: 0.4637 - val_accuracy: 0.8180\n",
"Epoch 26/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 0.3450 - accuracy: 0.8955 - val_loss: 0.4530 - val_accuracy: 0.8278\n",
"Epoch 27/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 0.3384 - accuracy: 0.8984 - val_loss: 0.4532 - val_accuracy: 0.8285\n",
"Epoch 28/30\n",
"752/752 [==============================] - 12s 16ms/step - loss: 0.3311 - accuracy: 0.9023 - val_loss: 0.4511 - val_accuracy: 0.8278\n",
"Epoch 29/30\n",
"752/752 [==============================] - 12s 17ms/step - loss: 0.3249 - accuracy: 0.9044 - val_loss: 0.4546 - val_accuracy: 0.8270\n",
"Epoch 30/30\n",
"752/752 [==============================] - 13s 17ms/step - loss: 0.3191 - accuracy: 0.9067 - val_loss: 0.4495 - val_accuracy: 0.8300\n"
]
}
],
"source": [
"NUM_EPOCHS = 30\n",
"\n",
"# Train the model\n",
"history_lstm = model_lstm.fit(training_padded, training_labels, epochs=NUM_EPOCHS, validation_data=(testing_padded, testing_labels))"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"id": "g9DC6dmLF8DC",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 541
},
"outputId": "e2a5179c-0f13-4fc3-b9d7-0d4232cc91a6"
},
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
}
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"# Plot Utility\n",
"def plot_graphs(history, string):\n",
" plt.plot(history.history[string])\n",
" plt.plot(history.history['val_'+string])\n",
" plt.xlabel(\"Epochs\")\n",
" plt.ylabel(string)\n",
" plt.legend([string, 'val_'+string])\n",
" plt.show()\n",
"\n",
"# Plot the accuracy and loss history\n",
"plot_graphs(history_lstm, 'accuracy')\n",
"plot_graphs(history_lstm, 'loss')"
]
}
],
"metadata": {
"accelerator": "GPU",
"colab": {
"collapsed_sections": [],
"name": "sarcasm_Bi_LSTM.ipynb",
"provenance": [],
"machine_shape": "hm",
"include_colab_link": true
},
"kernelspec": {
"display_name": "Python 3",
"name": "python3"
},
"language_info": {
"name": "python"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment