|
|
|
import random |
|
import numpy as np |
|
import pickle |
|
import json |
|
from flask import Flask, render_template, request |
|
from flask_ngrok import run_with_ngrok |
|
import nltk |
|
from keras.models import load_model |
|
from nltk.stem import WordNetLemmatizer |
|
lemmatizer = WordNetLemmatizer() |
|
|
|
|
|
|
|
model = load_model("chatbot_model.h5") |
|
|
|
data_file = open("F:\\Data Science Course - IIITB\\NLP\\Chatbot\\AI Chatbot\\An-AI-Chatbot-in-Python-and-Flask-main\\intents.json").read() |
|
words = pickle.load(open("words.pkl", "rb")) |
|
classes = pickle.load(open("classes.pkl", "rb")) |
|
|
|
app = Flask(__name__) |
|
|
|
|
|
@app.route("/") |
|
def home(): |
|
return render_template("index.html") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@app.route("/get", methods=["POST"]) |
|
def chatbot_response(): |
|
msg = request.form["msg"] |
|
|
|
|
|
data_file = open("F:\\Data Science Course - IIITB\\NLP\\Chatbot\\AI Chatbot\\An-AI-Chatbot-in-Python-and-Flask-main\\intents.json").read() |
|
intents = json.loads(data_file) |
|
|
|
|
|
if msg.startswith('my name is'): |
|
name = msg[11:] |
|
ints = predict_class(msg, model) |
|
res1 = getResponse(ints, intents) |
|
res = res1.replace("{n}", name) |
|
elif msg.startswith('hi my name is'): |
|
name = msg[14:] |
|
ints = predict_class(msg, model) |
|
res1 = getResponse(ints, intents) |
|
res = res1.replace("{n}", name) |
|
else: |
|
ints = predict_class(msg, model) |
|
res = getResponse(ints, intents) |
|
return res |
|
|
|
|
|
def clean_up_sentence(sentence): |
|
sentence_words = nltk.word_tokenize(sentence) |
|
sentence_words = [lemmatizer.lemmatize(word.lower()) for word in sentence_words] |
|
return sentence_words |
|
|
|
|
|
|
|
def bow(sentence, words, show_details=True): |
|
|
|
sentence_words = clean_up_sentence(sentence) |
|
|
|
bag = [0] * len(words) |
|
for s in sentence_words: |
|
for i, w in enumerate(words): |
|
if w == s: |
|
|
|
bag[i] = 1 |
|
if show_details: |
|
print("found in bag: %s" % w) |
|
return np.array(bag) |
|
|
|
|
|
def predict_class(sentence, model): |
|
|
|
p = bow(sentence, words, show_details=False) |
|
res = model.predict(np.array([p]))[0] |
|
ERROR_THRESHOLD = 0.25 |
|
results = [[i, r] for i, r in enumerate(res) if r > ERROR_THRESHOLD] |
|
|
|
results.sort(key=lambda x: x[1], reverse=True) |
|
return_list = [] |
|
for r in results: |
|
return_list.append({"intent": classes[r[0]], "probability": str(r[1])}) |
|
return return_list |
|
|
|
|
|
def getResponse(ints, intents_json): |
|
tag = ints[0]["intent"] |
|
list_of_intents = intents_json["intents"] |
|
for i in list_of_intents: |
|
if i["tag"] == tag: |
|
result = random.choice(i["responses"]) |
|
break |
|
return result |
|
|
|
|
|
if __name__ == "__main__": |
|
app.run() |
|
|
|
|