Thursday 9 May 2024

How to Predict Sentiment from Movie Reviews Using Deep Learning (Text Classification)

 Sentiment analysis is a natural language processing problem where text is understood, and the underlying intent is predicted.

In this post, you will discover how you can predict the sentiment of movie reviews as either positive or negative in Python using the Keras deep learning library.

After reading this post, you will know:

  • About the IMDB sentiment analysis problem for natural language processing and how to load it in Keras
  • How to use word embedding in Keras for natural language problems
  • How to develop and evaluate a multi-layer perception model for the IMDB problem
  • How to develop a one-dimensional convolutional neural network model for the IMDB problem

    IMDB Movie Review Sentiment Problem Description

    The dataset is the Large Movie Review Dataset, often referred to as the IMDB dataset.

    The IMDB dataset contains 25,000 highly polar movie reviews (good or bad) for training and the same amount again for testing. The problem is to determine whether a given movie review has a positive or negative sentiment.

    The data was collected by Stanford researchers and used in a 2011 paper [PDF] where a split of 50/50 of the data was used for training and test. An accuracy of 88.89% was achieved.

    The data was also used as the basis for a Kaggle competition titled “Bag of Words Meets Bags of Popcorn” from late 2014 to early 2015. Accuracy was achieved above 97%, with winners achieving 99%.

    Need help with Deep Learning in Python?

    Take my free 2-week email course and discover MLPs, CNNs and LSTMs (with code).

    Click to sign-up now and also get a free PDF Ebook version of the course.

    Load the IMDB Dataset with Keras

    Keras provides built-in access to the IMDB dataset.

    The keras.datasets.imdb.load_data() allows you to load the dataset in a format that is ready for use in neural networks and deep learning models.

    The words have been replaced by integers that indicate the absolute popularity of the word in the dataset. The sentences in each review are therefore comprised of a sequence of integers.

    Calling imdb.load_data() the first time will download the IMDB dataset to your computer and store it in your home directory under ~/.keras/datasets/imdb.pkl as a 32-megabyte file.

    Usefully, the imdb.load_data() provides additional arguments, including the number of top words to load (where words with a lower integer are marked as zero in the returned data), the number of top words to skip (to avoid the repeated use of “the”), and the maximum length of reviews to support.

    Let’s load the dataset and calculate some properties of it. You will start by loading some libraries and the entire IMDB dataset as a training dataset.

    Next, you can display the shape of the training dataset.

    Running this snippet, you can see that there are 50,000 records.

    You can also print the unique class values.

    You can see it is a binary classification problem for good and bad sentiment in the review.

    Next, you can get an idea of the total number of unique words in the dataset.

    Interestingly, you can see that there are just under 100,000 words across the entire dataset.

    Finally, you can get an idea of the average review length.

    You can see that the average review has just under 300 words with a standard deviation of just over 200 words.

    Looking at a box and whisker plot for the review lengths in words, you can see an exponential distribution that you can probably cover the mass of the distribution with a clipped length of 400 to 500 words.

    Review Length in Words for IMDB Dataset

    Review length in words for IMDB dataset

    Word Embeddings

    A recent breakthrough in the field of natural language processing is called word embedding.

    This technique is where words are encoded as real-valued vectors in a high-dimensional space, where the similarity between words in terms of meaning translates to closeness in the vector space.

    Discrete words are mapped to vectors of continuous numbers. This is useful when working with natural language problems with neural networks and deep learning models as they require numbers as input.

    Keras provides a convenient way to convert positive integer representations of words into a word embedding by an Embedding layer.

    The layer takes arguments that define the mapping, including the maximum number of expected words, also called the vocabulary size (e.g., the largest integer value that will be seen as an integer). The layer also allows you to specify the dimensionality for each word vector, called the output dimension.

    You want to use a word embedding representation for the IMDB dataset.

    Let’s say that you are only interested in the first 5,000 most used words in the dataset. Therefore, your vocabulary size will be 5,000. You can choose to use a 32-dimension vector to represent each word. Finally, you may choose to cap the maximum review length at 500 words, truncating reviews longer than that and padding reviews shorter than that with 0 values.

    You will load the IMDB dataset as follows:

    You will then use the Keras utility to truncate or pad the dataset to a length of 500 for each observation using the sequence.pad_sequences() function.

    Finally, later on, the first layer of your model would be a word embedding layer created using the Embedding class as follows:

    The output of this first layer would be a matrix with the size 32×500 for a given review training or test pattern in integer format.

    Now that you know how to load the IMDB dataset in Keras and how to use a word embedding representation for it, let’s develop and evaluate some models.

    Simple Multi-Layer Perceptron Model for the IMDB Dataset

    You can start by developing a simple multi-layer perceptron model with a single hidden layer.

    The word embedding representation is a true innovation, and you will demonstrate what would have been considered world-class results in 2011 with a relatively simple neural network.

    Let’s start by importing the classes and functions required for this model and initializing the random number generator to a constant value to ensure you can easily reproduce the results.

    Next, you will load the IMDB dataset. You will simplify the dataset as discussed during the section on word embeddings—only the top 5,000 words will be loaded.

    You will also use a 50/50 split of the dataset into training and test sets. This is a good standard split methodology.

    You will bound reviews at 500 words, truncating longer reviews and zero-padding shorter ones.

    Now, you can create your model. You will use an Embedding layer as the input layer, setting the vocabulary to 5,000, the word vector size to 32 dimensions, and the input_length to 500. The output of this first layer will be a 32×500-sized matrix, as discussed in the previous section.

    You will flatten the Embedded layers’ output to one dimension, then use one dense hidden layer of 250 units with a rectifier activation function. The output layer has one neuron and will use a sigmoid activation to output values of 0 and 1 as predictions.

    The model uses logarithmic loss and is optimized using the efficient ADAM optimization procedure.

    You can fit the model and use the test set as validation while training. This model overfits very quickly, so you will use very few training epochs, in this case, just 2.

    There is a lot of data, so you will use a batch size of 128. After the model is trained, you will evaluate its accuracy on the test dataset.

    Tying all of this together, the complete code listing is provided below.

    Running this example fits the model and summarizes the estimated performance.

    Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.

    You can see that this very simple model achieves a score of 87%, which is in the neighborhood of the original paper, with minimal effort.

    You can likely do better if you trained this network, perhaps using a larger embedding and adding more hidden layers.

    Let’s try a different network type.

    One-Dimensional Convolutional Neural Network Model for the IMDB Dataset

    Convolutional neural networks were designed to honor the spatial structure in image data while being robust to the position and orientation of learned objects in the scene.

    This same principle can be used on sequences, such as the one-dimensional sequence of words in a movie review. The same properties that make the CNN model attractive for learning to recognize objects in images can help to learn structure in paragraphs of words, namely the techniques invariance to the specific position of features.

    Keras supports one-dimensional convolutions and pooling by the Conv1D and MaxPooling1D classes, respectively.

    Again, let’s import the classes and functions needed for this example and initialize your random number generator to a constant value so that you can easily reproduce the results.

    You can also load and prepare the IMDB dataset as you did before.

    You can now define your convolutional neural network model. This time, after the Embedding input layer, insert a Conv1D layer. This convolutional layer has 32 feature maps and reads embedded word representations’ three vector elements of the word embedding at a time.

    The convolutional layer is followed by a 1D max pooling layer with a length and stride of 2 that halves the size of the feature maps from the convolutional layer. The rest of the network is the same as the neural network above.

    You will also fit the network the same as before.

    Tying all of this together, the complete code listing is provided below.

    Running the example, you are first presented with a summary of the network structure. You can see your convolutional layer preserves the dimensionality of your Embedding input layer of 32-dimensional input with a maximum of 500 words. The pooling layer compresses this representation by halving it.

    Note: Your results may vary given the stochastic nature of the algorithm or evaluation procedure, or differences in numerical precision. Consider running the example a few times and compare the average outcome.

    Running the example offers a slight but welcome improvement over the neural network model above with an accuracy of 87%.

    Again, there is a lot of opportunity for further optimization, such as using deeper and/or larger convolutional layers.

    One interesting idea is to set the max pooling layer to use an input length of 500. This would compress each feature map to a single 32-length vector and may boost performance.

    Summary

    In this post, you discovered the IMDB sentiment analysis dataset for natural language processing.

    You learned how to develop deep learning models for sentiment analysis, including:

    • How to load and review the IMDB dataset within Keras
    • How to develop a large neural network model for sentiment analysis
    • How to develop a one-dimensional convolutional neural network model for sentiment analysis

    Do you have any questions about sentiment analysis or this post? Ask your questions in the comments, and I will do my best to answer.

No comments:

Post a Comment

Connect broadband