Ben
Created December 2, 2018 © MIT

Smart Journal

Using Thundercomm AI Kit to develop a smart journal proof of concept.

IntermediateProtip574

Things used in this project

Hardware components

Thundercomm AI Kit
ThunderSoft Thundercomm AI Kit
×1

Software apps and online services

Microsoft Azure
Microsoft Azure
TensorFlow
TensorFlow
Android Studio
Android Studio

Story

Read more

Schematics

Smart Journal Architecture

Code

app.py

Python
Python Flask Server
""" Module for serving sentiment analysis """
from flask import Flask, jsonify, request
from simple_sa import SimpleSA

APP = Flask(__name__, static_url_path='')
SA = SimpleSA()

@APP.route('/sa', methods=['POST'])
def analyse():
    """ Return the sentiment analisis of a given sentence """
    ret = {}

    if not request.json or not "sentence" in request.json:
        ret['result'] = "Error: Missing sentence to analyse"
        return jsonify(ret)

    sentence = request.json['sentence']

    ret["sentence"] = sentence
    ret["prediction"] = str(SA.get_prediction(sentence))

    return jsonify(ret)

if __name__ == '__main__':
    APP.run(debug=True, host='0.0.0.0')

simple_sa.py

Python
Simple Sentiment Analysis using Keras/Tensorflow
""" Module for performing a simple sentiment analysis using keras"""

import tensorflow as tf
import tensorflow.keras as keras
from keras.datasets import imdb

class SimpleSA(object):
    "Simple Sentiment Analysis"

    def __init__(self):
        self.model = tf.keras.models.load_model("./simple_imdb_sa_model_embedding_2x32dense_adam.h5")
        self.graph = tf.get_default_graph()
        self.word_index = imdb.get_word_index()
        self.words_limit = 331

    def __prepare_sentence(self, text):
        words = text.replace("\n", " ").split(" ")

        text_indexed = [1,] # 1 == Start

        for word in words:
            word = word.lower()
            if word in self.word_index:
                if self.word_index[word] > 1000:
                    text_indexed.append(2) # 2 == Unknown
                else:
                    text_indexed.append(self.word_index[word] + 3)
            else:
                text_indexed.append(2) # 2 == Unknown

        return text_indexed


    def get_prediction(self, text):
        "Gets the prediction value of text"
        text_indexed = self.__prepare_sentence(text)
        text_padded = keras.preprocessing.sequence.pad_sequences([text_indexed], maxlen=self.words_limit)
        with self.graph.as_default():
            text_prediction = self.model.predict(text_padded)
            return text_prediction[0][0]
        return

def test():
    """ Test for SimpleSA Class """
    simple_sa = SimpleSA()

    sentence = "Really good actress. Best movie ever. Great."
    pred = simple_sa.get_prediction(sentence)
    print("Text : ", sentence)
    print("Prediction : ", pred)

    sentence = "Really bad actress. Worst movie ever. Awful."
    pred = simple_sa.get_prediction(sentence)
    print("Text : ", sentence)
    print("Prediction : ", pred)

    sentence = "Average movie."
    pred = simple_sa.get_prediction(sentence)
    print("Text : ", sentence)
    print("Prediction : ", pred)

if __name__ == '__main__':
    test()

simple_imdb_sa_model_embedding_2x32dense_adam.h5

Python
Keras/Tensorflow Model
No preview (download only).

simple_sentiment_analysis.ipynb

