{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Sebastian Raschka](http://sebastianraschka.com), 2015\n",
"\n",
"https://github.com/rasbt/python-machine-learning-book"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Python Machine Learning - Code Examples"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Chapter 9 - Embedding a Machine Learning Model into a Web Application"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that the optional watermark extension is a small IPython notebook plugin that I developed to make the code reproducible. You can just skip the following line(s)."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Sebastian Raschka \n",
"Last updated: 08/20/2015 \n",
"\n",
"CPython 3.4.3\n",
"IPython 3.2.1\n",
"\n",
"numpy 1.9.2\n",
"pandas 0.16.2\n",
"matplotlib 1.4.3\n",
"nltk 3.0.4\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -a 'Sebastian Raschka' -u -d -v -p numpy,pandas,matplotlib,nltk"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# to install watermark just uncomment the following line:\n",
"#%install_ext https://raw.githubusercontent.com/rasbt/watermark/master/watermark.py"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"
"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Overview"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"- [Chapter 8 recap - Training a model for movie review classification](#Chapter-6-recap---Training-a-model-for-movie-review-classification)\n",
"\n",
"- [Serializing fitted scikit-learn estimators](#Serializing-fitted-scikit-learn-estimators)\n",
"- [Setting up a SQLite database for data storage Developing a web application with Flask](#Setting-up-a-SQLite-database-for-data-storage-Developing-a-web-application-with-Flask)\n",
"- [Our first Flask web application](#Our-first-Flask-web-application)\n",
" - [Form validation and rendering](#Form-validation-and-rendering)\n",
" - [Turning the movie classifier into a web application](#Turning-the-movie-classifier-into-a-web-application)\n",
"- [Deploying the web application to a public server](#Deploying-the-web-application-to-a-public-server)\n",
" - [Updating the movie review classifier](#Updating-the-movie-review-classifier)\n",
"- [Summary](#Summary)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The code for the Flask web applications can be found in the following directories:\n",
" \n",
"- `1st_flask_app_1/`: A simple Flask web app\n",
"- `1st_flask_app_2/`: `1st_flask_app_1` extended with flexible form validation and rendering\n",
"- `movieclassifier/`: The movie classifier embedded in a web application\n",
"- `movieclassifier_with_update/`: same as `movieclassifier` but with update from sqlite database upon start"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"To run the web applications locally, `cd` into the respective directory (as listed above) and execute the main-application script, for example,\n",
"\n",
" cd ./1st_flask_app_1\n",
" python3 app.py\n",
" \n",
"Now, you should see something like\n",
" \n",
" * Running on http://127.0.0.1:5000/\n",
" * Restarting with reloader\n",
" \n",
"in your terminal.\n",
"Next, open a web browsert and enter the address displayed in your terminal (typically http://127.0.0.1:5000/) to view the web application."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Link to a live example application built with this tutorial: http://raschkas.pythonanywhere.com/**."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"
\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"from IPython.display import Image"
]
},
{
"cell_type": "markdown",
"metadata": {
"collapsed": true
},
"source": [
"# Chapter 8 recap - Training a model for movie review classification"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This section is a recap of the logistic regression model that was trained in the last section of Chapter 6. Execute the folling code blocks to train a model that we will serialize in the next section."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import re\n",
"from nltk.corpus import stopwords\n",
"\n",
"stop = stopwords.words('english')\n",
"porter = PorterStemmer()\n",
"\n",
"def tokenizer(text):\n",
" text = re.sub('<[^>]*>', '', text)\n",
" emoticons = re.findall('(?::|;|=)(?:-)?(?:\\)|\\(|D|P)', text.lower())\n",
" text = re.sub('[\\W]+', ' ', text.lower()) + ' '.join(emoticons).replace('-', '')\n",
" tokenized = [w for w in text.split() if w not in stop]\n",
" return tokenized\n",
"\n",
"def stream_docs(path):\n",
" with open(path, 'r') as csv:\n",
" next(csv) # skip header\n",
" for line in csv:\n",
" text, label = line[:-3], int(line[-2])\n",
" yield text, label"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"('\"In 1974, the teenager Martha Moxley (Maggie Grace) moves to the high-class area of Belle Haven, Greenwich, Connecticut. On the Mischief Night, eve of Halloween, she was murdered in the backyard of her house and her murder remained unsolved. Twenty-two years later, the writer Mark Fuhrman (Christopher Meloni), who is a former LA detective that has fallen in disgrace for perjury in O.J. Simpson trial and moved to Idaho, decides to investigate the case with his partner Stephen Weeks (Andrew Mitchell) with the purpose of writing a book. The locals squirm and do not welcome them, but with the support of the retired detective Steve Carroll (Robert Forster) that was in charge of the investigation in the 70\\'s, they discover the criminal and a net of power and money to cover the murder.
\"\"Murder in Greenwich\"\" is a good TV movie, with the true story of a murder of a fifteen years old girl that was committed by a wealthy teenager whose mother was a Kennedy. The powerful and rich family used their influence to cover the murder for more than twenty years. However, a snoopy detective and convicted perjurer in disgrace was able to disclose how the hideous crime was committed. The screenplay shows the investigation of Mark and the last days of Martha in parallel, but there is a lack of the emotion in the dramatization. My vote is seven.
Title (Brazil): Not Available\"',\n",
" 1)"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"next(stream_docs(path='./movie_data.csv'))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"