Forums Développement Multimédia

Aller au contenu

Petit chatbot et suivi d'une conversation

CODE AS3 chat

11 réponses à ce sujet

#1 vegetalain

    Ceinture Orange

  • Members
  • PipPipPip
  • 34 messages

Posté 09 December 2015 - 20:59 PM

Bonsoir, alors j'ai pu avancer dans mon projet de chatbot "fait maison", grâce à de bons conseils (des conseils d'organisation aussi :roll:) , j'ai rentré pleins de mots clés divers et variés (si on lui demande si il connait victor hugo, il balance sa bio, si on lui demande si il connait Difurgodibounovitch (nom inventé pour mon exemple), il dit "nan, je ne connais pas Difurgodibounovitch, c'est qui?").

Mais maintenant j'aimerai bien pousser un peu les choses, selon ce que je peux faire "à mon niveau" : suivre une conversation. C'est-à-dire essayer de garder une cohérence dans les propos échangés entre l'utilisateur et mon bot... au moins 30 secondes :mrgreen: .

J'avais pensé utiliser "switch / case", car apparement quelque soit ce que l'on tape on passe directement à l'instruction suivante. Donc je me suis dit qu'en glissant des "if" et des "indexOf" dans les "case1", "case 2" et autres, on pourrait "un peu" donner l'illusion d'un échange sensé.

Lorsqu'on parle à mon chatbot on est en "mode1", c'est-à-dire des mots clés "simples" et dès que certains mots clés incitant à la conversation sont détectés, on passe dans la fonction "mode2".

Le script test que je mets ici est inclu dans la fonction "mode2", qui est appelée par un mot clé genre "impatient".

On a donc un bouton "go11", un champ utilisateur (en input) "lutilisateur.text" et le champ où la réponse s'affichera, "att.text".

Alors par exemple l'utilisateur tape "ah purée, je suis impatient d'être à samedi"... et hop, "impatient" ayant été détecté on va sur la fonction "mode2" qui comporte ce qui suit :


//-----------------------------------------------------------------------------
go11.addEventListener(MouseEvent.CLICK, souris11);
var compteur2:int = -1;
function souris11(event:MouseEvent):void{
var aok04:String = lutilisateur.text;

        var zeconv01A:Array = ["Ca fait un long moment?",
                                                   "Ca dure depuis longtemps?",
                                                   "C'est kro kro dur d'attendre?"];
        var replik01A:String = zeconv01A[Math.floor(Math.random()*zeconv01A.length)];  
/*      var zeconv01B:Array = ["go11 suivi1B 1", //portion retirée...
                                                   "go11 suivi1B 2",//portion retirée...
                                                   "go11 suivi1B 3"];//portion retirée...
        var replik01B:String = zeconv01B[Math.floor(Math.random()*zeconv01B.length)];//portion retirée... */

        var zeconv01C:Array = ["Le truc c'est de garder espoir",
                                                   "Ce qu'il faut c'est continuer",
                                                   "Courage, ça va s'arranger"];
        var replik01C:String = zeconv01C[Math.floor(Math.random()*zeconv01C.length)];  
        var zeconv01D:Array = ["Peu importe, vous verrez que ça ira mieux très vite.",
                                                   "... croyez-moi, soyez patient.",
                                                   "Ah mais je suis super sûr de moi là, à donf'."];
        var replik01D:String = zeconv01D[Math.floor(Math.random()*zeconv01D.length)];  

        var aok: String = lutilisateur.text;
                compteur2++;
                switch(compteur2) {  
                case 0 : att.text = replik01A; break;  
                case 1 : if(aok.indexOf("oui") != -1){att.text = "Eh bien il faut que ça cesse.";}
                                 if(aok.indexOf("non") != -1){att.text = "ah alors c'est si grave en fait.";}
                                 if(aok.indexOf("a fai") != -1){att.text = "Effectivement ça fait un moment. Mais tant pis !!";}
                                 break;
                case 2 : att.text = replik01C; break;  
                case 3 : att.text = replik01D; break;  
                default: att.text = "c zefin - retour à la fonction de blabla normale"; break; //zemode.text = "mode 1"; break;  
                }
}
 

