islam_chatbot / app.py
abdwahdia's picture
Update app.py
3aa6348 verified
import json
import string
import random
import nltk
import pandas as pd
import numpy as np
from nltk.stem import WordNetLemmatizer
from sklearn.feature_extraction.text import CountVectorizer
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Dropout
nltk.download("punkt")
nltk.download("wordnet")
nltk.download('punkt_tab')
# Extraire le fichier intents.json
with open('intents.json') as f:
data = json.load(f)
# Initialiser le lemmatizer
lem = WordNetLemmatizer()
classes = [] # liste des différents labels
words = [] # liste des différents mots
documentX = [] # liste des différents patterns
documentY = [] # liste des labels de chaque patterns
# Tokeniser les patterns et rajouter les questions dans documentX et les étiquettes dans documentY
for intent in data['intents']:
for pattern in intent["patterns"]:
tkns = nltk.word_tokenize(pattern) # tokeniser les patterns
words.extend(tkns)# étendre words
documentX.append(pattern)# rajouter pattern dans documentX
documentY.append(intent['tag'])# rajouter le label dans document
if intent["tag"] not in classes:
classes.append(intent['tag'])# rajouter les labels dans Classes
words =[lem.lemmatize(word.lower()) for word in words if word is not string.punctuation] # Lemmatiser Words tout en s'assurant que les mots sont lowercase et les ponctuations ignorées
words =sorted(set(words))# récupérer les mots uniques et ordonner en ordre alphabétiques
classes = sorted(set(classes))# récupérer les labels uniques et ordonner en ordre alphabétiques
# importer le modèle
model = tf.keras.models.load_model('chatbot_model.keras')
# Fonction tokenisation et lemmatisant le pattern entrée par le user
def tk_lm_func(text):
tkns = nltk.word_tokenize(text)
tkns = [lem.lemmatize(word) for word in tkns]
return tkns
# fonction vectorisant la question entrée par le user
def vectorizer_func(text, vocab):
tkns = tk_lm_func(text)
sent_vec = [0] * len(vocab)
for w in tkns:
for idx, word in enumerate(vocab):
if word == w:
sent_vec[idx] = 1
return np.array(sent_vec)
# Fonction de prédiction
def Pred_func(text, vocab, labels):
sent_vec = vectorizer_func(text, vocab)# Vectoriser la phrase
result =model.predict(np.array([sent_vec])) # Prédire
result = result.argmax(axis =1) # Récupérer l'index du label qui la probabilité la plus grande
tag =labels[result[0]] # Récupérer le label en text
return tag# Retourner tag
def get_res(tag, fJson):
list_intents = fJson['intents'] # liste des intents
for i in list_intents:
if i["tag"] == tag:
ourResult = random.choice(i['responses']) # Choisir de aléatoire par les responses de label tag
break
return ourResult
# Fonction response
def chatbot_response(text, history):
tag = Pred_func(text.lower(), words, classes)
result = get_res(tag, data)
return result
# import gradio
import gradio as gr
# Wrap chatbot_response in a lambda function to handle the additional state argument
gr.ChatInterface(fn = chatbot_response, # Pass only the message to chatbot_response
chatbot=gr.Chatbot(height=300),
textbox=gr.Textbox(placeholder="Ask me a question", container=False, scale=7),
title="My islam chatbot",
description="Ask any questions related to islam",
theme="soft",
examples=list(np.unique(np.array(documentX))),
cache_examples=True,
retry_btn=None,
undo_btn="Delete Previous",
clear_btn="Clear",
).launch()