Created
October 11, 2021 19:21
-
-
Save igormcsouza/c8ec7f56de42c782ee2e82b7e96eb99b to your computer and use it in GitHub Desktop.
chatbot.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| { | |
| "nbformat": 4, | |
| "nbformat_minor": 0, | |
| "metadata": { | |
| "colab": { | |
| "name": "chatbot.ipynb", | |
| "provenance": [], | |
| "mount_file_id": "1-6xbU4QmwU_4Rmq4Wt6sF5wsCKv2gXfF", | |
| "authorship_tag": "ABX9TyMzJZ9Dor0ohLAm/jVLMry/", | |
| "include_colab_link": true | |
| }, | |
| "kernelspec": { | |
| "display_name": "Python 3", | |
| "name": "python3" | |
| }, | |
| "language_info": { | |
| "name": "python" | |
| } | |
| }, | |
| "cells": [ | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "view-in-github", | |
| "colab_type": "text" | |
| }, | |
| "source": [ | |
| "<a href=\"https://colab.research.google.com/gist/igormcsouza/c8ec7f56de42c782ee2e82b7e96eb99b/chatbot.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "Lc-y6yLPz3mU" | |
| }, | |
| "source": [ | |
| "# Catbot! A chatbot built with AI\n", | |
| "\n", | |
| "[Inspiration!](https://towardsdatascience.com/how-to-create-a-chatbot-with-python-deep-learning-in-less-than-an-hour-56a063bdfc44)\n", | |
| "\n", | |
| "It's notoriously the improvements on selling we got on the past years. People are talking through social media to order their products and services instead of going to the place or talking through the phone. \n", | |
| "\n", | |
| "That open up bright ideas to automate those processes so users can buy things or get help on services without even have to talk with somebody.\n", | |
| "\n", | |
| "Today I'm going to implement a ChatBot to answer your deepest questions about cats, and have an idea how this kind of Machine Learning models may help in your business and improve productivities." | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "oqVjLwkB-IQo" | |
| }, | |
| "source": [ | |
| "# Mount Google Drive to use saved files\n", | |
| "\n", | |
| "I'm going to use my google drive to store and use (previously prepared) data. Follow along by downloading the [intents](https://drive.google.com/file/d/1-Ssvmhm8OxfC_JRmzuN_Sa0rnC4cVF0p/view?usp=sharing), which will be explaining later." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "nulgO-u8-Erl", | |
| "outputId": "373ccfc3-42f1-46cc-ad27-6cd90cc92a7d" | |
| }, | |
| "source": [ | |
| "from google.colab import drive\n", | |
| "drive.mount('/content/drive')\n", | |
| "\n", | |
| "% cd /content/drive/MyDrive/Projects/chatbot/" | |
| ], | |
| "execution_count": 19, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount(\"/content/drive\", force_remount=True).\n", | |
| "/content/drive/MyDrive/Projects/chatbot\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "reJOOGlgvC7-" | |
| }, | |
| "source": [ | |
| "# Import the necessary packages\n", | |
| "\n", | |
| "Those packages will be used to build the chatbot. The [NLTK](https://www.nltk.org/) package will help up to preprocess the intents and prepare them to be used on our Machine Learning model.\n", | |
| "\n", | |
| "There is also a python class I created to hold chatbot transformations. Easing the test." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "lxPvzjw3CLZR" | |
| }, | |
| "source": [ | |
| "import json\n", | |
| "import pickle\n", | |
| "from random import shuffle\n", | |
| "\n", | |
| "import numpy\n", | |
| "import nltk\n", | |
| "from nltk.stem import WordNetLemmatizer\n", | |
| "from nltk.tokenize import RegexpTokenizer\n", | |
| "import tensorflow.keras as keras\n", | |
| "\n", | |
| "from chatbot import Chatbot" | |
| ], | |
| "execution_count": 20, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "htb9Pb63DgxR", | |
| "outputId": "3729b8aa-d316-4819-e199-2e05e31a693a" | |
| }, | |
| "source": [ | |
| "# Download nltk extras\n", | |
| "\n", | |
| "nltk.download('punkt')\n", | |
| "nltk.download('wordnet')" | |
| ], | |
| "execution_count": 21, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "[nltk_data] Downloading package punkt to /root/nltk_data...\n", | |
| "[nltk_data] Package punkt is already up-to-date!\n", | |
| "[nltk_data] Downloading package wordnet to /root/nltk_data...\n", | |
| "[nltk_data] Package wordnet is already up-to-date!\n" | |
| ] | |
| }, | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "True" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "execution_count": 21 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "oHqSxog5B84r" | |
| }, | |
| "source": [ | |
| "# Prepare the data" | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "rJywIWMH-U1y" | |
| }, | |
| "source": [ | |
| "# Load the intents\n", | |
| "\n", | |
| "with open(\"intents.json\") as file:\n", | |
| " intents = json.load(file)" | |
| ], | |
| "execution_count": 22, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "VsiZvZufCtXq" | |
| }, | |
| "source": [ | |
| "words = list()\n", | |
| "documents = list()\n", | |
| "classes = list()\n", | |
| "\n", | |
| "tokenizer = RegexpTokenizer(r'\\w+') # Transforme phrases into tokens\n", | |
| "lemmatizer = WordNetLemmatizer() # Get the root of each word" | |
| ], | |
| "execution_count": 23, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "N9taoSojCVlT" | |
| }, | |
| "source": [ | |
| "# Create the tokens and populate the documents, which will be used later in our\n", | |
| "# model.\n", | |
| "for intent in intents['intents']:\n", | |
| " for pattern in intent['patterns']:\n", | |
| " # Tokenize the words\n", | |
| " word = tokenizer.tokenize(pattern)\n", | |
| " words.extend(word)\n", | |
| "\n", | |
| " # Add documents\n", | |
| " documents.append((word, intent['tag']))\n", | |
| "\n", | |
| " # Add classes\n", | |
| " if intent['tag'] not in classes:\n", | |
| " classes.append(intent['tag'])\n", | |
| "\n", | |
| "# Get the root of the words, because its meaning is what we are looking for.\n", | |
| "words = [lemmatizer.lemmatize(w.lower()) for w in words]\n", | |
| "\n", | |
| "# Transforming the tokens and classes into ordered single lists. There won't be\n", | |
| "# more than one word in the set.\n", | |
| "for t in [set, list, sorted]:\n", | |
| " words = t(words)\n", | |
| " classes = t(classes)" | |
| ], | |
| "execution_count": 24, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "8eUDMNL-Fpob" | |
| }, | |
| "source": [ | |
| "# Dump the words to be used later when predicting or retraining.\n", | |
| "with open(\"words.pkl\", 'wb') as f:\n", | |
| " pickle.dump(words, f)\n", | |
| "\n", | |
| "with open(\"classes.pkl\", 'wb') as f:\n", | |
| " pickle.dump(classes, f)" | |
| ], | |
| "execution_count": 25, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "SSNfu949Hf_F" | |
| }, | |
| "source": [ | |
| "# Create the bag of words and transforming then into numbers.\n", | |
| "train = list()\n", | |
| "output = [0] * len(classes)\n", | |
| "\n", | |
| "for doc in documents:\n", | |
| " bow = list() # Create bag of words\n", | |
| " pattern_words = doc[0]\n", | |
| " pattern_words = [lemmatizer.lemmatize(w.lower()) for w in pattern_words]\n", | |
| "\n", | |
| " for w in words:\n", | |
| " bow.append(1 if w in pattern_words else 0)\n", | |
| " \n", | |
| " # Create one-hot-encoding for the classes\n", | |
| " output_ohe = list(output)\n", | |
| " output_ohe[classes.index(doc[1])] = 1\n", | |
| "\n", | |
| " train.append([bow, output_ohe])\n", | |
| "\n", | |
| "shuffle(train)\n", | |
| "\n", | |
| "# Create the array with words we have\n", | |
| "X_train = numpy.array([t[0] for t in train])\n", | |
| "y_train = numpy.array([t[1] for t in train])" | |
| ], | |
| "execution_count": 26, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "Syp2CSg4Gmb1" | |
| }, | |
| "source": [ | |
| "# Build and Fit the Model\n", | |
| "\n", | |
| "We are goint to build a classifier model, it is going to output the class the phrase should belongs to." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "bbXvKQRCHaZK" | |
| }, | |
| "source": [ | |
| "def create_model(input_shape: tuple, output_shape: tuple) -> keras.Model:\n", | |
| " model = keras.models.Sequential([ \n", | |
| " keras.layers.Dense(128, input_shape=input_shape, activation='relu',\n", | |
| " name=\"Dense_1\"),\n", | |
| " keras.layers.Dropout(0.5, name=\"Dropout_1\"),\n", | |
| " keras.layers.Dense(64, activation='relu', name=\"Dense_2\"),\n", | |
| " keras.layers.Dropout(0.5, name=\"Dropout_2\"),\n", | |
| " keras.layers.Dense(output_shape, activation='softmax',\n", | |
| " name=\"Dense_3_Output\")\n", | |
| " ])\n", | |
| "\n", | |
| " return model\n", | |
| "\n", | |
| "model = create_model(input_shape=(len(X_train[0]),),\n", | |
| " output_shape=(len(y_train[0])))" | |
| ], | |
| "execution_count": 27, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "fhDh_E1Qhwy6" | |
| }, | |
| "source": [ | |
| "# Compile the model\n", | |
| "model.compile(loss=keras.losses.categorical_crossentropy, metrics=['accuracy'],\n", | |
| " optimizer=keras.optimizers.SGD(learning_rate=0.01,\n", | |
| " decay=1e-6,\n", | |
| " momentum=0.9,\n", | |
| " nesterov=True))" | |
| ], | |
| "execution_count": 28, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/", | |
| "height": 644 | |
| }, | |
| "id": "q3sltTLMj6w1", | |
| "outputId": "32e609ca-aa75-41bc-a894-dae33f516102" | |
| }, | |
| "source": [ | |
| "keras.utils.plot_model(model, show_shapes=True)" | |
| ], | |
| "execution_count": 29, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "image/png": "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\n", | |
| "text/plain": [ | |
| "<IPython.core.display.Image object>" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "execution_count": 29 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "SM-yON9pjKBK" | |
| }, | |
| "source": [ | |
| "EPOCHS = 25\n", | |
| "BATCH_SIZE = 5" | |
| ], | |
| "execution_count": 30, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "aOh_vvQsixS1", | |
| "outputId": "7df69e0a-c00f-45bf-95c8-d96a08510db9" | |
| }, | |
| "source": [ | |
| "# Fit the model to the data\n", | |
| "\n", | |
| "hist = model.fit(X_train, y_train, epochs=EPOCHS,\n", | |
| " batch_size=BATCH_SIZE, verbose=1)" | |
| ], | |
| "execution_count": 31, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "Epoch 1/25\n", | |
| "3/3 [==============================] - 1s 3ms/step - loss: 1.6712 - accuracy: 0.2308\n", | |
| "Epoch 2/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 1.6862 - accuracy: 0.1538\n", | |
| "Epoch 3/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 1.4854 - accuracy: 0.3846\n", | |
| "Epoch 4/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 1.4508 - accuracy: 0.3077\n", | |
| "Epoch 5/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 1.4937 - accuracy: 0.4615\n", | |
| "Epoch 6/25\n", | |
| "3/3 [==============================] - 0s 3ms/step - loss: 1.3839 - accuracy: 0.5385\n", | |
| "Epoch 7/25\n", | |
| "3/3 [==============================] - 0s 3ms/step - loss: 1.3505 - accuracy: 0.7692\n", | |
| "Epoch 8/25\n", | |
| "3/3 [==============================] - 0s 3ms/step - loss: 1.2004 - accuracy: 0.6923\n", | |
| "Epoch 9/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 1.2216 - accuracy: 0.6154\n", | |
| "Epoch 10/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 1.1073 - accuracy: 0.6923\n", | |
| "Epoch 11/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 1.0669 - accuracy: 0.7692\n", | |
| "Epoch 12/25\n", | |
| "3/3 [==============================] - 0s 3ms/step - loss: 1.0244 - accuracy: 0.7692\n", | |
| "Epoch 13/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 0.8532 - accuracy: 0.8462\n", | |
| "Epoch 14/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 0.7857 - accuracy: 0.7692\n", | |
| "Epoch 15/25\n", | |
| "3/3 [==============================] - 0s 5ms/step - loss: 0.8026 - accuracy: 0.8462\n", | |
| "Epoch 16/25\n", | |
| "3/3 [==============================] - 0s 6ms/step - loss: 0.6646 - accuracy: 0.8462\n", | |
| "Epoch 17/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 0.5620 - accuracy: 0.8462\n", | |
| "Epoch 18/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 0.6167 - accuracy: 0.9231\n", | |
| "Epoch 19/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 0.5352 - accuracy: 0.8462\n", | |
| "Epoch 20/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 0.5410 - accuracy: 0.8462\n", | |
| "Epoch 21/25\n", | |
| "3/3 [==============================] - 0s 6ms/step - loss: 0.5854 - accuracy: 0.7692\n", | |
| "Epoch 22/25\n", | |
| "3/3 [==============================] - 0s 6ms/step - loss: 0.5176 - accuracy: 0.8462\n", | |
| "Epoch 23/25\n", | |
| "3/3 [==============================] - 0s 6ms/step - loss: 0.3945 - accuracy: 0.9231\n", | |
| "Epoch 24/25\n", | |
| "3/3 [==============================] - 0s 7ms/step - loss: 0.4330 - accuracy: 0.9231\n", | |
| "Epoch 25/25\n", | |
| "3/3 [==============================] - 0s 4ms/step - loss: 0.4020 - accuracy: 0.8462\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "qhAUTGAVjW9J" | |
| }, | |
| "source": [ | |
| "# Saves the model for later\n", | |
| "model.save(\"chatbot_model.h5\")" | |
| ], | |
| "execution_count": 32, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "markdown", | |
| "metadata": { | |
| "id": "39g2Ws370OmL" | |
| }, | |
| "source": [ | |
| "# Predict the model\n", | |
| "\n", | |
| "I'm going to use the python class I created to help on test the chatbot. I'll get the intents, words and classes, when its instantiate. Next step is to call `get_response` method passing the question and the model will find out the answer." | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "SZ7toLjNk1Cs" | |
| }, | |
| "source": [ | |
| "catbot = Chatbot(words, classes)" | |
| ], | |
| "execution_count": 33, | |
| "outputs": [] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "id": "H5VhTxOitalE", | |
| "outputId": "277b6bcc-38ae-4a58-d043-12fd06458158" | |
| }, | |
| "source": [ | |
| "try:\n", | |
| " while True:\n", | |
| " msg = input(\"Q: \")\n", | |
| " resp = catbot.get_response(msg)\n", | |
| " print(f\"A: {resp}\")\n", | |
| "except KeyboardInterrupt:\n", | |
| " print('Bye!!')" | |
| ], | |
| "execution_count": 34, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "Q: Does the cat go to the bathroom?\n", | |
| "A: Don't worry, cats always go to the sandbox to poop!\n", | |
| "Q: How long does a cat live?\n", | |
| "A: Cats may live from 2 to 16 years.\n", | |
| "Q: What are the secrets of the world?\n", | |
| "A: Good Question! Have no Idea!!\n", | |
| "Q: Bye!\n", | |
| "A: Thanks, Bye\n", | |
| "Bye!!\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "C2sj-m0g34KC", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "outputId": "f1dba175-6cb1-4a7b-dbef-0a7e03fc49fc" | |
| }, | |
| "source": [ | |
| "sentence_array = catbot._bow(\"what are the secrets of the world?\")" | |
| ], | |
| "execution_count": 35, | |
| "outputs": [ | |
| { | |
| "output_type": "stream", | |
| "name": "stdout", | |
| "text": [ | |
| "found in bag: what\n", | |
| "found in bag: are\n", | |
| "found in bag: the\n", | |
| "found in bag: secret\n", | |
| "found in bag: of\n", | |
| "found in bag: the\n" | |
| ] | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "tIjujKgqzNSB", | |
| "colab": { | |
| "base_uri": "https://localhost:8080/" | |
| }, | |
| "outputId": "77d777d4-683b-4bf7-ac9a-c19e06efb7c9" | |
| }, | |
| "source": [ | |
| "model.predict(numpy.array([sentence_array]))" | |
| ], | |
| "execution_count": 36, | |
| "outputs": [ | |
| { | |
| "output_type": "execute_result", | |
| "data": { | |
| "text/plain": [ | |
| "array([[0.17417589, 0.08455426, 0.02327192, 0.02698427, 0.69101363]],\n", | |
| " dtype=float32)" | |
| ] | |
| }, | |
| "metadata": {}, | |
| "execution_count": 36 | |
| } | |
| ] | |
| }, | |
| { | |
| "cell_type": "code", | |
| "metadata": { | |
| "id": "hBrcsRX04U7o" | |
| }, | |
| "source": [ | |
| "" | |
| ], | |
| "execution_count": 36, | |
| "outputs": [] | |
| } | |
| ] | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment