{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "seq2seq_translator.ipynb",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "[View in Colaboratory](https://colab.research.google.com/github/gmihaila/toy_models/blob/master/seq2seq_translator.ipynb)"
      ]
    },
    {
      "metadata": {
        "id": "CAehfVpYiSPu",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Text Translation\n",
        "### It uses Encoder-Decoder architecture with repeat vector.\n",
        "\n",
        "by GeorgeM.\n"
      ]
    },
    {
      "metadata": {
        "id": "2MRQ-Z8bPXHU",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "#@title\n",
        "!apt-get -qq install -y graphviz && pip install -q pydot"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "AFLOHHfXiQ7T",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 255
        },
        "outputId": "44d17440-8086-47dc-fa72-8fcc01310767"
      },
      "cell_type": "code",
      "source": [
        "!wget http://www.manythings.org/anki/deu-eng.zip\n",
        "!unzip deu-eng.zip"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "--2018-05-26 16:17:26--  http://www.manythings.org/anki/deu-eng.zip\n",
            "Resolving www.manythings.org (www.manythings.org)... 104.24.109.196, 104.24.108.196, 2400:cb00:2048:1::6818:6cc4, ...\n",
            "Connecting to www.manythings.org (www.manythings.org)|104.24.109.196|:80... connected.\n",
            "HTTP request sent, awaiting response... 200 OK\n",
            "Length: 4012023 (3.8M) [application/zip]\n",
            "Saving to: ‘deu-eng.zip’\n",
            "\n",
            "deu-eng.zip         100%[===================>]   3.83M  3.61MB/s    in 1.1s    \n",
            "\n",
            "2018-05-26 16:17:27 (3.61 MB/s) - ‘deu-eng.zip’ saved [4012023/4012023]\n",
            "\n",
            "Archive:  deu-eng.zip\n",
            "  inflating: deu.txt                 \n",
            "  inflating: _about.txt              \n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "GqUXOJZrYxC2",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "import sys\n",
        "import string\n",
        "import re\n",
        "from unicodedata import normalize\n",
        "from numpy import array\n",
        "from numpy import argmax\n",
        "\n",
        "from pickle import dump\n",
        "from numpy.random import rand\n",
        "from numpy.random import shuffle\n",
        "\n",
        "from pickle import load\n",
        "from numpy import array\n",
        "from keras.preprocessing.text import Tokenizer\n",
        "from keras.preprocessing.sequence import pad_sequences\n",
        "from keras.utils import to_categorical\n",
        "from keras.utils.vis_utils import plot_model\n",
        "from keras.models import load_model\n",
        "from keras.models import Sequential\n",
        "from keras.layers import LSTM\n",
        "from keras.layers import Dense\n",
        "from keras.layers import Embedding\n",
        "from keras.layers import RepeatVector\n",
        "from keras.layers import TimeDistributed\n",
        "from keras.callbacks import ModelCheckpoint\n",
        "\n",
        "from nltk.translate.bleu_score import corpus_bleu\n",
        "\n",
        "import pydot\n",
        "from IPython.display import Image"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "pkRUYTD_aX8-",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 204
        },
        "outputId": "214838ec-422b-4f4f-c5c9-4f4ebb8dc17e"
      },
      "cell_type": "code",
      "source": [
        "# load doc into memory\n",
        "def load_doc(filename):\n",
        "  # open the file as read only\n",
        "  file = open(filename, mode='rt', encoding='utf-8')\n",
        "  # read all text\n",
        "  text = file.read()\n",
        "  # close the file\n",
        "  file.close()\n",
        "  return text\n",
        "\n",
        "# split a loaded document into sentences\n",
        "def to_pairs(doc):\n",
        "  lines = doc.strip().split('\\n')\n",
        "  pairs = [line.split('\\t') for line in  lines]\n",
        "  return pairs\n",
        "\n",
        "# clean a list of lines\n",
        "def clean_pairs(lines):\n",
        "  cleaned = list()\n",
        "  # prepare regex for char filtering\n",
        "  re_print = re.compile('[^%s]' % re.escape(string.printable))\n",
        "  # prepare translation table for removing punctuation\n",
        "  table = str.maketrans('', '', string.punctuation)\n",
        "  for pair in lines:\n",
        "    clean_pair = list()\n",
        "    for line in pair:\n",
        "      # normalize unicode characters\n",
        "      line = normalize('NFD', line).encode('ascii', 'ignore')\n",
        "      line = line.decode('UTF-8')\n",
        "      # tokenize on white space\n",
        "      line = line.split()\n",
        "      # convert to lowercase\n",
        "      line = [word.lower() for word in line]\n",
        "      # remove punctuation from each token\n",
        "      line = [word.translate(table) for word in line]\n",
        "      # remove non-printable chars form each token\n",
        "      line = [re_print.sub('', w) for w in line]\n",
        "      # remove tokens with numbers in them\n",
        "      line = [word for word in line if word.isalpha()]\n",
        "      # store as string\n",
        "      clean_pair.append(' '.join(line))\n",
        "    cleaned.append(clean_pair)\n",
        "  return array(cleaned)\n",
        "\n",
        "# save a list of clean sentences to file\n",
        "def save_clean_data(sentences, filename):\n",
        "  dump(sentences, open(filename, 'wb'))\n",
        "  print('Saved: %s' % filename)\n",
        "\n",
        "# load dataset\n",
        "filename = 'deu.txt'\n",
        "doc = load_doc(filename)\n",
        "# split into english-german pairs\n",
        "pairs = to_pairs(doc)\n",
        "# clean sentences\n",
        "clean_pairs = clean_pairs(pairs)\n",
        "# save clean pairs to file\n",
        "save_clean_data(clean_pairs, 'english-german.pkl')\n",
        "# spot check\n",
        "for i in range(10):\n",
        "  print('[%s] => [%s]' % (clean_pairs[i,0], clean_pairs[i,1]))"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Saved: english-german.pkl\n",
            "[hi] => [hallo]\n",
            "[hi] => [gru gott]\n",
            "[run] => [lauf]\n",
            "[fire] => [feuer]\n",
            "[help] => [hilfe]\n",
            "[help] => [zu hulf]\n",
            "[stop] => [stopp]\n",
            "[wait] => [warte]\n",
            "[go on] => [mach weiter]\n",
            "[hello] => [hallo]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "FAtNA2PNfNdb",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 68
        },
        "outputId": "de01d100-fd11-492d-c2ed-76fabf86cd7a"
      },
      "cell_type": "code",
      "source": [
        "# load a clean dataset\n",
        "def load_clean_sentences(filename):\n",
        "  return load(open(filename, 'rb'))\n",
        "\n",
        "\n",
        "# load dataset\n",
        "raw_dataset = load_clean_sentences('english-german.pkl')\n",
        "\n",
        "# reduce dataset size\n",
        "n_sentences = 10000\n",
        "dataset = raw_dataset[:n_sentences, :]\n",
        "# random shuffle\n",
        "shuffle(dataset)\n",
        "# split into train/test\n",
        "train, test = dataset[:9000], dataset[9000:]\n",
        "# save\n",
        "save_clean_data(dataset, 'english-german-both.pkl')\n",
        "save_clean_data(train, 'english-german-train.pkl')\n",
        "save_clean_data(test, 'english-german-test.pkl')\n"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Saved: english-german-both.pkl\n",
            "Saved: english-german-train.pkl\n",
            "Saved: english-german-test.pkl\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "TJBanPMlsScY",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "# fit a tokenizer\n",
        "def create_tokenizer(lines):\n",
        "  tokenizer = Tokenizer()\n",
        "  tokenizer.fit_on_texts(lines)\n",
        "  return tokenizer\n",
        "\n",
        "# max sentence length\n",
        "def max_length(lines):\n",
        "  return max(len(line.split()) for line in lines)\n",
        "\n",
        "# encode and pad sequences\n",
        "def encode_sequences(tokenizer, length, lines):\n",
        "  # integer encode sequences\n",
        "  X = tokenizer.texts_to_sequences(lines)\n",
        "  # pad sequences with 0 values\n",
        "  X = pad_sequences(X, maxlen=length, padding='post')\n",
        "  return X\n",
        "\n",
        "# one hot encode target sequence\n",
        "def encode_output(sequences, vocab_size):\n",
        "  ylist = list()\n",
        "  for sequence in sequences:\n",
        "    encoded = to_categorical(sequence, num_classes=vocab_size)\n",
        "    ylist.append(encoded)\n",
        "  y = array(ylist)\n",
        "  y = y.reshape(sequences.shape[0], sequences.shape[1], vocab_size)\n",
        "  return y\n",
        "\n",
        "# define NMT model\n",
        "def define_model(src_vocab, tar_vocab, src_timesteps, tar_timesteps, n_units):\n",
        "  model = Sequential()\n",
        "  model.add(Embedding(src_vocab, n_units, input_length=src_timesteps, mask_zero=True))\n",
        "  model.add(LSTM(n_units))\n",
        "  model.add(RepeatVector(tar_timesteps))\n",
        "  model.add(LSTM(n_units, return_sequences=True))\n",
        "  model.add(TimeDistributed(Dense(tar_vocab, activation='softmax')))\n",
        "  return model\n",
        "\n",
        "# map an integer to a word\n",
        "def word_for_id(integer, tokenizer):\n",
        "  for word, index in tokenizer.word_index.items():\n",
        "    if index == integer:\n",
        "      return word\n",
        "  return None\n",
        "\n",
        "# generate target given source sequence\n",
        "def predict_sequence(model, tokenizer, source):\n",
        "  prediction = model.predict(source, verbose=0)[0]\n",
        "  integers = [argmax(vector) for vector in prediction]\n",
        "  target = list()\n",
        "  for i in integers:\n",
        "    word = word_for_id(i, tokenizer)\n",
        "    if word is None:\n",
        "      break\n",
        "    target.append(word)\n",
        "  return ' '.join(target)\n",
        "\n",
        "# evaluate the skill of the model\n",
        "def evaluate_model(model, tokenizer, sources, raw_dataset):\n",
        "  actual, predicted = list(), list()\n",
        "  for i, source in enumerate(sources):\n",
        "    # translate encoded source text\n",
        "    source = source.reshape((1, source.shape[0]))\n",
        "    translation = predict_sequence(model, eng_tokenizer, source)\n",
        "    raw_target, raw_src = raw_dataset[i]\n",
        "    if i < 10:\n",
        "      print('src=[%s], target=[%s], predicted=[%s]' % (raw_src, raw_target, translation))\n",
        "    actual.append(raw_target.split())\n",
        "    predicted.append(translation.split())\n",
        "  # calculate BLEU score\n",
        "  print('BLEU-1: %f' % corpus_bleu(actual, predicted, weights=(1.0, 0, 0, 0)))\n",
        "  print('BLEU-2: %f' % corpus_bleu(actual, predicted, weights=(0.5, 0.5, 0, 0)))\n",
        "  print('BLEU-3: %f' % corpus_bleu(actual, predicted, weights=(0.3, 0.3, 0.3, 0)))\n",
        "  print('BLEU-4: %f' % corpus_bleu(actual, predicted, weights=(0.25, 0.25, 0.25, 0.25)))\n"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "KyPZD5qxs05U",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 85
        },
        "outputId": "5a6ea24e-a405-406c-de6a-54734a5f961e"
      },
      "cell_type": "code",
      "source": [
        "# load datasets\n",
        "dataset = load_clean_sentences('english-german-both.pkl')\n",
        "train = load_clean_sentences('english-german-train.pkl')\n",
        "test = load_clean_sentences('english-german-test.pkl')\n",
        "\n",
        "# prepare english tokenizer\n",
        "eng_tokenizer = create_tokenizer(dataset[:, 0])\n",
        "eng_vocab_size = len(eng_tokenizer.word_index) + 1\n",
        "eng_length = max_length(dataset[:, 0])\n",
        "print('English Vocabulary Size: %d' % eng_vocab_size)\n",
        "print('English Max Length: %d' % (eng_length))\n",
        "# prepare german tokenizer\n",
        "ger_tokenizer = create_tokenizer(dataset[:, 1])\n",
        "ger_vocab_size = len(ger_tokenizer.word_index) + 1\n",
        "ger_length = max_length(dataset[:, 1])\n",
        "print('German Vocabulary Size: %d' % ger_vocab_size)\n",
        "print('German Max Length: %d' % (ger_length))\n",
        "\n",
        "# prepare training data\n",
        "trainX = encode_sequences(ger_tokenizer, ger_length, train[:, 1])\n",
        "trainY = encode_sequences(eng_tokenizer, eng_length, train[:, 0])\n",
        "trainY = encode_output(trainY, eng_vocab_size)\n",
        "# prepare validation data\n",
        "testX = encode_sequences(ger_tokenizer, ger_length, test[:, 1])\n",
        "testY = encode_sequences(eng_tokenizer, eng_length, test[:, 0])\n",
        "testY = encode_output(testY, eng_vocab_size)"
      ],
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "English Vocabulary Size: 2315\n",
            "English Max Length: 5\n",
            "German Vocabulary Size: 3686\n",
            "German Max Length: 10\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "Yy-ozX2ks7qF",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 323
        },
        "outputId": "c736b2b1-d6db-4902-c00c-4549d8a3df45"
      },
      "cell_type": "code",
      "source": [
        "# define model\n",
        "model = define_model(ger_vocab_size, eng_vocab_size, ger_length, eng_length, 256)\n",
        "model.compile(optimizer='adam', loss='categorical_crossentropy')\n",
        "# summarize defined model\n",
        "print(model.summary())"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "embedding_1 (Embedding)      (None, 10, 256)           943616    \n",
            "_________________________________________________________________\n",
            "lstm_1 (LSTM)                (None, 256)               525312    \n",
            "_________________________________________________________________\n",
            "repeat_vector_1 (RepeatVecto (None, 5, 256)            0         \n",
            "_________________________________________________________________\n",
            "lstm_2 (LSTM)                (None, 5, 256)            525312    \n",
            "_________________________________________________________________\n",
            "time_distributed_1 (TimeDist (None, 5, 2315)           594955    \n",
            "=================================================================\n",
            "Total params: 2,589,195\n",
            "Trainable params: 2,589,195\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n",
            "None\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "Tk7MHB4OtCgg",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 644
        },
        "outputId": "6cc2bcf3-f685-4181-abcc-ea10f9d504ef"
      },
      "cell_type": "code",
      "source": [
        "plot_model(model, to_file='model.png', show_shapes=True)\n",
        "Image('model.png')"
      ],
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "image/png": "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\nRGRSmKQQEREREZFJYZJCREREREQmhUkKERERERGZFCYpRERERERkUpikEBERERGRSWGSQkRERERE\nJoVJChERERERmRQmKUREREREZFKYpBARERERkUlhkkJERERERCaFSQoREREREZkUJilERERERGRS\nmKQQEREREZFJkYQQwthBEBFR8/Lll19i06ZNGmU3b96Eg4MDrK2t1WVdunRBYmJiU4dHRETNnLmx\nAyAiouanpKQE586d0yovKirS+LumpqapQiIiohaEw72IiEhvkyZNgiRJj61jYWGBN998s2kCIiKi\nFoXDvYiIyCB9+/bFmTNnUNs/I5Ik4erVq+jSpUvTBkZERM0en6QQEZFBpk6dilatWuncZmZmhv79\n+zNBISIigzBJISIig0yaNKnWd07MzMwwderUJo6IiIhaCiYpRERkkPbt22PIkCE6n6YIIfD6668b\nISoiImoJmKQQEZHBQkNDtd5JadWqFUaMGIH27dsbKSoiImrumKQQEZHBXn/9dZiba85mL4TAlClT\njBQRERG1BExSiIjIYHZ2dhg1apRGomJubo5x48YZMSoiImrumKQQEVG9TJkyBdXV1QAeJCgBAQGw\ns7MzclRERNScMUkhIqJ68ff3h7W1NQCguroaISEhRo6IiIiaOyYpRERUL1ZWVuqZvBQKBUaOHGnk\niIiIqLkzf3IVoqfD9evXkZycbOwwiJolV1dXAEC/fv3w3XffGTkaoubJyckJ3t7exg6DyCRI4tG5\nI4meUpMnT8auXbuMHQYRET2lzM3Ncf/+fWOHQWQS+CSF6P9UV1cjKCgICQkJxg6FngITJ04EAF5v\nTUCSJMTHx6vPOZEpSkhIQHBwsLHDIDIZfCeFiIiIiIhMCpMUIiIiIiIyKUxSiIiIiIjIpDBJISIi\nIiIik8IkhYiIiIiITAqTFCIiolrcuHED48aNQ3FxMfLy8iBJkvrj6emJiooKrX0erSdJEvr27WuE\n6BvPwYMH0b17d5ibP3mS0NTUVIwZMwb29vawtbXFiBEjcOLEiXrHcOfOHWzYsAE+Pj5o06YN5HI5\nnn32WYSEhCAtLU3nPoMHD9b6blSf8PBwnfvcv38f0dHR8PLygq2tLdq3b49Ro0YhMTERD6/isGDB\nAsTHx9f7uIjoASYpRETNXGlpKZ599ln4+/sbO5QWJTU1FX379oWvry/s7OzQtm1bCCHUi76mpqbq\n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\nebPBbbgbR/ciMo9CxEQnYiLSGzt2LADouwkQNaeWeL6FhobiypUrzTI6VHNSKBRIT0/X73NzlJWV\nISQkBCNGjMDy5cubMTr7KS0thb+/PxITE7Fq1aoW174t5OTkoG/fvli/fj3GjRtn0Wc3btyIhIQE\nk89wEdF/sLsXERGRmTQaDTIyMrB582YsW7bM3uE0ORFBSkoK2rdvj48++qjFtW8L586dQ1xcHGbO\nnGlxgkJE5mOSQkREZIG+ffsiOzsbu3btwvXr1+0dTpMqKirCuXPnsHfvXqtGErN3+7awYsUKzJ8/\nH/Pnz7d3KEStmnPDVYiIiIwtXrwYM2bM0L9XKBSYPXs25s2bZ8eobKNbt27YsWOHvcNocr6+vti/\nf3+Lbd8WFi5caO8QiNoEJilERGSV6dOnY/r06fYOg4iIWiF29yIiIiIiIofCJIWIiIiIiBwKkxQi\nIiIiInIoTFKIiIiIiMih8MF5IjNkZmZaNOEbkbUyMzMBgOebjSxZsgSbN2+2dxjUhly4cMHeIRC1\nCExSiBoQHx9v7xCoDRk4cKC9Q7DaP/7xDzz66KPw8fGxdyhm4d822UNgYGCL/jsnshWFiIi9gyAi\nopZPoVAgPT2dd4GIiKjR+EwKERERERE5FCYpRERERETkUJikEBERERGRQ2GSQkREREREDoVJChER\nERERORQmKURERERE5FCYpBARERERkUNhkkJERERERA6FSQoRERERETkUJilERERERORQmKQQERER\nEZFDYZJCREREREQOhUkKERERERE5FCYpRERERETkUJikEBERERGRQ2GSQkREREREDoVJChERERER\nORQmKURERERE5FCYpBARERERkUNhkkJERERERA6FSQoRERERETkUJilERERERORQmKQQEREREZFD\nYZJCREREREQOhUkKERERERE5FCYpRERERETkUJikEBERERGRQ2GSQkREREREDoVJChERERERORQm\nKURERERE5FCYpBARERERkUNhkkJERERERA6FSQoRERERETkUhYiIvYMgIqKW5a9//StWrlxpUHbh\nwgV4e3vD3d1dX9atWzdkZGTYOjwiImrhnO0dABERtTzl5eU4fvy4UXlZWZnB+7q6OluFRERErQi7\nexERkcXGjRsHhUJx3zouLi545ZVXbBMQERG1KuzuRUREVunXrx+OHDmC+v4bUSgUOHfuHLp162bb\n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\nqYIAAAAASUVORK5CYII=\n",
            "text/plain": [
              "<IPython.core.display.Image object>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 7
        }
      ]
    },
    {
      "metadata": {
        "id": "b3zyGWEOtOum",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 2091
        },
        "outputId": "a00d2006-aafd-4f60-83ef-80e2ecfbe8f9"
      },
      "cell_type": "code",
      "source": [
        "checkpoint = ModelCheckpoint('model.h5', monitor='val_loss', verbose=1, save_best_only=True, mode='min')\n",
        "model.fit(trainX, trainY, epochs=30, batch_size=64, validation_data=(testX, testY), callbacks=[checkpoint], verbose=2)"
      ],
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Train on 9000 samples, validate on 1000 samples\n",
            "Epoch 1/30\n",
            " - 7s - loss: 0.4126 - val_loss: 2.0727\n",
            "\n",
            "Epoch 00001: val_loss improved from inf to 2.07269, saving model to model.h5\n",
            "Epoch 2/30\n",
            " - 7s - loss: 0.3805 - val_loss: 2.0650\n",
            "\n",
            "Epoch 00002: val_loss improved from 2.07269 to 2.06503, saving model to model.h5\n",
            "Epoch 3/30\n",
            " - 7s - loss: 0.3486 - val_loss: 2.0634\n",
            "\n",
            "Epoch 00003: val_loss improved from 2.06503 to 2.06338, saving model to model.h5\n",
            "Epoch 4/30\n",
            " - 7s - loss: 0.3214 - val_loss: 2.0685\n",
            "\n",
            "Epoch 00004: val_loss did not improve from 2.06338\n",
            "Epoch 5/30\n",
            " - 7s - loss: 0.2982 - val_loss: 2.0556\n",
            "\n",
            "Epoch 00005: val_loss improved from 2.06338 to 2.05560, saving model to model.h5\n",
            "Epoch 6/30\n",
            " - 7s - loss: 0.2740 - val_loss: 2.0779\n",
            "\n",
            "Epoch 00006: val_loss did not improve from 2.05560\n",
            "Epoch 7/30\n",
            " - 7s - loss: 0.2541 - val_loss: 2.0854\n",
            "\n",
            "Epoch 00007: val_loss did not improve from 2.05560\n",
            "Epoch 8/30\n",
            " - 7s - loss: 0.2351 - val_loss: 2.0881\n",
            "\n",
            "Epoch 00008: val_loss did not improve from 2.05560\n",
            "Epoch 9/30\n",
            " - 7s - loss: 0.2210 - val_loss: 2.0927\n",
            "\n",
            "Epoch 00009: val_loss did not improve from 2.05560\n",
            "Epoch 10/30\n",
            " - 7s - loss: 0.2052 - val_loss: 2.1076\n",
            "\n",
            "Epoch 00010: val_loss did not improve from 2.05560\n",
            "Epoch 11/30\n",
            " - 7s - loss: 0.1927 - val_loss: 2.0935\n",
            "\n",
            "Epoch 00011: val_loss did not improve from 2.05560\n",
            "Epoch 12/30\n",
            " - 7s - loss: 0.1815 - val_loss: 2.1055\n",
            "\n",
            "Epoch 00012: val_loss did not improve from 2.05560\n",
            "Epoch 13/30\n",
            " - 7s - loss: 0.1714 - val_loss: 2.1203\n",
            "\n",
            "Epoch 00013: val_loss did not improve from 2.05560\n",
            "Epoch 14/30\n",
            " - 7s - loss: 0.1634 - val_loss: 2.1106\n",
            "\n",
            "Epoch 00014: val_loss did not improve from 2.05560\n",
            "Epoch 15/30\n",
            " - 7s - loss: 0.1545 - val_loss: 2.1353\n",
            "\n",
            "Epoch 00015: val_loss did not improve from 2.05560\n",
            "Epoch 16/30\n",
            " - 7s - loss: 0.1482 - val_loss: 2.1357\n",
            "\n",
            "Epoch 00016: val_loss did not improve from 2.05560\n",
            "Epoch 17/30\n",
            " - 7s - loss: 0.1429 - val_loss: 2.1509\n",
            "\n",
            "Epoch 00017: val_loss did not improve from 2.05560\n",
            "Epoch 18/30\n",
            " - 7s - loss: 0.1377 - val_loss: 2.1519\n",
            "\n",
            "Epoch 00018: val_loss did not improve from 2.05560\n",
            "Epoch 19/30\n",
            " - 7s - loss: 0.1319 - val_loss: 2.1741\n",
            "\n",
            "Epoch 00019: val_loss did not improve from 2.05560\n",
            "Epoch 20/30\n",
            " - 7s - loss: 0.1276 - val_loss: 2.1732\n",
            "\n",
            "Epoch 00020: val_loss did not improve from 2.05560\n",
            "Epoch 21/30\n",
            " - 7s - loss: 0.1252 - val_loss: 2.1700\n",
            "\n",
            "Epoch 00021: val_loss did not improve from 2.05560\n",
            "Epoch 22/30\n",
            " - 7s - loss: 0.1213 - val_loss: 2.1875\n",
            "\n",
            "Epoch 00022: val_loss did not improve from 2.05560\n",
            "Epoch 23/30\n",
            " - 7s - loss: 0.1175 - val_loss: 2.1884\n",
            "\n",
            "Epoch 00023: val_loss did not improve from 2.05560\n",
            "Epoch 24/30\n",
            " - 7s - loss: 0.1131 - val_loss: 2.2180\n",
            "\n",
            "Epoch 00024: val_loss did not improve from 2.05560\n",
            "Epoch 25/30\n",
            " - 7s - loss: 0.1100 - val_loss: 2.2264\n",
            "\n",
            "Epoch 00025: val_loss did not improve from 2.05560\n",
            "Epoch 26/30\n",
            " - 7s - loss: 0.1091 - val_loss: 2.2055\n",
            "\n",
            "Epoch 00026: val_loss did not improve from 2.05560\n",
            "Epoch 27/30\n",
            " - 7s - loss: 0.1073 - val_loss: 2.2192\n",
            "\n",
            "Epoch 00027: val_loss did not improve from 2.05560\n",
            "Epoch 28/30\n",
            " - 7s - loss: 0.1058 - val_loss: 2.2305\n",
            "\n",
            "Epoch 00028: val_loss did not improve from 2.05560\n",
            "Epoch 29/30\n",
            " - 7s - loss: 0.1034 - val_loss: 2.2251\n",
            "\n",
            "Epoch 00029: val_loss did not improve from 2.05560\n",
            "Epoch 30/30\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            " - 7s - loss: 0.1025 - val_loss: 2.2461\n",
            "\n",
            "Epoch 00030: val_loss did not improve from 2.05560\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "<keras.callbacks.History at 0x7f68311b47f0>"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 13
        }
      ]
    },
    {
      "metadata": {
        "id": "cK4LIQtFtezG",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 663
        },
        "outputId": "eec62178-38fd-40b1-a34b-4cd08c731adb"
      },
      "cell_type": "code",
      "source": [
        "\n",
        "# load a clean dataset\n",
        "def load_clean_sentences(filename):\n",
        "  return load(open(filename, 'rb'))\n",
        "\n",
        "# fit a tokenizer\n",
        "def create_tokenizer(lines):\n",
        "  tokenizer = Tokenizer()\n",
        "  tokenizer.fit_on_texts(lines)\n",
        "  return tokenizer\n",
        "\n",
        "# max sentence length\n",
        "def max_length(lines):\n",
        "  return max(len(line.split()) for line in lines)\n",
        "\n",
        "# encode and pad sequences\n",
        "def encode_sequences(tokenizer, length, lines):\n",
        "  # integer encode sequences\n",
        "  X = tokenizer.texts_to_sequences(lines)\n",
        "  # pad sequences with 0 values\n",
        "  X = pad_sequences(X, maxlen=length, padding='post')\n",
        "  return X\n",
        "\n",
        "# map an integer to a word\n",
        "def word_for_id(integer, tokenizer):\n",
        "  for word, index in tokenizer.word_index.items():\n",
        "    if index == integer:\n",
        "      return word\n",
        "  return None\n",
        "\n",
        "# generate target given source sequence\n",
        "def predict_sequence(model, tokenizer, source):\n",
        "  prediction = model.predict(source, verbose=0)[0]\n",
        "  integers = [argmax(vector) for vector in prediction]\n",
        "  target = list()\n",
        "  for i in integers:\n",
        "    word = word_for_id(i, tokenizer)\n",
        "    if word is None:\n",
        "      break\n",
        "    target.append(word)\n",
        "  return ' '.join(target)\n",
        "\n",
        "# evaluate the skill of the model\n",
        "def evaluate_model(model, tokenizer, sources, raw_dataset):\n",
        "  actual, predicted = list(), list()\n",
        "  for i, source in enumerate(sources):\n",
        "    # translate encoded source text\n",
        "    source = source.reshape((1, source.shape[0]))\n",
        "    translation = predict_sequence(model, eng_tokenizer, source)\n",
        "    raw_target, raw_src = raw_dataset[i]\n",
        "    if i < 10:\n",
        "      print('src=[%s], target=[%s], predicted=[%s]' % (raw_src, raw_target, translation))\n",
        "    actual.append(raw_target.split())\n",
        "    predicted.append(translation.split())\n",
        "  # calculate BLEU score\n",
        "  print('BLEU-1: %f' % corpus_bleu(actual, predicted, weights=(1.0, 0, 0, 0)))\n",
        "  print('BLEU-2: %f' % corpus_bleu(actual, predicted, weights=(0.5, 0.5, 0, 0)))\n",
        "  print('BLEU-3: %f' % corpus_bleu(actual, predicted, weights=(0.3, 0.3, 0.3, 0)))\n",
        "  print('BLEU-4: %f' % corpus_bleu(actual, predicted, weights=(0.25, 0.25, 0.25, 0.25)))\n",
        "\n",
        "# load datasets\n",
        "dataset = load_clean_sentences('english-german-both.pkl')\n",
        "train = load_clean_sentences('english-german-train.pkl')\n",
        "test = load_clean_sentences('english-german-test.pkl')\n",
        "# prepare english tokenizer\n",
        "eng_tokenizer = create_tokenizer(dataset[:, 0])\n",
        "eng_vocab_size = len(eng_tokenizer.word_index) + 1\n",
        "eng_length = max_length(dataset[:, 0])\n",
        "# prepare german tokenizer\n",
        "ger_tokenizer = create_tokenizer(dataset[:, 1])\n",
        "ger_vocab_size = len(ger_tokenizer.word_index) + 1\n",
        "ger_length = max_length(dataset[:, 1])\n",
        "# prepare data\n",
        "trainX = encode_sequences(ger_tokenizer, ger_length, train[:, 1])\n",
        "testX = encode_sequences(ger_tokenizer, ger_length, test[:, 1])\n",
        "\n",
        "# load model\n",
        "model = load_model('model.h5')\n",
        "# test on some training sequences\n",
        "print('train')\n",
        "evaluate_model(model, eng_tokenizer, trainX, train)\n",
        "# test on some test sequences\n",
        "print('test')\n",
        "evaluate_model(model, eng_tokenizer, testX, test)\n",
        "\n"
      ],
      "execution_count": 24,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "train\n",
            "src=[frauen lieben tom], target=[women like tom], predicted=[women like tom]\n",
            "src=[bis dann], target=[see you then], predicted=[see you then]\n",
            "src=[ich bin lehrerin], target=[im a teacher], predicted=[i a a teacher]\n",
            "src=[du weit das], target=[you know this], predicted=[you know this]\n",
            "src=[wer betrog], target=[who cheated], predicted=[who cheated]\n",
            "src=[nimm dir von dem schinken], target=[have some ham], predicted=[have some ham]\n",
            "src=[ich brauche einen arzt], target=[i need a medic], predicted=[i need a medic]\n",
            "src=[das ist ein lowe], target=[this is a lion], predicted=[this is a lion]\n",
            "src=[lasst mich sehen], target=[let me see that], predicted=[let me see]\n",
            "src=[ich kann mich nicht mit tom treffen], target=[i cant see tom], predicted=[i cant see tom]\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/nltk/translate/bleu_score.py:490: UserWarning: \n",
            "Corpus/Sentence contains 0 counts of 3-gram overlaps.\n",
            "BLEU scores might be undesirable; use SmoothingFunction().\n",
            "  warnings.warn(_msg)\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "BLEU-1: 0.076043\n",
            "BLEU-2: 0.003463\n",
            "BLEU-3: 0.032511\n",
            "BLEU-4: 0.056909\n",
            "test\n",
            "src=[wir mussen gehen], target=[we need to go], predicted=[we need to go]\n",
            "src=[wirf ihn mir ruber], target=[throw it to me], predicted=[show it to me]\n",
            "src=[ich sitze in der patsche], target=[i am in trouble], predicted=[i made by bus]\n",
            "src=[tom kannte sie], target=[tom knew it], predicted=[tom knew it]\n",
            "src=[sie stand zum verkauf an], target=[it was on sale], predicted=[tom pinched him]\n",
            "src=[die dinge sind in ordnung], target=[things are fine], predicted=[theyre are]\n",
            "src=[tom liebt kinder], target=[tom loves kids], predicted=[tom loves guns]\n",
            "src=[ich bin drauen], target=[im out of here], predicted=[im freaked out]\n",
            "src=[das ist schon], target=[its beautiful], predicted=[this is big]\n",
            "src=[tom wurde reich], target=[tom became rich], predicted=[tom is rich]\n"
          ],
          "name": "stdout"
        },
        {
          "output_type": "stream",
          "text": [
            "/usr/local/lib/python3.6/dist-packages/nltk/translate/bleu_score.py:490: UserWarning: \n",
            "Corpus/Sentence contains 0 counts of 2-gram overlaps.\n",
            "BLEU scores might be undesirable; use SmoothingFunction().\n",
            "  warnings.warn(_msg)\n"
          ],
          "name": "stderr"
        },
        {
          "output_type": "stream",
          "text": [
            "BLEU-1: 0.078244\n",
            "BLEU-2: 0.275525\n",
            "BLEU-3: 0.455874\n",
            "BLEU-4: 0.517030\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "FdgdsPp7Tk5A",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 68
        },
        "outputId": "adf256b2-5d37-4b07-e33c-bdde1cbedd02"
      },
      "cell_type": "code",
      "source": [
        "ls"
      ],
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "_about.txt   deu.txt                  english-german-test.pkl   model.png\r\n",
            "\u001b[0m\u001b[01;34mdatalab\u001b[0m/     english-german-both.pkl  english-german-train.pkl\r\n",
            "deu-eng.zip  english-german.pkl       model.h5\r\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "W9pgewFmhCxu",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "#### ref: https://machinelearningmastery.com/develop-neural-machine-translation-system-keras/ "
      ]
    }
  ]
}