diff --git a/.ipynb_checkpoints/3a. Taxon Autocorrect with LSTM Autoencoders-checkpoint.ipynb b/.ipynb_checkpoints/3a. Taxon Autocorrect with LSTM Autoencoders-checkpoint.ipynb
new file mode 100644
index 0000000..35d545b
--- /dev/null
+++ b/.ipynb_checkpoints/3a. Taxon Autocorrect with LSTM Autoencoders-checkpoint.ipynb
@@ -0,0 +1,1425 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# 3a. Autocorrecting Mispelt Taxon Names with Autoencoders\n",
+ "Given a list of taxon names, can we build an autocorrect model to autonomously fix erroneous records?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 184,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import matplotlib\n",
+ "import random\n",
+ "import string\n",
+ "from keras.models import Model\n",
+ "from keras.preprocessing import sequence\n",
+ "from keras.layers import Input, LSTM, Dense"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exploring the dataset\n",
+ "We'll use the same dataset as last time; a publically available list of UK exports from 1975 - 2016. We'll only need the taxon names so we'll restrict our import to the taxon column."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 185,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Taxon | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Varanus flavescens | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Varanus griseus | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " Branta ruficollis | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " Leopardus pardalis | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " Leopardus wiedii | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " Diceros bicornis | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " Asarcornis scutulata | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " Branta sandvicensis | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " Branta sandvicensis | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " Cercopithecus diana | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " Rucervus duvaucelii | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " Crocodylus siamensis | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " Elephas maximus | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " Elephas maximus | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " Elephas maximus | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " Elephas maximus | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " Falco peregrinus | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " Acinonyx jubatus | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " Catopuma temminckii | \n",
+ "
\n",
+ " \n",
+ " 22 | \n",
+ " Leopardus jacobitus | \n",
+ "
\n",
+ " \n",
+ " 23 | \n",
+ " Leopardus pardalis mearnsi | \n",
+ "
\n",
+ " \n",
+ " 24 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " 25 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " 26 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " 27 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " 28 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " 29 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 49339 | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 49340 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49341 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49342 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49343 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49344 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49345 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49346 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49347 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49348 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49349 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49350 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49351 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49352 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49353 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49354 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49355 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49356 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49357 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49358 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49359 | \n",
+ " Lodoicea maldivica | \n",
+ "
\n",
+ " \n",
+ " 49360 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49361 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49362 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49363 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49364 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49365 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49366 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49367 | \n",
+ " Alligator mississippiensis | \n",
+ "
\n",
+ " \n",
+ " 49368 | \n",
+ " Varanus salvator | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
49369 rows × 1 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Taxon\n",
+ "0 Equus przewalskii\n",
+ "1 Panthera onca\n",
+ "2 Varanus flavescens\n",
+ "3 Varanus griseus\n",
+ "4 Branta ruficollis\n",
+ "5 Leopardus pardalis\n",
+ "6 Leopardus wiedii\n",
+ "7 Diceros bicornis\n",
+ "8 Asarcornis scutulata\n",
+ "9 Branta sandvicensis\n",
+ "10 Branta sandvicensis\n",
+ "11 Cercopithecus diana\n",
+ "12 Rucervus duvaucelii\n",
+ "13 Crocodylus siamensis\n",
+ "14 Elephas maximus\n",
+ "15 Elephas maximus\n",
+ "16 Elephas maximus\n",
+ "17 Elephas maximus\n",
+ "18 Equus przewalskii\n",
+ "19 Falco peregrinus\n",
+ "20 Acinonyx jubatus\n",
+ "21 Catopuma temminckii\n",
+ "22 Leopardus jacobitus\n",
+ "23 Leopardus pardalis mearnsi\n",
+ "24 Panthera onca\n",
+ "25 Panthera onca\n",
+ "26 Panthera onca\n",
+ "27 Panthera onca\n",
+ "28 Panthera onca\n",
+ "29 Panthera onca\n",
+ "... ...\n",
+ "49339 Martes flavigula\n",
+ "49340 Mustela sibirica\n",
+ "49341 Mustela sibirica\n",
+ "49342 Mustela sibirica\n",
+ "49343 Mustela sibirica\n",
+ "49344 Mustela sibirica\n",
+ "49345 Mustela sibirica\n",
+ "49346 Mustela sibirica\n",
+ "49347 Mustela sibirica\n",
+ "49348 Mustela sibirica\n",
+ "49349 Mustela sibirica\n",
+ "49350 Mustela sibirica\n",
+ "49351 Odobenus rosmarus\n",
+ "49352 Odobenus rosmarus\n",
+ "49353 Odobenus rosmarus\n",
+ "49354 Odobenus rosmarus\n",
+ "49355 Odobenus rosmarus\n",
+ "49356 Odobenus rosmarus\n",
+ "49357 Odobenus rosmarus\n",
+ "49358 Odobenus rosmarus\n",
+ "49359 Lodoicea maldivica\n",
+ "49360 Pavo cristatus\n",
+ "49361 Pavo cristatus\n",
+ "49362 Pavo cristatus\n",
+ "49363 Pavo cristatus\n",
+ "49364 Pavo cristatus\n",
+ "49365 Pavo cristatus\n",
+ "49366 Pavo cristatus\n",
+ "49367 Alligator mississippiensis\n",
+ "49368 Varanus salvator\n",
+ "\n",
+ "[49369 rows x 1 columns]"
+ ]
+ },
+ "execution_count": 185,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "dataframe = pd.read_csv(\"data/goal_2_data.csv\", skipinitialspace=True, usecols=[\"Taxon\"])\n",
+ "\n",
+ "dataframe"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 186,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Loxodonta africana 3606\n",
+ "Python reticulatus 1523\n",
+ "Alligator mississippiensis 1297\n",
+ "Macaca fascicularis 1279\n",
+ "Varanus salvator 972\n",
+ "Elephas maximus 952\n",
+ "Cheloniidae spp. 866\n",
+ "Varanus niloticus 744\n",
+ "Elephantidae spp. 716\n",
+ "Crocodylus niloticus 685\n",
+ "Psittacus erithacus 632\n",
+ "Crocodylus porosus 560\n",
+ "Caiman crocodilus crocodilus 524\n",
+ "Python bivittatus 501\n",
+ "Ptyas mucosus 473\n",
+ "Chlorocebus aethiops 457\n",
+ "Falco peregrinus 403\n",
+ "Eretmochelys imbricata 393\n",
+ "Dalbergia nigra 354\n",
+ "Vicugna vicugna 337\n",
+ "Panthera pardus 325\n",
+ "Callithrix jacchus 323\n",
+ "Odobenus rosmarus 299\n",
+ "Falco rusticolus 296\n",
+ "Panthera tigris 283\n",
+ "Physeter macrocephalus 255\n",
+ "Hirudo medicinalis 249\n",
+ "Macaca mulatta 232\n",
+ "Crocodylus novaeguineae 202\n",
+ "Leopardus pardalis 201\n",
+ " ... \n",
+ "Micrastur ruficollis 1\n",
+ "Hydnophora spp. 1\n",
+ "Lycaste fulvescens 1\n",
+ "Errinopora pourtalesii 1\n",
+ "Maihueniopsis darwinii 1\n",
+ "Porites divaricata 1\n",
+ "Aloe trachyticola 1\n",
+ "Polemaetus bellicosus 1\n",
+ "Sternbergia candida 1\n",
+ "Errinopora spp. 1\n",
+ "Dracula tubeana 1\n",
+ "Chinchilla lanigera 1\n",
+ "Peniocereus spp. 1\n",
+ "Mesoplodon europaeus 1\n",
+ "Cypripedium yunnanense 1\n",
+ "Nectophrynoides minutus 1\n",
+ "Vidua paradisaea 1\n",
+ "Bulbophyllum resupinatum 1\n",
+ "Turbinicarpus mandragora 1\n",
+ "Dalbergia retusa 1\n",
+ "Pristis spp. 1\n",
+ "Masdevallia andreettaeana 1\n",
+ "Dendrobium violaceum 1\n",
+ "Favites abdita 1\n",
+ "Astrophytum myriostigma 1\n",
+ "Epiphyllum pumilum 1\n",
+ "Pterostylis fischii 1\n",
+ "Colpophyllia amaranthus 1\n",
+ "Acineta chrysantha 1\n",
+ "Anas spp. 1\n",
+ "Name: Taxon, Length: 3422, dtype: int64"
+ ]
+ },
+ "execution_count": 186,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "name_distribution = dataframe[\"Taxon\"].value_counts()\n",
+ "name_distribution"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 187,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 187,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "name_distribution.head(50).plot.bar(figsize=(10, 10), title=\"Top 10 Taxon Names\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Obviously we can't use this for our training set as our model would disproportionatly learn to correct everything to \"Loxodonta africana\". We'll have to create a dataset of unique names..."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 188,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Total taxon names: 3422\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array(['Equus przewalskii', 'Panthera onca', 'Varanus flavescens', ...,\n",
+ " 'Phaethornis longirostris', 'Mesoplodon stejnegeri',\n",
+ " 'Martes flavigula'], dtype=object)"
+ ]
+ },
+ "execution_count": 188,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "names = dataframe[\"Taxon\"].unique()\n",
+ "\n",
+ "print(\"Total taxon names: \", len(names))\n",
+ "names"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we have a list of 3422 names that we can train our model on, but we'll need to generate some fake spelling mistakes first, so let's write a function to do that..."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 189,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Lxodonta afkicana\n"
+ ]
+ }
+ ],
+ "source": [
+ "def spelling_mistake_generator(name):\n",
+ " n = random.randint(0,4)\n",
+ " if n == 0:\n",
+ " return remove_letter(name)\n",
+ " elif n == 1:\n",
+ " return add_letter(name)\n",
+ " elif n == 2:\n",
+ " return swap_letters(name)\n",
+ " elif n == 3:\n",
+ " name = remove_letter(name)\n",
+ " return add_letter(name)\n",
+ " elif n == 4:\n",
+ " return lowercase(name)\n",
+ "\n",
+ "def remove_letter(name):\n",
+ " random_slice = random.randint(0, len(name))\n",
+ " generated_name = name[:random_slice] + name[(random_slice + 1):]\n",
+ " return generated_name\n",
+ "\n",
+ "def add_letter(name):\n",
+ " random_slice = random.randint(0, len(name))\n",
+ " random_letter = random.choice(string.ascii_letters)\n",
+ " generated_name = name[:random_slice] + random_letter + name[(random_slice + 1):]\n",
+ " return generated_name\n",
+ "\n",
+ "def swap_letters(name):\n",
+ " random_slice = random.randint(0, len(name) - 2)\n",
+ " generated_name = name[:random_slice] + reversed_string(name[random_slice:random_slice + 2]) + name[random_slice + 2:]\n",
+ " return generated_name\n",
+ " \n",
+ "def reversed_string(a_string):\n",
+ " return a_string[::-1]\n",
+ "\n",
+ "def lowercase(name):\n",
+ " return name.lower()\n",
+ "\n",
+ "print(spelling_mistake_generator(\"Loxodonta africana\"))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 190,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Loxodonta aLricana\n",
+ "Looxdonta africana\n",
+ "loxodonta africana\n",
+ "Loxodnta afrTcana\n",
+ "loxodonta africana\n",
+ "Loxodonta africMna\n",
+ "Loxodontaafricana\n",
+ "Loxodonta afrianaZ\n",
+ "Loxodonta africaq\n",
+ "loxodonta africana\n"
+ ]
+ }
+ ],
+ "source": [
+ "for i in range(10):\n",
+ " print(spelling_mistake_generator(\"Loxodonta africana\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Generating our Rosetta Stone\n",
+ "\n",
+ "We'll use our new spelling mistake generator to generate a new dataset where we have the erroneous data in one column, and the correct data next to it. Since we get a different mistake each time we run the generator, we'll create 100 examples of each term..."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 191,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Input | \n",
+ " Target | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Equus przeawlskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Equs przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Equusprzewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Equus przealskiis | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " Equus prUewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " Equus prlewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " equus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " Equus przewlskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " EquusPprzewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " Eqlus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " Equus pzrewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " Equus przeawlskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " Equusprzewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " Equus przewlskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " Equus przewalskji | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " Equs przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " Equus przewlskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " Equus pzrewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " equus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " Equus przewalsNii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " Equus przewalsiki | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " Equus przealskiu | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 22 | \n",
+ " equus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 23 | \n",
+ " Equus przeawlskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 24 | \n",
+ " Equus przealWkii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 25 | \n",
+ " equus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 26 | \n",
+ " Equusp rzewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 27 | \n",
+ " Equus prEewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 28 | \n",
+ " equus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 29 | \n",
+ " squus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 342170 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342171 | \n",
+ " Martes fwavgula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342172 | \n",
+ " Martek flvigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342173 | \n",
+ " Martes fwvigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342174 | \n",
+ " Martes flaigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342175 | \n",
+ " Martes flavigul | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342176 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342177 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342178 | \n",
+ " Martes flaJigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342179 | \n",
+ " partes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342180 | \n",
+ " Martes lfavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342181 | \n",
+ " MarteP flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342182 | \n",
+ " Martes flvibula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342183 | \n",
+ " Martse flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342184 | \n",
+ " Martes flaviula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342185 | \n",
+ " Martes flavigual | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342186 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342187 | \n",
+ " Marts flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342188 | \n",
+ " Martesflavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342189 | \n",
+ " Martes flNvigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342190 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342191 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342192 | \n",
+ " Maxtes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342193 | \n",
+ " Martes flavigulaa | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342194 | \n",
+ " Martes flavigXla | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342195 | \n",
+ " aMrtes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342196 | \n",
+ " MartesLflavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342197 | \n",
+ " Marets flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342198 | \n",
+ " Martes flaviula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342199 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
342200 rows × 2 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Input Target\n",
+ "0 Equus przeawlskii Equus przewalskii\n",
+ "1 Equs przewalskii Equus przewalskii\n",
+ "2 Equusprzewalskii Equus przewalskii\n",
+ "3 Equus przealskiis Equus przewalskii\n",
+ "4 Equus prUewalskii Equus przewalskii\n",
+ "5 Equus prlewalskii Equus przewalskii\n",
+ "6 equus przewalskii Equus przewalskii\n",
+ "7 Equus przewlskii Equus przewalskii\n",
+ "8 EquusPprzewalskii Equus przewalskii\n",
+ "9 Eqlus przewalskii Equus przewalskii\n",
+ "10 Equus pzrewalskii Equus przewalskii\n",
+ "11 Equus przeawlskii Equus przewalskii\n",
+ "12 Equusprzewalskii Equus przewalskii\n",
+ "13 Equus przewlskii Equus przewalskii\n",
+ "14 Equus przewalskji Equus przewalskii\n",
+ "15 Equs przewalskii Equus przewalskii\n",
+ "16 Equus przewlskii Equus przewalskii\n",
+ "17 Equus pzrewalskii Equus przewalskii\n",
+ "18 equus przewalskii Equus przewalskii\n",
+ "19 Equus przewalsNii Equus przewalskii\n",
+ "20 Equus przewalsiki Equus przewalskii\n",
+ "21 Equus przealskiu Equus przewalskii\n",
+ "22 equus przewalskii Equus przewalskii\n",
+ "23 Equus przeawlskii Equus przewalskii\n",
+ "24 Equus przealWkii Equus przewalskii\n",
+ "25 equus przewalskii Equus przewalskii\n",
+ "26 Equusp rzewalskii Equus przewalskii\n",
+ "27 Equus prEewalskii Equus przewalskii\n",
+ "28 equus przewalskii Equus przewalskii\n",
+ "29 squus przewalskii Equus przewalskii\n",
+ "... ... ...\n",
+ "342170 martes flavigula Martes flavigula\n",
+ "342171 Martes fwavgula Martes flavigula\n",
+ "342172 Martek flvigula Martes flavigula\n",
+ "342173 Martes fwvigula Martes flavigula\n",
+ "342174 Martes flaigula Martes flavigula\n",
+ "342175 Martes flavigul Martes flavigula\n",
+ "342176 martes flavigula Martes flavigula\n",
+ "342177 martes flavigula Martes flavigula\n",
+ "342178 Martes flaJigula Martes flavigula\n",
+ "342179 partes flavigula Martes flavigula\n",
+ "342180 Martes lfavigula Martes flavigula\n",
+ "342181 MarteP flavigula Martes flavigula\n",
+ "342182 Martes flvibula Martes flavigula\n",
+ "342183 Martse flavigula Martes flavigula\n",
+ "342184 Martes flaviula Martes flavigula\n",
+ "342185 Martes flavigual Martes flavigula\n",
+ "342186 martes flavigula Martes flavigula\n",
+ "342187 Marts flavigula Martes flavigula\n",
+ "342188 Martesflavigula Martes flavigula\n",
+ "342189 Martes flNvigula Martes flavigula\n",
+ "342190 martes flavigula Martes flavigula\n",
+ "342191 martes flavigula Martes flavigula\n",
+ "342192 Maxtes flavigula Martes flavigula\n",
+ "342193 Martes flavigulaa Martes flavigula\n",
+ "342194 Martes flavigXla Martes flavigula\n",
+ "342195 aMrtes flavigula Martes flavigula\n",
+ "342196 MartesLflavigula Martes flavigula\n",
+ "342197 Marets flavigula Martes flavigula\n",
+ "342198 Martes flaviula Martes flavigula\n",
+ "342199 martes flavigula Martes flavigula\n",
+ "\n",
+ "[342200 rows x 2 columns]"
+ ]
+ },
+ "execution_count": 191,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "repeated_names = np.repeat(names, 100)\n",
+ "spelling_errors = [spelling_mistake_generator(s) for s in repeated_names]\n",
+ "\n",
+ "corpus = np.column_stack((spelling_errors, repeated_names))\n",
+ "\n",
+ "corpus = pd.DataFrame(corpus, columns=[\"Input\", \"Target\"])\n",
+ "corpus"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We've ended up with 342200 records of names with minor typos and formatting mistakes. (You can change the number of repetitions from 100 to 1000 if you need more data, but I've left this as 100 to save time. 1000 and upwards takes a little while to generate)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Vectorise our data for learning\n",
+ "\n",
+ "We'll need to encode our data from letters to number for our model to be able to deal with it. We'll take our table, and create two lists, one of all the characters in our input dataset, and one of all the characters in our target dataset. We'll also add a start and end character to our target data as this will be useful for our model to understand when to start and stop generating..."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 192,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "input_texts = []\n",
+ "target_texts = []\n",
+ "\n",
+ "start_character = '\\t'\n",
+ "end_character = '\\n'\n",
+ "\n",
+ "input_characters = set()\n",
+ "target_characters = set()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 193,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Takes in the input and target texts and adds their characters to the list of input and target characters\n",
+ "\n",
+ "def build_character_lists(input_text, target_text):\n",
+ " for char in input_text:\n",
+ " if char not in input_characters:\n",
+ " input_characters.add(char)\n",
+ " for char in target_text:\n",
+ " if char not in target_characters:\n",
+ " target_characters.add(char)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 194,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for index, row in corpus.iterrows():\n",
+ " input_text = row[\"Input\"]\n",
+ " target_text = row[\"Target\"]\n",
+ " target_text = start_character + target_text + end_character\n",
+ " build_character_lists(input_text, target_text)\n",
+ " input_texts.append(input_text)\n",
+ " target_texts.append(target_text)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 195,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Number of samples: 342200\n",
+ "Number of unique input tokens: 55\n",
+ "Number of unique output tokens: 56\n",
+ "Max sequence length for inputs: 36\n",
+ "Max sequence length for outputs: 38\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "['\\t',\n",
+ " '\\n',\n",
+ " ' ',\n",
+ " '-',\n",
+ " '.',\n",
+ " 'A',\n",
+ " 'B',\n",
+ " 'C',\n",
+ " 'D',\n",
+ " 'E',\n",
+ " 'F',\n",
+ " 'G',\n",
+ " 'H',\n",
+ " 'I',\n",
+ " 'J',\n",
+ " 'K',\n",
+ " 'L',\n",
+ " 'M',\n",
+ " 'N',\n",
+ " 'O',\n",
+ " 'P',\n",
+ " 'Q',\n",
+ " 'R',\n",
+ " 'S',\n",
+ " 'T',\n",
+ " 'U',\n",
+ " 'V',\n",
+ " 'W',\n",
+ " 'X',\n",
+ " 'Z',\n",
+ " 'a',\n",
+ " 'b',\n",
+ " 'c',\n",
+ " 'd',\n",
+ " 'e',\n",
+ " 'f',\n",
+ " 'g',\n",
+ " 'h',\n",
+ " 'i',\n",
+ " 'j',\n",
+ " 'k',\n",
+ " 'l',\n",
+ " 'm',\n",
+ " 'n',\n",
+ " 'o',\n",
+ " 'p',\n",
+ " 'q',\n",
+ " 'r',\n",
+ " 's',\n",
+ " 't',\n",
+ " 'u',\n",
+ " 'v',\n",
+ " 'w',\n",
+ " 'x',\n",
+ " 'y',\n",
+ " 'z']"
+ ]
+ },
+ "execution_count": 195,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "input_characters = sorted(list(input_characters))\n",
+ "target_characters = sorted(list(target_characters))\n",
+ "num_encoder_tokens = len(input_characters)\n",
+ "num_decoder_tokens = len(target_characters)\n",
+ "max_encoder_seq_length = max([len(txt) for txt in input_texts])\n",
+ "max_decoder_seq_length = max([len(txt) for txt in target_texts])\n",
+ "\n",
+ "print('Number of samples:', len(input_texts))\n",
+ "print('Number of unique input tokens:', num_encoder_tokens)\n",
+ "print('Number of unique output tokens:', num_decoder_tokens)\n",
+ "print('Max sequence length for inputs:', max_encoder_seq_length)\n",
+ "print('Max sequence length for outputs:', max_decoder_seq_length)\n",
+ "\n",
+ "target_characters"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We'll create two dictionaries to help us get from our characters to numbers and back for both our input and target dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 198,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{' ': 0, '-': 1, '.': 2, 'A': 3, 'B': 4, 'C': 5, 'D': 6, 'E': 7, 'F': 8, 'G': 9, 'H': 10, 'I': 11, 'J': 12, 'K': 13, 'L': 14, 'M': 15, 'N': 16, 'O': 17, 'P': 18, 'Q': 19, 'R': 20, 'S': 21, 'T': 22, 'U': 23, 'V': 24, 'W': 25, 'X': 26, 'Y': 27, 'Z': 28, 'a': 29, 'b': 30, 'c': 31, 'd': 32, 'e': 33, 'f': 34, 'g': 35, 'h': 36, 'i': 37, 'j': 38, 'k': 39, 'l': 40, 'm': 41, 'n': 42, 'o': 43, 'p': 44, 'q': 45, 'r': 46, 's': 47, 't': 48, 'u': 49, 'v': 50, 'w': 51, 'x': 52, 'y': 53, 'z': 54}\n",
+ "{'\\t': 0, '\\n': 1, ' ': 2, '-': 3, '.': 4, 'A': 5, 'B': 6, 'C': 7, 'D': 8, 'E': 9, 'F': 10, 'G': 11, 'H': 12, 'I': 13, 'J': 14, 'K': 15, 'L': 16, 'M': 17, 'N': 18, 'O': 19, 'P': 20, 'Q': 21, 'R': 22, 'S': 23, 'T': 24, 'U': 25, 'V': 26, 'W': 27, 'X': 28, 'Z': 29, 'a': 30, 'b': 31, 'c': 32, 'd': 33, 'e': 34, 'f': 35, 'g': 36, 'h': 37, 'i': 38, 'j': 39, 'k': 40, 'l': 41, 'm': 42, 'n': 43, 'o': 44, 'p': 45, 'q': 46, 'r': 47, 's': 48, 't': 49, 'u': 50, 'v': 51, 'w': 52, 'x': 53, 'y': 54, 'z': 55}\n"
+ ]
+ }
+ ],
+ "source": [
+ "input_token_index = dict([(char, i) for i, char in enumerate(input_characters)])\n",
+ "target_token_index = dict([(char, i) for i, char in enumerate(target_characters)])\n",
+ "\n",
+ "print(input_token_index)\n",
+ "print(target_token_index)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 199,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# encoder_input_data is a 3D array of shape (num_pairs, max input seq length, num input characters)\n",
+ "encoder_input_data = np.zeros((len(input_texts), max_encoder_seq_length, num_encoder_tokens), dtype='float32')\n",
+ "\n",
+ "# decoder_input_data is a 3D array of shape (num_pairs, max target seq length, num target characters)\n",
+ "decoder_input_data = np.zeros((len(input_texts), max_decoder_seq_length, num_decoder_tokens), dtype='float32')\n",
+ "\n",
+ "# decoder_target_data is the same as decoder_input_data but offset by one timestep. decoder_target_data[:, t, :] will be the same as decoder_input_data[:, t + 1, :].\n",
+ "decoder_target_data = np.zeros((len(input_texts), max_decoder_seq_length, num_decoder_tokens), dtype='float32')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Building our model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 200,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# i = training examples\n",
+ "# t = time step\n",
+ "# c = set the position representing the character to 1 (one hot encoded character)\n",
+ "\n",
+ "for i, (input_text, target_text) in enumerate(zip(input_texts, target_texts)):\n",
+ " for t, char in enumerate(input_text):\n",
+ " encoder_input_data[i, t, input_token_index[char]] = 1.\n",
+ " for t, char in enumerate(target_text):\n",
+ " # decoder_target_data is ahead of decoder_input_data by one timestep\n",
+ " decoder_input_data[i, t, target_token_index[char]] = 1.\n",
+ " if t > 0:\n",
+ " # decoder_target_data will be ahead by one timestep\n",
+ " # and will not include the start character.\n",
+ " decoder_target_data[i, t - 1, target_token_index[char]] = 1."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 202,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "latent_dim = 256\n",
+ "\n",
+ "# Define an input sequence and process it.\n",
+ "encoder_inputs = Input(shape=(None, num_encoder_tokens))\n",
+ "encoder = LSTM(latent_dim, return_state=True)\n",
+ "encoder_outputs, state_h, state_c = encoder(encoder_inputs)\n",
+ "\n",
+ "# We discard `encoder_outputs` and only keep the states.\n",
+ "encoder_states = [state_h, state_c]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 203,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Set up the decoder, using `encoder_states` as initial state.\n",
+ "decoder_inputs = Input(shape=(None, num_decoder_tokens))\n",
+ "\n",
+ "# We set up our decoder to return full output sequences,\n",
+ "# and to return internal states as well. We don't use the\n",
+ "# return states in the training model, but we will use them in inference.\n",
+ "decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)\n",
+ "decoder_outputs, _, _ = decoder_lstm(decoder_inputs,\n",
+ " initial_state=encoder_states)\n",
+ "\n",
+ "decoder_dense = Dense(num_decoder_tokens, activation='softmax')\n",
+ "decoder_outputs = decoder_dense(decoder_outputs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 204,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define the model that will turn\n",
+ "# `encoder_input_data` & `decoder_input_data` into `decoder_target_data`\n",
+ "model = Model([encoder_inputs, decoder_inputs], decoder_outputs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 205,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train on 273760 samples, validate on 68440 samples\n",
+ "Epoch 1/100\n",
+ "102336/273760 [==========>...................] - ETA: 6:04 - loss: 0.9042"
+ ]
+ },
+ {
+ "ename": "KeyboardInterrupt",
+ "evalue": "",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mbatch_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mepochs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m validation_split=0.2)\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;31m# Save model\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m's2s.h5'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)\u001b[0m\n\u001b[1;32m 1703\u001b[0m \u001b[0minitial_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitial_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1704\u001b[0m \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1705\u001b[0;31m validation_steps=validation_steps)\n\u001b[0m\u001b[1;32m 1706\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1707\u001b[0m def evaluate(self, x=None, y=None,\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36m_fit_loop\u001b[0;34m(self, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps)\u001b[0m\n\u001b[1;32m 1233\u001b[0m \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtoarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1234\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1235\u001b[0;31m \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins_batch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1236\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1237\u001b[0m \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m 2476\u001b[0m \u001b[0msession\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_session\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2477\u001b[0m updated = session.run(fetches=fetches, feed_dict=feed_dict,\n\u001b[0;32m-> 2478\u001b[0;31m **self.session_kwargs)\n\u001b[0m\u001b[1;32m 2479\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mupdated\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2480\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 903\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 904\u001b[0m result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[0;32m--> 905\u001b[0;31m run_metadata_ptr)\n\u001b[0m\u001b[1;32m 906\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 907\u001b[0m \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run\u001b[0;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 1135\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mhandle\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfeed_dict_tensor\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1136\u001b[0m results = self._do_run(handle, final_targets, final_fetches,\n\u001b[0;32m-> 1137\u001b[0;31m feed_dict_tensor, options, run_metadata)\n\u001b[0m\u001b[1;32m 1138\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1139\u001b[0m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_run\u001b[0;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 1353\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1354\u001b[0m return self._do_call(_run_fn, self._session, feeds, fetches, targets,\n\u001b[0;32m-> 1355\u001b[0;31m options, run_metadata)\n\u001b[0m\u001b[1;32m 1356\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1357\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_prun_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeeds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetches\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_call\u001b[0;34m(self, fn, *args)\u001b[0m\n\u001b[1;32m 1359\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1360\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1361\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1362\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1363\u001b[0m \u001b[0mmessage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run_fn\u001b[0;34m(session, feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[1;32m 1338\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1339\u001b[0m return tf_session.TF_Run(session, options, feed_dict, fetch_list,\n\u001b[0;32m-> 1340\u001b[0;31m target_list, status, run_metadata)\n\u001b[0m\u001b[1;32m 1341\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1342\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_prun_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
+ ]
+ }
+ ],
+ "source": [
+ "batch_size = 64 # Batch size for training.\n",
+ "epochs = 100 # Number of epochs to train for.\n",
+ "\n",
+ "# Run training\n",
+ "model.compile(optimizer='rmsprop', loss='categorical_crossentropy')\n",
+ "model.fit([encoder_input_data, decoder_input_data], decoder_target_data,\n",
+ " batch_size=batch_size,\n",
+ " epochs=epochs,\n",
+ " validation_split=0.2)\n",
+ "# Save model\n",
+ "model.save('s2s.h5')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "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.6.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/2. Learning about Trade Data.ipynb b/2. Learning about Trade Data.ipynb
index fff7aaa..b92c302 100644
--- a/2. Learning about Trade Data.ipynb
+++ b/2. Learning about Trade Data.ipynb
@@ -4024,7 +4024,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.6.4"
+ "version": "3.6.5"
}
},
"nbformat": 4,
diff --git a/3a. Taxon Autocorrect with LSTM Autoencoders.ipynb b/3a. Taxon Autocorrect with LSTM Autoencoders.ipynb
new file mode 100644
index 0000000..a6dc5f4
--- /dev/null
+++ b/3a. Taxon Autocorrect with LSTM Autoencoders.ipynb
@@ -0,0 +1,1447 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# 3a. Autocorrecting Mispelt Taxon Names with Autoencoders\n",
+ "Given a list of taxon names, can we build an autocorrect model to autonomously fix erroneous records?"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 184,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import numpy as np\n",
+ "import pandas as pd\n",
+ "import matplotlib.pyplot as plt\n",
+ "import matplotlib\n",
+ "import random\n",
+ "import string\n",
+ "from keras.models import Model\n",
+ "from keras.preprocessing import sequence\n",
+ "from keras.layers import Input, LSTM, Dense"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Exploring the dataset\n",
+ "We'll use the same dataset as last time; a publically available list of UK exports from 1975 - 2016. We'll only need the taxon names so we'll restrict our import to the taxon column."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 185,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Taxon | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Varanus flavescens | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Varanus griseus | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " Branta ruficollis | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " Leopardus pardalis | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " Leopardus wiedii | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " Diceros bicornis | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " Asarcornis scutulata | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " Branta sandvicensis | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " Branta sandvicensis | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " Cercopithecus diana | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " Rucervus duvaucelii | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " Crocodylus siamensis | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " Elephas maximus | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " Elephas maximus | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " Elephas maximus | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " Elephas maximus | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " Falco peregrinus | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " Acinonyx jubatus | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " Catopuma temminckii | \n",
+ "
\n",
+ " \n",
+ " 22 | \n",
+ " Leopardus jacobitus | \n",
+ "
\n",
+ " \n",
+ " 23 | \n",
+ " Leopardus pardalis mearnsi | \n",
+ "
\n",
+ " \n",
+ " 24 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " 25 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " 26 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " 27 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " 28 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " 29 | \n",
+ " Panthera onca | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 49339 | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 49340 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49341 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49342 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49343 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49344 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49345 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49346 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49347 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49348 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49349 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49350 | \n",
+ " Mustela sibirica | \n",
+ "
\n",
+ " \n",
+ " 49351 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49352 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49353 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49354 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49355 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49356 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49357 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49358 | \n",
+ " Odobenus rosmarus | \n",
+ "
\n",
+ " \n",
+ " 49359 | \n",
+ " Lodoicea maldivica | \n",
+ "
\n",
+ " \n",
+ " 49360 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49361 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49362 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49363 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49364 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49365 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49366 | \n",
+ " Pavo cristatus | \n",
+ "
\n",
+ " \n",
+ " 49367 | \n",
+ " Alligator mississippiensis | \n",
+ "
\n",
+ " \n",
+ " 49368 | \n",
+ " Varanus salvator | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
49369 rows × 1 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Taxon\n",
+ "0 Equus przewalskii\n",
+ "1 Panthera onca\n",
+ "2 Varanus flavescens\n",
+ "3 Varanus griseus\n",
+ "4 Branta ruficollis\n",
+ "5 Leopardus pardalis\n",
+ "6 Leopardus wiedii\n",
+ "7 Diceros bicornis\n",
+ "8 Asarcornis scutulata\n",
+ "9 Branta sandvicensis\n",
+ "10 Branta sandvicensis\n",
+ "11 Cercopithecus diana\n",
+ "12 Rucervus duvaucelii\n",
+ "13 Crocodylus siamensis\n",
+ "14 Elephas maximus\n",
+ "15 Elephas maximus\n",
+ "16 Elephas maximus\n",
+ "17 Elephas maximus\n",
+ "18 Equus przewalskii\n",
+ "19 Falco peregrinus\n",
+ "20 Acinonyx jubatus\n",
+ "21 Catopuma temminckii\n",
+ "22 Leopardus jacobitus\n",
+ "23 Leopardus pardalis mearnsi\n",
+ "24 Panthera onca\n",
+ "25 Panthera onca\n",
+ "26 Panthera onca\n",
+ "27 Panthera onca\n",
+ "28 Panthera onca\n",
+ "29 Panthera onca\n",
+ "... ...\n",
+ "49339 Martes flavigula\n",
+ "49340 Mustela sibirica\n",
+ "49341 Mustela sibirica\n",
+ "49342 Mustela sibirica\n",
+ "49343 Mustela sibirica\n",
+ "49344 Mustela sibirica\n",
+ "49345 Mustela sibirica\n",
+ "49346 Mustela sibirica\n",
+ "49347 Mustela sibirica\n",
+ "49348 Mustela sibirica\n",
+ "49349 Mustela sibirica\n",
+ "49350 Mustela sibirica\n",
+ "49351 Odobenus rosmarus\n",
+ "49352 Odobenus rosmarus\n",
+ "49353 Odobenus rosmarus\n",
+ "49354 Odobenus rosmarus\n",
+ "49355 Odobenus rosmarus\n",
+ "49356 Odobenus rosmarus\n",
+ "49357 Odobenus rosmarus\n",
+ "49358 Odobenus rosmarus\n",
+ "49359 Lodoicea maldivica\n",
+ "49360 Pavo cristatus\n",
+ "49361 Pavo cristatus\n",
+ "49362 Pavo cristatus\n",
+ "49363 Pavo cristatus\n",
+ "49364 Pavo cristatus\n",
+ "49365 Pavo cristatus\n",
+ "49366 Pavo cristatus\n",
+ "49367 Alligator mississippiensis\n",
+ "49368 Varanus salvator\n",
+ "\n",
+ "[49369 rows x 1 columns]"
+ ]
+ },
+ "execution_count": 185,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "dataframe = pd.read_csv(\"data/goal_2_data.csv\", skipinitialspace=True, usecols=[\"Taxon\"])\n",
+ "\n",
+ "dataframe"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 186,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ "Loxodonta africana 3606\n",
+ "Python reticulatus 1523\n",
+ "Alligator mississippiensis 1297\n",
+ "Macaca fascicularis 1279\n",
+ "Varanus salvator 972\n",
+ "Elephas maximus 952\n",
+ "Cheloniidae spp. 866\n",
+ "Varanus niloticus 744\n",
+ "Elephantidae spp. 716\n",
+ "Crocodylus niloticus 685\n",
+ "Psittacus erithacus 632\n",
+ "Crocodylus porosus 560\n",
+ "Caiman crocodilus crocodilus 524\n",
+ "Python bivittatus 501\n",
+ "Ptyas mucosus 473\n",
+ "Chlorocebus aethiops 457\n",
+ "Falco peregrinus 403\n",
+ "Eretmochelys imbricata 393\n",
+ "Dalbergia nigra 354\n",
+ "Vicugna vicugna 337\n",
+ "Panthera pardus 325\n",
+ "Callithrix jacchus 323\n",
+ "Odobenus rosmarus 299\n",
+ "Falco rusticolus 296\n",
+ "Panthera tigris 283\n",
+ "Physeter macrocephalus 255\n",
+ "Hirudo medicinalis 249\n",
+ "Macaca mulatta 232\n",
+ "Crocodylus novaeguineae 202\n",
+ "Leopardus pardalis 201\n",
+ " ... \n",
+ "Micrastur ruficollis 1\n",
+ "Hydnophora spp. 1\n",
+ "Lycaste fulvescens 1\n",
+ "Errinopora pourtalesii 1\n",
+ "Maihueniopsis darwinii 1\n",
+ "Porites divaricata 1\n",
+ "Aloe trachyticola 1\n",
+ "Polemaetus bellicosus 1\n",
+ "Sternbergia candida 1\n",
+ "Errinopora spp. 1\n",
+ "Dracula tubeana 1\n",
+ "Chinchilla lanigera 1\n",
+ "Peniocereus spp. 1\n",
+ "Mesoplodon europaeus 1\n",
+ "Cypripedium yunnanense 1\n",
+ "Nectophrynoides minutus 1\n",
+ "Vidua paradisaea 1\n",
+ "Bulbophyllum resupinatum 1\n",
+ "Turbinicarpus mandragora 1\n",
+ "Dalbergia retusa 1\n",
+ "Pristis spp. 1\n",
+ "Masdevallia andreettaeana 1\n",
+ "Dendrobium violaceum 1\n",
+ "Favites abdita 1\n",
+ "Astrophytum myriostigma 1\n",
+ "Epiphyllum pumilum 1\n",
+ "Pterostylis fischii 1\n",
+ "Colpophyllia amaranthus 1\n",
+ "Acineta chrysantha 1\n",
+ "Anas spp. 1\n",
+ "Name: Taxon, Length: 3422, dtype: int64"
+ ]
+ },
+ "execution_count": 186,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "name_distribution = dataframe[\"Taxon\"].value_counts()\n",
+ "name_distribution"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 187,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 187,
+ "metadata": {},
+ "output_type": "execute_result"
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "name_distribution.head(50).plot.bar(figsize=(10, 10), title=\"Top 10 Taxon Names\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Obviously we can't use this for our training set as our model would disproportionatly learn to correct everything to \"Loxodonta africana\". We'll have to create a dataset of unique names..."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 188,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Total taxon names: 3422\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "array(['Equus przewalskii', 'Panthera onca', 'Varanus flavescens', ...,\n",
+ " 'Phaethornis longirostris', 'Mesoplodon stejnegeri',\n",
+ " 'Martes flavigula'], dtype=object)"
+ ]
+ },
+ "execution_count": 188,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "names = dataframe[\"Taxon\"].unique()\n",
+ "\n",
+ "print(\"Total taxon names: \", len(names))\n",
+ "names"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we have a list of 3422 names that we can train our model on, but we'll need to generate some fake spelling mistakes first, so let's write a function to do that..."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 189,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Lxodonta afkicana\n"
+ ]
+ }
+ ],
+ "source": [
+ "def spelling_mistake_generator(name):\n",
+ " n = random.randint(0,4)\n",
+ " if n == 0:\n",
+ " return remove_letter(name)\n",
+ " elif n == 1:\n",
+ " return add_letter(name)\n",
+ " elif n == 2:\n",
+ " return swap_letters(name)\n",
+ " elif n == 3:\n",
+ " name = remove_letter(name)\n",
+ " return add_letter(name)\n",
+ " elif n == 4:\n",
+ " return lowercase(name)\n",
+ "\n",
+ "def remove_letter(name):\n",
+ " random_slice = random.randint(0, len(name))\n",
+ " generated_name = name[:random_slice] + name[(random_slice + 1):]\n",
+ " return generated_name\n",
+ "\n",
+ "def add_letter(name):\n",
+ " random_slice = random.randint(0, len(name))\n",
+ " random_letter = random.choice(string.ascii_letters)\n",
+ " generated_name = name[:random_slice] + random_letter + name[(random_slice + 1):]\n",
+ " return generated_name\n",
+ "\n",
+ "def swap_letters(name):\n",
+ " random_slice = random.randint(0, len(name) - 2)\n",
+ " generated_name = name[:random_slice] + reversed_string(name[random_slice:random_slice + 2]) + name[random_slice + 2:]\n",
+ " return generated_name\n",
+ " \n",
+ "def reversed_string(a_string):\n",
+ " return a_string[::-1]\n",
+ "\n",
+ "def lowercase(name):\n",
+ " return name.lower()\n",
+ "\n",
+ "print(spelling_mistake_generator(\"Loxodonta africana\"))"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 190,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Loxodonta aLricana\n",
+ "Looxdonta africana\n",
+ "loxodonta africana\n",
+ "Loxodnta afrTcana\n",
+ "loxodonta africana\n",
+ "Loxodonta africMna\n",
+ "Loxodontaafricana\n",
+ "Loxodonta afrianaZ\n",
+ "Loxodonta africaq\n",
+ "loxodonta africana\n"
+ ]
+ }
+ ],
+ "source": [
+ "for i in range(10):\n",
+ " print(spelling_mistake_generator(\"Loxodonta africana\"))"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Generating our Rosetta Stone\n",
+ "\n",
+ "We'll use our new spelling mistake generator to generate a new dataset where we have the erroneous data in one column, and the correct data next to it. Since we get a different mistake each time we run the generator, we'll create 100 examples of each term..."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 191,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " | \n",
+ " Input | \n",
+ " Target | \n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " 0 | \n",
+ " Equus przeawlskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 1 | \n",
+ " Equs przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 2 | \n",
+ " Equusprzewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 3 | \n",
+ " Equus przealskiis | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 4 | \n",
+ " Equus prUewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 5 | \n",
+ " Equus prlewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 6 | \n",
+ " equus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 7 | \n",
+ " Equus przewlskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 8 | \n",
+ " EquusPprzewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 9 | \n",
+ " Eqlus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 10 | \n",
+ " Equus pzrewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 11 | \n",
+ " Equus przeawlskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 12 | \n",
+ " Equusprzewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 13 | \n",
+ " Equus przewlskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 14 | \n",
+ " Equus przewalskji | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 15 | \n",
+ " Equs przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 16 | \n",
+ " Equus przewlskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 17 | \n",
+ " Equus pzrewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 18 | \n",
+ " equus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 19 | \n",
+ " Equus przewalsNii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 20 | \n",
+ " Equus przewalsiki | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 21 | \n",
+ " Equus przealskiu | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 22 | \n",
+ " equus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 23 | \n",
+ " Equus przeawlskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 24 | \n",
+ " Equus przealWkii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 25 | \n",
+ " equus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 26 | \n",
+ " Equusp rzewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 27 | \n",
+ " Equus prEewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 28 | \n",
+ " equus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " 29 | \n",
+ " squus przewalskii | \n",
+ " Equus przewalskii | \n",
+ "
\n",
+ " \n",
+ " ... | \n",
+ " ... | \n",
+ " ... | \n",
+ "
\n",
+ " \n",
+ " 342170 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342171 | \n",
+ " Martes fwavgula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342172 | \n",
+ " Martek flvigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342173 | \n",
+ " Martes fwvigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342174 | \n",
+ " Martes flaigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342175 | \n",
+ " Martes flavigul | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342176 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342177 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342178 | \n",
+ " Martes flaJigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342179 | \n",
+ " partes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342180 | \n",
+ " Martes lfavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342181 | \n",
+ " MarteP flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342182 | \n",
+ " Martes flvibula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342183 | \n",
+ " Martse flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342184 | \n",
+ " Martes flaviula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342185 | \n",
+ " Martes flavigual | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342186 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342187 | \n",
+ " Marts flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342188 | \n",
+ " Martesflavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342189 | \n",
+ " Martes flNvigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342190 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342191 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342192 | \n",
+ " Maxtes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342193 | \n",
+ " Martes flavigulaa | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342194 | \n",
+ " Martes flavigXla | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342195 | \n",
+ " aMrtes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342196 | \n",
+ " MartesLflavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342197 | \n",
+ " Marets flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342198 | \n",
+ " Martes flaviula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ " 342199 | \n",
+ " martes flavigula | \n",
+ " Martes flavigula | \n",
+ "
\n",
+ " \n",
+ "
\n",
+ "
342200 rows × 2 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " Input Target\n",
+ "0 Equus przeawlskii Equus przewalskii\n",
+ "1 Equs przewalskii Equus przewalskii\n",
+ "2 Equusprzewalskii Equus przewalskii\n",
+ "3 Equus przealskiis Equus przewalskii\n",
+ "4 Equus prUewalskii Equus przewalskii\n",
+ "5 Equus prlewalskii Equus przewalskii\n",
+ "6 equus przewalskii Equus przewalskii\n",
+ "7 Equus przewlskii Equus przewalskii\n",
+ "8 EquusPprzewalskii Equus przewalskii\n",
+ "9 Eqlus przewalskii Equus przewalskii\n",
+ "10 Equus pzrewalskii Equus przewalskii\n",
+ "11 Equus przeawlskii Equus przewalskii\n",
+ "12 Equusprzewalskii Equus przewalskii\n",
+ "13 Equus przewlskii Equus przewalskii\n",
+ "14 Equus przewalskji Equus przewalskii\n",
+ "15 Equs przewalskii Equus przewalskii\n",
+ "16 Equus przewlskii Equus przewalskii\n",
+ "17 Equus pzrewalskii Equus przewalskii\n",
+ "18 equus przewalskii Equus przewalskii\n",
+ "19 Equus przewalsNii Equus przewalskii\n",
+ "20 Equus przewalsiki Equus przewalskii\n",
+ "21 Equus przealskiu Equus przewalskii\n",
+ "22 equus przewalskii Equus przewalskii\n",
+ "23 Equus przeawlskii Equus przewalskii\n",
+ "24 Equus przealWkii Equus przewalskii\n",
+ "25 equus przewalskii Equus przewalskii\n",
+ "26 Equusp rzewalskii Equus przewalskii\n",
+ "27 Equus prEewalskii Equus przewalskii\n",
+ "28 equus przewalskii Equus przewalskii\n",
+ "29 squus przewalskii Equus przewalskii\n",
+ "... ... ...\n",
+ "342170 martes flavigula Martes flavigula\n",
+ "342171 Martes fwavgula Martes flavigula\n",
+ "342172 Martek flvigula Martes flavigula\n",
+ "342173 Martes fwvigula Martes flavigula\n",
+ "342174 Martes flaigula Martes flavigula\n",
+ "342175 Martes flavigul Martes flavigula\n",
+ "342176 martes flavigula Martes flavigula\n",
+ "342177 martes flavigula Martes flavigula\n",
+ "342178 Martes flaJigula Martes flavigula\n",
+ "342179 partes flavigula Martes flavigula\n",
+ "342180 Martes lfavigula Martes flavigula\n",
+ "342181 MarteP flavigula Martes flavigula\n",
+ "342182 Martes flvibula Martes flavigula\n",
+ "342183 Martse flavigula Martes flavigula\n",
+ "342184 Martes flaviula Martes flavigula\n",
+ "342185 Martes flavigual Martes flavigula\n",
+ "342186 martes flavigula Martes flavigula\n",
+ "342187 Marts flavigula Martes flavigula\n",
+ "342188 Martesflavigula Martes flavigula\n",
+ "342189 Martes flNvigula Martes flavigula\n",
+ "342190 martes flavigula Martes flavigula\n",
+ "342191 martes flavigula Martes flavigula\n",
+ "342192 Maxtes flavigula Martes flavigula\n",
+ "342193 Martes flavigulaa Martes flavigula\n",
+ "342194 Martes flavigXla Martes flavigula\n",
+ "342195 aMrtes flavigula Martes flavigula\n",
+ "342196 MartesLflavigula Martes flavigula\n",
+ "342197 Marets flavigula Martes flavigula\n",
+ "342198 Martes flaviula Martes flavigula\n",
+ "342199 martes flavigula Martes flavigula\n",
+ "\n",
+ "[342200 rows x 2 columns]"
+ ]
+ },
+ "execution_count": 191,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "repeated_names = np.repeat(names, 100)\n",
+ "spelling_errors = [spelling_mistake_generator(s) for s in repeated_names]\n",
+ "\n",
+ "corpus = np.column_stack((spelling_errors, repeated_names))\n",
+ "\n",
+ "corpus = pd.DataFrame(corpus, columns=[\"Input\", \"Target\"])\n",
+ "corpus"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We've ended up with 342200 records of names with minor typos and formatting mistakes. (You can change the number of repetitions from 100 to 1000 if you need more data, but I've left this as 100 to save time. 1000 and upwards takes a little while to generate)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Vectorise our data for learning\n",
+ "\n",
+ "We'll need to encode our data from letters to number for our model to be able to deal with it. We'll take our table, and create two lists, one of all the characters in our input dataset, and one of all the characters in our target dataset. We can use these later on to one hot encode our characters to vectors before we feed them to our model. We'll also add a start and end character to our target data as this will be useful for our model to understand when to start and stop generating..."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 192,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "input_texts = []\n",
+ "target_texts = []\n",
+ "\n",
+ "start_character = '\\t'\n",
+ "end_character = '\\n'\n",
+ "\n",
+ "input_characters = set()\n",
+ "target_characters = set()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 193,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Takes in the input and target texts and adds their characters to the list of input and target characters\n",
+ "\n",
+ "def build_character_lists(input_text, target_text):\n",
+ " for char in input_text:\n",
+ " if char not in input_characters:\n",
+ " input_characters.add(char)\n",
+ " for char in target_text:\n",
+ " if char not in target_characters:\n",
+ " target_characters.add(char)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 194,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "for index, row in corpus.iterrows():\n",
+ " input_text = row[\"Input\"]\n",
+ " target_text = row[\"Target\"]\n",
+ " target_text = start_character + target_text + end_character\n",
+ " build_character_lists(input_text, target_text)\n",
+ " input_texts.append(input_text)\n",
+ " target_texts.append(target_text)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 195,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Number of samples: 342200\n",
+ "Number of unique input tokens: 55\n",
+ "Number of unique output tokens: 56\n",
+ "Max sequence length for inputs: 36\n",
+ "Max sequence length for outputs: 38\n"
+ ]
+ },
+ {
+ "data": {
+ "text/plain": [
+ "['\\t',\n",
+ " '\\n',\n",
+ " ' ',\n",
+ " '-',\n",
+ " '.',\n",
+ " 'A',\n",
+ " 'B',\n",
+ " 'C',\n",
+ " 'D',\n",
+ " 'E',\n",
+ " 'F',\n",
+ " 'G',\n",
+ " 'H',\n",
+ " 'I',\n",
+ " 'J',\n",
+ " 'K',\n",
+ " 'L',\n",
+ " 'M',\n",
+ " 'N',\n",
+ " 'O',\n",
+ " 'P',\n",
+ " 'Q',\n",
+ " 'R',\n",
+ " 'S',\n",
+ " 'T',\n",
+ " 'U',\n",
+ " 'V',\n",
+ " 'W',\n",
+ " 'X',\n",
+ " 'Z',\n",
+ " 'a',\n",
+ " 'b',\n",
+ " 'c',\n",
+ " 'd',\n",
+ " 'e',\n",
+ " 'f',\n",
+ " 'g',\n",
+ " 'h',\n",
+ " 'i',\n",
+ " 'j',\n",
+ " 'k',\n",
+ " 'l',\n",
+ " 'm',\n",
+ " 'n',\n",
+ " 'o',\n",
+ " 'p',\n",
+ " 'q',\n",
+ " 'r',\n",
+ " 's',\n",
+ " 't',\n",
+ " 'u',\n",
+ " 'v',\n",
+ " 'w',\n",
+ " 'x',\n",
+ " 'y',\n",
+ " 'z']"
+ ]
+ },
+ "execution_count": 195,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "input_characters = sorted(list(input_characters))\n",
+ "target_characters = sorted(list(target_characters))\n",
+ "num_encoder_tokens = len(input_characters)\n",
+ "num_decoder_tokens = len(target_characters)\n",
+ "max_encoder_seq_length = max([len(txt) for txt in input_texts])\n",
+ "max_decoder_seq_length = max([len(txt) for txt in target_texts])\n",
+ "\n",
+ "print('Number of samples:', len(input_texts))\n",
+ "print('Number of unique input tokens:', num_encoder_tokens)\n",
+ "print('Number of unique output tokens:', num_decoder_tokens)\n",
+ "print('Max sequence length for inputs:', max_encoder_seq_length)\n",
+ "print('Max sequence length for outputs:', max_decoder_seq_length)\n",
+ "\n",
+ "target_characters"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We'll create two dictionaries to help us get from our characters to numbers and back for both our input and target dataset"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 198,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "{' ': 0, '-': 1, '.': 2, 'A': 3, 'B': 4, 'C': 5, 'D': 6, 'E': 7, 'F': 8, 'G': 9, 'H': 10, 'I': 11, 'J': 12, 'K': 13, 'L': 14, 'M': 15, 'N': 16, 'O': 17, 'P': 18, 'Q': 19, 'R': 20, 'S': 21, 'T': 22, 'U': 23, 'V': 24, 'W': 25, 'X': 26, 'Y': 27, 'Z': 28, 'a': 29, 'b': 30, 'c': 31, 'd': 32, 'e': 33, 'f': 34, 'g': 35, 'h': 36, 'i': 37, 'j': 38, 'k': 39, 'l': 40, 'm': 41, 'n': 42, 'o': 43, 'p': 44, 'q': 45, 'r': 46, 's': 47, 't': 48, 'u': 49, 'v': 50, 'w': 51, 'x': 52, 'y': 53, 'z': 54}\n",
+ "{'\\t': 0, '\\n': 1, ' ': 2, '-': 3, '.': 4, 'A': 5, 'B': 6, 'C': 7, 'D': 8, 'E': 9, 'F': 10, 'G': 11, 'H': 12, 'I': 13, 'J': 14, 'K': 15, 'L': 16, 'M': 17, 'N': 18, 'O': 19, 'P': 20, 'Q': 21, 'R': 22, 'S': 23, 'T': 24, 'U': 25, 'V': 26, 'W': 27, 'X': 28, 'Z': 29, 'a': 30, 'b': 31, 'c': 32, 'd': 33, 'e': 34, 'f': 35, 'g': 36, 'h': 37, 'i': 38, 'j': 39, 'k': 40, 'l': 41, 'm': 42, 'n': 43, 'o': 44, 'p': 45, 'q': 46, 'r': 47, 's': 48, 't': 49, 'u': 50, 'v': 51, 'w': 52, 'x': 53, 'y': 54, 'z': 55}\n"
+ ]
+ }
+ ],
+ "source": [
+ "input_token_index = dict([(char, i) for i, char in enumerate(input_characters)])\n",
+ "target_token_index = dict([(char, i) for i, char in enumerate(target_characters)])\n",
+ "\n",
+ "print(input_token_index)\n",
+ "print(target_token_index)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 199,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# encoder_input_data is a 3D array of shape (num_pairs, max input seq length, num input characters)\n",
+ "encoder_input_data = np.zeros((len(input_texts), max_encoder_seq_length, num_encoder_tokens), dtype='float32')\n",
+ "\n",
+ "# decoder_input_data is a 3D array of shape (num_pairs, max target seq length, num target characters)\n",
+ "decoder_input_data = np.zeros((len(input_texts), max_decoder_seq_length, num_decoder_tokens), dtype='float32')\n",
+ "\n",
+ "# decoder_target_data is the same as decoder_input_data but offset by one timestep. decoder_target_data[:, t, :] will be the same as decoder_input_data[:, t + 1, :].\n",
+ "decoder_target_data = np.zeros((len(input_texts), max_decoder_seq_length, num_decoder_tokens), dtype='float32')"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Building our model"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 200,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# i = training examples\n",
+ "# t = time step\n",
+ "# c = set the position representing the character to 1 (one hot encoded character)\n",
+ "\n",
+ "for i, (input_text, target_text) in enumerate(zip(input_texts, target_texts)):\n",
+ " for t, char in enumerate(input_text):\n",
+ " encoder_input_data[i, t, input_token_index[char]] = 1.\n",
+ " for t, char in enumerate(target_text):\n",
+ " # decoder_target_data is ahead of decoder_input_data by one timestep\n",
+ " decoder_input_data[i, t, target_token_index[char]] = 1.\n",
+ " if t > 0:\n",
+ " # decoder_target_data will be ahead by one timestep\n",
+ " # and will not include the start character.\n",
+ " decoder_target_data[i, t - 1, target_token_index[char]] = 1."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 202,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "latent_dim = 256\n",
+ "\n",
+ "# Define an input sequence and process it.\n",
+ "encoder_inputs = Input(shape=(None, num_encoder_tokens))\n",
+ "encoder = LSTM(latent_dim, return_state=True)\n",
+ "encoder_outputs, state_h, state_c = encoder(encoder_inputs)\n",
+ "\n",
+ "# We discard `encoder_outputs` and only keep the states.\n",
+ "encoder_states = [state_h, state_c]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 203,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Set up the decoder, using `encoder_states` as initial state.\n",
+ "decoder_inputs = Input(shape=(None, num_decoder_tokens))\n",
+ "\n",
+ "# We set up our decoder to return full output sequences,\n",
+ "# and to return internal states as well. We don't use the\n",
+ "# return states in the training model, but we will use them in inference.\n",
+ "decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)\n",
+ "decoder_outputs, _, _ = decoder_lstm(decoder_inputs,\n",
+ " initial_state=encoder_states)\n",
+ "\n",
+ "decoder_dense = Dense(num_decoder_tokens, activation='softmax')\n",
+ "decoder_outputs = decoder_dense(decoder_outputs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 204,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define the model that will turn\n",
+ "# `encoder_input_data` & `decoder_input_data` into `decoder_target_data`\n",
+ "model = Model([encoder_inputs, decoder_inputs], decoder_outputs)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 206,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Train on 273760 samples, validate on 68440 samples\n",
+ "Epoch 1/100\n",
+ "273760/273760 [==============================] - 743s 3ms/step - loss: 0.2597 - val_loss: 1.3135\n",
+ "Epoch 2/100\n",
+ "273760/273760 [==============================] - 702s 3ms/step - loss: 0.0587 - val_loss: 1.5200\n",
+ "Epoch 3/100\n",
+ "273760/273760 [==============================] - 658s 2ms/step - loss: 0.0232 - val_loss: 1.6334\n",
+ "Epoch 4/100\n",
+ "273760/273760 [==============================] - 655s 2ms/step - loss: 0.0141 - val_loss: 1.7563\n",
+ "Epoch 5/100\n",
+ "273760/273760 [==============================] - 648s 2ms/step - loss: 0.0101 - val_loss: 1.7978\n",
+ "Epoch 6/100\n",
+ "273760/273760 [==============================] - 648s 2ms/step - loss: 0.0078 - val_loss: 1.8374\n",
+ "Epoch 7/100\n",
+ "273760/273760 [==============================] - 645s 2ms/step - loss: 0.0062 - val_loss: 1.8761\n",
+ "Epoch 8/100\n",
+ "273760/273760 [==============================] - 658s 2ms/step - loss: 0.0052 - val_loss: 1.9187\n",
+ "Epoch 9/100\n",
+ "273760/273760 [==============================] - 779s 3ms/step - loss: 0.0045 - val_loss: 1.9649\n",
+ "Epoch 10/100\n",
+ "273760/273760 [==============================] - 706s 3ms/step - loss: 0.0039 - val_loss: 1.9650\n",
+ "Epoch 11/100\n",
+ "273760/273760 [==============================] - 640s 2ms/step - loss: 0.0035 - val_loss: 1.9923\n",
+ "Epoch 12/100\n",
+ "242432/273760 [=========================>....] - ETA: 1:06 - loss: 0.0032"
+ ]
+ },
+ {
+ "ename": "KeyboardInterrupt",
+ "evalue": "",
+ "output_type": "error",
+ "traceback": [
+ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)",
+ "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mbatch_size\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mbatch_size\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0mepochs\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mepochs\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m validation_split=0.2)\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;31m# Save model\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0mmodel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msave\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m's2s.h5'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36mfit\u001b[0;34m(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, **kwargs)\u001b[0m\n\u001b[1;32m 1703\u001b[0m \u001b[0minitial_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0minitial_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1704\u001b[0m \u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0msteps_per_epoch\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1705\u001b[0;31m validation_steps=validation_steps)\n\u001b[0m\u001b[1;32m 1706\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1707\u001b[0m def evaluate(self, x=None, y=None,\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/keras/engine/training.py\u001b[0m in \u001b[0;36m_fit_loop\u001b[0;34m(self, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps)\u001b[0m\n\u001b[1;32m 1233\u001b[0m \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mins_batch\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtoarray\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1234\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1235\u001b[0;31m \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mf\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mins_batch\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1236\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1237\u001b[0m \u001b[0mouts\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mouts\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py\u001b[0m in \u001b[0;36m__call__\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m 2476\u001b[0m \u001b[0msession\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mget_session\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2477\u001b[0m updated = session.run(fetches=fetches, feed_dict=feed_dict,\n\u001b[0;32m-> 2478\u001b[0;31m **self.session_kwargs)\n\u001b[0m\u001b[1;32m 2479\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mupdated\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moutputs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2480\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 903\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 904\u001b[0m result = self._run(None, fetches, feed_dict, options_ptr,\n\u001b[0;32m--> 905\u001b[0;31m run_metadata_ptr)\n\u001b[0m\u001b[1;32m 906\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mrun_metadata\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 907\u001b[0m \u001b[0mproto_data\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mtf_session\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTF_GetBuffer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mrun_metadata_ptr\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run\u001b[0;34m(self, handle, fetches, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 1135\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mfinal_fetches\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0mfinal_targets\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mhandle\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mfeed_dict_tensor\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1136\u001b[0m results = self._do_run(handle, final_targets, final_fetches,\n\u001b[0;32m-> 1137\u001b[0;31m feed_dict_tensor, options, run_metadata)\n\u001b[0m\u001b[1;32m 1138\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1139\u001b[0m \u001b[0mresults\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_run\u001b[0;34m(self, handle, target_list, fetch_list, feed_dict, options, run_metadata)\u001b[0m\n\u001b[1;32m 1353\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mhandle\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1354\u001b[0m return self._do_call(_run_fn, self._session, feeds, fetches, targets,\n\u001b[0;32m-> 1355\u001b[0;31m options, run_metadata)\n\u001b[0m\u001b[1;32m 1356\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1357\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0m_prun_fn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_session\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeeds\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetches\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_do_call\u001b[0;34m(self, fn, *args)\u001b[0m\n\u001b[1;32m 1359\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_do_call\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1360\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1361\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1362\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0merrors\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mOpError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0me\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1363\u001b[0m \u001b[0mmessage\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcompat\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mas_text\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0me\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmessage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;32m/usr/local/lib/python3.6/site-packages/tensorflow/python/client/session.py\u001b[0m in \u001b[0;36m_run_fn\u001b[0;34m(session, feed_dict, fetch_list, target_list, options, run_metadata)\u001b[0m\n\u001b[1;32m 1338\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1339\u001b[0m return tf_session.TF_Run(session, options, feed_dict, fetch_list,\n\u001b[0;32m-> 1340\u001b[0;31m target_list, status, run_metadata)\n\u001b[0m\u001b[1;32m 1341\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1342\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_prun_fn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msession\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhandle\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfeed_dict\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfetch_list\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
+ "\u001b[0;31mKeyboardInterrupt\u001b[0m: "
+ ]
+ }
+ ],
+ "source": [
+ "batch_size = 64 # Batch size for training.\n",
+ "epochs = 100 # Number of epochs to train for.\n",
+ "\n",
+ "# Run training\n",
+ "model.compile(optimizer='rmsprop', loss='categorical_crossentropy')\n",
+ "model.fit([encoder_input_data, decoder_input_data], decoder_target_data,\n",
+ " batch_size=batch_size,\n",
+ " epochs=epochs,\n",
+ " validation_split=0.2)\n",
+ "# Save model\n",
+ "model.save('s2s.h5')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": []
+ }
+ ],
+ "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.6.5"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}