auto apprentissage
L'auto apprentissage, c'est quoi ?
C'est le fait que le robot puisse apprendre et retenir des choses par rapport a l'interaction avec l'utilisateur.
Pour faire ça, j'utilise 2 fichiers supplémentaire en PHP qui seront installés avec les autres dans le dossier rivescripte/eg/
Il s'agit d'editeurcoderapide.php dont voici le code :
<?
$myarray = &$_POST ;
$var1=$myarray["toi"];
$fp = fopen("brain/coderapide.rs","a"); // ouverture du fichier en écriture
fputs($fp, "\n"); // on va a la ligne
fputs($fp, "+ $var1 \n"); // on écrit la variable dans le fichier et on met un + devant puis on va a la ligne
fclose($fp);
?>
Et de editeurcoderapidemoins dont voici le code :
<?
$myarray = &$_POST ;
$var1=$myarray["toi"];
$fp = fopen("brain/coderapide.rs","a"); // ouverture du fichier en écriture
fputs($fp, "\n"); // on va a la ligne
fputs($fp, "$var1 \n"); // on écrit la variable dans le fichier et on met un + devant puis on va a la ligne
fclose($fp);
?>
Pourquoi 2 fichiers ?
Parce que le but est d'enregistrer dans un ficher des lignes de code de façon automatique sous la forme rivescript, c'est à dire
+ Bonjour
- hello toi
Or, le signe + est impossible a faire écrire directement dans une instruction javascript ou rivescripte on est donc obligé de passer par le php pour écrire la ligne plus et donc avec un autre fichier la ligne moins.
Mais c'est trés simple et totalement transparent.
On note dans ces ficheir le fait que toutes les lignes d'auto apprentissage seront inscrit dans le fichier et dossier rivescripte "brain/coderapide.rs"
Maintenant le code rivescripte qu'il suffit d'écrire dans un fichier comme reactionbot.rs par exemple :
// debut enregistrement de code rapide ligne plus ( c'est le code qui va écrire la ligne plus :) on utilise le meme code ajax que celui de la creation du chat log du inclus dans le fichier chat.html ou celui utiliser pour enregistrer les variables )
> object coderapide javascript
var id = args[0];
var vari = rs.getUservar(id, "variautoap");
// 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", "editeurcoderapide.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 code rapide ligne plus -----------------------
+ [*] [*] [*] [*] autorecplus *
- \s <set variautoap=<star>> <call>coderapide <id></call>
// les [*] en quadruple devant serve a faire passer l instruction autorecmoins en prioriter devant d autre truc qui matcherai avant. (voir plus loin subtilité a la con.)
// le \s sert a ne pas avoir de message d erreur
// si l'on tape autorecplus coucou
// + coucou sera inscrite dans le fichier variables
// debut enregistrement de code rapide moins (on utilise le meme code ajax que celui de la creation du chat log du inclus dans le fichier chat.html )
> object coderapidemoins javascript
var id = args[0];
var vari = rs.getUservar(id, "variautoap");
// 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", "editeurcoderapidemoins.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 code rapide moins -----------------------
+ [*] [*] [*] [*] autorecmoins *
- \s <set variautoap=- <star>> <call>coderapidemoins <id></call>
// les [*] en quadruple devant serve a faire passer l instruction autorecmoins en prioriter devant d autre truc qui matcherai avant. (voir plus loin subtilité a la con.)
// si l'on tape autorecmoins coucou
// le \s sert a ne pas avoir de message d erreur
// - coucou sera inscrite dans le fichier variables
+ test 1
- je vais ecrire + test 1 dans le fichier {@autorecplus test 1} et - reponse 2 {@autorecmoins reponse 2}
Quand et comment l'utiliser ?
Pour faire retenir des choses. Exemple, si l'utilisateur marque :
tu aimes la magie ? et que le robot n'a pas cette donnée, il va répondre je ne c'est pas qu'est ce que la magie ? L'utilisateur va répondre quelques choses qu'on a pas besoin de savoir
+ [*] tu aimes *
- je ne sais pas qu est ce que c est <star> ? <set autoapplus=<star>>
// je mets la chose inconnue dans la variable autoapplus
+ *
% [*] je ne sais pas qu est ce que c est*
- ok <set autoapmoins=<star>> {@result} mais {@tu aimes <star>}
// je mets la reponse de l utilisateur dans la variable autoapmoins
//je copie le resultat dans le fichier code rapide
+ result
- {@autorecplus [*] <get autoapplus> [*]} {@autorecmoins <get autoapmoins>}
ça donne :
user : tu aimes la magie ?
robot : je ne sais pas qu est ce que c est la magie
user : jetter des sorts
robot : ok mais je ne sais pas qu est ce que c est jetter des sorts
user : faire apparaitre des choses
robot : ok mais je ne sais pas qu est ce que c est faire apparaitre des choses
etc...
et ça va écrire dans le fichier coderapide.rs
+ [*] la magie [*]
- jetter des sorts
+ [*] jetter des sorts [*]
- faire apparaitre des choses
Bien sur, tout ça prendra effet uniquement lorsqu'on rechargera le programme donc au prochain démarrage !!!!
comme on a mis + [*] la magie [*] maintenant si on demande
user: c'est quoi la magie ?
bot : jetter des sorts
On peut bien sur faire ca pour editer d'autre choix
en modifiant la commande <set autoapplus= tu aimes <star>> par exemple et qui éditera la ligne
+ tu aimes la magie
et
+ *
% [*] je ne sais pas qu est ce que c est*
- ha ok, alors oui j aime bien <set autoapmoins= oui <star> j aime bien> {@result}
- non, moi <star> c est pas mon truc <set autoapmoins= non <star> c est pas mon truc> {@result}
qui marquera de façon dans le fichier alleatoire soit :
- oui j aime bien jetter des sorts
soit
- non jetter des sorts c est pas mon truc
A vous de trouvez toutes les autres utilisation possible :) rien qu'avec ça, votre robot va se forger au fils des discution une identité unique. veillez a verifier et a prendre en compte ce que les utilisateur vont apprendre a votre robot a votre insu.
Subtilité a la con
je viens de m'appercevoir que rivescript est un peu con défois et ça pose des problemes avec l'exemple ci dessus.
Pourquoi ?
L'ordre de la detection se fait au nombre de lettre exemple :
+ auto *
- c est le 1er qui match
+ * autom
- c est le 2eme qui match
si on tape auto aze autom / ou meme / auto autom
c'est le 2eme qui match car autom compte une lettre de plus qu'auto
si y a une egalite en nombre de lettre, c est celui du haut qui est matcher en 1er exemple
+ auto *
- c est le 1er qui match
+ * auto
- c est le 2eme qui match
Si y a
+ auto *
- c est le 1er qui match
+ * aut
- c est le 2eme qui match
C'est le 1er qui matche car auto a plus de lettre que aut
avec notre exemple d'auto apprentissage, si on mets autorecplus tu aimes <star>
ca matchera apres l'instruction [*] tu aimes * et ça ne l’écrira pas dans le fichier :/ il faut donc trouver une autre solution.
suite ordre de detection
un [*] semble prioritaire sur un *
+ auto [*]
- c est le 1er qui match
+ * autom
- c est le 2eme qui match
C'est le 1er qui match
Pour deux [*] c'est celui du haut qui match
+ auto [*]
- c est le 1er qui match
+ [*] autom
- c est le 2eme qui match
C'est le 1er qui match
mais si on mets 2 [*]
+ auto [*]
- c est le 1er qui match
+ [*] autom [*]
- c est le 2eme qui match
c est le 2eme qui match
en egalité de [*] c'est le 1er qui match indifferament de la place
+ auto [*] [*]
matchera en 1er autant que [*] auto [*]
par contre
c'est celui qui a le plus de [*] qui match en premier
+ auto [*]
- c est le 1er qui match
+ [*] autom [*] [*]
- c est le 2eme qui match
c est le 2eme qui match
Voila qui devrais résoudre les problemes :)