diff --git a/reglementdescolarite-ingegeneraliste2324-1.docx.txt b/reglementdescolarite-ingegeneraliste2324-1.docx.txt
index 3d73af458ab02d0702812b83e7a1da004f3d9f15..be6bf866aca0148666931a1f6fd065f7c2e080d0 100644
--- a/reglementdescolarite-ingegeneraliste2324-1.docx.txt
+++ b/reglementdescolarite-ingegeneraliste2324-1.docx.txt
@@ -106,44 +106,17 @@ Modalités d’Application
 1. Personnalisation du cursus ingénieur
    1. Différentes variantes du cursus ingénieur
 Pour les élèves admis sur concours ou sur titres, les différentes variantes du cursus ingénieur sont représentées dans le tableau ci-dessous :
-	---- ---- ---- ---- ----        Parcours
-----        ---- 
-Diplômes        ----        ---- 
-	Tronc
-Commun
-	Parcours
-Électif
-	Stages
-	ECL
-	S5, S6, S7
-	S8 ♦, S9 ♦
-	Exécution
-Application ♦
-TFE ♦
-	Double-Diplômes
-ECL-ENSAL
-S5, S6, S7
-	S8 ♦, S9 ♦
-	Exécution Application ♦ TFE ♦
-	ECL-ENSL
-	Étendu S5, S6, S7,S8
-	Exécution
-Application TFE
-	ECL-EML
-ECL-ENSAE
-	Étendu
-S5, S6, S7,S8
-	Exécution
-Application
-	ECL-Médecine
-	Étendu S5, S6, S7,S8
-	Exécution
-Application TFE
-	ECL-Univ.
-	Étendu
-S5, S6, S7,S8
-	Exécution
-Application
++--------------+--------------------------+---------------+-------------------------+----------------------------+
+|              | Parcours                 | Tronc Commun  | Parcours Électif        | Stages                     |
++--------------+--------------------------+---------------+-------------------------+----------------------------+
+|              | ECL                      | S5, S6, S7    | S8 ♦, S9 ♦              | Exécution Application ♦ TFE ♦ |
++--------------+--------------------------+---------------+-------------------------+----------------------------+
+| Double-      | ECL-ENSAL                | S5, S6, S7    | S8 ♦, S9 ♦              | Exécution Application ♦ TFE ♦ |
+|  Diplômes    | ECL-ENSL                 | Étendu S5, S6, S7, S8 |                 | Exécution Application TFE   |
+|              | ECL-EML ECL-ENSAE        | Étendu S5, S6, S7, S8 |                 | Exécution Application      |
+|              | ECL-Médecine             | Étendu S5, S6, S7, S8 |                 | Exécution Application TFE  |
+|              | ECL-Univ.                | Étendu S5, S6, S7, S8 |                 | Exécution Application      |
++--------------+--------------------------+---------------+-------------------------+----------------------------+
 	où
 * ECL = diplôme d’ingénieur de l’École Centrale de Lyon;
 * ENSAL = diplôme d’état d’Architecte valant grade de master de l’École Nationale Supérieure d’Architecture de Lyon;
@@ -152,82 +125,35 @@ Application
 * EML = diplôme du programme Grande École (MSc in Management) de l’EMLyon Business School;
 * ENSAE = diplôme de l’École Nationale de la Statistique et de l?Administration Économique Paristech ;
 * Univ. = diplôme de l’Université étrangère partenaire.
-L’ensemble ♦ (Parcours Électif + Stage d’Application + TFE) peut être réaménagé de la façon suivante :
 
 
-Aménagement
-	Parcours
-Électif
-	Stages
-	sans
-	S8, S9
-	Application
-TFE
-	1  
-	1 S. étranger
-S9
-	TFE
-	2  
-	S8
-2 S. étranger *
-	Application
-TFE
-	3  
-	S8
-> 3 S. étranger •
-	Application
+L’ensemble ♦ (Parcours Électif + Stage d’Application + TFE) peut être réaménagé de la façon suivante :
++--------------+--------------------------+--------+
+| Aménagement  | Parcours Électif         | Stages |
++--------------+--------------------------+--------+
+| sans         | S8, S9                   | Application TFE |
+| 1            | 1 S. étranger S9         | TFE    |
+| 2            | S8 2 S. étranger *      | Application TFE |
+| 3            | S8 > 3 S. étranger •    | Application |
++--------------+--------------------------+--------+
 	où
 * * = deux semestres académiques (non diplômants) effectués dans une université étrangère partenaire validant au moins 30 crédits ECTS ou équivalent OU deux semestres académiques effectués dans une université étrangère non partenaire, sanctionnés par le diplôme de l’université d’accueil ;
 * • = au moins trois semestres académiques incluant un projet de recherche effectués dans une uni-
 versité étrangère non partenaire, sanctionnés par le diplôme de l’université d’accueil.
-Pour les élèves admis en formation double-diplômante, les différentes variantes du cursus ingénieur sont représentée dans le tableau ci-dessous :
 
 
----- ---- ---- ---- ----        Parcours
-----        ---- 
-Diplômes        ----        ---- 
-	Tronc
-Commun
-	Parcours
-Électif
-	Stages
-	ENSAL-ECL
-	S5, S6, S7
-	S8 ♦, S9 ♦
-	Exécution
-Application ♦
-TFE ♦
-	ENSL-ECL
-ENSAE-ECL
-	Étendu
-S7, S8, S9
-	Application
-TFE
-EML-ECL
-S5, S6, S7
-	Réduit S9
-	Exécution
-Application TFE
-	Mahindra - ECL
-	Étendu
-S7 d’intégration, S8, S9
-	Application
-TFE
-	Médecine - ECL
-	Étendu
-S5, S6, S7, S8
-	Exécution
-Application
-	Univ.- ECL (1)
-	Étendu
-S5, S6, S7, S8
-	Exécution
-Application
-	Univ.- ECL (2)
-	Étendu
-S7, S8, S9
-	Application
-TFE
+Pour les élèves admis en formation double-diplômante, les différentes variantes du cursus ingénieur sont représentée dans le tableau ci-dessous :
++-------------------+---------------+--------------------------+------------------------+
+| Parcours Diplômes | Tronc Commun  | Parcours Électif         | Stages                 |
++-------------------+---------------+--------------------------+------------------------+
+| ENSAL-ECL         | S5, S6, S7    | S8 ♦, S9 ♦               | Exécution Application ♦ TFE ♦ |
+|ENSL-ECL/ENSAE-ECL |               | Étendu S7, S8, S9         | Application TFE"        |
+| EML-ECL           | S5, S6, S7    | Réduit S9                 | Exécution Application TFE      |
+| Mahindra - ECL    |               | Étendu S7 d’intégration, S8, S9 | Application TFE   |
+| Médecine - ECL    | Étendu S5, S6, S7, S8 |                  | Exécution Application |
+| Univ.- ECL (1)    | Étendu S5, S6, S7, S8 |                  | Exécution Application |
+| Univ.- ECL (2)    |               | Étendu S7, S8, S9         | Application TFE        |
++-------------------+---------------+--------------------------+------------------------+
 	où
 * ENSAL-ECL correspond aux élèves de l’École Nationale Supérieure d’Architecture de Lyon admis en première année;
 * ENSL-ECL = correspond aux élèves de l’École Normale Supérieure de Lyon admis en deuxième année;
@@ -247,12 +173,12 @@ La sous-commission en charge des échanges internationaux (CEU internationale) e
 La sous-commission en charge des échanges en France (CEU France) est présidée par le Directeur de l’École Centrale de Lyon ou son représentant ; elle est composée d’au moins un représentant de la Direction des Formations (incluant le Service de Scolarité), d’au moins un représentant de la Direction du Développement des Relations Internationales et des responsables des doubles cursus avec des établissements partenaires en France.
 Les sous-commissions peuvent inviter toute personne compétente pour les assister dans leurs travaux, notamment les responsables des équipes pédagogiques et des cursus (UE, options/métiers, etc.) pour les mobilités entrantes.
 
-
+   2. Echanges universitaires
       2. Mobilités internationales
 La CEU internationale examine les dossiers des étudiants candidats au recrutement dans le cadre des accords internationaux de l’établissement pour admission en qualité d’élèves à l’École Centrale de Lyon pour une scolarité de deux ans en vue de l’obtention du diplôme d’ingénieur généraliste de l’École Centrale de Lyon. Elle examine aussi les dossiers des étudiants candidats pour une scolarité en 3e année en vue de l’obtention du DESECL ou l’acquisition de crédits ECTS (European Credit Transfert System), ainsi que pour le certificat de formation à la recherche et l’admission pour un échange d’un semestre en S8. Dans tous les cas, ces candidats sont en priorité des étudiants proposés par les universités partenaires. Le Directeur de l’École Centrale de Lyon fixe la liste des élèves admis sur titre sur proposition de la Commission des Echanges Universitaires.
 La CEU internationale examine également les dossiers des élèves ingénieurs centraliens qui sont candidats à une formation double diplomante ou un échange dans une université étrangère suivant les critères présentés dans le dossier de demande. Elle statue sur l’autorisation à postuler dans un ou plusieurs établissements (à l’exclusion de tout autre) dans le cadre d’un échange. En cas de refus, les motifs de cette décision seront transmis aux élèves concernés. L’élève est finalement autorisé à partir lorsque l’établissement d’accueil émet un avis favorable pour l’accueillir, après validation de son Tronc Commun (Étendu le cas échéant) par le jury de Tronc Commun, et après validation du learning agreement par la Direction du Développement des Relations Internationales selon les modalités indiquées.
 
-
+   2. Echanges universitaires
       3. Mobilités en France
 La CEU France examine les dossiers des étudiants candidats au recrutement dans le cadre des accords avec des établissements partenaires en France (et l’École Centrale de Casablanca) pour une admission sur titre en qualité d’élèves à l’École Centrale de Lyon ou en double diplôme pour une scolarité de deux ou trois ans en vue de l’obtention du diplôme d’ingénieur généraliste de l’École Centrale de Lyon. Elle examine aussi les dossiers des étudiants issus d’établissements partenaires en France, candidats pour une scolarité en 3e année en vue de l’obtention du DESECL. Le Directeur de l’École Centrale de Lyon fixe la liste des élèves admis sur titre sur proposition de la Commission des Echanges Universitaires.
 La CEU France examine également les dossiers des élèves ingénieurs centraliens qui sont candidats à une formation double diplomante ou un échange dans un établissement partenaire en France suivant les critères présentés dans le dossier de demande. Elle statue sur l’autorisation à postuler dans un ou plusieurs établissements (à l’exclusion de tout autre) dans le cadre d’un échange. En cas de refus, les motifs de cette décision seront transmis aux élèves concernés. L’élève est finalement autorisé à partir lorsque l’établissement d’accueil émet un avis favorable pour l’accueillir et après validation de son Tronc Commun (Étendu le cas échéant) par le jury de Tronc Commun.
@@ -386,8 +312,6 @@ Les Actions de Formation de l’UE Électif, l’UE MOD et les MOS de l’UE Sec
 Les Actions de Formation de l’UE Métier et les MSO de l’UE Secteur sont des Actions de Formation dont le bon déroulement est obtenu à travers la participation active des élèves et des auditeurs. Avec l’accord du Conseil de l’Unité d’Enseignement concernée, la participation et la présence des élèves et auditeurs dans ces AF pourront faire l’objet d’une évaluation chiffrée. Un avis sur le comportement général de l’élève au cours des activités de ces Actions de Formation (adaptation et intégration dans la vie d’option, présence, travail personnel et autonomie, aptitude à travailler en équipe) est exigé pour chaque élève et pour chaque auditeur.
 Les Unités d’Enseignement spécifiques au Parcours Électif sont des UE dont les AF suivies par un élève résulte de son choix. Ce type d’UE est validé par un élève ou un auditeur si la note globale de chaque Action de Formation est supérieure ou égale à 10.
 Dans le cas d’une note globale d’Action de Formation d’un élève ou d’un auditeur strictement inférieure à 10 avec la note globale d’UE supérieure ou égale à 10, le Conseil de l’Unité d’Enseignement doit faire au Jury de Parcours Électif une proposition motivée de validation pour cet élève ou auditeur. Cette proposition se fonde sur une appréciation générale du travail personnel de l’élève ainsi que sur son implication. Pour cela, le Conseil d’UE se fonde sur différents paramètres incluant les notes de compétence de l’UE ainsi que l’absentéisme.
-
-
 Dans le cas où la note globale d’UE est strictement inférieure à 10, la validation de l’UE serait directement discutée par le Jury.
 
 
@@ -445,7 +369,7 @@ est décidé par la Direction des Formations, sur la base du dossier déposé pa
       1. Transmission au Jury
 L’ensemble des notes (notes de Savoir et de Savoir-Faire évaluées, notes globale d’UE et notes de Compétences Transversales) est transmis au Jury à la fin du semestre par le Service de la Scolarité.
 
-
+   10. Dossier scolaire de l’élève
       2. Éléments du dossier
 Le Service de la Scolarité constitue pour chaque élève un dossier scolaire qui comprend :
 * les feuilles de synthèse semestrielles incluant les décisions des jurys ;
@@ -454,7 +378,7 @@ Le Service de la Scolarité constitue pour chaque élève un dossier scolaire qu
 * les informations éventuellement fournies par les Conseils d’Unité d’Enseignement;
 * divers autres documents personnalisés ayant trait à la scolarité de l’élève, y compris les éventuels compléments d’information transmis par l’élève et PVs d’audition par une commission issue d’un Jury, les certificats médicaux, les relevés d’absences et les éventuels avertissements ou blâmes.
 
-
+   10. Dossier scolaire de l’élève
       3. Feuilles de synthèse
 Les feuilles de synthèse semestrielles mentionnent :
 * les notes globales de chaque Action de Formation et de chaque UE suivies par l’élève durant le semestre;
@@ -467,38 +391,20 @@ Les feuilles de synthèse semestrielles mentionnent :
 * les décisions des jurys prises à partir des mesures à leur disposition et décrites dans l’Annexe J
 « Fonctionnement des Jurys », page 29.
 
-
+   10. Dossier scolaire de l’élève
       4. Barème d’évaluation
 Le barème d’évaluation défini à la suite prend en compte deux critères : la position de l’élève au sein de sa promotion et la note obtenue. Selon la décision du Conseil d’Administration en date du 1er mars 2000, la meilleure des transcriptions est retenue entre les 2ème et 3ème colonnes du tableau suivant.
-Evaluation
-	Note /20
-	Pourcentage d’élèves
-ayant validé l’activité
-	Signification
-	A
-	≥ 14
-	10
-	Excellent
-	B
-	∈ [12, 14[
-	25
-	Très Bien
-	C
-	∈ [11, 12[
-	30
-	Bien
-	D
-	∈ [10, 11[
-	35
-	Suffisant
-	J
-	–
-	–
-	Validé par le Jury
-	F
-	< 10
-	–
-	Insuffisant
++------------+-----------+----------------------------+--------------+
+| Evaluation | Note/20   | Pourcentage d’élèves ayant | Signification|
+|            |           | validé l’activité          |              |
++------------+-----------+----------------------------+--------------+
+| A          | ≥ 14      | 10                         | Excellent    |
+| B          | ∈ [12, 14[| 25                         | Très Bien    |
+| C          | ∈ [11, 12[| 30                         | Bien         |
+| D          | ∈ [10, 11[| 35                         | Suffisant    |
+| J          | –         | –                          | Validé par le Jury |
+| F          | < 10      | –                          | Insuffisant  |
++------------+---------+----------------------------+--------------+
 	Dans le cas où le barème ci-dessus est appliqué à l’évaluation d’une UE et où la note globale de l’UE est strictement inférieure à 10/20, si l’UE a été validée par décision du Jury (compensation ou autre), l’évaluation de l’UE est J, sinon l’évaluation de l’UE est F.
 
 
@@ -593,7 +499,7 @@ D’après le décret numéro 2005-1617 du 21 décembre 2005, les élèves et le
 3. la conservation, durant cinq ans, des notes à des épreuves ou des unités obtenues à l’un des examens [...] ;
 4. l’étalement sur plusieurs sessions du passage des épreuves de l’un des examens [...] ».
 
-
+6. Scolarité en situation de handicap
    23. Aménagements
 Les aménagements prévus par le décret sont mis en œuvre par l’École Centrale de Lyon suivant la procédure définie ci-dessous.
 1. Déclaration des élèves et des auditeurs en situation de handicap : si son handicap est permanent ou déclaré lors de son inscription à l’École Centrale de Lyon, l’élève doit déposer une demande d’aménagement auprès du Service de la Scolarité lors de son inscription à l’École Centrale de Lyon. Dans le cas où son handicap se déclare en cours de scolarité, qu’il soit temporaire ou non, l’élève doit déposer sa demande d’aménagement lorsqu’il se déclare.
@@ -1081,78 +987,4 @@ Une commission est créée (Commission Mobilité) pour assister la Direction des
 Allègement Pour les élèves du parcours ECL tel que définis section A.1 et pour les élèves primo-entrants avant l’année universitaire 2018-2019, la durée minimale totale est ramenée de 21 semaines à 12 semaines.
 
 
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-  
-
-4. Le Président du BDE transmet chaque année la liste des postes pouvant bénéficier d’une dispense de mobilité ; pour bé- néficier effectivement de cette dispense, chaque élève concerné doit déposer une demande individuelle auprès du Directeur des Formations.
\ No newline at end of file
+4. Le Président du BDE transmet chaque année la liste des postes pouvant bénéficier d’une dispense de mobilité ; pour bénéficier effectivement de cette dispense, chaque élève concerné doit déposer une demande individuelle auprès du Directeur des Formations.
\ No newline at end of file
diff --git a/test_interface.py b/test_interface.py
new file mode 100644
index 0000000000000000000000000000000000000000..0173d235502d7ab8f25e7db94d463c5d8e98ea49
--- /dev/null
+++ b/test_interface.py
@@ -0,0 +1,95 @@
+import sys
+from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTextEdit, QLineEdit, QPushButton, QSizePolicy
+from sklearn.feature_extraction.text import TfidfVectorizer
+from sklearn.metrics.pairwise import cosine_similarity
+import numpy as np
+
+def read_text_file(file_path):
+    with open(file_path, 'r', encoding='utf-8') as file:
+        content = file.read().split('\n\n')
+        content1 = [item for item in content if item != ""]
+    return content1
+
+
+def create_vectorial_base(text_lines, min_chars=50):
+    filtered_lines = [line for line in text_lines if len(line) >= min_chars]
+
+    if not filtered_lines:
+        print("No lines with at least 50 characters found.")
+        return None, None, None
+
+    vectorizer = TfidfVectorizer()
+    vectorial_base = vectorizer.fit_transform(filtered_lines).toarray()
+    feature_names = vectorizer.get_feature_names_out()
+    
+    return vectorizer, vectorial_base, feature_names
+
+def get_best_answers(question, text_lines, vectorizer, vectorial_base):
+    question_vector = vectorizer.transform([question]).toarray()
+
+    # Calculate cosine similarity between the question and each text line
+    similarities = cosine_similarity(question_vector, vectorial_base).flatten()
+
+    # Get the indices of the top 5 most similar text lines
+    top_indices = np.argsort(similarities)[-5:][::-1]
+    # Retrieve the corresponding text lines
+    best_answers = [text_lines[i] for i in top_indices]
+
+    return best_answers
+
+class ChatbotInterface(QWidget):
+    def __init__(self):
+        super().__init__()
+        file_path = 'reglementdescolarite-ingegeneraliste2324-1.docx.txt'  # Replace with the path to your text file
+        self.text_lines = read_text_file(file_path)
+
+        if not self.text_lines:
+            print("The file is empty or doesn't exist.")
+            return
+        self.vectorizer, self.vectorial_base, _ = create_vectorial_base(self.text_lines)
+        self.init_ui()
+        
+
+    def init_ui(self):
+        # Créer des widgets
+        self.conversation_text = QTextEdit(self)
+        self.conversation_text.setReadOnly(True)
+
+        self.user_input_entry = QLineEdit(self)
+        self.user_input_entry.setPlaceholderText("Saisissez votre message...")
+
+        self.send_button = QPushButton("Envoyer", self)
+        self.send_button.clicked.connect(self.send_message)
+
+        # Configurer la mise en page
+        layout = QVBoxLayout(self)
+        layout.addWidget(self.conversation_text)
+        layout.addWidget(self.user_input_entry)
+        layout.addWidget(self.send_button)
+
+        # Configurer la politique de taille pour permettre à la zone de conversation de s'étendre verticalement
+        size_policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
+        self.conversation_text.setSizePolicy(size_policy)
+
+        # Définir la fenêtre principale
+        self.setWindowTitle('Chatbot Interface')
+        self.setGeometry(100, 100, 800, 600)
+
+    def send_message(self):
+        user_message = self.user_input_entry.text()
+        self.conversation_text.append(f"Utilisateur: {user_message}")
+
+        best_answers = get_best_answers(user_message, self.text_lines, self.vectorizer, self.vectorial_base)
+        chatbot_response=""
+        for i, answer in enumerate(best_answers, start=1):
+            chatbot_response+=(f"{i}. {answer.strip()}\n")
+        
+        self.conversation_text.append(chatbot_response)
+
+        self.user_input_entry.clear()
+
+if __name__ == '__main__':
+    app = QApplication(sys.argv)
+    chatbot_app = ChatbotInterface()
+    chatbot_app.show()
+    sys.exit(app.exec_())
diff --git a/visuel.py b/visuel.py
new file mode 100644
index 0000000000000000000000000000000000000000..40103f74602854528502c5f0c7dbb0f783712a7d
--- /dev/null
+++ b/visuel.py
@@ -0,0 +1,231 @@
+import sys
+from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QVBoxLayout, QTextEdit, QLineEdit, QPushButton, QSizePolicy, QListWidget, QListWidgetItem,QLabel
+from PyQt5.QtCore import Qt
+from PyQt5.QtGui import QPalette, QColor
+from PyQt5.QtGui import QPixmap
+from sklearn.feature_extraction.text import TfidfVectorizer
+from sklearn.metrics.pairwise import cosine_similarity
+import numpy as np
+from nltk.corpus import stopwords
+from nltk.tokenize import word_tokenize
+
+def read_text_file(file_path):
+    with open(file_path, 'r', encoding='utf-8') as file:
+        content = file.read().split('\n\n')
+        content1 = [item for item in content if item != ""]
+    return content1
+
+def extract_keywords_textblob_french(sentence):
+    stop_words = set(stopwords.words('french'))
+    mots_questions = ['qui', 'quoi', 'où', 'quand', 'pourquoi', 'comment', 'quel', 'quelle', 'quels', 'quelles', 'est-ce que', 'y a-t-il', 'peut-on', 'sont-ils', 'sont-elles', 'combien', 'lequel', 'laquelle', 'lesquels', 'lesquelles', 'est-ce', 'n\'est-ce pas', 'savoir', 'pouvez-vous', 'êtes-vous', 'avez-vous', 'dois-je', 'quelqu\'un', 'quelque chose']
+    stop_words=stop_words.union(mots_questions)
+    words = word_tokenize(sentence, language='french')
+    keywords = [word for word in words if word.lower() not in stop_words]
+    return ' '.join(keywords)
+
+
+def create_vectorial_base(text_lines, min_chars=50):
+    filtered_lines = [line for line in text_lines if len(line) >= min_chars]
+
+    if not filtered_lines:
+        print("No lines with at least 50 characters found.")
+        return None, None, None
+
+    vectorizer = TfidfVectorizer()
+    vectorial_base = vectorizer.fit_transform(filtered_lines).toarray()
+    feature_names = vectorizer.get_feature_names_out()
+    
+    return vectorizer, vectorial_base, feature_names
+
+def get_best_answers(question, text_lines, vectorizer, vectorial_base):
+    question_vector = vectorizer.transform([question]).toarray()
+
+    # Calculate cosine similarity between the question and each text line
+    similarities = cosine_similarity(question_vector, vectorial_base).flatten()
+
+    # Get the indices of the top 5 most similar text lines
+    top_indices = np.argsort(similarities)[-3:][::-1]
+    # Retrieve the corresponding text lines
+    best_answers = [text_lines[i]+"\n" for i in top_indices]
+
+    return best_answers
+
+class WrappingLabel(QLabel):
+    def __init__(self, text='', parent=None):
+        super(WrappingLabel, self).__init__(text, parent)
+        self.setWordWrap(True)
+
+
+class StyledListWidgetItem(QListWidgetItem):
+    def __init__(self, text='', parent=None):
+        super(StyledListWidgetItem, self).__init__(parent)
+        self.setText(text)
+        
+    def initStyle(self):
+        palette = QPalette()
+        palette.setColor(QPalette.Highlight, QColor("#4b5261"))  # Couleur de fond pour l'élément sélectionné dans la liste d'historique
+        palette.setColor(QPalette.HighlightedText, QColor("#ff0000"))  # Couleur du texte pour l'élément sélectionné dans la liste d'historique
+        self.setData(Qt.UserRole, palette)
+
+class StyledListWidget(QListWidget):
+    def __init__(self, parent=None):
+        super(StyledListWidget, self).__init__(parent)
+        self.setAlternatingRowColors(False)
+        self.setStyleSheet("""
+            QListWidget {
+                background-color: #282c34;  /* Couleur de fond pour la liste d'historique */
+                color: #abb2bf;  /* Couleur du texte dans la liste d'historique */
+                border-radius: 10px;  /* Coins arrondis */
+            }
+        """)
+
+    def addStyledItem(self, text):
+        item = StyledListWidgetItem(text)
+        item.initStyle()
+        self.addItem(item)
+
+
+class ChatbotInterface(QWidget):
+    def __init__(self):
+        super().__init__()
+        file_path = 'reglementdescolarite-ingegeneraliste2324-1.docx.txt' 
+        self.text_lines = read_text_file(file_path)
+
+        if not self.text_lines:
+            print("The file is empty or doesn't exist.")
+            return
+        self.vectorizer, self.vectorial_base, _ = create_vectorial_base(self.text_lines)
+        self.init_ui()
+        self.command_history = []  # Pour stocker l'historique des commandes
+        self.dico={}
+
+    def init_ui(self):
+        # Créer des widgets
+        self.conversation_text = QTextEdit(self)
+        self.conversation_text.setReadOnly(True)
+
+        self.user_input_entry = QLineEdit(self)
+        self.user_input_entry.setPlaceholderText("Saisissez votre message...")
+        self.user_input_entry.setMinimumHeight(40)
+
+        self.send_button = QPushButton("Envoyer", self)
+        self.send_button.setMinimumSize(self.user_input_entry.width(), 30)  # Ajustez selon vos besoins
+        self.send_button.setMaximumSize(200, 60)
+        self.send_button.clicked.connect(self.send_message)
+
+        # Historique à droite
+        self.history_list_widget = StyledListWidget(self)
+        self.history_list_widget.itemClicked.connect(self.history_item_clicked)
+        self.history_list_widget.setFixedWidth(200)  # Ajuster la largeur selon vos besoins
+
+        # Configurer la mise en page
+        layout = QVBoxLayout(self)
+        h_layout = QHBoxLayout()
+
+        # Widgets à gauche
+        left_layout = QVBoxLayout()
+        left_layout.addWidget(self.conversation_text)
+        left_layout.addWidget(self.user_input_entry)
+        # Ajouter le bouton "Envoyer" avec une taille réduite
+        self.send_button.setMaximumWidth(self.send_button.width() // 3)
+        left_layout.addWidget(self.send_button, alignment=Qt.AlignRight)
+        h_layout.addLayout(left_layout)
+
+        # Historique à droite
+        h_layout.addWidget(self.history_list_widget)
+        layout.addLayout(h_layout)
+
+        # Configurer la politique de taille pour permettre à la zone de conversation de s'étendre verticalement
+        size_policy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding)
+        self.conversation_text.setSizePolicy(size_policy)
+
+        # Définir la fenêtre principale
+        self.setWindowTitle('Chatbot Interface')
+        self.setGeometry(100, 100, 800, 600)
+
+        # Appliquer les styles
+        self.setStyleSheet("""
+            QWidget {
+                background-color: #282c34;  /* Couleur principale de fond pour l'application */
+                color: #abb2bf;  /* Couleur du texte principal */
+            }
+            
+            QTextEdit, QLineEdit {
+                background-color: #2c313a;  /* Couleur de fond pour la zone de texte et d'entrée utilisateur */
+                color: #abb2bf;  /* Couleur du texte dans la zone de texte et d'entrée utilisateur */
+                border-radius: 10px;  /* Coins arrondis */
+            }
+
+            QPushButton {
+                background-color: #61afef;  /* Couleur de fond pour le bouton Envoyer */
+                color: #282c34;  /* Couleur du texte sur le bouton Envoyer */
+                border-radius: 10px;  /* Coins arrondis */
+            }
+
+            
+        """)
+        self.user_input_entry.returnPressed.connect(self.send_message)
+        self.history_list_widget.itemClicked.connect(self.history_item_clicked)
+
+    def send_message(self):
+        
+        user_command = self.user_input_entry.text()
+        if len(user_command)>0:
+            self.conversation_text.clear()
+            self.conversation_text.append(f"Commande utilisateur: {user_command}")
+
+            best_answers = get_best_answers(user_command, self.text_lines, self.vectorizer, self.vectorial_base)
+            chatbot_response=""
+            for i, answer in enumerate(best_answers, start=1):
+                chatbot_response+=(f"{i}. {answer.strip()}\n\n")
+            self.conversation_text.append(chatbot_response)
+
+            # Ajouter la commande à l'historique
+            user_command1=extract_keywords_textblob_french(user_command)
+            self.command_history.append(user_command1)
+            self.dico[user_command1]= chatbot_response
+
+            # Mettre à jour la liste d'historique
+            self.update_history_list()
+
+            self.user_input_entry.clear()
+        else:
+            pass
+    
+    def set_logo(self, image_path):
+        pixmap = QPixmap(image_path)
+        self.logo_label.setPixmap(pixmap)
+        self.logo_label.setScaledContents(True)
+
+    def update_history_list(self):
+        self.history_list_widget.clear()
+        for command in self.command_history:
+             self.history_list_widget.addStyledItem(command)
+
+
+    def history_item_clicked(self, item):
+        self.conversation_text.clear()
+        # Réafficher le contenu dans la conversation_text lorsque l'élément de l'historique est cliqué
+        selected_index = self.history_list_widget.row(item)
+        if selected_index < len(self.command_history):
+            selected_command = self.command_history[selected_index]
+            self.conversation_text.append(f"Commande utilisateur: {selected_command}")
+            # Traiter la commande et obtenir la réponse du chatbot (vous devrez ajuster cela en fonction de votre application)
+            chatbot_response = f"Réponse du chatbot pour la commande: {self.dico[selected_command]}"
+            self.conversation_text.append(chatbot_response)
+
+if __name__ == '__main__':
+    app = QApplication(sys.argv)
+    chatbot_app = ChatbotInterface()
+    
+    # Centrer la fenêtre
+    screen = app.primaryScreen()
+    center_point = screen.availableGeometry().center()
+    chatbot_app.move(center_point - chatbot_app.rect().center())
+    
+    # Ajuster la taille de la fenêtre
+    new_width = screen.availableGeometry().width() // 2
+    chatbot_app.resize(new_width, screen.availableGeometry().height()*7/8)
+    
+    chatbot_app.show()
+    sys.exit(app.exec_())
\ No newline at end of file