Donc voilà ma question... est-il possible d'utiliser "switch" et "case" pour faire un arbre de décision?... ou alors pour simuler une conversation, est-ce qu'il y aurait un truc plus "logique" que ce à quoi j'ai pensé?

Merci de vos conseils, je continue mes tests :roll:...

#2 Monsieur Spi

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 7004 messages

Posté 09 December 2015 - 21:06 PM

Il manque un bout à ton message à première vue

#3 vegetalain

    Ceinture Orange

  • Members
  • PipPipPip
  • 34 messages

Posté 09 December 2015 - 21:26 PM

Oui j'avais voulu mettre un smiley mais mon doigt a rippé sur le clavier :smile: , mais là tout est en place...

#4 draad

  • Members
  • PipPipPipPipPipPipPipPip
  • 654 messages

Posté 10 December 2015 - 01:16 AM

Si j'etais a ta place, au lieu d'écrire manuellement chaque dialogue possible, j'essayerais de créer un system qui génere des phrases proceduralement, dans l'esprit d'un cadavre esquis par exemple.

L'idée ca serait de créer des phrases simples a partir d'un dictionnaire de mots.

J'ecris pas de code, mais j'explique la logique.
Tu pourrais avoir des dictionnaires suivant cette structure de donnée :


Catégorie
         - Verbes
         - Pronoms
         - COD
         - Marque
 

L'idée, c'est de choisir une catégorie et composer une question aleatoire grace a des tableaux prédéfinis. Prenons l'exemple d'une catégorie "Animaux"


Animaux
{
         Verbes : ["Aimes", "Détestes", "Manges"];
         Pronoms : ["-tu"];
         COD : ["les chiens", "les chats", "les singes"];
         Marque : ["?"];
}
 

Quand tu veux composer une question sur le theme animal, tu va venir prendre un élément aléatoire dans chaque tableau et les associer pour faire une question complete. Ca te donnera des phrases dynamique et parfois très droles.


maPhrase = Animaux.Verbes[Math.Floor(Math.Random() * Animaux.Verbes.length) ] +  Animaux.Pronoms[Math.Floor(Math.Random() * Animaux.Pronoms.length) ] +  Animaux.COD[Math.Floor(Math.Random() * Animaux.COD.length) ] +  Animaux.Marque[Math.Floor(Math.Random() * Animaux.Marque.length) ];

Exemple : Manges-tu les singes ?
 


#5 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 10 December 2015 - 09:43 AM

Bonjour,

le sujet est intéressant et… tellement vaste.

La difficulté de faire un arbre de décision (avec swich ou if, il n'y a pas tellement de différence, même si je suis un adepte du swich), c'est de multiplier très rapidement les cas, de devoir tous y répondre, et finalement de se perdre.

L'autre difficulté, c'est que si on relance la discussion de la même façon, on aura exactement le même cheminement logique, donc les mêmes réponses, ce qui trahira le bot (mais peut-être que tu t'en moques).

Perso, et à première vue (mais ça pourrait facilement changer si je prenais le temps d'y réfléchir, certainement) je construirais une base de données "discussion" contenant :
- des infos à obtenir (nom, prénom de la personne, âge, sexe, métier, hobbies…)
- des infos à révéler (à peu près les même…)
Pour chacune de ces infos, je stockerais évidemment si l'info a été donnée ou non, mais aussi un indice de pertinence que je pourrais augmenter en fonction du déroulé de la discussion, avec un peu d'aléatoire. J'ajouterais des indices d'intérêt du locuteur (et de celles du bot, pourquoi pas).

À chaque phase du dialogue, je générerais une macro variable des pertinences intéressantes (en fonction du mode, en fonction des mots clés de la phrase de l'interlocuteur et des indices à ma disposition).

Au moment de prendre une décision, j'analyserais cette macro-variable, en ajoutant une plus forte dose d'aléatoire.
Et la décision prise, je construirais une réponse, comme le propose draad.

L'intérêt, c'est de briser cette logique trop rigide des swich ou des if.

Je rajouterais 2 choses pour construire des phrases plus riches et variées :
1 - penses à ajouter des enrichissements (aléatoires, justement) de temps en temps :
- le prénom de l'interlocuteur s'il l'a donné (Courage, ça va s'arranger, Alain).
- une phrase de complément (Mais bon, ce n'est que mon avis"
- des intros type 'Bah…', 'Mmmm'

2 - N'hésite pas à faire lancer certains modes par ton bot lui-même, quand la macro des pertinences ne te sert à rien ou que le bot ne comprends pas la question.
- une relance de question type 'et toi ?' pour ne pas toujours subir la discussion.
- Une phrase neutre + une phrase cléf : "Bof, m'intéresse pas trop. Et toi, tu aimes bien Victor Hugo ?"

#6 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 10 December 2015 - 10:04 AM

Petite séance de factorisation ;) sur le code de Draad :

var animaux:Object = {
          verbes : ["Aimes-", "Détestes-", "Manges-"],
          pronoms : ["tu"],
          COD : [" les chiens", " les chats", " les singes"],
          marque : [" ?"]
}

var musiques:Object = {
          verbes : ["Aimes-", "Détestes-", "Ecoutes-"],
          pronoms : ["tu"],
          COD : [" du rock", " du rap", " Georges Brassens"],
          marque : [" ?"]
}

trace(phrase_V_P_COD_M(animaux));
trace(phrase_V_P_COD_M(musiques));

/*
  * FONCTIONS DE FACTORISATION
  */

// construction d'une phrase verbe + pronom + cod + ponctuation
function phrase_V_P_COD_M(o:Object):String {
  return alea(o.verbes)
   + alea(o.pronoms)
   + alea(o.COD)
   + alea(o.marque);
}
// Extraction aléatoire d'un élément du tableau
function alea(array:Array):String {
  return array[int(Math.random() * array.length)];
}
 


#7 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 10 December 2015 - 10:21 AM

Et enfin, renseignes-toi sur les arbres de données : ce sont de bons outils qui pourraient te permettre de poser une même question (ou une réponse) de plein de façons différentes.
C'est un peu costaud au début, mais ça vaut sans doute la peine.


var bonjour:Object = creer_arbre (
                   ['Bonjour, ','Salut,', 'Io, '],
                   [creer_arbre(['comment-va ?','ça-va ?', 'tu vas bien ?'],[])]
                   );

trace(bonjour.phrase());


// Construction d'un arbre de données à franchissement aléatoire
function creer_arbre(tronc:Array, branches:Array):Object {
 
  var o:Object = {};
  o.tronc = tronc;
  o.branches = branches;
 
  o.phrase = function ():String{
   if (branches.length != 0) return alea(tronc) + alea(branches).phrase();
   else return alea(tronc);
  }
  return o;
}
// retour d'un élément aléatoire de tableau
function alea(array:Array):* {
   return array[int(Math.random() * array.length)];
}
 


#8 vegetalain

    Ceinture Orange

  • Members
  • PipPipPip
  • 34 messages

Posté 12 December 2015 - 06:19 AM

Merci de vos réponses, c'est vrai que composer des phrases à la volée plutôt que d'avoir des phrases "toutes prêtes", ça peut être sacrément marrant (j'ai fait un test), mais c'est difficile à mettre en place ; toutes les phrases n'ont pas forcément la même structure et elles doivent être compréhensibles quand même... hm... affaire à suivre.

Je vais aussi me renseigner sur les arbres "en général" mdr et reviendrai ici vous tenir au courant :)

Bon we à vous

#9 vegetalain

    Ceinture Orange

  • Members
  • PipPipPip
  • 34 messages

Posté 24 January 2016 - 08:03 AM

Rebonjour, alors après quelques tests je pense être sur la bonne piste pour un suivi de conversation.

Mon chatbot "maison" peut être testé en version 2, ici :roll: :

http://vegetalain.fr...576/Z576v2.html

Alors dîtes ce que vous voulez, parlez de ce que vous voulez et à un moment, parlez de tours de magie, ou dîtes que vous êtes mort :mrgreen: ... à ce moment là, pour ces deux cas, mon super prototype de suivi sera mis en route pour au moins une minute, avant que le programme ne revienne à du blabla de base.

Le hic étant que tout peut être sujet à la conversation... j'ai pas fini quoi :eusa_doh: :mrgreen:... ou il faut que je revois l'organisation de l'as3 ; bref, c'est en cours ;-)

ps: j'ai essayé de donné un effet "ancien" avec du rouge et du vert, plus une sorte de "reflet" du texte quelques pixels plus bas que ledit texte, des stris à l'écran avec une onde qui passe... des trucs à parfaire bien sûr, mais plus tard...

#10 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 25 January 2016 - 09:19 AM

Citation

Conversation :
Vous : bonjour
Drenn : Coucou... alors quoi de neuf aujourd'hui?
Vous : la moitie de dix-huit…
Drenn : 8) ?
Vous : c'est une vieille blague
Drenn : Je ne vois pas le rapport...
Vous : dix huit est la moitie de neuf
Drenn : Ce n'est pas très pertinent tout ça.
Vous : ok. je vais bien. et toi?
Drenn : De quoi?
Vous : comment-vtu as?
Drenn : Ce n'est pas évident, en effet.
Vous : Ça va?
Drenn : ? ?
Vous : qu'as tu fait hier?
Drenn : ... n'importe quoi.
Vous : peut-tu etre plus precis?
Drenn : Comment ça?
Vous : mmmmm. pas grave. de quoi tu veux parler?
Drenn : ... des chats?
Vous : allons y pour les chats.
Drenn : C'est-à-dire?
Vous : tu preferes les chats?
Drenn : Amusant. Mais bizarre...
Vous : que sait tu sur les chats?
Drenn : Voyez-vous ça...
Vous : porlons de chats
Drenn : Je ne vois pas où vous voulez en venir.
Vous : je travaille.
Drenn : Excusez-moi je n'ai pas compris ; que voulez-vous dire?
Vous : je veux dire que c'est nouveau : je travaille. avant, je ne travaillais pas.
Drenn : Vous m'en direz tant...
Vous : non. en fait, je suis mort.
Drenn : Comment ça 'mort'? Si c'est vrai alors tous les deux on a un problème de taille.
Vous : mort de chez mort.
Drenn : Rien ne vous parait étrange?
Vous : non. Ça m'est deja arrive. deux fois.
Drenn : C'est fort.Eh bien tout ça est illogiqueVous : oh, on s'habitue. si on en restait toujours a la logique, on n'orait pas tres loin.
Drenn : Vous plaisantez là, pas vrai?
Vous : pourquoi?
Drenn : Ecoutez-moi :Moi je ne suis pas vraiment vivant et pourtant je m'adresse à vous.Vous saisissezVous : pour l'instant, oui. a part l'usage du verbe 'ecouter' puisque tu n'as pas de voix. j'aurais prefere : 'lisez-moi :' :P
Drenn : Laissez-moi finir je vous prie.Et moi je ne suis pas vivant... cependant je vous parle.Vous saisissez le paradoxVous : paradoxe, paradoxe… tu y vas un peu fort quand meme. inhabituel serait suffisant.
Drenn : ... je ne comprends rien.
Vous : c'est juste comme un tour de magie, en quelque sorte.
Drenn : Ca mérite des explications, je vous écoute.
Vous : et bien, prenons un tour de magie classique : on rentre dans une boite, et hop ! on disparait. on est ou? vivant? mort? comme le chat de schrodinger.
Drenn : Moui...
Vous : mort ou vivant. au choix. et quand le magicien rouvre la boite… tadam ! on est a nouveau vivant. enfin normalement.
Drenn : On devrait discuter de tout ça plus tard, je pense.
Vous : pourquoi, tu n'detestes la magie?
Drenn : Bien, tout ceci était sympa, mais pourquoi ne pas parler d'un autre truc?
Vous : non, je veux parler de magie. on m'a dit que tu t'y connaissait.
Drenn : ... vous en connaissez vous, des tours de magie?
Vous : oui. celui du chat… ecoutes un peu quand je te parles.
Drenn : C'est comme vous voulez.
Vous : mais le tien aussi.
Drenn : Désolé mais je ne saisis pas Humain.
Vous : magie, magie, magie.
Drenn : ... vous en connaissez vous, des tours de magie?
Vous : oui.
Drenn : Vous semblez y croire à mort. C'est une bonne chose, mais êtes-vous sûr de votre fait?
Vous : oh, la la. sur, sur… je dirais pas ca. je pense plutot qu'il y a toujours un truc.
Drenn : ? ?
Vous : ben oui. tu es credule. un tour de magie, ca n'existe que s'il y a un truc. enfin, je crois.
Drenn : Je ne savais pas que vous vous intéressiez à la magie.
Vous : et toi?
Drenn : Il se trouve justement que je connais un tour super... vous êtes prêt?
Vous : oui, vaas-y.
Drenn : Je ferais vite pas de souci. Choisissez un nombre entier entre 10 et 90...
Vous : c'est fait.
Drenn : Bien. Multipliez ce nombre par 2. Dîtes-moi quand c'est bon.
Vous : c'est bon.
Drenn : Ajoutez maintenant le nombre 10 à votre résultat puis dîtes-moi quand c'est ok.
Vous : ok
Drenn : Divisez le résultat par deux. Vous suivez toujours?
Vous : oui. c'est ok.
Drenn : Enfin, ôtez à votre résultat le nombre choisi au départ...
Vous : fait.
Drenn : Le résultat est de 5... Amusant, pas vrai?
Vous : bof…
Drenn : En tout cas je trouve ça distrayant.
Vous : ((a * 2) + 10)/2 - 4 = 5
Drenn : La magie fascine les enfants, je trouve que c'est bien. Et vous?
Vous : ah. j'hesite. il y a du pour et du contre.
Drenn : Ok.
Vous : et sinon?
Drenn : Ah c'est marrant... nan je plaisantais, mais... nan, c'est marrant.
Vous : tu es de retour en mode normal c'est ca?
Drenn : C'est-à-dire?
Vous :
Drenn : Vous n'avez rien tapé Humain, êtes-vous fou?
Vous :
Drenn : Euh... Oui?
Vous :
Drenn : Euh... Oui?
Vous :
Drenn : Vous êtes du genre silencieux...
Vous : c'est surtout que je n'ai pas le sentiment d'etre ecoute.
Drenn : Ah?
Vous : vas-y repete ce que je viens de dire?
Drenn : Je ne vois pas le rapport...
Vous : mais si, quand meme…
Drenn : C'est-à-dire?
Vous : je pense que tu n'ecoutes pas. tu as une memoire de poisson rouge divise par un million… du genre une nanoseconde.
Drenn : Je ne comprends pas cette attitude humaine, pourriez-vous m'en dire plus?
Vous : non, je dois me remettre au travail.
Drenn : Vous n'avez pas l'air sûr...
Vous : si si.
Drenn : 8( ?
Vous : je te quittes. je te dis a bientot?
Drenn : Aurevoir, dormez bien.
Vous : merci.
Drenn : J'espère avoir pu vous aider correctement...
Vous : non, mais c'est pas grave. je n'avais pas besoin d'aide.
Drenn : C'est marrant...
Vous : lol
Drenn : lol?
Vous : mdr si tu preferes
Drenn : mdr?
Vous : ah… vas. n se quitte ma. bonne sieste quantique.
Drenn : Je ne vois pas le rapport...
Vous : bye bye
Drenn : Je ne comprends rien.
Vous : au revoir.
Drenn : Euh... oui, à bientôt... encore une fois.
Fin de conversation le lundi 25 Janvier 2016 à 09:19:35.e?
?
.



#11 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 25 January 2016 - 09:23 AM

Bonjour alain.
Attention au rapport : il manque certaines lignes et certaines réponses de ma part sont sur la même ligne que celle du bot. Les deux bugs sont peut-être liés.

En tous cas ça progresse.

#12 vegetalain

    Ceinture Orange

  • Members
  • PipPipPip
  • 34 messages

Posté 25 January 2016 - 14:00 PM

Bonjour, merci de ce retour :roll: .

Lorsqu'une "conversation" est lancée, on sort du blabla de base, mais j'ai inclu (pas suffisement) quelques mots clés à chaque "case" qui constituent la fonction de conversation... je suis en train de me dire qu'il faudrait être capable de sauter d'une fonction de conversation à une autre fonction de conversation pour toujours garder le fil de la discussion... ça fait un sacré nombre de permutations.

Je vais étudier ça quand je pourrais et reviendrai ici "avec du mieux" ;-) .

Bonne semaine



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP