{
"cells": [
{
"cell_type": "markdown",
"id": "dd93c4f2-d64a-4148-9673-cd749392b11d",
"metadata": {},
"source": [
"# Practical-2b (Classification using Deep Neural Network - IMDB Dataset)\n",
"\n",
"---\n",
"\n",
"Problem Statement: Binary classification using Deep Neural Networks Example: Classify movie reviews into positive\" reviews and \"negative\" reviews, just based on the text content of the reviews. Use IMDB dataset\n",
"\n",
"- Dataset link: https://www.kaggle.com/datasets/lakshmi25npathi/imdb-dataset-of-50k-movie-reviews\n",
"- Dataset available in [Datasets](https://git.kska.io/sppu-be-comp-content/DeepLearning/src/branch/main/Datasets/) directory.\n",
"\n",
"---"
]
},
{
"cell_type": "code",
"execution_count": 1,
"id": "0a8eeb31-1a70-45b4-93f1-2611c5d612d3",
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n",
"I0000 00:00:1777813310.532586 61345 cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.\n",
"I0000 00:00:1777813310.578090 61345 cpu_feature_guard.cc:227] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n",
"To enable the following instructions: AVX2 FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n",
"WARNING: All log messages before absl::InitializeLog() is called are written to STDERR\n",
"I0000 00:00:1777813312.920697 61345 cudart_stub.cc:31] Could not find cuda drivers on your machine, GPU will not be used.\n"
]
}
],
"source": [
"# 1. Import Libraries\n",
"import re\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.preprocessing import LabelEncoder\n",
"from sklearn.metrics import confusion_matrix, classification_report\n",
"from tensorflow.keras.models import Sequential\n",
"from tensorflow.keras.layers import Dense, Embedding, GlobalAveragePooling1D\n",
"from tensorflow.keras.preprocessing.text import Tokenizer\n",
"from tensorflow.keras.preprocessing.sequence import pad_sequences"
]
},
{
"cell_type": "code",
"execution_count": 2,
"id": "2cec2b8a-0371-4884-b17b-cd909a4b1b72",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" review sentiment\n",
"0 One of the other reviewers has mentioned that ... positive\n",
"1 A wonderful little production.
The... positive\n",
"2 I thought this was a wonderful way to spend ti... positive\n",
"3 Basically there's a family where a little boy ... negative\n",
"4 Petter Mattei's \"Love in the Time of Money\" is... positive\n"
]
}
],
"source": [
"# 2. Load Dataset\n",
"data = pd.read_csv('IMDB Dataset.csv')\n",
"print(data.head())"
]
},
{
"cell_type": "code",
"execution_count": 3,
"id": "dfed9c66",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Shape: (50000, 2)\n",
"\n",
"Missing Values:\n",
" review 0\n",
"sentiment 0\n",
"dtype: int64\n",
"\n",
"Class Distribution:\n",
" sentiment\n",
"positive 25000\n",
"negative 25000\n",
"Name: count, dtype: int64\n"
]
},
{
"data": {
"image/png": "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pX379v2l3nKlpaXdMBy2atVK3bt314QJE1SxYkU9/PDDmjdvXp5rfG6kdOnSqlq1quX62rVr5xmrU6dOkd876tdff1WpUqVUq1Yth3F/f395e3vr119/dRi/9udbhfS+wd8PH0cAipizs7OaNGmiJk2aqE6dOurbt68+++wzjR8/Xjk5ObLZbFq5cmW+n4Ty9PR0WL7ep6X+6p1Drjfvn20vJydHunJdk7+/f566az/xVBSf9goODtaePXuUkZFhHjG6GR999JH69Omjrl27atSoUfL19ZWTk5MmT56so0ePmnW+vr7as2ePVq9erZUrV2rlypWaN2+enn76ac2fP1+S1LJlSx09elRfffWV1qxZo7lz52r69OmaM2eOBgwYUODXmJmZqZ9++kkNGjS4bo3NZtOSJUu0detWLVu2TKtXr1a/fv00depUbd26Nc/PUn5cXFxUqlTh/l/aZrPl+/OZe/H/X53biqJ63+Dvh9AE3EL33nuvJOnUqVOSpJo1a8owDAUFBalOnTqFso1beefkmjVrSlcCRfv27Qtlzpvt/6GHHlJ8fLw+//xz9erV66a3t2TJEtWoUUNffPGFw7bHjx+fp9bZ2VkPPfSQHnroIeXk5Oif//yn3nnnHb300kvmUY/y5curb9++6tu3r9LS0tSyZUvFxMT8pdC0ZMkS/fHHH4qIiPjT2mbNmqlZs2aaNGmSFi1apMjISH3yyScaMGBAof9s5Hca8qeffnL4pF25cuXyPQ127dGgm+ktMDBQOTk5OnLkiOrVq2eOnz59WsnJyQoMDLyJVwFYx+k5oAisW7cu3//F5l6LUbduXUnSI488IicnJ02YMCFPvWEYOnv27E1v28PDQ7py/6KiFhERIbvdrldffTXf62gKcidrd3d36Sb6Hzx4sCpVqqTnnntOP/30U571SUlJmjhx4nWfn3sU4ur9v23bNsXHxzvUXft3UapUKd19992SZJ4Cu7bG09NTtWrVuqlTZNfau3evhg8frnLlyikqKuq6defPn8/zM9SoUSOH/m523/6ZL7/80ry+TZK2b9+ubdu2qVOnTuZYzZo1dejQIYefhb179zp86vBme+vcubMkacaMGQ7j06ZNkyR16dKlwK8JuBGONAFF4JlnntGlS5fUrVs3BQcHKyMjQ1u2bNHixYtVvXp19e3bV7ryC2XixIkaM2aM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",
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"Sample positive review:\n",
" One of the other reviewers has mentioned that after watching just 1 Oz episode you'll be hooked. They are right, as this is exactly what happened with me.
The first thing that struck me about Oz was its brutality and unflinching scenes of violence, which set in right from the word GO. Tru\n",
"\n",
"Sample negative review:\n",
" Basically there's a family where a little boy (Jake) thinks there's a zombie in his closet & his parents are fighting all the time.
This movie is slower than a soap opera... and suddenly, Jake decides to become Rambo and kill the zombie.
OK, first of all when you're going to ma\n"
]
}
],
"source": [
"# 3. Exploratory Data Analysis (EDA)\n",
"print(\"Shape:\", data.shape)\n",
"print(\"\\nMissing Values:\\n\", data.isnull().sum())\n",
"print(\"\\nClass Distribution:\\n\", data['sentiment'].value_counts())\n",
"\n",
"# Visualize class distribution\n",
"sns.countplot(x='sentiment', data=data)\n",
"plt.title('Sentiment Class Distribution')\n",
"plt.show()\n",
"\n",
"# Sample reviews\n",
"print(\"\\nSample positive review:\\n\", data[data['sentiment'] == 'positive']['review'].iloc[0][:300])\n",
"print(\"\\nSample negative review:\\n\", data[data['sentiment'] == 'negative']['review'].iloc[0][:300])"
]
},
{
"cell_type": "code",
"execution_count": 4,
"id": "4ae3e31b",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Sample cleaned review:\n",
" one of the other reviewers has mentioned that after watching just 1 oz episode you'll be hooked. they are right, as this is exactly what happened with me.the first thing that struck me about oz was its brutality and unflinching scenes of violence, which set in right from the word go. trust me, this \n"
]
}
],
"source": [
"# 4. Data Cleaning - Strip HTML Tags\n",
"def clean_text(text):\n",
" text = re.sub(r'<.*?>', '', text) # remove HTML tags like \n",
" text = text.lower().strip() # lowercase and trim whitespace\n",
" return text\n",
"\n",
"data['review'] = data['review'].apply(clean_text)\n",
"print(\"Sample cleaned review:\\n\", data['review'].iloc[0][:300])"
]
},
{
"cell_type": "code",
"execution_count": 5,
"id": "9e041a03-e7a7-42ab-a691-f47ba275053e",
"metadata": {},
"outputs": [],
"source": [
"# 5. Encode Labels and Separate Features\n",
"label_encoder = LabelEncoder()\n",
"data['sentiment'] = label_encoder.fit_transform(data['sentiment']) # positive=1, negative=0\n",
"\n",
"X = data['review'].values # input: review text\n",
"y = data['sentiment'].values # output: 0 or 1"
]
},
{
"cell_type": "code",
"execution_count": 6,
"id": "05290c03-55b1-4110-a43d-4a80d85afba8",
"metadata": {},
"outputs": [],
"source": [
"# 6. Tokenize and Pad Text Sequences\n",
"vocab_size = 10000 # keep only top 10,000 most frequent words\n",
"max_length = 200 # truncate/pad all reviews to 200 words\n",
"\n",
"tokenizer = Tokenizer(num_words=vocab_size, oov_token='') # handles unknown words\n",
"tokenizer.fit_on_texts(X) # build word index from training text\n",
"\n",
"sequences = tokenizer.texts_to_sequences(X) # convert each word to its integer index\n",
"padded_sequences = pad_sequences(sequences, maxlen=max_length,\n",
" padding='post', truncating='post') # pad/truncate to fixed length"
]
},
{
"cell_type": "code",
"execution_count": 7,
"id": "bb7a6674-014b-4794-b379-1dcd86fa4372",
"metadata": {},
"outputs": [],
"source": [
"# 7. Split into Training and Testing Sets\n",
"X_train, X_test, y_train, y_test = train_test_split(padded_sequences, y, test_size=0.2, random_state=42)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"id": "b17621cf-a2de-4547-ba38-abd75b0ac971",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"