Spaces:
Sleeping
Sleeping
| 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() | |