Skip to content

Instantly share code, notes, and snippets.

@sudhanshu456
Created August 15, 2020 17:40
Show Gist options
  • Save sudhanshu456/192a9d380339ce4152a101fa414e28df to your computer and use it in GitHub Desktop.
Save sudhanshu456/192a9d380339ce4152a101fa414e28df to your computer and use it in GitHub Desktop.
tcsrio_project.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"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.7"
},
"colab": {
"name": "tcsrio_project.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"accelerator": "GPU"
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/sudhanshu456/192a9d380339ce4152a101fa414e28df/tcsrio_project.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "sLMjaXaP6BdW",
"colab_type": "text"
},
"source": [
"# Browse Dir"
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": true,
"id": "PPYyhJ006BdX",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "5a1003b2-d2f3-4d01-a490-6aba3f20dfce"
},
"source": [
"!ls"
],
"execution_count": 1,
"outputs": [
{
"output_type": "stream",
"text": [
"sample_data\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "wU_5r4vM6Bdb",
"colab_type": "text"
},
"source": [
"# Load Library"
]
},
{
"cell_type": "code",
"metadata": {
"id": "u--o4F546Bdb",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 306
},
"outputId": "b684f3a8-959a-44cc-8789-ebcbe410203f"
},
"source": [
"!pip install emoji\n",
"import os\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"%matplotlib inline\n",
"import nltk\n",
"nltk.download('punkt')\n",
"nltk.download('stopwords')\n",
"import inflect\n",
"import string\n",
"from textblob import TextBlob\n",
"import emoji\n",
"from sklearn.feature_extraction.text import CountVectorizer\n",
"from sklearn.preprocessing import LabelEncoder\n",
"from nltk.stem.lancaster import LancasterStemmer\n",
"from nltk.tokenize import word_tokenize\n",
"from nltk.corpus import stopwords\n",
"from sklearn.base import BaseEstimator, TransformerMixin\n",
"import seaborn as sns\n",
"sns.set(font_scale=1.3)\n",
"import warnings\n",
"import collections\n",
"warnings.filterwarnings('ignore')\n",
"from collections import Counter"
],
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"text": [
"Collecting emoji\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/ff/1c/1f1457fe52d0b30cbeebfd578483cedb3e3619108d2d5a21380dfecf8ffd/emoji-0.6.0.tar.gz (51kB)\n",
"\r\u001b[K |██████▍ | 10kB 16.3MB/s eta 0:00:01\r\u001b[K |████████████▉ | 20kB 21.2MB/s eta 0:00:01\r\u001b[K |███████████████████▎ | 30kB 25.5MB/s eta 0:00:01\r\u001b[K |█████████████████████████▊ | 40kB 28.0MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 51kB 5.3MB/s \n",
"\u001b[?25hBuilding wheels for collected packages: emoji\n",
" Building wheel for emoji (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
" Created wheel for emoji: filename=emoji-0.6.0-cp36-none-any.whl size=49714 sha256=d2711935abb6ca26b973f5c2de238873e29160f742c21057c6b3851f0960bbd1\n",
" Stored in directory: /root/.cache/pip/wheels/46/2c/8b/9dcf5216ca68e14e0320e283692dce8ae321cdc01e73e17796\n",
"Successfully built emoji\n",
"Installing collected packages: emoji\n",
"Successfully installed emoji-0.6.0\n",
"[nltk_data] Downloading package punkt to /root/nltk_data...\n",
"[nltk_data] Unzipping tokenizers/punkt.zip.\n",
"[nltk_data] Downloading package stopwords to /root/nltk_data...\n",
"[nltk_data] Unzipping corpora/stopwords.zip.\n"
],
"name": "stdout"
},
{
"output_type": "stream",
"text": [
"/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n",
" import pandas.util.testing as tm\n"
],
"name": "stderr"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "olwBfDqF6Bdd",
"colab_type": "text"
},
"source": [
"# Read Data"
]
},
{
"cell_type": "code",
"metadata": {
"id": "2x6c2Fq06kq9",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 121
},
"outputId": "a9fb5242-4a26-4a2c-be3f-1e9a4933c3d9"
},
"source": [
"from google.colab import drive\n",
"drive.mount('/content/drive')"
],
"execution_count": 3,
"outputs": [
{
"output_type": "stream",
"text": [
"Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly&response_type=code\n",
"\n",
"Enter your authorization code:\n",
"··········\n",
"Mounted at /content/drive\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "bMfOI6j_6Bde",
"colab_type": "code",
"colab": {}
},
"source": [
"# dataset from https://www.kaggle.com/lakshmi25npathi/imdb-dataset-of-50k-movie-reviews\n",
"#contain two rows positive and negative\n",
"data=pd.read_csv(\"/content/drive/My Drive/resources/IMDB Dataset.csv\")"
],
"execution_count": 4,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "Q66-oHxV6Bdg",
"colab_type": "text"
},
"source": [
"# Dataset Exploration "
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": true,
"id": "dh-PG5876Bdg",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "8b8ac849-bf76-4abd-9ba7-b92f169f2a5e"
},
"source": [
"data[\"sentiment\"].unique()"
],
"execution_count": 5,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array(['positive', 'negative'], dtype=object)"
]
},
"metadata": {
"tags": []
},
"execution_count": 5
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "EsEqGR936Bdi",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 166
},
"outputId": "3f92856b-5354-4d57-88ad-766747188cd7"
},
"source": [
"data.describe(include='all')\n"
],
"execution_count": 6,
"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>review</th>\n",
" <th>sentiment</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>50000</td>\n",
" <td>50000</td>\n",
" </tr>\n",
" <tr>\n",
" <th>unique</th>\n",
" <td>49582</td>\n",
" <td>2</td>\n",
" </tr>\n",
" <tr>\n",
" <th>top</th>\n",
" <td>Loved today's show!!! It was a variety and not...</td>\n",
" <td>positive</td>\n",
" </tr>\n",
" <tr>\n",
" <th>freq</th>\n",
" <td>5</td>\n",
" <td>25000</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" review sentiment\n",
"count 50000 50000\n",
"unique 49582 2\n",
"top Loved today's show!!! It was a variety and not... positive\n",
"freq 5 25000"
]
},
"metadata": {
"tags": []
},
"execution_count": 6
}
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": true,
"id": "Kh450VvS6Bdk",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 336
},
"outputId": "006fab17-18d5-4630-96cd-eaf1c4b8fd6e"
},
"source": [
"data['sentiment'].value_counts().plot(kind='bar', rot=60)"
],
"execution_count": 7,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x7fd5757d9cf8>"
]
},
"metadata": {
"tags": []
},
"execution_count": 7
},
{
"output_type": "display_data",
"data": {
"image/png": "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qMZqtWK3251qzn3fOTabjdLS0ouu4YiIyJV1xQJl//79Tn/gIyMj2b59u1PNli1bCAoKonXr1o6avLw8KisrnWq8vLzo1KmTo6aoqMix7gKwc+dOqqurnY6SRETk6qpToFRUVHDgwAEOHDgAnD0F+MCBA47rTBYuXEhOTg7ffvstBQUFvPTSS+Tk5DhOBwYYMmQIVquV5ORkCgsL2bhxI+np6SQlJTkW6uPj42natClTpkzh4MGD5OTkMH/+fAYPHoyPz9nDrJiYGMLCwpg8eTJ79+4lNzeX5ORk+vTpozO8RERcyGS322tdRNi5cyfDhw8/b3v37t1ZuXIlKSkpfPbZZ5SUlODt7U3Hjh0ZM2YMvXr1cqrfs2eP4xoUPz8/hg4dyujRo51qDh06xOzZszGbzXh7ezNgwAAmTZqEp6eno6a4uJhZs2axfft23N3due+++5g+fbojdOqqvqyhxE9c7+o2rhuZrw245uep6xONT+PUh7FZ2xpKnQLleqVAaXjqwy9tfaLxaZz6MDZdtigvIiINiwJFREQMoUARERFDKFBERMQQChQRETGEAkVERAyhQBEREUMoUERExBAKFBERMYQCRUREDKFAERERQyhQRETEEAoUERExhAJFREQMoUARERFDKFBERMQQChQRETGEAkVERAyhQBEREUMoUERExBAKFBERMYQCRUREDKFAERERQyhQRETEEAoUERExhAJFREQMoUARERFDKFBERMQQChQRETGEAkVERAxRp0DZvXs3o0eP5q677iI0NJSNGzeeV5OXl0dCQgLh4eHExcWxePHi82oKCwsZMWIEERERREdHk5qaSk1NjVNNcXExY8eOJTIykm7dujF16lTKy8udan7++WemTp1Kt27diIyMZOzYsfzwww+Xst8iImKwOgXKqVOnCA0N5X/+538u+Pjx48cZOXIkt912Gx9//DGTJ09m0aJFvPvuu46a8vJyEhMTadasGRkZGaSmprJ+/XrmzZvnqDlz5gxPPPEEVquVFStW8NZbb5GXl8dzzz3n9PMmT55MXl4eb731FitWrMBisTB69GhsNtvlvAYiImIAj7oUxcXFERcX95uPr1mzBj8/P2bOnInJZKJ9+/YcOnSItLQ0hg8fjslkIjMzk/LycubOnYu3tzdhYWFMmDCBWbNmMX78eHx8fNi2bRsFBQVkZ2cT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ml27dmG328nNzcVqtfLaa6+5uOv6S4Eily0rK4uePXvi4+PDsmXL6NKlC507dz5vneTIkSM0adKEiooKQkJCOH36tOM+XyJXUkVFBU2bNgVg8ODBAPz3f/83PXv2vGB9TU0Nnp6eOk34MilQ5HcrLCzkkUceoV27dvzhD38gNjaWsLAwV7cl4mCz2Xj//ff5xz/+wddff03Pnj15+umnad26NQDV1dV4eHjowsXfSYvycln+/TYUfn5+PPLIIxQVFbFu3ToOHjzI6dOn8fPz0ynC4jI2mw2TyURZWRlffPEFgwYNokOHDjRr1ozc3E/1OxoAAAwbSURBVFwyMjKoqKigS5cueHl56cwuA+gIRX6XefPm0bJlS0aMGAFAfn4+CxYs4NChQ/Tq1Yu7776b2NhYmjRp4uJOpaH56aefaN68OSNHjsTf35+5c+cCZ6e1zGYzWVlZ7Nixg4qKCt544w3Cw8Nd3HH9p0CROjt3evCnn37KkSNHiI2NZeDAgXz88cfcdtttTvc6yszM5O233+bUqVN8+OGH+Pn5ubh7aUgWL17MggULSEpKIj09nS1btuDr6+u0NnLy5Em+/PJLsrKySE5O1tG0ARQockmqq6tJTU0lNzeXH374gdDQUN59912nx728vAAcZ9D06tVLN9aTq+q7775j1apVpKenc+ONN/KXv/yF22+/Hfh1KsxkMlFdXY27u7tu/mgQvXpySby8vJg+fTp33303J0+exGKxMGnSJPbs2eN4HGD//v3885//pFevXoA+5leuruDgYO6++258fX3p0KEDgwYNYuLEiRw7dgw3NzdMJhMffvghzzzzjOOIRWHy+2lRXuokOzubZcuWERcXh7u7O7/88gtRUVGEhYWxd+9ePvvsM44ePUq7du1o3rw5gwYNol27do6bQipQ5GoLDg5m0KBBPPLII4SEhPC///u/LFmyhMrKSioqKnjxxRd58skn6dixo+OoRX4fTXlJnbz33nv4+fnx4IMPsn//ftq3b+84GsnNzeWzzz4jPz8fq9VK8+bNqa6uJjMz08VdS0Pz7/frqqqqcromqrS0lI8++oh33nmHFi1a0LNnT2bNmuWqVq9LChSpk3OLmadPn2bw4MFUVFQwatQoHn74YeDs2snWrVvZv38/AP369aNjx466iFGumnNjtKysjL/97W98/vnneHp6kpSUROfOnWnWrBlwNnSOHDnCTTfdROPGjXURo4EUKFKrc+/67HY7VVVVfPbZZ2zfvp3du3fTtm1bnnzySbp37w44L8qLXE3nxun48eM5duwYffr0IScnh/379xMXF8ef/vQnOnbsiLe3t6tbvW4pUKRW585++fezYP71r3+xdetWNm3axOHDh+nVqxdjxoxxXHkscjWdG5tbt25l4sSJ/O1vfyMoKIhHH32U1q1bU1hYiMViYeDAgTz22GPcfPPNrm75uqTTGqRW50Jk4cKFZGZmYrfbufHGG0lISGDixIk8+uijfPPNNwwYMIDdu3e7uFtpiM6N0Y8//pjBgwcTFBTEBx98gMViYc6cOcyZM4fy8nLS0tLIy8tzcbfXL01uy0WdWwPZtGkT69atY/z48dTU1DimtW677TY6dOhAeHg4u3bt4s4773Rxx9JQlZeXExoa6jj6+PDDD/mv//ovmjRpws0338zAgQMZMWIEt956q4s7vX7pCEUu6tyC+pw5cxgxYgR//OMfcXd355NPPmHo0KHMmTOHmpoaYmJiePrppzGZTPr4VHEJHx8fEhMTiYqKcqzl+fr6AlBZWcnmzZs5deqUi7u8vukIRWq1ZcsWmjdv7rhfV1paGmvXriUyMpIVK1bg7u7Oc8895zhq0QVicrWcWzv5v//7P/z9/WndujWBgYFUV1fTqFEj5s2bx4kTJ9iyZQu33nornTt3dnXL1zVd2Ci1OnXqFBkZGbi7u7Np0yb27NnDkCFDeOaZZ2jcuDHHjh0jLi5OpwfLVWcymSguLmbMmDF8//33NGrUiMDAQBo3bkx0dDTffvstmzdv5o477uCFF16gadOmTnfKFmPpL4DUqn379gwaNIi1a9dSVlbG/PnzHR+Rajabadas2XkfqiVytZSUlGAymVi/fj05OTn88Y9/pE+fPkRERPDqq69SVVWFzWajSZMm2Gw2XXNyBem0YTnPv19tfE51dbXjlhU33XQTFRUVfP7558yYMYNPPvmEli1b6uZ6ctWcO1nk73//O2lpadx9991069aNjRs3snnzZoKCgnj44YeJiYnhlltucXW7DYYCRX5TQUEBX3zxBV5eXnh7e9O/f3/HLb4zMzNZu3YtMTExPPHEE7raWFzi/vvvZ8iQISQmJjq27d+/n0mTJvHTTz8RHR3NI488Qo8ePS74RkmMpUARJ+fe+W3cuJE333yTX375BV9fX06fPk2jRo0YOXIkDzzwAP/85z/58ccfiYuLAy58VCNyJVksFpKSknjssccYNmwY1dXVuLm54eHhwapVq8jIyOD06dPU1NSQnp6ui26vAs1PiJNzC+uzZ8/mscce49NPP+X999/n2WefJTg4mOXLl2OxWLjjjjuIjY0FFCbiGgEBAbRs2ZJPPvkEOPvRCefGb3h4ON26deOvf/0rVVVVZGRkuLLVBkOBIufJysrC39+fhIQEvLy88PLy4t5772XixIkcPXqUpUuXAr/ekl5hIq4yceJEvv32Wx566CE+/fRTAA4dOsSiRYsoKiqiWbNmdO/enR9++IEzZ864uNvrnwJFzhMYGIjVasVsNgNnp8EA2rRpw8MPP4zVaqWmpsaVLUoD9J+z8+Xl5dx2220sXLiQkJAQpk+fTnR0NH/60584evQoKSkpABw7doybbrpJa3xXgU4blvPccssttG7dmpUrV3L77bfj7+/veGz//v0EBwfj6enpwg6lITp3JLx582ays7OprKykWbNmTJs2jalTp/Ldd99x4MABWrZsSdeuXfH39yctLY0jR46wevVqF3ffMGhRXpxO97Xb7VRUVFBWVsb48eP5/vvvGTZsGE2bNuWbb74hOzubTz/9lBtuuEGnCctVc+5kkfXr1/POO+8QGhpKhw4deOONN3jppZd45JFHzvuerVu38tFHH3HPPfcQHx/vgq4bHgWKOLz55pt8+eWXFBcX0759e0aNGsWRI0d466238PLyIiwsjIEDBxIXF6fThMUlYmJieOqppxg2bBiLFi0iKyuLNWvW4Obmxrp164iNjSUoKAg4e/+uH374gbZt27q464ZDU14N3LmjjHfffZf333+f+++/n4ceeogvvviC4cOHk5iYyGeffcaPP/6In5+f4/sUJnK17dixg1atWjF06FDKyspYtmwZr7zyCo0aNeJf//oXu3fvJiAgwBEoTZo0UZhcZQqUBs7NzQ273c4XX3zB5MmTGTBgAACPPfYYmzdv5sUXX6RZs2aMGTPGxZ1KQ9eqVStKS0uxWq3MnTuXrl270qdPH+Ds7Vd2796tcepimgBvwM7dZj43N5dmzZrRtGlT4Ow6it1u59577+Xee+/lH//4B5WVla5sVYSWLVvSpk0bpkyZwubNm5k6dSoAVVVVvPHGG0RGRtKuXTt9fIIL6QilAXNzc6OsrIyUlBSOHj1K48aNueeee5yms+Li4ti2bRuVlZU0adLEhd1KQ3NuOtZutztu6jh79mymTp1KRUUFmzZtwm63c+DAAb799ls+/PBDV7fc4GlRXsjPz2fBggV89dVX9OnThwceeIDY2FgKCwt56aWX8Pf359VXX9VZXeISf/7zn8nNzcXDw4OoqCh69OhBQUEB7777Lj4+PvTs2ZP+/fsTERGhk0VcTIEiwNl3g59++invvPMOZWVleHl5ERgYSHh4OM899xzw66mbIlfauTcvK1euZNmyZcTFxWGz2SgoKOCnn37i8ccfZ+jQobpLwzVGgSJOKioqWLFiBatXryYkJIS+ffsycOBAx/qKyNVit9sZPXo08fHx9O/fnzNnzrBr1y6ys7PJycnB39+fIUOG8NBDD+no+RqhT2wUJ15eXnTr1o0HHngAs9nM1q1b2bt3L9XV1XTo0EHvCOWKs9lsmEwm9uzZw5EjRwgPD6dt27a4ubnRpk0bOnfuTJs2bfj66685efIkffr00bi8RugIRS4qLy+PGTNmEBMT4zirRuRKKysrY+TIkRw9epT+/fuTnJx8Xmh8++23+Pn54ePjo7WTa4QCRWpVU1NDVVWV48O1RK6GcyeLfP3119x77708+OCD9OjRw9VtyUUoUETkmnXmzBk2bdrE0qVLadKkCb169eK+++6jY8eOrm5NLkCBIiLXvIqKCtLS0vj8889p1KgRL7/8MiEhIa5uS/6DAkVE6o1jx46RkZHBxIkTXd2KXIACRUTqJS3EX3sUKCIiYghdCSQiIoZQoIiIiCEUKCIiYggFioiIGEKBIiIihlCgiIiIIf4fmgTs2hSDFPkAAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": true,
"id": "OFe0XO9o6Bdm",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 67
},
"outputId": "f7c5c06f-a03e-4b07-f57c-a4ccc5017978"
},
"source": [
"data.isnull().sum()\n"
],
"execution_count": 8,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"review 0\n",
"sentiment 0\n",
"dtype: int64"
]
},
"metadata": {
"tags": []
},
"execution_count": 8
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZPj9r9IY6Bdp",
"colab_type": "text"
},
"source": [
"## Getting first review to see"
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": true,
"id": "yrBhWm8e6Bdq",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 104
},
"outputId": "2706cbd6-51f9-44eb-a7e4-c3b225108eb9"
},
"source": [
"print(data[\"review\"][0])\n",
"print()\n",
"print(data[\"sentiment\"][0])\n",
"len(data[\"review\"][0])"
],
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"text": [
"One of the other reviewers has mentioned that after watching just 1 Oz episode you'll be hooked. They are right, as this is exactly what happened with me.<br /><br />The first thing that struck me about Oz was its brutality and unflinching scenes of violence, which set in right from the word GO. Trust me, this is not a show for the faint hearted or timid. This show pulls no punches with regards to drugs, sex or violence. Its is hardcore, in the classic use of the word.<br /><br />It is called OZ as that is the nickname given to the Oswald Maximum Security State Penitentary. It focuses mainly on Emerald City, an experimental section of the prison where all the cells have glass fronts and face inwards, so privacy is not high on the agenda. Em City is home to many..Aryans, Muslims, gangstas, Latinos, Christians, Italians, Irish and more....so scuffles, death stares, dodgy dealings and shady agreements are never far away.<br /><br />I would say the main appeal of the show is due to the fact that it goes where other shows wouldn't dare. Forget pretty pictures painted for mainstream audiences, forget charm, forget romance...OZ doesn't mess around. The first episode I ever saw struck me as so nasty it was surreal, I couldn't say I was ready for it, but as I watched more, I developed a taste for Oz, and got accustomed to the high levels of graphic violence. Not just violence, but injustice (crooked guards who'll be sold out for a nickel, inmates who'll kill on order and get away with it, well mannered, middle class inmates being turned into prison bitches due to their lack of street skills or prison experience) Watching Oz, you may become comfortable with what is uncomfortable viewing....thats if you can get in touch with your darker side.\n",
"\n",
"positive\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"1761"
]
},
"metadata": {
"tags": []
},
"execution_count": 9
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "8lCjFC-l6Bds",
"colab_type": "text"
},
"source": [
"# Data Cleaning and Preprocessing"
]
},
{
"cell_type": "code",
"metadata": {
"id": "j8edNd7r6Bds",
"colab_type": "code",
"colab": {}
},
"source": [
"class CleanText(BaseEstimator, TransformerMixin):\n",
" \n",
" def emoji_oneword(self, input_text):\n",
" # By compressing the underscore, the emoji is kept as one word\n",
" return input_text.replace('_','')\n",
" \n",
" def remove_punctuation(self, input_text):\n",
" # Make translation table\n",
" punct = string.punctuation\n",
" trantab = str.maketrans(punct, len(punct)*' ') # Every punctuation symbol will be replaced by a space\n",
" return input_text.translate(trantab) \n",
" \n",
" def remove_html(self,input_text):\n",
" table = str.maketrans('', '', string.punctuation)\n",
" return input_text.replace(\"<br />\",\"\").translate(table)\n",
" \n",
" def number_to_text(self,input_text):\n",
" p = inflect.engine()\n",
" return ' '.join([str(p.number_to_words(((x)))) if x.isnumeric() else x for x in input_text.split()])\n",
" \n",
" \n",
" def to_lower(self, input_text):\n",
" return input_text.lower()\n",
" \n",
" def remove_stopwords(self, input_text):\n",
" stopwords_list = stopwords.words('english')\n",
" # Some words which might indicate a certain sentiment are kept via a whitelist\n",
" whitelist = [\"n't\", \"not\", \"no\"]\n",
" words = input_text.split() \n",
" clean_words = [word for word in words if (word not in stopwords_list or word in whitelist) and len(word) > 1] \n",
" return \" \".join(clean_words) \n",
" \n",
" def stemming(self, input_text):\n",
" stemmer = LancasterStemmer()\n",
" words = input_text.split() \n",
" stemmed_words = [stemmer.stem(word) for word in words]\n",
" return \" \".join(stemmed_words)\n",
" \n",
" def fit(self, X, y=None, **fit_params):\n",
" return self\n",
" \n",
" def transform(self, X, **transform_params):\n",
" clean_X = X.apply(self.emoji_oneword).apply(self.remove_html).apply(self.remove_punctuation).apply(self.number_to_text).apply(self.to_lower).apply(self.remove_stopwords)\n",
" return clean_X"
],
"execution_count": 10,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "no1JWhO76Bdu",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "0c249801-8e9c-41af-89c9-afdb37b02a54"
},
"source": [
"#cleaning text & preprocessing \n",
"ct = CleanText()\n",
"sr_clean = ct.fit_transform(data.review)\n",
"#check is there any review with no text in it after the preprocessing \n",
"empty_clean = sr_clean == ''\n",
"print('{} records have no words left after text cleaning'.format(sr_clean[empty_clean].count()))\n",
"sr_clean.loc[empty_clean] = '[no_text]'"
],
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"text": [
"0 records have no words left after text cleaning\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "IRSA3X3V6Bdw",
"colab_type": "text"
},
"source": [
"### Checking Most Common values"
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": true,
"id": "rCxL0Z0g6Bdw",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 617
},
"outputId": "64e387e8-95c5-41d2-bae6-5cfbe4dca007"
},
"source": [
"#plot the bar char to see the most common from the features \n",
"cv = CountVectorizer()\n",
"bow = cv.fit_transform(sr_clean)\n",
"word_freq = dict(zip(cv.get_feature_names(), np.asarray(bow.sum(axis=0)).ravel()))\n",
"word_counter = collections.Counter(word_freq)\n",
"word_counter_df = pd.DataFrame(word_counter.most_common(20), columns = ['word', 'freq'])\n",
"fig, ax = plt.subplots(figsize=(12, 10))\n",
"sns.barplot(x=\"word\", y=\"freq\", data=word_counter_df, palette=\"PuBuGn_d\", ax=ax)\n",
"plt.show();"
],
"execution_count": 12,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x720 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "v2QZHCJ86Bdy",
"colab_type": "text"
},
"source": [
"### Customizing dataset with three labels as netural, positive & negative"
]
},
{
"cell_type": "code",
"metadata": {
"id": "TMFJ05Ro6Bdz",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 402
},
"outputId": "dfea5550-c63c-4b89-c99f-8f41eece69c3"
},
"source": [
"temp=[]\n",
"for i in range(len(sr_clean)):\n",
" blob=TextBlob(sr_clean[i])\n",
" polarity=blob.sentiment.polarity\n",
" if polarity>0.005 and polarity <= 0.04:\n",
" temp.append(\"neutral\")\n",
" elif polarity > 0.04:\n",
" temp.append('positive')\n",
" else:\n",
" temp.append('negative')\n",
"\n",
"labels = pd.DataFrame({'sentiment_polarity':temp})\n",
"labels"
],
"execution_count": 13,
"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>sentiment_polarity</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>positive</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>positive</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>negative</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>positive</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49995</th>\n",
" <td>positive</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49996</th>\n",
" <td>negative</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49997</th>\n",
" <td>positive</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49998</th>\n",
" <td>negative</td>\n",
" </tr>\n",
" <tr>\n",
" <th>49999</th>\n",
" <td>positive</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>50000 rows × 1 columns</p>\n",
"</div>"
],
"text/plain": [
" sentiment_polarity\n",
"0 neutral\n",
"1 positive\n",
"2 positive\n",
"3 negative\n",
"4 positive\n",
"... ...\n",
"49995 positive\n",
"49996 negative\n",
"49997 positive\n",
"49998 negative\n",
"49999 positive\n",
"\n",
"[50000 rows x 1 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 13
}
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": false,
"id": "NdO5YjsJ6Bd0",
"colab_type": "code",
"colab": {}
},
"source": [
"data['clean_data']=sr_clean\n",
"data[\"sentiment_polarity\"]=labels"
],
"execution_count": 14,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "zYkIJi8F6Bd2",
"colab_type": "text"
},
"source": [
"### Data After the cleaning and feature engineering"
]
},
{
"cell_type": "code",
"metadata": {
"id": "s5P0dFIj6Bd2",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 343
},
"outputId": "7d162f11-f741-4676-df8c-e047cd62cffb"
},
"source": [
"data.head(10)"
],
"execution_count": 15,
"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>review</th>\n",
" <th>sentiment</th>\n",
" <th>clean_data</th>\n",
" <th>sentiment_polarity</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>One of the other reviewers has mentioned that ...</td>\n",
" <td>positive</td>\n",
" <td>one reviewers mentioned watching one oz episod...</td>\n",
" <td>neutral</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>A wonderful little production. &lt;br /&gt;&lt;br /&gt;The...</td>\n",
" <td>positive</td>\n",
" <td>wonderful little production filming technique ...</td>\n",
" <td>positive</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>I thought this was a wonderful way to spend ti...</td>\n",
" <td>positive</td>\n",
" <td>thought wonderful way spend time hot summer we...</td>\n",
" <td>positive</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Basically there's a family where a little boy ...</td>\n",
" <td>negative</td>\n",
" <td>basically theres family little boy jake thinks...</td>\n",
" <td>negative</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Petter Mattei's \"Love in the Time of Money\" is...</td>\n",
" <td>positive</td>\n",
" <td>petter matteis love time money visually stunni...</td>\n",
" <td>positive</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Probably my all-time favorite movie, a story o...</td>\n",
" <td>positive</td>\n",
" <td>probably alltime favorite movie story selfless...</td>\n",
" <td>positive</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>I sure would like to see a resurrection of a u...</td>\n",
" <td>positive</td>\n",
" <td>sure would like see resurrection dated seahunt...</td>\n",
" <td>positive</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>This show was an amazing, fresh &amp; innovative i...</td>\n",
" <td>negative</td>\n",
" <td>show amazing fresh innovative idea 70s first a...</td>\n",
" <td>positive</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>Encouraged by the positive comments about this...</td>\n",
" <td>negative</td>\n",
" <td>encouraged positive comments film looking forw...</td>\n",
" <td>negative</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>If you like original gut wrenching laughter yo...</td>\n",
" <td>positive</td>\n",
" <td>like original gut wrenching laughter like movi...</td>\n",
" <td>positive</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" review ... sentiment_polarity\n",
"0 One of the other reviewers has mentioned that ... ... neutral\n",
"1 A wonderful little production. <br /><br />The... ... positive\n",
"2 I thought this was a wonderful way to spend ti... ... positive\n",
"3 Basically there's a family where a little boy ... ... negative\n",
"4 Petter Mattei's \"Love in the Time of Money\" is... ... positive\n",
"5 Probably my all-time favorite movie, a story o... ... positive\n",
"6 I sure would like to see a resurrection of a u... ... positive\n",
"7 This show was an amazing, fresh & innovative i... ... positive\n",
"8 Encouraged by the positive comments about this... ... negative\n",
"9 If you like original gut wrenching laughter yo... ... positive\n",
"\n",
"[10 rows x 4 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 15
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "7452rV-m6Bd8",
"colab_type": "text"
},
"source": [
"Checking stopwords and how tokenization will happen "
]
},
{
"cell_type": "code",
"metadata": {
"id": "fbG9RX176Bd9",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 54
},
"outputId": "3981fbca-9adf-486f-8d36-fd235d361488"
},
"source": [
"stop_words = set(stopwords.words('english'))\n",
"print(stop_words)"
],
"execution_count": 89,
"outputs": [
{
"output_type": "stream",
"text": [
"{'on', \"shouldn't\", 'by', 'this', 'before', 'couldn', 'because', \"couldn't\", 'hadn', 'up', 'not', 'mustn', 'themselves', 'do', 'our', 'and', 'those', 'in', 'here', 'only', 'who', 'yourselves', 'does', 'off', 'doesn', 'through', \"mightn't\", \"weren't\", 'd', 'itself', 'theirs', 'so', 'hasn', 'mightn', \"needn't\", 'about', 'down', 'under', 'below', 'we', \"you'd\", 'what', 'didn', 'his', 'few', 'such', 'will', 'why', 'shouldn', 'ain', 'whom', 'now', 'her', 'i', 'if', 'most', 'your', 'am', 'above', 'again', 'no', 'll', 'yours', 'he', 'is', 'some', 'being', 'with', 'nor', 'all', 'for', 'are', 'were', 'any', 'myself', \"should've\", \"it's\", \"don't\", \"you're\", 'very', 'it', 'more', 'you', 'won', 'hers', 'isn', 'than', \"didn't\", 'which', 'their', 'when', \"won't\", 'm', 'just', \"aren't\", 't', 'wouldn', 'until', 'each', 'did', 'had', 'at', 'an', \"doesn't\", 'too', 're', \"hadn't\", 'haven', 'needn', 'between', 'o', 'doing', \"you've\", 'has', 'these', 'while', 'to', 'weren', \"wouldn't\", 'have', 'aren', 'wasn', 'or', 'out', 'y', 'having', 'that', 'once', 'him', 'them', 'don', 'further', \"mustn't\", 'me', 'yourself', 'into', 'its', 'they', 'was', 'after', 'ma', 'she', 's', 'a', \"isn't\", 'same', \"shan't\", 've', \"she's\", 'ourselves', 'as', 'where', 'should', 'over', \"that'll\", 'against', \"haven't\", 'the', 'during', \"you'll\", 'herself', 'own', 'shan', 'but', \"hasn't\", 'how', \"wasn't\", 'then', 'himself', 'ours', 'other', 'both', 'of', 'from', 'can', 'been', 'my', 'there', 'be'}\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "c3F9jskE6Bd_",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 54
},
"outputId": "32500c3d-d7bb-435a-bb92-688c06e50fc7"
},
"source": [
"word_tokens = word_tokenize(data[\"clean_data\"][0])\n",
"filteres_review= [w for w in word_tokens if not w in stop_words]\n",
"print(filteres_review)"
],
"execution_count": 90,
"outputs": [
{
"output_type": "stream",
"text": [
"['one', 'reviewers', 'mentioned', 'watching', 'one', 'oz', 'episode', 'youll', 'hooked', 'right', 'exactly', 'happened', 'methe', 'first', 'thing', 'struck', 'oz', 'brutality', 'unflinching', 'scenes', 'violence', 'set', 'right', 'word', 'go', 'trust', 'show', 'faint', 'hearted', 'timid', 'show', 'pulls', 'punches', 'regards', 'drugs', 'sex', 'violence', 'hardcore', 'classic', 'use', 'wordit', 'called', 'oz', 'nickname', 'given', 'oswald', 'maximum', 'security', 'state', 'penitentary', 'focuses', 'mainly', 'emerald', 'city', 'experimental', 'section', 'prison', 'cells', 'glass', 'fronts', 'face', 'inwards', 'privacy', 'high', 'agenda', 'em', 'city', 'home', 'manyaryans', 'muslims', 'gangstas', 'latinos', 'christians', 'italians', 'irish', 'moreso', 'scuffles', 'death', 'stares', 'dodgy', 'dealings', 'shady', 'agreements', 'never', 'far', 'awayi', 'would', 'say', 'main', 'appeal', 'show', 'due', 'fact', 'goes', 'shows', 'wouldnt', 'dare', 'forget', 'pretty', 'pictures', 'painted', 'mainstream', 'audiences', 'forget', 'charm', 'forget', 'romanceoz', 'doesnt', 'mess', 'around', 'first', 'episode', 'ever', 'saw', 'struck', 'nasty', 'surreal', 'couldnt', 'say', 'ready', 'watched', 'developed', 'taste', 'oz', 'got', 'accustomed', 'high', 'levels', 'graphic', 'violence', 'violence', 'injustice', 'crooked', 'guards', 'wholl', 'sold', 'nickel', 'inmates', 'wholl', 'kill', 'order', 'get', 'away', 'well', 'mannered', 'middle', 'class', 'inmates', 'turned', 'prison', 'bitches', 'due', 'lack', 'street', 'skills', 'prison', 'experience', 'watching', 'oz', 'may', 'become', 'comfortable', 'uncomfortable', 'viewingthats', 'get', 'touch', 'darker', 'side']\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "7rtHQN0mMQb8",
"colab_type": "text"
},
"source": [
"Common word in one review "
]
},
{
"cell_type": "code",
"metadata": {
"id": "4u0wiNsB6BeA",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 218
},
"outputId": "b3cad440-c1aa-4e64-fe79-dfb7c8506806"
},
"source": [
"from nltk.probability import FreqDist\n",
"fdist = FreqDist(filteres_review)\n",
"print('Sampling ', fdist)\n",
"print('The first 3 frequently used tokens are')\n",
"fdist.most_common(10)\n"
],
"execution_count": 91,
"outputs": [
{
"output_type": "stream",
"text": [
"Sampling <FreqDist with 142 samples and 168 outcomes>\n",
"The first 3 frequently used tokens are\n"
],
"name": "stdout"
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"[('oz', 5),\n",
" ('violence', 4),\n",
" ('show', 3),\n",
" ('prison', 3),\n",
" ('forget', 3),\n",
" ('one', 2),\n",
" ('watching', 2),\n",
" ('episode', 2),\n",
" ('right', 2),\n",
" ('first', 2)]"
]
},
"metadata": {
"tags": []
},
"execution_count": 91
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "40kLUWCR6BeC",
"colab_type": "text"
},
"source": [
"## Checking Outliers"
]
},
{
"cell_type": "code",
"metadata": {
"id": "tniZYpyd6BeC",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 84
},
"outputId": "10799e77-a80f-44b6-f159-52db5ae51208"
},
"source": [
"review_lens = Counter([len(x) for x in data[\"clean_data\"].values])\n",
"print(\"Zero-length reviews: {}\".format(review_lens[0]))\n",
"print(\"Maximum review length: {}\".format(max(review_lens)))\n",
"print('Number of reviews before removing outliers: ', len(data['clean_data']))\n",
"zero_idx = [ii for ii, review in enumerate(data.clean_data) if len(review)==0]\n",
"print(zero_idx,\"index of review with 0 length\")"
],
"execution_count": 34,
"outputs": [
{
"output_type": "stream",
"text": [
"Zero-length reviews: 0\n",
"Maximum review length: 9306\n",
"Number of reviews before removing outliers: 50000\n",
"[] index of review with 0 length\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": false,
"id": "vhfstPLs6BeE",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 195
},
"outputId": "e0b38675-24a8-42eb-a351-4902fbcad184"
},
"source": [
"data.head()"
],
"execution_count": 47,
"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>review</th>\n",
" <th>sentiment</th>\n",
" <th>clean_data</th>\n",
" <th>sentiment_polarity</th>\n",
" <th>label</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>One of the other reviewers has mentioned that ...</td>\n",
" <td>positive</td>\n",
" <td>one reviewers mentioned watching one oz episod...</td>\n",
" <td>neutral</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>A wonderful little production. &lt;br /&gt;&lt;br /&gt;The...</td>\n",
" <td>positive</td>\n",
" <td>wonderful little production filming technique ...</td>\n",
" <td>positive</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>I thought this was a wonderful way to spend ti...</td>\n",
" <td>positive</td>\n",
" <td>thought wonderful way spend time hot summer we...</td>\n",
" <td>positive</td>\n",
" <td>0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>Basically there's a family where a little boy ...</td>\n",
" <td>negative</td>\n",
" <td>basically theres family little boy jake thinks...</td>\n",
" <td>negative</td>\n",
" <td>1</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>Petter Mattei's \"Love in the Time of Money\" is...</td>\n",
" <td>positive</td>\n",
" <td>petter matteis love time money visually stunni...</td>\n",
" <td>positive</td>\n",
" <td>0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" review ... label\n",
"0 One of the other reviewers has mentioned that ... ... 0\n",
"1 A wonderful little production. <br /><br />The... ... 0\n",
"2 I thought this was a wonderful way to spend ti... ... 0\n",
"3 Basically there's a family where a little boy ... ... 1\n",
"4 Petter Mattei's \"Love in the Time of Money\" is... ... 0\n",
"\n",
"[5 rows x 5 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 47
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "0wAim9Y86BeG",
"colab_type": "text"
},
"source": [
"Unique values in label after feature enginnering"
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": true,
"id": "uBUBOmCd6BeG",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "cdb922d8-cbf4-432c-8e43-36e9f6b352a9"
},
"source": [
"data[\"sentiment_polarity\"].unique()\n"
],
"execution_count": 36,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array(['neutral', 'positive', 'negative'], dtype=object)"
]
},
"metadata": {
"tags": []
},
"execution_count": 36
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "e3BzWjof6BeK",
"colab_type": "text"
},
"source": [
"Encoding Labels"
]
},
{
"cell_type": "code",
"metadata": {
"id": "pJ1Vn_UM6BeK",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "35539965-fd7a-44a1-81af-37593dda57d0"
},
"source": [
"# encodeedd = {\"sentiment_polarity\":{\"positive\": 1, \"negative\":2,\"neutral\":3 }}\n",
"labels = {value: idx for idx, value in enumerate(data['sentiment'].unique())}\n",
"labels"
],
"execution_count": 37,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'negative': 1, 'positive': 0}"
]
},
"metadata": {
"tags": []
},
"execution_count": 37
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "hZlfk0bC6BeM",
"colab_type": "code",
"colab": {}
},
"source": [
"# data.replace(encodeedd, inplace=True)\n",
"data['label'] = data['sentiment'].apply(lambda x: labels[x])\n"
],
"execution_count": 38,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "gb0GE9b26BeO",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 67
},
"outputId": "e14a7131-2e69-4c4c-bad8-b505e1639474"
},
"source": [
"data['label'].value_counts()"
],
"execution_count": 39,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"1 25000\n",
"0 25000\n",
"Name: label, dtype: int64"
]
},
"metadata": {
"tags": []
},
"execution_count": 39
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "ZFmnhK7A6BeR",
"colab_type": "text"
},
"source": [
"# Modeling,Training & Testing"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cCfw5Zbl6BeS",
"colab_type": "text"
},
"source": [
"Import required models and metrics from sciktlearn"
]
},
{
"cell_type": "code",
"metadata": {
"id": "QJ-Y3mRd6BeS",
"colab_type": "code",
"colab": {}
},
"source": [
"from sklearn.model_selection import train_test_split\n",
"from sklearn.feature_extraction.text import TfidfTransformer\n",
"from sklearn.feature_extraction.text import TfidfVectorizer\n",
"from sklearn.naive_bayes import MultinomialNB\n",
"from sklearn.linear_model import LogisticRegression\n",
"from sklearn.ensemble import RandomForestClassifier\n",
"from sklearn.metrics import classification_report, confusion_matrix, accuracy_score\n",
"from sklearn.linear_model import SGDClassifier\n",
"from sklearn.model_selection import RandomizedSearchCV\n",
"from sklearn.model_selection import GridSearchCV\n",
"from scipy.stats import uniform\n"
],
"execution_count": 40,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "q1H7Nm7e6BeU",
"colab_type": "text"
},
"source": [
"Spiliting the dataset into train and test with 90:10 ratio"
]
},
{
"cell_type": "code",
"metadata": {
"id": "b2EFza0J6BeU",
"colab_type": "code",
"colab": {}
},
"source": [
"#first trainig and spliting of data and using count vectorizer and tfidtransformer\n",
"X_train, X_test, y_train, y_test = train_test_split(data[\"clean_data\"], data['label'],test_size=0.1, random_state=42)"
],
"execution_count": 48,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "JrsdG9Dq6BeX",
"colab_type": "text"
},
"source": [
"Count Vectorizer"
]
},
{
"cell_type": "code",
"metadata": {
"id": "HQbvqy7w6BeY",
"colab_type": "code",
"colab": {}
},
"source": [
"# Extracting Count Vectors Parameters\n",
"count_vect = CountVectorizer(analyzer='word')\n",
"count_vect.fit(data['clean_data'])\n",
"X_train_count = count_vect.transform(X_train)\n",
"X_test_count = count_vect.transform(X_test)"
],
"execution_count": 49,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "vx6owq196BeZ",
"colab_type": "text"
},
"source": [
"TFIDF Vectorizer"
]
},
{
"cell_type": "code",
"metadata": {
"id": "LB-2FC0R6BeZ",
"colab_type": "code",
"colab": {}
},
"source": [
"# Extracting TF-IDF parameters\n",
"tfidf = TfidfVectorizer(max_features=1000, analyzer='word',sublinear_tf=True, min_df=2000, norm='l2', encoding='latin-1', ngram_range=(1, 2), stop_words='english')\n",
"tfidf.fit(data['clean_data'])\n",
"X_train_tfidf = tfidf.transform(X_train)\n",
"X_test_tfidf = tfidf.transform(X_test)"
],
"execution_count": 50,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "dzb2tf0-6Bec",
"colab_type": "text"
},
"source": [
"MultiNomialNB Using TFIDF vectorizer"
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": true,
"id": "GesB8IAi6Bed",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 218
},
"outputId": "a91bbdd6-43c1-4940-a534-e8a687992f70"
},
"source": [
"#model used here is MultinomailNB TFIDF \n",
"clf_tfidf_MNB = MultinomialNB().fit(X_train_tfidf, y_train)\n",
"print(confusion_matrix(y_test,clf_tfidf_MNB.predict(X_test_tfidf)))\n",
"print(classification_report(y_test,clf_tfidf_MNB.predict(X_test_tfidf)))\n",
"print(accuracy_score(y_test,clf_tfidf_MNB.predict(X_test_tfidf),normalize=True))"
],
"execution_count": 51,
"outputs": [
{
"output_type": "stream",
"text": [
"[[2072 447]\n",
" [ 545 1936]]\n",
" precision recall f1-score support\n",
"\n",
" 0 0.79 0.82 0.81 2519\n",
" 1 0.81 0.78 0.80 2481\n",
"\n",
" accuracy 0.80 5000\n",
" macro avg 0.80 0.80 0.80 5000\n",
"weighted avg 0.80 0.80 0.80 5000\n",
"\n",
"0.8016\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "rwCI0DpN6Bee",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
},
"outputId": "740199fc-6125-47db-a9f6-ac06dd0b3263"
},
"source": [
"test_text=tfidf.transform([\"you're very bad\"])\n",
"x=clf_tfidf_MNB.predict(test_text)\n",
"x"
],
"execution_count": 53,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array([1])"
]
},
"metadata": {
"tags": []
},
"execution_count": 53
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "9NOQt4b66Beg",
"colab_type": "text"
},
"source": [
"Using Count Vectorizer"
]
},
{
"cell_type": "code",
"metadata": {
"id": "Smw_dg3E6Beg",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 218
},
"outputId": "85a7f7b9-a8ee-4ab0-ec29-a46d5f7b1740"
},
"source": [
"#model used here is MultinomailNB TFIDF \n",
"clf_count_vect_MNB = MultinomialNB().fit(X_train_count, y_train)\n",
"print(confusion_matrix(y_test,clf_count_vect_MNB.predict(X_test_count)))\n",
"print(classification_report(y_test,clf_count_vect_MNB.predict(X_test_count)))\n",
"print(accuracy_score(y_test,clf_count_vect_MNB.predict(X_test_count),normalize=True))"
],
"execution_count": 54,
"outputs": [
{
"output_type": "stream",
"text": [
"[[2135 384]\n",
" [ 304 2177]]\n",
" precision recall f1-score support\n",
"\n",
" 0 0.88 0.85 0.86 2519\n",
" 1 0.85 0.88 0.86 2481\n",
"\n",
" accuracy 0.86 5000\n",
" macro avg 0.86 0.86 0.86 5000\n",
"weighted avg 0.86 0.86 0.86 5000\n",
"\n",
"0.8624\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Uz3HeSVT6Bei",
"colab_type": "text"
},
"source": [
"Random Forest Using TFIDF"
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": true,
"id": "-yapE5tL6Bei",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 218
},
"outputId": "343b322f-e72c-4016-a378-6b1dc0431a4e"
},
"source": [
"#Second model used Random Forest upon the same dataset\n",
"clf_tfidf_RondomFC = RandomForestClassifier().fit(X_train_tfidf, y_train)\n",
"#prediction from Random Forest classifer\n",
"# metrics of evaluation of performance of model\n",
"print(confusion_matrix(y_test,clf_tfidf_RondomFC.predict(X_test_tfidf)))\n",
"print(classification_report(y_test,clf_tfidf_RondomFC.predict(X_test_tfidf)))\n",
"print(accuracy_score(y_test,clf_tfidf_RondomFC.predict(X_test_tfidf)))"
],
"execution_count": 55,
"outputs": [
{
"output_type": "stream",
"text": [
"[[2110 409]\n",
" [ 534 1947]]\n",
" precision recall f1-score support\n",
"\n",
" 0 0.80 0.84 0.82 2519\n",
" 1 0.83 0.78 0.81 2481\n",
"\n",
" accuracy 0.81 5000\n",
" macro avg 0.81 0.81 0.81 5000\n",
"weighted avg 0.81 0.81 0.81 5000\n",
"\n",
"0.8114\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "hqHo1kaM6Bel",
"colab_type": "text"
},
"source": [
"Random Forest Using Count Vectorizer"
]
},
{
"cell_type": "code",
"metadata": {
"id": "AL4goO2U6Bel",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 218
},
"outputId": "5ec55c45-cf94-40cf-ff8e-11c8c6e326b4"
},
"source": [
"#Second model used Random Forest upon the same dataset\n",
"clf_count_RondomFC = RandomForestClassifier().fit(X_train_count, y_train)\n",
"#prediction from Random Forest classifer\n",
"# metrics of evaluation of performance of model\n",
"print(confusion_matrix(y_test,clf_count_RondomFC.predict(X_test_count)))\n",
"print(classification_report(y_test,clf_count_RondomFC.predict(X_test_count)))\n",
"print(accuracy_score(y_test,clf_count_RondomFC.predict(X_test_count)))"
],
"execution_count": 56,
"outputs": [
{
"output_type": "stream",
"text": [
"[[2200 319]\n",
" [ 381 2100]]\n",
" precision recall f1-score support\n",
"\n",
" 0 0.85 0.87 0.86 2519\n",
" 1 0.87 0.85 0.86 2481\n",
"\n",
" accuracy 0.86 5000\n",
" macro avg 0.86 0.86 0.86 5000\n",
"weighted avg 0.86 0.86 0.86 5000\n",
"\n",
"0.86\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xwnES4aM6Ben",
"colab_type": "text"
},
"source": [
"SGDClassifer using randomizedSearchCV TFIDF vectorizer"
]
},
{
"cell_type": "code",
"metadata": {
"id": "rbvDqY_j6Ben",
"colab_type": "code",
"colab": {}
},
"source": [
"#using randomSearchCV and SGDclassifer here\n",
"clfSGD = SGDClassifier()\n",
"distributions = dict(\n",
" loss=['hinge', 'log', 'modified_huber', 'squared_hinge', 'perceptron'],\n",
" learning_rate=['optimal', 'invscaling', 'adaptive'],\n",
" eta0=uniform(loc=1e-7, scale=1e-2)\n",
")\n",
"\n",
"random_search_TFIDF_cv = RandomizedSearchCV(\n",
" estimator=clfSGD,\n",
" param_distributions=distributions,\n",
" cv=5,\n",
" n_iter=50\n",
")\n",
"random_search_COUNT_cv = RandomizedSearchCV(\n",
" estimator=clfSGD,\n",
" param_distributions=distributions,\n",
" cv=5,\n",
" n_iter=50\n",
")"
],
"execution_count": 57,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "YcaoxndS6Beq",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 101
},
"outputId": "e01a9006-5c4a-4098-b69f-8849eb7cc695"
},
"source": [
"random_search_TFIDF_cv.fit(X_train_tfidf, y_train)\n",
"print(f'Best params: {random_search_TFIDF_cv.best_params_}')\n",
"print(f'Best score: {random_search_TFIDF_cv.best_score_}')\n",
"train_score = random_search_TFIDF_cv.score(X_train_tfidf, y_train)\n",
"valid_score = random_search_TFIDF_cv.score(X_test_tfidf,y_test)\n",
"print(f'\\nTrain score: {round(train_score, 2)} ; Test score: {round(valid_score, 2)}\\n')"
],
"execution_count": 58,
"outputs": [
{
"output_type": "stream",
"text": [
"Best params: {'eta0': 0.0036105064457279228, 'learning_rate': 'adaptive', 'loss': 'squared_hinge'}\n",
"Best score: 0.8196666666666665\n",
"\n",
"Train score: 0.82 ; Test score: 0.82\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xGgqwGrB6Bes",
"colab_type": "text"
},
"source": [
"SGDClassifer using randomizedSearchCV Count vectorizer"
]
},
{
"cell_type": "code",
"metadata": {
"id": "3viBvCj36Bes",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 101
},
"outputId": "f6b4680a-8106-4cba-d1e8-69d606ba94e6"
},
"source": [
"random_search_COUNT_cv.fit(X_train_count, y_train)\n",
"print(f'Best params: {random_search_COUNT_cv.best_params_}')\n",
"print(f'Best score: {random_search_COUNT_cv.best_score_}')\n",
"train_score = random_search_COUNT_cv.score(X_train_count, y_train)\n",
"valid_score = random_search_COUNT_cv.score(X_test_count,y_test)\n",
"print(f'\\nTrain score: {round(train_score, 2)} ; Test score: {round(valid_score, 2)}\\n')"
],
"execution_count": 59,
"outputs": [
{
"output_type": "stream",
"text": [
"Best params: {'eta0': 0.002336132788972425, 'learning_rate': 'adaptive', 'loss': 'log'}\n",
"Best score: 0.8900222222222223\n",
"\n",
"Train score: 0.97 ; Test score: 0.89\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HGSrzQEV6Bev",
"colab_type": "text"
},
"source": [
"Logistic Regression TFIDF Vectorizer"
]
},
{
"cell_type": "code",
"metadata": {
"scrolled": true,
"id": "bTOl3WE66Bev",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 218
},
"outputId": "91b96308-99cd-4a5d-b771-aaf07f42c5ea"
},
"source": [
"logst_tfidf=LogisticRegression()\n",
"logst_tfidf.fit(X_train_tfidf, y_train) \n",
"# metrics of evaluation of performance of model\n",
"print(confusion_matrix(y_test,logst_tfidf.predict(X_test_tfidf)))\n",
"print(classification_report(y_test,logst_tfidf.predict(X_test_tfidf)))\n",
"print(accuracy_score(y_test, logst_tfidf.predict(X_test_tfidf)))"
],
"execution_count": 60,
"outputs": [
{
"output_type": "stream",
"text": [
"[[2120 399]\n",
" [ 501 1980]]\n",
" precision recall f1-score support\n",
"\n",
" 0 0.81 0.84 0.82 2519\n",
" 1 0.83 0.80 0.81 2481\n",
"\n",
" accuracy 0.82 5000\n",
" macro avg 0.82 0.82 0.82 5000\n",
"weighted avg 0.82 0.82 0.82 5000\n",
"\n",
"0.82\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Hp89Cs9R6Bey",
"colab_type": "text"
},
"source": [
"Logistic Regression Count Vectorizer "
]
},
{
"cell_type": "code",
"metadata": {
"id": "LF6L8Oya6Bez",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 218
},
"outputId": "83e0fdb6-038f-49a2-ff7f-30d850d28274"
},
"source": [
"logst_count=LogisticRegression()\n",
"logst_count.fit(X_train_count, y_train) \n",
"# metrics of evaluation of performance of model\n",
"print(confusion_matrix(y_test,logst_count.predict(X_test_count)))\n",
"print(classification_report(y_test,logst_count.predict(X_test_count)))\n",
"print(accuracy_score(y_test, logst_count.predict(X_test_count)))"
],
"execution_count": 61,
"outputs": [
{
"output_type": "stream",
"text": [
"[[2250 269]\n",
" [ 293 2188]]\n",
" precision recall f1-score support\n",
"\n",
" 0 0.88 0.89 0.89 2519\n",
" 1 0.89 0.88 0.89 2481\n",
"\n",
" accuracy 0.89 5000\n",
" macro avg 0.89 0.89 0.89 5000\n",
"weighted avg 0.89 0.89 0.89 5000\n",
"\n",
"0.8876\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "cYCSze6U6Be0",
"colab_type": "text"
},
"source": [
"SVM using Grid SearchCV TFIDF Vectorizer"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Z-H1Tqc8MYZX",
"colab_type": "text"
},
"source": [
"**Tensorflow Modeling**"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "XYYDvoskkE61",
"colab": {}
},
"source": [
"import tensorflow as tf\n",
"from tensorflow.keras.preprocessing.text import Tokenizer\n",
"from tensorflow.keras.preprocessing.sequence import pad_sequences"
],
"execution_count": 62,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "mB_sbF7aMeAf",
"colab_type": "text"
},
"source": [
"Params"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "0eJSTTYnkJQd",
"colab": {}
},
"source": [
"vocab_size = 10000\n",
"embedding_dim = 200\n",
"max_length = 500\n",
"trunc_type='post'\n",
"padding_type='post'\n",
"oov_tok = \"<OOV>\"\n"
],
"execution_count": 63,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "wKdseZ6eMgAp",
"colab_type": "text"
},
"source": [
"Recheck dataset"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "oaLaaqhNkUPd",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 823
},
"outputId": "cfd529b2-79d3-456c-a40c-a5c398e5955e"
},
"source": [
"X_train, X_test, y_train, y_test"
],
"execution_count": 64,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(40877 recently started watching show say really made...\n",
" 18057 return jedi often remembered wrong rather righ...\n",
" 19066 remember loved movie came twelve years old com...\n",
" 20525 dont know last reviewer talking show pure ente...\n",
" 5847 beginning excited see movie poster possibly fu...\n",
" ... \n",
" 11284 shadow magic recaptures joy amazement first mo...\n",
" 44732 found movie quite enjoyable fairly entertainin...\n",
" 38158 avoid one terrible movie exciting pointless mu...\n",
" 860 production quite surprise absolutely love obsc...\n",
" 15795 decent movie although little bit short time pa...\n",
" Name: clean_data, Length: 45000, dtype: object,\n",
" 33553 really liked summerslam due look arena curtain...\n",
" 9427 not many television shows appeal quite many di...\n",
" 199 film quickly gets major chase scene ever incre...\n",
" 12447 jane austen would definitely approve onegwynet...\n",
" 39489 expectations somewhat high went see movie thou...\n",
" ... \n",
" 39885 one eastwoods best movies separated westerns g...\n",
" 17566 blurred childhood memories kept echo cult seri...\n",
" 16062 love zombiemovies love amateurproductions meat...\n",
" 48445 chan new york gets involved attempt sabotage n...\n",
" 20382 wife thought film watereddown madefortv bbc ve...\n",
" Name: clean_data, Length: 5000, dtype: object,\n",
" 40877 0\n",
" 18057 0\n",
" 19066 1\n",
" 20525 0\n",
" 5847 0\n",
" ..\n",
" 11284 0\n",
" 44732 0\n",
" 38158 1\n",
" 860 0\n",
" 15795 0\n",
" Name: label, Length: 45000, dtype: int64,\n",
" 33553 0\n",
" 9427 0\n",
" 199 1\n",
" 12447 0\n",
" 39489 1\n",
" ..\n",
" 39885 0\n",
" 17566 1\n",
" 16062 1\n",
" 48445 0\n",
" 20382 1\n",
" Name: label, Length: 5000, dtype: int64)"
]
},
"metadata": {
"tags": []
},
"execution_count": 64
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "6CbUg_q5MjP5",
"colab_type": "text"
},
"source": [
"Assign data"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "S1sD-7v0kYWk",
"colab": {}
},
"source": [
"training_sentences = X_train\n",
"testing_sentences = X_test\n",
"training_labels = y_train\n",
"testing_labels = y_test"
],
"execution_count": 65,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "sLpzKE5PMmS4",
"colab_type": "text"
},
"source": [
"Tokenier from Tensorflow and Padding of sentences"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "3u8UB0MCkZ5N",
"colab": {}
},
"source": [
"tokenizer = Tokenizer(num_words=vocab_size, oov_token=oov_tok)\n",
"tokenizer.fit_on_texts(training_sentences)\n",
"\n",
"word_index = tokenizer.word_index\n",
"\n",
"training_sequences = tokenizer.texts_to_sequences(training_sentences)\n",
"training_padded = pad_sequences(training_sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)\n",
"\n",
"testing_sequences = tokenizer.texts_to_sequences(testing_sentences)\n",
"testing_padded = pad_sequences(testing_sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)"
],
"execution_count": 66,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "-YkDzlzDMrnv",
"colab_type": "text"
},
"source": [
"# Need this block to get it to work with TensorFlow 2.x\n"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "GrAlWBKf99Ya",
"colab": {}
},
"source": [
"\n",
"training_padded = np.array(training_padded)\n",
"training_labels = np.array(training_labels)\n",
"testing_padded = np.array(testing_padded)\n",
"testing_labels = np.array(testing_labels)"
],
"execution_count": 67,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "WVrcp_wtMu1c",
"colab_type": "text"
},
"source": [
"Defining model structure "
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "FufaT4vlkiDE",
"colab": {}
},
"source": [
"model = tf.keras.Sequential([\n",
" tf.keras.layers.Embedding(vocab_size, embedding_dim, input_length=max_length),\n",
" tf.keras.layers.GlobalAveragePooling1D(),\n",
" tf.keras.layers.Dense(24, activation='relu'),\n",
" tf.keras.layers.Dense(1, activation='sigmoid')\n",
"])\n",
"model.compile(loss='binary_crossentropy',optimizer='adam',metrics=['accuracy'])"
],
"execution_count": 68,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "OJZvwe9GMyS5",
"colab_type": "text"
},
"source": [
"Print the Summary "
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "XfDt1hmYkiys",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 286
},
"outputId": "ad7368b1-89ca-4e44-8100-74b713397715"
},
"source": [
"model.summary()\n"
],
"execution_count": 69,
"outputs": [
{
"output_type": "stream",
"text": [
"Model: \"sequential\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"embedding (Embedding) (None, 500, 200) 2000000 \n",
"_________________________________________________________________\n",
"global_average_pooling1d (Gl (None, 200) 0 \n",
"_________________________________________________________________\n",
"dense (Dense) (None, 24) 4824 \n",
"_________________________________________________________________\n",
"dense_1 (Dense) (None, 1) 25 \n",
"=================================================================\n",
"Total params: 2,004,849\n",
"Trainable params: 2,004,849\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rekv18MNM0f9",
"colab_type": "text"
},
"source": [
"Train the model and Epoch = 5"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "2DTKQFf1kkyc",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 185
},
"outputId": "50b236bc-db9e-4bd3-a572-171cbd8dd810"
},
"source": [
"num_epochs = 5\n",
"history = model.fit(training_padded, training_labels, epochs=num_epochs, validation_data=(testing_padded, testing_labels), verbose=2)"
],
"execution_count": 70,
"outputs": [
{
"output_type": "stream",
"text": [
"Epoch 1/5\n",
"1407/1407 - 42s - loss: 0.3887 - accuracy: 0.8249 - val_loss: 0.2737 - val_accuracy: 0.8882\n",
"Epoch 2/5\n",
"1407/1407 - 42s - loss: 0.2322 - accuracy: 0.9096 - val_loss: 0.2598 - val_accuracy: 0.8986\n",
"Epoch 3/5\n",
"1407/1407 - 42s - loss: 0.2024 - accuracy: 0.9222 - val_loss: 0.2665 - val_accuracy: 0.8972\n",
"Epoch 4/5\n",
"1407/1407 - 42s - loss: 0.1827 - accuracy: 0.9304 - val_loss: 0.2826 - val_accuracy: 0.8930\n",
"Epoch 5/5\n",
"1407/1407 - 42s - loss: 0.1695 - accuracy: 0.9360 - val_loss: 0.2873 - val_accuracy: 0.8926\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "v6q8o4jpM3gp",
"colab_type": "text"
},
"source": [
"Plot graph between Accuracy and Loss ,val_loss"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "2HYfBKXjkmU8",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 568
},
"outputId": "8f7c4372-f2c9-4801-deac-c5be0db7c4a3"
},
"source": [
"\n",
"def plot_graphs(history, string):\n",
" plt.plot(history.history[string])\n",
" plt.plot(history.history['val_'+string])\n",
" plt.xlabel(\"Epochs\")\n",
" plt.ylabel(string)\n",
" plt.legend([string, 'val_'+string])\n",
" plt.show()\n",
" \n",
"plot_graphs(history, \"accuracy\")\n",
"plot_graphs(history, \"loss\")"
],
"execution_count": 71,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "2Xzd823gNBKR",
"colab_type": "text"
},
"source": [
"get the labeled output from customize function to filter the output from model "
]
},
{
"cell_type": "code",
"metadata": {
"id": "4ig-LGZFLG-N",
"colab_type": "code",
"colab": {}
},
"source": [
"def predict_fun(scores):\n",
" if scores>=.4 and scores<0.6:\n",
" print(\"neutral\")\n",
" elif scores>0.6:\n",
" print(\"negative\")\n",
" elif scores<0.4:\n",
" print(\"positive\")"
],
"execution_count": 83,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "ghUR_yk7NIV2",
"colab_type": "text"
},
"source": [
"Try yourself , examples"
]
},
{
"cell_type": "code",
"metadata": {
"colab_type": "code",
"id": "cG8-ArY-qDcz",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 67
},
"outputId": "ad6cb9a3-27a5-44c6-b00f-e5d7302882b9"
},
"source": [
"sentence = [\"granny starting bad movie this movie spiders in the garden might be real\", \"game showing this sunday night\",\"Awesome movie that was i will watch again\"]\n",
"sequences = tokenizer.texts_to_sequences(sentence)\n",
"padded = pad_sequences(sequences, maxlen=max_length, padding=padding_type, truncating=trunc_type)\n",
"\n",
"\n",
"predict_fun(model.predict(padded)[0])\n",
"predict_fun(model.predict(padded)[1])\n",
"predict_fun(model.predict(padded)[2])"
],
"execution_count": 88,
"outputs": [
{
"output_type": "stream",
"text": [
"negative\n",
"neutral\n",
"positive\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "MEDghh3KDJRy",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 88,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "Urc--hNwLWO0",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment