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

auto apprentissage

1 Octobre 2016 , Rédigé par crriam Publié dans #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 :)

Partager cet article

Repost 0

Commenter cet article