Sebastian Raschka, 2015
In [1]:
import numpy as np
from nltk.stem.porter import PorterStemmer
import re
from nltk.corpus import stopwords
stop = stopwords.words('english')
porter = PorterStemmer()
def tokenizer(text):
text = re.sub('<[^>]*>', '', text)
emoticons = re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)', text.lower())
text = re.sub('[\W]+', ' ', text.lower()) + ' '.join(emoticons).replace('-', '')
text = [w for w in text.split() if w not in stop]
tokenized = [porter.stem(w) for w in text]
return tokenized
def stream_docs(path):
with open(path, 'r') as csv:
next(csv) # skip header
for line in csv:
text, label = line[:-3], int(line[-2])
yield text, label
In [2]:
next(stream_docs(path='../../data/movie_data.csv'))
Out[2]:
In [3]:
def get_minibatch(doc_stream, size):
docs, y = [], []
for _ in range(size):
text, label = next(doc_stream)
docs.append(text)
y.append(label)
return docs, y
In [4]:
from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.linear_model import SGDClassifier
vect = HashingVectorizer(decode_error='ignore',
n_features=2**21,
preprocessor=None,
tokenizer=tokenizer)
clf = SGDClassifier(loss='log', random_state=1, n_iter=1)
doc_stream = stream_docs(path='../../data/movie_data.csv')
In [5]:
import pyprind
pbar = pyprind.ProgBar(45)
classes = np.array([0, 1])
for _ in range(45):
X_train, y_train = get_minibatch(doc_stream, size=1000)
X_train = vect.transform(X_train)
clf.partial_fit(X_train, y_train, classes=classes)
pbar.update()
In [6]:
X_test, y_test = get_minibatch(doc_stream, size=5000)
X_test = vect.transform(X_test)
print('Accuracy: %.3f' % clf.score(X_test, y_test))
In [7]:
clf = clf.partial_fit(X_test, y_test)
After we trained the logistic regression model as shown above, we know save the classifier along woth the stop words, Porter Stemmer, and HashingVectorizer as serialized objects to our local disk so that we can use the fitted classifier in our web application later.
In [8]:
import pickle
import os
dest = os.path.join('movieclassifier', 'pkl_objects')
if not os.path.exists(dest):
os.mkdir(dest)
pickle.dump(stop, open(os.path.join(dest, 'stopwords.pkl'), 'wb'))
pickle.dump(porter, open(os.path.join(dest, 'porterstemmer.pkl'), 'wb'))
pickle.dump(vect, open(os.path.join(dest, 'vectorizer.pkl'), 'wb'))
pickle.dump(clf, open(os.path.join(dest, 'classifier.pkl'), 'wb'))
After executing the preceeding code cells, we can now restart the IPython notebook kernel to check if the objects were serialized correctly.
In [1]:
import pickle
import re
import os
def tokenizer(text):
text = re.sub('<[^>]*>', '', text)
emoticons = re.findall('(?::|;|=)(?:-)?(?:\)|\(|D|P)', text.lower())
text = re.sub('[\W]+', ' ', text.lower()) + ' '.join(emoticons).replace('-', '')
text = [w for w in text.split() if w not in stop]
tokenized = [porter.stem(w) for w in text]
return text
dest = os.path.join('movieclassifier', 'pkl_objects')
stop = pickle.load(open(os.path.join(dest, 'stopwords.pkl'), 'rb'))
porter = pickle.load(open(os.path.join(dest, 'porterstemmer.pkl'), 'rb'))
vect = pickle.load(open(os.path.join(dest, 'vectorizer.pkl'), 'rb'))
clf = pickle.load(open(os.path.join(dest, 'classifier.pkl'), 'rb'))
In [22]:
import numpy as np
label = {0:'negative', 1:'positive'}
example = ['I love this movie']
X = vect.transform(example)
print('Prediction: %s\nProbability: %.2f%%' %\
(label[clf.predict(X)[0]], np.max(clf.predict_proba(X))*100))
In [17]:
import sqlite3
import os
dest = os.path.join('movieclassifier', 'reviews.sqlite')
conn = sqlite3.connect(dest)
c = conn.cursor()
c.execute('CREATE TABLE review_db (review TEXT, sentiment INTEGER, date TEXT)')
example1 = 'I love this movie'
c.execute("INSERT INTO review_db (review, sentiment, date) VALUES (?, ?, DATETIME('now'))", (example1, 1))
example2 = 'I disliked this movie'
c.execute("INSERT INTO review_db (review, sentiment, date) VALUES (?, ?, DATETIME('now'))", (example2, 0))
conn.commit()
conn.close()
In [18]:
conn = sqlite3.connect(dest)
c = conn.cursor()
c.execute("SELECT * FROM review_db WHERE date BETWEEN '2015-01-01 10:10:10' AND DATETIME('now')")
results = c.fetchall()
conn.close()
In [19]:
print(results)