{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Who's Tweeting? Trump or Trudeau?\n", "> Tweets are notoriously difficult, as they are shorter than most texts and usually have hard-to-parse content like hashtags, mentions, links and emoji. Despite the difficulties, tweets are fun content, so in this notebook we'll take a look at classifying two prominent North American politicians. Can we determine if it is Donald Trump or Justin Trudeau based on just a tweet? This is the Result of Project \"Who's Tweeting? Trump or Trudeau?\", via datacamp.\n", "\n", "- toc: true \n", "- badges: true\n", "- comments: true\n", "- author: Chanseok Kang\n", "- categories: [Python, Datacamp, Data_Science]\n", "- image: images/President_Donald_Trump_and_Prime_Minister_Justin_Trudeau.jpg" ] }, { "cell_type": "markdown", "metadata": { "dc": { "key": "4" }, "deletable": false, "editable": false, "run_control": { "frozen": true }, "tags": [ "context" ] }, "source": [ "## 1. Tweet classification: Trump vs. Trudeau\n", "

So you think you can classify text? How about tweets? In this notebook, we'll take a dive into the world of social media text classification by investigating how to properly classify tweets from two prominent North American politicians: Donald Trump and Justin Trudeau.

\n", "

\"Donald

\n", "

Photo Credit: Executive Office of the President of the United States

\n", "

Tweets pose specific problems to NLP, including the fact they are shorter texts. There are also plenty of platform-specific conventions to give you hassles: mentions, #hashtags, emoji, links and short-hand phrases (ikr?). Can we overcome those challenges and build a useful classifier for these two tweeters? Yes! Let's get started.

\n", "

To begin, we will import all the tools we need from scikit-learn. We will need to properly vectorize our data (CountVectorizer and TfidfVectorizer). And we will also want to import some models, including MultinomialNB from the naive_bayes module, LinearSVC from the svm module and PassiveAggressiveClassifier from the linear_model module. Finally, we'll need sklearn.metrics and train_test_split and GridSearchCV from the model_selection module to evaluate and optimize our model.

" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "dc": { "key": "4" }, "tags": [ "sample_code" ] }, "outputs": [], "source": [ "# Set seed for reproducibility\n", "import random; random.seed(53)\n", "\n", "# Import all we need from sklearn\n", "from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer\n", "from sklearn.model_selection import train_test_split\n", "from sklearn.naive_bayes import MultinomialNB\n", "from sklearn.svm import LinearSVC\n", "from sklearn import metrics" ] }, { "cell_type": "markdown", "metadata": { "dc": { "key": "11" }, "deletable": false, "editable": false, "run_control": { "frozen": true }, "tags": [ "context" ] }, "source": [ "## 2. Transforming our collected data\n", "

To begin, let's start with a corpus of tweets which were collected in November 2017. They are available in CSV format. We'll use a Pandas DataFrame to help import the data and pass it to scikit-learn for further processing.

\n", "

Since the data has been collected via the Twitter API and not split into test and training sets, we'll need to do this. Let's use train_test_split() with random_state=53 and a test size of 0.33, just as we did in the DataCamp course. This will ensure we have enough test data and we'll get the same results no matter where or when we run this code.

" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "dc": { "key": "11" }, "tags": [ "sample_code" ] }, "outputs": [], "source": [ "import pandas as pd\n", "\n", "# Load data\n", "tweet_df = pd.read_csv('./dataset/tweets_trump_trudeau.csv')\n", "\n", "# Create target\n", "y = tweet_df['author']\n", "\n", "# Split training and testing data\n", "X_train, X_test, y_train, y_test = train_test_split(tweet_df['status'], y, test_size=0.33, random_state=53)" ] }, { "cell_type": "markdown", "metadata": { "dc": { "key": "18" }, "deletable": false, "editable": false, "run_control": { "frozen": true }, "tags": [ "context" ] }, "source": [ "## 3. Vectorize the tweets\n", "

We have the training and testing data all set up, but we need to create vectorized representations of the tweets in order to apply machine learning.

\n", "

To do so, we will utilize the CountVectorizer and TfidfVectorizer classes which we will first need to fit to the data.

\n", "

Once this is complete, we can start modeling with the new vectorized tweets!

" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "dc": { "key": "18" }, "tags": [ "sample_code" ] }, "outputs": [], "source": [ "# Initialize count vectorizer\n", "count_vectorizer = CountVectorizer(stop_words='english', min_df=0.05, max_df=0.9)\n", "\n", "# Create count train and test variables\n", "count_train = count_vectorizer.fit_transform(X_train)\n", "count_test = count_vectorizer.transform(X_test)\n", "\n", "# Initialize tfidf vectorizer\n", "tfidf_vectorizer = TfidfVectorizer(stop_words='english', min_df=0.05, max_df=0.9)\n", "\n", "# Create tfidf train and test variables\n", "tfidf_train = tfidf_vectorizer.fit_transform(X_train)\n", "tfidf_test = tfidf_vectorizer.transform(X_test)" ] }, { "cell_type": "markdown", "metadata": { "dc": { "key": "25" }, "deletable": false, "editable": false, "run_control": { "frozen": true }, "tags": [ "context" ] }, "source": [ "## 4. Training a multinomial naive Bayes model\n", "

Now that we have the data in vectorized form, we can train the first model. Investigate using the Multinomial Naive Bayes model with both the CountVectorizer and TfidfVectorizer data. Which do will perform better? How come?

\n", "

To assess the accuracies, we will print the test sets accuracy scores for both models.

" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "dc": { "key": "25" }, "tags": [ "sample_code" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "NaiveBayes Tfidf Score: 0.803030303030303\n", "NaiveBayes Count Score: 0.7954545454545454\n" ] } ], "source": [ "# Create a MulitnomialNB model\n", "tfidf_nb = MultinomialNB()\n", "\n", "# ... Train your model here ...\n", "tfidf_nb.fit(tfidf_train, y_train)\n", "\n", "# Run predict on your TF-IDF test data to get your predictions\n", "tfidf_nb_pred = tfidf_nb.predict(tfidf_test)\n", "\n", "# Calculate the accuracy of your predictions\n", "tfidf_nb_score = metrics.accuracy_score(y_test, tfidf_nb_pred)\n", "\n", "# Create a MulitnomialNB model\n", "count_nb = MultinomialNB()\n", "# ... Train your model here ...\n", "count_nb.fit(count_train, y_train)\n", "\n", "# Run predict on your count test data to get your predictions\n", "count_nb_pred = count_nb.predict(count_test)\n", "\n", "# Calculate the accuracy of your predictions\n", "count_nb_score = metrics.accuracy_score(y_test, count_nb_pred)\n", "\n", "print('NaiveBayes Tfidf Score: ', tfidf_nb_score)\n", "print('NaiveBayes Count Score: ', count_nb_score)" ] }, { "cell_type": "markdown", "metadata": { "dc": { "key": "32" }, "deletable": false, "editable": false, "run_control": { "frozen": true }, "tags": [ "context" ] }, "source": [ "## 5. Evaluating our model using a confusion matrix\n", "

We see that the TF-IDF model performs better than the count-based approach. Based on what we know from the NLP fundamentals course, why might that be? We know that TF-IDF allows unique tokens to have a greater weight - perhaps tweeters are using specific important words that identify them! Let's continue the investigation.

\n", "

For classification tasks, an accuracy score doesn't tell the whole picture. A better evaluation can be made if we look at the confusion matrix, which shows the number correct and incorrect classifications based on each class. We can use the metrics, True Positives, False Positives, False Negatives, and True Negatives, to determine how well the model performed on a given class. How many times was Trump misclassified as Trudeau?

" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "dc": { "key": "32" }, "tags": [ "sample_code" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Confusion matrix, without normalization\n", "Confusion matrix, without normalization\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "%matplotlib inline\n", "\n", "from utils.helper_functions import plot_confusion_matrix\n", "\n", "# Calculate the confusion matrices for the tfidf_nb model and count_nb models\n", "tfidf_nb_cm = metrics.confusion_matrix(y_test, tfidf_nb_pred)\n", "count_nb_cm = metrics.confusion_matrix(y_test, count_nb_pred)\n", "\n", "# Plot the tfidf_nb_cm confusion matrix\n", "plot_confusion_matrix(tfidf_nb_cm, classes=['Donald J. Trump', 'Justin Trudeau'], title=\"TF-IDF NB Confusion Matrix\")\n", "\n", "# Plot the count_nb_cm confusion matrix without overwriting the first plot \n", "plot_confusion_matrix(count_nb_cm, classes=['Donald J. Trump', 'Justin Trudeau'], title=\"CountVectorizer NB Confusion Matrix\", figure=1)" ] }, { "cell_type": "markdown", "metadata": { "dc": { "key": "39" }, "deletable": false, "editable": false, "run_control": { "frozen": true }, "tags": [ "context" ] }, "source": [ "## 6. Trying out another classifier: Linear SVC\n", "

So the Bayesian model only has one prediction difference between the TF-IDF and count vectorizers -- fairly impressive! Interestingly, there is some confusion when the predicted label is Trump but the actual tweeter is Trudeau. If we were going to use this model, we would want to investigate what tokens are causing the confusion in order to improve the model.

\n", "

Now that we've seen what the Bayesian model can do, how about trying a different approach? LinearSVC is another popular choice for text classification. Let's see if using it with the TF-IDF vectors improves the accuracy of the classifier!

" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "dc": { "key": "39" }, "tags": [ "sample_code" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "LinearSVC Score: 0.841\n", "Confusion matrix, without normalization\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Create a LinearSVM model\n", "tfidf_svc = LinearSVC()\n", "\n", "# ... Train your model here ...\n", "tfidf_svc.fit(tfidf_train, y_train)\n", "\n", "# Run predict on your tfidf test data to get your predictions\n", "tfidf_svc_pred = tfidf_svc.predict(tfidf_test)\n", "\n", "# Calculate your accuracy using the metrics module\n", "tfidf_svc_score = metrics.accuracy_score(y_test, tfidf_svc_pred)\n", "\n", "print(\"LinearSVC Score: %0.3f\" % tfidf_svc_score)\n", "\n", "# Calculate the confusion matrices for the tfidf_svc model\n", "svc_cm = metrics.confusion_matrix(y_test, tfidf_svc_pred)\n", "\n", "# Plot the confusion matrix using the plot_confusion_matrix function\n", "plot_confusion_matrix(svc_cm, classes=['Donald J. Trump', 'Justin Trudeau'], title=\"TF-IDF LinearSVC Confusion Matrix\")" ] }, { "cell_type": "markdown", "metadata": { "dc": { "key": "46" }, "deletable": false, "editable": false, "run_control": { "frozen": true }, "tags": [ "context" ] }, "source": [ "## 7. Introspecting our top model\n", "

Wow, the LinearSVC model is even better than the Multinomial Bayesian one. Nice work! Via the confusion matrix we can see that, although there is still some confusion where Trudeau's tweets are classified as Trump's, the False Positive rate is better than the previous model. So, we have a performant model, right?

\n", "

We might be able to continue tweaking and improving all of the previous models by learning more about parameter optimization or applying some better preprocessing of the tweets.

\n", "

Now let's see what the model has learned. Using the LinearSVC Classifier with two classes (Trump and Trudeau) we can sort the features (tokens), by their weight and see the most important tokens for both Trump and Trudeau. What are the most Trump-like or Trudeau-like words? Did the model learn something useful to distinguish between these two men?

" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "dc": { "key": "46" }, "tags": [ "sample_code" ] }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2oAAAFTCAYAAABIwf9HAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nO3debzuc7n/8dfFlpRC2WbSoMLppOyoTqYMmUrnRAmxE/oVR6VJk0SDkCRFRKODclRmSioaHFsoFSWVqSREjqFw/f64vou7ddbea23W3t/Pvfbr+Xj0sNd93+11rbXv4fv+DNcnMhNJkiRJUjsW6rsASZIkSdI/M6hJkiRJUmMMapIkSZLUGIOaJEmSJDXGoCZJkiRJjTGoSZIkSVJjpvX1jZdeeulcddVV+/r2kiRJktSrSy+99C+ZOX2s+3oLaquuuiqzZs3q69tLkiRJUq8i4g+zu8+lj5IkSZLUGIOaJEmSJDXGoCZJkiRJjTGoSZIkSVJjDGqSJEmS1BiDmiRJkiQ1xqAmSZIkSY0xqEmSJElSYwxqkiRJktQYg5okSZIkNWZa3wVIkiRJmhoi+q5gbJl9VzD3nFGTJEmSpMYY1CRJkiSpMQY1SZIkSWqMQU2SJEmSGmNQkyRJkqTGGNQkSZIkqTEGNUmSJElqjEFNkiRJkhpjUJMkSZKkxhjUJEmSJKkxBjVJkiRJaoxBTZIkSZIaY1CTJEmSpMYY1CRJkiSpMeMGtYg4PiL+HBFXzub+DSPijoi4vPvffpNfpiRJkiQtOKZN4DFfBI4EvjyHx1yYmVtPSkWSJEmStIAbd0YtM38A3DYfapEkSZIkMXl71F4UEVdExNkRseYk/Z2SJEmStECayNLH8fwUeEpm3hURWwLfBFYb64ERsQewB8Aqq6wyCd9akiRJKhF9VzB7meM/Ztjr1+R61DNqmXlnZt7V/fksYJGIWHo2jz0mM2dk5ozp06c/2m8tSZIkSVPSow5qEbFcROX/iFin+ztvfbR/ryRJkiQtqMZd+hgRJwIbAktHxA3AB4FFADLzaGBb4E0RcT9wD7B9ppOjkiRJkvRIjRvUMvO149x/JNW+X5IkSZI0CSajmYgkSZKmAJtZSO2YrPb8kiRJkqRJYlCTJEmSpMYY1CRJkiSpMQY1SZIkSWqMQU2SJEmSGmPXR0mSpEli10RJk8UZNUmSJElqjEFNkiRJkhpjUJMkSZKkxhjUJEmSJKkxBjVJkiRJaoxBTZIkSZIaY1CTJEmSpMYY1CRJkiSpMQY1SZIkSWqMQU2SJEmSGmNQkyRJkqTGTOu7AEmSpBERfVcwtsy+K5C0oHFGTZIkSZIaY1CTJEmSpMYY1CRJkiSpMQY1SZIkSWqMQU2SJEmSGmNQkyRJkqTGGNQkSZIkqTEGNUmSJElqjEFNkiRJkhpjUJMkSZKkxhjUJEmSJKkxBjVJkiRJaoxBTZIkSZIaY1CTJEmSpMZM67sASZI0eSL6rmBsmX1XIEnDxRk1SZIkSWqMQU2SJEmSGmNQkyRJkqTGGNQkSZIkqTEGNUmSJElqjEFNkiRJkhpjUJMkSZKkxhjUJEmSJKkxBjVJkiRJaoxBTZIkSZIaY1CTJEmSpMYY1CRJkiSpMQY1SZIkSWqMQU2SJEmSGmNQkyRJkqTGGNQkSZIkqTEGNUmSJElqjEFNkiRJkhozblCLiOMj4s8RceVs7o+IOCIiromIn0XE8ye/TEmSJElacExkRu2LwOZzuH8LYLXuf3sARz36siRJkiRpwTVuUMvMHwC3zeEh2wBfzvITYMmIWH6yCpQkSZKkBc1k7FFbEbh+4Osbutv+j4jYIyJmRcSsW265ZRK+tSRJkiRNPZMR1GKM23KsB2bmMZk5IzNnTJ8+fRK+tSRJkiRNPZMR1G4AVh74eiXgpkn4eyVJkiRpgTQZQe00YOeu++MLgTsy84+T8PdKkiRJ0gJp2ngPiIgTgQ2BpSPiBuCDwCIAmXk0cBawJXANcDfw+nlVrCRJkiQtCMYNapn52nHuT2DPSatIkiRJkhZwk7H0UZIkSZI0iQxqkiRJktQYg5okSZIkNcagJkmSJEmNMahJkiRJUmMMapIkSZLUGIOaJEmSJDXGoCZJkiRJjTGoSZIkSVJjDGqSJEmS1BiDmiRJkiQ1xqAmSZIkSY0xqEmSJElSYwxqkiRJktQYg5okSZIkNWZa3wVIktSSiL4rGFtm3xVIkuYng5okadK0GnLAoCNJGi4ufZQkSZKkxhjUJEmSJKkxBjVJkiRJaoxBTZIkSZIaY1CTJEmSpMbY9VGSGmLXREmSBM6oSZIkSVJzDGqSJEmS1BiDmiRJkiQ1xqAmSZIkSY0xqEmSJElSYwxqkiRJktQYg5okSZIkNcagJkmSJEmNMahJkiRJUmMMapIkSZLUGIOaJEmSJDXGoCZJkiRJjTGoSZIkSVJjDGqSJEmS1BiDmiRJkiQ1xqAmSZIkSY0xqEmSJElSYwxqkiRJktSYaX0XIEmTKaLvCmYvs+8KJEnSsHBGTZIkSZIa44yapH/S6oyUs1GSJGlB4oyaJEmSJDXGoCZJkiRJjTGoSZIkSVJjDGqSJEmS1BiDmiRJkiQ1xqAmSZIkSY0xqEmSJElSYyYU1CJi84i4OiKuiYh9x7h/ZkTcEhGXd//bbfJLlSRJkqQFw7gHXkfEwsBngE2BG4BLIuK0zPzlqIeenJl7zYMaJUmSJGmBMpEZtXWAazLz2sz8O3ASsM28LUuSJEmSFlwTCWorAtcPfH1Dd9tor4qIn0XEKRGx8qRUJ0mSJEkLoIkEtRjjthz19enAqpn5r8B3gC+N+RdF7BERsyJi1i233DJ3lUqSJEnSAmIiQe0GYHCGbCXgpsEHZOatmXlf9+WxwNpj/UWZeUxmzsjMGdOnT38k9UqSJEnSlDduMxHgEmC1iHgqcCOwPbDD4AMiYvnM/GP35SuAX01qldIQibHmoBuQo+fBJUmS1Kxxg1pm3h8RewHnAgsDx2fmLyLiAGBWZp4G7B0RrwDuB24DZs7DmiVJkiRpSovsaZh9xowZOWvWrF6+tzQvDfuMmvXPOxP5Gax/3hn255D192vY64cF4zVs/fPOsL8GWl1ZFBGXZuaMse6b0IHXkiRJkqT5x6AmSZIkSY0xqEmSJElSYwxqkiRJktQYg5okSZIkNcagJkmSJEmNMahJkiRJUmMMapIkSZLUGIOaJEmSJDXGoCZJkiRJjTGoSZIkSVJjDGqSJEmS1BiDmiRJkiQ1xqAmSZIkSY0xqEmSJElSYwxqkiRJktQYg5okSZIkNcagJkmSJEmNMahJkiRJUmMMapIkSZLUGIOaJEmSJDXGoCZJkiRJjTGoSZIkSVJjDGqSJEmS1BiDmiRJkiQ1xqAmSZIkSY0xqEmSJElSYwxqkiRJktQYg5okSZIkNcagJkmSJEmNMahJkiRJUmMMapIkSZLUGIOaJEmSJDXGoCZJkiRJjTGoSZIkSVJjDGqSJEmS1BiDmiRJkiQ1xqAmSZIkSY0xqEmSJElSYwxqkiRJktQYg5okSZIkNcagJkmSJEmNMahJkiRJUmMMapIkSZLUGIOaJEmSJDXGoCZJkiRJjTGoSZIkSVJjpvVdgDRaRN8VjC2z7wokSZK0oHBGTZIkSZIaY1CTJEmSpMYY1CRJkiSpMRMKahGxeURcHRHXRMS+Y9y/aESc3N1/cUSsOtmFSpIkSdKCYtygFhELA58BtgDWAF4bEWuMetgbgNsz8xnAJ4GPT3ahkiRJkrSgmMiM2jrANZl5bWb+HTgJ2GbUY7YBvtT9+RRg44hWe/dJkiRJUtsmEtRWBK4f+PqG7rYxH5OZ9wN3AE+ejAIlSZIkaUEzkXPUxpoZG32i1EQeQ0TsAewBsMoqq0zgW/eg5YnAiRzkNez1T/xhzbL+fll/v4a9fhj+n8H6+2X9/bL+/k2Fn6EVE5lRuwFYeeDrlYCbZveYiJgGLAHcNvovysxjMnNGZs6YPn36I6tYkiRJkqa4iQS1S4DVIuKpEfEYYHvgtFGPOQ3YpfvztsB3M83TkiRJkvRIjLv0MTPvj4i9gHOBhYHjM/MXEXEAMCszTwOOA74SEddQM2nbz8uiJUmSJGkqm8geNTLzLOCsUbftN/Dne4HtJrc0SZIkSVowTejAa0mSJEnS/GNQkyRJkqTGGNQkSZIkqTEGNUmSJElqjEFNkiRJkhpjUJMkSZKkxhjUJEmSJKkxBjVJkiRJaoxBTZIkSZIaY1CTJEmSpMYY1CRJkiSpMQY1SZIkSWqMQU2SJEmSGmNQkyRJkqTGGNQkSZIkqTEGNUmSJElqjEFNkiRJkhpjUJMkSZKkxhjUJEmSJKkxBjVJkiRJaoxBTZIkSZIaY1CTJEmSpMYY1CRJkiSpMQY1SZIkSWrMtL4L0CTL7LsCSZIkSY+SM2qSJEmS1BiDmiRJkiQ1xqAmSZIkSY0xqEmSJElSYwxqkiRJktQYg5okSZIkNcagJkmSJEmNMahJkiRJUmMMapIkSZLUGIOaJEmSJDXGoCZJkiRJjTGoSZIkSVJjDGqSJEmS1BiDmiRJkiQ1xqAmSZIkSY0xqEmSJElSYwxqkiRJktSYaX0X0JzMviuQJEmStIBzRk2SJEmSGmNQkyRJkqTGGNQkSZIkqTEGNUmSJElqjEFNkiRJkhpjUJMkSZKkxhjUJEmSJKkxBjVJkiRJaoxBTZIkSZIaY1CTJEmSpMYY1CRJkiSpMQY1SZIkSWpMZGY/3zjiFuAPvXzz+Wtp4C99F/EoWH+/rL9f1t+/Yf8ZrL9f1t+vYa8fhv9nsP72PSUzp491R29BbUEREbMyc0bfdTxS1t8v6++X9fdv2H8G6++X9fdr2OuH4f8ZrH+4ufRRkiRJkhpjUJMkSZKkxhjU5r1j+i7gUbL+fll/v6y/f8P+M1h/v6y/X8NePwz/z2D9Q8w9apIkSZLUGGfUJEmSJKkxBjVJkiRJaoxBTepZRETfNTwaw16/NLem0nN+Kv0skjTVGNQegYhYuPvvYhGxXkQM1e9xpN5h/oCOiGndf2eM/HkYRcQTc8g2io48b0aeR5mZw/xcUr8iYrWIWKTvOubGyGs2It4SETt1fx6a18DAZ9hCAz/LUH2ODYqIF/Rdw4IsIv6t7xoeqYhYpu8aJsswv4Y1e/6jPjLrRcS2wAnUaeIPjnzwDYmRYHBsRKzYayWPQEQ8E5gREf8PODIz7++7prkxcJG0PnBURCw66v5mL/hGLuwi4vHAWyPiCxGx+sDFXrO1jxYRC3cDLS+OiOdFxOP6rmmiBsLyChGxbESs1HdNc2PgNfBy4J3AyMDL0Dx/OtcCL4iIRYdpwCIzH+j+eE5EvL277UEYvn+DiNgF2KPvOh6JiFguIraJiMf2XcvciohlImLjiHgq8KHRn2Mti4jHRsTi3ZfHDmtYG/gcmAYPv4aHTUQ8ceDP5pJR/IXMpW7k9x7gDcC6wN/g4Q++iFi6v+rGFxGLD8zgLMJwPgeeAOwOfBg4u7vgHrnQaz4wD1wkHQqclJn3RcRWEbFnd3+zM2wDHwSfBdYEbgfOiIhPRcSTW659DIcA+3X/3RHYNSIW67ek8UXEwl0oeC7waap18ce7C6ehuMgeeA28BzguM++JiO2AIyLiZT2WNiEDv+eLqPejUyJimSF7/gN8Cnh5RPwkIjaGtt9/Ruve718M/NfAbUPxGugcCfxrZt4bEUtGxMpDFNoeCxwE/Ar4aWbeN3LHEFxsrwFcFhHXAr/KzD9HxEJDUPdDBj4HngMcHBGXRcTeg6GnVQMDdZtHxIeBQyJir4hYYlgHjOaloXlStiIz/wHMAi4DzgM2jIhDIuK53SzDO1sdmY+IpwOfjohXdjf9HHjJwP1P62armpaZlwJfBn4IrAK8F3hRd/cBEbFWX7VNVEQ8H7ghM0+PiHdQwf8tEXFoNLqUM/55yezVwO6ZuQ+wIbA0cFVE/Ed/FU5cRKwM/EtmbgpsAnwX2ArYttfCJmAg5BwGfAL4H2DhzPwzsNLASHHTuuVS9wL/iIj3ALsAN/Pwa7k5AxcPK3WzaLdn5q7A+cBreyxtrnQXpZGZZ2bmhsDnqdn9kyNi+Z7LmxubAM8C3hMR68LwBM2IeDG1IufAbtDlm9Tg3Xr9Vja+bmXFddRn7/XAzIg4PSJW6R6yz0jwb1Fm/hTYnhp0nxkRr8vMB7vVUVt04adpowZ8zwO+D3wI+H5E7BiNLifv3ndGat8PuARYDtgO+FpE7ADD8zqeHwxqc2HkQzozH8jM92bm66mRvL8BbwMurbvz7kZHAxYBrgQ2i4gDqBGxN0bEOyLiYmpkvtkPiYGgsFBmfh94NfBB4PHAbhHxaWCHzLy8xzIn6k/AChFxFbAC8HpgM2C1VpdyDsym7QM8DzguIp6emddn5o7UherPeytw7vw7sHxEPCsz78nMs4DDga27AZfmDCxzWai7ILoWuAbYAti/e9h+wFCE5cz8IXAWcDzwRCokXwQ0O6M2cPGwN3B5N0h3CjADeHdE7N5fdePrBogAtgZePBLqM/PzwMHA6sBzeypvrkTEYzPzXGBf6nPt1RGx6zAMNnbuBH4QEYdT76nHUYF/ZqsX2SO6QLMQFZRflpnLUJ9pV0XEscBMakC7ZWtRAxQnAx+LiF9ExBZU8Gl2CeHgtWW3+uABaqDxxcDTgVOBr9DooOPANok3UIOM3wWeAuxEDdQdEBFb91dhezzwei51yxIOoC4s/gJ8IjNvj4h/pWZ3zhzZq9DiiEA3Lf484N+A9akP5hOAozLz+j5rG8/I7zQi9gOWpd6gzsnMs6I2ky8NXJeZv4iIaa0Fni5gPjj454hYOzMvjYjHUCOq/52Zxw0+tgUD9W5JLXf5MrAyFf4vBr6RmXf2WeNEda/hf6eWO94DnEl9WO8GrJ2ZM1t8/UbEKt0o9sjX+1AB/6LMfFPUPrUzgA0y846+6pyTgdfwSsA/qPfM6zLz5u7+HwKfzMxT+qxzLKOfExHxFOp9aHFqVjmBdYADM/NHvRQ5BxHxUuB11Ot1S2Ax4Gzg9Mz8TVRTlCdl5hE9ljlhEfER6gLvvdQF3quo2dj7gQMy8/Yey5ujiJiembdExN7UbMKJmfnziPgkcEdm7t9vhePrLqa/BXw4Mz/Y3fYsKiD8IDMv7LO+sQx8ju1ADWj9iRoo3RZ4F3VNdHpmHtVjmXM0+DnQDbSsSAW0N2bmNlF7Bt8N7JOZd/dY6v/RPT/uyswbu2vmv1K/+2Uyc9+I2BFYITMP6bXQxhjUJmjgBf4J6oPg18CB1NKdwzLzyIHHtniR91BNIyEmIjanlj4uQ41sfAF4sLXa4Z9+/08HTqN+90tQI9l3UQHnoj5rnJOB+lejgs59VP3HZuY3u3+LvTKz6ZGkiHgnMCszL+jeaGfw8F7Ndw8saWhW1Nr+B6L2o+1EXbQ+nxoB3jUz72gtKAN0szVHAntk5pe6JWqHAjdRofkJwPmZeViPZc7WwO99LeADwMLU82Yf6jW8NrB1Zu7bY5ljGgiYiwDbUK/f3wPXZOY9A4/bFXgh8KbWXgsRsQI1a7869bn1ADUKfwfwW2oWZIvMvKKvGieqm1VYnVq+tj412HI4sDywRmae02N5cxS1P+dS4EfAOzPzf7vbt6JWiLywtfeesXSDizOp1US/BvbPzMt6LWqCIuIiYHPqvedJmfnWbvBoOWq/XbO//9GfA91tK1NL4S+lVlickJnH9Ffl2CJif2pw7nTgtO7zYAPgrcDHgWOp10Szr98+GNTmQvdCPjUz14mIM6kXxnLA0dSMws69FjgbAxdIGwA7U6OQ52Xmwd0M247A/Zl5bK+FTkBEvA/4fWaeEBFPAlajwua6wN6Z+adeCxxHRHyWmon9GlX73sDXM/OzUY1e7hr59+q10DFE7W38OvClzNytu+1x1CzCnVnr/psWEbtRs8lrUjMfp3ev612A6dQM2/GZ+Zsey5ytiHgy8CVqJuf1wG+Ajanar+mWEzYtIs6ngtpLqX2C23ch4u/U8+jvvRY4hoGBlsOpAZblqRm0HwNnZeas7nG7A5tl5nb9Vft/DQzObQG8mZpFuAC4kVod8kvgN0OybPwhUcuU16Q6hz6ZGjQ9o7uvuQHTEVFLlz9IzcQenZmHdLctM/JcGhYRsRSwJ7XHaBbVgbPJAV94aFXRvtSy8Tdm5rrd7ecDXx4JPy0b+BxYHtgzM38SEa+glnMumbV3vClRe+9Xoz6vXgL8jlqBdlFEHETNDF6TmR/qscwmGdTmQkQsCzyVGgU+KjPX78LCO4DPZeYfWhyJHxER3wO+QY267Eu9MA7MzFNbDQcjuhHUlakmFrcAG49cTEcdMfCEzLyq8Q/nDamg/NaRZYIRsRnwGmAv4L5WnzsjuuVTH6LW8O+fmRf0XNKEdRd1v6AGJlam9uRcQ81k/rK7iN2QunD6XW+FTkA3K/XfwPeAt7W87HRgNmohYCUqpL2P2kuxW/e6/Tzwvcz8ap+1zklEPINaovaCiDiPWoWwBjWTeVxmnhQRS1LbMFpdevpT4DXdUsdNgV2BJam9gke2+t45KCJeBywxsoqlm6HaiBr0OjkzT+izvjnpao3sluVHNUA5ktov/rphC8qDImJNYJPM/FTftYwn6liQQ6g9gW+hVlW8KzNfMsf/Y2O6z4FTqMZqe2bmXT2XNK7uvX5x4HHU0tMrgc+3tkyzJTYTGUcXEADIzJsz8yfUJv6rozrcHQwslZl/6B7T1IV2PNyA40XAz4AjMvOibondh6kukLu0HNKgrnwy87rMXIwaSbosIo7o7rsxM68aeVyfdY5jTWqpyJEDt11NhYNFW3vuwD81sHhaRKyQmd/NzPWoJjqfi4jTYnjaSS9Cjbj/MDNPysxVqOYVV0bEmpl5NnBI6yENoLugewbwHeAv0R263KiVod4bs/ZW/Iq6QPp5F9JWopbQnt5jjWOKatwycmTDM6hjENan3mreDxxFLdu8iLrxrw2HtGWpC6NVADLz28DbqTPsftr4e+eg24DdI+KCiHhJ99l1L/DnkZA2+LndmPcC20fEk7tZzoupZfzNv+eMJzN/MQwhrXM2tQXhXioovIpqxDRUus+B1YBzgdsa/xwgIl4DPD0ztwf+k/p32AH4elQXVI3BGbUJioj/pJbXXUd1WNuD2otwF7BfdudwNHqxvRDVLGENarnmySMjL9Fg041BA0uO1qeahTyGWja4EvAZqqX6WtRFX3NP5oH6X0W10F2ZCpqrUiNhN1JLjk6OiEWyjn9owsCS2RdSMyCLU/We2s3CPg7YKRtcCz9aVLvlT1C//5OAb2a3F2dkyWmf9T0aUQfNPiEz/9J3LWMZvacihmhvXXfhszjw7cz8bXfbi4H3ZeZWUXs2l29xqdFYIuL11JLTU4ELgWcC78/MLXst7BHoZtbeA1xBfbZ9rJvVbO5zeGBWeXcqFNxEdXmcRTWxuD0H9rlr/ohqxvE44H+z2ys4rFr/HICH9mHukpmvHrhtX+oz4IMtX4v2yaA2BwMX2e8Ank2NWhwFLDt6BqrFD4dBUZvgd6a6fl1ChYVrMvPeXgubg4Hf/3JUR8QzqWVre2bm+d1jXpSZP+6zztnpLkh3opbbHQxsM3Cx9xrgo8CiwOaZeWVvhY4jIr5DXRBtSl1kXE91azo+M3/QZ20TFRFHUaPWt1DnLkH9u1yYmb9vecnsVDCMe+u6WZldqGBzA7W86CfUc/9LVCOOG4DtMvPm1j8D4KEGELtQjTg2Bv5MdS5ufvN+VMe4d1IzgPdTjQcuo1rE/y4zf9VjeRPSzc7eB+xO7em6jupUuWF2nU+lqarbz/hVasvBaZl5fkT8N3BKZp7Yb3XtMqiNo3tjPY9q5/0B4PrMPDTqDIj7Wt1TMRBylqKah/wduIracP126qL70GF4cURt4J8FXE7tDVyvW8azdtb5V81uHO+eJ5+iws1amXnfqPvfRs30vDkzj+6hxDnqZtPeQK3j/wmwAXW8w+eoNf3f6LG8CelG8bbLzJnd18+h9rQ8n/qAOKPH8hYow7S3bkRE7EGFy6dRZ02elpmXdO9BC2XmH4chpA3q9tItTl0DNH0sy4ioZg/nUgMsj6eCzucy8zu9FjYBEbEL1WXwcVS3zZEjBVagZtNu6rE8aZ4YuA5dmNpXelu313crqnvuosBN2VjzpdZM67uA1mXmPRHxZeow32dk5lu6u2ZS7USbNHDRcCQ1+rgyFdROyzqv4hRqZLhpUZ2Cfk29oA+nPuCglp6uRm2Cb25v2sAyxq9Q0/prUHuhvpKZB3QB7amZuXdEfIH68G5OVjepP1BNdH6XdWbgFVSXuDP7rW7CVgF2jojHZ+Z2mflz4OcRsR51ppTmk8y8vPug3p7aW7drq4NdAFHNot4IvJJarvxy4PCIOBc4KTN/De3tTR5PZv6VIXj/HxF1NtSDmXlw9/UTqNnZf4+IC2i7y+ASVMOxfahZ/Q2oga53Zub/9FmbNC8NvC8eCDwtquPmZ6i9aZ+jXsO39FTe0LCZyBgGGiis3q0pX4TaaPrHiFg+Ij5GjYI1ORI/UP+WwJMzcxdqVu0O4N0RcSRwS2Ze02OZsxURy0a1Uadbs3wBFYwfA/y2myV8NfCR7vFNPY+7ZabPieoyeCYVcPagujtuEHWGy7bU8qmRi6Zm9kjFww1olgTIzD9SSxXujohZ1JvsudlgG/XRojqCnkqF+qUi4s8RsSdAZl44DD/DVJPlRGoAo/Uldy8G/pKZ13fPl3dRDVy2oc6B03yQ1eDnMd1+FjLzb9RzZ01gkVZDWueFwBVZzVt+l5nHUWeBbtRvWdK8M3AdMdKO//XUa2Ff4ADqmJyb026P43Lp4xx0gebcrLOW1qKWsN1MHQ56XGZeEw23tY+IDwDfBl4ArJ6Zb46IY4CgWsQ3uXk2Ip5PNQy5Cjgo65yNTamlIy+hGlpcnJkfb3HJUbcf5x3U9P6D1B6Ee0cuJiJiDeDv3fOnqSWbA0sVVqJmMFcCvkiFs5FDiZfKzJP7q3Jios7mOpmqe3FqBnwpar/gJZn5ih7L0xDoZm6Oo7pUntvtZ3w5sFEOSQORYRcRm1NL9jeiOuReQVteTmgAAAvSSURBVA3ebUkd6XBwi58DI7rn0PnAZzPzi91tewHrZKNnr0qTpVu99VlqsPRfqK03lwB/BF7V6nVoSwxqowx0Z3ohteTlXGofy8i5J0/KzNsGH9tjuWMa+BmWos58eztwd2Z+umuqcPHIB0ZrBn+nUWcVbUTtaXkH1Zb5MdQI6i2jH9+CUfUfQ+2DOp3qGvejiHg2sF42frh4RBxPHR3wS2rZ7z+ohi7fzUbbj48WdV7L96nAfwJ1rMaD1J7A67LOkmr2Ak/9Glm+HBHbUHt676RWJvwLsHNmXuHzZ96KiGWo1/C3qdfvOtQy/j8AX8/Mb/VY3rgi4v9RDVvWA/6DaqLzLeqA6O1ziM9NkyYiIlajQtlnga9l5hkR8VGqidTx/VY3HAxqsxERH6dG735DtbT/besXqPFwO/Vp1LKie6kmIs+lRiAvBxbLzHV6LHOOBmZ03keFsu9RnSq3ojbyfyTb7lQ5cnH3SuA51BvUNtR+0LOpLpBnZOYBPZY5R12Y/AywdbdHM6guZTsDX+iW7jSta/TwaepA39OBN2Wd2fUzauCl2d+/+jPwHroe9bpdA/gC1bziLmoZ/J8y84LWBommom4v7z2ZeXS3FHsN6tylwzLz2u4xTf47RB3J8hHqM+w6alb/OdSxCGd3e2WlKWXUYPVDxz9FxM7UdcQV1CqjFzjINTEGtQEDIWEzqsvjVdRI2OLUzNo5wNWtP7ki4hBgfar+71IXqn+nlq1dl40f6NttOP0esOvIiGNEvII6d+zEbs9dcyJiembeEnU2y2XAD6gDZu8ClqOC5/mZeUr3+JYvMN4D/B44eGTDexd+7skh6NQHEHXO2+JUG++PUY1DvkEd73CjsyGanYi4hprFX5E66DqBAzPz9oHHNPn6nSq6/aU/pQ7j3mLg9v+i9nw128wLICI+CRydmVdHxAbUoe5PpAZQD/K5o6lo4Dr69cDLqI7XBwN3U82YngrM6vZsagIMap2B5YLLUnsSlqAuVH9KvbluSB2qvHdvRc5Bd3F9N7VU7SvUeWNbUodB30m1tz+r1fXA3Szgktkd1hgR+1MNWz418JhDqRmdX7R2kd3NOn2XarrxG+C2zPx8t7fxRdQeiycBH886c6mpi7yIeGJm3hkR/0aFypupc5ZWoJZAntbinrqJiIg3Us1blgAuyMx3D+PPoXlr4AJjI+q4jO2625cEjgauBD7a0vvOVNc1IjiAGuT6DHVEyGHAPt0MeZOv44jYmloq/v7MPKi7bQlqn/UfMvMnfdYnzQsD19HPpFYQ7U3Noi1HvX5PbfUatGUGtVG6fUW/zMzDI2IGdVbLusCJ1N6uywenc1sQ1V3njdTywP8Frs3M93T3PYP6GVYH3j6yt6s13YzZotRehL9R+0COoQLm96ifLVqdTYOHftdvAl5Bhfr/GLhvY+ockVP7qm92uguI11GNNraj9tDd0f08z6UauPw9M9/dY5mPWEQsSnWHWxL4fre0rckLPPUjIhbrlvkuQh0Bsj41YHduZt4a1cxoZmbu2GuhC6CoM5h2Ag6i9soenpmH9VvVnEUdLD6TulD9NbB/Zv6s16Kk+SQi3gksPDBIsQX1vhrAVq1vI2qNQW1A9yF9MNW6/qMDt3+VChG/zcx9+6pvdiJi0cy8L6rt+E7AM6kR4E/kw41Pnjaypr9F0TVpiYj9qBmo91MHm74NmA7cDhybmX9qbTZttIhYn1pqF9Sh4qd2t4+MNjUVErogsxrVxn6kI+iZA/dvC1yWmb/tqcRJ1drvX/2LiB2AZ1PvnRdQjSu2pWbIHwtsAnwyM7/Z+vvPVBXVHGsmsAu1jHmvrLMqmxV1Dt+bqQGwWdT5n82e+SY9WhHxdGpQZSVgf6oB2T+6+zZ1yePcM6iNEhFrU8n/dOqN9SrgIuoN9gDqIvb3vRU4Srcfai9q3ft2wH9S5+PtRk03n5GZn++vwrkT1RZ+C2BraiTy8My8ceD+objI7kaBX0s9b6DOULu51Qu8bpDifcAN1L7Mhah29isB62bmh3osT5qnos48PIFa7vuBbkXFRtR+ivWA72TmCX3WqBIRawIbZ+YRfdcyUV3Nmwwu5Zemou5aYl1qFdRjqcGuH2XmZb0WNsQMaqN0e402BV5KHc4XVBOL84CTM3OtHssbU7dE7RyqM9mrM/PCiFiMGgU+mBp5PL/PGmdnYJbpsVTIPIx6cT+NauiyEbW37pAey3zEuhHVN1CBs9nR34iYTs0a30s1UNiECszPBF6TmT/usTxpnovq9LguD+8pfS+1J+pL1ADdrcMyUCRJ80s83C13Geo6Iql97ltRy8gXB47IzCt7LHNoGdRmoxthXZwKPzcBXweOysyzei1sNiLizcDCwPZUS/g9qYvsD2TmZn3WNicDG/gPpZqJ7NbNEi5CzeqsTTUVuWTYL5JaWzI18Oa6DdV6/6lU45DdqfPGFgVWycwreixTmq+6xkY7AO+i3oNOy8x9h/39R5Im28A13JLAmVRTtQ2oTumfpq7ltsjMr/ZY5lAzqE1At4xtk8w8t+9axhMRS1MhbSbVlONdmXlOr0WNIyJWpjbtr9EtPf0AdbDpu3xxz3sRcSG1bPZNwNKZuWfUIZXXZuYD/VYn9aNbXTEDuLS7EDGoSdIYIuJ46oy0G6ijTa4AngV8NYfg7NWWLdR3AcMgMx8YhpAGkJl/6fYTPR/YrfWQ1rkfuDIi9qX2SR1HBYfXdKM0mkciYg3gZ9RetK2o89MAPkU1U5AWSFkuGZkFN6RJ0sO6wayRLR5/7fZg7k4d9P4R6truWf1VODUY1KaozLw9u4OKWzTyAgfIzD8CX6TO7PpwZp5OjWTflpl/7afCqSsi1ulmXsnMXwK/BT5P7cG8MyLWoWbWTu6zTkmS1KaBwavXAf/V7XW/FfheZl4P3EH1HdCjMK3vArRgGnmBR8TO1BlXDx0m3m3qfwPV0KK5vV1TwIuAP0XEBsCFVFv+fwOeFhEnUcchHNRjfZIkqVEDe9xfQzXg+yzwAHA38PWIuBO4NzP/1GedU4F71DTfDWw+3QdYC/gRsB/V6TGpAYTnZeZFhrR5o5tRO5v6fR8InEG1Jl+YOkbg8h7LkyRJjYuIH1NdcS8euO0A6rrugsy8r7fipghn1DTfdSHt8dQ5Yy+ljhA4NDPvjYjXAjdm5g9GHttjqVPZy6i2478C3k0dInugHR4lSdJ4IuJxwG+oVTiDnkwd7G5ImwTuUVNf7gFOBF4BPCUzR9Yx7wks1ltVC47rqU2/m1Ih7cfAORGxU69VSZKk5mXm3dQZvjtGxDYRsXxEbAWsnZnn9VzelGFQ03wTEQt1/12NOkz5cVQTkeu6298P3DosHTaHWTdjuRl1uPjzMvMT1N61U3otTJIkDYuvAedTZ6ddAOwIvL/XiqYY96hpvouIzwDnZObpXeOQjwP/AH4JfCozrxrZqNproVNQ10Bkfep3fQ51dtrLgIMz89t91iZJkoZPRDyBGny/NzPv6LueqcQ9apqvImIT6qT62wAy80LgxRGxYmbe2D0mDGmTrzsSYSXqIPR3ANsAN1NNRO4HDGqSJGmuZObfqGsLTTKDmua3ZYBXAgtHxFWZeWt3+00jD/Bg2Xmj+72e0H15eEQ8D7gTuJzaECxJkqRGuPRR89zAeRubUYMDm1AHJN4AHAUcn5n391mjJEmS1BKDmuapbhljRsSywA+A84CrgWdR56Y9A7gyM1/VY5mSJElSUwxqmqcGgtrbgHsy8+iIeBKwOrAd8BHqvI1bPdxakiRJKrbn1zzVhbQVgX2p5hVk5m2Z+UNgOWDXkX1qhjRJkiSpGNQ0z3XdHHcAnhgRl0TEzIh4NvBE4FvwUEdCSZIkSbj0UfNRRCwM7AQcRJ2bdnhmHtZvVZIkSVJ7DGqa7yJiKWAmsAtwMbBXZv6j16IkSZKkhhjU1JuIWBPYODOP6LsWSZIkqSUGNUmSJElqjM1EJEmSJKkxBjVJkiRJaoxBTZIkSZIaY1CTJEmSpMYY1CRJkiSpMQY1SZIkSWrM/wfmE1XYTKYLvQAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "[(-0.39598412367712016, 'great'),\n", " (-0.24645568180101796, 'thank'),\n", " (0.06256583486571292, 'president'),\n", " (0.48212216268009384, 'https'),\n", " (0.5960509183169173, 'vietnam'),\n", " (0.6155523003406573, 'amp'),\n", " (0.7725810449856387, 'le'),\n", " (0.8213795987000658, 'les'),\n", " (0.8286485983273343, 'today'),\n", " (1.1869054214296835, 'du'),\n", " (1.314350475152709, 'pour'),\n", " (1.4122593121056282, 'nous'),\n", " (1.4612868521346014, 'rt'),\n", " (1.4991818024886758, 'et'),\n", " (1.5056436629780865, 'la'),\n", " (1.6567994274232059, 'canada')]\n" ] } ], "source": [ "from utils.helper_functions import plot_and_return_top_features\n", "\n", "# Import pprint from pprint\n", "from pprint import pprint\n", "\n", "# Get the top features using the plot_and_return_top_features function and your top model and tfidf vectorizer\n", "top_features = plot_and_return_top_features(tfidf_svc, tfidf_vectorizer)\n", "\n", "# pprint the top features\n", "pprint(top_features)" ] }, { "cell_type": "markdown", "metadata": { "dc": { "key": "53" }, "deletable": false, "editable": false, "run_control": { "frozen": true }, "tags": [ "context" ] }, "source": [ "## 8. Bonus: can you write a Trump or Trudeau tweet?\n", "

So, what did our model learn? It seems like it learned that Trudeau tweets in French!

\n", "

I challenge you to write your own tweet using the knowledge gained to trick the model! Use the printed list or plot above to make some inferences about what words will classify your text as Trump or Trudeau. Can you fool the model into thinking you are Trump or Trudeau?

\n", "

If you can write French, feel free to make your Trudeau-impersonation tweet in French! As you may have noticed, these French words are common words, or, \"stop words\". You could remove both English and French stop words from the tweets as a preprocessing step, but that might decrease the accuracy of the model because Trudeau is the only French-speaker in the group. If you had a dataset with more than one French speaker, this would be a useful preprocessing step.

\n", "

Future work on this dataset could involve:

\n", "
    \n", "
  • Add extra preprocessing (such as removing URLs or French stop words) and see the effects
  • \n", "
  • Use GridSearchCV to improve both your Bayesian and LinearSVC models by finding the optimal parameters
  • \n", "
  • Introspect your Bayesian model to determine what words are more Trump- or Trudeau- like
  • \n", "
  • Add more recent tweets to your dataset using tweepy and retrain
  • \n", "
\n", "

Good luck writing your impersonation tweets -- feel free to share them on Twitter!

" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "dc": { "key": "53" }, "tags": [ "sample_code" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Predicted Trump tweet ['Donald J. Trump']\n", "Predicted Trudeau tweet ['Justin Trudeau']\n" ] } ], "source": [ "# Write two tweets as strings, one which you want to classify as Trump and one as Trudeau\n", "trump_tweet = \"MAKE AMERICA GREAT AGAIN!\"\n", "trudeau_tweet = \"Canada les\"\n", "\n", "# Vectorize each tweet using the TF-IDF vectorizer's transform method\n", "# Note: `transform` needs the string in a list object (i.e. [trump_tweet])\n", "trump_tweet_vectorized = tfidf_vectorizer.transform([trump_tweet])\n", "trudeau_tweet_vectorized = tfidf_vectorizer.transform([trudeau_tweet])\n", "\n", "# Call the predict method on your vectorized tweets\n", "trump_tweet_pred = tfidf_svc.predict(trump_tweet_vectorized)\n", "trudeau_tweet_pred = tfidf_svc.predict(trudeau_tweet_vectorized)\n", "\n", "print(\"Predicted Trump tweet\", trump_tweet_pred)\n", "print(\"Predicted Trudeau tweet\", trudeau_tweet_pred)" ] } ], "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.7.6" } }, "nbformat": 4, "nbformat_minor": 2 }