Skip to content

Instantly share code, notes, and snippets.

@gracecarrillo
Created January 26, 2020 18:01
Show Gist options
  • Save gracecarrillo/8fa28c1ff84b40213cda5f68c5dc76eb to your computer and use it in GitHub Desktop.
Save gracecarrillo/8fa28c1ff84b40213cda5f68c5dc76eb to your computer and use it in GitHub Desktop.
ETL_Sentiment_Analysis_Scotref2.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "ETL_Sentiment_Analysis_Scotref2.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/gracecarrillo/8fa28c1ff84b40213cda5f68c5dc76eb/etl_sentiment_analysis_scotref2.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ma5cRQJafwRY",
"colab_type": "text"
},
"source": [
"# Scottish independence: Twitter data Sentiment Analysis\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "mFiPGpFfkIUU",
"colab_type": "text"
},
"source": [
"## 1. Problem Statement\n",
"\n",
"## 2. ETL (Extract, Load, Transform)\n",
"\n",
" - Data collection\n",
" - Test \n",
" - Train\n",
"\n",
" - Preprocessing and Cleaning\n",
"\n",
" - Data Inspection\n",
" - Data Cleaning"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cIaWp1Dn7XSs",
"colab_type": "text"
},
"source": [
"## 1. Problem Statement\n",
"\n",
"The role of social media in shaping politics these days is hard to deny and Twitter is arguably the most studied and used source of data even though in many countries Twitter is not the main player. We use mostly Twitter data because that's what's (almost) publicly available whereas it’s (almost) impossible to collect any useful data from Facebook. As part of the IBM Advanced Data Science Specialisation, I chose to look into the current political situation in Scotland after the Brexit vote, and most recently, Boris Johnson's win the winter General Election of 2019.\n",
"\n",
"Scottish voters were first asked whether they wanted Scotland to become an independent country in a referendum in September 2014; the result was 55% to 45% against independence. In its manifesto for the 2016 Scottish Parliament elections, the Scottish National Party (SNP) argued that “Scotland being taken out of the EU against our will” would justify a second vote on independence. Scotland voted by 62% to 38% in favour of Remain in the EU referendum in June 2016, and First Minister Nicola Sturgeon concluded that indyref2 “must be on the table”. In March 2017 Sturgeon formally requested the consent of Westminster to hold another referendum. But Prime Minister Theresa May declined, arguing that “now is not the time”. The first minister renewed calls for a second vote in April 2019, announcing a new process for deciding Scotland’s constitutional future. The SNP's 2019 General Election manifesto stated that the party intended to hold a second referendum in 2020; and they won 48 of Scotland’s 59 seats. So, naturally, Nicola Sturgeon has now claimed there is a “renewed, refreshed and strengthened mandate” for another vote.She has formally request the power to hold an independence referendum before the end of 2020, but it has been denied by Boris Johnson. All of this has created a complicated environment in a nation that appears to be in a very difficult (and not very favourable) position within Boris Johnson's UK.\n",
"\n",
"This project looks into Twitter as political barometer for Scottish Independence using Sentiment Analysis, a Natural Language Processing subfield. I downloaded the dataset using twitter’s API. A week of Tweets were scrapped from 2020-01-08 13:49:18 to 2020-01-15 20:02:23 using keywords `indyref2`, `scottish independence` and `scotref`. The process I used to scrape the data and to analyze sentiment can be repeated for any twitter account of media page.\n",
"\n",
"We train two Supervised Machine LEarning models (Support Vector Machine and Naive Bayes Classifier) and do a systematic comparison with a Deep Learning Recurrent Neural Network.\n",
"\n",
"The training data was obtained from [Sentiment140](http://help.sentiment140.com/) and is made up of about 1.6 million random tweets with corresponding binary labels. 0 for Negative sentiment and 4 for Positive sentiment. \n",
"\n",
"I downloaded the test dataset using twitter’s API and will be use to test the model’s real world performance. Tweets were scrapped from 2020-01-08 13:49:18 to 2020-01-15 20:02:23 using keywords \"indyref2\", \"scottish independence\" and \"scotref\". Full documentation and terms of the API are available at [developer.twitter.com/en/docs](https://developer.twitter.com/en/docs)."
]
},
{
"cell_type": "code",
"metadata": {
"id": "oP1c5gDe2M6-",
"colab_type": "code",
"colab": {}
},
"source": [
"# Must be upgraded\n",
"!pip install tqdm==4.36.1 --upgrade"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "pUU5MOCAP1j0",
"colab_type": "code",
"colab": {}
},
"source": [
"!pip install tweet_parser"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "v0Xc0nZtWke9",
"colab_type": "code",
"colab": {}
},
"source": [
"!pip install --upgrade gensim"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "VOnd_sShyvQx",
"colab_type": "code",
"colab": {}
},
"source": [
"!pip install vaderSentiment"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "rk4fAdKjRIdC",
"colab_type": "code",
"colab": {}
},
"source": [
"from google.colab import drive\n",
"drive.mount('/content/drive')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "cpXSoADwxTTs",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
},
"outputId": "657bc8a1-321b-45a3-b9b7-a545848a4061"
},
"source": [
"# general\n",
"import os\n",
"import pandas as pd\n",
"import numpy as np\n",
"import csv\n",
"import string\n",
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import random\n",
"import itertools\n",
"import collections\n",
"from collections import Counter\n",
"\n",
"# tweets\n",
"import tweepy as tw\n",
"import re\n",
"from collections import Counter\n",
"from string import punctuation\n",
"from tweepy import OAuthHandler\n",
"import json\n",
"\n",
"# text manipulation \n",
"import nltk \n",
"from nltk.corpus import stopwords\n",
"from nltk.tokenize import TweetTokenizer\n",
"from nltk.stem.wordnet import WordNetLemmatizer\n",
"from nltk.stem.porter import PorterStemmer\n",
"from nltk.stem.porter import * \n",
"\n",
"# plots\n",
"from wordcloud import WordCloud\n",
"import plotly\n",
"import chart_studio.plotly as py\n",
"import plotly.graph_objs as go \n",
"from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot\n",
"import cufflinks as cf\n",
"cf.go_offline()\n",
"\n",
"# Feature Engineering\n",
"from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer\n",
"\n",
"# Machine Learning\n",
"from sklearn.pipeline import Pipeline\n",
"from sklearn.pipeline import FeatureUnion\n",
"from sklearn.model_selection import train_test_split\n",
"from sklearn.metrics import classification_report, confusion_matrix, accuracy_score\n",
"from sklearn.model_selection import KFold, cross_val_score\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.naive_bayes import MultinomialNB\n",
"from sklearn.svm import LinearSVC\n",
"from sklearn.model_selection import GridSearchCV\n",
"from sklearn.externals import joblib\n",
"from sklearn.base import BaseEstimator, TransformerMixin\n",
"from sklearn.feature_extraction.text import TfidfVectorizer, HashingVectorizer, CountVectorizer\n",
"from sklearn.preprocessing import MinMaxScaler\n",
"from sklearn.preprocessing import LabelEncoder\n",
"\n",
"# For geoplots\n",
"from IPython.display import IFrame\n",
"import folium\n",
"from folium import plugins\n",
"from folium.plugins import MarkerCluster, FastMarkerCluster, HeatMapWithTime\n",
"import networkx\n",
"\n",
"# hide warnings\n",
"import warnings\n",
"warnings.filterwarnings(\"ignore\")\n",
"\n",
"\n",
"# set plot preferences\n",
"plt.style.use(style='ggplot')\n",
"plt.rcParams['figure.figsize'] = (10, 6)\n",
"pd.set_option(\"display.max_colwidth\", 200) \n",
"plt.rcParams['axes.labelcolor']='r'\n",
"\n",
"print('Libraries imported')\n",
"%matplotlib inline"
],
"execution_count": 5,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
" <script type=\"text/javascript\">\n",
" window.PlotlyConfig = {MathJaxConfig: 'local'};\n",
" if (window.MathJax) {MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}\n",
" if (typeof require !== 'undefined') {\n",
" require.undef(\"plotly\");\n",
" requirejs.config({\n",
" paths: {\n",
" 'plotly': ['https://cdn.plot.ly/plotly-latest.min']\n",
" }\n",
" });\n",
" require(['plotly'], function(Plotly) {\n",
" window._Plotly = Plotly;\n",
" });\n",
" }\n",
" </script>\n",
" "
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
"Libraries imported\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "vJBv78vjYOGe",
"colab_type": "text"
},
"source": [
"## 2. ETL \n",
"\n",
"### 2.1 Extracting Twitter Data For Sentiment Analysis - The test data"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "50yNsO9zZt3Q",
"colab_type": "text"
},
"source": [
"After training the model we will make sentiment preditions on the twitter data but before we can do that, we need to download it and do some basic data pre-processing. \n",
"\n",
"I used `tweepy` which is a python wrapper library for the Twitter API that gives you more control on how you query the API.\n",
"\n",
"To get a good chunk of data for the test dataset, I downloaded data using the key words `'indyref2'`, `'scottish independence'` and `'scotref'` through the API search function."
]
},
{
"cell_type": "code",
"metadata": {
"id": "3ITZBj5FxvLJ",
"colab_type": "code",
"colab": {}
},
"source": [
"# Define keys\n",
"consumer_key= 'YOUR KEY'\n",
"consumer_secret= 'YOUR SECRET'\n",
"access_token= 'YOUR TOKEN'\n",
"access_token_secret= 'YOUR TOKEN SECRET'"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "L4DXngSWyET5",
"colab_type": "code",
"colab": {}
},
"source": [
"# Authentication\n",
"auth = tw.OAuthHandler(consumer_key, consumer_secret)\n",
"auth.set_access_token(access_token, access_token_secret)\n",
"api = tw.API(auth, wait_on_rate_limit=True)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "dErM-yNfyUHt",
"colab_type": "code",
"colab": {}
},
"source": [
"# Post a tweet from Python\n",
"api.update_status(\"Test tweet from Python \")\n",
"# Your tweet has been posted!"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "ySr4R0Kp6tvr",
"colab_type": "code",
"colab": {}
},
"source": [
"# Define the search term and the date_since date as variables\n",
"start_time = time.time()\n",
"\n",
"max_id = -1000000000000000000000000000000000\n",
"tweetsPerQry = 100 # this is the max the API permits\n",
"search_words = '(indyref2 OR \"scottish independence\" OR scotref)'\n",
"date_since = \"2019-12-10\" \n",
"\n",
"# Collect tweets\n",
"# open/create a csv file to append data\n",
"csvFile = open(search_words + '_data2.csv', 'w', encoding='utf-8')\n",
"\n",
"# use csv Writer\n",
"csvWriter = csv.writer(csvFile)\n",
"\n",
"# get data from twitter\n",
"tweet_num = 0\n",
"for tweet in tw.Cursor(api.search,q=search_words + ' -RT',count=tweetsPerQry,lang=\"en\", \n",
" since=date_since, max_id=str(max_id - 1)).items(9999999999):\n",
" if tweet.place is not None:\n",
" try:\n",
" # not entirely necessary but you can inspect what is being written to file\n",
" print ('tweet number: {}'.format(tweet_num), tweet.text, tweet.place.full_name)\n",
" # write data to csv\n",
" csvWriter.writerow([tweet.created_at,\n",
" tweet.user.location,\n",
" tweet.user.followers_count,\n",
" tweet.user.friends_count,\n",
" tweet.text,\n",
" tweet.place.bounding_box.coordinates,\n",
" tweet.place.full_name,\n",
" tweet.place.country,\n",
" tweet.place.country_code,\n",
" tweet.place.place_type])\n",
" tweet_num += 1\n",
" \n",
" except Exception:\n",
" pass\n",
"\n",
"print(\"--- %s seconds ---\" % (time.time() - start_time))"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "CyIHXPNLL5AK",
"colab_type": "code",
"colab": {}
},
"source": [
"# create column names\n",
"col_names=['date','user_loc','followers','friends','message','bbox_coords',\\\n",
" 'full_name','country','country_code','place_type']\n",
"\n",
"# read csv\n",
"df_twtr = pd.read_csv('/content/(indyref2 OR \"scottish independence\" OR scotref)_data2.csv', names=col_names)\n",
"\n",
"# check head\n",
"df_twtr.head()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "QZywKWyqRops",
"colab_type": "code",
"colab": {}
},
"source": [
"# Sort dataframe by date column\n",
"df_twtr['date'] = pd.to_datetime(df_twtr['date'])\n",
"df_twtr = df_twtr.sort_values(by='date',ascending=True)\n",
"df_twtr = df_twtr.reset_index().drop('index',axis=1)\n",
"df_twtr.head()"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "o0u8asr5RxLG",
"colab_type": "code",
"outputId": "2e1fd4d0-b185-47ff-f43f-0cc2428a39c7",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 289
}
},
"source": [
"# get central geo location from the bounding box for later mapping\n",
"# helper function to get mean of lats and longs\n",
"def geo_mean(x):\n",
" y = json.loads(x)\n",
" y = np.asarray(y)\n",
" mean_geoloc = np.add(np.add((y[:][0][0]),(y[:][0][1]))/2,\\\n",
" (np.add((y[:][0][2]),(y[:][0][3]))/2))/2 \n",
" return np.around(mean_geoloc,decimals=6)\n",
"\n",
"# ____________________________________________________________\n",
"\n",
"# append new column and clean up df\n",
"df_twtr['geo_code'] = df_twtr['bbox_coords'].apply(geo_mean)\n",
"df_twtr = df_twtr.drop(['bbox_coords','place_type','followers','friends'],axis=1)\n",
"df_twtr.head()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>user_loc</th>\n",
" <th>message</th>\n",
" <th>full_name</th>\n",
" <th>country</th>\n",
" <th>country_code</th>\n",
" <th>geo_code</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>2020-01-08 13:49:18</td>\n",
" <td>Glasgow, Scotland</td>\n",
" <td>Can anyone in Scotland be arsed with this for another 5 years? Tories continue to shout down Scotland’s elected rep… https://t.co/xw8FDFOtwG</td>\n",
" <td>Glasgow, Scotland</td>\n",
" <td>United Kingdom</td>\n",
" <td>GB</td>\n",
" <td>[-4.241751, 55.858303]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>2020-01-08 13:59:26</td>\n",
" <td>London, England</td>\n",
" <td>https://t.co/B6inPM8K8C\\n\\nThe Scottish Laa-Laas have IndyRef2 on their minds like they have been brainwashed by a religious cult.</td>\n",
" <td>Hillingdon, London</td>\n",
" <td>United Kingdom</td>\n",
" <td>GB</td>\n",
" <td>[-0.442361, 51.537061]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>2020-01-08 14:59:35</td>\n",
" <td>Cardiff, Wales</td>\n",
" <td>@alcampian Scotlands best chance of independence is not any #indyref2 it's to ask the other 3 nations if they want… https://t.co/TZv4hynstr</td>\n",
" <td>Cardiff, Wales</td>\n",
" <td>United Kingdom</td>\n",
" <td>GB</td>\n",
" <td>[-3.1798, 51.497002]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>2020-01-08 15:23:24</td>\n",
" <td>Scotland</td>\n",
" <td>I’m not surprised (in the slightest) that @BorisJohnson has refused @NicolaSturgeon’s request to hold #Indyref2. Bu… https://t.co/T5yl0Ev9PD</td>\n",
" <td>Glasgow, Scotland</td>\n",
" <td>United Kingdom</td>\n",
" <td>GB</td>\n",
" <td>[-4.241751, 55.858303]</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>2020-01-08 15:44:58</td>\n",
" <td>Scotland+</td>\n",
" <td>@anninnis @BBCPolitics Vote NO to stay in the EU they said in 2014. Things change, time for IndyRef2</td>\n",
" <td>Glasgow, Scotland</td>\n",
" <td>United Kingdom</td>\n",
" <td>GB</td>\n",
" <td>[-4.241751, 55.858303]</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" date user_loc ... country_code geo_code\n",
"0 2020-01-08 13:49:18 Glasgow, Scotland ... GB [-4.241751, 55.858303]\n",
"1 2020-01-08 13:59:26 London, England ... GB [-0.442361, 51.537061]\n",
"2 2020-01-08 14:59:35 Cardiff, Wales ... GB [-3.1798, 51.497002]\n",
"3 2020-01-08 15:23:24 Scotland ... GB [-4.241751, 55.858303]\n",
"4 2020-01-08 15:44:58 Scotland+ ... GB [-4.241751, 55.858303]\n",
"\n",
"[5 rows x 7 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 20
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "l8-cER3tcUi9",
"colab_type": "code",
"colab": {}
},
"source": [
"# Save as csv\n",
"df_twtr.to_csv('/content/drive/My Drive/Twitter_Project/df_indyref2.csv')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "_3ig8ggSchX8",
"colab_type": "code",
"colab": {}
},
"source": [
"# Load back in\n",
"test = pd.read_csv('/content/drive/My Drive/Twitter_Project/df_indyref2.csv')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "-BBb5fCCoC5G",
"colab_type": "code",
"outputId": "f5af2573-ffb7-426e-e34b-ed82e71535cc",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 35
}
},
"source": [
"test.shape"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(636, 8)"
]
},
"metadata": {
"tags": []
},
"execution_count": 7
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "CtSsCpa3b3qc",
"colab_type": "text"
},
"source": [
"This is the dataset we will use as the `test` data."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "gBVfrfto6yNU",
"colab_type": "text"
},
"source": [
"### 2.2. Training data set"
]
},
{
"cell_type": "code",
"metadata": {
"id": "BlPA5e-WDlh0",
"colab_type": "code",
"colab": {}
},
"source": [
"# Load train dataset\n",
"train = pd.read_csv('/content/drive/My Drive/Twitter_Project/training.1600000.processed.noemoticon.csv', \n",
" header=None, \n",
" names=['label', 'id', 'date', 'flag', 'user', 'text'],\n",
" encoding='latin-1')"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "hoCgLZy5EiB6",
"colab_type": "code",
"outputId": "99d9cd45-898c-4ec4-c685-58ed9f64381c",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 193
}
},
"source": [
"train.head(3)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>label</th>\n",
" <th>id</th>\n",
" <th>date</th>\n",
" <th>flag</th>\n",
" <th>user</th>\n",
" <th>text</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>1467810369</td>\n",
" <td>Mon Apr 06 22:19:45 PDT 2009</td>\n",
" <td>NO_QUERY</td>\n",
" <td>_TheSpecialOne_</td>\n",
" <td>@switchfoot http://twitpic.com/2y1zl - Awww, that's a bummer. You shoulda got David Carr of Third Day to do it. ;D</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>1467810672</td>\n",
" <td>Mon Apr 06 22:19:49 PDT 2009</td>\n",
" <td>NO_QUERY</td>\n",
" <td>scotthamilton</td>\n",
" <td>is upset that he can't update his Facebook by texting it... and might cry as a result School today also. Blah!</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>1467810917</td>\n",
" <td>Mon Apr 06 22:19:53 PDT 2009</td>\n",
" <td>NO_QUERY</td>\n",
" <td>mattycus</td>\n",
" <td>@Kenichan I dived many times for the ball. Managed to save 50% The rest go out of bounds</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" label ... text\n",
"0 0 ... @switchfoot http://twitpic.com/2y1zl - Awww, that's a bummer. You shoulda got David Carr of Third Day to do it. ;D\n",
"1 0 ... is upset that he can't update his Facebook by texting it... and might cry as a result School today also. Blah!\n",
"2 0 ... @Kenichan I dived many times for the ball. Managed to save 50% The rest go out of bounds\n",
"\n",
"[3 rows x 6 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 8
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "iTxvB6YIdBR8",
"colab_type": "text"
},
"source": [
"## 3. Preprocessing\n",
"\n",
"Text is a highly unstructured form of data. Various types of noise are present in it and the data is not readily analysable without any pre-processing. The entire process of cleaning and standardisation of text, making it noise-free and ready for analysis is known as text preprocessing. We will divide it into 2 parts:\n",
"\n",
"- Data Exploration\n",
"\n",
"- Data Cleaning \n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yQ1jC5PveHB3",
"colab_type": "text"
},
"source": [
"### 3.1 Data Exploration\n",
"\n",
"Let's check out a few things about the `train` data:\n",
"\n",
"\n"
]
},
{
"cell_type": "code",
"metadata": {
"id": "deKrTt3VEmnY",
"colab_type": "code",
"outputId": "7673e256-3223-4c85-9eaf-5589d7461e13",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 69
}
},
"source": [
"train.label.value_counts()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"4 800000\n",
"0 800000\n",
"Name: label, dtype: int64"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3i0Jzq96YqRi",
"colab_type": "text"
},
"source": [
"Let's take a sample of the larger training data set to avoid long waiting times. "
]
},
{
"cell_type": "code",
"metadata": {
"id": "xhKXbuS3Yx4o",
"colab_type": "code",
"colab": {}
},
"source": [
"train = train.copy()\n",
"train = train.sample(50000)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "-Gn9qsGsY4_N",
"colab_type": "code",
"outputId": "a62bf121-4298-4fd1-bf0a-9ddd9d310845",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 69
}
},
"source": [
"train.label.value_counts()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0 25160\n",
"4 24840\n",
"Name: label, dtype: int64"
]
},
"metadata": {
"tags": []
},
"execution_count": 8
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "_kwcmkEwFOci",
"colab_type": "code",
"outputId": "3093c465-d38b-44b5-891f-6b02d4e7dbf7",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 69
}
},
"source": [
"# check the number of positive vs. negative tagged sentences\n",
"# 0 — the polarity of the tweet (0 = negative, 2 = neutral, 4 = positive)\n",
"positives = train['label'][train.label == 4]\n",
"negatives = train['label'][train.label == 0]\n",
"\n",
"print('number of positve tagged sentences is: {}'.format(len(positives)))\n",
"print('number of negative tagged sentences is: {}'.format(len(negatives)))\n",
"print('total length of the data is: {}'.format(train.shape[0]))"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"number of positve tagged sentences is: 24840\n",
"number of negative tagged sentences is: 25160\n",
"total length of the data is: 50000\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "kGSOASW9GEFB",
"colab_type": "text"
},
"source": [
"Dataset has 1.6million entries, with no null entries, and importantly for the “sentiment” column, even though the dataset description mentioned neutral class, the training set has no neutral class.\n",
"50% of the data is with negative label, and another 50% with positive label.\n",
"We can see there’s no skewness on the class division."
]
},
{
"cell_type": "code",
"metadata": {
"id": "Ld8knSJeGKm3",
"colab_type": "code",
"colab": {}
},
"source": [
"# Drop unnecesary columns\n",
"# “id” column is unique ID for each tweet\n",
"# “date” column is for date info for the tweet\n",
"# “flag” column indicates whether the tweet has been collected with any particular query key word,\n",
"# but for this column, 100% of the entries are with value “NO_QUERY”\n",
"# “user” column is the twitter handle name for the user who tweeted\n",
"\n",
"train.drop(['id','date','flag','user'],axis=1,inplace=True)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "2aap6GHnGq4t",
"colab_type": "code",
"outputId": "4b39a3d6-4a57-4f0d-d1a5-324f9930496a",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 202
}
},
"source": [
"train.head(5)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>label</th>\n",
" <th>text</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>637591</th>\n",
" <td>0</td>\n",
" <td>@whateverrr06 pringle leh!</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1230332</th>\n",
" <td>4</td>\n",
" <td>yey just got in on brogårn</td>\n",
" </tr>\n",
" <tr>\n",
" <th>965550</th>\n",
" <td>4</td>\n",
" <td>still miserable out there. marquee from yesterdays bbq nearly flew away. philip and Anthony on Wii, gin shouting at me from cupboard</td>\n",
" </tr>\n",
" <tr>\n",
" <th>820776</th>\n",
" <td>4</td>\n",
" <td>The day's almost over. Yay! Going outt..!</td>\n",
" </tr>\n",
" <tr>\n",
" <th>928339</th>\n",
" <td>4</td>\n",
" <td>@rustyrockets dont worry they will and for what they dont i will xx</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" label text\n",
"637591 0 @whateverrr06 pringle leh!\n",
"1230332 4 yey just got in on brogårn \n",
"965550 4 still miserable out there. marquee from yesterdays bbq nearly flew away. philip and Anthony on Wii, gin shouting at me from cupboard \n",
"820776 4 The day's almost over. Yay! Going outt..! \n",
"928339 4 @rustyrockets dont worry they will and for what they dont i will xx"
]
},
"metadata": {
"tags": []
},
"execution_count": 11
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "r_f72871HmHy",
"colab_type": "code",
"outputId": "85563f14-ad9b-4ddc-f54a-c4c183babf7c",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 141
}
},
"source": [
"# get a word count per sentence column\n",
"def word_count(sentence):\n",
" return len(sentence.split())\n",
" \n",
"train['word count'] = train['text'].apply(word_count)\n",
"train.head(3)"
],
"execution_count": 9,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>label</th>\n",
" <th>text</th>\n",
" <th>word count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>@switchfoot http://twitpic.com/2y1zl - Awww, that's a bummer. You shoulda got David Carr of Third Day to do it. ;D</td>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>is upset that he can't update his Facebook by texting it... and might cry as a result School today also. Blah!</td>\n",
" <td>21</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>@Kenichan I dived many times for the ball. Managed to save 50% The rest go out of bounds</td>\n",
" <td>18</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" label ... word count\n",
"0 0 ... 19\n",
"1 0 ... 21\n",
"2 0 ... 18\n",
"\n",
"[3 rows x 3 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 9
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "3dfZ3IuqHLZ1",
"colab_type": "code",
"outputId": "6c4d1d4c-5f74-4ad3-88d1-26155269095b",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 409
}
},
"source": [
"# plot word count distribution for both positive and negative sentiments\n",
"plt.style.use(style='ggplot')\n",
"plt.rcParams['figure.figsize'] = (10, 6)\n",
"pd.set_option(\"display.max_colwidth\", 200) \n",
"\n",
"x = train['word count'][train.label == 4]\n",
"y = train['word count'][train.label == 0]\n",
"plt.xlim(0,45)\n",
"plt.xlabel('word count')\n",
"plt.ylabel('frequency')\n",
"g = plt.hist([x, y], color=['b','r'], alpha=0.5, label=['positive','negative'])\n",
"plt.legend(loc='upper right');"
],
"execution_count": 14,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7f99468d3668>"
]
},
"metadata": {
"tags": []
},
"execution_count": 14
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nRU6nU7feeqs++OADffDBB/r44481derUsx7L2fDJKeBt27YpLy9Pbdu21YMPPijpxCNf1qxZo127\ndslisSg6Olpjx46VJLVp00ZXXXWVpkyZIqvVqtGjR7uuEbj33ns1a9Ys1dbWasCAAa7QOGLECM2d\nO1dLly7VpZdeqoEDB0qSBg4cqPnz5+v+++9XSEiIJk+e7IshwwM8eWHwmdhsAaqsPL2vqVPLfdI/\nAMD39uzZo3Xr1ikxMVHZ2dnq1q2bXn31Ve3cuVOXXnqp/vd//1e9e/fW4cOHdeTIEQ0aNEhJSUm6\n6qqrTmurZcuWqqioqLOfG264QZmZmfr6669dp4KvueYajRo1Sr/97W8VFRWl0tJSHT58WBdddJFX\nx/xTPgmAl112mZYtW3ba9pOPfanL0KFDNXTo0Do/U9fnYmJi9NRTT522vXnz5poyZUoDKwYAAE1Z\nu3bt9Morr2jq1Knq2LGjZs6cqR49emjcuHGqqanRlVdeqZEjR+rQoUO69957dfToUTmdTtcNHT91\n2223adq0aQoODtY777xzys9atWql9u3b69tvv1X37t0lSR07dtQf//hHDR8+XE6nU4GBgZo1a5ZP\nA6DF6XQ6fdbbeWTv3r3+LsHnGttFw75bAbSpsrLytO1NfQWwsc23rzBuszDuxqeyslI2m80rbQcG\nBrp1E8gPP/ygu+++2/XM4PNJXcevUd8EAgAAgMaBAAgAAIzSpk2b83L1z5MIgAAAAIYhAAIAABiG\nAAgAAGAYn78LGDhfhKan+63vch8/EBQAYBZWAAEAADyorKxML7/8suv7/fv367e//a3/CqoDK4AA\nAMBvPHm2xWq1quyBBzzW3tn68ccftWTJEt1zzz2SpNatW2vhwoX+LepnWAEEAABG+eGHH9S/f389\n+OCDGjBggIYPH64jR45o165dGjFihG644Qb95je/UWFhoSRp165dGjx4sAYNGqSnn35aHTp0kCQd\nPnxYt912m66//noNGjRIK1eulCTNnj1b//73v3Xttddq5syZ+uGHH1yvqB08eLC2bdvmqmXYsGHa\ntGmTKisrNWXKFKWmpuq6665zteUtBEAAAGCcnTt36u6779ZHH32ksLAwrVixQn/84x81c+ZM/etf\n/9Ijjzyihx56SJL06KOPasyYMfrwww914YUXutoICgrSokWLtHLlSr3xxht64okn5HQ6NX36dF18\n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\nUv/+/ZWfny9JWrdunfr16yeLxaKOHTvq8OHDKi0tVUFBgbp166aQkBCFhISoW7duKigoUGlpqY4c\nOaKOHTvKYrGoX79+rrYAAABM1ShWAGfNmiVJuvbaa5WSkqKysjJFRERIklq1aqWysjJJksPhUFRU\nlOtzkZGRcjgccjgcioyMdG232+11bj+5PwAAgMn8HgBnzpwpu92usrIyPfnkk4qNjT3l5xaLxSfX\n7OXk5CgnJ0eSlJaWdkrQPFc2W4DH2mpw37K5va/VapXN5v7+7gg6h+Poq+NW37gbcuw8zRfHzRvz\nLTX+4xYYGFjv7/f58rt6Ns403+fy562xO9N8N2WMG7/E7wHQbrdLksLDw5WUlKTCwkKFh4ertLRU\nERERKi0tdV0faLfbVVxc7PpsSUmJ7Ha77Ha7tmzZ4trucDjUuXNn2e12lZSUnLZ/XVJSUpSSkuL6\n/qf9nKvKylCPtdXgvlXp9r42m02Vle7v747ycziOvjpu9Y27IcfO03xx3Lwx31LjP25RUVH1/n6f\nL7+rZ+NM830uf94auzPNd1PGuM3y88Uzd/j1GsCqqiodOXLE9fWXX36ptm3bKjExUatXr5YkrV69\nWklJSZKkxMRE5eXlyel0avv27bLZbIqIiFBCQoI2bdqkiooKVVRUaNOmTUpISFBERIRatGih7du3\ny+l0Ki8vT4mJiX4bLwAAQGPg1xXAsrIyPfvss5KkmpoaXXPNNUpISFC7du2UkZGh3Nxc12NgJKl7\n9+7asGGDJk2apObNm2vChAmSpJCQEN1yyy166KGHJEnDhg1TSEiIJGnMmDFasGCBjh07poSEBO4A\nBgAAxvNrAIyJidGcOXNO2x4aGqpHH330tO0Wi0Vjxoyps62BAwdq4MCBp21v166d0tPTz71YAACA\nJqJRPgYGAAAA3kMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAAB\nAAAMQwAEAAAwDAEQAADAMARAAAAAwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQA\nADAMARAAAMAwBEAAAADDBPq7AAAAzlZoevoZfx5gsym0stIrfZdPneqVdgFfYAUQAADAMARAAAAA\nwxAAAQAADEMABAAAMAwBEAAAwDAEQAAAAMMQAAEAAAxDAAQAADAMARAAAMAwBEAAAADDEAABAAAM\n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\nO3fW5s2bXQGwc+fOpwVAu92ugwcPnvK54uLiU06bWiwW19cRERE6fPjwKWGruLi43hoiIyO1f//+\n07ZHRESooqJCR44cqbPfoKAgHT161PWzQ4cOuTvsU+oFgJMIgACMcDIAHjt2TJGRkbrssstUUFCg\niooKXXrppZKk7t27a9++ffrkk09UU1OjtWvXavfu3erRo0edbUZHR6tdu3ZatmyZqqurtXXr1lNO\nF//cwIEDtWrVKn311Veu6xH37NmjqKgoderUSf/zP/+jY8eO6d///rc++ugj9e3bV5J0ySWXaOPG\njaqoqNChQ4e0YsUKt8cdHh6u8vJyVVZWNuBoAWjquAsYgBFiY2MVHBysyy+/XJJks9kUExOjsLAw\nWa0n/l84NDRU06ZN0+LFi7Vw4UK1bt1a06ZNU1hYWL3tTpo0SVlZWRo1apQ6duyofv366fDhw3Xu\n2759e02YMEGvvPKKioqKFB4ertGjRysuLk6///3vtXDhQo0bN04hISG69dZb1a1bN0lSv3799NVX\nX2nixImKjo5WcnKy/vnPf7o17ri4OF199dX63e9+p9raWj333HPcCAJAFqfT6fR3EQAAAPAdTgED\nAAAYhgAIAABgGAIgAACAYQiAAAAAhiEAAgAAGIYACAAAYBgCIAAAgGEIgAAAAIYhAAIAABjm/wFe\nOf9Am83+RwAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "d29pj0waXtu6",
"colab_type": "code",
"outputId": "2b0466d1-3409-48ec-93cb-86c645bee1af",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 191
}
},
"source": [
"# get most common words in training dataset\n",
"all_words = []\n",
"for line in list(train['text']):\n",
" words = line.split()\n",
" for word in words:\n",
" all_words.append(word.lower())\n",
" \n",
" \n",
"Counter(all_words).most_common(10)"
],
"execution_count": 12,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[('i', 746635),\n",
" ('to', 560314),\n",
" ('the', 518734),\n",
" ('a', 376422),\n",
" ('my', 312846),\n",
" ('and', 295675),\n",
" ('you', 237766),\n",
" ('is', 231086),\n",
" ('for', 214051),\n",
" ('in', 209960)]"
]
},
"metadata": {
"tags": []
},
"execution_count": 12
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "UeCYF-ipZXRC",
"colab_type": "text"
},
"source": [
"In the cell above we extract the most common words in the dataset and list the top ten.\n",
"\n",
"Perhaps to no surprise we encounter words like 'i', and and is as they are very highly used in human expressions. These kind of words usually appear equally in both negative and positive oriented expressions and as such they bring very little information that can be incorporated in the model so we will have to get rid of them down the road.\n",
"\n",
"In the text preprocessing steps later on we will learn how to deal with these common words that don't add much to the feature space.\n",
"\n",
"Below is a graph showing the frequency of the first 25 words.\n",
"\n",
"I also created a log-log plot for the words frequency which is similar to the previous frequency graph but includes all words and is plotted on a base 10 logarithimic scale which helps us visualize the rapidly diminishing frequency of words as their rank drops.\n",
"\n",
"The word distribution present in this data dictionary is a very common phenomenon in large samples of words as shown by Zipf's law where the most frequent word will occur about twice as often as the second most frequent word, three times as often as the third most frequent word, etc.\n",
"It would be intersting to see if this holds true after we remove words like i, and and is from the observation above."
]
},
{
"cell_type": "code",
"metadata": {
"id": "NzJOn41qX_wn",
"colab_type": "code",
"outputId": "243cb652-4754-42c4-a3ad-1be2592098ee",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 843
}
},
"source": [
"# plot word frequency distribution of first few words\n",
"plt.title('Top 25 most common words')\n",
"plt.xticks(fontsize=13, rotation=90)\n",
"fd = nltk.FreqDist(all_words)\n",
"fd.plot(25,cumulative=False)\n",
"\n",
"# log-log plot\n",
"word_counts = sorted(Counter(all_words).values(), reverse=True)\n",
"plt.loglog(word_counts, linestyle='-', linewidth=1.5)\n",
"plt.ylabel(\"Freq\")\n",
"plt.xlabel(\"Word Rank\")\n",
"plt.title('log-log plot of words frequency')"
],
"execution_count": 13,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAnoAAAGdCAYAAACFA96rAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0\ndHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nOzdeXRV5b3/8fdzMpKJ5IQQCHOAgEwm\nEBQQAWNqrai1gEPVqiii0mIdi9Reh6sgioiGQW4BsYqWWkTurT+tFsKgBjQIYRQiUI0IYUhCJBAI\nyXl+f0ROjRAIkpOdk3xea7HkPHuf7/PdR9fys/bwbGOttYiIiIhIg+NyugERERER8Q0FPREREZEG\nSkFPREREpIFS0BMRERFpoBT0RERERBooBT0RERGRBkpBT0REGqQbbriBK6+80uk2RByloCfSABlj\nTvunffv2Pp3/7bff5vLLLyc+Pp7w8HB69uzJzJkzq+yzdevWU/b29NNP+7S3n2rOnDmEhoY63YaI\nyFkJdLoBEal9e/bs8f49KyuL4cOHs3btWlq2bAlAQECAT+dftmwZgwcP5oknnqB58+ZkZmbyu9/9\njuPHj/P73/++yr7//Oc/Of/8872fIyMjfdqbNCxlZWUEBwc73YZIvaUzeiINUIsWLbx/3G43AHFx\ncd6xuLg4AA4ePMgdd9xBs2bNCA0N5cILL2TZsmXeOifOui1YsIAhQ4YQGhpKp06dWLRo0Wnnnz59\nOuPHj6dfv34kJiYyatQobrnlFt56662T9o2Nja3Sb3h4+Glrn7gcN2XKFFq1akVkZCRjxoyhoqKC\njIwM2rRpg9vt5re//S3l5eXe7x07dowHH3yQhIQEgoOD6dmzJ3//+9+r1J45cyZdunQhNDSU2NhY\nLrnkEvbu3cs///lP7rzzTo4dO+Y983j33XdX2+OePXu45ZZbaN68OaGhoXTt2pX58+d7t3/88ccM\nHDiQ0NBQ3G43t9xyCwUFBd7tjzzyCD169OCNN94gMTGR8PBwrr32Wg4fPsyCBQvo3LkzUVFR3HDD\nDZSUlPj8tzl69CjGGGbPns2vf/1rIiIiaNu2LVOmTDntv6u+ffvy1FNPeT+PGzcOYwwff/yxd6xP\nnz48+eST3s9z5syhS5cuBAcH06ZNG5544gk8Ho93e79+/bjnnnt45JFHaNGiBUlJSQDs37+f4cOH\nExYWRosWLfjv//7vk/pZtmwZ/fv3JyIigqioKFJSUqr89y7SIFkRadCWLVtmAfvNN9+ctO3KK6+0\niYmJ9l//+pfdvHmzvfvuu21ISIjdsWOHtdbaL774wgK2VatWdsGCBXbr1q324YcftgEBAXbz5s1n\n1ce1115rf/azn3k/n6jdpk0b26xZM5uammozMjJseXn5aetcf/31Nioqyo4aNcp+8cUX9u2337aB\ngYH28ssvt3fccYfdsmWLXbx4sQ0KCrKvvPKK93u/+93vbFxcnH377bft1q1b7eOPP26NMfajjz6y\n1lr78ccf26CgIPvmm2/ar776ym7YsMHOmjXL5ufn22PHjtkpU6bYkJAQu2fPHrtnzx5bXFx8yv4O\nHTpkO3bsaPv27WuXLl1qd+zYYd977z371ltvWWutzcvLs2FhYfbWW2+1mzZtssuXL7ddu3a16enp\n3hrjxo2z4eHh9pe//KXdsGGDXbp0qY2OjraXXXaZveqqq+yGDRvssmXLrNvtto899pjPf5vS0lIL\n2JYtW9pXXnnFbt++3U6ZMsUC9uOPP67239XDDz9shwwZ4v2cmppq4+Li7JNPPmmttbawsNC6XC67\ncuVKa621CxcutAEBAfb555+3ubm59o033rBRUVH26aef9ta48MILbUREhB07dqzdsmWL3bhxo7XW\n2ssvv9x26dLFLl++3G7cuNFee+21NjIy0g4dOtRaa+3Ro0dtRESEHTdunP3yyy/ttm3b7MKFC21W\nVla1/Ys0BAp6Ig1cdUFv06ZNFrBLly71jnk8HtutWzd7zz33WGv/E8Z++D9aa63t3bu3HTVqVI17\n+OCDD2xAQID94IMPvGO7d++2zz//vM3KyrJr1661U6ZMsREREWese/3119tWrVrZ48ePe8fS0tJs\ny5YtbVlZmXfssssuszfddJO11tqioiIbGBho586dW6XW5Zdfbn/xi19Ya6198803bWxsrC0pKTnl\nvLNnz7YhISFnPNbp06fb8PBwm5+ff8rtDz30kO3QoUOV/levXm0B++mnn1prK4NeSEiILSoq8u5z\n++2326CgIFtYWOgdGz16tL3ooou8n33125wIeg8//HCVfdq3b2+feOKJan+L999/34aEhNgjR47Y\ngwcP2sDAQDt58mQ7ePBga621ixYtsmFhYd7eUlNT7W9+85sqNSZNmmQjIiJsRUWFtbYy6HXv3t16\n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\nOIY3BNOmTWPu3Ll26Zup1NRUFixYgK+vr93jvvfee3Tu3Nn4ZqG4uJivv/6a//3f/73hOIbnnoqK\nCrPnIY1GQ/PmzfnHP/5hdR8vXrxoTDr379/PG2+8gYeHBy+++KLVMcHy776ysrLGmR1Hk0SvATt9\n+jQzZsww/vEoisLIkSP5z3/+Y3XMkpISQkJCzNrsUWrR39/fOM3UokULDh8+jI+PT62f9EzFxcUR\nFxfHb7/9RmJiIgsXLsTV1ZW4uDgGDx5s1ajUl19+yXvvvYeHhwcAwcHBTJ48mWnTpll8d26tVq1a\n1TgVcaOKiorw9/dHp9Nx9OhRFi9ejIuLC5MnT7Yq3vWjBfaSnp7OkiVLbF5SAH88utG8eXMeeeSR\nWsXz9vbmgQceAPQ/zylTplBYWEh+fj4BAQE0b97cpv7m5OQwbtw4uz7Bl5SUcMstt5i1tWjRgsuX\nL9sUNy0tjUWLFplNWfn6+lJUVFSrOIYR7KVLlxp/tnDthblz58429TM5OZn58+fj6elpbPP39+fS\npUtWxzx//jxvvfWWXaa+DX+DOp2u2t+jTqfjzjvvtCru9UleeXk5Go0GZ2fbXsa9vb3t8ti83mef\nfcYLL7xAdHQ0EydOBPSFg0+fPl2rOIsWLQL0SwH+53/+x+791Ol0ZGdn4+bmZpxuvX5U90a98cYb\nKIpCRUUFb775ptl1eXl5tGvXzub+WkMSvQbMy8uL3NxcWrZsaWzLzc01JinWaNWqFcnJyfTo0cPY\nduTIEeNonLWGDRtGRkYGgYGB3HvvvcydOxdVVfnrX/9qU1zQ93ncuHEMGzaM999/ny+//JKvvvqK\n22+/nb///e8EBgbecKyysjIqKirMfoYVFRWUlpZa3b+CggKzr69cucL27dtr1S9LXFxcuHz5MllZ\nWbRs2RJPT0+qqqqorKy0Kp61axD/TEBAgNV9up4jRzeefvpp5syZw+HDh41tMTExPPPMM3h7e1sV\nMyIigvPnzxtH3+yhXbt2bN261WxJwLZt22x+jDo7O1dbtlBSUlLr790wgh0SEmLzOj9LVFWttn5K\nq9XalKy0b9+e7Ozsam9yrfHvf/8bVVWZPXu22ciVoig0b97c7Pm6NtavX09sbCzh4eGkpqby7rvv\noigKL774olUzGQaPPPIIK1asYOzYsVb/nVty8eJFoqOjzdpcXV2tfi6YNm0aCQkJHDt2jOLiYrMB\n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\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0.5, 1.0, 'log-log plot of words frequency')"
]
},
"metadata": {
"tags": []
},
"execution_count": 13
},
{
"output_type": "display_data",
"data": {
"image/png": "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\nxOzL+3OQlgAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 720x432 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "urM154fFeVZ9",
"colab_type": "code",
"outputId": "19da4dcd-7c86-4942-d178-04f4051c4344",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 355
}
},
"source": [
"# Let’s check out a few positive/negative labelled tweets:\n",
"\n",
"train[train['label'] == 0].head(10) # negative"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>label</th>\n",
" <th>text</th>\n",
" <th>word count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>532647</th>\n",
" <td>0</td>\n",
" <td>now doing the weights again...urgh my poor laptop is burning up in this summer evening's heat</td>\n",
" <td>16</td>\n",
" </tr>\n",
" <tr>\n",
" <th>715413</th>\n",
" <td>0</td>\n",
" <td>@Ambluc, cool thanks, having trouble back replying to anyone, the little arrow is not working</td>\n",
" <td>15</td>\n",
" </tr>\n",
" <tr>\n",
" <th>594276</th>\n",
" <td>0</td>\n",
" <td>@angelgregzion I've never seen it. I am not much of a movie buff.</td>\n",
" <td>13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>197250</th>\n",
" <td>0</td>\n",
" <td>@jmlane Fanboys was viewed, and an attempt to view JCVD was made, however it was in French without subtitles</td>\n",
" <td>19</td>\n",
" </tr>\n",
" <tr>\n",
" <th>248996</th>\n",
" <td>0</td>\n",
" <td>It's 2am and I still can't sleep. I have class in 5 hour...</td>\n",
" <td>13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>419778</th>\n",
" <td>0</td>\n",
" <td>wow i accidentally pressed some buttons when my phone was in the pocket and it said 321.... how weird it that?! should i be scared?</td>\n",
" <td>25</td>\n",
" </tr>\n",
" <tr>\n",
" <th>703692</th>\n",
" <td>0</td>\n",
" <td>@SirMikeyB Painkillers for... erm... that thing we get that you don't lol. I miss you, everytime I sign into Skype it's so dead</td>\n",
" <td>23</td>\n",
" </tr>\n",
" <tr>\n",
" <th>286826</th>\n",
" <td>0</td>\n",
" <td>@jennasie crap I can't get weekends off</td>\n",
" <td>7</td>\n",
" </tr>\n",
" <tr>\n",
" <th>314549</th>\n",
" <td>0</td>\n",
" <td>@mikedignammusic nooo, dont be a juggler you're voice is too nice!</td>\n",
" <td>11</td>\n",
" </tr>\n",
" <tr>\n",
" <th>59378</th>\n",
" <td>0</td>\n",
" <td>Cannot push the L1 button</td>\n",
" <td>5</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" label ... word count\n",
"532647 0 ... 16\n",
"715413 0 ... 15\n",
"594276 0 ... 13\n",
"197250 0 ... 19\n",
"248996 0 ... 13\n",
"419778 0 ... 25\n",
"703692 0 ... 23\n",
"286826 0 ... 7\n",
"314549 0 ... 11\n",
"59378 0 ... 5\n",
"\n",
"[10 rows x 3 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 15
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "eVJaZSerenpY",
"colab_type": "code",
"outputId": "dd66f396-23fc-4d2a-f87c-2d9d2a0082e3",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 355
}
},
"source": [
"train[train['label'] == 4].head(10) # positive"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>label</th>\n",
" <th>text</th>\n",
" <th>word count</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1519359</th>\n",
" <td>4</td>\n",
" <td>is it LOVE or BREAD???</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1004219</th>\n",
" <td>4</td>\n",
" <td>just done my weekly weigh in. on target woohoo</td>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1470971</th>\n",
" <td>4</td>\n",
" <td>@LeiRock lmaoo, oh yeahh ! well im stoooopid happy</td>\n",
" <td>9</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1439833</th>\n",
" <td>4</td>\n",
" <td>@KatyinIndy they can't help themselves</td>\n",
" <td>5</td>\n",
" </tr>\n",
" <tr>\n",
" <th>923795</th>\n",
" <td>4</td>\n",
" <td>just finished painting my nails a nice coral colour... I'm feeling all summery</td>\n",
" <td>13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>825942</th>\n",
" <td>4</td>\n",
" <td>@Clippernolan Ya, I was that girl</td>\n",
" <td>6</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1009742</th>\n",
" <td>4</td>\n",
" <td>@wickedmickey Sincere thanks to you. Just signing off for the evening, may your day be divine.</td>\n",
" <td>16</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1549109</th>\n",
" <td>4</td>\n",
" <td>Save up enough money to buy my flute now. Bring on the weekend.</td>\n",
" <td>13</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1007680</th>\n",
" <td>4</td>\n",
" <td>aww bradie and andy are in the trending topics without shaun! #shaundiviney #shaundiviney #shaundiviney #shaundiviney #shaundiviney</td>\n",
" <td>16</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1219958</th>\n",
" <td>4</td>\n",
" <td>@TaniliciousBabe no, she didn't reply to me =( Tanita is nice name too i'm good thanks. and u?</td>\n",
" <td>18</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" label ... word count\n",
"1519359 4 ... 5\n",
"1004219 4 ... 9\n",
"1470971 4 ... 9\n",
"1439833 4 ... 5\n",
"923795 4 ... 13\n",
"825942 4 ... 6\n",
"1009742 4 ... 16\n",
"1549109 4 ... 13\n",
"1007680 4 ... 16\n",
"1219958 4 ... 18\n",
"\n",
"[10 rows x 3 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 16
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "N0FL_8qMcVYc",
"colab_type": "code",
"outputId": "44c352ea-8de2-452e-e392-1cb4c6fc7c5d",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 87
}
},
"source": [
"train.dtypes"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"label int64\n",
"text object\n",
"word count int64\n",
"dtype: object"
]
},
"metadata": {
"tags": []
},
"execution_count": 18
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "KdKFvHyLexoq",
"colab_type": "text"
},
"source": [
"There are quite a many words and characters which are not really required. So, we will try to keep only those words which are important and add value.\n"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "UHXZfv3qonwK",
"colab_type": "text"
},
"source": [
"### 3.2 Data cleaning \n",
"\n",
"In any natural language processing task, cleaning raw text data is an important step. It helps in getting rid of the unwanted words and characters which helps in obtaining better features. \n",
"\n",
"The objective of this step is to clean noise those are less relevant to find the sentiment of tweets such as punctuation, special characters, numbers, and terms which don’t carry much weightage in context to the text."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "fE41DAHEpewF",
"colab_type": "text"
},
"source": [
"We will be following these steps below to clean the raw tweets in out data:\n",
"\n",
"- We will remove HTML special entities\n",
"\n",
"- We will remove the twitter handles. These twitter hardly give any information about the nature of the tweet.\n",
"\n",
"- We will also get rid of the punctuations, numbers and even special characters since they wouldn’t help in differentiating different types of tweets.\n",
"\n",
"- Convert the tweet to lowercase\n",
"\n",
"- We will remove hyperlinks\n",
"\n",
"- We will remove punctuation and split 's, 't, 've with a space for filter\n",
"\n",
"- We will remove whitespace (including new line characters), and single space remaining at the front of the tweet.\n",
"\n",
"- We will also remove characters beyond Basic Multilingual Plane (BMP) of Unicode\n",
"\n",
"- Most of the smaller words do not add much value, so we will remove them as well.\n",
"\n",
"- Lastly, we will normalize the text data. For example, reducing terms like loves, loving, and lovable to their base word, i.e., ‘love’.are often used in the same context. If we can reduce them to their root word, which is ‘love’. It will help in reducing the total number of unique words in our data without losing a significant amount of information."
]
},
{
"cell_type": "code",
"metadata": {
"id": "tpNetK7QSLc4",
"colab_type": "code",
"outputId": "5aeb0cd0-1235-4846-db5f-00eaf813b6f4",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 52
}
},
"source": [
"# Pipeline like preprocessing with helper functions\n",
"\n",
"nltk.download('stopwords')\n",
"stop_words = stopwords.words('english')\n",
"\n",
"# cleaning helper function\n",
"def processTweet(tweet):\n",
" \"\"\"\n",
" Takes in a string of text, then performs the following:\n",
" 1. Removes links, special characters and other bulk cleaning\n",
" 2. Returns a list of the tidy text\n",
" \"\"\"\n",
" # Remove HTML special entities (e.g. &amp;)\n",
" tweet = re.sub(r'\\&\\w*;', '', tweet)\n",
" #Convert @username to AT_USER\n",
" tweet = re.sub('@[^\\s]+','',tweet)\n",
" # Remove tickers\n",
" tweet = re.sub(r'\\$\\w*', '', tweet)\n",
" # To lowercase\n",
" tweet = tweet.lower()\n",
" # Remove hyperlinks\n",
" tweet = re.sub(r'https?:\\/\\/.*\\/\\w*', '', tweet)\n",
" # Remove hashtags\n",
" tweet = re.sub(r'#\\w*', '', tweet)\n",
" # Remove words with 2 or fewer letters\n",
" tweet = re.sub(r'\\b\\w{1,2}\\b', '', tweet)\n",
" # Remove whitespace (including new line characters)\n",
" tweet = re.sub(r'\\s\\s+', ' ', tweet)\n",
" # Remove single space remaining at the front of the tweet.\n",
" tweet = tweet.lstrip(' ') \n",
" # Remove characters beyond Basic Multilingual Plane (BMP) of Unicode:\n",
" tweet = ''.join(c for c in tweet if c <= '\\uFFFF') \n",
" return tweet\n",
"\n",
"# tokenize helper function\n",
"def text_process(tweet):\n",
" \"\"\"\n",
" Takes in a string of text, then performs the following:\n",
" 1. Remove all punctuation\n",
" 2. Remove all stopwords\n",
" 3. Returns a list of the cleaned text\n",
" \"\"\"\n",
" # Check characters to see if they are in punctuation\n",
" nopunc = [char for char in list(tweet) if char not in string.punctuation]\n",
"\n",
" # Join the characters again to form the string.\n",
" nopunc = ''.join(nopunc)\n",
" \n",
" # Now just remove any stopwords\n",
" return [word for word in nopunc.lower().split() if word.lower() not in stopwords.words('english')]\n",
"\n",
"# Lexicon normalisation with Stemming \n",
"def stemming(tokens):\n",
" \"\"\"\n",
" Takes in a string of text, then performs the following:\n",
" 1. Replace words for its root based on orter Stemmer rule.\n",
" 2. Returns normalised text\n",
" \"\"\"\n",
" stemmer = PorterStemmer()\n",
" x = [stemmer.stem(w) for w in tokens]\n",
" \n",
" return ' '.join(x)\n"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"[nltk_data] Downloading package stopwords to /root/nltk_data...\n",
"[nltk_data] Unzipping corpora/stopwords.zip.\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "sUtjZIsbdcI7",
"colab_type": "code",
"colab": {}
},
"source": [
"# Preprocessing\n",
"train['tidy_tweet'] = train.text.apply(processTweet)\n",
"\n",
"# Double check\n",
"train['tidy_tweet'] = train.tidy_tweet.str.replace(\"[^a-zA-Z#]\", \" \") \n",
"\n",
"# tokenize tidy_tweet column and create a column for tokens\n",
"train['tokens'] = train.tidy_tweet.apply(text_process) \n",
"\n",
"#Stemming\n",
"train['tidy_tweet'] = train.tokens.apply(lambda x: stemming(x))\n"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "nZ1_CSCalwZh",
"colab_type": "code",
"outputId": "202bd36f-032b-4487-b268-c778de28bcc0",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 87
}
},
"source": [
"train.tidy_tweet.head(3)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"1519359 love bread\n",
"532647 weight urgh poor laptop burn summer even heat\n",
"1004219 done weekli weigh target woohoo\n",
"Name: tidy_tweet, dtype: object"
]
},
"metadata": {
"tags": []
},
"execution_count": 23
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "zPvn8oQ9qsxN",
"colab_type": "code",
"outputId": "c64b905b-04fe-45f2-acbe-7e64e4ff9c0c",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 191
}
},
"source": [
"train.info()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"Int64Index: 50000 entries, 1519359 to 776577\n",
"Data columns (total 5 columns):\n",
"label 50000 non-null int64\n",
"text 50000 non-null object\n",
"word count 50000 non-null int64\n",
"tidy_tweet 50000 non-null object\n",
"tokens 50000 non-null object\n",
"dtypes: int64(2), object(3)\n",
"memory usage: 2.3+ MB\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZnbCP5hv2al4",
"colab_type": "text"
},
"source": [
"You can see the difference between the raw tweets (`text`) and the cleaned tweets (`tidy_tweet`) quite clearly. Only the important words in the tweets have been retained and the noise (numbers, punctuations, and special characters) has been removed."
]
},
{
"cell_type": "code",
"metadata": {
"id": "7Cbi4tFDmf5M",
"colab_type": "code",
"colab": {}
},
"source": [
"# Save cleaned dataset\n",
"train.to_csv('/content/drive/My Drive/Twitter_Project/cleaned_train_data.csv', index=False)\n"
],
"execution_count": 0,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment