#!/usr/bin/env python # coding: utf-8 # In[ ]: import streamlit as st import nltk from nltk.stem import WordNetLemmatizer import pickle import numpy as np from tensorflow.keras.models import load_model nltk.download('punkt') nltk.download('wordnet') # Load saved model and other necessary files model = load_model("chatbot_model.h5") words = pickle.load(open('words.pkl', 'rb')) classes = pickle.load(open('classes.pkl', 'rb')) lemmatizer = WordNetLemmatizer() # Function to preprocess user input 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 # Function to convert input to bag-of-words format 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(f"found in bag: {w}") return np.array(bag) # Streamlit app def main(): st.title("Chatbot App") st.write("Welcome to the chatbot! Start a conversation.") user_input = st.text_input("You: ") if st.button("Send"): if user_input.strip() == "": st.write("Bot: Please enter a message.") else: p = bow(user_input, words) 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])}) for i in intents["intents"]: if i["tag"] == return_list[0]["intent"]: response = np.random.choice(i["responses"]) break st.write("Bot:", response) if __name__ == "__main__": main()