Outils pour utilisateurs

Outils du site


ateliers:robotique:chatbot

Réalisation d'un Chatbot en Python

Python ? Mais j'ai peur des serpents moi !

Pas de panique ! Python n'est pas un reptile, mais un langage de programmation et d’ailleurs quel langage !!!

Python est inventé par Guido van Rossum (Pays-Bas) dont la première version est sortie en 1991. Et oui 30ans déjà !

C'est un langage interprété c'est à dire qu'il ne doit pas être compilé pour pouvoir être exécuté par un ordinateur. Ce dernier lit et exécute une ligne à la fois en commencent par le haute du code.

Python 2.0 est distribué le 16 Octobre 2000 et possède plusieurs nouvelles fonctions, comprenant un éboueur de détection des déchet en cycle (cycle-detecting garbage) et le soutien de Unicode. Avec cette publication, le proccessus de développement est changé et devenu plus transparent et soutenu par l'organisation.

Python 3.0 est apparu en 2008, après une long durée d'essai.

Jusqu'en 2017, Python a mis à jour la version 3.7

Pour l'anecdote, une légende urbaine, plus que fondée, veut que le nom Python vienne des Monty Python dont van Rossum était un grand fan ! Et c'est vrai ! d'autant plus que les allusions aux Monty Python sont assez fréquentes. Les didacticiels consacrés à Python utilisent souvent les mots spam et eggs comme variable métasyntaxique. Il s'agit d'une référence au sketch “Spam” des Monty Python, où deux clients tentent de commander un repas à l'aide d'une carte qui contient du jambon en conserve de marque SPAM dans pratiquement tous les plats. Ce sketch a été aussi pris pour référence pour désigner un courriel non sollicité.

Et un Chatbot, c'est quoi au juste ?

Un ChatBot est un programme qui tente de converser avec une personne, autrement dit, un agent conversationnel tout en donnant l'impression d'un vrai humain discutant avec nous.

Une bonne compréhension de la conversation est utile pour tenir un dialogue sensé, mais la plupart des ChatBots ne s'y essayent pas. Ils repèrent surtout quelques mots dits, déclencheurs, voire des expressions de leur interlocuteur. pour retrouver des réponses, un schéma est programmé et peut mener la conversation d'une manière plus ou moins intelligente, mais sans nécessairement comprendre de quoi ils s'agit.

Par exemple dans le cas d'ELIZA, la présence du mot « père » (ou « mère ») dans une phrase du sujet était associée à une réponse : « Pouvez-vous me parler un peu de vos relations avec votre père (mère) ? ». Des indicateurs sont en général positionnés pour que le même type de réponse ne soit pas utilisé plus d'une fois.

Installation des logiciels

Avant tout, il faut savoir que notre chat bot sera codé en 'PYTHON', nous devons donc installer Python sur notre ordinateur afin que notre code puisse être interpréter par l'ordinateur.

Pour installer Python

Rendez-vous sur le site de python afin de pouvoir télécharger les dossiers.

/!\ ATTENTION /!\ faites attention à l'OS avec lequel vous travaillez.
Cependant, si vous travaillez sous Linux ou Mac, bravo ! Vous n'avez rien à installer car Python l'est par défaut.

Pour vérifier que python est bien installé, entrez la commande suivante dans votre terminal :

python --version

installer les IDE

Dans le domaine du développement informatique, un IDE (ou Integrated Development Environment) est un logiciel qui regroupe un ensemble d’outils spécifiques. Ceux-ci sont dédiés aux programmeurs afin qu’ils puissent optimiser leur temps de travail et améliorer leur productivité. Autrement dit, l’IDE facilite la mise en œuvre de projets tels que le développement de logiciels ou d’applications.

> Pycham

Pour installer PyCharm, rendez-vous sur le site de PyCharm

OU

> Anaconda

Pour installer Anaconda, rendez-vous sur le site d'Anaconda

Installation des bibliothèques

Pour programmer ce ChatBot, nous devrons utiliser des bibliothèques.

Pour ce faire, et par souci de simplicité, nous utiliserons l'appel “pip” dans la consol de votre IDE, tapez simplement :

“pip install difflib” → ce qui installera la librairie “difflib”.
“pip install tkinter” → ce qui installera la librairie “TKinter”.
“pip install nltk” → ce qui installera la librairie “nltk” (Natural Language Toolkit).

