Forums Développement Multimédia

Aller au contenu

Pb résolu sur une extraction de mot mais... je ne pige rien :(

CODE

8 réponses à ce sujet

#1 vegetalain

    Ceinture Orange

  • Members
  • PipPipPip
  • 34 messages

Posté 24 November 2015 - 10:33 AM

Bonjour, je suis avant tout graphiste et illustrateur, l'AS3 m'intéresse mais force est de constater que je ne dois pas avoir les "connections" alignées pour comprendre ce qu'on me dit, et j'ai honte mdr !!

J'ai posé une question sur un forum adobe "en anglais" et j'ai semble-t'il eu une réponse, mais je ne parviens pas à la mettre en place...

Est-ce qu'une bonne âme qui parle français pourrait me traduire ce qui n'a pas atteint mes neuronnes svp? Ce sera sans doute plus clair dans ma langue maternelle...

(soupirs)

Voilà le truc, je voulais essayer de faire un tchatbot avec comme principe de reprendre une partie de ce que disait l'utilisateur, "pour le fun". Exemple :

utilisateur : salut, tu connais fkeRrh1oaTmk ou pas?
le chatbot : Nan, désolé mais ce fkeRrh1oaTmk je ne l'ai jamais vu.

Il est impossible de prévoir et connaitre le mot "fkeRrh1oaTmk"... mais on peut repérer la chaine "connais" !!

Le principe était donc de repérer "connais" + l'espace après, puis que chopper le mot qui suivait (dans mon exemple, "fkeRrh1oaTmk", puis de le réutiliser dans la réponse)

Un membre du forum m'a gentillement donné cette info :

function wordAfterStringF(s:String,tf:TextField):String{
var a:Array = tf.text.split(' ');
var i:int = a.indexOf(s);
return a[i+1]
}
 

Ce à quoi j'ai répondu que je ne voyais pas trop comment l'intégrer à mon projet (constitué d'un bouton, d'un champ A1 en input (là où se fait l'analyse de l'utilisateur), d'un champ D1 en dynamic (là où s'affiche ce que dit le bot))

Alors il me répond la chose suivante :


if you want look for the first 'word' after like in a textfield (eg, my_tf), use:

var likedS:String = wordAfterStringF('like',my_tf);

if you want to look for the first 'word' after 'eat' in my_tf, use:

var eatS:String = wordAfterStringF('eat',my_tf);



Seulement meme avec l'impresion que l'info semble correspondre à ce que je veux faire, je ne parviens pas à l'utiliser...

Donc... ausecours :roll:

Merci de vos suggestions...

#2 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 24 November 2015 - 11:13 AM

Bonjour vegetalin

Difficile de te répondre. Comment intègre-tu la réponse de ton bot ? C'est à ce moment que tu dois utiliser la fonction qui t'es proposée.
Sans doute un peu plus compliqué, il faut que tu vérifie que le mot 'connais' est présent et prévoir 2 cas de réponse.
Comment as-tu intégré la réponse du robot pour l'instant ?

#3 vegetalain

    Ceinture Orange

  • Members
  • PipPipPip
  • 34 messages

Posté 24 November 2015 - 11:31 AM

Pour l'heure je peux détecter un mot et renvoyer une réponse, détecter deux mots dans une phrase et renvoyer une réponse, je pensais qu'en repérant un mot et en jouant avec "index", les positions des mots et des espaces on pouvait "capturer" un mot inconnu, mais cela s'avère moins simple que prévu.

Donc pour l'instant l'intégration de tout ça est quasi inexistante, me basant sur des réponses que je ne comprends pas :?

Le plus simple est que je mette à dispo mon FLA brouillon. Je me suis fait un fla où je résume les principales choses que j'utilise jusqu'à maintenant (ou tente d'utiliser, pour le cas présent)

Fichier(s) joint(s)



#4 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 24 November 2015 - 12:04 PM

Je n'ai pas une version assez récente pour ouvrir ton fla (CS4)

Mais, quand tu dis "je peux détecter un mot et renvoyer une réponse, détecter deux mots dans une phrase et renvoyer une réponse",
c'est le code qui correspond qui m'intéresse. Normalement, tu ne dois pas être loin de la solution, juste comprendre comment récupérer et utiliser les morceaux pour construire une phrase complète. Et le mieux, c'est que je t'aiguille en fonction de ce que tu as déjà fait. Te donner un code tout prêt n'a pas vraiment d'intérêt.

#5 vegetalain

    Ceinture Orange

  • Members
  • PipPipPip
  • 34 messages

Posté 24 November 2015 - 12:30 PM

alors ça c'est script que j'utilise pour trouver un mot et balancer une réponse.

Avec un bouton "go7", un champ input "a1" et un champ de réponse, "d1" :

go7.addEventListener(MouseEvent.CLICK, souris7);
function souris7(event:MouseEvent):void{
var aok: String = a1.text;
if(aok.indexOf("gugu") != -1){d1.text = "L'oiseau bubblegum?";}
}

Le script suivant donne l'index du premier espace de la phrase. (ça peut être un mot plutôt qu'un espace)

go5.addEventListener(MouseEvent.CLICK, souris5);
function souris5(event:MouseEvent):void{
var str:String = a1.text;  
trace(str.search(" "));
}

