Recherche de mot dans une phrase et réponse

mickmils Messages postés 2 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 17 juin 2004 - 17 juin 2004 à 12:46
cs_Huitre Messages postés 290 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 29 février 2008 - 18 juin 2004 à 07:46
Bonjour, j'essaie de créer un bot mIRC conversationnel stupide, du nom de Mower. Actuellement, lorsque quelqu'un essaie de parler a mower, il répond en prenant une phrase au hasard dans le fichier d:\log.txt . Le remote est le suivant

on *:TEXT:*Mower*:#:msg $chan $nick $+ : $read(d:\log.txt)

Bon, vu mon niveau en programmation, faut que je vous dise que j'ai déja eu un mal énorme a faire ca.

Je souhaite effectuer une amélioration en ce bot, afin que ses réponses soient un peu moins a coté de la plaque.
Lorsque l'on parle a Mower, celui ci prendrait un mot au hasard dans la phrase, chercherait les phrases contenant ce mot dans d:\log.txt et en ressortirait une au hasard.

L'idéal serait qu'il évite les mots "communs" genre "le" "je" "du" etc....

Quelqu'un a une idée des modifications a faire pour arriver a un tel résultat ? Je ne sais vraiment pas comment m'y prendre.

3 réponses

Kerrigan Messages postés 708 Date d'inscription lundi 15 juillet 2002 Statut Membre Dernière intervention 17 mars 2005
17 juin 2004 à 14:14
On va faire le code pas a pas histoire ne pas te lacher un gros code sans que tu ne comprennes rien
en meme temps tu veras mon cheminement lors de l'élaboration du code.

on *:text:*Mower*:#: {
var %mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
var %phrase = $read(d:\log.txt, w, $+(*,%mot,*))
msg $chan $nick %phrase
}

Pour faire simple
%mot va prendre un mot au hasard dans la phrase

et cette fonction :
$read(d:\log.txt, w, $+(*,%mot,*))

Va rechercher une phrase qui contient %mot dans le fichier texte
Par contre je ne sais pas si c'est une phrase tirée au hasard.

pour eviter les "je" et les "du"

on *:text:*Mower*:#: {
var %except = je,du,à,ce,que
var %mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
while ($findtok(%except,%mot,1,44)) {
%mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
}
var %phrase = $read(d:\log.txt, w, $+(*,%mot,*))
msg $chan $nick %phrase
}

Cette ligne verifie que le mot "%mot" n'est pas présent dans
la liste de mot a éviter.

while ($findtok(%except,%mot,1,44)) {
%mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
}

En meme temps en prenant cette syntaxe on aura un problème si la phrase du type c'est : "je je je je je je je".
La ton mirc va geler. Donc on va mettre une instruction de sortie

var %j = 1
while ( $findtok(%except,%mot,1,44) || %j <= $gettok($1-,0,32) ) {
%mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
inc %j
}

en gros si la boucle essai trop de fois de trouver un mot correct ( le nombre d'essai permis est egale au nombre de mot possible) elle s'arrete et te laissera respirer (ouf :) )

ensuite si un mot correct n'a pas été trouvé malgré la boucle plus haut, on dira au code ne pas envoyer de phrase :

if ($findtok(%except,%mot,1,44)) { halt }
grace a cette comande

au final le code ressemble a :
on *:text:*Mower*:#: {
var %except = je,du,à,ce,que
var %mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
var %j = 1
while ( $findtok(%except,%mot,1,44) || %j <= $gettok($1-,0,32) ) {
%mot = $gettok($1-,$rand(1,$gettok($1-,0,32)),32)
inc %j
}
if ($findtok(%except,%mot,1,44)) { halt }
var %phrase = $read(d:\log.txt, w, $+(*,%mot,*))
msg $chan $nick %phrase
}

on peut aisément optimiser ce code mais c'est pas le but ici.

j'espere que mes commentaires t'auront aidé. Reste a régler le problème de la phrase au hasard la je vois pas trop.

Je n'ai rien testé mais a priori ça marche.
en cas de problème tu feras les corrections toi meme comme un grand. C'est comme ça qu'on progresse.
0
mickmils Messages postés 2 Date d'inscription jeudi 17 juin 2004 Statut Membre Dernière intervention 17 juin 2004
17 juin 2004 à 20:58
Re. j'ai trouvé ceci dans la doc de mIRC

If you specify the s or w switches, you can also specify the N value to specify the line you wish to start searching from in the file, eg.:
//echo $read(versions.txt, w, *mirc*, 100)

apparement, ca pourrait etre la solution vu qu'il démarrerait la recherche au hasard dans le fichier texte. Néanmoins, toutes mes tentatives de mettre une modif en oeuvre
en utilisant par example

var %chiffre = $r(0,1000)

puis en remplacant la ligne
var %phrase = $read(d:\log.txt, w, $+(*,%mot,*))
par
var %phrase = $read(d:\log.txt, w, $+(*,%mot,%chiffre))

se sont soldés par un échec, le bot de temps en temps se contentant de dire mon nick et puis c'est tout (et oui, mon fichier fait plus de 1000 lignes.)
0
cs_Huitre Messages postés 290 Date d'inscription mardi 21 janvier 2003 Statut Membre Dernière intervention 29 février 2008
18 juin 2004 à 07:46
Oui c normal, ta syntaxe n est pas bonne,

var %phrase = $read(d:\log.txt, w, $+(*,%mot,%chiffre))

est égal a var %phrase = $read(d:\log.txt,w, $+ * $+ %mot $+ %chiffre)

( $+ permet de concaténer une expression , ex: hel $+ lo = hello )

Donc il faut écrire var %phrase = $read(d:\log.txt, w, $+(*,%mot), %chiffre)

Voila si je suis bien réveillé, en principe ca marche =)
0
Rejoignez-nous