pip install kagglehub tensorflow nltk -q

import numpy as np
import pandas as pd
import kagglehub
import nltk
nltk.download('punkt')

from nltk.tokenize import word_tokenize

from sklearn.model_selection import train_test_split

from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, Conv1D
from tensorflow.keras.layers import GlobalMaxPooling1D, Dense

# ============================================================
# DOWNLOAD IMDB DATASET
# ============================================================

path = kagglehub.dataset_download(
    "lakshmi25npathi/imdb-dataset-of-50k-movie-reviews"
)

data = pd.read_csv(path + "/IMDB Dataset.csv")

# Convert labels
data['sentiment'] = data['sentiment'].map({
    'positive':1,
    'negative':0
})

# Reduce dataset size (faster training)
data = data.sample(20000)

X = data['review']
y = data['sentiment']

# ============================================================
# TEXT TOKENIZATION
# ============================================================

max_words = 10000
max_len = 200

tokenizer = Tokenizer(num_words=max_words)

tokenizer.fit_on_texts(X)

sequences = tokenizer.texts_to_sequences(X)

X_pad = pad_sequences(sequences, maxlen=max_len)

X_train, X_test, y_train, y_test = train_test_split(
    X_pad, y, test_size=0.2, random_state=42
)

# ============================================================
# DOWNLOAD GLOVE EMBEDDINGS
# ============================================================

!wget http://nlp.stanford.edu/data/glove.6B.zip
!unzip glove.6B.zip

embedding_index = {}

with open("glove.6B.100d.txt", encoding="utf8") as f:

    for line in f:

        values = line.split()
        word = values[0]
        vector = np.asarray(values[1:], dtype='float32')

        embedding_index[word] = vector

print("Loaded word vectors:", len(embedding_index))

# ============================================================
# CREATE EMBEDDING MATRIX
# ============================================================

embedding_dim = 100

word_index = tokenizer.word_index

embedding_matrix = np.zeros((max_words, embedding_dim))

for word, i in word_index.items():

    if i < max_words:

        vector = embedding_index.get(word)

        if vector is not None:

            embedding_matrix[i] = vector

# ============================================================
# CNN MODEL WITH TRANSFER LEARNING
# ============================================================

model = Sequential()

model.add(Embedding(
    input_dim=max_words,
    output_dim=embedding_dim,
    weights=[embedding_matrix],
    input_length=max_len,
    trainable=False
))

model.add(Conv1D(128, 5, activation='relu'))

model.add(GlobalMaxPooling1D())

model.add(Dense(64, activation='relu'))

model.add(Dense(1, activation='sigmoid'))

model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
)

model.summary()

# ============================================================
# TRAIN MODEL
# ============================================================

model.fit(
    X_train,
    y_train,
    epochs=5,
    batch_size=32,
    validation_split=0.2
)

# ============================================================
# EVALUATE MODEL
# ============================================================

loss, accuracy = model.evaluate(X_test, y_test)

print("Test Accuracy:", accuracy)