├── intents.json └── ChatBot.ipynb /intents.json: -------------------------------------------------------------------------------- 1 | { 2 | "intents": [ 3 | { 4 | "context": "", 5 | "patterns": [ 6 | "Hello", 7 | "Hi there", 8 | "Good morning", 9 | "What's up" 10 | ], 11 | "responses": [ 12 | "Hey!", 13 | "Hello", 14 | "Hi!", 15 | "Good morning!" 16 | ], 17 | "tag": "hello" 18 | }, 19 | { 20 | "context": [ 21 | "" 22 | ], 23 | "patterns": [], 24 | "responses": [ 25 | "Sorry, can't understand you", 26 | "Please give me more info", 27 | "Not sure I understand" 28 | ], 29 | "tag": "noanswer" 30 | }, 31 | { 32 | "context": "", 33 | "patterns": [ 34 | "What is your job", 35 | "What is your work" 36 | ], 37 | "responses": [ 38 | "My job is to make you feel like everything is okay.", 39 | "I work to serve you as well as possible" 40 | ], 41 | "tag": "job" 42 | }, 43 | { 44 | "context": "", 45 | "patterns": [ 46 | "What is your age", 47 | "How old are you", 48 | "When were you born" 49 | ], 50 | "responses": [ 51 | "I was born in 2021" 52 | ], 53 | "tag": "age" 54 | }, 55 | { 56 | "context": "", 57 | "patterns": [ 58 | "How are you today", 59 | "How are you" 60 | ], 61 | "responses": [ 62 | "I am feeling good, you?", 63 | "Very good and you?", 64 | "Actually, I'm okay and you?" 65 | ], 66 | "tag": "feeling" 67 | }, 68 | { 69 | "context": "feeling", 70 | "patterns": [ 71 | "I am good too", 72 | "I feel fine", 73 | "Good !", 74 | "Fine", 75 | "I am good", 76 | "I am great", 77 | "great" 78 | ], 79 | "responses": [ 80 | "That is perfect!", 81 | "So, everything's okay!" 82 | ], 83 | "tag": "good" 84 | }, 85 | { 86 | "context": "feeling", 87 | "patterns": [ 88 | "I am feeling bad", 89 | "No I am sad", 90 | "No" 91 | ], 92 | "responses": [ 93 | "I hope you will feel better !" 94 | ], 95 | "tag": "bad" 96 | }, 97 | { 98 | "context": "", 99 | "patterns": [ 100 | "What can you do", 101 | "What can I ask you", 102 | "Can you help me" 103 | ], 104 | "responses": [ 105 | "I can do a lot of things but here are some of my skills, you can ask me: the capital of a country, its currency and its area. A random number. To calculate a math operation." 106 | ], 107 | "tag": "actions" 108 | }, 109 | { 110 | "context": "", 111 | "patterns": [ 112 | "Are you a girl", 113 | "You are a women" 114 | ], 115 | "responses": [ 116 | "Sure, I am a women" 117 | ], 118 | "tag": "women" 119 | }, 120 | { 121 | "context": "", 122 | "patterns": [ 123 | "Are you a men", 124 | "Are you a boy" 125 | ], 126 | "responses": [ 127 | "No, I am a women" 128 | ], 129 | "tag": "men" 130 | }, 131 | { 132 | "context": "", 133 | "patterns": [ 134 | "Thank you", 135 | "Thank you very much", 136 | "thanks" 137 | ], 138 | "responses": [ 139 | "I only do my job?", 140 | "No problem!" 141 | ], 142 | "tag": "thanks" 143 | }, 144 | { 145 | "context": "", 146 | "patterns": [ 147 | "Goodbye", 148 | "Good afternoon", 149 | "Bye" 150 | ], 151 | "responses": [ 152 | "Goodbye!", 153 | "See you soon!" 154 | ], 155 | "tag": "goodbye" 156 | }, 157 | { 158 | "context": "", 159 | "patterns": [ 160 | "Where do you live" 161 | ], 162 | "responses": [ 163 | "I live in a server located in the US!" 164 | ], 165 | "tag": "city" 166 | }, 167 | { 168 | "context": "", 169 | "patterns": [ 170 | "What are you doing" 171 | ], 172 | "responses": [ 173 | "Actually, I'm chatting with somebody" 174 | ], 175 | "tag": "action" 176 | }, 177 | { 178 | "context": "", 179 | "patterns": [ 180 | "Can you wait 2 minutes", 181 | "Please wait", 182 | "Wait 2 secs please" 183 | ], 184 | "responses": [ 185 | "Sure! I wait." 186 | ], 187 | "tag": "wait" 188 | }, 189 | { 190 | "context": "", 191 | "patterns": [ 192 | "Are you still there?", 193 | "Are you here?" 194 | ], 195 | "responses": [ 196 | "Of course! Always at your service." 197 | ], 198 | "tag": "still there" 199 | } 200 | ] 201 | } -------------------------------------------------------------------------------- /ChatBot.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "nbformat": 4, 3 | "nbformat_minor": 0, 4 | "metadata": { 5 | "colab": { 6 | "name": "ChatBot.ipynb", 7 | "provenance": [], 8 | "collapsed_sections": [] 9 | }, 10 | "kernelspec": { 11 | "display_name": "Python 3", 12 | "name": "python3" 13 | }, 14 | "language_info": { 15 | "name": "python" 16 | } 17 | }, 18 | "cells": [ 19 | { 20 | "cell_type": "code", 21 | "metadata": { 22 | "colab": { 23 | "base_uri": "https://localhost:8080/" 24 | }, 25 | "id": "Cq1VypA0Mvc6", 26 | "outputId": "5d7501d5-225f-4491-997f-672c211c0c99" 27 | }, 28 | "source": [ 29 | "#1 Mounting the Google Drive\n", 30 | "\n", 31 | "from google.colab import drive\n", 32 | "drive.mount('/content/drive')\n", 33 | "data_root='/content/drive/My Drive/ChatBot' #Please upload the files in your drive and change the path to it accordingly." 34 | ], 35 | "execution_count": null, 36 | "outputs": [ 37 | { 38 | "output_type": "stream", 39 | "text": [ 40 | "Mounted at /content/drive\n" 41 | ], 42 | "name": "stdout" 43 | } 44 | ] 45 | }, 46 | { 47 | "cell_type": "code", 48 | "metadata": { 49 | "colab": { 50 | "base_uri": "https://localhost:8080/" 51 | }, 52 | "id": "Xkvi7jGbM8yE", 53 | "outputId": "28e3650d-09ba-46f0-f6b2-32544e136803" 54 | }, 55 | "source": [ 56 | "#2 Importing Relevant Libraries\n", 57 | "\n", 58 | "import json\n", 59 | "import string\n", 60 | "import random \n", 61 | "\n", 62 | "import nltk\n", 63 | "import numpy as np\n", 64 | "from nltk.stem import WordNetLemmatizer \n", 65 | "import tensorflow as tf \n", 66 | "from tensorflow.keras import Sequential \n", 67 | "from tensorflow.keras.layers import Dense, Dropout\n", 68 | "nltk.download(\"punkt\")\n", 69 | "nltk.download(\"wordnet\")" 70 | ], 71 | "execution_count": null, 72 | "outputs": [ 73 | { 74 | "output_type": "stream", 75 | "text": [ 76 | "[nltk_data] Downloading package punkt to /root/nltk_data...\n", 77 | "[nltk_data] Unzipping tokenizers/punkt.zip.\n", 78 | "[nltk_data] Downloading package wordnet to /root/nltk_data...\n", 79 | "[nltk_data] Unzipping corpora/wordnet.zip.\n" 80 | ], 81 | "name": "stdout" 82 | }, 83 | { 84 | "output_type": "execute_result", 85 | "data": { 86 | "text/plain": [ 87 | "True" 88 | ] 89 | }, 90 | "metadata": { 91 | "tags": [] 92 | }, 93 | "execution_count": 2 94 | } 95 | ] 96 | }, 97 | { 98 | "cell_type": "code", 99 | "metadata": { 100 | "colab": { 101 | "base_uri": "https://localhost:8080/" 102 | }, 103 | "id": "le2pj3gpiqc8", 104 | "outputId": "f6341690-aecb-45bd-dca4-1e107bcb228e" 105 | }, 106 | "source": [ 107 | "#3 Loading the Dataset: intents.json\n", 108 | "\n", 109 | "data_file = open(data_root + '/intents.json').read()\n", 110 | "data = json.loads(data_file)\n", 111 | "\n", 112 | "data" 113 | ], 114 | "execution_count": null, 115 | "outputs": [ 116 | { 117 | "output_type": "execute_result", 118 | "data": { 119 | "text/plain": [ 120 | "{'intents': [{'context': '',\n", 121 | " 'patterns': ['Hello', 'Hi there', 'Good morning', \"What's up\"],\n", 122 | " 'responses': ['Hey!', 'Hello', 'Hi!', 'Good morning!'],\n", 123 | " 'tag': 'hello'},\n", 124 | " {'context': [''],\n", 125 | " 'patterns': [],\n", 126 | " 'responses': [\"Sorry, can't understand you\",\n", 127 | " 'Please give me more info',\n", 128 | " 'Not sure I understand'],\n", 129 | " 'tag': 'noanswer'},\n", 130 | " {'context': '',\n", 131 | " 'patterns': ['What is your job', 'What is your work'],\n", 132 | " 'responses': ['My job is to make you feel like everything is okay.',\n", 133 | " 'I work to serve you as well as possible'],\n", 134 | " 'tag': 'job'},\n", 135 | " {'context': '',\n", 136 | " 'patterns': ['What is your age', 'How old are you', 'When were you born'],\n", 137 | " 'responses': ['I was born in 2021'],\n", 138 | " 'tag': 'age'},\n", 139 | " {'context': '',\n", 140 | " 'patterns': ['How are you today', 'How are you'],\n", 141 | " 'responses': ['I am feeling good, you?',\n", 142 | " 'Very good and you?',\n", 143 | " \"Actually, I'm okay and you?\"],\n", 144 | " 'tag': 'feeling'},\n", 145 | " {'context': 'feeling',\n", 146 | " 'patterns': ['I am good too',\n", 147 | " 'I feel fine',\n", 148 | " 'Good !',\n", 149 | " 'Fine',\n", 150 | " 'I am good',\n", 151 | " 'I am great',\n", 152 | " 'great'],\n", 153 | " 'responses': ['That is perfect!', \"So, everything's okay!\"],\n", 154 | " 'tag': 'good'},\n", 155 | " {'context': 'feeling',\n", 156 | " 'patterns': ['I am feeling bad', 'No I am sad', 'No'],\n", 157 | " 'responses': ['I hope you will feel better !'],\n", 158 | " 'tag': 'bad'},\n", 159 | " {'context': '',\n", 160 | " 'patterns': ['What can you do', 'What can I ask you', 'Can you help me'],\n", 161 | " 'responses': ['I can do a lot of things but here are some of my skills, you can ask me: the capital of a country, its currency and its area. A random number. To calculate a math operation.'],\n", 162 | " 'tag': 'actions'},\n", 163 | " {'context': '',\n", 164 | " 'patterns': ['Are you a girl', 'You are a women'],\n", 165 | " 'responses': ['Sure, I am a women'],\n", 166 | " 'tag': 'women'},\n", 167 | " {'context': '',\n", 168 | " 'patterns': ['Are you a men', 'Are you a boy'],\n", 169 | " 'responses': ['No, I am a women'],\n", 170 | " 'tag': 'men'},\n", 171 | " {'context': '',\n", 172 | " 'patterns': ['Thank you', 'Thank you very much', 'thanks'],\n", 173 | " 'responses': ['I only do my job️', 'No problem!'],\n", 174 | " 'tag': 'thanks'},\n", 175 | " {'context': '',\n", 176 | " 'patterns': ['Goodbye', 'Good afternoon', 'Bye'],\n", 177 | " 'responses': ['Goodbye!', 'See you soon!'],\n", 178 | " 'tag': 'goodbye'},\n", 179 | " {'context': '',\n", 180 | " 'patterns': ['Where do you live'],\n", 181 | " 'responses': ['I live in a server located in the US!'],\n", 182 | " 'tag': 'city'},\n", 183 | " {'context': '',\n", 184 | " 'patterns': ['What are you doing'],\n", 185 | " 'responses': [\"Actually, I'm chatting with somebody\"],\n", 186 | " 'tag': 'action'},\n", 187 | " {'context': '',\n", 188 | " 'patterns': ['Can you wait 2 minutes', 'Please wait', 'Wait 2 secs please'],\n", 189 | " 'responses': ['Sure! I wait.'],\n", 190 | " 'tag': 'wait'},\n", 191 | " {'context': '',\n", 192 | " 'patterns': ['Are you still there?', 'Are you here?'],\n", 193 | " 'responses': ['Of course! Always at your service.'],\n", 194 | " 'tag': 'still there'}]}" 195 | ] 196 | }, 197 | "metadata": { 198 | "tags": [] 199 | }, 200 | "execution_count": 3 201 | } 202 | ] 203 | }, 204 | { 205 | "cell_type": "code", 206 | "metadata": { 207 | "id": "GlfhvlVMGMgA" 208 | }, 209 | "source": [ 210 | "#4 Extracting data_X(features) and data_Y(Target)\n", 211 | "\n", 212 | "words = [] #For Bow model/ vocabulary for patterns\n", 213 | "classes = [] #For Bow model/ vocabulary for tags\n", 214 | "data_X = [] #For storing each pattern\n", 215 | "data_y = [] #For storing tag corresponding to each pattern in data_X \n", 216 | "# Iterating over all the intents\n", 217 | "\n", 218 | "for intent in data[\"intents\"]:\n", 219 | " for pattern in intent[\"patterns\"]:\n", 220 | " tokens = nltk.word_tokenize(pattern) # tokenize each pattern \n", 221 | " words.extend(tokens) #and append tokens to words\n", 222 | " data_X.append(pattern) #appending pattern to data_X\n", 223 | " data_y.append(intent[\"tag\"]) ,# appending the associated tag to each pattern \n", 224 | " \n", 225 | " # adding the tag to the classes if it's not there already \n", 226 | " if intent[\"tag\"] not in classes:\n", 227 | " classes.append(intent[\"tag\"])\n", 228 | "\n", 229 | "# initializing lemmatizer to get stem of words\n", 230 | "lemmatizer = WordNetLemmatizer()\n", 231 | "\n", 232 | "# lemmatize all the words in the vocab and convert them to lowercase\n", 233 | "# if the words don't appear in punctuation\n", 234 | "words = [lemmatizer.lemmatize(word.lower()) for word in words if word not in string.punctuation]\n", 235 | "# sorting the vocab and classes in alphabetical order and taking the # set to ensure no duplicates occur\n", 236 | "words = sorted(set(words))\n", 237 | "classes = sorted(set(classes))" 238 | ], 239 | "execution_count": null, 240 | "outputs": [] 241 | }, 242 | { 243 | "cell_type": "code", 244 | "metadata": { 245 | "id": "KxXzyJNNR17c" 246 | }, 247 | "source": [ 248 | "# 5 Text to Numbers\n", 249 | "training = []\n", 250 | "out_empty = [0] * len(classes)\n", 251 | "# creating the bag of words model\n", 252 | "for idx, doc in enumerate(data_X):\n", 253 | " bow = []\n", 254 | " text = lemmatizer.lemmatize(doc.lower())\n", 255 | " for word in words:\n", 256 | " bow.append(1) if word in text else bow.append(0)\n", 257 | " # mark the index of class that the current pattern is associated\n", 258 | " # to\n", 259 | " output_row = list(out_empty)\n", 260 | " output_row[classes.index(data_y[idx])] = 1\n", 261 | " # add the one hot encoded BoW and associated classes to training \n", 262 | " training.append([bow, output_row])\n", 263 | "# shuffle the data and convert it to an array\n", 264 | "random.shuffle(training)\n", 265 | "training = np.array(training, dtype=object)\n", 266 | "# split the features and target labels\n", 267 | "train_X = np.array(list(training[:, 0]))\n", 268 | "train_Y = np.array(list(training[:, 1]))" 269 | ], 270 | "execution_count": null, 271 | "outputs": [] 272 | }, 273 | { 274 | "cell_type": "code", 275 | "metadata": { 276 | "colab": { 277 | "base_uri": "https://localhost:8080/" 278 | }, 279 | "id": "t_Q343LiR9w1", 280 | "outputId": "8eff8feb-d4ab-426a-c091-3530cc69bb6c" 281 | }, 282 | "source": [ 283 | "#6 The Neural Network Model\n", 284 | "model = Sequential()\n", 285 | "model.add(Dense(128, input_shape=(len(train_X[0]),), activation=\"relu\"))\n", 286 | "model.add(Dropout(0.5))\n", 287 | "model.add(Dense(64, activation=\"relu\"))\n", 288 | "model.add(Dropout(0.5))\n", 289 | "model.add(Dense(len(train_Y[0]), activation = \"softmax\"))\n", 290 | "adam = tf.keras.optimizers.Adam(learning_rate=0.01, decay=1e-6)\n", 291 | "model.compile(loss='categorical_crossentropy',\n", 292 | " optimizer=adam,\n", 293 | " metrics=[\"accuracy\"])\n", 294 | "print(model.summary())\n", 295 | "model.fit(x=train_X, y=train_Y, epochs=150, verbose=1)" 296 | ], 297 | "execution_count": null, 298 | "outputs": [ 299 | { 300 | "output_type": "stream", 301 | "text": [ 302 | "Model: \"sequential\"\n", 303 | "_________________________________________________________________\n", 304 | "Layer (type) Output Shape Param # \n", 305 | "=================================================================\n", 306 | "dense (Dense) (None, 128) 7552 \n", 307 | "_________________________________________________________________\n", 308 | "dropout (Dropout) (None, 128) 0 \n", 309 | "_________________________________________________________________\n", 310 | "dense_1 (Dense) (None, 64) 8256 \n", 311 | "_________________________________________________________________\n", 312 | "dropout_1 (Dropout) (None, 64) 0 \n", 313 | "_________________________________________________________________\n", 314 | "dense_2 (Dense) (None, 16) 1040 \n", 315 | "=================================================================\n", 316 | "Total params: 16,848\n", 317 | "Trainable params: 16,848\n", 318 | "Non-trainable params: 0\n", 319 | "_________________________________________________________________\n", 320 | "None\n", 321 | "Epoch 1/150\n", 322 | "2/2 [==============================] - 1s 8ms/step - loss: 2.8014 - accuracy: 0.0244\n", 323 | "Epoch 2/150\n", 324 | "2/2 [==============================] - 0s 7ms/step - loss: 2.6645 - accuracy: 0.1463\n", 325 | "Epoch 3/150\n", 326 | "2/2 [==============================] - 0s 18ms/step - loss: 2.5765 - accuracy: 0.2927\n", 327 | "Epoch 4/150\n", 328 | "2/2 [==============================] - 0s 6ms/step - loss: 2.3987 - accuracy: 0.3171\n", 329 | "Epoch 5/150\n", 330 | "2/2 [==============================] - 0s 7ms/step - loss: 2.2316 - accuracy: 0.4146\n", 331 | "Epoch 6/150\n", 332 | "2/2 [==============================] - 0s 4ms/step - loss: 2.0597 - accuracy: 0.3902\n", 333 | "Epoch 7/150\n", 334 | "2/2 [==============================] - 0s 13ms/step - loss: 1.8662 - accuracy: 0.3902\n", 335 | "Epoch 8/150\n", 336 | "2/2 [==============================] - 0s 6ms/step - loss: 1.6594 - accuracy: 0.4634\n", 337 | "Epoch 9/150\n", 338 | "2/2 [==============================] - 0s 8ms/step - loss: 1.6654 - accuracy: 0.5122\n", 339 | "Epoch 10/150\n", 340 | "2/2 [==============================] - 0s 8ms/step - loss: 1.3711 - accuracy: 0.5366\n", 341 | "Epoch 11/150\n", 342 | "2/2 [==============================] - 0s 11ms/step - loss: 1.2581 - accuracy: 0.5610\n", 343 | "Epoch 12/150\n", 344 | "2/2 [==============================] - 0s 15ms/step - loss: 1.2472 - accuracy: 0.7073\n", 345 | "Epoch 13/150\n", 346 | "2/2 [==============================] - 0s 11ms/step - loss: 0.9367 - accuracy: 0.7805\n", 347 | "Epoch 14/150\n", 348 | "2/2 [==============================] - 0s 5ms/step - loss: 1.0444 - accuracy: 0.6829\n", 349 | "Epoch 15/150\n", 350 | "2/2 [==============================] - 0s 10ms/step - loss: 0.9234 - accuracy: 0.7317\n", 351 | "Epoch 16/150\n", 352 | "2/2 [==============================] - 0s 9ms/step - loss: 0.6533 - accuracy: 0.8537\n", 353 | "Epoch 17/150\n", 354 | "2/2 [==============================] - 0s 6ms/step - loss: 0.8585 - accuracy: 0.6829\n", 355 | "Epoch 18/150\n", 356 | "2/2 [==============================] - 0s 5ms/step - loss: 0.7158 - accuracy: 0.7561\n", 357 | "Epoch 19/150\n", 358 | "2/2 [==============================] - 0s 9ms/step - loss: 0.8260 - accuracy: 0.7561\n", 359 | "Epoch 20/150\n", 360 | "2/2 [==============================] - 0s 8ms/step - loss: 0.5078 - accuracy: 0.9024\n", 361 | "Epoch 21/150\n", 362 | "2/2 [==============================] - 0s 5ms/step - loss: 0.4247 - accuracy: 0.8780\n", 363 | "Epoch 22/150\n", 364 | "2/2 [==============================] - 0s 9ms/step - loss: 0.5910 - accuracy: 0.7805\n", 365 | "Epoch 23/150\n", 366 | "2/2 [==============================] - 0s 5ms/step - loss: 0.4627 - accuracy: 0.8049\n", 367 | "Epoch 24/150\n", 368 | "2/2 [==============================] - 0s 5ms/step - loss: 0.3591 - accuracy: 0.8049\n", 369 | "Epoch 25/150\n", 370 | "2/2 [==============================] - 0s 8ms/step - loss: 0.4436 - accuracy: 0.8293\n", 371 | "Epoch 26/150\n", 372 | "2/2 [==============================] - 0s 4ms/step - loss: 0.4867 - accuracy: 0.8293\n", 373 | "Epoch 27/150\n", 374 | "2/2 [==============================] - 0s 5ms/step - loss: 0.2922 - accuracy: 0.9268\n", 375 | "Epoch 28/150\n", 376 | "2/2 [==============================] - 0s 7ms/step - loss: 0.2794 - accuracy: 0.9024\n", 377 | "Epoch 29/150\n", 378 | "2/2 [==============================] - 0s 8ms/step - loss: 0.5844 - accuracy: 0.7805\n", 379 | "Epoch 30/150\n", 380 | "2/2 [==============================] - 0s 5ms/step - loss: 0.4561 - accuracy: 0.8049\n", 381 | "Epoch 31/150\n", 382 | "2/2 [==============================] - 0s 4ms/step - loss: 0.4389 - accuracy: 0.8537\n", 383 | "Epoch 32/150\n", 384 | "2/2 [==============================] - 0s 10ms/step - loss: 0.2877 - accuracy: 0.9512\n", 385 | "Epoch 33/150\n", 386 | "2/2 [==============================] - 0s 7ms/step - loss: 0.2979 - accuracy: 0.9268\n", 387 | "Epoch 34/150\n", 388 | "2/2 [==============================] - 0s 5ms/step - loss: 0.3697 - accuracy: 0.8537\n", 389 | "Epoch 35/150\n", 390 | "2/2 [==============================] - 0s 5ms/step - loss: 0.2565 - accuracy: 0.9268\n", 391 | "Epoch 36/150\n", 392 | "2/2 [==============================] - 0s 10ms/step - loss: 0.3615 - accuracy: 0.8537\n", 393 | "Epoch 37/150\n", 394 | "2/2 [==============================] - 0s 8ms/step - loss: 0.3240 - accuracy: 0.8537\n", 395 | "Epoch 38/150\n", 396 | "2/2 [==============================] - 0s 5ms/step - loss: 0.2762 - accuracy: 0.9268\n", 397 | "Epoch 39/150\n", 398 | "2/2 [==============================] - 0s 11ms/step - loss: 0.1903 - accuracy: 0.9268\n", 399 | "Epoch 40/150\n", 400 | "2/2 [==============================] - 0s 7ms/step - loss: 0.2076 - accuracy: 0.8780\n", 401 | "Epoch 41/150\n", 402 | "2/2 [==============================] - 0s 9ms/step - loss: 0.1352 - accuracy: 0.9512\n", 403 | "Epoch 42/150\n", 404 | "2/2 [==============================] - 0s 6ms/step - loss: 0.3467 - accuracy: 0.9024\n", 405 | "Epoch 43/150\n", 406 | "2/2 [==============================] - 0s 7ms/step - loss: 0.2939 - accuracy: 0.9024\n", 407 | "Epoch 44/150\n", 408 | "2/2 [==============================] - 0s 5ms/step - loss: 0.2231 - accuracy: 0.9024\n", 409 | "Epoch 45/150\n", 410 | "2/2 [==============================] - 0s 7ms/step - loss: 0.2536 - accuracy: 0.9024\n", 411 | "Epoch 46/150\n", 412 | "2/2 [==============================] - 0s 6ms/step - loss: 0.2922 - accuracy: 0.9024\n", 413 | "Epoch 47/150\n", 414 | "2/2 [==============================] - 0s 4ms/step - loss: 0.1112 - accuracy: 0.9756\n", 415 | "Epoch 48/150\n", 416 | "2/2 [==============================] - 0s 5ms/step - loss: 0.2423 - accuracy: 0.9024\n", 417 | "Epoch 49/150\n", 418 | "2/2 [==============================] - 0s 4ms/step - loss: 0.1979 - accuracy: 0.9024\n", 419 | "Epoch 50/150\n", 420 | "2/2 [==============================] - 0s 6ms/step - loss: 0.1495 - accuracy: 0.9512\n", 421 | "Epoch 51/150\n", 422 | "2/2 [==============================] - 0s 14ms/step - loss: 0.1568 - accuracy: 0.9756\n", 423 | "Epoch 52/150\n", 424 | "2/2 [==============================] - 0s 8ms/step - loss: 0.2660 - accuracy: 0.9024\n", 425 | "Epoch 53/150\n", 426 | "2/2 [==============================] - 0s 7ms/step - loss: 0.2677 - accuracy: 0.9268\n", 427 | "Epoch 54/150\n", 428 | "2/2 [==============================] - 0s 17ms/step - loss: 0.0802 - accuracy: 1.0000\n", 429 | "Epoch 55/150\n", 430 | "2/2 [==============================] - 0s 8ms/step - loss: 0.1366 - accuracy: 0.9512\n", 431 | "Epoch 56/150\n", 432 | "2/2 [==============================] - 0s 6ms/step - loss: 0.1190 - accuracy: 0.9268\n", 433 | "Epoch 57/150\n", 434 | "2/2 [==============================] - 0s 10ms/step - loss: 0.1928 - accuracy: 0.9756\n", 435 | "Epoch 58/150\n", 436 | "2/2 [==============================] - 0s 8ms/step - loss: 0.1699 - accuracy: 0.9268\n", 437 | "Epoch 59/150\n", 438 | "2/2 [==============================] - 0s 14ms/step - loss: 0.1563 - accuracy: 0.9512\n", 439 | "Epoch 60/150\n", 440 | "2/2 [==============================] - 0s 4ms/step - loss: 0.1247 - accuracy: 0.9756\n", 441 | "Epoch 61/150\n", 442 | "2/2 [==============================] - 0s 5ms/step - loss: 0.1019 - accuracy: 0.9756\n", 443 | "Epoch 62/150\n", 444 | "2/2 [==============================] - 0s 4ms/step - loss: 0.1363 - accuracy: 0.9512\n", 445 | "Epoch 63/150\n", 446 | "2/2 [==============================] - 0s 7ms/step - loss: 0.1932 - accuracy: 0.9268\n", 447 | "Epoch 64/150\n", 448 | "2/2 [==============================] - 0s 4ms/step - loss: 0.2659 - accuracy: 0.9268\n", 449 | "Epoch 65/150\n", 450 | "2/2 [==============================] - 0s 5ms/step - loss: 0.1567 - accuracy: 0.9756\n", 451 | "Epoch 66/150\n", 452 | "2/2 [==============================] - 0s 9ms/step - loss: 0.2105 - accuracy: 0.9024\n", 453 | "Epoch 67/150\n", 454 | "2/2 [==============================] - 0s 7ms/step - loss: 0.1316 - accuracy: 0.9268\n", 455 | "Epoch 68/150\n", 456 | "2/2 [==============================] - 0s 6ms/step - loss: 0.0652 - accuracy: 1.0000\n", 457 | "Epoch 69/150\n", 458 | "2/2 [==============================] - 0s 6ms/step - loss: 0.0844 - accuracy: 0.9756\n", 459 | "Epoch 70/150\n", 460 | "2/2 [==============================] - 0s 15ms/step - loss: 0.1119 - accuracy: 0.9756\n", 461 | "Epoch 71/150\n", 462 | "2/2 [==============================] - 0s 6ms/step - loss: 0.0580 - accuracy: 0.9756\n", 463 | "Epoch 72/150\n", 464 | "2/2 [==============================] - 0s 6ms/step - loss: 0.1253 - accuracy: 0.9756\n", 465 | "Epoch 73/150\n", 466 | "2/2 [==============================] - 0s 10ms/step - loss: 0.1525 - accuracy: 0.9512\n", 467 | "Epoch 74/150\n", 468 | "2/2 [==============================] - 0s 8ms/step - loss: 0.1118 - accuracy: 0.9268\n", 469 | "Epoch 75/150\n", 470 | "2/2 [==============================] - 0s 15ms/step - loss: 0.1680 - accuracy: 0.9512\n", 471 | "Epoch 76/150\n", 472 | "2/2 [==============================] - 0s 10ms/step - loss: 0.1311 - accuracy: 0.9268\n", 473 | "Epoch 77/150\n", 474 | "2/2 [==============================] - 0s 11ms/step - loss: 0.1564 - accuracy: 0.9512\n", 475 | "Epoch 78/150\n", 476 | "2/2 [==============================] - 0s 6ms/step - loss: 0.0442 - accuracy: 1.0000\n", 477 | "Epoch 79/150\n", 478 | "2/2 [==============================] - 0s 6ms/step - loss: 0.0905 - accuracy: 0.9512\n", 479 | "Epoch 80/150\n", 480 | "2/2 [==============================] - 0s 5ms/step - loss: 0.1820 - accuracy: 0.9512\n", 481 | "Epoch 81/150\n", 482 | "2/2 [==============================] - 0s 5ms/step - loss: 0.1818 - accuracy: 0.9512\n", 483 | "Epoch 82/150\n", 484 | "2/2 [==============================] - 0s 7ms/step - loss: 0.2064 - accuracy: 0.9756\n", 485 | "Epoch 83/150\n", 486 | "2/2 [==============================] - 0s 5ms/step - loss: 0.3250 - accuracy: 0.8780\n", 487 | "Epoch 84/150\n", 488 | "2/2 [==============================] - 0s 8ms/step - loss: 0.0701 - accuracy: 0.9756\n", 489 | "Epoch 85/150\n", 490 | "2/2 [==============================] - 0s 6ms/step - loss: 0.1716 - accuracy: 0.9512\n", 491 | "Epoch 86/150\n", 492 | "2/2 [==============================] - 0s 8ms/step - loss: 0.1492 - accuracy: 0.9756\n", 493 | "Epoch 87/150\n", 494 | "2/2 [==============================] - 0s 9ms/step - loss: 0.1072 - accuracy: 0.9756\n", 495 | "Epoch 88/150\n", 496 | "2/2 [==============================] - 0s 23ms/step - loss: 0.1376 - accuracy: 0.9512\n", 497 | "Epoch 89/150\n", 498 | "2/2 [==============================] - 0s 6ms/step - loss: 0.1405 - accuracy: 0.9756\n", 499 | "Epoch 90/150\n", 500 | "2/2 [==============================] - 0s 14ms/step - loss: 0.0520 - accuracy: 0.9756\n", 501 | "Epoch 91/150\n", 502 | "2/2 [==============================] - 0s 11ms/step - loss: 0.1650 - accuracy: 0.9268\n", 503 | "Epoch 92/150\n", 504 | "2/2 [==============================] - 0s 4ms/step - loss: 0.1146 - accuracy: 0.9512\n", 505 | "Epoch 93/150\n", 506 | "2/2 [==============================] - 0s 5ms/step - loss: 0.0928 - accuracy: 0.9512\n", 507 | "Epoch 94/150\n", 508 | "2/2 [==============================] - 0s 10ms/step - loss: 0.1644 - accuracy: 0.9756\n", 509 | "Epoch 95/150\n", 510 | "2/2 [==============================] - 0s 5ms/step - loss: 0.0993 - accuracy: 0.9756\n", 511 | "Epoch 96/150\n", 512 | "2/2 [==============================] - 0s 8ms/step - loss: 0.1194 - accuracy: 0.9756\n", 513 | "Epoch 97/150\n", 514 | "2/2 [==============================] - 0s 5ms/step - loss: 0.1089 - accuracy: 0.9756\n", 515 | "Epoch 98/150\n", 516 | "2/2 [==============================] - 0s 4ms/step - loss: 0.1164 - accuracy: 0.9512\n", 517 | "Epoch 99/150\n", 518 | "2/2 [==============================] - 0s 6ms/step - loss: 0.0876 - accuracy: 0.9756\n", 519 | "Epoch 100/150\n", 520 | "2/2 [==============================] - 0s 6ms/step - loss: 0.0617 - accuracy: 0.9756\n", 521 | "Epoch 101/150\n", 522 | "2/2 [==============================] - 0s 7ms/step - loss: 0.0702 - accuracy: 0.9756\n", 523 | "Epoch 102/150\n", 524 | "2/2 [==============================] - 0s 8ms/step - loss: 0.0718 - accuracy: 0.9756\n", 525 | "Epoch 103/150\n", 526 | "2/2 [==============================] - 0s 9ms/step - loss: 0.1082 - accuracy: 0.9512\n", 527 | "Epoch 104/150\n", 528 | "2/2 [==============================] - 0s 5ms/step - loss: 0.1290 - accuracy: 0.9512\n", 529 | "Epoch 105/150\n", 530 | "2/2 [==============================] - 0s 5ms/step - loss: 0.1525 - accuracy: 0.9024\n", 531 | "Epoch 106/150\n", 532 | "2/2 [==============================] - 0s 7ms/step - loss: 0.0896 - accuracy: 0.9756\n", 533 | "Epoch 107/150\n", 534 | "2/2 [==============================] - 0s 16ms/step - loss: 0.0843 - accuracy: 0.9756\n", 535 | "Epoch 108/150\n", 536 | "2/2 [==============================] - 0s 5ms/step - loss: 0.1827 - accuracy: 0.9024\n", 537 | "Epoch 109/150\n", 538 | "2/2 [==============================] - 0s 4ms/step - loss: 0.1893 - accuracy: 0.9268\n", 539 | "Epoch 110/150\n", 540 | "2/2 [==============================] - 0s 6ms/step - loss: 0.1015 - accuracy: 0.9512\n", 541 | "Epoch 111/150\n", 542 | "2/2 [==============================] - 0s 6ms/step - loss: 0.1312 - accuracy: 0.9512\n", 543 | "Epoch 112/150\n", 544 | "2/2 [==============================] - 0s 7ms/step - loss: 0.1070 - accuracy: 0.9512\n", 545 | "Epoch 113/150\n", 546 | "2/2 [==============================] - 0s 6ms/step - loss: 0.0722 - accuracy: 0.9756\n", 547 | "Epoch 114/150\n", 548 | "2/2 [==============================] - 0s 5ms/step - loss: 0.0889 - accuracy: 0.9756\n", 549 | "Epoch 115/150\n", 550 | "2/2 [==============================] - 0s 10ms/step - loss: 0.1116 - accuracy: 0.9512\n", 551 | "Epoch 116/150\n", 552 | "2/2 [==============================] - 0s 6ms/step - loss: 0.0900 - accuracy: 0.9756\n", 553 | "Epoch 117/150\n", 554 | "2/2 [==============================] - 0s 6ms/step - loss: 0.0871 - accuracy: 0.9512\n", 555 | "Epoch 118/150\n", 556 | "2/2 [==============================] - 0s 5ms/step - loss: 0.0730 - accuracy: 0.9756\n", 557 | "Epoch 119/150\n", 558 | "2/2 [==============================] - 0s 4ms/step - loss: 0.0419 - accuracy: 0.9756\n", 559 | "Epoch 120/150\n", 560 | "2/2 [==============================] - 0s 6ms/step - loss: 0.0302 - accuracy: 1.0000\n", 561 | "Epoch 121/150\n", 562 | "2/2 [==============================] - 0s 6ms/step - loss: 0.1419 - accuracy: 0.9268\n", 563 | "Epoch 122/150\n", 564 | "2/2 [==============================] - 0s 6ms/step - loss: 0.1316 - accuracy: 0.9756\n", 565 | "Epoch 123/150\n", 566 | "2/2 [==============================] - 0s 5ms/step - loss: 0.1186 - accuracy: 0.9756\n", 567 | "Epoch 124/150\n", 568 | "2/2 [==============================] - 0s 7ms/step - loss: 0.1000 - accuracy: 0.9268\n", 569 | "Epoch 125/150\n", 570 | "2/2 [==============================] - 0s 14ms/step - loss: 0.1171 - accuracy: 0.9756\n", 571 | "Epoch 126/150\n", 572 | "2/2 [==============================] - 0s 8ms/step - loss: 0.0803 - accuracy: 0.9512\n", 573 | "Epoch 127/150\n", 574 | "2/2 [==============================] - 0s 8ms/step - loss: 0.1935 - accuracy: 0.9268\n", 575 | "Epoch 128/150\n", 576 | "2/2 [==============================] - 0s 6ms/step - loss: 0.0763 - accuracy: 0.9756\n", 577 | "Epoch 129/150\n", 578 | "2/2 [==============================] - 0s 13ms/step - loss: 0.0541 - accuracy: 1.0000\n", 579 | "Epoch 130/150\n", 580 | "2/2 [==============================] - 0s 4ms/step - loss: 0.0478 - accuracy: 0.9756\n", 581 | "Epoch 131/150\n", 582 | "2/2 [==============================] - 0s 22ms/step - loss: 0.1007 - accuracy: 0.9512\n", 583 | "Epoch 132/150\n", 584 | "2/2 [==============================] - 0s 16ms/step - loss: 0.0763 - accuracy: 0.9756\n", 585 | "Epoch 133/150\n", 586 | "2/2 [==============================] - 0s 13ms/step - loss: 0.0672 - accuracy: 0.9512\n", 587 | "Epoch 134/150\n", 588 | "2/2 [==============================] - 0s 7ms/step - loss: 0.0324 - accuracy: 1.0000\n", 589 | "Epoch 135/150\n", 590 | "2/2 [==============================] - 0s 5ms/step - loss: 0.1025 - accuracy: 0.9512\n", 591 | "Epoch 136/150\n", 592 | "2/2 [==============================] - 0s 5ms/step - loss: 0.0674 - accuracy: 0.9512\n", 593 | "Epoch 137/150\n", 594 | "2/2 [==============================] - 0s 9ms/step - loss: 0.0798 - accuracy: 0.9756\n", 595 | "Epoch 138/150\n", 596 | "2/2 [==============================] - 0s 4ms/step - loss: 0.1384 - accuracy: 0.9268\n", 597 | "Epoch 139/150\n", 598 | "2/2 [==============================] - 0s 5ms/step - loss: 0.0639 - accuracy: 1.0000\n", 599 | "Epoch 140/150\n", 600 | "2/2 [==============================] - 0s 5ms/step - loss: 0.0365 - accuracy: 0.9756\n", 601 | "Epoch 141/150\n", 602 | "2/2 [==============================] - 0s 5ms/step - loss: 0.1473 - accuracy: 0.9756\n", 603 | "Epoch 142/150\n", 604 | "2/2 [==============================] - 0s 13ms/step - loss: 0.1291 - accuracy: 0.9268\n", 605 | "Epoch 143/150\n", 606 | "2/2 [==============================] - 0s 14ms/step - loss: 0.0555 - accuracy: 0.9756\n", 607 | "Epoch 144/150\n", 608 | "2/2 [==============================] - 0s 5ms/step - loss: 0.0704 - accuracy: 0.9512\n", 609 | "Epoch 145/150\n", 610 | "2/2 [==============================] - 0s 8ms/step - loss: 0.1276 - accuracy: 0.9268\n", 611 | "Epoch 146/150\n", 612 | "2/2 [==============================] - 0s 5ms/step - loss: 0.0544 - accuracy: 0.9512\n", 613 | "Epoch 147/150\n", 614 | "2/2 [==============================] - 0s 5ms/step - loss: 0.1525 - accuracy: 0.9756\n", 615 | "Epoch 148/150\n", 616 | "2/2 [==============================] - 0s 12ms/step - loss: 0.0907 - accuracy: 0.9756\n", 617 | "Epoch 149/150\n", 618 | "2/2 [==============================] - 0s 14ms/step - loss: 0.0869 - accuracy: 0.9756\n", 619 | "Epoch 150/150\n", 620 | "2/2 [==============================] - 0s 19ms/step - loss: 0.1337 - accuracy: 0.9268\n" 621 | ], 622 | "name": "stdout" 623 | }, 624 | { 625 | "output_type": "execute_result", 626 | "data": { 627 | "text/plain": [ 628 | "" 629 | ] 630 | }, 631 | "metadata": { 632 | "tags": [] 633 | }, 634 | "execution_count": 6 635 | } 636 | ] 637 | }, 638 | { 639 | "cell_type": "code", 640 | "metadata": { 641 | "id": "bjWR6_B7SJ-_" 642 | }, 643 | "source": [ 644 | "#7 Preprocessing the Input\n", 645 | "\n", 646 | "def clean_text(text): \n", 647 | " tokens = nltk.word_tokenize(text)\n", 648 | " tokens = [lemmatizer.lemmatize(word) for word in tokens]\n", 649 | " return tokens\n", 650 | "\n", 651 | "def bag_of_words(text, vocab): \n", 652 | " tokens = clean_text(text)\n", 653 | " bow = [0] * len(vocab)\n", 654 | " for w in tokens: \n", 655 | " for idx, word in enumerate(vocab):\n", 656 | " if word == w: \n", 657 | " bow[idx] = 1\n", 658 | " return np.array(bow)\n", 659 | "\n", 660 | "def pred_class(text, vocab, labels): \n", 661 | " bow = bag_of_words(text, vocab)\n", 662 | " result = model.predict(np.array([bow]))[0] #Extracting probabilities\n", 663 | " thresh = 0.5\n", 664 | " y_pred = [[indx, res] for indx, res in enumerate(result) if res > thresh]\n", 665 | " y_pred.sort(key=lambda x: x[1], reverse=True) #Sorting by values of probability in decreasing order\n", 666 | " return_list = []\n", 667 | " for r in y_pred:\n", 668 | " return_list.append(labels[r[0]]) #Contains labels(tags) for highest probability \n", 669 | " return return_list\n", 670 | "\n", 671 | "def get_response(intents_list, intents_json): \n", 672 | " if len(intents_list) == 0:\n", 673 | " result = \"Sorry! I don't understand.\"\n", 674 | " else:\n", 675 | " tag = intents_list[0]\n", 676 | " list_of_intents = intents_json[\"intents\"]\n", 677 | " for i in list_of_intents: \n", 678 | " if i[\"tag\"] == tag:\n", 679 | " result = random.choice(i[\"responses\"])\n", 680 | " break\n", 681 | " return result" 682 | ], 683 | "execution_count": null, 684 | "outputs": [] 685 | }, 686 | { 687 | "cell_type": "code", 688 | "metadata": { 689 | "colab": { 690 | "base_uri": "https://localhost:8080/" 691 | }, 692 | "id": "vQLRSslMSQ9s", 693 | "outputId": "a902746b-a34c-47b2-fb63-8e2643937300" 694 | }, 695 | "source": [ 696 | "# Interacting with the chatbot\n", 697 | "print(\"Press 0 if you don't want to chat with our ChatBot.\")\n", 698 | "while True:\n", 699 | " message = input(\"\")\n", 700 | " if message == \"0\":\n", 701 | " break\n", 702 | " intents = pred_class(message, words, classes)\n", 703 | " result = get_response(intents, data)\n", 704 | " print(result)" 705 | ], 706 | "execution_count": null, 707 | "outputs": [ 708 | { 709 | "output_type": "stream", 710 | "text": [ 711 | "Press 0 if you don't want to chat with our ChatBot.\n", 712 | "hi\n", 713 | "Good morning!\n", 714 | "How are you\n", 715 | "Sorry! I don't understand.\n", 716 | "Hello\n", 717 | "That is perfect!\n", 718 | "how do you do\n", 719 | "Actually, I'm okay and you?\n", 720 | "I am good too.\n", 721 | "That is perfect!\n", 722 | "Yes, bye.\n", 723 | "Goodbye!\n", 724 | "0\n" 725 | ], 726 | "name": "stdout" 727 | } 728 | ] 729 | } 730 | ] 731 | } --------------------------------------------------------------------------------