JSON
Sentiment Analysis - Jupyter Notebook
{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "sentiment_analysis.ipynb",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "metadata": {
        "id": "pBkxT6SJQkTy",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Simple Sentiment Analysis using Keras/Tensorflow and IMDB dataset\n"
      ]
    },
    {
      "metadata": {
        "colab_type": "text",
        "id": "5rQBHhLVQYps"
      },
      "cell_type": "markdown",
      "source": [
        "Importing Tensorflow and Keras\n"
      ]
    },
    {
      "metadata": {
        "id": "_T3eSgTQN-Rz",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "import tensorflow as tf\n",
        "\n",
        "import tensorflow.keras as keras"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "kdLDKIHAOUDb",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Importing IMDB Dataset: *Dataset of 25,000 movies reviews from IMDB, labeled by sentiment (positive/negative). [More Info](https://keras.io/datasets/#imdb-movie-reviews-sentiment-classification)\n",
        "\n",
        "\n"
      ]
    },
    {
      "metadata": {
        "id": "_tmyr_QGOBUC",
        "colab_type": "code",
        "outputId": "1e6b52fa-ffcd-48c4-b5d3-a0868d18c1b9",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "cell_type": "code",
      "source": [
        "from keras.datasets import imdb"
      ],
      "execution_count": 2,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Using TensorFlow backend.\n"
          ],
          "name": "stderr"
        }
      ]
    },
    {
      "metadata": {
        "id": "UaojW542PgSs",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Loading data: using only the top 10,000 most common words."
      ]
    },
    {
      "metadata": {
        "id": "Tm2NgWAhODLK",
        "colab_type": "code",
        "outputId": "d5659df8-4466-4358-c867-837cdcfa6294",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 51
        }
      },
      "cell_type": "code",
      "source": [
        "(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=10000)\n",
        "\n",
        "x_train_orig = x_train\n",
        "x_test_orig = x_test"
      ],
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Downloading data from https://s3.amazonaws.com/text-datasets/imdb.npz\n",
            "17465344/17464789 [==============================] - 1s 0us/step\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "raOXjJxGQdaD",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Displaying the shape of the training/tests datasets."
      ]
    },
    {
      "metadata": {
        "id": "exFfB_F1P0gj",
        "colab_type": "code",
        "outputId": "ed63fd42-8f9e-4c9a-97a8-8acbae3c47b8",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 102
        }
      },
      "cell_type": "code",
      "source": [
        "print(\"Shapes:\")\n",
        "print(\"x_train: \", x_train.shape)\n",
        "print(\"y_train: \", y_train.shape)\n",
        "print(\"x_test:  \", x_test.shape)\n",
        "print(\"y_test:  \", y_test.shape)"
      ],
      "execution_count": 4,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Shapes:\n",
            "x_train:  (25000,)\n",
            "y_train:  (25000,)\n",
            "x_test:   (25000,)\n",
            "y_test:   (25000,)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "sVlY1YFkVCOD",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Getting info about the review sizes: (80% of the review are <= 331 words lenght)"
      ]
    },
    {
      "metadata": {
        "id": "BHkrXylGRNXd",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "word_lenghts = [len(x) for x in x_train]"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "gX5QNsQsUdmI",
        "colab_type": "code",
        "outputId": "a96f97a2-fd2a-467c-835b-2f3bfd74f779",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "cell_type": "code",
      "source": [
        "import numpy\n",
        "percentile = 80\n",
        "words_limit = int(numpy.percentile(word_lenghts, percentile))\n",
        "\n",
        "print(\"%d percent of the reviews are <= %d words lenght\"%(percentile, words_limit))\n"
      ],
      "execution_count": 6,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "80 percent of the reviews are <= 331 words lenght\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "VQDDMyxiqxG6",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Preparing the data (ensuring all sequences have same length) with pad_sequences\n",
        "* padding with zeros reviews shorter {words_limit}\n",
        "* truncating reviews longer than {words_limit}"
      ]
    },
    {
      "metadata": {
        "id": "R3aCKdfKUflR",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "x_train = keras.preprocessing.sequence.pad_sequences(x_train, maxlen=words_limit)\n",
        "x_test = keras.preprocessing.sequence.pad_sequences(x_test, maxlen=words_limit)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "R8ZNzsTNWuGz",
        "colab_type": "code",
        "outputId": "9b9946b4-0cdf-42bd-e63f-6a0c618b8303",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 102
        }
      },
      "cell_type": "code",
      "source": [
        "print(\"Shapes:\")\n",
        "print(\"x_train: \", x_train.shape)\n",
        "print(\"x_test:  \", x_test.shape)\n",
        "print(\"y_train: \", y_train.shape)\n",
        "print(\"y_test:  \", y_test.shape)"
      ],
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Shapes:\n",
            "x_train:  (25000, 331)\n",
            "x_test:   (25000, 331)\n",
            "y_train:  (25000,)\n",
            "y_test:   (25000,)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "sCw0_tOGeMax",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Creating the Model: Using [Word Embedding](https://en.wikipedia.org/wiki/Word_embedding) to capture similarities among words, and 2 densely connected (Dense) neural layers"
      ]
    },
    {
      "metadata": {
        "id": "D_PN7u9DfYuZ",
        "colab_type": "code",
        "outputId": "accf347b-9c69-47c6-b298-7c02512f4238",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 323
        }
      },
      "cell_type": "code",
      "source": [
        "from keras.layers.embeddings import Embedding\n",
        "from keras.models import Sequential\n",
        "from keras.layers import Dense\n",
        "from keras.layers import Flatten\n",
        "\n",
        "model = Sequential()\n",
        "model.add(Embedding(10000, 32, input_length=words_limit))\n",
        "model.add(Flatten())\n",
        "model.add(Dense(32, activation='relu'))\n",
        "model.add(Dense(32, activation='relu'))\n",
        "model.add(Dense(1, activation='sigmoid'))\n",
        "model.compile(optimizer='adam', \n",
        "              loss='binary_crossentropy', \n",
        "              metrics=['accuracy'])\n",
        "\n",
        "print(model.summary())"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "_________________________________________________________________\n",
            "Layer (type)                 Output Shape              Param #   \n",
            "=================================================================\n",
            "embedding_1 (Embedding)      (None, 331, 32)           320000    \n",
            "_________________________________________________________________\n",
            "flatten_1 (Flatten)          (None, 10592)             0         \n",
            "_________________________________________________________________\n",
            "dense_1 (Dense)              (None, 32)                338976    \n",
            "_________________________________________________________________\n",
            "dense_2 (Dense)              (None, 32)                1056      \n",
            "_________________________________________________________________\n",
            "dense_3 (Dense)              (None, 1)                 33        \n",
            "=================================================================\n",
            "Total params: 660,065\n",
            "Trainable params: 660,065\n",
            "Non-trainable params: 0\n",
            "_________________________________________________________________\n",
            "None\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "HZb396CihKt1",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "x_val = x_train[:10000]\n",
        "partial_x_train = x_train[10000:]\n",
        "y_val = y_train[:10000]\n",
        "partial_y_train = y_train[10000:]"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "AzjF-c7Jj_dU",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Training the model"
      ]
    },
    {
      "metadata": {
        "id": "P_gYHJGWhit9",
        "colab_type": "code",
        "outputId": "259906c2-3bb2-45e8-94f9-c8770f0e93b7",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 272
        }
      },
      "cell_type": "code",
      "source": [
        "history = model.fit(partial_x_train,\n",
        "partial_y_train,\n",
        "epochs=7,\n",
        "batch_size=512,\n",
        "validation_data=(x_val, y_val))"
      ],
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Train on 15000 samples, validate on 10000 samples\n",
            "Epoch 1/7\n",
            "15000/15000 [==============================] - 3s 173us/step - loss: 0.6915 - acc: 0.5253 - val_loss: 0.6857 - val_acc: 0.5858\n",
            "Epoch 2/7\n",
            "15000/15000 [==============================] - 0s 31us/step - loss: 0.5842 - acc: 0.7415 - val_loss: 0.4738 - val_acc: 0.7651\n",
            "Epoch 3/7\n",
            "15000/15000 [==============================] - 0s 30us/step - loss: 0.2565 - acc: 0.8993 - val_loss: 0.3438 - val_acc: 0.8529\n",
            "Epoch 4/7\n",
            "15000/15000 [==============================] - 0s 30us/step - loss: 0.0979 - acc: 0.9721 - val_loss: 0.3293 - val_acc: 0.8655\n",
            "Epoch 5/7\n",
            "15000/15000 [==============================] - 0s 30us/step - loss: 0.0343 - acc: 0.9937 - val_loss: 0.3605 - val_acc: 0.8646\n",
            "Epoch 6/7\n",
            "15000/15000 [==============================] - 0s 30us/step - loss: 0.0108 - acc: 0.9993 - val_loss: 0.3988 - val_acc: 0.8620\n",
            "Epoch 7/7\n",
            "15000/15000 [==============================] - 0s 31us/step - loss: 0.0047 - acc: 0.9997 - val_loss: 0.4222 - val_acc: 0.8623\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "3tZkpTtOs938",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Plotting training/validation loss/accuracy"
      ]
    },
    {
      "metadata": {
        "id": "SgFd7zKahxC1",
        "colab_type": "code",
        "outputId": "5d047f52-2deb-482e-8c7f-c8d537787161",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 376
        }
      },
      "cell_type": "code",
      "source": [
        "import matplotlib.pyplot as plt\n",
        "history_dict = history.history\n",
        "epochs = range(1, len(history_dict['loss']) + 1)\n",
        "plt.plot(epochs,history_dict['loss'], 'bo--', label=\"Training loss\")\n",
        "plt.plot(epochs,history_dict['acc'], 'ko--', label=\"Training accuracy\")\n",
        "plt.plot(epochs,history_dict['val_loss'], 'rs--', label=\"Validation loss\")\n",
        "plt.plot(epochs,history_dict['val_acc'], 'gs--', label=\"Validation accuracy\")\n",
        "plt.title('Training/Validation loss/accuracy')\n",
        "plt.xlabel('Epochs')\n",
        "plt.ylabel('Loss')\n",
        "plt.legend()\n",
        "plt.show()"
      ],
      "execution_count": 12,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "image/png": "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\n",
            "text/plain": [
              "<matplotlib.figure.Figure at 0x7ffae8ef5748>"
            ]
          },
          "metadata": {
            "tags": []
          }
        }
      ]
    },
    {
      "metadata": {
        "id": "WHMAIcKgkRU5",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Saving the model"
      ]
    },
    {
      "metadata": {
        "id": "JwydBuUfHEpR",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "model.save(\"simple_imdb_sa_model_embedding_2x32dense_adam.h5\")"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "ZfTSRnIYJHvt",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Downloading the model"
      ]
    },
    {
      "metadata": {
        "id": "BSZizimiJB1h",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "from google.colab import files\n",
        "files.download('simple_imdb_sa_model_embedding_2x32dense_adam.h5') "
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "u66RwAd8tJFe",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Testing Predictions"
      ]
    },
    {
      "metadata": {
        "id": "ew2-joMzh_qt",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "prediction = model.predict(x_test)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "YENtsjDPnC7E",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 51
        },
        "outputId": "8c541e5d-fbe8-461e-b08d-d98fbd4429cd"
      },
      "cell_type": "code",
      "source": [
        "word_index = imdb.get_word_index()\n"
      ],
      "execution_count": 16,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Downloading data from https://s3.amazonaws.com/text-datasets/imdb_word_index.json\n",
            "1646592/1641221 [==============================] - 2s 1us/step\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "fkW_CTV7oNUN",
        "colab_type": "code",
        "outputId": "0ba1e53f-0fcc-48f8-a75d-5cbaaae1b501",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 88
        }
      },
      "cell_type": "code",
      "source": [
        "review_num = 6\n",
        "\n",
        "reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])\n",
        "decoded_review = ' '.join([reverse_word_index.get(i - 3, '?') for i in x_test_orig[review_num]])\n",
        "\n",
        "print(\"Review     : \", decoded_review)\n",
        "print(\"Review     : \", x_test_orig[review_num])\n",
        "print(\"Prediction : \", prediction[review_num])"
      ],
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Review     :  ? originally supposed to be just a part of a huge epic the year ? depicting the revolution of ? ? is the story of the ? of the crew of the ? in ? harbor the film opens with the crew ? meat and the captain ? the execution of the an ? takes place during which the revolutionary leader is killed this ? is taken to the shore to lie in state when the ? gather on a huge flight of steps ? the harbor ? troops appear and march down the steps breaking up the crowd a naval ? is sent to ? the ? but at the moment when the ships come into range their ? allow the to pass through ? non historically accurate ending is open ended thus ? that this was the seed of the later ? revolution that would bloom in russia the film is broken into five parts men and ? drama on the an appeal from the dead the ? steps and meeting the ? br br ? was a revolutionary artist but at the genius level not wanting to make a historical drama ? used visual ? to give the film a ? look so that the viewer feels he is ? on a thrilling and politically revolutionary story this technique is used by the battle of ? br br unlike ? relied on or the casting of non professionals who had striking physical appearances the extraordinary faces of the cast are what one remembers from ? this technique is later used by frank ? in mr deeds goes to town and meet john ? but in ? no one individual is cast as a hero or heroine the story is told through a series of scenes that are combined in a special effect known as montage the editing and selection of short segments to produce a desired effect on the viewer d w griffith also used the montage but no one ? it so well as ? br br the artistic filming of the crew sleeping in their is ? by the ? swinging of tables suspended from chains in the ? in contrast the confrontation between the crew and their officers is charged with electricity and the ? ? of the masses demonstrate their rage with injustice br br ? introduced the technique of showing an action and repeating it again but from a slightly different angle to demonstrate intensity the breaking of a plate bearing the words give us this day our daily bread ? the beginning of the end this technique is used in last year at ? also when the ? surgeon is tossed over the side his ? ? from the ? it was these glasses that the officer used to ? and pass the ? ? meat this sequence ties the punishment to the corruption of the ? era br br the most noted sequence in the film and perhaps in all of film history is the ? steps the broad ? of the steps are filled with hundreds of extras rapid and dramatic violence is always suggested and not explicit yet the visual images of the deaths of a few will last in the minds of the viewer forever br br the ? shots of ? boots and legs ? the steps are cleverly ? with long menacing shadows from a sun at the top of the steps the pace of the sequence is deliberately varied between the ? soldiers and a few civilians who ? up courage to beg them to stop a close up of a woman's face frozen in horror after being struck by a ? sword is the direct ? of the bank ? in bonnie in clyde and gives a lasting impression of the horror of the ? regime br br the death of a young mother leads to a baby ? ? down the steps in a sequence that has been copied by hitchcock in foreign ? by terry gilliam in brazil and brian ? in the ? this sequence is shown repeatedly from various angles thus drawing out what probably was only a five second event br br ? is a film that the revolutionary spirit ? it for those already committed and it for the ? it ? of fire and ? with the senseless ? of the ? ? regime its greatest impact has been on film students who have borrowed and only slightly improved on techniques invented in russia several generations ago\n",
            "Review     :  [1, 1822, 424, 8, 30, 43, 6, 173, 7, 6, 666, 1711, 4, 291, 2, 5007, 4, 2634, 7, 2, 2, 9, 4, 65, 7, 4, 2, 7, 4, 1051, 7, 4, 2, 11, 2, 8691, 4, 22, 2013, 19, 4, 1051, 2, 3549, 5, 4, 1705, 2, 4, 2603, 7, 4, 35, 2, 304, 273, 315, 63, 4, 4198, 2121, 9, 556, 14, 2, 9, 623, 8, 4, 7537, 8, 2866, 11, 1110, 54, 4, 2, 5231, 23, 6, 666, 2817, 7, 3183, 2, 4, 8691, 2, 4750, 977, 5, 4390, 180, 4, 3183, 2244, 56, 4, 2293, 6, 9209, 2, 9, 1412, 8, 2, 4, 2, 21, 33, 4, 561, 54, 4, 5159, 216, 83, 2202, 68, 2, 1741, 4, 8, 1345, 143, 2, 701, 4822, 1863, 277, 9, 911, 1054, 1346, 2, 15, 14, 16, 4, 4449, 7, 4, 303, 2, 2634, 15, 62, 6210, 11, 5421, 4, 22, 9, 1912, 83, 677, 531, 349, 5, 2, 453, 23, 4, 35, 1271, 39, 4, 351, 4, 2, 3183, 5, 2180, 4, 2, 10, 10, 2, 16, 6, 4198, 1740, 21, 33, 4, 1262, 651, 24, 1786, 8, 97, 6, 1379, 453, 2, 343, 1114, 2, 8, 202, 4, 22, 6, 2, 168, 38, 15, 4, 529, 764, 29, 9, 2, 23, 6, 3017, 5, 4103, 4198, 65, 14, 3120, 9, 343, 34, 4, 985, 7, 2, 10, 10, 1025, 2, 9383, 23, 42, 4, 973, 7, 701, 7099, 37, 69, 3347, 1748, 3329, 4, 2802, 1590, 7, 4, 177, 26, 51, 31, 6865, 39, 2, 14, 3120, 9, 303, 343, 34, 1265, 2, 11, 443, 7945, 271, 8, 513, 5, 909, 308, 2, 21, 11, 2, 57, 31, 2267, 9, 177, 17, 6, 632, 42, 1886, 4, 65, 9, 579, 143, 6, 201, 7, 139, 15, 26, 2505, 11, 6, 318, 962, 573, 17, 4226, 4, 802, 5, 5560, 7, 346, 3309, 8, 2242, 6, 4630, 962, 23, 4, 529, 1095, 1992, 5178, 82, 343, 4, 4226, 21, 57, 31, 2, 12, 38, 73, 17, 2, 10, 10, 4, 1614, 1423, 7, 4, 1051, 2765, 11, 68, 9, 2, 34, 4, 2, 7030, 7, 8915, 9429, 39, 9653, 11, 4, 2, 11, 2288, 4, 5127, 200, 4, 1051, 5, 68, 4155, 9, 5339, 19, 9014, 5, 4, 2, 2, 7, 4, 5075, 6469, 68, 3980, 19, 8313, 10, 10, 2, 1725, 4, 3120, 7, 800, 35, 206, 5, 5686, 12, 174, 21, 39, 6, 1076, 275, 2651, 8, 6469, 3033, 4, 2244, 7, 6, 7479, 7382, 4, 715, 202, 178, 14, 251, 263, 2933, 5375, 2, 4, 454, 7, 4, 130, 14, 3120, 9, 343, 11, 236, 291, 33, 2, 82, 54, 4, 2, 8807, 9, 6265, 120, 4, 499, 27, 2, 2, 39, 4, 2, 12, 16, 134, 5099, 15, 4, 1909, 343, 8, 2, 5, 1345, 4, 2, 2, 3549, 14, 720, 4297, 4, 4982, 8, 4, 4306, 7, 4, 2, 999, 10, 10, 4, 91, 3212, 720, 11, 4, 22, 5, 382, 11, 32, 7, 22, 479, 9, 4, 2, 3183, 4, 3826, 2, 7, 4, 3183, 26, 1061, 19, 3103, 7, 2260, 7050, 5, 905, 567, 9, 210, 5062, 5, 24, 3759, 246, 4, 1114, 1218, 7, 4, 2456, 7, 6, 171, 80, 236, 11, 4, 2638, 7, 4, 529, 1437, 10, 10, 4, 2, 665, 7, 2, 7561, 5, 2977, 2, 4, 3183, 26, 4519, 2, 19, 196, 3541, 3788, 39, 6, 2739, 33, 4, 350, 7, 4, 3183, 4, 1062, 7, 4, 720, 9, 4042, 7188, 200, 4, 2, 1340, 5, 6, 171, 8862, 37, 2, 56, 3158, 8, 7017, 98, 8, 570, 6, 491, 56, 7, 6, 3219, 393, 7250, 11, 189, 103, 112, 3502, 34, 6, 2, 2554, 9, 4, 1504, 2, 7, 4, 1982, 2, 11, 7398, 11, 8289, 5, 408, 6, 5863, 1384, 7, 4, 189, 7, 4, 2, 7936, 10, 10, 4, 341, 7, 6, 185, 452, 832, 8, 6, 896, 2, 2, 180, 4, 3183, 11, 6, 720, 15, 47, 77, 6573, 34, 2912, 11, 2189, 2, 34, 3973, 8150, 11, 3829, 5, 1620, 2, 11, 4, 2, 14, 720, 9, 617, 3727, 39, 998, 2445, 1346, 3862, 46, 51, 242, 16, 64, 6, 677, 333, 1494, 10, 10, 2, 9, 6, 22, 15, 4, 4198, 1103, 2, 12, 18, 148, 460, 2534, 5, 12, 18, 4, 2, 12, 2, 7, 968, 5, 2, 19, 4, 4271, 2, 7, 4, 2, 2, 7936, 94, 833, 1488, 47, 77, 23, 22, 1537, 37, 28, 4902, 5, 64, 1076, 3827, 23, 3362, 5161, 11, 5421, 450, 5122, 596]\n",
            "Prediction :  [0.9913017]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "R5hfItJWoYOG",
        "colab_type": "code",
        "outputId": "56a7a989-0180-4fdd-b9ed-54b4b82be2a3",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 51
        }
      },
      "cell_type": "code",
      "source": [
        "text = \"\"\"Realy poor cast. Worst movie ever. Awful\"\"\"\n",
        "\n",
        "words = text.replace(\"\\n\", \" \").split(\" \")\n",
        "print(words)\n",
        "\n",
        "text_indexed = [1,] # 1 == Start\n",
        "\n",
        "for word in words:\n",
        "  word = word.lower()\n",
        "  if word in word_index:\n",
        "    if word_index[word] > 10000:\n",
        "      text_indexed.append(2) # 2 == Unknown\n",
        "    else:\n",
        "      text_indexed.append(word_index[word] + 3 )\n",
        "  else:\n",
        "    text_indexed.append(2) # 2 == Unknown\n",
        " \n",
        "print(text_indexed)"
      ],
      "execution_count": 18,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "['Realy', 'poor', 'cast.', 'Worst', 'movie', 'ever.', 'Awful']\n",
            "[1, 2, 338, 2, 249, 20, 2, 373]\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "RKrNvK9PZ9Lu",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "text_padded = keras.preprocessing.sequence.pad_sequences([text_indexed], maxlen=words_limit)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "AyHt7fVx4Xt0",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "test_prediction = model.predict(text_padded)"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "AY7y8erd4kT1",
        "colab_type": "code",
        "outputId": "db6b0989-3c02-4527-8ba5-42d7ba27ec9d",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        }
      },
      "cell_type": "code",
      "source": [
        "print(\"Prediction : \", test_prediction[0])"
      ],
      "execution_count": 21,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Prediction :  [0.00080772]\n"
          ],
          "name": "stdout"
        }
      ]
    }
  ]
}

Credits

Ben

Ben

4 projects • 10 followers

Comments