Dans les grandes ligne, “pip install [librairie]” télécharge automatiquement les fichiers sur le dépôt de la librairie demandée.
Pour les Linuxiens ;) c'est exactement le même principe que le fameux “sudo apt-get install [le promgramme]”

le fonctionnement d'un Chatbot

Dans cette exemple, nous imaginons un ChatBot d'un service de livraison.

# On importe la librairie "nltk", mais on précise qu'il ne faut qu'importer les fonctions "Chat" et "reflection"
from nltk.chat.util import Chat,reflections
# On affiche un message d'accueil
print("Bonjour, quelle est votre question ?")
 
# Dans le tableau "pairs"; les [ ] nous indiques qu'il s'agit d'un tableau, nous créons les questions et les réponses.
pairs=[
 
       # Le (.*) de cette bibliothèque, permet de mettre n'importe quel mot
       ["mon nom est (.*)"
         # Le %1 reprend le mot aléatoire et l'affiche dans le phrase. 
        ,["Salut %1, quel est ta question ?"]],
 
       # Le caractère '|' permet de donner plusieurs choix possible de réponse. Attention à bien mettre entre parenthèse ! 
       ["(salut|bonjour|coucou)",
        ["Salut !","En quoi puis-je t'aider ?","As un une question ?"]],
 
       ["je voudrais (.*) taille (.*)",
        ["Ok, nous préparons la commande contenant %1 taille %2"]],
 
       #écoute les mots clés ville ou adresse et répond
       ["(.*)(ville|adresse)",
        ["Nous livrons sur Tournai"]],
 
       ["(.*)(livrez|Tournai|tournai)",
        ["Bien sur !"]],
 
       #détecte uniquement le mot 'aider'
       ["(.*)aider(.*)",
        ["Bien sur, je peux vous aider ! Quelle est votre question ?"]],
 
       #détecte les mots 'prix|coute|coûte|livraison'
       ["(.*)(prix|coute|coûte)",
        ["La livraison en intra-muros est de 4,10€"]],
 
       #VILLES (ici on prévois les fautes d'orthographe.
       ["(.*)(Mons|Bruxelles|Ath|Lille)",
        ["Mince ! Désolé çà n'est pas dans notre zone de livraison"]],
       ["(.*)(mons|bruxelles|ath|lille)",
        ["Mince ! Désolé çà n'est pas dans notre zone de livraison"]],
 
       ["(.*)(Mons|Bruxelles|Ath|Lille)(.*)",
        ["Mince ! Désolé çà n'est pas dans notre zone de livraison"]],
       ["(.*)(mons|bruxelles|ath|lille)(.*)",
        ["Mince ! Désolé çà n'est pas dans notre zone de livraison"]]
 
       ]
 
chat = Chat(pairs,reflections)
chat.converse()

Vous remarquerez l'indentation du code par une tabulation.
La touche |→ de votre clavier.

En Python, elle est très importante car elle indique au programme que l'on entre dans un fonction, une boucle ou une condition.
En gros, on crée une boite et on dit au programme qu'il y à un code dedans et qu'il doit y entrer pour l'exécuter.
Une erreur d'indentation sera donc une erreur de programme et devra être corrigée.

Mais rassurez-vous, très peu de langage comporte cette particularité.

Pourquoi, alors, ne pas utiliser 'NLTK' plutôt que 'difflib' ? Tout simplement par ce que NLTK n'est pas très optimal pour fonctionner avec TKinter ! Pour plus de simplicité, nous utiliserons donc la Lib. 'difflib'.

Lexique de terme en programmation

Dans le monde de la programmation, il y a quelques singularités dont il faut des clés pour les décoder et donc, les comprendre.

La concaténation

Si je vous dit que vous concaténez, vous me répondez en fronçant les sourcils, qu'il serait mieux de ne pas vous insulter. :D
Mais non ! Concaténer (du latin cum (« avec ») et catena (« chaîne, liaison ») ), c'est attacher une une chaine de caractères avec une autre, fusionner ou agréger si vous préférez. Mais cela peut aussi se faire avec des fonctions .

si j'écris :

string premier_mot = "Bonjour";
string deuxieme_mot = "John Do";
 
print( premier_mot + deuxieme_mot );

Cela affichera :

Bonjour John Do

Vous comprenez le principe? Facile non !

Maintenant, si on veux concaténer une fonction avec l'un de ses attribut, on utilise le “.”

Aussi, dans l'expression

nomModule.nomFonction

'nomModule' est un objet module et 'nomFonction' est un attribut de cet objet.

Les puristes grimperons aux rideaux à la lecture de ces modestes lignes, car dans ce cas, il ne s'agit pas d'une concaténation au sens stricte du terme, mais d'une encapsulation ! On encapsule 'Objet(1)' à 'fonction(2)'. La différence est subtile, mais présente !
Nous rentrons ici dans des notions plus complexes de POO (Programmation Orienté Objet), c'est pour cela que nous nous permettons un petit amalgame, histoire d'y voir plus claire.

Les opérateurs logiques

En programmation, les opérateurs logiques permettent d'ajouter des conditions aux … conditions :) ou de comparer deux opérations en les comparants

Je m'explique.

- SI une pomme est mur ET qu'elle n'est pas empoisonnée ALORS tu peux la mangée

- SI une pomme n'est pas mur OU qu'elle est empoisonnée ALORS tu ne peux pas la mangée

Dans le premier cas, les deux conditions doivent être remplies pour que l'instruction puisse être exécutée.

Dans le deuxième cas, seul l'une des deux conditions doit être remplie pour que l'instruction puisse être exécutée.

x == y (x est égal à y)
x != y (x est différent de y)
x < y (x est inférieur à y)
x > y (x est supérieur à y)
x <= y (x est inférieur ou égal à y)
x >= y (x est supérieur ou égal à y)
 
x || y (x OU y)
x && y (x ET y)

Et pour être tout a fait précis, il faut ajouter que le “OU” || s'appelle une disjonction
alors que le “ET” && s'appelle une conjonction

expression booléenne

Les variables booléennes sont sans doute les notions les plus simple à comprendre en programmation.

Un boolean est comme une intérupteur, soit il est allumé, soit il est éteint.
Par conséquent soit il est TRUE (vrai) ou il est FALSE (faux).

la syntaxe est donc proche de celle-ci (mais varie en fonction des langages) :

boolean etat_led = True;     # l'état de la led est True, donc vrai donc allumée
boolean etat_led = False;    # l'état de la led est False, donc faut, donc éteinte
 
boolean etat_led = 1;        # l'état de la led est 1, donc True, donc allumée
boolean etat_led = 0;        # l'état de la led est 0, donc False, donc éteinte

Le Modulo

Nous ne l'utilisons pas pour ce programme, mais il est important de ne connaître, en plus le Modulo, c'est rigolo (Oui elle n'est pas terrible celle-ci ;) )
En fait c'est même une vanne qui vaut 10 % 5 :D

Explication :
Pour qu'une vanne soit vraiment naze, elle doit au moins valoir 0 et ca tombe bien car c'est le résultat de 10 modulo (%) 5 !
Vous devinez ?
Et si je vous dis que 10 % 3 = 1 ?

Allez, je vous aide, elle est vache cette colle ;)

10 : 5 = 0
et
10 : 3 = 1

Oui oui, je vous assure ! En fait un modulo, c'est le reste d'une division de nombres entiers !
Ainsi, si nous avons 10 % 5 il reste 0 à la division, alors que 10 % 3, il reste un à la division.

10 : 5 = 2 et 2 : 2 = 0
Alors que
10 : 3 = 9 il reste donc 1

Aller, une colle pour bien intégrer cette notion.
Quel est le modulo de 1234 % 56 ?

print(1234 % 56)

équivalence VS égalité

Selon vous, quelle est la différence entre

x = 10
 
et 
 
x == 10

Dans le premier cas, X équivaut à 10
Alors que dans le second cas, X est égale à 10

Je vous l'accorde, la différence est subtile, mais tellement importante à comprendre en programmation.
X = 10 signifie que nous donnons à la variable x une valeur de 10. Ça ne veut pas dire que X est égale à 10, mais simplement que la variable X stocke la valeur 10.
A l'inverse si on dit que X == 10 LA X est rigoureusement égale à 10

Pour vous donner un exemple, nous avons d'un côté :

X = "un texte qui n\'est pas égale à X"
 
print( X )

Et de l'autre :

X = 120
 
if X == 120:
    print("X est égale à 120")
else:
    print(" Oh! X n\'est pas égale à 120")

Poussez les codes dans votre IDE et admirez le résultat ;)

Vous remarquerez un caractère étrange dans la phrase “Oh! X n\'est pas égale à 120”
Oui c'est le backslash “\” et en plus c'est simple à comprend.

En programmation une chaine de caractère est encadrée de simple quotes ' ' ou double quotes “ ”.
En Python, il n'y a pas de différence entre les deux. Alors si on écrit “T'as tout compris” qui peut aussi s'écrire 'T'as tout compris' vous imaginez bien que côté ordinateur, c'est la PLS assurée.
“Quoi il ouvre une guillemet avant le T, ok c'est une chaine de caractère, mais il la ferme directement après le T ?
Alors je fais quoi du as tout compris' Boh çà me soule, je vais lui coller une erreur dans les pattes, ça lui fera les dents :D

Et bien le “\” ca serre tout simplement à ca ! Échapper un caractère pour indiquer à l'ordinateur que NON ! la chaine n'est pas finie, mais il s'agit simplement d'une apostrophe.

Glossaire Tkinter

Afin de pouvoir réaliser une interface pour notre Chatbot, nous utiliserons la bibliothèque “Tkinter”
Voici une vue d'ensemble des principales widgets* de Tkinter

*Chaque élément se situant dans une fenêtre, comme les boutons, les champs “input” etc,… s'appellent des “WIDGETS”

# Toutes les sources sur :
#|-- https://python.doctor/page-tkinter-interface-graphique-python-tutoriel
 
# On importe *(tout) de la bibliothèque Tkinter 
from tkinter import *
#On crée la fenetre mère
fenetre = Tk()
# Donne un titre à la fenêtre
fenetre.title("Mon programme avec Tkinter")
# On initialise la taille de la fenêtre
fenetre.geometry("300x600")
 
# On affiche un texte dans la fenêtre
label = Label(fenetre, text="Hello World How are you")
label.pack()
 
# Champs de saisie avec différentes méthode
label(fenetre, text='saisir du texte').grid(row=0)
label(fenetre, text='saisir un autre texte').grid(row=1)
entree_1 = Entry(fenetre)
entree_2 = Entry(fenetre)
entree_1.grid(row=0, column = 1)
entree_2.grid(row=1, column = 1)
mainloop()
 
# Les boutons
bouton = Button(fenetre, text="Fermer", command=fenetre.quit)
bouton.pack()
 
# Les labels
label = Label(fenetre, text="Texte par défaut", bg="green")
label.pack()
 
# Les entrées
value = StringVar() 
value.set("texte par défaut")
entree = Entry(fenetre, textvariable=string, width=30)
entree.pack()
 
# Les boutons checkbox
bouton = Checkbutton(fenetre, text="Nouveau?")
bouton.pack()
 
# Les radiobutton
value = StringVar() 
bouton1 = Radiobutton(fenetre, text="Oui", width="300", variable=value, value=1, command="")
bouton2 = Radiobutton(fenetre, text="Non", variable=value, value=2)
bouton3 = Radiobutton(fenetre, text="Peu être", variable=value, value=3)
bouton1.pack()
bouton2.pack()
bouton3.pack()
 
# Les liste
liste = Listbox(fenetre)
liste.insert(1, "Python")
liste.insert(2, "PHP")
liste.insert(3, "jQuery")
liste.insert(4, "CSS")
liste.insert(5, "Javascript")
liste.pack()
 
# canvas
# Un canvas est un espace dans lequel vous pouvez dessiner ou écrire ce que vous voulez: 
canvas = Canvas(fenetre, width=150, height=120, background='yellow')
ligne1 = canvas.create_line(75, 0, 75, 120)
ligne2 = canvas.create_line(0, 60, 150, 60)
txt = canvas.create_text(75, 60, text="Cible", font="Arial 16 italic", fill="blue")
canvas.pack()
 
# Vous pouvez créer d'autres éléments:
create_arc()        :  arc de cercle
create_bitmap()     :  bitmap
create_image()      :  image
create_line()       :  ligne
create_oval()       :  ovale
create_polygon()    :  polygone
create_rectangle()  :  rectangle 
create_text()       :  texte
create_window()     :  fenetre
 
# Si vous voulez changer les coordonnées d'un élement crée dans le canevas, vous pouvez utiliser la méthode coords .
canvas.coords(élément, x0, y0, x1, y1)
 
# Pour supprimer un élément vous pouvez utiliser la méthode delete
canvas.delete(élément)
 
#Vous pouvez trouver d'autres méthodes utiles en exécutant l'instruction suivante:
print dir(Canvas())
 
# Les frames
fenetre['bg']='white'
 
# frame 1
Frame1 = Frame(fenetre, borderwidth=2, relief=GROOVE)
Frame1.pack(side=LEFT, padx=30, pady=30)
# frame 2
Frame2 = Frame(fenetre, borderwidth=2, relief=GROOVE)
Frame2.pack(side=LEFT, padx=10, pady=10)
# frame 3 dans frame 2
Frame3 = Frame(Frame2, bg="white", borderwidth=2, relief=GROOVE)
Frame3.pack(side=RIGHT, padx=5, pady=5)
 
# Ajout de labels
Label(Frame1, text="Frame 1").pack(padx=10, pady=10)
Label(Frame2, text="Frame 2").pack(padx=10, pady=10)
Label(Frame3, text="Frame 3",bg="white").pack(padx=10, pady=10)
 
# Importer des images
photo = PhotoImage(file="ma_photo.png")
canvas = Canvas(fenetre,width=350, height=200)
canvas.create_image(0, 0, anchor=NW, image=photo)
canvas.pack()
 
 
# Affiche la fenetre en boucle 
fenetre.mainloop()
 
 
# Pour aller plus loin:
#|-- https://docs.python.org/fr/3/library/tk.html
#|---- https://apcpedagogie.com/dessiner-avec-un-canvas-tkinter/
#|------https://www.tresfacile.net/
#|--------https://likegeeks.com/python-gui-examples-tkinter-tutorial/

structure de base d'une interface

# On importe la librairie TKinter et on la renomme "tk" 
import tkinter as tk
# On crée le widget principale, c'est à dire la fenêtre principale
fenetre = tk.Tk(className='Chatbot')
# On lui donne une dimension de 400 pixels de large sur 200 pixels de haut
fenetre.geometry("400x200")
 
# On crée le widget Input 
champ_fenetre = tk.StringVar()
input_zone_texte = tk.Entry(fenetre, textvariable = champ_fenetre)
input_zone_texte.pack()
# On crée la méthode ".get()" pour récupérer le contenu du widget "Input"
def grosse_boite():
    # On affiche le contenu dans la consol de l'IDE
    print (input_zone_texte.get())
 
# On crée le widget "bouton" (button en Anglais) pour envoyer le contenu inscrit 
bouton = tk.Button(fenetre,text = "submit",command = grosse_boite)
bouton.pack()
 
# On oublis surtout pas de fermer la boucle "fenetre"
fenetre.mainloop()

Si vous exécutez ce code dans votre IDE préféré, vous verrez que le message que vous tapez dans le widget “input” s'affiche dans le terminal !
Mais nous, nous souhaitons que le message s'affiche dans la fenêtre et non dans la consol (ou le terminal c'est pareil ;) ).
Pour cela, vous l'aurez deviné, il faut inclure le “moteur” du ChatBot dans l'interface, ou mettre une interface sur le “moteur” çà aussi, c'est pareil ;)

Structure de vos fichiers

-DOSSIER RACINE
|
|--app.py
|
|--knowledge.json

Nous avons donc le dossier principale dans lequel vous retrouverez le fichier python “app.py” et le fichier json “knowledge.json” Le fichier app.py appel le fichier knowledge.json.

Notez qu'une fois le code python compilé en fichier exécutable “app.exe” le fichier “knowledge.json” reste à côté du fichier exe, sans quoi nous ne pourrions plus modifier ce dernier !

Le code du ChatBot + commentaire

# On importe la librairie json
import json
 
# On importe la librairie difflib
from difflib import get_close_matches
 
# depuis la librairie tkinter on importe les fonctions "Tk, Label, Entry, Button, Text, Scrollbar, Frame"
from tkinter import Tk, Label, Entry, Button, Text, Scrollbar, Frame
 
# On crée la class "Chatbot"
class Chatbot:
    # Et la fonction (function) "__init__ Noter que si nous pouvons choisir les noms des fonction, dans le cas de celle ci, il est obligatoirement "__init__" pour celle-ci
    def __init__(self, window):
        # On crée le widget "window" auquel on done le titre de "ChatBot" (dans ce cas, "window" peut être remplacé par un tout autre mot, mais il devra alors toujours resté le même.
        window.title('ChatBot')
        # On donne une taille à notre fenêtre de 400px sur 400px
        window.geometry('400x400')
        # On indique que la taille de la fenêtre ne peut être modifié.
        window.resizable(0,0)
 
        # On importe le fichier knowledge.json et on précise qu'il est encodé en utf-8 
        self.Brain = json.load(open('knowledge.json', encoding='utf-8'))
 
        # On crée le widget qui affichera les messages
        # Ici, on s'occupe de la fenêtre et du texte.
        self.message_session = Text(window,               # On précise que la config s'applique au widget "window" 
                                    bd = 3,               # On lui donne une bordure de 3px
                                    relief = "flat",      # On lui indique qu'il n'y a pas de bordure à la fenêtre
                                    font = ("Times", 10), # On donne une taille à la typo
                                    undo = True, 
                                    wrap = "word"         # On indique qu'il peut couper les mots en fin de phrase 
                                    )
        # On configure la fenêtre 
        self.message_session.config(width = 63,           # On donne une largeur de 63
                                    height = 22,          # On donne une hauteur de 22
                                    bg = "#596",          # On donne une jolie couleur verte au background
                                    fg = "white",         # On met le texte en blanc éclatant
                                    state = 'disabled'    # On désactive l'état de la fenêtre (elle sera réactivée par la suite afin de pouvoir afficher les messages.)
                                    )
        # On crée la scrollbar 
        self.overscroll = Scrollbar(window, 
                                    command=self.message_session.yview)
        self.overscroll.config(width = 15)                # On lui donne une largeur de 15
        self.message_session["yscrollcommand"] = self.overscroll.set
        self.message_position = 1.5                       # On donne une taille d'inter-ligne
 
        # On crée le widget du bouton d'envois
        self.send_button = Button(window,                 # On précise que la config s'applique au widget "window" 
                                  text = 'OK',            # On ajoute un texte sur le bouton 
                                  fg = 'white',           # On lui donne la couleur blanche 
                                  bg = '#C5645B',         # Et un super background rouge vinasse
                                  width = 4,              # On lui donne une largeur de 4
                                  font=('Times', 12),     # On indique la typo "Times" et une taille de 12pt
                                  relief = 'flat',        # On ne donne pas de relief à la bordure
                                  command = self.reply_to_you # On crée la commande pour l'instruction d'envois à la fonction "reply_to_you "
                                  )
        # On crée le widget de la fenêtre input
        self.Message_Entry = Entry(window,                # On précise que la config s'applique au widget "window" 
                                   width = 40,            # On donne une largeur de 40
                                   font=('Times', 12)     # On indique la typo "Times" et une taille de 12pt
                                   )
        # On crée la fonction permettant d'appuyer sur la touche "enter" du clavier
        self.Message_Entry.bind('<Return>', 
                                self.reply_to_you
                                )
        # On place le widget de la fenêtre de message en le décalant de 6px en X et de 20px en Y
        self.message_session.place(x = 6, 
                                   y = 20
                                   )
        # On place la scrollbar
        self.overscroll.place(x = 377, 
                              y = 16,
                              height = 342                # On lui donne une hauteur de 342px
                              )
        # On place le bouton d'envois 
        self.send_button.place(x = 5, 
                               y = 360
                               )
        # On place le widge du champ input
        self.Message_Entry.place(x = 55, 
                                 y = 360,
                                 height = 33              # On lui donne une hauteur de 33px
                                 )
 
    # On crée la fonction "add_chat" qui ajoutera le message entré dans le champ input, à la fenêtre du ChatBot
    def add_chat(self, message):                          # On lui donne deux arguments, "self" et "message"
        self.message_position += 1.5                      # On indique un inter-ligne de 1.5pt
        print(self.message_position)                      # On écrit dans la console la position de la nouvelle ligne (ceci est facultatif)
        self.Message_Entry.delete(0, 'end')               # On supprime le contenu du champ input
        self.message_session.config(state='normal')       # On active l'état de la fenêtre pour afficher le message
        self.message_session.insert(self.message_position, message ) # On insert le message dans le widget 
        self.message_session.see('end')                   # On indique la fin de la session 
        self.message_session.config(state='disabled')     # On désactive l'état de la fenêtre
 
    # On crée la fonction "reply_to_you" qui à pour but de comparer le message entré, aux messages pré-enregistrés dans le fichier "knowledge.json" et des les traiter
    def reply_to_you(self, event = None):
        message = self.Message_Entry.get().lower()        # 
        message = 'Vous : '+ message + ' ' + '\n'
        close_match = get_close_matches(message, self.Brain.keys())
        if close_match:   
            reply = 'Bot : '+ self.Brain[close_match[0]][0] + '\n'
        else:
            reply = 'Bot : ' + 'Désolé, Je n\'ai pas compris' + ' \n'
        self.add_chat(message)
        self.add_chat(reply)
 
root = Tk()
Chatbot(root)
root.mainloop()

Le code .json

Ici vous trouverez la structure de base du fichier “knowledge.json”.

{
"la question 1" :
    ["la réponse 1"],
"la question 2" :
    ["la réponse 2"]
}

/!\ATTENTION/!\ faites bien attention à la ”,“ elle est obligatoire TANT QUE vous programmer des réponses. A la fin de la dernière cellule, il ne FAUT PAS de virgule, sans quoi vous obtiendrez un message d'erreur !

Voici donc une base de code en json

{
"salut ": 
	["Salut, comment vas-tu ?"], 
"bien merci": 
	["Super, tu as des  question ?"], 
"oui ": 
	["Quelle est-elle ?"],
"mon nom est %s":
	[" Bonjour %, comment vas tu ?"]
}

Compilation du code python en fichier exécutable

Pour une installation sans tracas, tout ce que vous avez à faire est d'exécuter la commande suivante dans la console de votre IDE

pip install pyinstaller

Si vous êtes sous Windows, vous devez aussi installer l'outil pywin32:

pip install pywin32

Maintenant que vous avez installé PyInstaller, il vous suffit de répertorier le script python que vous souhaitez convertir en exécutable, d'ouvrir ensuite la commande cmd, de naviguer jusqu'au répertoire de votre script à l'aide de la commande cd (change direction) et de lancer la commande:

pyinstaller --onefile <votre_script>.py

Cela créera un exécutable autonome dans le répertoire dist de votre dossier de script. Ne vous inquiétez pas, si le dossier n'existe pas, il en créera un automatiquement.

Notez que nous avons passé un argument «- onefile». Cet argument indique à PyInstaller de créer un seul fichier. Si vous ne le spécifiez pas, les bibliothèques seront distribuées dans un fichier séparé avec l'exécutable.

Regardez bien le chemin dans lequel se situe les dossiers.
S'il se situe dans une dossier “tmp” donc temporaire, vous devez alors le récupérer AVANT de fermer votre IDE, sans quoi il sera supprimé !
Chez mois le chemin est “C:\Users\made in takos\AppData\Local\Temp\app.py\app.py”. J'ai donc une commande de type :

pyinstaller --onefile app.py

Il ne restera qu'à ajouter le fichier “knowledge.json” au dossier “dist” et à écrire vos propres dialogues. Vous remarquerez aussi que l'exécution du programme ouvrira une fenêtre de terminal, c'est tout a fait normal. Elle se fermera avec la fermeture du programme.

Téléchargements

Télécharger le code source du projet (Windows, Linux, Mac)

Télécharger le fichier exécutable du projet (Windows uniquement)

Pour aller plus loin :

Apprenez à coder en HTML, CSS, JavaScript, Python, PHP… Vraiment excellent !

Python Doctor Pour toutes les références du langage Python.

codecademy Pour apprendre tout en relevant des défis ! La crème de la crème.

ateliers/robotique/chatbot.txt · Dernière modification : 2022/06/22 15:13 de 127.0.0.1