From 0550366fadcd8e1c413e6bb4a920af3fe29e9bac Mon Sep 17 00:00:00 2001 From: Susan Li Date: Fri, 1 Jun 2018 00:54:04 -0400 Subject: [PATCH] Add file --- sentiment_analysis.ipynb | 880 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 880 insertions(+) create mode 100644 sentiment_analysis.ipynb diff --git a/sentiment_analysis.ipynb b/sentiment_analysis.ipynb new file mode 100644 index 0000000..84c90a3 --- /dev/null +++ b/sentiment_analysis.ipynb @@ -0,0 +1,880 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Sentiment Analysis\n", + "\n", + "_Artificial Intelligence Nanodegree Program | Natural Language Processing_\n", + "\n", + "---\n", + "\n", + "With the rise of online social media platforms like Twitter, Facebook and Reddit, and the proliferation of customer reviews on sites like Amazon and Yelp, we now have access, more than ever before, to massive text-based data sets! They can be analyzed in order to determine how large portions of the population feel about certain products, events, etc. This sort of analysis is called _sentiment analysis_. In this notebook you will build an end-to-end sentiment classification system from scratch.\n", + "\n", + "## Instructions\n", + "\n", + "Some template code has already been provided for you, and you will need to implement additional functionality to successfully complete this notebook. You will not need to modify the included code beyond what is requested. Sections that begin with '**TODO**' in the header indicate that you need to complete or implement some portion within them. Instructions will be provided for each section and the specifics of the implementation are marked in the code block with a `# TODO: ...` comment. Please be sure to read the instructions carefully!\n", + "\n", + "In addition to implementing code, there will be questions for you to answer which relate to the task and your implementation. Each section where you will answer a question is preceded by a '**Question:**' header. Carefully read each question and provide your answer below the '**Answer:**' header by editing the Markdown cell.\n", + "\n", + "> **Note**: Code and Markdown cells can be executed using the **Shift+Enter** keyboard shortcut. In addition, a cell can be edited by typically clicking it (double-click for Markdown cells) or by pressing **Enter** while it is highlighted." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 1: Exploring the data!\n", + "\n", + "The dataset we are going to use is very popular among researchers in Natural Language Processing, usually referred to as the [IMDb dataset](http://ai.stanford.edu/~amaas/data/sentiment/). It consists of movie reviews from the website [imdb.com](http://www.imdb.com/), each labeled as either '**pos**itive', if the reviewer enjoyed the film, or '**neg**ative' otherwise.\n", + "\n", + "> Maas, Andrew L., et al. [Learning Word Vectors for Sentiment Analysis](http://ai.stanford.edu/~amaas/data/sentiment/). In _Proceedings of the 49th Annual Meeting of the Association for Computational Linguistics: Human Language Technologies_. Association for Computational Linguistics, 2011.\n", + "\n", + "We have provided the dataset for you. You can load it in by executing the Python cell below." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "IMDb reviews: train = 12500 pos / 12500 neg, test = 12500 pos / 12500 neg\n" + ] + } + ], + "source": [ + "import os\n", + "import glob\n", + "\n", + "def read_imdb_data(data_dir='data/imdb-reviews'):\n", + " \"\"\"Read IMDb movie reviews from given directory.\n", + " \n", + " Directory structure expected:\n", + " - data/\n", + " - train/\n", + " - pos/\n", + " - neg/\n", + " - test/\n", + " - pos/\n", + " - neg/\n", + " \n", + " \"\"\"\n", + "\n", + " # Data, labels to be returned in nested dicts matching the dir. structure\n", + " data = {}\n", + " labels = {}\n", + "\n", + " # Assume 2 sub-directories: train, test\n", + " for data_type in ['train', 'test']:\n", + " data[data_type] = {}\n", + " labels[data_type] = {}\n", + "\n", + " # Assume 2 sub-directories for sentiment (label): pos, neg\n", + " for sentiment in ['pos', 'neg']:\n", + " data[data_type][sentiment] = []\n", + " labels[data_type][sentiment] = []\n", + " \n", + " # Fetch list of files for this sentiment\n", + " path = os.path.join(data_dir, data_type, sentiment, '*.txt')\n", + " files = glob.glob(path)\n", + " \n", + " # Read reviews data and assign labels\n", + " for f in files:\n", + " with open(f) as review:\n", + " data[data_type][sentiment].append(review.read())\n", + " labels[data_type][sentiment].append(sentiment)\n", + " \n", + " assert len(data[data_type][sentiment]) == len(labels[data_type][sentiment]), \\\n", + " \"{}/{} data size does not match labels size\".format(data_type, sentiment)\n", + " \n", + " # Return data, labels as nested dicts\n", + " return data, labels\n", + "\n", + "\n", + "data, labels = read_imdb_data()\n", + "print(\"IMDb reviews: train = {} pos / {} neg, test = {} pos / {} neg\".format(\n", + " len(data['train']['pos']), len(data['train']['neg']),\n", + " len(data['test']['pos']), len(data['test']['neg'])))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now that the data is loaded in, let's take a quick look at one of the positive reviews:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "This movie was beautiful. It was full of memorable imagery, good acting, and touching subject matter. It would be very easy to write it off as being too sentimental, but that is the sentiments this type of a movie is trying to achieve. I was totally involved in the story's unfolding and presentation. There were a few cheesy shots, but such is to be expected in a religious propaganda film. The only complaint I can conjure is there wasn't a ton of details. However, this movie wasn't created to explain every element of Joseph Smith's life, ministry, triumphs, controversies, failures etc.; it was designed for a quick glimpse at a few highlights of one of the most amazing American and historical religious figures of all time.\n" + ] + } + ], + "source": [ + "print(data['train']['pos'][2])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And one with a negative sentiment:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "It's a good thing The Score came along for Marlon Brando as a farewell performance because I'd hate to think of him going out on Free Money. Not what his fans ought to remember him by.

Brando in his last years is looking more like Orson Welles and Free Money is the kind of film Welles would have done looking for financing of his own work. Brando is the warden of a local prison which in America, when it's located in a small rural setting is usually the largest employer in the area. That gives one who is in charge a lot of clout.

Unfortunately he has one weakness he indulges, his two twin bimbos otherwise known as daughters. Even when they get simultaneously pregnant by a pair of losers, Charlie Sheen and Thomas Haden Church, their hearts still belong to Daddy.

Not to fear because Brando's willing to give them jobs in the prison where they work under conditions not much better than the convicts have. What to do, but commit a robbery of a train which goes through the locality every so often carrying used money to be burned by the Treasury.

Although Free Money has some moments of humor, for most of the time it's quite beneath the talents of all those involved. Some of them would include Donald Sutherland as an equally corrupt judge and Mira Sorvino as his stepdaughter, but also straight arrow FBI agent.

Of course these people and the rest of the cast got to work with someone who many rate as the greatest American actor of the last century. Were it not for Brando's presence and were it some 40 years earlier, Free Money would be playing the drive-in circuit in red state America where the populace could see how they're being satirized.

Or a feeble attempt is made to satirize them.\n" + ] + } + ], + "source": [ + "print(data['train']['neg'][2])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can also make a wordcloud visualization of the reviews." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: wordcloud in /opt/conda/lib/python3.6/site-packages\n", + "Requirement already satisfied: matplotlib in /opt/conda/lib/python3.6/site-packages (from wordcloud)\n", + "Requirement already satisfied: pillow in /opt/conda/lib/python3.6/site-packages (from wordcloud)\n", + "Requirement already satisfied: numpy>=1.6.1 in /opt/conda/lib/python3.6/site-packages (from wordcloud)\n", + "Requirement already satisfied: six>=1.10 in /opt/conda/lib/python3.6/site-packages (from matplotlib->wordcloud)\n", + "Requirement already satisfied: python-dateutil>=2.0 in /opt/conda/lib/python3.6/site-packages (from matplotlib->wordcloud)\n", + "Requirement already satisfied: pytz in /opt/conda/lib/python3.6/site-packages (from matplotlib->wordcloud)\n", + "Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.6/site-packages/cycler-0.10.0-py3.6.egg (from matplotlib->wordcloud)\n", + "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /opt/conda/lib/python3.6/site-packages (from matplotlib->wordcloud)\n", + "Requirement already satisfied: olefile in /opt/conda/lib/python3.6/site-packages (from pillow->wordcloud)\n", + "\u001b[33mYou are using pip version 9.0.1, however version 10.0.1 is available.\n", + "You should consider upgrading via the 'pip install --upgrade pip' command.\u001b[0m\n" + ] + } + ], + "source": [ + "# Installing wordcloud\n", + "!pip install wordcloud" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "%matplotlib inline\n", + "\n", + "from wordcloud import WordCloud, STOPWORDS\n", + "\n", + "sentiment = 'pos'\n", + "\n", + "# Combine all reviews for the desired sentiment\n", + "combined_text = \" \".join([review for review in data['train'][sentiment]])\n", + "\n", + "# Initialize wordcloud object\n", + "wc = WordCloud(background_color='white', max_words=50,\n", + " # update stopwords to include common words like film and movie\n", + " stopwords = STOPWORDS.update(['br','film','movie']))\n", + "\n", + "# Generate and plot wordcloud\n", + "plt.imshow(wc.generate(combined_text))\n", + "plt.axis('off')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Try changing the sentiment to `'neg'` and see if you can spot any obvious differences between the wordclouds." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "sentiment = 'neg'\n", + "\n", + "combined_text = \" \".join([review for review in data['train'][sentiment]])\n", + "\n", + "wc = WordCloud(background_color = 'white', max_words=50, stopwords = STOPWORDS.update(['br', 'film', 'movie']))\n", + "plt.imshow(wc.generate(combined_text))\n", + "plt.axis('off')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TODO: Form training and test sets\n", + "\n", + "Now that you've seen what the raw data looks like, combine the positive and negative documents to get one unified training set and one unified test set." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "IMDb reviews (combined): train = 25000, test = 25000\n" + ] + } + ], + "source": [ + "from sklearn.utils import shuffle\n", + "\n", + "def prepare_imdb_data(data):\n", + " \"\"\"Prepare training and test sets from IMDb movie reviews.\"\"\"\n", + " \n", + " # TODO: Combine positive and negative reviews and labels\n", + " data_train = data['train']['pos'] + data['train']['neg']\n", + " labels_train = ['pos' for i in range(len(data['train']['pos']))] + ['neg' for i in range(len(data['train']['neg']))]\n", + " \n", + " data_test = data['test']['pos'] + data['test']['neg']\n", + " labels_test = ['pos' for i in range(len(data['test']['pos']))] + ['neg' for i in range(len(data['test']['neg']))]\n", + " \n", + " # TODO: Shuffle reviews and corresponding labels within training and test sets\n", + " data_train, labels_train = shuffle(data_train, labels_train, random_state=0)\n", + " data_test, labels_test = shuffle(data_test, labels_test, random_state=0)\n", + " \n", + " # Return a unified training data, test data, training labels, test labets\n", + " return data_train, data_test, labels_train, labels_test\n", + "\n", + "\n", + "data_train, data_test, labels_train, labels_test = prepare_imdb_data(data)\n", + "print(\"IMDb reviews (combined): train = {}, test = {}\".format(len(data_train), len(data_test)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 2. Preprocessing\n", + "\n", + "As you might have noticed in the sample reviews, our raw data includes HTML. Therefore there are HTML tags that need to be removed. We also need to remove non-letter characters, normalize uppercase letters by converting them to lowercase, tokenize, remove stop words, and stem the remaining words in each document.\n", + "\n", + "### TODO: Convert each review to words\n", + "\n", + "As your next task, you should complete the function `review_to_words()` that performs all these steps. For your convenience, in the Python cell below we provide you with all the libraries that you may need in order to accomplish these preprocessing steps. Make sure you can import all of them! (If not, pip install from a terminal and run/import again.)" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[nltk_data] Downloading package stopwords to /root/nltk_data...\n", + "[nltk_data] Unzipping corpora/stopwords.zip.\n" + ] + } + ], + "source": [ + "# BeautifulSoup to easily remove HTML tags\n", + "from bs4 import BeautifulSoup \n", + "\n", + "# RegEx for removing non-letter characters\n", + "import re\n", + "\n", + "# NLTK library for the remaining steps\n", + "import nltk\n", + "nltk.download(\"stopwords\") # download list of stopwords (only once; need not run it again)\n", + "from nltk.corpus import stopwords # import stopwords\n", + "\n", + "from nltk.stem.porter import *\n", + "stemmer = PorterStemmer()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['test', 'test', 'would', 'make', 'great', 'movi', 'review']" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "def review_to_words(review):\n", + " \"\"\"Convert a raw review string into a sequence of words.\"\"\"\n", + " \n", + " # TODO: Remove HTML tags and non-letters,\n", + " soup = BeautifulSoup(review, 'html5lib')\n", + " text = soup.get_text()\n", + " # convert to lowercase, tokenize,\n", + " text = re.sub(r\"[^a-zA-Z0-9]\", ' ', text.lower())\n", + " words = text.split()\n", + " # remove stopwords and stem\n", + " words = [w.strip() for w in words if w not in stopwords.words('english')]\n", + " words = [stemmer.stem(w) for w in words]\n", + "\n", + " # Return final list of words\n", + " return words\n", + "\n", + "\n", + "review_to_words(\"\"\"This is just a test.

\n", + "But if it wasn't a test, it would make for a Great movie review!\"\"\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "With the function `review_to_words()` fully implemeneted, we can apply it to all reviews in both training and test datasets. This may take a while, so let's build in a mechanism to write to a cache file and retrieve from it later." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Read preprocessed data from cache file: preprocessed_data.pkl\n", + "\n", + "--- Raw review ---\n", + "Sometimes you have to look back to go forward. The 60's did just that. We need to remember the past. The past is part of the future.

Great mix Gary J. Coppola. I see a great future. You deserve to be nominated and win, The 60's best mixer of the year.

Best mini-series of all times.

Thanks Ursula

\n", + "\n", + "--- Preprocessed words ---\n", + "['blond', 'blonder', 'pamela', 'anderson', 'denis', 'richard', 'almost', 'everi', 'scene', 'want', 'movi', 'utterli', 'unreason', 'feel', 'like', 'late', 'era', 'carri', 'seri', 'longer', 'blaze', 'trail', 'still', 'funni', 'think', 'behind', 'england', 'far', 'mark', 'pamela', 'denis', 'bubbl', 'charm', 'clearli', 'awar', 'masterpiec', 'make', 'although', 'give', 'lot', 'thing', 'told', 'like', 'support', 'cast', 'energet', 'even', 'particularli', 'good', 'see', 'coupl', 'duff', 'turn', 'movi', 'alreadi', 'practic', 'forgotten', 'make', 'much', 'differ', 'anyth', 'smile', 'realli', 'think', 'blond', 'blonder', 'ace', 'hope', 'hate']\n", + "\n", + "--- Label ---\n", + "pos\n" + ] + } + ], + "source": [ + "import pickle\n", + "\n", + "cache_dir = os.path.join(\"cache\", \"sentiment_analysis\") # where to store cache files\n", + "os.makedirs(cache_dir, exist_ok=True) # ensure cache directory exists\n", + "\n", + "def preprocess_data(data_train, data_test, labels_train, labels_test,\n", + " cache_dir=cache_dir, cache_file=\"preprocessed_data.pkl\"):\n", + " \"\"\"Convert each review to words; read from cache if available.\"\"\"\n", + "\n", + " # If cache_file is not None, try to read from it first\n", + " cache_data = None\n", + " if cache_file is not None:\n", + " try:\n", + " with open(os.path.join(cache_dir, cache_file), \"rb\") as f:\n", + " cache_data = pickle.load(f)\n", + " print(\"Read preprocessed data from cache file:\", cache_file)\n", + " except:\n", + " pass # unable to read from cache, but that's okay\n", + " \n", + " # If cache is missing, then do the heavy lifting\n", + " if cache_data is None:\n", + " # Preprocess training and test data to obtain words for each review\n", + " words_train = list(map(review_to_words, data_train))\n", + " words_test = list(map(review_to_words, data_test))\n", + " \n", + " # Write to cache file for future runs\n", + " if cache_file is not None:\n", + " cache_data = dict(words_train=words_train, words_test=words_test,\n", + " labels_train=labels_train, labels_test=labels_test)\n", + " with open(os.path.join(cache_dir, cache_file), \"wb\") as f:\n", + " pickle.dump(cache_data, f)\n", + " print(\"Wrote preprocessed data to cache file:\", cache_file)\n", + " else:\n", + " # Unpack data loaded from cache file\n", + " words_train, words_test, labels_train, labels_test = (cache_data['words_train'],\n", + " cache_data['words_test'], cache_data['labels_train'], cache_data['labels_test'])\n", + " \n", + " return words_train, words_test, labels_train, labels_test\n", + "\n", + "\n", + "# Preprocess data\n", + "words_train, words_test, labels_train, labels_test = preprocess_data(\n", + " data_train, data_test, labels_train, labels_test)\n", + "\n", + "# Take a look at a sample\n", + "print(\"\\n--- Raw review ---\")\n", + "print(data_train[1])\n", + "print(\"\\n--- Preprocessed words ---\")\n", + "print(words_train[1])\n", + "print(\"\\n--- Label ---\")\n", + "print(labels_train[1])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 3: Extracting Bag-of-Words features\n", + "\n", + "Now that each document has been preprocessed, we can transform each into a Bag-of-Words feature representation. Note that we need to create this transformation based on the training data alone, as we are not allowed to peek at the testing data at all!\n", + "\n", + "The dictionary or _vocabulary_ $V$ (set of words shared by documents in the training set) used here will be the one on which we train our supervised learning algorithm. Any future test data must be transformed in the same way for us to be able to apply the learned model for prediction. Hence, it is important to store the transformation / vocabulary as well.\n", + "\n", + "> **Note**: The set of words in the training set may not be exactly the same as the test set. What do you do if you encounter a word during testing that you haven't seen before? Unfortunately, we'll have to ignore it, or replace it with a special `` token.\n", + "\n", + "### TODO: Compute Bag-of-Words features\n", + "\n", + "Implement the `extract_BoW_features()` function, apply it to both training and test datasets, and store the results in `features_train` and `features_test` NumPy arrays, respectively. Choose a reasonable vocabulary size, say $|V| = 5000$, and keep only the top $|V|$ occuring words and discard the rest. This number will also serve as the number of columns in the BoW matrices.\n", + "\n", + "> **Hint**: You may find it useful to take advantage of `CountVectorizer` from scikit-learn. Also make sure to pickle your Bag-of-Words transformation so that you can use it in future." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wrote features to cache file: bow_features.pkl\n", + "Vocabulary: 5000 words\n", + "Sample words: ['geek', 'turtl', '17', 'weather', 'cent', '100', 'poem', 'satir']\n", + "\n", + "--- Preprocessed words ---\n", + "['kid', '50', '60', 'anyth', 'connect', 'disney', 'definit', 'great', 'happen', 'abl', 'get', 'actor', 'actress', 'want', 'best', 'time', 'somehow', 'disney', 'manag', 'screw', 'thing', 'spite', 'abund', 'resourc', 'disney', 'afford', 'best', 'writer', 'best', 'produc', 'director', 'still', 'screw', 'thing', 'movi', 'crap', 'sad', 'thing', 'suspect', 'disney', 'arrog', 'even', 'know', 'movi', 'good', 'bad', 'due', 'talent', 'actor', 'even', 'give', '3', '10']\n", + "\n", + "--- Bag-of-Words features ---\n", + "[0 0 0 ... 0 0 0]\n", + "\n", + "--- Label ---\n", + "neg\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "from sklearn.feature_extraction.text import CountVectorizer\n", + "from sklearn.externals import joblib\n", + "# joblib is an enhanced version of pickle that is more efficient for storing NumPy arrays\n", + "\n", + "def extract_BoW_features(words_train, words_test, vocabulary_size=5000,\n", + " cache_dir=cache_dir, cache_file=\"bow_features.pkl\"):\n", + " \"\"\"Extract Bag-of-Words for a given set of documents, already preprocessed into words.\"\"\"\n", + " \n", + " # If cache_file is not None, try to read from it first\n", + " cache_data = None\n", + " if cache_file is not None:\n", + " try:\n", + " with open(os.path.join(cache_dir, cache_file), \"rb\") as f:\n", + " cache_data = joblib.load(f)\n", + " print(\"Read features from cache file:\", cache_file)\n", + " except:\n", + " pass # unable to read from cache, but that's okay\n", + " \n", + " # If cache is missing, then do the heavy lifting\n", + " if cache_data is None:\n", + " # TODO: Fit a vectorizer to training documents and use it to transform them\n", + " # NOTE: Training documents have already been preprocessed and tokenized into words;\n", + " # pass in dummy functions to skip those steps, e.g. preprocessor=lambda x: x\n", + " vectorizer = CountVectorizer(max_features=vocabulary_size, preprocessor=lambda x:x, tokenizer=lambda x:x)\n", + " features_train = vectorizer.fit_transform(words_train).toarray()\n", + "\n", + " # TODO: Apply the same vectorizer to transform the test documents (ignore unknown words)\n", + " features_test = vectorizer.fit_transform(words_train).toarray()\n", + " \n", + " # NOTE: Remember to convert the features using .toarray() for a compact representation\n", + " \n", + " # Write to cache file for future runs (store vocabulary as well)\n", + " if cache_file is not None:\n", + " vocabulary = vectorizer.vocabulary_\n", + " cache_data = dict(features_train=features_train, features_test=features_test,\n", + " vocabulary=vocabulary)\n", + " with open(os.path.join(cache_dir, cache_file), \"wb\") as f:\n", + " joblib.dump(cache_data, f)\n", + " print(\"Wrote features to cache file:\", cache_file)\n", + " else:\n", + " # Unpack data loaded from cache file\n", + " features_train, features_test, vocabulary = (cache_data['features_train'],\n", + " cache_data['features_test'], cache_data['vocabulary'])\n", + " \n", + " # Return both the extracted features as well as the vocabulary\n", + " return features_train, features_test, vocabulary\n", + "\n", + "\n", + "# Extract Bag of Words features for both training and test datasets\n", + "features_train, features_test, vocabulary = extract_BoW_features(words_train, words_test)\n", + "\n", + "# Inspect the vocabulary that was computed\n", + "print(\"Vocabulary: {} words\".format(len(vocabulary)))\n", + "\n", + "import random\n", + "print(\"Sample words: {}\".format(random.sample(list(vocabulary.keys()), 8)))\n", + "\n", + "# Sample\n", + "print(\"\\n--- Preprocessed words ---\")\n", + "print(words_train[5])\n", + "print(\"\\n--- Bag-of-Words features ---\")\n", + "print(features_train[5])\n", + "print(\"\\n--- Label ---\")\n", + "print(labels_train[5])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let's try to visualize the Bag-of-Words feature vector for one of our training documents." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Plot the BoW feature vector for a training document\n", + "plt.plot(features_train[5,:])\n", + "plt.xlabel('Word')\n", + "plt.ylabel('Count')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Question: Reflecting on Bag-of-Words feature representation\n", + "\n", + "What is the average sparsity level of BoW vectors in our training set? In other words, on average what percentage of entries in a BoW feature vector are zero?\n", + "\n", + "#### Answer:\n", + "\n", + "...\n", + "\n", + "### Zipf's law\n", + "\n", + "[Zipf's law](https://en.wikipedia.org/wiki/Zipf%27s_law), named after the famous American linguist George Zipf, is an empirical law stating that given a large collection of documents, the frequency of any word is inversely proportional to its rank in the frequency table. So the most frequent word will occur about twice as often as the second most frequent word, three times as often as the third most frequent word, and so on. In the figure below we plot number of appearances of each word in our training set against its rank." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Find number of occurrences for each word in the training set\n", + "word_freq = features_train.sum(axis=0)\n", + "\n", + "# Sort it in descending order\n", + "sorted_word_freq = np.sort(word_freq)[::-1]\n", + "\n", + "# Plot \n", + "plt.plot(sorted_word_freq)\n", + "plt.gca().set_xscale('log')\n", + "plt.gca().set_yscale('log')\n", + "plt.xlabel('Rank')\n", + "plt.ylabel('Number of occurrences')\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Question: Zipf's law\n", + "\n", + "What is the total number of occurrences of the most frequent word? What is the the total number of occurrences of the second most frequent word? Do your numbers follow Zipf's law? If not, why?\n", + "\n", + "#### Answer:\n", + "\n", + "...\n", + "\n", + "### TODO: Normalize feature vectors\n", + "\n", + "Bag-of-Words features are intuitive to understand as they are simply word counts. But counts can vary a lot, and potentially throw off learning algorithms later in the pipeline. So, before we proceed further, let's normalize the BoW feature vectors to have unit length.\n", + "\n", + "This makes sure that each document's representation retains the unique mixture of feature components, but prevents documents with large word counts from dominating those with fewer words." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": {}, + "outputs": [], + "source": [ + "import sklearn.preprocessing as pr\n", + "\n", + "# TODO: Normalize BoW features in training and test set\n", + "features_train = pr.normalize(features_train)\n", + "features_test = pr.normalize(features_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Step 4: Classification using BoW features\n", + "\n", + "Now that the data has all been properly transformed, we can feed it into a classifier. To get a baseline model, we train a Naive Bayes classifier from scikit-learn (specifically, [`GaussianNB`](http://scikit-learn.org/stable/modules/generated/sklearn.naive_bayes.GaussianNB.html)), and evaluate its accuracy on the test set." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[GaussianNB] Accuracy: train = 0.8198, test = 0.50028\n" + ] + } + ], + "source": [ + "from sklearn.naive_bayes import GaussianNB\n", + "\n", + "# TODO: Train a Guassian Naive Bayes classifier\n", + "clf1 = GaussianNB()\n", + "clf1.fit(features_train, labels_train)\n", + "\n", + "# Calculate the mean accuracy score on training and test sets\n", + "print(\"[{}] Accuracy: train = {}, test = {}\".format(\n", + " clf1.__class__.__name__,\n", + " clf1.score(features_train, labels_train),\n", + " clf1.score(features_test, labels_test)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Tree-based algorithms often work quite well on Bag-of-Words as their highly discontinuous and sparse nature is nicely matched by the structure of trees. As your next task, you will try to improve on the Naive Bayes classifier's performance by using scikit-learn's Gradient-Boosted Decision Tree classifer.\n", + "\n", + "### TODO: Gradient-Boosted Decision Tree classifier\n", + "\n", + "Use [`GradientBoostingClassifier`](http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.GradientBoostingClassifier.html) from scikit-learn to classify the BoW data. This model has a number of parameters. We use default parameters for some of them and pre-set the rest for you, except one: `n_estimators`. Find a proper value for this hyperparameter, use it to classify the data, and report how much improvement you get over Naive Bayes in terms of accuracy.\n", + "\n", + "> **Tip**: Use a model selection technique such as cross-validation, grid-search, or an information criterion method, to find an optimal value for the hyperparameter." + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[GradientBoostingClassifier] Accuracy: train = 0.7764, test = 0.4944\n" + ] + } + ], + "source": [ + "from sklearn.ensemble import GradientBoostingClassifier\n", + "\n", + "n_estimators = 20\n", + "\n", + "def classify_gboost(X_train, X_test, y_train, y_test): \n", + " # Initialize classifier\n", + " clf = GradientBoostingClassifier(n_estimators=n_estimators, learning_rate=1.0, max_depth=1, random_state=0)\n", + "\n", + " # TODO: Classify the data using GradientBoostingClassifier\n", + " clf.fit(X_train, y_train)\n", + " \n", + " # TODO(optional): Perform hyperparameter tuning / model selection\n", + " \n", + " # TODO: Print final training & test accuracy\n", + " print(\"[{}] Accuracy: train = {}, test = {}\".format(\n", + " clf.__class__.__name__,\n", + " clf.score(features_train, labels_train),\n", + " clf.score(features_test, labels_test)))\n", + " \n", + " # Return best classifier model\n", + " return clf\n", + "\n", + "\n", + "clf2 = classify_gboost(features_train, features_test, labels_train, labels_test)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### TODO: Adverserial testing\n", + "\n", + "Write a short movie review to trick your machine learning model! That is, a movie review with a clear positive or negative sentiment that your model will classify incorrectly.\n", + "\n", + "> **Hint**: You might want to take advantage of the biggest weakness of the Bag-of-Words scheme!" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['pos']\n" + ] + } + ], + "source": [ + "# TODO: Write a sample review and set its true sentiment\n", + "my_review = \"Despite a compelling lead performance by Tom Hanks and a great soundtrack, Forrest Gump never gets out of the shadow of its weak plot and questionable premise\"\n", + "true_sentiment = 'neg' # sentiment must be 'pos' or 'neg'\n", + "\n", + "# TODO: Apply the same preprocessing and vectorizing steps as you did for your training data\n", + "my_review_words = review_to_words(my_review)\n", + "\n", + "# TODO: Then call your classifier to label it\n", + "vectorizer=CountVectorizer(max_features=len(vocabulary), preprocessor=lambda x:x, tokenizer=lambda x:x)\n", + "vectorizer=vectorizer.fit(words_train)\n", + "my_review_features=vectorizer.transform([my_review_words]).toarray()\n", + "my_eview_features=pr.normalize(my_review_features)\n", + "print(clf2.predict(my_review_features))" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['pos']\n" + ] + } + ], + "source": [ + "print(clf1.predict(my_review_features))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Extensions\n", + "\n", + "There are several ways in which you can build upon this notebook. Each comes with its set of challenges, but can be a rewarding experience.\n", + "\n", + "- The first thing is to try and improve the accuracy of your model by experimenting with different architectures, layers and parameters. How good can you get without taking prohibitively long to train? How do you prevent overfitting?\n", + "\n", + "- Then, you may want to deploy your model as a mobile app or web service. What do you need to do in order to package your model for such deployment? How would you accept a new review, convert it into a form suitable for your model, and perform the actual prediction? (Note that the same environment you used during training may not be available.)\n", + "\n", + "- One simplification we made in this notebook is to limit the task to binary classification. The dataset actually includes a more fine-grained review rating that is indicated in each review's filename (which is of the form `<[id]_[rating].txt>` where `[id]` is a unique identifier and `[rating]` is on a scale of 1-10; note that neutral reviews > 4 or < 7 have been excluded). How would you modify the notebook to perform regression on the review ratings? In what situations is regression more useful than classification, and vice-versa?\n", + "\n", + "Whatever direction you take, make sure to share your results and learnings with your peers, through blogs, discussions and participating in online competitions. This is also a great way to become more visible to potential employers!" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}