Tolong buat penjelasan dalam bentuk paragraf-paragraf untuk kode python analisis sentimen ini!
import numpy as np
import pandas as pd
import pickle
import re
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.metrics import confusion_matrix, classification_report
from keras.preprocessing.text import Tokenizer
from keras.utils import pad_sequences
from keras.models import Sequential
from keras.layers import Dense, Embedding, LSTM, SpatialDropout1D, Conv1D, MaxPooling1D, GlobalMaxPooling1D
from keras.callbacks import EarlyStopping

# Membaca dataset
data_list = pickle.load(open('filtered_pre_processed_berita_joined_done.pkl', 'rb'))
data = pd.DataFrame(data_list, columns=['judul', 'isi', 'pre_processed', 'Label', 'Nama_Pelabel'])
data['Isi Berita'] = data['pre_processed']

# Tokenisasi data
tokenizer = Tokenizer(num_words=5000)
tokenizer.fit_on_texts(data['Isi Berita'])
X = tokenizer.texts_to_sequences(data['Isi Berita'])
X = pad_sequences(X, maxlen=300)

# Encoding label
le = LabelEncoder()
y = le.fit_transform(data['Label'])

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

model = Sequential()
model.add(Embedding(input_dim=5000, output_dim=128, input_length=300))
model.add(SpatialDropout1D(0.4))
model.add(LSTM(196, dropout=0.2, recurrent_dropout=0.2, return_sequences=True))
model.add(Conv1D(filters=32, kernel_size=3, activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(filters=128, kernel_size=3, activation='relu'))
model.add(GlobalMaxPooling1D())
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

history = model.fit(X_train, y_train, epochs=5, batch_size=256, validation_split=0.2, callbacks=[EarlyStopping(monitor='val_loss', patience=2)])

scores = model.evaluate(X_test, y_test, verbose=1)
print("Akurasi: %.2f%%" % (scores[1]*100))

predictions = model.predict(X_test)
y_pred = (predictions > 0.5).astype(int)

labels = np.unique(y)
conf_matrix = confusion_matrix(y_test, y_pred, labels=labels)
class_report = classification_report(y_test, y_pred)

print("Classification Report:\n\n", class_report)