Version du 30 janvier 2016

Cette page détaille les outils utilisés pour créer Genesis. Je cherchais un système à la fois rapide à taper (pas de balises interminables), facile à interpréter par le php et surtout lisible dans un simple éditeur texte (je vous conseille d'ailleurs Notepad++ pour éditer vos cerveaux).


Conditions d'utilisation
Présentation rapide
Installation
Les outils de base
Logs, variables et conditions
Liste des fonctions



Conditions d'utilisation
Ce logiciel php est distribué sous  licence GPL.
Le cerveau (le fichier contenant les questions/réponses de Genesis) est mis à disposition selon les termes de la licence Creative Commons Paternité-Pas d'Utilisation Commerciale-Partage des Conditions Initiales à l'Identique 2.0 France. La licence est consultable ici : http://creativecommons.org/licenses/by-nc-sa/2.0/fr/

Présentation rapide
Genesis est un chatterbot de type action/réaction.
Je veux dire par là qu'il n'apprend pas, ne maitrise pas la grammaire et il ne comprend rien à ce qu'il reçoit ni à ce qu'il raconte. Il se contente de répondre quelque chose de pré-enregistré s'il reçoit un certain stimulus. Ce n'est pas une intelligence artificielle.

Mon système de création de chatterbot se compose de plusieurs parties, traités les unes après les autre.


1) Le fichier chatterbot23.php

C'est ce programme qui va recevoir la phrase de l'utilisateur, puis répondre, en piochant des informations dans les autres fichiers, en les lisant ligne par ligne de haut en bas.
↓↓
2) Le fichier correction.txt

Une fois la phrase reçue, chatterbot23.php va corriger les fautes éventuelles de l'utilisateur avec ce fichier. Le fichier correction.txt est analysé ligne par ligne. Si un mot dans la phrase de l'utilisateur correspond à ce qui est marqué avant le signe égal, il est remplacé par ce qui vient après.
Par exemple, la ligne "c'ets =c'est " transformera la phrase "c'ets certain" en "c'est certain".

Ce fichier est extrèmement pratique. On peut s'en servir pour corriger les fautes, mais aussi pour utiliser des synonymes ou changer les structures gramaticales.
Par exemple "c'est quoi ton=quel est ton", ou encore "on me nomme=je m'appelle".
↓↓
3) Le fichier AR.txt

Ce fichier est ce que j'appelle un cerveau. Il est divisé en deux parties, séparées par un signe égal (=). Avant le signe égal, le morceau de phrase auquel le programme doit réagir. Après le signe égal, la réponse que le programme doit donner.
Par exemple "bonjour=Salut mon ami !" signifie que si le programme reçoit "bonjour", il répondra "salut mon ami" et s'arrêtera.
C'est aussi simple que ça. Pas de guillemets, pas de balises, juste un signe égal à mettre et une ligne à sauter.

Bien sûr, ce n'est pas non plus simpliste, on peut heureusement enregistrer des variables, ajouter des conditions, réutiliser des bouts de phrases etc.

Genesis utilise plusieurs cerveaux : AR.txt, insultee.txt (lorsqu'on l'insulte) et aidemod.txt (pour aider à la modifier). On peut imaginer des chatterbots changeant de cerveau selon la langue, l'âge ou le sexe de l'interlocuteur...
On peut changer de cerveau grâce à la fonction "chgcerva".
↓↓
4) Le fichier correctionbot.txt

Ce fichier remplace les mots de la réponse du programme par ceux qui y sont définis, exactement de la même façon que correction.txt. Il est necessaire pour utiliser certains caractères réservés à l'analyse de la phrase, aux fonctions, aux variables ou aux conditions.

Ce sont des caractères tels que "{" "~" "(*)" "[" ou "|", qu'on utilise de toute façon très rarement dans une conversation. Si vous avez néanmoins besoin que votre programme les utilise, tapez ce qui se trouve à gauche du signe égal, par exemple, "symbspejok" pour "(*)".
Vous pouvez également vous en servir pour remplacer autre chose, par exemple "botmaster" en votre pseudo, "lieuhab" en l'endroit où vous habitez ou encore "nomrobot" en le nom que vous désirez donner au robot. Ainsi, si vous décidez de changer le nom du robot rapidement, vous n'aurez plus qu'à modifier ce fichier.



Installation


Requis :

  • Le script php.
  • La dernière version à lors de la rédaction de ce document est la C23_ver2011_02_12.zip. Une nouvelle version est peut être disponible sur le forum.
    Inclut la présente documentation, un chatterbot exemple d'une dizaine de ligne présentant les fonctions, l'intégralité de Genesis dans sa version du 12 février 2011.

  • Un environnement php (4 ou supérieur).
  • Le fichier chatterbot23.php va traiter les différents éléments du chatterbot, mais il est nécessaire d'avoir un programme pour lire chatterbot23.php.

    Vous devrez utiliser un serveur web supportant le php comme free par exemple -ou n'importe quel hébergeur payant.
    Si vous souhaitez executer ce chatterbot chez vous sans passer par un site web (ce qui est très conseillé pour faire des tests et modifier le cerveau), installer sur votre ordinateur des programmes comme Easy Php ou Wamp Server.
    Il n'y a pas besoin de base de donnée.



    Installation du chatterbot :

    Rien de particulier, dézippez le contenu de C23.zip sur votre serveur, puis lancez chatterbot23.php.

    Voilà un guide étape par étape avec Easyphp pour les grands débutants :
  • Téléchargez Easyphp et installez-le.

  • Naviguez dans le repertoire d'installation (c:\Program Files\EasyPHP\), puis, dans le repertoire "www", créez un repertoire "chatterbot" et copiez le contenu de C23.zip

  • Lancez Easy PHP. Une icone devrait s'afficher à coté de l'horloge. Faites un clic droit dessus, choisissez "web local". Cliquez sur le lien "chatterbot", puis sur "chatterbot23.php".

  • Voilà un guide étape par étape avec Wampee pour les grands débutants :
  • Téléchargez Wampee.

  • Naviguez dans le repertoire d'installation (par exemple C:\Wampee-2.1-beta-2\), puis, dans le repertoire "www", créez un repertoire "chatterbot" et copiez le contenu de C23.zip

  • Lancez Wampee. Une icone devrait s'afficher à coté de l'horloge. Faites un clic dessus, choisissez "localhost". Cliquez sur le lien "chatterbot", puis sur "chatterbot23.php".


  • Les outils de base

    Le signe égal
    = - Permet de séparer l'action à détecter de la réaction à utiliser.

    Exemple :
    j'ai faim=Tu n'as qu'à manger !
    Si la phrase de l'utilisateur contient les caractères avant le signe égal, alors le programme renvoie la réponse située après le signe égal.

    Utilisateur : mais euh j'ai faim moi sérieux !
    Bot : Tu n'as qu'à manger !

    Le jocker
    (*) - Se substitut à n'importe quel morceau de phrase.

    Exemple :
    j'ai (*)faim=Tu n'as qu'à manger !
    Si la phrase de l'utilisateur contient un morceau de ce qu'il y a avant le jocker, puis un morceaux de ce qu'il y a après le jocker, dans cet ordre, alors, la phrase est reconnue.

    Utilisateur : mais euh j'ai (très) faim moi sérieux !
    Bot : Tu n'as qu'à manger !

    Attention, ça marche aussi avec :
    Utilisateur : Au fait, j'ai oublié mon chien. Il a faim je crois lol
    Bot : Tu n'as qu'à manger !

    C'est un excellent outil, mais à utiliser avec beaucoup de précaution. Il consomme également pas mal de ressources. Il est possible d'utiliser plusieurs jockers.

    La barre verticale AVANT le signe égal
    | - Impose un début ou une fin à la phrase.

    Exemple :
    |moi=Arrête de tout ramener à toi !
    Dans l'exemple ci dessus, on a mis ce que j'appelle une "limite de coté". Pour que la phrase soit reconnue, il faut que l'utilisateur commence sa phrase par "moi".

    Utilisateur : moi !
    Bot : Arrête de tout ramener à toi !

    Il ne faut pas que la phrase déborde sur le coté :
    Utilisateur : quel émoi
    (Phrase non reconnue)

    Utile pour détecter des débuts de phrases (par exemple "|ne me parle pas" empèche la détection de "je ne me parle pas") ou des mots courts (|clair|).

    La barre verticale APRES le signe égal
    | - Propose différentes réponses. Une sera utilisée aléatoirement.

    Exemple :
    j'ai (*)faim=Tu n'as qu'à manger !|En tant que robot, je n'ai pas ce problème.|Les humains, toujours à se plaindre !
    Ici, le programme répondra à "j'ai faim" soit "Tu n'as qu'à manger !", soit "En tant que robot, je n'ai pas ce problème." Je recommande au minimum 3 réponses différentes, mais ce n'est pas toujours facile d'en trouver.

    Le tilde
    ~ - Pour chercher dans une liste de mots

    Exemple :
    ~bonjour~=Bonjour !
    Dans cet exemple, on cherche si la phrase donnée correspond à une liste de mots synonymes de bonjour (par exemple bonjour, bonsoir, salut, hello, coucou etc.).
    Cette liste de mot est stockée dans le dossier "gen" et le fichier porte le nom indiqué entre les tildes (ici, par exemple "bonjour.txt"). Il est possible d'utiliser des limites de côté dans les fichiers gen, mais pas de jockers.

    Logs, variables et conditions

    Les logs

    Lorsque j'ai commencé à créer le programme, je me suis dit que j'allais sauvegarder l'historique de conversation de l'utilisateur (ce qu'on appelle un log), et l'analyser pour savoir ce qui avait été dit par le bot ou non. Si la phrase était déjà en mémoire dans le log, le programme ne devait pas l'utiliser.
    Bien sûr, le problème est qu'il y a une infinité de synonyme. Si le bot veut vérifier que "bonsoir" n'a pas été dit, il faut qu'il vérifie aussi "bonjour".

    L'idée était alors de créer un log parallèle, un "log spécial", qui pourrait se présenter comme ça :
    Utilisateur : Salut !
    Bot : [salutations][demande si santé est bonne]
    Utilisateur : Oui, et tu t'appelles comment ?
    Bot : [donne son nom]
    Utilisateur : Ce nom de merde !
    Bot : [Insultes]
    etc.

    Ainsi, le bot irait facilement vérifier qu'il n'a pas déjà utilisé une salutation, par exemple. D'où la création des "logs spéciaux".

    Les logs spéciaux
    Un log spécial est une chaine de caractère entourée de crochets qui synthétise une réponse du programme afin de ne pas réutiliser une réponse similaire. Les logs spéciaux peuvent s'ajouter indifféremment avant ou après le signe égal. Attention, il est possible d'utiliser plusieurs logs spéciaux à la fois après le signe égal, mais un seul avant (à corriger, mais rien d'urgent, perso je me contente de les mettre après si j'en ai plusieurs).

    Exemple avant :
    bonsoir[salutations]=Salut toi !|Bonsoir, visiteur.|Yo man !

    Exemple après :
    bonsoir=Salut toi ![salutations]|Bonsoir, visiteur.[salutations]|Yo man ![salutations rap]

    Les logs temporaires spéciaux
    Un log temporaire spécial est une chaine de caractère entourée de crochets et précédé de "temp:". Ils ne durent que le temps d'une action de l'utilisateur. Ils peuvent s'ajouter indifféremment avant ou après le signe égal. Attention, il est possible d'utiliser plusieurs logs temporaires à la fois après le signe égal, mais un seul avant (à corriger, mais rien d'urgent, perso je me contente de les mettre après si j'en ai plusieurs).

    j'ai faim[salutations]=Tu as mangé il y a longtemps ?[temp:mangé ya longtemps demandé]
    L'utilisateur va répondre, puis ce log temporaire s'effacer. Ils servent typiquement à attendre une réponse ou rajouter une précision sur ce qui a été dit.

    Pour ce qui est des variables, voir la fonction "modvar", plus bas.

    Les conditions

    Les conditions ressemblent aux logs, mais avec des accolades.
    Tester si un log existe
    Il suffit de mettre le log à tester entre accolades au lieu de le mettre entre crochets.

    {salutations}bonjour=Tu m'as déjà dit bonjour !
    C'est la même chose pour les logs temporaires, par exemple "{temp:mangé ya longtemps demandé}". Il est possible de combiner les conditions et des les utiliser n'importe où dans la ligne. Faites bien attention à ne pas confondre conditions et logs ! Un log est entre crochets, une condition entre accolade.

    Tester si un log n'existe pas
    Rajouter "nulle" devant le log à tester.

    {nulle salutations}bonjour=Tu ne m'as pas dit bonjour !
    En pratique, ça sert rarement. Le cerveau est lu de haut en bas. Si le programme ne s'arrête pas sur {salutations}, c'est que le log n'existe pas, pas besoin de mettre un nulle.

    Tester l'heure


    {heure 17-22}~bonjour~[salutations]=Hé, bonne soirée ?[temp:bonne soirée?]|Salut ! Tu passes une bonne soirée ?[temp:bonne soirée?]
    Si il est 17, 18, 19, 20 ou 21 heure, la condition est juste. Notez que l'exemple utilise une condition, un log spécial, une réponse générique, un log temporaire...
    Il n'y a encore rien de prévu pour la date.

    Tests de variables

    Privilégiez les logs spéciaux aux variables. La différence entre les deux, c'est que les variables peuvent contenir des informations données par l'utilisateur (rare) et être changées. Je m'en sert dans Genesis pour stocker le sujet en cours, l'état de santé de l'utilisateur ou des informations fournies comme le nom, le lieu où il vit, les derniers mots utilisés....
    A noter que la variable "nom" est une variable spéciale (c'était autrefois la seule variable existante), utilisez plutôt "nom_user" ou quelque chose comme ça à la place.

    Tester l'existence d'une variable


    {var sujet}=Merci m'avoir parlé <-var sujet->, je suis sûr que ça va m'aider à m'améliorer.
    Si la variable "sujet" existe, la réponse "Merci m'avoir parlé <-var sujet->, je suis sûr que ça va m'aider à m'améliorer" sera utilisée.

    Tester l'INexistence d'une variable


    {nulle var sujet}=On a parlé d'aucun sujet !
    Si la variable "sujet" n'existe pas, la réponse "On a parlé d'aucun sujet !" sera utilisée.

    Tester la valeur d'une variable
    J'utilise ":>" pour tester une variable, ce n'est pas une syntaxe très orthodoxe, elle a été choisie car elle est plus facile à tester dans le code php.

    {var sujet:>des jeux vidéo}=J'adore les jeux vidéo, les mondes virtuels, tout ça !
    Si la variable "sujet" contient "des jeux vidéos", la réponse renvoyée sera "J'adore les jeux vidéo, les mondes virtuels, tout ça !".

    Réutiliser une variable
    Pour réutiliser une variable, avant ou après le signe égal. Voir les fonctions.

    <-var(lieuhabitation)->=Oui, c'est là où tu habites, <-var(lieuhabitation)-> !
    Dans cet exemple, si l'action de l'utilisateur correspond au contenu de lieuhabitation, le programme répond "Oui, c'est là où tu habites" et affiche le contenu de lieuhabitation.

    Liste des fonctions
    Dans l’ordre de lecture
    (Avril 2010, complet)

    noreut
    noreut – Empêche d’utiliser une seconde fois la phrase de réponse.

    <-noreut->

    La phrase de réponse complète et non formatée (avec encore toutes les fonctions) ne sera plus jamais réutilisée.

    continuer
    continuer – Une fois l’analyse faite et la réponse trouvée, permet de poursuivre l’analyse.

    <-continuer->

    Peut être utilisé pour construire des phrases avec différents morceaux.

    ignorer
    ignorer – Permet de sauter la phrase trouvée.

    <-ignorer->

    Permet de baisser la probabilité d’une phrase d’être utilisée. Il est possible de modifier les logs spéciaux.

    (*)
    (*) – Répète le dernier jocker.

    (*)

    Répète le jocker de la phrase analysée en cours.

    (*X)
    (*X) – Répète le jocker numéro X.

    (*nombre)

    Il est possible de traiter jusqu’à 20 jockers.

    modvar
    modvar - Modifie une variable.

    <-modvar(nom de la variable,valeur)->

    Modifie une variable. Si celle-ci n’existe pas, elle sera créée.

    chgcerva

    chgcerva – Change le cerveau du bot

    <chgcerva:nom du fichier du cerveau>
    A modifier en <-chgcerva(nom)->

    heure
    heure - Affiche l'heure.

    <-heure->

    H :i

    Date
    date - Affiche la date.

    <-date->

    d/n/Y

    url
    url - Créé un lien.

    <-url(intitulé de l'url,url->

    clicrep
    clicrep - Créé un lien cliquable envoyant une réponse.

    <-clicrep(partie à rendre cliquable,réponse à envoyer->


    Simule une réponse de l'utilisateur avec une fonction javascript.

    rappel
    rappel - Alerte l'utilisateur avec un fichier sonore au bout de X minutes.

    <-rappel(nombre de minutes,chose à rappeler)->


    Ajoute une variable correspondant à l'heure du rappel dans la variable de session rappel.
    A chaque chargement de la page, vérifie si l'heure correspond, et déclenche alarme.wav le cas échant, tout en  envoyant "rappel" au cerveau autoresfresh. Fonction expérimentale.

    Note : un seul rappel par phrase. Utiliser des continuer si vous avez vraiment besoin de plusieurs rappels.

    ?rappel
    ?rappel – Vérifie s’il existe un rappel

    <-?rappel->

    Utilisé pour les cas où l’utilisateur demande « tu dois me rappeler de quelque chose bientôt ? ». Fonction expérimentale.

    var
    Var - Affiche le contenu d'une variable

    <-var(nom de la variable à afficher)->

    Marche avant et après le signe égal.

    compter
    compter – calcule la formule donnée.

    <-compter(formule à compter)->


    Cette fonction change la phrase de l’utilisateur en « errcalc » si le calcul ne peut pas être résolu.

    inc
    inc – appelle un script externe.

    <-inc(nom du script[,paramètre1,paramètre 2...])->


    Permet d'étendre considérablement les possibilités du chatterbot sans avoir à modifier le script principal. Voir la fonction exemple titrejournal.php.
    Fonction obsolètes :

    Les fonctions étaient autrefois appelées d’une manière différente. Il est toujours possible d’utiliser les vieille méthodes, afin de garder la compatibilité avec les cerveaux les plus anciens.

    modvar (obsolète)
    modvar - modifie une variable

    ->modvar nom de la variable:>valeur<-


    Conservé pour garder la compatiilité avec les cerveaux plus anciens.
    Utiliser désormais <-modvar(nom de la variable, valeur)->

    savvar nom (obsolète)
    nom – retiens le nom

    ->savvar nom<-

    Le dernier jocker est sauvé dans la variable nom.

    Utiliser désormais <-modvar(nom de la variable, valeur)->

    nom (obsolète)
    nom – Affiche le nom

    <-nom->

    Utiliser désormais <-var nom de la variable->

    ignorer (obsolète)

    <IGNORER>

    Utiliser désormais <-ignorer->

    NOREUT (obsolète)

    <NOREUT>

    Utiliser désormais <-noreut->

    var (obsolète)

    <-var nom de la variable>

    Utiliser désormais <-var(nom de la variable)->