... partant de là et avec les réponses de l'autre forum données plus haut, il devrait être possible (je pense) à un codeur chevronné de trouver la solution (j'espère) :roll:

Dans ma tête cela semblait simple, je pensais suivre cette logique :

Pour la phrase "tu connais machin ou pas?", où "machin" est inconnu :

- on repère "connais"
- on trouve son index
- on additionne l'index et la longueur du mot + un espace (ce qui nous donne l'index de "machin")
- on cherche le prochaine espace juste après
- on trouve l'index de cet espace, puis on soustrait les deux infos, et on trouve la longueur de "machin"
- enfin on capture le mot "machin"... pour le réutiliser dans la phrase du bot

Cela dit je ne suis pas codeur, de ce fait mon raisonnement est peut-être faussé :oops:

#6 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 24 November 2015 - 12:50 PM

La logique est bonne, mais il y a des fonctionnalités qui rendent le travail plus simple.
Au lieu de chercher les espaces, on se sert de la fonction split() qui permet de découper un texte. Le résultat est fourni dans un tableau.
En passant un caractère espace à la fonction, on récupère donc un tableau contenant les mots.
Si tu trouves le mots test à l'indice 4, alors le mot que tu souhaites est à l'indice 5 du tableau…

C'est exactement ce que fait la fonction qui t'a été fournie.
Je te la traduit en français de France, et je l'adapte un peu pour ton usage :
function le_mot_qui_suit(clef:String, phrase:String):String{
   var les_mots:Array = phrase.split(' ');
   var index_de_la_clef:int = les_mots.indexOf(clef);
   if (index_de_la_clef == -1) return "";
   else return les_mots[index_de_la_clef + 1];
}
Les différences, à part la traduction :
- la fonction ne va plus chercher le texte dans un champ. Tu dois lui fournir.
- quand la fonction ne trouve pas la clef dans la phrase, elle retourne un texte vide : ""


Après à l'usage de ta fonction, tu peut demander le mot suivant le mot de ton choix. Ce qui est pratique, car comme ça tu as une fonction qui peut te resservir pour d'autres questions, d'autres mots clés que "connais"…

Ça pourrait se traduire comme ça :
go5.addEventListener(MouseEvent.CLICK, souris5);
function souris5(event:MouseEvent):void{
   var question:String = a1.text; // Je mémorise la question
   var reponse:String = le_mot_qui_suit("connais",question); // Je demande à la fonction le mot qui suit 'connais'
   if (reponse == "") d1.text = "Je n'ai pas compris la question"; // Si la réponse est vide, réponse vide
   else d1.text = "Je ne connais pas " + reponse + " !"; // Si la réponse est pleine, je l'utilise
}


Il y a sans doute pas mal d'optimisations à faire, mais dis nous déjà si tu comprends ce code et s'il répond à ta demande.

#7 vegetalain

    Ceinture Orange

  • Members
  • PipPipPip
  • 34 messages

Posté 24 November 2015 - 13:12 PM

purée, ça fonctionne ; chapeau !!

Alors je ne voyais pas qu'il fallait autant de script "divisé" en deux portions... sinon je comprends le principe du tableau et le fait qu'il facilite la recherche d'une info (mieux qu'en comptant les espaces). Je pense mieux cerner le truc... hm...

je ne pense pas avoir besoin de "je n'ai pas compris la question" car effectivement je vais utiliser ça pour d'autre termes que "connais". C'est pratique par exemple lorsque le programme demande le nom de l'utilisateur. La personne peut dire "bill" ou "ha oui, bien sur alors voilà je m'appelle bill en fait". Dans tous les cas le nom sera trouvé et la ponctuation éventuelle sera retirée... nan c'est super.

C'est là que je me rends compte que même si l'as3 m'intéresse et que les bots me fascinent aussi, photoshop reste mon domaine ;-)

Merci beaucoup

#8 dldler

  • Community Manager
  • PipPipPipPipPipPipPipPip
  • 4163 messages

Posté 24 November 2015 - 15:47 PM

OK. Bonne continuation alors.

Pour le côté découpage en petites fonction, ce n'est pas obligatoire. On aurait très bien pu mettre tout le code directement dans la fonction go5.
Mais on crée des fonctions quand on sait que l'on aura besoin du même code pour faire autre chose. Ça permet de ne l'avoir qu'une fois, de l'enrichir… et c'est une bonne pratique mentale qui fonctionne aussi au niveau général (tu pourrais sans doute 'factoriser' également le principe des fonctions go1, go2 etc… vu qu'il y a beaucoup de lignes identiques (récupérer le texte, le tester, le renvoyer). Mais ça viendra plus tard.

#9 vegetalain

    Ceinture Orange

  • Members
  • PipPipPip
  • 34 messages

Posté 26 November 2015 - 09:04 AM

Je me doute que c'est optimisable à fond, pour l'instant cette "organisation" me permet de me repérer "à mon niveau". Je ne veux pas prendre un code de bot "tout fait" car en cas de modif, ça va être un cauchemar. Je préfère assembler des petits bouts afin de faire comme j'imagine, et d'y voir clair... puis comme tu dis, plus tard ce sera amélioré.

D'ailleurs je vais poser une autre question dans deux minutes xD avec encore une portion de scripts...



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