scikit-learn/doc/tutorial/text_analytics/skeletons/exercise_02_sentiment.py

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

64 lines
2.4 KiB
Python
Raw Normal View History

"""Build a sentiment analysis / polarity model
Sentiment analysis can be casted as a binary text classification problem,
that is fitting a linear classifier on features extracted from the text
2020-01-28 09:52:17 +08:00
of the user messages so as to guess whether the opinion of the author is
positive or negative.
In this examples we will use a movie review dataset.
"""
2011-03-10 15:25:59 +08:00
# Author: Olivier Grisel <olivier.grisel@ensta.org>
# License: Simplified BSD
import sys
2014-01-10 21:56:10 +08:00
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.svm import LinearSVC
2011-09-19 17:46:58 +08:00
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
2011-09-19 17:46:58 +08:00
from sklearn.datasets import load_files
from sklearn.model_selection import train_test_split
2011-09-19 17:46:58 +08:00
from sklearn import metrics
2011-03-10 15:25:59 +08:00
if __name__ == "__main__":
# NOTE: we put the following in a 'if __name__ == "__main__"' protected
# block to be able to use a multi-core grid search that also works under
# Windows, see: http://docs.python.org/library/multiprocessing.html#windows
# The multiprocessing module is used as the backend of joblib.Parallel
# that is used when n_jobs != 1 in GridSearchCV
2011-03-10 15:25:59 +08:00
# the training data folder must be passed as first argument
movie_reviews_data_folder = sys.argv[1]
dataset = load_files(movie_reviews_data_folder, shuffle=False)
2014-01-10 21:56:10 +08:00
print("n_samples: %d" % len(dataset.data))
2011-03-10 15:25:59 +08:00
# split the dataset in training and test set:
docs_train, docs_test, y_train, y_test = train_test_split(
2014-01-10 21:56:10 +08:00
dataset.data, dataset.target, test_size=0.25, random_state=None)
2011-03-10 15:25:59 +08:00
2014-01-10 21:56:10 +08:00
# TASK: Build a vectorizer / classifier pipeline that filters out tokens
# that are too rare or too frequent
2011-03-10 15:25:59 +08:00
# TASK: Build a grid search to find out whether unigrams or bigrams are
# more useful.
# Fit the pipeline on the training set using grid search for the parameters
2014-01-10 21:56:10 +08:00
# TASK: print the cross-validated scores for the each parameters set
# explored by the grid search
# TASK: Predict the outcome on the testing set and store it in a variable
# named y_predicted
# Print the classification report
2014-01-10 21:56:10 +08:00
print(metrics.classification_report(y_test, y_predicted,
target_names=dataset.target_names))
2011-03-10 15:25:59 +08:00
2014-01-10 21:56:10 +08:00
# Print and plot the confusion matrix
cm = metrics.confusion_matrix(y_test, y_predicted)
2014-01-10 21:56:10 +08:00
print(cm)
2011-03-10 15:25:59 +08:00
2014-01-10 21:56:10 +08:00
# import matplotlib.pyplot as plt
# plt.matshow(cm)
# plt.show()