IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Dictionnaire de phrases pour un chat bot


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Dictionnaire de phrases pour un chat bot
    Bonjour à tous !

    Je viens de m'inscrire en espérant que certains d'entre vous pourront m'aider, ou ne serait-ce qu'éclairer ma lanterne.

    Je suis tout ce qui y'a de plus nul en C (et en plein d'autres langages de programmation) mais de temps à autre j'aime développer des petits trucs idiots, juste pour le plaisir. Depuis quelques temps, je me heurte à un problème que je n'arrive pas à résoudre, faute de connaissance et aussi d'intelligence...

    Je vous donne une petite description du programme en question, suivi de ce que j'aimerais faire pour l'améliorer, et enfin un bout du code pour ceux qui pourront plancher un peu dessus.

    Le programme est un "tchat bot" très simpliste. Il tire un nombre au hasard compris entre 1 et 5 au début, puis, suivant ce que l'utilisateur entre comme texte, une réponse aléatoire lui est retournée (maximum 5 phrases différentes donc, pour ne pas avoir l'impression de trop tourner en rond). Exemple, en tapant "bonjour" il va répondre au hasard avec "bonjour" "salut" "coucou" etc. Rien de bien extraordinaire donc ! Mais j'aimerais pouvoir faire grossir la "base de données" des questions/réponses en utilisant une sorte de dictionnaire. Malheureusement je n'y arrive pas, même si je me suis déjà creusé la tête là dessus. Ce que j'aimerais, c'est avoir la possibilité d'utiliser un fichier texte par exemple, avec d'un côté les questions, et de l'autre jusqu'à 5 réponses. Le programme irait ensuite piocher dans cette "base de données" pour fonctionner correctement.

    A ce stade, j'ai simplement une énooooorme fonction, regroupant des dizaines de phrases.

    L'intérêt serait donc d'avoir une fonction, toute bête, et à côté une grosse base de données, modifiable simplement, sans avoir à chaque fois à recompiler, et à faire attention à la syntaxe.

    Maintenant, le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    static void videBuffer(void) {
       int c;
       while ((c=getchar()) != '\n' && c != EOF);
    }
     
    int main(void) {
       char *p;
       system("color 02");
       printf("\t\t\t\tExcelsior v1.1\n\t\t\t\t______________\n\nAttention ! Programme en developpement.\nNe saisir que du texte en minuscles, sans accent.\n\n\n");
       printf(">>>");
       char chaine[255];
     
    while(fgets(chaine, sizeof chaine, stdin)!=NULL) {
        char *p=strchr(chaine,'\n');
        if(p!=NULL)
           *p='\0';
        else
           videBuffer();
     
       if (p != NULL) {
          *p='\0';
       }
       else {
     
       }
    // ----- FONCTION ALEATOIRE -----
     
        int nombrealeatoire = 0;
        const int MAX = 5, MIN = 1;
        srand(time(NULL));
        nombrealeatoire = (rand() % (MAX - MIN + 1)) + MIN;
     
    // ----- BONJOUR & AU REVOIR -----
     
    // ---Bonjour---
     
          if (strcmp(chaine, "bonjour")==0 &&  (nombrealeatoire == 1))
          puts("Bonjour.");
          else if (strcmp(chaine, "bonjour")==0 &&  (nombrealeatoire == 2))
          puts("Salutations.");
          else if (strcmp(chaine, "bonjour")==0 &&  (nombrealeatoire == 3))
          puts("Salut");
          else if (strcmp(chaine, "bonjour")==0 &&  (nombrealeatoire == 4))
          puts("Coucou");
          else if (strcmp(chaine, "bonjour")==0 &&  (nombrealeatoire == 5))
          puts("Heureux de vous voir.");
    // ----- FONCTIONNALITES -----
     
    //  Quitter
          else if (strcmp(chaine, "!exit")==0) // exit -> Termine le programme
          return 0;
    //  Aide
          else if (strcmp(chaine, "!aide")==0) // Fonction d'aide qui répertorie les différentes fonctionnalités
          puts("                    Excelsior v1.1\n                 ____________________\n\n                 Liste des commandes\n                 - !exit : Ferme le programme\n                 - !effacer : Efface le contenu de la console\n                 - !aide : Affiche la liste des commandes disponibles\n                 - !heure : Affiche l'heure\n                 - !random : Affiche la valeur du nombre aleatoire");
    //  Saisie vide
          else if (strcmp(chaine, "")==0) // Renvoie le message quand une saisie vide est envoyée
          puts("Merci de saisir du texte");
    //  Affichage de la valeur aléatoire
          else if (strcmp(chaine, "!random")==0 &&  (nombrealeatoire == 1))
          puts("La valeur aleatoire est egale a 1");
          else if (strcmp(chaine, "!random")==0 &&  (nombrealeatoire == 2))
          puts("La valeur aleatoire est egale a 2");
          else if (strcmp(chaine, "!random")==0 &&  (nombrealeatoire == 3))
          puts("La valeur aleatoire est egale a 3");
          else if (strcmp(chaine, "!random")==0 &&  (nombrealeatoire == 4))
          puts("La valeur aleatoire est egale a 4");
          else if (strcmp(chaine, "!random")==0 &&  (nombrealeatoire == 5))
          puts("La valeur aleatoire est egale a 5");
    //  Effacer la concole
          else if (strcmp(chaine, "!effacer")==0) // Effacer -> Efface la console
          system("cls");
     
    //  Heure
     
    else if (strcmp(chaine, "!heure")==0)
          {
        time_t crt = time(NULL);
        char buf[20];
        strftime(buf, sizeof(buf), "%I:%M %p\n", localtime(&crt));
    puts(buf);
    }
          else puts("\nJe n'ai pas compris votre saisie.");  //  En cas de saisie non répertoriée.
     
    // ----- Fin du programme -----
    }
    return 0;
    }
    Voila.

    Si quelqu'un saurait comment faire... qu'il parle maintenant ou se taise à jamais !

  2. #2
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Et c'est quoi le souci exactement , fopen / fgets te pose un souci ?
    bref plus de détaille, parce que a par ouvrir un fichier et lire le fichier en question je vois pas le probleme .

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Justement, tout le problème est là.
    Je n'arrive pas à ouvrir et lire un fichier.

    Ça peut paraître con pour toi, mais je n'y arrive pas.
    Je ne sais pas du tout comment modifier ma fonction pour qu'elle aille chercher une chaîne de caractère dans toute une liste dans un fichier prédéfini.

  4. #4
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    Mouais mais bon aussi dire qu'on y arrive pas c'est pas la solution.

    Bon voila comment on ouvre un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    FILE * fichier = NULL;
    fichier = fopen("montexte.txt","r"); // r pour read
     
    if(fichier != NULL)
    {
     
         fclose(fichier);
    }
    Sinon on va éviter de créer un parser on considère que ton texte est comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bonjour
    au revoir
    bleu
    ciel
    ça va ?
    donc pour lire ton texte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    FILE * fichier = NULL;
    fichier = fopen("montexte.txt","r"); // r pour read
     
    char chaine[100];
    if(fichier != NULL)
    {
       while (fgets(chaine,100,fichier) != NULL)   /*  lis tous le fichier  */
       {
          printf("%s\n",chaine);
       }
       fclose(fichier);
    }
    Voila après pour les fonctions si tu les comprend pas ,il faut lire tuto/cours sur la lecture de fichier.

    Pour qu'il aille cherche un mot , ben une variable qui par rapport au nombre prend le1,2 mot ect par rapport aux texte , pour récupérer une chaine de caractère il y a strcpy.

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2013
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Septembre 2013
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Dire que je n'y arrive pas n'est pas la solution, mais faire croire que tout baigne alors que ce n'est pas le cas c'est pas un début de solution non plus.

    Je ne compte pas sur un forum pour me mâcher le travail, mais juste pour un coup de pouce.

    Merci pour ton aide en tout cas, je vais essayer de comprendre, d'ici 6 mois quand j'aurais bien tout assimilé je te dirais si je m'en suis sorti ou non

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Le problème n'est pas de modifier une fonction pour qu'elle liste maintenant dans un fichier, ton programme est de faire un brin de conception. Il te faut réfléchir en français à ce que tu vas faire : quel objectif en terme de nombre de phrases, structure du fichier, comment lire un fichier, comment le charger en mémoire, comme faire la recherche dans le dico de la phrase saisie, comment sélectionner une réponse, etc. Il faut découper en fonctions, limite en repartant de zéro (mais en te servant de ce que tu as fait qui est un "POC" d'une certaine manière).

    Il faut aussi se former. Si tu ne sais pas ouvrir et lire dans un fichier, essaye déjà de faire un équivalent de la commande cat avant de vouloir intégrer ça dans ton programme actuel.

  7. #7
    Membre averti
    Homme Profil pro
    Cadre informatique
    Inscrit en
    Avril 2013
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Cadre informatique

    Informations forums :
    Inscription : Avril 2013
    Messages : 183
    Points : 435
    Points
    435
    Par défaut
    Coucou!!

    Bon je vais mitiger mais c'est une bonne idée! On va rendre les forums complètement morts
    Sinon, d'un point de vue de programmeur, tu as du pain sur la planche! Entre faire ton dictionnaire pour tes 5 phrases en fonction de ce qu'on te répond (soit 5*un certain nombre de questions), aller chercher dans les bonnes réponses (un "bonjour" ne doit pas précéder un "a la prochaine" par exemple), ouverture et fermeture de fichiers (mouais déjà facilement fait par Kannagi ) et gérer le temps de réponse, il va falloir comme te dit Bktero, une certaine coordination et une bonne réflexion sur le sujet.
    Mais au moins tu as projet alors bonne chance et essaye d'avancer pas à pas

    Reviens poster pour demander de l'aide et postes ton code sinon ils vont encore sortir les dents

Discussions similaires

  1. Conseil pour créer un chat bot.
    Par lostsoul dans le forum Général Java
    Réponses: 0
    Dernier message: 08/11/2013, 17h04
  2. Problème de connexion à distance pour un chat
    Par Invité dans le forum Langage
    Réponses: 11
    Dernier message: 04/06/2007, 18h18
  3. Réponses: 2
    Dernier message: 20/01/2007, 16h25
  4. Réponses: 2
    Dernier message: 13/10/2006, 23h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo