Skip to content

Instantly share code, notes, and snippets.

@ia35
Created May 15, 2020 13:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ia35/2436508e019786d0b91c1444b91bb05d to your computer and use it in GitHub Desktop.
Save ia35/2436508e019786d0b91c1444b91bb05d to your computer and use it in GitHub Desktop.
BBCTextClassifier-using-tokenizer.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "BBCTextClassifier-using-tokenizer.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/ia35/2436508e019786d0b91c1444b91bb05d/bbctextclassifier-using-tokenizer.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "4E0HqY07b4KZ",
"colab_type": "text"
},
"source": [
"[![](http://bec552ebfe.url-de-test.ws/ml/buttonBackProp.png)](https://www.backprop.fr)"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pR5WM29Sb7om",
"colab_type": "text"
},
"source": [
"Ce code est fortement inspiré de \"[A Complete Multi-Class Text Classifier Step by Step](https://mc.ai/a-complete-multi-class-text-classifier-step-by-step/)\" lui même (je suppose) fortement inspiré des cours de Laurence Moroney de Google Brain"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "yu56O-g2ceQU",
"colab_type": "text"
},
"source": [
"[![](https://raw.githubusercontent.com/BackProp-fr/meetup/master/images/LogoBackPropTranspSmall.png)](https://www.backprop.fr)\n",
"Le logo BackProp est présenté chaque fois qu'un ajout, une modification importante est apportée au code ou à chaque fois qu'un commentaire doit être signalé. \n",
"\n",
"Le texte en anglais est soit le texte d'origine soit un extrait de site qui apporte des explications."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "P62sQPM-ciV9",
"colab_type": "text"
},
"source": [
"## <font color=\"teal\">Références</font>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "1e-Mt8dHckNh",
"colab_type": "text"
},
"source": [
"- A [Complete](https://mc.ai/a-complete-multi-class-text-classifier-step-by-step/) Multi-Class Text Classifier Step by Step"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "V8WYZ-5Zc5BH",
"colab_type": "text"
},
"source": [
"## <font color=\"teal\">Problem Statement</font>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "HMzz1F3Xc25M",
"colab_type": "text"
},
"source": [
"The focus of this article is to explain the process of text classification using Tensorflow and python. \n",
"\n",
"The dataset I will use here is bbc-text dataset. \n",
"\n",
"It has two columns: category and text. \n",
"\n",
"Category column is label like: tech, sport, politics, entertainment. We will develop a model that will train on this dataset, so it will be able to predict the label from the text. \n",
"\n",
"Text column contains the article related to that category or label. \n",
"\n",
"I choose this dataset because this dataset has so many classes not just ‘good’, ‘very good’, ‘bad’, ‘very bad’. This same model can be used for sentiment analysis, product review analysis, social media comments classification or movie recommendation system and many other purposes."
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "rt1wutcLdk97",
"colab_type": "text"
},
"source": [
"## <font color=\"teal\">Imports</font>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "8DO18Oe1QlHL",
"colab_type": "code",
"colab": {}
},
"source": [
"import csv\n",
"import tensorflow as tf\n",
"import numpy as np\n",
"from tensorflow.keras.preprocessing.text import Tokenizer\n",
"from tensorflow.keras.preprocessing.sequence import pad_sequences"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "l4h4eGrGagCH",
"colab_type": "code",
"outputId": "0c9a7ce7-165d-44c7-8bcb-6ac39942215a",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 220
}
},
"source": [
"!wget --no-check-certificate \\\n",
" https://storage.googleapis.com/laurencemoroney-blog.appspot.com/bbc-text.csv \\\n",
" -O /tmp/bbc-text.csv"
],
"execution_count": 5,
"outputs": [
{
"output_type": "stream",
"text": [
"--2020-05-15 13:32:57-- https://storage.googleapis.com/laurencemoroney-blog.appspot.com/bbc-text.csv\n",
"Resolving storage.googleapis.com (storage.googleapis.com)... 74.125.195.128, 2607:f8b0:400e:c05::80\n",
"Connecting to storage.googleapis.com (storage.googleapis.com)|74.125.195.128|:443... connected.\n",
"HTTP request sent, awaiting response... 200 OK\n",
"Length: 5057493 (4.8M) [application/octet-stream]\n",
"Saving to: ‘/tmp/bbc-text.csv’\n",
"\n",
"\r/tmp/bbc-text.csv 0%[ ] 0 --.-KB/s \r/tmp/bbc-text.csv 100%[===================>] 4.82M --.-KB/s in 0.03s \n",
"\n",
"2020-05-15 13:32:57 (161 MB/s) - ‘/tmp/bbc-text.csv’ saved [5057493/5057493]\n",
"\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "PF5btEbQe9TX",
"colab_type": "text"
},
"source": [
"- vocab_size: vocab_size takes a specific amount of words based on their appearance in the input text of the training data.\n",
"\n",
"- embedding_dim: I am choosing Embedding dimension as 16. That means for each vector there will be 16 coefficient initialized in the beginning. You can choose other values and experiment with it.\n",
"\n",
"- Max_length: will be passed as input size in the embedding layer. That way, input of each text will be the same.\n",
"\n",
"- trunc_type: If the length of the input text of one input is more than max_length, it will be truncated automatically. I am setting trunc_type ‘post’. That means it will be truncated at the end.\n",
"\n",
"- Padding_type: If the text is smaller than max_length, it will add padding of zeros to make the length input length equal to the max_length. I am setting padding_type as ‘post’ here so that it adds the padding at the end not in the beginning of the sentences.\n",
"\n",
"- oov_tok: We will find lots of words that our model may not see in the training data. Those words are out of vocabulary words. Here we will replace those words with ‘<OOV>’.\n",
"\n",
"- Training_portion: It is a regular practice to train the model with 80% or 75% data from the dataset and save the rest to test the model. That way we will be able to check out model with some known data. That way we will be able to learn about the efficiency of the model.\n",
"\n",
"Next step is to prepare the labels and texts in an individual arrays to train the model. There is one more thing that is worth working on. In a text file there are lots of words that are used to make the sentences correct but not necessarily contribute to the theme or idea such as ‘about’, ‘me’, ‘more’, ‘during’. We call them stopwords. These words can easily be discarded so that our model can focus on more important and key words. Here is the code to make sentences and labels array. Also to remove the stopwords from sentences."
]
},
{
"cell_type": "code",
"metadata": {
"id": "3NxD-AR1SBKP",
"colab_type": "code",
"colab": {}
},
"source": [
"vocab_size = 10000\n",
"embedding_dim = 16\n",
"max_length = 250\n",
"trunc_type = 'post'\n",
"padding_type = 'post'\n",
"oov_tok = '<OOV>'\n",
"training_portion = 0.8"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "mdTQK8trSdJ6",
"colab_type": "code",
"outputId": "8f269dbc-ceab-49bd-eb51-8a1b428e39ab",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 54
}
},
"source": [
"sentences = []\n",
"labels = []\n",
"stopwords = [ \"a\", \"about\", \"above\", \"after\", \"again\", \"against\", \"all\", \"am\", \"an\", \"and\", \"any\", \"are\", \"as\", \"at\", \"be\", \"because\", \"been\", \"before\", \"being\", \"below\", \"between\", \"both\", \"but\", \"by\", \"could\", \"did\", \"do\", \"does\", \"doing\", \"down\", \"during\", \"each\", \"few\", \"for\", \"from\", \"further\", \"had\", \"has\", \"have\", \"having\", \"he\", \"he'd\", \"he'll\", \"he's\", \"her\", \"here\", \"here's\", \"hers\", \"herself\", \"him\", \"himself\", \"his\", \"how\", \"how's\", \"i\", \"i'd\", \"i'll\", \"i'm\", \"i've\", \"if\", \"in\", \"into\", \"is\", \"it\", \"it's\", \"its\", \"itself\", \"let's\", \"me\", \"more\", \"most\", \"my\", \"myself\", \"nor\", \"of\", \"on\", \"once\", \"only\", \"or\", \"other\", \"ought\", \"our\", \"ours\", \"ourselves\", \"out\", \"over\", \"own\", \"same\", \"she\", \"she'd\", \"she'll\", \"she's\", \"should\", \"so\", \"some\", \"such\", \"than\", \"that\", \"that's\", \"the\", \"their\", \"theirs\", \"them\", \"themselves\", \"then\", \"there\", \"there's\", \"these\", \"they\", \"they'd\", \"they'll\", \"they're\", \"they've\", \"this\", \"those\", \"through\", \"to\", \"too\", \"under\", \"until\", \"up\", \"very\", \"was\", \"we\", \"we'd\", \"we'll\", \"we're\", \"we've\", \"were\", \"what\", \"what's\", \"when\", \"when's\", \"where\", \"where's\", \"which\", \"while\", \"who\", \"who's\", \"whom\", \"why\", \"why's\", \"with\", \"would\", \"you\", \"you'd\", \"you'll\", \"you're\", \"you've\", \"your\", \"yours\", \"yourself\", \"yourselves\" ]\n",
"print(len(stopwords))"
],
"execution_count": 7,
"outputs": [
{
"output_type": "stream",
"text": [
"153\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "ksTPArWNSoUj",
"colab_type": "code",
"outputId": "02afad8a-bd98-43d9-e201-7b082e8c4f58",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 87
}
},
"source": [
"with open(\"/tmp/bbc-text.csv\", 'r') as csvfile:\n",
" reader = csv.reader(csvfile, delimiter=',')\n",
" next(reader)\n",
" for row in reader:\n",
" labels.append(row[0])\n",
" sentence = row[1]\n",
" for word in stopwords:\n",
" token = \" \" + word + \" \"\n",
" sentence = sentence.replace(token, \" \")\n",
" sentences.append(sentence)\n",
"\n",
"print(len(labels))\n",
"print(len(sentences))\n",
"print(sentences[0])"
],
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"text": [
"2225\n",
"2225\n",
"tv future hands viewers home theatre systems plasma high-definition tvs digital video recorders moving living room way people watch tv will radically different five years time. according expert panel gathered annual consumer electronics show las vegas discuss new technologies will impact one favourite pastimes. us leading trend programmes content will delivered viewers via home networks cable satellite telecoms companies broadband service providers front rooms portable devices. one talked-about technologies ces digital personal video recorders (dvr pvr). set-top boxes like us s tivo uk s sky+ system allow people record store play pause forward wind tv programmes want. essentially technology allows much personalised tv. also built-in high-definition tv sets big business japan us slower take off europe lack high-definition programming. not can people forward wind adverts can also forget abiding network channel schedules putting together a-la-carte entertainment. us networks cable satellite companies worried means terms advertising revenues well brand identity viewer loyalty channels. although us leads technology moment also concern raised europe particularly growing uptake services like sky+. happens today will see nine months years time uk adam hume bbc broadcast s futurologist told bbc news website. likes bbc no issues lost advertising revenue yet. pressing issue moment commercial uk broadcasters brand loyalty important everyone. will talking content brands rather network brands said tim hanlon brand communications firm starcom mediavest. reality broadband connections anybody can producer content. added: challenge now hard promote programme much choice. means said stacey jolna senior vice president tv guide tv group way people find content want watch simplified tv viewers. means networks us terms channels take leaf google s book search engine future instead scheduler help people find want watch. kind channel model might work younger ipod generation used taking control gadgets play them. might not suit everyone panel recognised. older generations comfortable familiar schedules channel brands know getting. perhaps not want much choice put hands mr hanlon suggested. end kids just diapers pushing buttons already - everything possible available said mr hanlon. ultimately consumer will tell market want. 50 000 new gadgets technologies showcased ces many enhancing tv-watching experience. high-definition tv sets everywhere many new models lcd (liquid crystal display) tvs launched dvr capability built instead external boxes. one example launched show humax s 26-inch lcd tv 80-hour tivo dvr dvd recorder. one us s biggest satellite tv companies directtv even launched branded dvr show 100-hours recording capability instant replay search function. set can pause rewind tv 90 hours. microsoft chief bill gates announced pre-show keynote speech partnership tivo called tivotogo means people can play recorded programmes windows pcs mobile devices. reflect increasing trend freeing multimedia people can watch want want.\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "bBB7HUICgCiF",
"colab_type": "text"
},
"source": [
"[![](https://raw.githubusercontent.com/BackProp-fr/meetup/master/images/LogoBackPropTranspSmall.png)](https://www.backprop.fr)"
]
},
{
"cell_type": "code",
"metadata": {
"id": "m5uHBx24fsuR",
"colab_type": "code",
"colab": {}
},
"source": [
"import pandas as pd"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "BkPL69gwfv6S",
"colab_type": "code",
"colab": {}
},
"source": [
"dfSentences=pd.DataFrame(sentences)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "HpD-O5S7f8Tw",
"colab_type": "code",
"outputId": "0621456f-5a60-474b-af62-26fef9bb09dd",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 221
}
},
"source": [
"dfSentences.head()"
],
"execution_count": 11,
"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>0</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>tv future hands viewers home theatre systems ...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>worldcom boss left books alone former worldc...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>tigers wary farrell gamble leicester say wil...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>yeading face newcastle fa cup premiership side...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>ocean s twelve raids box office ocean s twelve...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0\n",
"0 tv future hands viewers home theatre systems ...\n",
"1 worldcom boss left books alone former worldc...\n",
"2 tigers wary farrell gamble leicester say wil...\n",
"3 yeading face newcastle fa cup premiership side...\n",
"4 ocean s twelve raids box office ocean s twelve..."
]
},
"metadata": {
"tags": []
},
"execution_count": 11
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "fp1uOV6fgNG1",
"colab_type": "code",
"outputId": "3dd73fbd-cad7-4c48-ca63-ea09c1bffbc3",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 191
}
},
"source": [
"dfSentences.describe()"
],
"execution_count": 12,
"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>0</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>count</th>\n",
" <td>2225</td>\n",
" </tr>\n",
" <tr>\n",
" <th>unique</th>\n",
" <td>2123</td>\n",
" </tr>\n",
" <tr>\n",
" <th>top</th>\n",
" <td>kennedy questions trust blair lib dem leader c...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>freq</th>\n",
" <td>2</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0\n",
"count 2225\n",
"unique 2123\n",
"top kennedy questions trust blair lib dem leader c...\n",
"freq 2"
]
},
"metadata": {
"tags": []
},
"execution_count": 12
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "IeJRG-LziOB_",
"colab_type": "code",
"colab": {}
},
"source": [
"dfLabels=pd.DataFrame(labels)"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "kyUmVVfZif0H",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 71
},
"outputId": "ba545ac5-033c-4b47-8cfa-9b71cb9bd0b7"
},
"source": [
"dfLabels[0].unique()"
],
"execution_count": 16,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"array(['tech', 'business', 'sport', 'entertainment', 'politics'],\n",
" dtype=object)"
]
},
"metadata": {
"tags": []
},
"execution_count": 16
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "t_iXAHEQjiEI",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 374
},
"outputId": "583c6bd7-9486-4388-9fb8-0f6cc2791c29"
},
"source": [
"dfLabels.head(10)"
],
"execution_count": 27,
"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>0</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>tech</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>business</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>sport</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>sport</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>entertainment</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>politics</td>\n",
" </tr>\n",
" <tr>\n",
" <th>6</th>\n",
" <td>politics</td>\n",
" </tr>\n",
" <tr>\n",
" <th>7</th>\n",
" <td>sport</td>\n",
" </tr>\n",
" <tr>\n",
" <th>8</th>\n",
" <td>sport</td>\n",
" </tr>\n",
" <tr>\n",
" <th>9</th>\n",
" <td>entertainment</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 0\n",
"0 tech\n",
"1 business\n",
"2 sport\n",
"3 sport\n",
"4 entertainment\n",
"5 politics\n",
"6 politics\n",
"7 sport\n",
"8 sport\n",
"9 entertainment"
]
},
"metadata": {
"tags": []
},
"execution_count": 27
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "gWLyEBkZVx0c",
"colab_type": "code",
"outputId": "c9de30a4-20cc-4919-d3d0-6b0c91dd8227",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 120
}
},
"source": [
"train_size = int(training_portion * len(labels))\n",
"\n",
"train_sentences = sentences[:train_size]\n",
"train_labels = labels[:train_size]\n",
"\n",
"validation_sentences = sentences[train_size:]\n",
"validation_labels = labels[train_size:]\n",
"\n",
"print(train_size)\n",
"print(len(train_sentences))\n",
"print(len(train_labels))\n",
"print(len(validation_sentences))\n",
"print(len(validation_labels))"
],
"execution_count": 17,
"outputs": [
{
"output_type": "stream",
"text": [
"1780\n",
"1780\n",
"1780\n",
"445\n",
"445\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "THR3difjWwnx",
"colab_type": "code",
"outputId": "801604fd-2d15-47d7-e75d-543761f1e857",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 137
}
},
"source": [
"tokenizer = Tokenizer(num_words = vocab_size, oov_token = oov_tok)\n",
"tokenizer.fit_on_texts(train_sentences)\n",
"word_index = tokenizer.word_index\n",
"\n",
"train_sequences = tokenizer.texts_to_sequences(train_sentences)\n",
"train_padded = pad_sequences(train_sequences, padding=padding_type, maxlen=max_length)\n",
"\n",
"print(len(train_sequences[0]))\n",
"print(len(train_padded[0]))\n",
"\n",
"print(len(train_sequences[1]))\n",
"print(len(train_padded[1]))\n",
"\n",
"print(len(train_sequences[10]))\n",
"print(len(train_padded[10]))"
],
"execution_count": 18,
"outputs": [
{
"output_type": "stream",
"text": [
"449\n",
"250\n",
"200\n",
"250\n",
"192\n",
"250\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "esct7MBBdMtk",
"colab_type": "code",
"outputId": "5f044bbc-d40e-449a-e080-ccdeae23fe46",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 71
}
},
"source": [
"validation_sequences = tokenizer.texts_to_sequences(validation_sentences)\n",
"validation_padded = pad_sequences(validation_sequences, padding = padding_type, maxlen=max_length)\n",
"\n",
"print(len(validation_labels))\n",
"print(validation_padded.shape)"
],
"execution_count": 19,
"outputs": [
{
"output_type": "stream",
"text": [
"445\n",
"(445, 250)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "Oku_n7lBeVA3",
"colab_type": "code",
"colab": {}
},
"source": [
"label_tokenizer = Tokenizer()\n",
"label_tokenizer.fit_on_texts(labels)\n",
"\n",
"training_label_seq = np.array(label_tokenizer.texts_to_sequences(train_labels))\n",
"validation_label_seq = np.array(label_tokenizer.texts_to_sequences(validation_labels))"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "9ew1V9D5kAOm",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 54
},
"outputId": "ed0d2c8d-de5b-4ad7-e7cb-4bc0cf0e845d"
},
"source": [
"label_tokenizer.index_word"
],
"execution_count": 30,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{1: 'sport', 2: 'business', 3: 'politics', 4: 'tech', 5: 'entertainment'}"
]
},
"metadata": {
"tags": []
},
"execution_count": 30
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "_T9XNwhVfQRS",
"colab_type": "code",
"outputId": "1e03df0c-227e-449f-c9bc-badffe61a10b",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 170
}
},
"source": [
"print(training_label_seq[0])\n",
"print(training_label_seq[1])\n",
"print(training_label_seq[2])\n",
"print(training_label_seq.shape)\n",
"\n",
"print(validation_label_seq[0])\n",
"print(validation_label_seq[1])\n",
"print(validation_label_seq[2])\n",
"print(validation_label_seq.shape)"
],
"execution_count": 21,
"outputs": [
{
"output_type": "stream",
"text": [
"[4]\n",
"[2]\n",
"[1]\n",
"(1780, 1)\n",
"[5]\n",
"[4]\n",
"[3]\n",
"(445, 1)\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "x1uEr_JdfQ4u",
"colab_type": "code",
"outputId": "412fca84-04f6-4ff0-e592-e7f2bea879cc",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 302
}
},
"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(6, activation='softmax')\n",
"])\n",
"\n",
"model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])\n",
"model.summary()"
],
"execution_count": 37,
"outputs": [
{
"output_type": "stream",
"text": [
"Model: \"sequential_5\"\n",
"_________________________________________________________________\n",
"Layer (type) Output Shape Param # \n",
"=================================================================\n",
"embedding_5 (Embedding) (None, 250, 16) 160000 \n",
"_________________________________________________________________\n",
"global_average_pooling1d_5 ( (None, 16) 0 \n",
"_________________________________________________________________\n",
"dense_10 (Dense) (None, 24) 408 \n",
"_________________________________________________________________\n",
"dense_11 (Dense) (None, 6) 150 \n",
"=================================================================\n",
"Total params: 160,558\n",
"Trainable params: 160,558\n",
"Non-trainable params: 0\n",
"_________________________________________________________________\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "_Z5Ot8gckh0-",
"colab_type": "code",
"outputId": "34d306f1-d76c-46fe-830e-9539406c15e7",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 699
}
},
"source": [
"num_epochs = 20\n",
"history = model.fit(train_padded, training_label_seq, epochs = num_epochs, validation_data=(validation_padded, validation_label_seq), verbose=2)"
],
"execution_count": 38,
"outputs": [
{
"output_type": "stream",
"text": [
"Epoch 1/20\n",
"56/56 - 0s - loss: 1.7662 - accuracy: 0.2551 - val_loss: 1.7294 - val_accuracy: 0.2966\n",
"Epoch 2/20\n",
"56/56 - 0s - loss: 1.6599 - accuracy: 0.4000 - val_loss: 1.5865 - val_accuracy: 0.4157\n",
"Epoch 3/20\n",
"56/56 - 0s - loss: 1.4570 - accuracy: 0.5652 - val_loss: 1.3540 - val_accuracy: 0.6315\n",
"Epoch 4/20\n",
"56/56 - 0s - loss: 1.1777 - accuracy: 0.7034 - val_loss: 1.0757 - val_accuracy: 0.7281\n",
"Epoch 5/20\n",
"56/56 - 0s - loss: 0.8998 - accuracy: 0.8197 - val_loss: 0.8481 - val_accuracy: 0.8315\n",
"Epoch 6/20\n",
"56/56 - 0s - loss: 0.6894 - accuracy: 0.8871 - val_loss: 0.6863 - val_accuracy: 0.8652\n",
"Epoch 7/20\n",
"56/56 - 0s - loss: 0.5346 - accuracy: 0.9354 - val_loss: 0.5708 - val_accuracy: 0.8697\n",
"Epoch 8/20\n",
"56/56 - 0s - loss: 0.4141 - accuracy: 0.9478 - val_loss: 0.4696 - val_accuracy: 0.9056\n",
"Epoch 9/20\n",
"56/56 - 0s - loss: 0.3157 - accuracy: 0.9697 - val_loss: 0.3930 - val_accuracy: 0.9258\n",
"Epoch 10/20\n",
"56/56 - 0s - loss: 0.2396 - accuracy: 0.9820 - val_loss: 0.3326 - val_accuracy: 0.9393\n",
"Epoch 11/20\n",
"56/56 - 0s - loss: 0.1816 - accuracy: 0.9888 - val_loss: 0.2854 - val_accuracy: 0.9461\n",
"Epoch 12/20\n",
"56/56 - 0s - loss: 0.1398 - accuracy: 0.9927 - val_loss: 0.2518 - val_accuracy: 0.9528\n",
"Epoch 13/20\n",
"56/56 - 0s - loss: 0.1093 - accuracy: 0.9949 - val_loss: 0.2289 - val_accuracy: 0.9528\n",
"Epoch 14/20\n",
"56/56 - 0s - loss: 0.0870 - accuracy: 0.9961 - val_loss: 0.2101 - val_accuracy: 0.9528\n",
"Epoch 15/20\n",
"56/56 - 0s - loss: 0.0702 - accuracy: 0.9966 - val_loss: 0.1969 - val_accuracy: 0.9551\n",
"Epoch 16/20\n",
"56/56 - 0s - loss: 0.0574 - accuracy: 0.9978 - val_loss: 0.1851 - val_accuracy: 0.9551\n",
"Epoch 17/20\n",
"56/56 - 0s - loss: 0.0473 - accuracy: 0.9994 - val_loss: 0.1778 - val_accuracy: 0.9551\n",
"Epoch 18/20\n",
"56/56 - 0s - loss: 0.0397 - accuracy: 0.9994 - val_loss: 0.1706 - val_accuracy: 0.9551\n",
"Epoch 19/20\n",
"56/56 - 0s - loss: 0.0335 - accuracy: 1.0000 - val_loss: 0.1630 - val_accuracy: 0.9528\n",
"Epoch 20/20\n",
"56/56 - 0s - loss: 0.0286 - accuracy: 1.0000 - val_loss: 0.1595 - val_accuracy: 0.9551\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "jRfdUrTygIvJ",
"colab_type": "code",
"outputId": "bc922596-fec2-4b6a-d178-1b3a97f2aeab",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 561
}
},
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"\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": 39,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
},
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": [],
"needs_background": "light"
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "zeuoCJmaj7hx",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 0,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment