Overblog Suivre ce blog
Editer l'article Administration Créer mon blog
Le blog du CRRIAM

Enregistrement des variables et auto apprentissage.

16 Mai 2013 , Rédigé par crriam Publié dans #Enregistrement des variables et auto apprentissage

Bon, j'ai eu une nouvelle idée. Oui, encore :)
il s'agit de l'auto apprentissage, j'en avais déja parler ici je crois, mais je trouve plus le post. Il s'agit de l'enregistrement des variables.
en rivescript, j'ai reussit un truc deja pas mal, je develloppe :

Se souvenir des variables utilisateur. Voila un sujet qui me tracasse depuis bien des années., mais avec rivscript, c'est possible.



Pour quoi faire ?



Pour que le robot ne perde pas les données vous concernant lors de son arret ou d'une déconnection.

Quel type de donnée peux-t-il retenir ?

Toutes celles qus vous voudrez lui fournir !



Comment ça se passe ?


Il faudra pour ça disposer d'un hebergement supportant le php.

En effet, le fonctionnement est basé sur le même principe que pour l'enregistrement du chat log : Un fichier spécifique ( editeurvariable.php) est appeler par une fonctions javascript et écrit dans un autre fichier les données que l'on veut retenir sous la forme de variable globa rivscript du genre ! global age = 40



Vous vous retrouverez donc avec un fichier texte qui contiendra :



! global age = 40

! global nom = sawyer

! global prenom = tom



Où est-il stocké ?



Dans le repertoire brain ! sous la forme variables.rs comme cela, a chaque chargement du robot, il sera lu et les variables mises en mémoire. ( si ce n'est déja fait (avec ma version) , pensez a inscire son nom dans la liste des fichiers cerveau a charger du fichier chat.html )



Le code rivscript





Vous pouvez le mettre dans le fichier de votre chois. Pour ma part, je l'ai mis dans reactionbot.rs



Procedure :

en premier, il faut créer la fonction qui va permettre d'envoyer les variables au fichier php. Voici le code :



l'Objets JS peux obtenir deux variables: rs et args. rs est l'instance qui a appelé l'objet RiveScript.

Vous pouvez donc appeler etc rs.getUservar () pour obtenir des variables sur l'utilisateur. L'astuce est de trouver l'utilisateur a qui nous parlons.



// debut enregistrement des variables utilisateurs (on utilise le meme code ajax que celui de la creation du chat log du inclus dans le fichier chat.html )



> object recvariable javascript
var id = args[0];
var vari = rs.getUservar(id, "vari");
// alert(vari); pour le debug uniquement

var data = "toi="+ vari ; // ne pas changer toi par autre chose ou alors changer aussi dans le fichier php

if (window.XMLHttpRequest) // declaration de l' Objet standard
{
xhr = new XMLHttpRequest(); // pour Firefox, Safari, ...
}
else if (window.ActiveXObject) // pour Internet Explorer
{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}

// on donne l'ordre au serveur d'executer le fichier php avec les variables stoker en mode POST

xhr.open("POST", "editeurvariable.php", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(data);

// pour eviter le message d erreur de type undefined on mets ca en plus:
var dim = "";
return dim;

< object


// fin fonction enregistrement des variables





Pour code pour enregistrer une variable en appelant la fonction recenregistrement :



// on appel la fonction avec la balise <call>

// par exemple on veut obtenir la variable age = 40

// la balise <id> bien qu'identique pour tous et indispensable pour envoyer notre variable rs au code javascript



+ rec age *
- je fais <set vari= ! global age = <star>> <call>recvariable <id></call>



// si l'on tape rec age 40

// la variable globale

// ! global age = 40 sera inscrite dans le fichier variables





+ rec nom *
- je fais <set vari= ! global nom = <star>> <call>recvariable <id></call>



+ quel est mon age
- tu as <env age>



+ quel est mon nom
- tu t appeles <env nom>



On remarque que les variables son de type environement <env> Il faudra donc un rechargement du robot pour qu'elles prennent effet ! soit en actualisant la page web soit lors d'une nouvelles connection.


Comment faire alors pour que les variables prennent effets immediatement ?

On les enregistres aussi sous la form <env age=40> directement par exemple



+ rec nom *
- je fais <set vari= ! global nom = <star>> <call>recvariable <id></call> <env nom=<star>>



Il faudra juste se souvenir lorsque l'on voudra les appeler d'utiliser <env > au lieu de <get> .

Pourquoi ne pas utiliser <set nom=<star>> alors ?

pour ne pas avoir justement a utiliser <get> avant les rechargement et <env> apres. Ca simplifit largement le code !



Et si le robot parles à plusieurs utliisateurs different ?



En effte, tel qu'il est, le code à le merite de fonctionner, mais cela pour un seul utilisateur ! La prochaine personne qui se connectera sera reconnus comme l'utilisateur précédent. dans ce cas, comment faire ?



Attribuer un identifiant unique pour chaque nouveau connecté, cette identifiant stocker dans un cookie puis utiliser devant les variables pour identifier a qui il parle.

(Là, je le mets directement en variable)



! global id2 = 1234 // id2 pour ne pas interagir avec <id> qui est par defaut soandso

+ rec test *
- i do <set vari= ! global age<env id2> = <star>> <call>recvariable <id></call>



Le probleme Bien sur, il faudra ensuite utiliser cet id2 pour reutiliser les variables:avec <env test<env id2>>



Ors pour le moment ca ne fonctionne pas et pour cause, il est impossible d'avoir une variable variable (non je ne me suis pas trompé en l'écrivant deux fois :) de ce genre en rive script. Pourquoi ?

voila la réponse de Kirsle (le créateur de rivscript)

That's not possible for a couple of reasons.

First, tags aren't parsed with the ! command. Tags only get parsed in triggers and most reply-like things (replies, redirections, conditions, etc.)

Second, embedding the same type of tag inside itself doesn't work because of the regular expressions used to parse the tags out. For the <env> tag, the regexp looks like: /<env (.+?)>/.

So when you have <env age<env id2>>, the regexp ends up matching, <env age<env id2>>, where the "variable" it's looking at is named "age<env id2".
Back to top




De toute façon, on doit pouvoir trouver une solution :)
pourquoi ?

Parce que l'enjeu et de taille, en se souvenant de variable variables, on peut faire apprendre des chose au robot et qu'il s'en souvienne.

Genre :
humain : Je te presente mikey, il a 15 ans c est un ami
robot : enchanté mikey

Si l'identifiant du connecté et id = 1234 par exemple

code + je te presente * il a * c est *
- rec name<id> = <star> rec age<id>age = <star2> rec statut<mikey>

ce qui enregistrera namemikey = mikey, agemikey = 15, statutmikey = un ami

Je vous laisse imaginer les possiblités offerte par ce genre d'infos stoker en dur dans un fichier !

bon bien sur le code ne fonctionne pas directement, mais voila l'idée. Pouvoir retenir les informations qu'on lui donne.

 

Je pense qu'en utilisant les cookis, une solution peut etre viable. un code javascript insert un cookie avec le nom de l'utilisateur et si un fichier contenant toutes les variables a ce nom là n'existe pas il est créer.

Voila l'idée a creuser :)

 

Partager cet article

Repost 0

Commenter cet article