From 1352753d41b1bd76feef82c01d86e8859b66f864 Mon Sep 17 00:00:00 2001 From: Spencer Dixon Date: Fri, 13 Apr 2018 09:59:10 +0100 Subject: [PATCH] Added LSTM autoencoder notebook for spell checking --- ...ct with LSTM Autoencoders-checkpoint.ipynb | 1425 ++++++++++++++++ 2. Learning about Trade Data.ipynb | 2 +- ...n Autocorrect with LSTM Autoencoders.ipynb | 1447 +++++++++++++++++ 3 files changed, 2873 insertions(+), 1 deletion(-) create mode 100644 .ipynb_checkpoints/3a. Taxon Autocorrect with LSTM Autoencoders-checkpoint.ipynb create mode 100644 3a. Taxon Autocorrect with LSTM Autoencoders.ipynb 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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Taxon
0Equus przewalskii
1Panthera onca
2Varanus flavescens
3Varanus griseus
4Branta ruficollis
5Leopardus pardalis
6Leopardus wiedii
7Diceros bicornis
8Asarcornis scutulata
9Branta sandvicensis
10Branta sandvicensis
11Cercopithecus diana
12Rucervus duvaucelii
13Crocodylus siamensis
14Elephas maximus
15Elephas maximus
16Elephas maximus
17Elephas maximus
18Equus przewalskii
19Falco peregrinus
20Acinonyx jubatus
21Catopuma temminckii
22Leopardus jacobitus
23Leopardus pardalis mearnsi
24Panthera onca
25Panthera onca
26Panthera onca
27Panthera onca
28Panthera onca
29Panthera onca
......
49339Martes flavigula
49340Mustela sibirica
49341Mustela sibirica
49342Mustela sibirica
49343Mustela sibirica
49344Mustela sibirica
49345Mustela sibirica
49346Mustela sibirica
49347Mustela sibirica
49348Mustela sibirica
49349Mustela sibirica
49350Mustela sibirica
49351Odobenus rosmarus
49352Odobenus rosmarus
49353Odobenus rosmarus
49354Odobenus rosmarus
49355Odobenus rosmarus
49356Odobenus rosmarus
49357Odobenus rosmarus
49358Odobenus rosmarus
49359Lodoicea maldivica
49360Pavo cristatus
49361Pavo cristatus
49362Pavo cristatus
49363Pavo cristatus
49364Pavo cristatus
49365Pavo cristatus
49366Pavo cristatus
49367Alligator mississippiensis
49368Varanus salvator
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
InputTarget
0Equus przeawlskiiEquus przewalskii
1Equs przewalskiiEquus przewalskii
2EquusprzewalskiiEquus przewalskii
3Equus przealskiisEquus przewalskii
4Equus prUewalskiiEquus przewalskii
5Equus prlewalskiiEquus przewalskii
6equus przewalskiiEquus przewalskii
7Equus przewlskiiEquus przewalskii
8EquusPprzewalskiiEquus przewalskii
9Eqlus przewalskiiEquus przewalskii
10Equus pzrewalskiiEquus przewalskii
11Equus przeawlskiiEquus przewalskii
12EquusprzewalskiiEquus przewalskii
13Equus przewlskiiEquus przewalskii
14Equus przewalskjiEquus przewalskii
15Equs przewalskiiEquus przewalskii
16Equus przewlskiiEquus przewalskii
17Equus pzrewalskiiEquus przewalskii
18equus przewalskiiEquus przewalskii
19Equus przewalsNiiEquus przewalskii
20Equus przewalsikiEquus przewalskii
21Equus przealskiuEquus przewalskii
22equus przewalskiiEquus przewalskii
23Equus przeawlskiiEquus przewalskii
24Equus przealWkiiEquus przewalskii
25equus przewalskiiEquus przewalskii
26Equusp rzewalskiiEquus przewalskii
27Equus prEewalskiiEquus przewalskii
28equus przewalskiiEquus przewalskii
29squus przewalskiiEquus przewalskii
.........
342170martes flavigulaMartes flavigula
342171Martes fwavgulaMartes flavigula
342172Martek flvigulaMartes flavigula
342173Martes fwvigulaMartes flavigula
342174Martes flaigulaMartes flavigula
342175Martes flavigulMartes flavigula
342176martes flavigulaMartes flavigula
342177martes flavigulaMartes flavigula
342178Martes flaJigulaMartes flavigula
342179partes flavigulaMartes flavigula
342180Martes lfavigulaMartes flavigula
342181MarteP flavigulaMartes flavigula
342182Martes flvibulaMartes flavigula
342183Martse flavigulaMartes flavigula
342184Martes flaviulaMartes flavigula
342185Martes flavigualMartes flavigula
342186martes flavigulaMartes flavigula
342187Marts flavigulaMartes flavigula
342188MartesflavigulaMartes flavigula
342189Martes flNvigulaMartes flavigula
342190martes flavigulaMartes flavigula
342191martes flavigulaMartes flavigula
342192Maxtes flavigulaMartes flavigula
342193Martes flavigulaaMartes flavigula
342194Martes flavigXlaMartes flavigula
342195aMrtes flavigulaMartes flavigula
342196MartesLflavigulaMartes flavigula
342197Marets flavigulaMartes flavigula
342198Martes flaviulaMartes flavigula
342199martes flavigulaMartes flavigula
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
Taxon
0Equus przewalskii
1Panthera onca
2Varanus flavescens
3Varanus griseus
4Branta ruficollis
5Leopardus pardalis
6Leopardus wiedii
7Diceros bicornis
8Asarcornis scutulata
9Branta sandvicensis
10Branta sandvicensis
11Cercopithecus diana
12Rucervus duvaucelii
13Crocodylus siamensis
14Elephas maximus
15Elephas maximus
16Elephas maximus
17Elephas maximus
18Equus przewalskii
19Falco peregrinus
20Acinonyx jubatus
21Catopuma temminckii
22Leopardus jacobitus
23Leopardus pardalis mearnsi
24Panthera onca
25Panthera onca
26Panthera onca
27Panthera onca
28Panthera onca
29Panthera onca
......
49339Martes flavigula
49340Mustela sibirica
49341Mustela sibirica
49342Mustela sibirica
49343Mustela sibirica
49344Mustela sibirica
49345Mustela sibirica
49346Mustela sibirica
49347Mustela sibirica
49348Mustela sibirica
49349Mustela sibirica
49350Mustela sibirica
49351Odobenus rosmarus
49352Odobenus rosmarus
49353Odobenus rosmarus
49354Odobenus rosmarus
49355Odobenus rosmarus
49356Odobenus rosmarus
49357Odobenus rosmarus
49358Odobenus rosmarus
49359Lodoicea maldivica
49360Pavo cristatus
49361Pavo cristatus
49362Pavo cristatus
49363Pavo cristatus
49364Pavo cristatus
49365Pavo cristatus
49366Pavo cristatus
49367Alligator mississippiensis
49368Varanus salvator
\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", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
InputTarget
0Equus przeawlskiiEquus przewalskii
1Equs przewalskiiEquus przewalskii
2EquusprzewalskiiEquus przewalskii
3Equus przealskiisEquus przewalskii
4Equus prUewalskiiEquus przewalskii
5Equus prlewalskiiEquus przewalskii
6equus przewalskiiEquus przewalskii
7Equus przewlskiiEquus przewalskii
8EquusPprzewalskiiEquus przewalskii
9Eqlus przewalskiiEquus przewalskii
10Equus pzrewalskiiEquus przewalskii
11Equus przeawlskiiEquus przewalskii
12EquusprzewalskiiEquus przewalskii
13Equus przewlskiiEquus przewalskii
14Equus przewalskjiEquus przewalskii
15Equs przewalskiiEquus przewalskii
16Equus przewlskiiEquus przewalskii
17Equus pzrewalskiiEquus przewalskii
18equus przewalskiiEquus przewalskii
19Equus przewalsNiiEquus przewalskii
20Equus przewalsikiEquus przewalskii
21Equus przealskiuEquus przewalskii
22equus przewalskiiEquus przewalskii
23Equus przeawlskiiEquus przewalskii
24Equus przealWkiiEquus przewalskii
25equus przewalskiiEquus przewalskii
26Equusp rzewalskiiEquus przewalskii
27Equus prEewalskiiEquus przewalskii
28equus przewalskiiEquus przewalskii
29squus przewalskiiEquus przewalskii
.........
342170martes flavigulaMartes flavigula
342171Martes fwavgulaMartes flavigula
342172Martek flvigulaMartes flavigula
342173Martes fwvigulaMartes flavigula
342174Martes flaigulaMartes flavigula
342175Martes flavigulMartes flavigula
342176martes flavigulaMartes flavigula
342177martes flavigulaMartes flavigula
342178Martes flaJigulaMartes flavigula
342179partes flavigulaMartes flavigula
342180Martes lfavigulaMartes flavigula
342181MarteP flavigulaMartes flavigula
342182Martes flvibulaMartes flavigula
342183Martse flavigulaMartes flavigula
342184Martes flaviulaMartes flavigula
342185Martes flavigualMartes flavigula
342186martes flavigulaMartes flavigula
342187Marts flavigulaMartes flavigula
342188MartesflavigulaMartes flavigula
342189Martes flNvigulaMartes flavigula
342190martes flavigulaMartes flavigula
342191martes flavigulaMartes flavigula
342192Maxtes flavigulaMartes flavigula
342193Martes flavigulaaMartes flavigula
342194Martes flavigXlaMartes flavigula
342195aMrtes flavigulaMartes flavigula
342196MartesLflavigulaMartes flavigula
342197Marets flavigulaMartes flavigula
342198Martes flaviulaMartes flavigula
342199martes flavigulaMartes flavigula
\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 +}