From c281fe8e0d7b4a707532b8fe5e2ac99217b30863 Mon Sep 17 00:00:00 2001 From: YashJipkate Date: Wed, 4 Jul 2018 11:45:09 +0530 Subject: [PATCH 1/2] Assignment 4 completed --- .../Assignment 4-checkpoint.ipynb | 1112 +++++++++++++++++ Assignment 4.ipynb | 654 +++++----- 2 files changed, 1474 insertions(+), 292 deletions(-) create mode 100644 .ipynb_checkpoints/Assignment 4-checkpoint.ipynb diff --git a/.ipynb_checkpoints/Assignment 4-checkpoint.ipynb b/.ipynb_checkpoints/Assignment 4-checkpoint.ipynb new file mode 100644 index 0000000..1226c58 --- /dev/null +++ b/.ipynb_checkpoints/Assignment 4-checkpoint.ipynb @@ -0,0 +1,1112 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# ML Summer School - Assignment 4\n", + "\n", + "In this assignment, we will be clustering movies on the basis of their synopsis. Unlike previous assignments, this time you will be implementing the KMeans clustering algorithm from scratch." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load Libraries" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd\n", + "import nltk\n", + "import re\n", + "import os\n", + "from sklearn import feature_extraction\n", + "import pickle\n", + "import scipy" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load data\n", + "We will be using the synopsis of Top 100 movies ranked by IMDb. `titles`, `genres` and `synopsis` are lists stored as pickled files. We first load them into memory. \n", + "\n", + "Take a look at the lists we have just loaded." + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "100 100 100\n" + ] + } + ], + "source": [ + "titles = pickle.load(open('data/titles.pkl','rb'))\n", + "genres = pickle.load(open('data/genres.pkl','rb'))\n", + "synopsis = pickle.load(open('data/synopses.pkl','rb'))\n", + "print(len(titles), len(genres), len(synopsis))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Preprocessing the Data" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us take a look at some of the synopsis." + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Plot [edit] [ [ edit edit ] ] \n", + " On the day of his only daughter's wedding, Vito Corleone hears requests in his role as the Godfather, the Don of a New York crime family. Vito's youngest son, Michael, in a Marine Corps uniform, introduces his girlfriend, Kay Adams, to his family at the sprawling reception. Vito's godson Johnny Fontane, a popular singer, pleads for help in securing a coveted movie role, so Vito dispatches his consigliere, Tom Hagen, to Los Angeles to influence the abrasive studio head, Jack Woltz. Woltz is unmoved until the morning he wakes up in bed with the severed head of his prized stallion. On the day of his only daughter's wedding, Vito Corleone Vito Corleone hears requests in his role as the Godfather, the Don Don of a New York crime family. Vito's youngest son, Michael Michael , in a Marine Corps Marine Corps uniform, introduces his girlfriend, Kay Adams Kay Adams , to his family at the sprawling reception. Vito's godson Johnny\n" + ] + } + ], + "source": [ + "print(synopsis[0][:1000])" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Plot [edit] [ [ edit edit ] ] \n", + " In 1947, banker Andy Dufresne is convicted of murdering his wife and her lover and sentenced to two consecutive life sentences at the fictional Shawshank State Penitentiary in the state of Maine. Andy befriends contraband smuggler Ellis \"Red\" Redding, an inmate serving a life sentence. Red procures a rock hammer and later a large poster of Rita Hayworth for Andy. Working in the prison laundry, Andy is regularly assaulted by the \"bull queer\" gang \"the Sisters\" and their leader, Bogs. In 1947, banker Andy Dufresne is convicted of murdering his wife and her lover and sentenced to two consecutive life sentences at the fictional Shawshank State Penitentiary in the state of Maine. Andy befriends contraband contraband smuggler Ellis \"Red\" Redding, an inmate serving a life sentence. Red procures a rock hammer rock hammer and later a large poster of Rita Hayworth Rita Hayworth for Andy. Working in the prison laundry, Andy is regularly as\n" + ] + } + ], + "source": [ + "print(synopsis[1][:1000])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can see that the synopsis contain a lot of names (Proper Nouns) and years. They are specific to the movies and do not seem to be helpful to cluster the movies. We should remove them\n", + "\n", + "We will also be lemmatizing the words. [Lemmatizing](https://www.twinword.com/blog/what-is-lemmatization/ ) refers to replacing word by its base form (lemma). For example, lemmatizing `cars` gives `car`. Lemmatizing will help in clubbing all different inflections of words, eg. `loves`, `loving`, `loved` will all be lemmatized to `love`." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Task 1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Complete the following function `preprocess_data`. It takes in text as input, and [removes proper nouns](https://stackoverflow.com/questions/39634222/is-there-a-way-to-remove-proper-nouns-from-a-sentence-using-python), non-alphabetic words, lemmatizes the data and lower cases the entire text." + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'edit edit edit day daughter wedding hears request role crime family youngest son uniform introduces girlfriend family sprawling reception godson popular singer pleads help securing coveted movie role dispatch consigliere influence abrasive studio head unmoved morning wake bed severed head prized stallion day daughter wedding hears request role crime family youngest son uniform introduces girlfriend family sprawling reception godson'" + ] + }, + "execution_count": 133, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from nltk.stem.wordnet import WordNetLemmatizer\n", + "\n", + "from nltk.corpus import stopwords\n", + "\n", + "def preprocess_data(text):\n", + " \"\"\"Removes proper noun, non-alphabetic words, lemmatizes the data and lower cases the entire text\"\"\"\n", + " \n", + " # YOUR CODE STARTS HERE\n", + " text = text.strip().split()\n", + " text = [re.sub('[^A-Za-z]', '', word) for word in text]\n", + " text = ' '.join(text)\n", + " \n", + " tagged = nltk.tag.pos_tag(text.split())\n", + " text = [word for word,tag in tagged if tag != 'NNP' and tag != 'NNPS']\n", + " text = ' '.join(text)\n", + " text = text.lower()\n", + " \n", + " text = text.split()\n", + " \n", + " s=set(stopwords.words('english'))\n", + " text = [t for t in text if t not in s]\n", + " \n", + " \n", + " lmt = WordNetLemmatizer()\n", + " text = [lmt.lemmatize(t) for t in text]\n", + " \n", + " text = ' '.join(text)\n", + " \n", + " # YOUR CODE ENDS HERE\n", + " \n", + " return text\n", + "\n", + "preprocess_data(synopsis[0][:1000])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Sample input**: preprocess_data(synopsis[0][:1000])\n", + "\n", + "\n", + "**Sample output**: 'edit edit edit day daughter wedding hear request role crime family son uniform introduce girlfriend family reception godson singer pleads help secure movie role dispatch consigliere influence studio head be unmoved morning wake bed head stallion day daughter wedding hear request role crime family son uniform introduce girlfriend family reception godson'\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 134, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'edit edit edit day daughter wedding hears request role crime family youngest son uniform introduces girlfriend family sprawling reception godson popular singer pleads help securing coveted movie role dispatch consigliere influence abrasive studio head unmoved morning wake bed severed head prized stallion day daughter wedding hears request role crime family youngest son uniform introduces girlfriend family sprawling reception godson'" + ] + }, + "execution_count": 134, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "preprocess_data(synopsis[0][:1000])" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Creating the Features\n", + "\n", + "We will extract features from the synopsis using TfIdf Vectoriser, which will be used to cluster the movies. \n", + "\n", + "Read more about TfIdf Vectoriser [here](http://blog.christianperone.com/2011/09/machine-learning-text-feature-extraction-tf-idf-part-i/) and [here](http://blog.christianperone.com/2011/10/machine-learning-text-feature-extraction-tf-idf-part-ii/)." + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wall time: 25.9 s\n", + "(100, 444)\n" + ] + } + ], + "source": [ + "from sklearn.feature_extraction.text import TfidfVectorizer\n", + "\n", + "tfidf_vectorizer = TfidfVectorizer(max_df=0.8, max_features=20000, min_df=0.2,\\\n", + " stop_words='english', preprocessor=preprocess_data, \\\n", + " use_idf=True, ngram_range=(1, 1))\n", + "\n", + "%time tfidf_matrix = tfidf_vectorizer.fit_transform(synopsis)\n", + "\n", + "print(tfidf_matrix.shape)\n", + "terms = tfidf_vectorizer.get_feature_names()" + ] + }, + { + "cell_type": "code", + "execution_count": 136, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<100x444 sparse matrix of type ''\n", + "\twith 15106 stored elements in Compressed Sparse Row format>" + ] + }, + "execution_count": 136, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tfidf_matrix" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Task 2 - Implementing KMeans\n", + "\n", + "This is the most important task of this assignment because in this, you will implement your own K-Means. Fill in the function `KMeans` which will return the labels and cluster centers in the tuple `(labels,centers)` for the given feature matrix `X` and `num_clusters`. We also pass the `max_iter` parameter to run KMeans for that many iterations as it sometimes gets stuck on a local minima. You can learn more about Kmeans clustering [here](https://en.wikipedia.org/wiki/K-means_clustering) and [here](https://www.datascience.com/blog/k-means-clustering).\n", + "\n", + "**Sample Input**: `[[2,1], [2,3], [8,1], [8,3]]`, `num_clusters=2`\n", + "\n", + "**Sample Output**: `([0,0,1,1], [[2,2], [8,2]])`" + ] + }, + { + "cell_type": "code", + "execution_count": 137, + "metadata": {}, + "outputs": [], + "source": [ + "from random import randint\n", + "from random import seed\n", + "import random\n", + "def Kmeans(X, num_clusters=8, max_iter=300):\n", + "\n", + " # YOUR CODE STARTS HERE\n", + " for p in range(0,max_iter):\n", + " \n", + " centroids = []\n", + " seed(p+2)\n", + " n = random.sample(range(X.shape[0]), num_clusters)\n", + "\n", + " for i in range(num_clusters):\n", + " centroids.append(X[n[i]])\n", + " \n", + " while True:\n", + " \n", + " classes = []\n", + " class_dict = {}\n", + "\n", + " for i in range(0,num_clusters):\n", + " class_dict[i] = []\n", + "\n", + " for point in X:\n", + " all_dists = [np.linalg.norm(centroid - point) for centroid in centroids]\n", + " classes.append(all_dists.index(min(all_dists)))\n", + " class_dict[all_dists.index(min(all_dists))].append(point)\n", + " \n", + " prev_centroid = centroids\n", + "\n", + " for cluster in class_dict:\n", + " centroids[cluster] = np.mean(class_dict[cluster], axis=0)\n", + " \n", + " if prev_centroid == centroids:\n", + " break\n", + "\n", + " labels = np.array(classes)\n", + " centers = np.array(centroids)\n", + " # YOUR CODE ENDS HERE\n", + " \n", + " return (labels, centers)" + ] + }, + { + "cell_type": "code", + "execution_count": 138, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(array([2, 1, 0, 0, 2, 1]), array([[8. , 2. ],\n", + " [2.5, 3. ],\n", + " [2.5, 1. ]]))" + ] + }, + "execution_count": 138, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "Kmeans(np.array([[2,1], [2,3], [8,1], [8,3], [3,1], [3,3]]), num_clusters=3)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Cluster the synopsis (represented as TfIdf vectors) using Kmeans. You can play with different number of centers and maximum iterations to get different results." + ] + }, + { + "cell_type": "code", + "execution_count": 139, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wall time: 5.49 s\n" + ] + } + ], + "source": [ + "%time (labels, centers) = Kmeans(tfidf_matrix.todense(), num_clusters=3, max_iter=1000)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we create a dataframe `frame` that stores the the clusters labels, names and genres for all the 100 movies." + ] + }, + { + "cell_type": "code", + "execution_count": 140, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
titleclustergenre
1The Godfather1[u' Crime', u' Drama']
1The Shawshank Redemption1[u' Crime', u' Drama']
1Schindler's List1[u' Biography', u' Drama', u' History']
0Raging Bull0[u' Biography', u' Drama', u' Sport']
1Casablanca1[u' Drama', u' Romance', u' War']
1One Flew Over the Cuckoo's Nest1[u' Drama']
1Gone with the Wind1[u' Drama', u' Romance', u' War']
0Citizen Kane0[u' Drama', u' Mystery']
1The Wizard of Oz1[u' Adventure', u' Family', u' Fantasy', u' Mu...
0Titanic0[u' Drama', u' Romance']
1Lawrence of Arabia1[u' Adventure', u' Biography', u' Drama', u' H...
1The Godfather: Part II1[u' Crime', u' Drama']
1Psycho1[u' Horror', u' Mystery', u' Thriller']
2Sunset Blvd.2[u' Drama', u' Film-Noir']
1Vertigo1[u' Mystery', u' Romance', u' Thriller']
1On the Waterfront1[u' Crime', u' Drama']
1Forrest Gump1[u' Drama', u' Romance']
1The Sound of Music1[u' Biography', u' Drama', u' Family', u' Musi...
1West Side Story1[u' Crime', u' Drama', u' Musical', u' Romance...
1Star Wars1[u' Action', u' Adventure', u' Fantasy', u' Sc...
1E.T. the Extra-Terrestrial1[u' Adventure', u' Family', u' Sci-Fi']
12001: A Space Odyssey1[u' Mystery', u' Sci-Fi']
1The Silence of the Lambs1[u' Crime', u' Drama', u' Thriller']
1Chinatown1[u' Drama', u' Mystery', u' Thriller']
1The Bridge on the River Kwai1[u' Adventure', u' Drama', u' War']
2Singin' in the Rain2[u' Comedy', u' Musical', u' Romance']
1It's a Wonderful Life1[u' Drama', u' Family', u' Fantasy']
1Some Like It Hot1[u' Comedy']
112 Angry Men1[u' Drama']
1Dr. Strangelove or: How I Learned to Stop Worr...1[u' Comedy', u' War']
............
1Rain Man1[u' Drama']
1Annie Hall1[u' Comedy', u' Drama', u' Romance']
0Out of Africa0[u' Biography', u' Drama', u' Romance']
1Good Will Hunting1[u' Drama']
0Terms of Endearment0[u' Comedy', u' Drama']
1Tootsie1[u' Comedy', u' Drama', u' Romance']
1Fargo1[u' Crime', u' Drama', u' Thriller']
1Giant1[u' Drama', u' Romance']
1The Grapes of Wrath1[u' Drama']
1Shane1[u' Drama', u' Romance', u' Western']
1The Green Mile1[u' Crime', u' Drama', u' Fantasy', u' Mystery']
1Close Encounters of the Third Kind1[u' Drama', u' Sci-Fi']
0Network0[u' Drama']
1Nashville1[u' Drama', u' Music']
0The Graduate0[u' Comedy', u' Drama', u' Romance']
1American Graffiti1[u' Comedy', u' Drama']
1Pulp Fiction1[u' Crime', u' Drama', u' Thriller']
1The African Queen1[u' Adventure', u' Romance', u' War']
1Stagecoach1[u' Adventure', u' Western']
0Mutiny on the Bounty0[u' Adventure', u' Drama', u' History']
1The Maltese Falcon1[u' Drama', u' Film-Noir', u' Mystery']
1A Clockwork Orange1[u' Crime', u' Drama', u' Sci-Fi']
1Taxi Driver1[u' Crime', u' Drama']
1Wuthering Heights1[u' Drama', u' Romance']
1Double Indemnity1[u' Crime', u' Drama', u' Film-Noir', u' Thril...
1Rebel Without a Cause1[u' Drama']
1Rear Window1[u' Mystery', u' Thriller']
1The Third Man1[u' Film-Noir', u' Mystery', u' Thriller']
1North by Northwest1[u' Mystery', u' Thriller']
0Yankee Doodle Dandy0[u' Biography', u' Drama', u' Musical']
\n", + "

100 rows × 3 columns

\n", + "
" + ], + "text/plain": [ + " title cluster \\\n", + "1 The Godfather 1 \n", + "1 The Shawshank Redemption 1 \n", + "1 Schindler's List 1 \n", + "0 Raging Bull 0 \n", + "1 Casablanca 1 \n", + "1 One Flew Over the Cuckoo's Nest 1 \n", + "1 Gone with the Wind 1 \n", + "0 Citizen Kane 0 \n", + "1 The Wizard of Oz 1 \n", + "0 Titanic 0 \n", + "1 Lawrence of Arabia 1 \n", + "1 The Godfather: Part II 1 \n", + "1 Psycho 1 \n", + "2 Sunset Blvd. 2 \n", + "1 Vertigo 1 \n", + "1 On the Waterfront 1 \n", + "1 Forrest Gump 1 \n", + "1 The Sound of Music 1 \n", + "1 West Side Story 1 \n", + "1 Star Wars 1 \n", + "1 E.T. the Extra-Terrestrial 1 \n", + "1 2001: A Space Odyssey 1 \n", + "1 The Silence of the Lambs 1 \n", + "1 Chinatown 1 \n", + "1 The Bridge on the River Kwai 1 \n", + "2 Singin' in the Rain 2 \n", + "1 It's a Wonderful Life 1 \n", + "1 Some Like It Hot 1 \n", + "1 12 Angry Men 1 \n", + "1 Dr. Strangelove or: How I Learned to Stop Worr... 1 \n", + ".. ... ... \n", + "1 Rain Man 1 \n", + "1 Annie Hall 1 \n", + "0 Out of Africa 0 \n", + "1 Good Will Hunting 1 \n", + "0 Terms of Endearment 0 \n", + "1 Tootsie 1 \n", + "1 Fargo 1 \n", + "1 Giant 1 \n", + "1 The Grapes of Wrath 1 \n", + "1 Shane 1 \n", + "1 The Green Mile 1 \n", + "1 Close Encounters of the Third Kind 1 \n", + "0 Network 0 \n", + "1 Nashville 1 \n", + "0 The Graduate 0 \n", + "1 American Graffiti 1 \n", + "1 Pulp Fiction 1 \n", + "1 The African Queen 1 \n", + "1 Stagecoach 1 \n", + "0 Mutiny on the Bounty 0 \n", + "1 The Maltese Falcon 1 \n", + "1 A Clockwork Orange 1 \n", + "1 Taxi Driver 1 \n", + "1 Wuthering Heights 1 \n", + "1 Double Indemnity 1 \n", + "1 Rebel Without a Cause 1 \n", + "1 Rear Window 1 \n", + "1 The Third Man 1 \n", + "1 North by Northwest 1 \n", + "0 Yankee Doodle Dandy 0 \n", + "\n", + " genre \n", + "1 [u' Crime', u' Drama'] \n", + "1 [u' Crime', u' Drama'] \n", + "1 [u' Biography', u' Drama', u' History'] \n", + "0 [u' Biography', u' Drama', u' Sport'] \n", + "1 [u' Drama', u' Romance', u' War'] \n", + "1 [u' Drama'] \n", + "1 [u' Drama', u' Romance', u' War'] \n", + "0 [u' Drama', u' Mystery'] \n", + "1 [u' Adventure', u' Family', u' Fantasy', u' Mu... \n", + "0 [u' Drama', u' Romance'] \n", + "1 [u' Adventure', u' Biography', u' Drama', u' H... \n", + "1 [u' Crime', u' Drama'] \n", + "1 [u' Horror', u' Mystery', u' Thriller'] \n", + "2 [u' Drama', u' Film-Noir'] \n", + "1 [u' Mystery', u' Romance', u' Thriller'] \n", + "1 [u' Crime', u' Drama'] \n", + "1 [u' Drama', u' Romance'] \n", + "1 [u' Biography', u' Drama', u' Family', u' Musi... \n", + "1 [u' Crime', u' Drama', u' Musical', u' Romance... \n", + "1 [u' Action', u' Adventure', u' Fantasy', u' Sc... \n", + "1 [u' Adventure', u' Family', u' Sci-Fi'] \n", + "1 [u' Mystery', u' Sci-Fi'] \n", + "1 [u' Crime', u' Drama', u' Thriller'] \n", + "1 [u' Drama', u' Mystery', u' Thriller'] \n", + "1 [u' Adventure', u' Drama', u' War'] \n", + "2 [u' Comedy', u' Musical', u' Romance'] \n", + "1 [u' Drama', u' Family', u' Fantasy'] \n", + "1 [u' Comedy'] \n", + "1 [u' Drama'] \n", + "1 [u' Comedy', u' War'] \n", + ".. ... \n", + "1 [u' Drama'] \n", + "1 [u' Comedy', u' Drama', u' Romance'] \n", + "0 [u' Biography', u' Drama', u' Romance'] \n", + "1 [u' Drama'] \n", + "0 [u' Comedy', u' Drama'] \n", + "1 [u' Comedy', u' Drama', u' Romance'] \n", + "1 [u' Crime', u' Drama', u' Thriller'] \n", + "1 [u' Drama', u' Romance'] \n", + "1 [u' Drama'] \n", + "1 [u' Drama', u' Romance', u' Western'] \n", + "1 [u' Crime', u' Drama', u' Fantasy', u' Mystery'] \n", + "1 [u' Drama', u' Sci-Fi'] \n", + "0 [u' Drama'] \n", + "1 [u' Drama', u' Music'] \n", + "0 [u' Comedy', u' Drama', u' Romance'] \n", + "1 [u' Comedy', u' Drama'] \n", + "1 [u' Crime', u' Drama', u' Thriller'] \n", + "1 [u' Adventure', u' Romance', u' War'] \n", + "1 [u' Adventure', u' Western'] \n", + "0 [u' Adventure', u' Drama', u' History'] \n", + "1 [u' Drama', u' Film-Noir', u' Mystery'] \n", + "1 [u' Crime', u' Drama', u' Sci-Fi'] \n", + "1 [u' Crime', u' Drama'] \n", + "1 [u' Drama', u' Romance'] \n", + "1 [u' Crime', u' Drama', u' Film-Noir', u' Thril... \n", + "1 [u' Drama'] \n", + "1 [u' Mystery', u' Thriller'] \n", + "1 [u' Film-Noir', u' Mystery', u' Thriller'] \n", + "1 [u' Mystery', u' Thriller'] \n", + "0 [u' Biography', u' Drama', u' Musical'] \n", + "\n", + "[100 rows x 3 columns]" + ] + }, + "execution_count": 140, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import pandas as pd\n", + "films = {'title': titles, 'synopsis': synopsis, 'cluster': labels, 'genre': genres}\n", + "frame = pd.DataFrame(films, index = [labels] , columns = ['title', 'cluster', 'genre'])\n", + "frame" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Movie counts for a particular cluster." + ] + }, + { + "cell_type": "code", + "execution_count": 141, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "1 83\n", + "0 13\n", + "2 4\n", + "Name: cluster, dtype: int64" + ] + }, + "execution_count": 141, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "frame['cluster'].value_counts()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Interpreting Results\n", + "We sort the cluster centers to get the most important terms per cluster and store it in `cluster_names`. We print them along with the movies in that cluster and look how well has KMeans worked." + ] + }, + { + "cell_type": "code", + "execution_count": 142, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Top terms per cluster:\n", + "(3, 1, 444)\n", + "Cluster 0 words: group, foot, begs, follow, hidden, field,\n", + "Cluster 0 titles: Raging Bull, Citizen Kane, Titanic, Amadeus, The Philadelphia Story, The Best Years of Our Lives, The King's Speech, Out of Africa, Terms of Endearment, Network, The Graduate, Mutiny on the Bounty, Yankee Doodle Dandy,\n", + "\n", + "Cluster 1 words: shortly, trouble, opening, didnt, angry, returned,\n", + "Cluster 1 titles: The Godfather, The Shawshank Redemption, Schindler's List, Casablanca, One Flew Over the Cuckoo's Nest, Gone with the Wind, The Wizard of Oz, Lawrence of Arabia, The Godfather: Part II, Psycho, Vertigo, On the Waterfront, Forrest Gump, The Sound of Music, West Side Story, Star Wars, E.T. the Extra-Terrestrial, 2001: A Space Odyssey, The Silence of the Lambs, Chinatown, The Bridge on the River Kwai, It's a Wonderful Life, Some Like It Hot, 12 Angry Men, Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb, Apocalypse Now, The Lord of the Rings: The Return of the King, Gladiator, From Here to Eternity, Saving Private Ryan, Unforgiven, Raiders of the Lost Ark, Rocky, A Streetcar Named Desire, To Kill a Mockingbird, An American in Paris, My Fair Lady, Ben-Hur, Doctor Zhivago, Jaws, Braveheart, The Good, the Bad and the Ugly, Butch Cassidy and the Sundance Kid, The Treasure of the Sierra Madre, The Apartment, Platoon, High Noon, Dances with Wolves, The Pianist, Goodfellas, The Exorcist, The Deer Hunter, All Quiet on the Western Front, The French Connection, City Lights, It Happened One Night, A Place in the Sun, Midnight Cowboy, Mr. Smith Goes to Washington, Rain Man, Annie Hall, Good Will Hunting, Tootsie, Fargo, Giant, The Grapes of Wrath, Shane, The Green Mile, Close Encounters of the Third Kind, Nashville, American Graffiti, Pulp Fiction, The African Queen, Stagecoach, The Maltese Falcon, A Clockwork Orange, Taxi Driver, Wuthering Heights, Double Indemnity, Rebel Without a Cause, Rear Window, The Third Man, North by Northwest,\n", + "\n", + "Cluster 2 words: known, matter, enter, enters, entire, rush,\n", + "Cluster 2 titles: Sunset Blvd., Singin' in the Rain, Gandhi, Patton,\n", + "\n" + ] + } + ], + "source": [ + "print(\"Top terms per cluster:\")\n", + "order_centroids = np.asarray(centers).argsort()[:, ::-1]\n", + "print(order_centroids.shape)\n", + "cluster_names = []\n", + "for i in range(order_centroids.shape[0]):\n", + " print(\"Cluster %d words:\" % i, end='')\n", + " q = \"\"\n", + " for ind in order_centroids[i][0][:6]:\n", + " print(' %s' % terms[ind], end=',')\n", + " q += str(terms[ind])\n", + " q += \" \"\n", + " cluster_names.append(q)\n", + " print()\n", + " print(\"Cluster %d titles:\" % i, end='')\n", + " for title in frame.loc[i]['title'].values.tolist():\n", + " print(' %s,' % title, end='')\n", + " print()\n", + " print()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Plotting the Data\n", + "Now we plot the various movie clusters.\n", + "Basically we scale the multi-dimentional feature vector by applying 2 dimensional PCA. It is a technique used to visualize multi-dimensional plots in 2 dimensions. More about it [here](http://www.apnorton.com/blog/2016/12/19/Visualizing-Multidimensional-Data-in-Python/)." + ] + }, + { + "cell_type": "code", + "execution_count": 143, + "metadata": {}, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "from sklearn.decomposition import PCA as sklearnPCA" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": {}, + "outputs": [], + "source": [ + "pca = sklearnPCA(n_components=2) #2-dimensional PCA\n", + "transformed = pd.DataFrame(pca.fit_transform(tfidf_matrix.todense()))" + ] + }, + { + "cell_type": "code", + "execution_count": 145, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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SktLo8bGRjp16hRdc8019PTTTxMR0bXXXkuzZs1yrTt+/HgqKSkhIqJXXnmFJk6cSERE06ZNo9WrV7vWu+SSS4iIaPPmzXTRRRfRwYMH6fz583T99dd7rOfk/vo1a9bQ9ddfT+fPn6f/+7//o759+9KxY8dkl2/evJnGjRsnuW9y26+traWRI0dSQ0MDEREtWbKE/vCHP9DZs2epT58+dOjQISIimjp1quu9x48fT9u3byciotOnT1Nzc3O77VksFqqtrSUiotmzZ9PixYuJiGjTpk2UlpZGRETFxcX0wAMPEBHRokWLXMc6NTWVtmzZQkRECxcupN/85jdERJScnEz19fW0fPlyyszMpLKyMqqqqqKhQ4e22/6iRYto2LBh1NTURLW1tdS9e3c6d+6cxzl56623XMfx6NGjFBcXR6tXr3bt+/79+6m1tZWmTJni2vf58+fTihUriIjoxIkTlJiYSA0NDVRcXEwJCQl08uRJOnv2LPXr148OHz7s8/x+++23NHDgQCIieumll+iJJ54gIqKmpiYaNGgQHTp0yGOdZ599lu655x4iIvr8888pOjqaPv74Y8nzHWmkYgO0SO9ARHVElENEiW0/f2hbXklEM9p+LyOizkRkd3t8Fsp2mQ9q5B/wsn37dkycOBEXX3wxunbtiptuusnj+dtvv931+86dO13VK3fddRe2b9/u9/2zsrJw1VVXITo6Gnl5eX5fs337duTl5SE6Ohq9evXCtddei48//lh2eTDb/+ijj7Bnzx4MHz4cdrsdpaWlqK6uxt69e3HVVVe5qm3y8vJc7zN8+HA8/PDDWLZsGU6ePOm3Cmz79u246667AADXXXcd6urqUF9fL7lufX09Tp48iWuvvRYAMG3aNGzbtg2Ao65+x44d2LZtG37/+99j27ZtqKiowMiRIyXfa9y4cbjooovQo0cPXHHFFfjPf/7j8fy2bdtcx/GnP/0prrvuOgDA3r17kZCQgMTERAghcOedd7pes3HjRixZsgR2ux2jRo1CU1OT6xtITk4O4uLiEBMTg+TkZFRLJfWXsXHjRrz22muw2+0YMmQI6urq8M0337Qrr7MsNpsNNptN8fubWcdU0BqYklmvdK0DkqaTn4GAl3iNJqqrA44fd1xzWlsF6uqATp06uapTiAjn3Po9evda8NeLQa48/sopR2r7RITc3Fy8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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "colors = ['red', 'blue', 'green', 'yellow', 'black', 'gray', 'orange', 'brown']\n", + "for i in range(len(cluster_names)):\n", + " plt.scatter(transformed[labels == i][0], transformed[labels == i][1], label=cluster_names[i], c=colors[i])\n", + "plt.legend()\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# And you're done!" + ] + } + ], + "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.4" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Assignment 4.ipynb b/Assignment 4.ipynb index 9befe45..1226c58 100644 --- a/Assignment 4.ipynb +++ b/Assignment 4.ipynb @@ -18,7 +18,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 129, "metadata": {}, "outputs": [], "source": [ @@ -44,7 +44,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 130, "metadata": {}, "outputs": [ { @@ -78,7 +78,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 131, "metadata": {}, "outputs": [ { @@ -96,7 +96,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 132, "metadata": {}, "outputs": [ { @@ -137,19 +137,54 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 133, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'edit edit edit day daughter wedding hears request role crime family youngest son uniform introduces girlfriend family sprawling reception godson popular singer pleads help securing coveted movie role dispatch consigliere influence abrasive studio head unmoved morning wake bed severed head prized stallion day daughter wedding hears request role crime family youngest son uniform introduces girlfriend family sprawling reception godson'" + ] + }, + "execution_count": 133, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ + "from nltk.stem.wordnet import WordNetLemmatizer\n", + "\n", + "from nltk.corpus import stopwords\n", + "\n", "def preprocess_data(text):\n", " \"\"\"Removes proper noun, non-alphabetic words, lemmatizes the data and lower cases the entire text\"\"\"\n", " \n", " # YOUR CODE STARTS HERE\n", + " text = text.strip().split()\n", + " text = [re.sub('[^A-Za-z]', '', word) for word in text]\n", + " text = ' '.join(text)\n", + " \n", + " tagged = nltk.tag.pos_tag(text.split())\n", + " text = [word for word,tag in tagged if tag != 'NNP' and tag != 'NNPS']\n", + " text = ' '.join(text)\n", + " text = text.lower()\n", " \n", + " text = text.split()\n", + " \n", + " s=set(stopwords.words('english'))\n", + " text = [t for t in text if t not in s]\n", + " \n", + " \n", + " lmt = WordNetLemmatizer()\n", + " text = [lmt.lemmatize(t) for t in text]\n", + " \n", + " text = ' '.join(text)\n", " \n", " # YOUR CODE ENDS HERE\n", " \n", - " return text" + " return text\n", + "\n", + "preprocess_data(synopsis[0][:1000])" ] }, { @@ -165,7 +200,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 134, "metadata": { "scrolled": true }, @@ -173,10 +208,10 @@ { "data": { "text/plain": [ - "'edit edit edit day daughter wedding hear request role crime family son uniform introduce girlfriend family reception godson singer pleads help secure movie role dispatch consigliere influence studio head be unmoved morning wake bed head stallion day daughter wedding hear request role crime family son uniform introduce girlfriend family reception godson'" + "'edit edit edit day daughter wedding hears request role crime family youngest son uniform introduces girlfriend family sprawling reception godson popular singer pleads help securing coveted movie role dispatch consigliere influence abrasive studio head unmoved morning wake bed severed head prized stallion day daughter wedding hears request role crime family youngest son uniform introduces girlfriend family sprawling reception godson'" ] }, - "execution_count": 6, + "execution_count": 134, "metadata": {}, "output_type": "execute_result" } @@ -198,16 +233,15 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 135, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 16.3 s, sys: 8.29 ms, total: 16.4 s\n", - "Wall time: 16.4 s\n", - "(100, 364)\n" + "Wall time: 25.9 s\n", + "(100, 444)\n" ] } ], @@ -226,17 +260,17 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 136, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "<100x364 sparse matrix of type ''\n", - "\twith 13128 stored elements in Compressed Sparse Row format>" + "<100x444 sparse matrix of type ''\n", + "\twith 15106 stored elements in Compressed Sparse Row format>" ] }, - "execution_count": 8, + "execution_count": 136, "metadata": {}, "output_type": "execute_result" } @@ -260,14 +294,48 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 137, "metadata": {}, "outputs": [], "source": [ + "from random import randint\n", + "from random import seed\n", + "import random\n", "def Kmeans(X, num_clusters=8, max_iter=300):\n", "\n", " # YOUR CODE STARTS HERE\n", - " \n", + " for p in range(0,max_iter):\n", + " \n", + " centroids = []\n", + " seed(p+2)\n", + " n = random.sample(range(X.shape[0]), num_clusters)\n", + "\n", + " for i in range(num_clusters):\n", + " centroids.append(X[n[i]])\n", + " \n", + " while True:\n", + " \n", + " classes = []\n", + " class_dict = {}\n", + "\n", + " for i in range(0,num_clusters):\n", + " class_dict[i] = []\n", + "\n", + " for point in X:\n", + " all_dists = [np.linalg.norm(centroid - point) for centroid in centroids]\n", + " classes.append(all_dists.index(min(all_dists)))\n", + " class_dict[all_dists.index(min(all_dists))].append(point)\n", + " \n", + " prev_centroid = centroids\n", + "\n", + " for cluster in class_dict:\n", + " centroids[cluster] = np.mean(class_dict[cluster], axis=0)\n", + " \n", + " if prev_centroid == centroids:\n", + " break\n", + "\n", + " labels = np.array(classes)\n", + " centers = np.array(centroids)\n", " # YOUR CODE ENDS HERE\n", " \n", " return (labels, centers)" @@ -275,23 +343,24 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 138, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "(array([0., 0., 1., 1.]), array([[2, 2],\n", - " [8, 2]]))" + "(array([2, 1, 0, 0, 2, 1]), array([[8. , 2. ],\n", + " [2.5, 3. ],\n", + " [2.5, 1. ]]))" ] }, - "execution_count": 10, + "execution_count": 138, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "Kmeans(np.array([[2,1], [2,3], [8,1], [8,3]]), num_clusters=2)" + "Kmeans(np.array([[2,1], [2,3], [8,1], [8,3], [3,1], [3,3]]), num_clusters=3)" ] }, { @@ -303,15 +372,14 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 139, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "CPU times: user 4.71 s, sys: 4.01 ms, total: 4.72 s\n", - "Wall time: 4.71 s\n" + "Wall time: 5.49 s\n" ] } ], @@ -328,7 +396,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 140, "metadata": { "scrolled": false }, @@ -361,183 +429,183 @@ " \n", " \n", " \n", - " 2.0\n", + " 1\n", " The Godfather\n", - " 2.0\n", + " 1\n", " [u' Crime', u' Drama']\n", " \n", " \n", - " 2.0\n", + " 1\n", " The Shawshank Redemption\n", - " 2.0\n", + " 1\n", " [u' Crime', u' Drama']\n", " \n", " \n", - " 1.0\n", + " 1\n", " Schindler's List\n", - " 1.0\n", + " 1\n", " [u' Biography', u' Drama', u' History']\n", " \n", " \n", - " 2.0\n", + " 0\n", " Raging Bull\n", - " 2.0\n", + " 0\n", " [u' Biography', u' Drama', u' Sport']\n", " \n", " \n", - " 0.0\n", + " 1\n", " Casablanca\n", - " 0.0\n", + " 1\n", " [u' Drama', u' Romance', u' War']\n", " \n", " \n", - " 0.0\n", + " 1\n", " One Flew Over the Cuckoo's Nest\n", - " 0.0\n", + " 1\n", " [u' Drama']\n", " \n", " \n", - " 2.0\n", + " 1\n", " Gone with the Wind\n", - " 2.0\n", + " 1\n", " [u' Drama', u' Romance', u' War']\n", " \n", " \n", - " 0.0\n", + " 0\n", " Citizen Kane\n", - " 0.0\n", + " 0\n", " [u' Drama', u' Mystery']\n", " \n", " \n", - " 1.0\n", + " 1\n", " The Wizard of Oz\n", - " 1.0\n", + " 1\n", " [u' Adventure', u' Family', u' Fantasy', u' Mu...\n", " \n", " \n", - " 1.0\n", + " 0\n", " Titanic\n", - " 1.0\n", + " 0\n", " [u' Drama', u' Romance']\n", " \n", " \n", - " 1.0\n", + " 1\n", " Lawrence of Arabia\n", - " 1.0\n", + " 1\n", " [u' Adventure', u' Biography', u' Drama', u' H...\n", " \n", " \n", - " 2.0\n", + " 1\n", " The Godfather: Part II\n", - " 2.0\n", + " 1\n", " [u' Crime', u' Drama']\n", " \n", " \n", - " 2.0\n", + " 1\n", " Psycho\n", - " 2.0\n", + " 1\n", " [u' Horror', u' Mystery', u' Thriller']\n", " \n", " \n", - " 2.0\n", + " 2\n", " Sunset Blvd.\n", - " 2.0\n", + " 2\n", " [u' Drama', u' Film-Noir']\n", " \n", " \n", - " 0.0\n", + " 1\n", " Vertigo\n", - " 0.0\n", + " 1\n", " [u' Mystery', u' Romance', u' Thriller']\n", " \n", " \n", - " 2.0\n", + " 1\n", " On the Waterfront\n", - " 2.0\n", + " 1\n", " [u' Crime', u' Drama']\n", " \n", " \n", - " 0.0\n", + " 1\n", " Forrest Gump\n", - " 0.0\n", + " 1\n", " [u' Drama', u' Romance']\n", " \n", " \n", - " 0.0\n", + " 1\n", " The Sound of Music\n", - " 0.0\n", + " 1\n", " [u' Biography', u' Drama', u' Family', u' Musi...\n", " \n", " \n", - " 0.0\n", + " 1\n", " West Side Story\n", - " 0.0\n", + " 1\n", " [u' Crime', u' Drama', u' Musical', u' Romance...\n", " \n", " \n", - " 1.0\n", + " 1\n", " Star Wars\n", - " 1.0\n", + " 1\n", " [u' Action', u' Adventure', u' Fantasy', u' Sc...\n", " \n", " \n", - " 0.0\n", + " 1\n", " E.T. the Extra-Terrestrial\n", - " 0.0\n", + " 1\n", " [u' Adventure', u' Family', u' Sci-Fi']\n", " \n", " \n", - " 0.0\n", + " 1\n", " 2001: A Space Odyssey\n", - " 0.0\n", + " 1\n", " [u' Mystery', u' Sci-Fi']\n", " \n", " \n", - " 1.0\n", + " 1\n", " The Silence of the Lambs\n", - " 1.0\n", + " 1\n", " [u' Crime', u' Drama', u' Thriller']\n", " \n", " \n", - " 2.0\n", + " 1\n", " Chinatown\n", - " 2.0\n", + " 1\n", " [u' Drama', u' Mystery', u' Thriller']\n", " \n", " \n", - " 1.0\n", + " 1\n", " The Bridge on the River Kwai\n", - " 1.0\n", + " 1\n", " [u' Adventure', u' Drama', u' War']\n", " \n", " \n", - " 0.0\n", + " 2\n", " Singin' in the Rain\n", - " 0.0\n", + " 2\n", " [u' Comedy', u' Musical', u' Romance']\n", " \n", " \n", - " 2.0\n", + " 1\n", " It's a Wonderful Life\n", - " 2.0\n", + " 1\n", " [u' Drama', u' Family', u' Fantasy']\n", " \n", " \n", - " 0.0\n", + " 1\n", " Some Like It Hot\n", - " 0.0\n", + " 1\n", " [u' Comedy']\n", " \n", " \n", - " 1.0\n", + " 1\n", " 12 Angry Men\n", - " 1.0\n", + " 1\n", " [u' Drama']\n", " \n", " \n", - " 1.0\n", + " 1\n", " Dr. Strangelove or: How I Learned to Stop Worr...\n", - " 1.0\n", + " 1\n", " [u' Comedy', u' War']\n", " \n", " \n", @@ -547,183 +615,183 @@ " ...\n", " \n", " \n", - " 2.0\n", + " 1\n", " Rain Man\n", - " 2.0\n", + " 1\n", " [u' Drama']\n", " \n", " \n", - " 0.0\n", + " 1\n", " Annie Hall\n", - " 0.0\n", + " 1\n", " [u' Comedy', u' Drama', u' Romance']\n", " \n", " \n", - " 2.0\n", + " 0\n", " Out of Africa\n", - " 2.0\n", + " 0\n", " [u' Biography', u' Drama', u' Romance']\n", " \n", " \n", - " 0.0\n", + " 1\n", " Good Will Hunting\n", - " 0.0\n", + " 1\n", " [u' Drama']\n", " \n", " \n", - " 2.0\n", + " 0\n", " Terms of Endearment\n", - " 2.0\n", + " 0\n", " [u' Comedy', u' Drama']\n", " \n", " \n", - " 0.0\n", + " 1\n", " Tootsie\n", - " 0.0\n", + " 1\n", " [u' Comedy', u' Drama', u' Romance']\n", " \n", " \n", - " 2.0\n", + " 1\n", " Fargo\n", - " 2.0\n", + " 1\n", " [u' Crime', u' Drama', u' Thriller']\n", " \n", " \n", - " 2.0\n", + " 1\n", " Giant\n", - " 2.0\n", + " 1\n", " [u' Drama', u' Romance']\n", " \n", " \n", - " 1.0\n", + " 1\n", " The Grapes of Wrath\n", - " 1.0\n", + " 1\n", " [u' Drama']\n", " \n", " \n", - " 1.0\n", + " 1\n", " Shane\n", - " 1.0\n", + " 1\n", " [u' Drama', u' Romance', u' Western']\n", " \n", " \n", - " 0.0\n", + " 1\n", " The Green Mile\n", - " 0.0\n", + " 1\n", " [u' Crime', u' Drama', u' Fantasy', u' Mystery']\n", " \n", " \n", - " 1.0\n", + " 1\n", " Close Encounters of the Third Kind\n", - " 1.0\n", + " 1\n", " [u' Drama', u' Sci-Fi']\n", " \n", " \n", - " 0.0\n", + " 0\n", " Network\n", - " 0.0\n", + " 0\n", " [u' Drama']\n", " \n", " \n", - " 0.0\n", + " 1\n", " Nashville\n", - " 0.0\n", + " 1\n", " [u' Drama', u' Music']\n", " \n", " \n", - " 0.0\n", + " 0\n", " The Graduate\n", - " 0.0\n", + " 0\n", " [u' Comedy', u' Drama', u' Romance']\n", " \n", " \n", - " 2.0\n", + " 1\n", " American Graffiti\n", - " 2.0\n", + " 1\n", " [u' Comedy', u' Drama']\n", " \n", " \n", - " 2.0\n", + " 1\n", " Pulp Fiction\n", - " 2.0\n", + " 1\n", " [u' Crime', u' Drama', u' Thriller']\n", " \n", " \n", - " 1.0\n", + " 1\n", " The African Queen\n", - " 1.0\n", + " 1\n", " [u' Adventure', u' Romance', u' War']\n", " \n", " \n", - " 1.0\n", + " 1\n", " Stagecoach\n", - " 1.0\n", + " 1\n", " [u' Adventure', u' Western']\n", " \n", " \n", - " 1.0\n", + " 0\n", " Mutiny on the Bounty\n", - " 1.0\n", + " 0\n", " [u' Adventure', u' Drama', u' History']\n", " \n", " \n", - " 1.0\n", + " 1\n", " The Maltese Falcon\n", - " 1.0\n", + " 1\n", " [u' Drama', u' Film-Noir', u' Mystery']\n", " \n", " \n", - " 0.0\n", + " 1\n", " A Clockwork Orange\n", - " 0.0\n", + " 1\n", " [u' Crime', u' Drama', u' Sci-Fi']\n", " \n", " \n", - " 1.0\n", + " 1\n", " Taxi Driver\n", - " 1.0\n", + " 1\n", " [u' Crime', u' Drama']\n", " \n", " \n", - " 0.0\n", + " 1\n", " Wuthering Heights\n", - " 0.0\n", + " 1\n", " [u' Drama', u' Romance']\n", " \n", " \n", - " 2.0\n", + " 1\n", " Double Indemnity\n", - " 2.0\n", + " 1\n", " [u' Crime', u' Drama', u' Film-Noir', u' Thril...\n", " \n", " \n", - " 2.0\n", + " 1\n", " Rebel Without a Cause\n", - " 2.0\n", + " 1\n", " [u' Drama']\n", " \n", " \n", - " 0.0\n", + " 1\n", " Rear Window\n", - " 0.0\n", + " 1\n", " [u' Mystery', u' Thriller']\n", " \n", " \n", - " 0.0\n", + " 1\n", " The Third Man\n", - " 0.0\n", + " 1\n", " [u' Film-Noir', u' Mystery', u' Thriller']\n", " \n", " \n", - " 2.0\n", + " 1\n", " North by Northwest\n", - " 2.0\n", + " 1\n", " [u' Mystery', u' Thriller']\n", " \n", " \n", - " 0.0\n", + " 0\n", " Yankee Doodle Dandy\n", - " 0.0\n", + " 0\n", " [u' Biography', u' Drama', u' Musical']\n", " \n", " \n", @@ -732,136 +800,136 @@ "" ], "text/plain": [ - " title cluster \\\n", - "2.0 The Godfather 2.0 \n", - "2.0 The Shawshank Redemption 2.0 \n", - "1.0 Schindler's List 1.0 \n", - "2.0 Raging Bull 2.0 \n", - "0.0 Casablanca 0.0 \n", - "0.0 One Flew Over the Cuckoo's Nest 0.0 \n", - "2.0 Gone with the Wind 2.0 \n", - "0.0 Citizen Kane 0.0 \n", - "1.0 The Wizard of Oz 1.0 \n", - "1.0 Titanic 1.0 \n", - "1.0 Lawrence of Arabia 1.0 \n", - "2.0 The Godfather: Part II 2.0 \n", - "2.0 Psycho 2.0 \n", - "2.0 Sunset Blvd. 2.0 \n", - "0.0 Vertigo 0.0 \n", - "2.0 On the Waterfront 2.0 \n", - "0.0 Forrest Gump 0.0 \n", - "0.0 The Sound of Music 0.0 \n", - "0.0 West Side Story 0.0 \n", - "1.0 Star Wars 1.0 \n", - "0.0 E.T. the Extra-Terrestrial 0.0 \n", - "0.0 2001: A Space Odyssey 0.0 \n", - "1.0 The Silence of the Lambs 1.0 \n", - "2.0 Chinatown 2.0 \n", - "1.0 The Bridge on the River Kwai 1.0 \n", - "0.0 Singin' in the Rain 0.0 \n", - "2.0 It's a Wonderful Life 2.0 \n", - "0.0 Some Like It Hot 0.0 \n", - "1.0 12 Angry Men 1.0 \n", - "1.0 Dr. Strangelove or: How I Learned to Stop Worr... 1.0 \n", - ".. ... ... \n", - "2.0 Rain Man 2.0 \n", - "0.0 Annie Hall 0.0 \n", - "2.0 Out of Africa 2.0 \n", - "0.0 Good Will Hunting 0.0 \n", - "2.0 Terms of Endearment 2.0 \n", - "0.0 Tootsie 0.0 \n", - "2.0 Fargo 2.0 \n", - "2.0 Giant 2.0 \n", - "1.0 The Grapes of Wrath 1.0 \n", - "1.0 Shane 1.0 \n", - "0.0 The Green Mile 0.0 \n", - "1.0 Close Encounters of the Third Kind 1.0 \n", - "0.0 Network 0.0 \n", - "0.0 Nashville 0.0 \n", - "0.0 The Graduate 0.0 \n", - "2.0 American Graffiti 2.0 \n", - "2.0 Pulp Fiction 2.0 \n", - "1.0 The African Queen 1.0 \n", - "1.0 Stagecoach 1.0 \n", - "1.0 Mutiny on the Bounty 1.0 \n", - "1.0 The Maltese Falcon 1.0 \n", - "0.0 A Clockwork Orange 0.0 \n", - "1.0 Taxi Driver 1.0 \n", - "0.0 Wuthering Heights 0.0 \n", - "2.0 Double Indemnity 2.0 \n", - "2.0 Rebel Without a Cause 2.0 \n", - "0.0 Rear Window 0.0 \n", - "0.0 The Third Man 0.0 \n", - "2.0 North by Northwest 2.0 \n", - "0.0 Yankee Doodle Dandy 0.0 \n", + " title cluster \\\n", + "1 The Godfather 1 \n", + "1 The Shawshank Redemption 1 \n", + "1 Schindler's List 1 \n", + "0 Raging Bull 0 \n", + "1 Casablanca 1 \n", + "1 One Flew Over the Cuckoo's Nest 1 \n", + "1 Gone with the Wind 1 \n", + "0 Citizen Kane 0 \n", + "1 The Wizard of Oz 1 \n", + "0 Titanic 0 \n", + "1 Lawrence of Arabia 1 \n", + "1 The Godfather: Part II 1 \n", + "1 Psycho 1 \n", + "2 Sunset Blvd. 2 \n", + "1 Vertigo 1 \n", + "1 On the Waterfront 1 \n", + "1 Forrest Gump 1 \n", + "1 The Sound of Music 1 \n", + "1 West Side Story 1 \n", + "1 Star Wars 1 \n", + "1 E.T. the Extra-Terrestrial 1 \n", + "1 2001: A Space Odyssey 1 \n", + "1 The Silence of the Lambs 1 \n", + "1 Chinatown 1 \n", + "1 The Bridge on the River Kwai 1 \n", + "2 Singin' in the Rain 2 \n", + "1 It's a Wonderful Life 1 \n", + "1 Some Like It Hot 1 \n", + "1 12 Angry Men 1 \n", + "1 Dr. Strangelove or: How I Learned to Stop Worr... 1 \n", + ".. ... ... \n", + "1 Rain Man 1 \n", + "1 Annie Hall 1 \n", + "0 Out of Africa 0 \n", + "1 Good Will Hunting 1 \n", + "0 Terms of Endearment 0 \n", + "1 Tootsie 1 \n", + "1 Fargo 1 \n", + "1 Giant 1 \n", + "1 The Grapes of Wrath 1 \n", + "1 Shane 1 \n", + "1 The Green Mile 1 \n", + "1 Close Encounters of the Third Kind 1 \n", + "0 Network 0 \n", + "1 Nashville 1 \n", + "0 The Graduate 0 \n", + "1 American Graffiti 1 \n", + "1 Pulp Fiction 1 \n", + "1 The African Queen 1 \n", + "1 Stagecoach 1 \n", + "0 Mutiny on the Bounty 0 \n", + "1 The Maltese Falcon 1 \n", + "1 A Clockwork Orange 1 \n", + "1 Taxi Driver 1 \n", + "1 Wuthering Heights 1 \n", + "1 Double Indemnity 1 \n", + "1 Rebel Without a Cause 1 \n", + "1 Rear Window 1 \n", + "1 The Third Man 1 \n", + "1 North by Northwest 1 \n", + "0 Yankee Doodle Dandy 0 \n", "\n", - " genre \n", - "2.0 [u' Crime', u' Drama'] \n", - "2.0 [u' Crime', u' Drama'] \n", - "1.0 [u' Biography', u' Drama', u' History'] \n", - "2.0 [u' Biography', u' Drama', u' Sport'] \n", - "0.0 [u' Drama', u' Romance', u' War'] \n", - "0.0 [u' Drama'] \n", - "2.0 [u' Drama', u' Romance', u' War'] \n", - "0.0 [u' Drama', u' Mystery'] \n", - "1.0 [u' Adventure', u' Family', u' Fantasy', u' Mu... \n", - "1.0 [u' Drama', u' Romance'] \n", - "1.0 [u' Adventure', u' Biography', u' Drama', u' H... \n", - "2.0 [u' Crime', u' Drama'] \n", - "2.0 [u' Horror', u' Mystery', u' Thriller'] \n", - "2.0 [u' Drama', u' Film-Noir'] \n", - "0.0 [u' Mystery', u' Romance', u' Thriller'] \n", - "2.0 [u' Crime', u' Drama'] \n", - "0.0 [u' Drama', u' Romance'] \n", - "0.0 [u' Biography', u' Drama', u' Family', u' Musi... \n", - "0.0 [u' Crime', u' Drama', u' Musical', u' Romance... \n", - "1.0 [u' Action', u' Adventure', u' Fantasy', u' Sc... \n", - "0.0 [u' Adventure', u' Family', u' Sci-Fi'] \n", - "0.0 [u' Mystery', u' Sci-Fi'] \n", - "1.0 [u' Crime', u' Drama', u' Thriller'] \n", - "2.0 [u' Drama', u' Mystery', u' Thriller'] \n", - "1.0 [u' Adventure', u' Drama', u' War'] \n", - "0.0 [u' Comedy', u' Musical', u' Romance'] \n", - "2.0 [u' Drama', u' Family', u' Fantasy'] \n", - "0.0 [u' Comedy'] \n", - "1.0 [u' Drama'] \n", - "1.0 [u' Comedy', u' War'] \n", - ".. ... \n", - "2.0 [u' Drama'] \n", - "0.0 [u' Comedy', u' Drama', u' Romance'] \n", - "2.0 [u' Biography', u' Drama', u' Romance'] \n", - "0.0 [u' Drama'] \n", - "2.0 [u' Comedy', u' Drama'] \n", - "0.0 [u' Comedy', u' Drama', u' Romance'] \n", - "2.0 [u' Crime', u' Drama', u' Thriller'] \n", - "2.0 [u' Drama', u' Romance'] \n", - "1.0 [u' Drama'] \n", - "1.0 [u' Drama', u' Romance', u' Western'] \n", - "0.0 [u' Crime', u' Drama', u' Fantasy', u' Mystery'] \n", - "1.0 [u' Drama', u' Sci-Fi'] \n", - "0.0 [u' Drama'] \n", - "0.0 [u' Drama', u' Music'] \n", - "0.0 [u' Comedy', u' Drama', u' Romance'] \n", - "2.0 [u' Comedy', u' Drama'] \n", - "2.0 [u' Crime', u' Drama', u' Thriller'] \n", - "1.0 [u' Adventure', u' Romance', u' War'] \n", - "1.0 [u' Adventure', u' Western'] \n", - "1.0 [u' Adventure', u' Drama', u' History'] \n", - "1.0 [u' Drama', u' Film-Noir', u' Mystery'] \n", - "0.0 [u' Crime', u' Drama', u' Sci-Fi'] \n", - "1.0 [u' Crime', u' Drama'] \n", - "0.0 [u' Drama', u' Romance'] \n", - "2.0 [u' Crime', u' Drama', u' Film-Noir', u' Thril... \n", - "2.0 [u' Drama'] \n", - "0.0 [u' Mystery', u' Thriller'] \n", - "0.0 [u' Film-Noir', u' Mystery', u' Thriller'] \n", - "2.0 [u' Mystery', u' Thriller'] \n", - "0.0 [u' Biography', u' Drama', u' Musical'] \n", + " genre \n", + "1 [u' Crime', u' Drama'] \n", + "1 [u' Crime', u' Drama'] \n", + "1 [u' Biography', u' Drama', u' History'] \n", + "0 [u' Biography', u' Drama', u' Sport'] \n", + "1 [u' Drama', u' Romance', u' War'] \n", + "1 [u' Drama'] \n", + "1 [u' Drama', u' Romance', u' War'] \n", + "0 [u' Drama', u' Mystery'] \n", + "1 [u' Adventure', u' Family', u' Fantasy', u' Mu... \n", + "0 [u' Drama', u' Romance'] \n", + "1 [u' Adventure', u' Biography', u' Drama', u' H... \n", + "1 [u' Crime', u' Drama'] \n", + "1 [u' Horror', u' Mystery', u' Thriller'] \n", + "2 [u' Drama', u' Film-Noir'] \n", + "1 [u' Mystery', u' Romance', u' Thriller'] \n", + "1 [u' Crime', u' Drama'] \n", + "1 [u' Drama', u' Romance'] \n", + "1 [u' Biography', u' Drama', u' Family', u' Musi... \n", + "1 [u' Crime', u' Drama', u' Musical', u' Romance... \n", + "1 [u' Action', u' Adventure', u' Fantasy', u' Sc... \n", + "1 [u' Adventure', u' Family', u' Sci-Fi'] \n", + "1 [u' Mystery', u' Sci-Fi'] \n", + "1 [u' Crime', u' Drama', u' Thriller'] \n", + "1 [u' Drama', u' Mystery', u' Thriller'] \n", + "1 [u' Adventure', u' Drama', u' War'] \n", + "2 [u' Comedy', u' Musical', u' Romance'] \n", + "1 [u' Drama', u' Family', u' Fantasy'] \n", + "1 [u' Comedy'] \n", + "1 [u' Drama'] \n", + "1 [u' Comedy', u' War'] \n", + ".. ... \n", + "1 [u' Drama'] \n", + "1 [u' Comedy', u' Drama', u' Romance'] \n", + "0 [u' Biography', u' Drama', u' Romance'] \n", + "1 [u' Drama'] \n", + "0 [u' Comedy', u' Drama'] \n", + "1 [u' Comedy', u' Drama', u' Romance'] \n", + "1 [u' Crime', u' Drama', u' Thriller'] \n", + "1 [u' Drama', u' Romance'] \n", + "1 [u' Drama'] \n", + "1 [u' Drama', u' Romance', u' Western'] \n", + "1 [u' Crime', u' Drama', u' Fantasy', u' Mystery'] \n", + "1 [u' Drama', u' Sci-Fi'] \n", + "0 [u' Drama'] \n", + "1 [u' Drama', u' Music'] \n", + "0 [u' Comedy', u' Drama', u' Romance'] \n", + "1 [u' Comedy', u' Drama'] \n", + "1 [u' Crime', u' Drama', u' Thriller'] \n", + "1 [u' Adventure', u' Romance', u' War'] \n", + "1 [u' Adventure', u' Western'] \n", + "0 [u' Adventure', u' Drama', u' History'] \n", + "1 [u' Drama', u' Film-Noir', u' Mystery'] \n", + "1 [u' Crime', u' Drama', u' Sci-Fi'] \n", + "1 [u' Crime', u' Drama'] \n", + "1 [u' Drama', u' Romance'] \n", + "1 [u' Crime', u' Drama', u' Film-Noir', u' Thril... \n", + "1 [u' Drama'] \n", + "1 [u' Mystery', u' Thriller'] \n", + "1 [u' Film-Noir', u' Mystery', u' Thriller'] \n", + "1 [u' Mystery', u' Thriller'] \n", + "0 [u' Biography', u' Drama', u' Musical'] \n", "\n", "[100 rows x 3 columns]" ] }, - "execution_count": 12, + "execution_count": 140, "metadata": {}, "output_type": "execute_result" } @@ -882,7 +950,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 141, "metadata": { "scrolled": true }, @@ -890,13 +958,13 @@ { "data": { "text/plain": [ - "2.0 36\n", - "1.0 33\n", - "0.0 31\n", + "1 83\n", + "0 13\n", + "2 4\n", "Name: cluster, dtype: int64" ] }, - "execution_count": 13, + "execution_count": 141, "metadata": {}, "output_type": "execute_result" } @@ -915,7 +983,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 142, "metadata": { "scrolled": false }, @@ -925,14 +993,15 @@ "output_type": "stream", "text": [ "Top terms per cluster:\n", - "Cluster 0 words: love, friend, apartment, film, say, sing,\n", - "Cluster 0 titles: Casablanca, One Flew Over the Cuckoo's Nest, Citizen Kane, Vertigo, Forrest Gump, The Sound of Music, West Side Story, E.T. the Extra-Terrestrial, 2001: A Space Odyssey, Singin' in the Rain, Some Like It Hot, Gandhi, From Here to Eternity, Rocky, An American in Paris, The Good, the Bad and the Ugly, The Apartment, The Deer Hunter, A Place in the Sun, Annie Hall, Good Will Hunting, Tootsie, The Green Mile, Network, Nashville, The Graduate, A Clockwork Orange, Wuthering Heights, Rear Window, The Third Man, Yankee Doodle Dandy,\n", + "(3, 1, 444)\n", + "Cluster 0 words: group, foot, begs, follow, hidden, field,\n", + "Cluster 0 titles: Raging Bull, Citizen Kane, Titanic, Amadeus, The Philadelphia Story, The Best Years of Our Lives, The King's Speech, Out of Africa, Terms of Endearment, Network, The Graduate, Mutiny on the Bounty, Yankee Doodle Dandy,\n", "\n", - "Cluster 1 words: kill, soldier, men, shoot, order, town,\n", - "Cluster 1 titles: Schindler's List, The Wizard of Oz, Titanic, Lawrence of Arabia, Star Wars, The Silence of the Lambs, The Bridge on the River Kwai, 12 Angry Men, Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb, Apocalypse Now, The Lord of the Rings: The Return of the King, Gladiator, Saving Private Ryan, Unforgiven, Raiders of the Lost Ark, Patton, Jaws, Butch Cassidy and the Sundance Kid, The Treasure of the Sierra Madre, Platoon, High Noon, Dances with Wolves, The Pianist, All Quiet on the Western Front, Mr. Smith Goes to Washington, The Grapes of Wrath, Shane, Close Encounters of the Third Kind, The African Queen, Stagecoach, Mutiny on the Bounty, The Maltese Falcon, Taxi Driver,\n", + "Cluster 1 words: shortly, trouble, opening, didnt, angry, returned,\n", + "Cluster 1 titles: The Godfather, The Shawshank Redemption, Schindler's List, Casablanca, One Flew Over the Cuckoo's Nest, Gone with the Wind, The Wizard of Oz, Lawrence of Arabia, The Godfather: Part II, Psycho, Vertigo, On the Waterfront, Forrest Gump, The Sound of Music, West Side Story, Star Wars, E.T. the Extra-Terrestrial, 2001: A Space Odyssey, The Silence of the Lambs, Chinatown, The Bridge on the River Kwai, It's a Wonderful Life, Some Like It Hot, 12 Angry Men, Dr. Strangelove or: How I Learned to Stop Worrying and Love the Bomb, Apocalypse Now, The Lord of the Rings: The Return of the King, Gladiator, From Here to Eternity, Saving Private Ryan, Unforgiven, Raiders of the Lost Ark, Rocky, A Streetcar Named Desire, To Kill a Mockingbird, An American in Paris, My Fair Lady, Ben-Hur, Doctor Zhivago, Jaws, Braveheart, The Good, the Bad and the Ugly, Butch Cassidy and the Sundance Kid, The Treasure of the Sierra Madre, The Apartment, Platoon, High Noon, Dances with Wolves, The Pianist, Goodfellas, The Exorcist, The Deer Hunter, All Quiet on the Western Front, The French Connection, City Lights, It Happened One Night, A Place in the Sun, Midnight Cowboy, Mr. Smith Goes to Washington, Rain Man, Annie Hall, Good Will Hunting, Tootsie, Fargo, Giant, The Grapes of Wrath, Shane, The Green Mile, Close Encounters of the Third Kind, Nashville, American Graffiti, Pulp Fiction, The African Queen, Stagecoach, The Maltese Falcon, A Clockwork Orange, Taxi Driver, Wuthering Heights, Double Indemnity, Rebel Without a Cause, Rear Window, The Third Man, North by Northwest,\n", "\n", - "Cluster 2 words: father, car, family, brother, house, money,\n", - "Cluster 2 titles: The Godfather, The Shawshank Redemption, Raging Bull, Gone with the Wind, The Godfather: Part II, Psycho, Sunset Blvd., On the Waterfront, Chinatown, It's a Wonderful Life, Amadeus, A Streetcar Named Desire, The Philadelphia Story, To Kill a Mockingbird, The Best Years of Our Lives, My Fair Lady, Ben-Hur, Doctor Zhivago, Braveheart, Goodfellas, The Exorcist, The French Connection, City Lights, The King's Speech, It Happened One Night, Midnight Cowboy, Rain Man, Out of Africa, Terms of Endearment, Fargo, Giant, American Graffiti, Pulp Fiction, Double Indemnity, Rebel Without a Cause, North by Northwest,\n", + "Cluster 2 words: known, matter, enter, enters, entire, rush,\n", + "Cluster 2 titles: Sunset Blvd., Singin' in the Rain, Gandhi, Patton,\n", "\n" ] } @@ -940,11 +1009,12 @@ "source": [ "print(\"Top terms per cluster:\")\n", "order_centroids = np.asarray(centers).argsort()[:, ::-1]\n", + "print(order_centroids.shape)\n", "cluster_names = []\n", "for i in range(order_centroids.shape[0]):\n", " print(\"Cluster %d words:\" % i, end='')\n", " q = \"\"\n", - " for ind in order_centroids[i, :6]:\n", + " for ind in order_centroids[i][0][:6]:\n", " print(' %s' % terms[ind], end=',')\n", " q += str(terms[ind])\n", " q += \" \"\n", @@ -968,7 +1038,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 143, "metadata": {}, "outputs": [], "source": [ @@ -978,7 +1048,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 144, "metadata": {}, "outputs": [], "source": [ @@ -988,14 +1058,14 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 145, "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "image/png": "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SktLo8bGRjp16hRdc8019PTTTxMR0bXXXkuzZs1yrTt+/HgqKSkhIqJXXnmFJk6cSERE06ZNo9WrV7vWu+SSS4iIaPPmzXTRRRfRwYMH6fz583T99dd7rOfk/vo1a9bQ9ddfT+fPn6f/+7//o759+9KxY8dkl2/evJnGjRsnuW9y26+traWRI0dSQ0MDEREtWbKE/vCHP9DZs2epT58+dOjQISIimjp1quu9x48fT9u3byciotOnT1Nzc3O77VksFqqtrSUiotmzZ9PixYuJiGjTpk2UlpZGRETFxcX0wAMPEBHRokWLXMc6NTWVtmzZQkRECxcupN/85jdERJScnEz19fW0fPlyyszMpLKyMqqqqqKhQ4e22/6iRYto2LBh1NTURLW1tdS9e3c6d+6cxzl56623XMfx6NGjFBcXR6tXr3bt+/79+6m1tZWmTJni2vf58+fTihUriIjoxIkTlJiYSA0NDVRcXEwJCQl08uRJOnv2LPXr148OHz7s8/x+++23NHDgQCIieumll+iJJ54gIqKmpiYaNGgQHTp0yGOdZ599lu655x4iIvr8888pOjqaPv74Y8nzHWmkYgO0SO9ARHVElENEiW0/f2hbXklEM9p+LyOizkRkd3t8Fsp2mQ9q5B/wsn37dkycOBEXX3wxunbtiptuusnj+dtvv931+86dO13VK3fddRe2b9/u9/2zsrJw1VVXITo6Gnl5eX5fs337duTl5SE6Ohq9evXCtddei48//lh2eTDb/+ijj7Bnzx4MHz4cdrsdpaWlqK6uxt69e3HVVVe5qm3y8vJc7zN8+HA8/PDDWLZsGU6ePOm3Cmz79u246667AADXXXcd6urqUF9fL7lufX09Tp48iWuvvRYAMG3aNGzbtg2Ao65+x44d2LZtG37/+99j27ZtqKiowMiRIyXfa9y4cbjooovQo0cPXHHFFfjPf/7j8fy2bdtcx/GnP/0prrvuOgDA3r17kZCQgMTERAghcOedd7pes3HjRixZsgR2ux2jRo1CU1OT6xtITk4O4uLiEBMTg+TkZFRLJfWXsXHjRrz22muw2+0YMmQI6urq8M0337Qrr7MsNpsNNptN8fubWcdU0BqYklmvdK0DkqaTn4GAl3iNJqqrA44fd1xzWlsF6uqATp06uapTiAjn3Po9evda8NeLQa48/sopR2r7RITc3Fy8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\n", "text/plain": [ - "" + "" ] }, "metadata": {}, From 569090fa31d4210db8670f3118059fa9d57d07b4 Mon Sep 17 00:00:00 2001 From: Yash Jipkate <34203227+YashJipkate@users.noreply.github.com> Date: Tue, 2 Oct 2018 15:39:59 +0530 Subject: [PATCH 2/2] Update README.md --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index efe2a89..a41c664 100644 --- a/README.md +++ b/README.md @@ -2,4 +2,7 @@ This is the fourth assignment in the series of assignments released as a part of COPS ML Summer School 2018. In this assignment, we will be clustering movies on the basis of their synopsis. -Like before, fork this repo and submit the link to the forked repo [here](https://docs.google.com/forms/d/1cnWIu-5HIa2cPIMBG0dqVkIoP0KDvLdnVJvPqYthO-I). \ No newline at end of file +THis is done by Mr. Yash Sahu B.tech 4-yr Mechanical Engineering +Roll no. 17135096 + +Like before, fork this repo and submit the link to the forked repo [here](https://docs.google.com/forms/d/1cnWIu-5HIa2cPIMBG0dqVkIoP0KDvLdnVJvPqYthO-I).