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

Free Pascal Discussion :

Création d'une (pseudo) conversation artificielle


Sujet :

Free Pascal

  1. #21
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    me revoila ^^ j ai pas pu me connecter pendant un certains temps
    @labbet
    ok je pensais que c etait a mettre a chaques phrases ^^ cela dit ducoup ca pose probleme car maintenant que je sais que dans fromage il reconnaitra le mot "age" je me sers de ce petit probleme pour aller plus vite par exemple si une fille repond a "quelle est ta nationnalitée" posée parl ordinateur, elle dira "francaise" tandis qu un garcon repondra "francais" et ducoup ca m evite a faire 2 fois les phrases, les mettre au masculin suffit

    @joreveur
    le " //writeln(i); // afficher i"
    on le met avant chaque phrases ca ou pas?

    par exemple mon code ressemble un peu a ca:
    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
     
    program
    var 
    begin
     if
     else if
      writeln
     else if
      writeln
     else if
      writeln
     ...
     else
      writeln('je n ai pas compris ce que vous avez dit')
    end.
    et pour l instant je voudrai juste l appliquer au tout dernier else, pour quand la phrase ne correspond a aucunes des possibilités
    pour qu'il y ait plusieurs phrases

    ensuite je l appliquerai a des else if quand je serai sur d avoir bien compris mais la je vois deja pas ou placer le //writeln(i); // afficher i par rapport au "else"

  2. #22
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    je suis un "garçon" de nationalité française
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #23
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    oui mais :
    -de quelle nationalitée est tu?
    -je suis francais
    il faut tout prévoir ^^

    et puis ce n'était qu'un exemple, a plusieurs reprise j ai utilisé ca pour faire plusieurs tournures de phrases en une seule

  4. #24
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 29
    Points : 59
    Points
    59
    Par défaut
    tu y es : ^^ tu commence à toucher au pb de la grammaire et de la sémantique.

    Au passage, tu vas avoir aussi un pb avec les accents, cédilles, ... et après tu auras les majuscules et minuscules

    Q : de quelle nationalité es-tu ?
    R : je suis français(e)

    ok je pensais que c etait a mettre a chaques phrases
    Bien, c'est une erreur que font souvent les débutants - je suis passé par là aussi - il faut toujours penser à factoriser son code.


    Tu pourrais envisager d'utiliser un fichier qui servira de dictionnaire pour stocker l'ensemble des mots qui pouvant apparaitre dans ta conversation.
    - soit tu la tape à la main
    - soit tu demandes à google.
    j'ai trouvé ça ce peut être un bon point de départ
    http://www.pallier.org/ressources/di...cais.frgut.txt

    Et ensuite stocker le fichier dans une structure adéquate pour y retrouver tes mots.

    Voire, pourquoi pas, proposer une complétion automatique à l'utilisateur - et lui imposer des réponses 'fermées' sans trop le frustrer ...

  5. #25
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    le problème des apostrophes virgules et cédilles est a peu près résous,
    a chaque fois que je le fais tester a quelqu'un je lui précise des le début qu'il ne faut pas de symboles, et remplacer les apostrophes par des espaces

    Tu pourrais envisager d'utiliser un fichier qui servira de dictionnaire pour stocker l'ensemble des mots qui pouvant apparaitre dans ta conversation.
    c'est a dire ? je suis pas contre l'idée mais ca apporte quoi? le fichier dictionnaire reconnaitra les mots mais n'aura pas de réponses pour chaque mots, nn?

  6. #26
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Loupsio Voir le message
    ... cela dit ducoup ca pose probleme car maintenant que je sais que dans fromage il reconnaitra le mot "age" ...
    Citation Envoyé par Loupsio Voir le message
    le problème des apostrophes virgules et cédilles est a peu près résolu
    Je reviens a la charge avec le code posté plus tôt. En effet, il semble qu'il résolve 2 de tes problèmes, et il est simple a comprendre :
    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
    var Mots : TStringList;
     
    ...
     
    Question:=LowerCase(Question);
     
    for i:=0 to Length(Question) do
    begin
      if Question[i] in ['.',';',',','?',':','!','(',')',''''] then Question[i]:=' ';
      if Question[i] in ['é','è'] then Question[i]:='e';
      if Question[i] in ['à','â'] then Question[i]:='a';
      if Question[i] in ['ç'] then Question[i]:='c';
      if Question[i] in ['ô'] then Question[i]:='o';
    end;
     
    //Ici, on a supprimé les majuscules, tous les accents, et la ponctuation
     
    Mots:=TStringList.Create;
    Mots.Delimiter:=' ';
    Mots.DelimitedText:=Question;
     
    //Ici, la phrase est dans un tableau. Pour tester si la phrase contient un mot, il suffit de faire : Mots.IndexOf('bonjour') qui renvoie une valeur différente de -1 si le mot est présente dans la phrase.
     
    Mots.Free;
    Ton code principal pourra être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    begin
     if Mots.IndexOf('age')<>-1 then
      writeln('J''ai 20 ans')
     else if (Mots.IndexOf('nom')<>-1) or (Mots.IndexOf(appelle)<>-1) then
      writeln('Je m''appelle Machin')
     else if
      writeln
     else if
      writeln
     ...
     else
      writeln('je n ai pas compris ce que vous avez dit')
    end.

  7. #27
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    bon je ne le retrouve pas, mais je sais qu'il y a fort longtemps j'ai vu un programme en Turbo Pascal qui faisait ce que tu cherches à faire

    dans un autre genre, il y a aussi un programme très amusant à faire...je vous donne le résultat et vous laisse imaginer le contenu

    partie 1:
    pense à un animal.
    a-t-il 4 pattes ? O
    est-ce un chien ? N
    comment le distinguer d'un chien ? est-ce qu'il aboie ?
    quelle est la réponse ? N
    et à quoi pensais-tu ? un chat
    Merci, fin de partie, j'ai perdu !

    partie 2:
    pense à un animal.
    a-t-il 4 pattes ? O
    est-ce qu'il aboie ? N
    est-ce un chat ? N
    comme le distinger d'un chat ? est-ce un rongeur ?
    quelle est la réponse ? O
    et à quoi pensais-tu ? un hamster.
    Merci, fin de partie, j'ai perdu !

    Vous voyez le principe ?

    et ça peut très bien s'appliquer à une hotline

    d'ailleurs je viens de me rappeler qu'il existe un site web qui exploite cela avec les célébrités...il devine quasiment toujours celle a qui vous pensez
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #28
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    mick605
    La technique consiste a découper la phrase, et a récuperer les mots dans une liste. Pour savoir si un mot est dans la liste, utilise:...
    labbet
    Tu pourrais envisager d'utiliser un fichier qui servira de dictionnaire pour stocker l'ensemble des mots qui pouvant apparaitre dans ta conversation.
    je pense que vous parlez de la même chose, mais je comprend toujours pas l'utilité de cette fameuse liste de mot,
    a quoi ca sert que l'ordinateur reconnaisse le mot apparaissant dans la conversation grâce a la liste si il n'y a pas de réponses adaptés a chaque mots?

  9. #29
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Paul Toth > Il a l'air sympa ton jeu ... Akinator, c'est énorme pour ca ^^

    Citation Envoyé par Loupsio Voir le message
    je pense que vous parlez de la même chose, mais je comprend toujours pas l'utilité de cette fameuse liste de mot,
    a quoi ca sert que l'ordinateur reconnaisse le mot apparaissant dans la conversation grâce a la liste si il n'y a pas de réponses adaptés a chaque mots?
    Non, non.
    Je parle d'une technique permettant de mieux gerer ta phrase, pour facilement détecter un mot présent dans la phrase. En effet, avec Pos(), tu as vite remarqué quelques problemes (présence de "age" dans "fromage"). Avec ma technique, tu peux facilement détecter si le mot "age" est dans la phrase, et le différencier du mot "fromage".

    La technique de labbet consiste à avoir un fichier externe a ton application contenant les mots clé, et les réponses à ces mots clés. Je penserai a un fichier du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    age : J'ai 20 ans
    nom, appelle : Je m'appelle Mr. X
    etc.
    Bien sur, tu es libre de faire ce que tu pense être le plus simple ... A toi de voir ...

  10. #30
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    ah ok, désolé j'avais pas compris ca comme ca
    et du coup ou se trouvent tous les mots? tu dis que la proposition de labbet est un fichier externe (que je ne sais pas faire), mais ducoup dans ce que tu propose toi, ou se trouvent les mots pour pallier au problème du pos()

    EDIT
    j'ai essayé ton code pour que les "é"; "è" soient lus comme des "e", mais pour ca il y a aussi besoin de la liste? parce que ca n'a pas vraiment marché, il me dit "identifier not found question"
    rapport au :
    Question:=LowerCase(Question);
    et aux if question[i] then ...

  11. #31
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Question est ta variable String qui contient la question saisie par l'utilisateur ...

    Ma technique ne nécessite pas de fichier externe ou autre. Le code fonctionne dans l'état ou il est ...

  12. #32
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    ma variable c'est "a"

    ah ué je crois que je viens de comprendre, en fait "question" n'est pas une variable a rajouter dans "var" mais simplement mon "a",
    je sais pas pourquoi dans ma tête "a" était l'ensemble de la réponse, du coup le code tel qu'il est aurai voulu dire "si le mec écrit juste un "é" alors ca sera considéré comme un "e" mais si il y a une phrase entière avec un "é", le "é" n'est pas toute ma variable ca n'en est qu'une partie donc je pensais qu'il le reconnaitrai pas"

    mais donc la ou tu a écrit "question", je dois bien remplacer par ma variable "a" et tous les "é" a l'interieur seront bien considérés comme des "e"?

  13. #33
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Oui. Mais il serait plus convenable de nommer ta variable autrement, pour être plus explicite. La boucle for permet de passer chaque caractere et de le modifier si nécessaire. Je te conseille de lire des cours de Pascal, ca te sera utile.

    Bonne chance

  14. #34
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 29
    Points : 59
    Points
    59
    Par défaut
    Un peu hors-sujet et un peu tard (j'ai eu du mal a le retrouver) : http://www.storytron.com/ mais à mon sens beaucoup plus bluffant que l'Akinator cité plus haut.
    C'est en anglais, mais le système permettant de dialoguer est très efficace et astucieux.

    NB : pour les old-schools gamers le Storytron a été conçu par Chris Crawford qui avait commis "Balance of Power" dans les 80's.
    Le Storytron est le moteur de jeu sur lequel tourne (gratuitement) le "Balance of Power of 21st century": vous incarnez le président des E.U. le 11/09/2001 . Le but du jeu : ne pas se faire démissionner.

  15. #35
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    ce n'est jamais trop tard ^^ bon mis a part que je n'ai rien compris parce que c'était en anglais

    pour ce qui est du logiciel, je continuerai plus tard, la le probleme est que ca devenai trop chaud ducoup je recopiai sans comprendre comment ca marchait, ducoup en cas de probleme je pouvai pas voir ou est ce que les nouvellesarties de mon code posait probleme,
    donc pour l'instant je me contente des exercices du prof (on bosse sur les tableau) et je verrai ensuite pour reprendre quand l'info sera fini et que j'aurai la totalitée des cours qu on est censé avoir dans l'année

  16. #36
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    salut a tous, me revoila pour cette petite conversation avec le pc,
    j'aimerais regler un petit probleme
    j'ai inséré des posibilités de prenom avec les prenom de mon entourage (donc des personnes a qui je fais tester le logiciel) grace aux : (pos(appelle,a)>0) (pos(nom1,a)>0) nom1 etant le prenom de la personne a qui je fais tester, mais j'aimerai ne plus avoir a entrer le nom a l'avance par exemple,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (pos('je',a)>0) and (pos('appelle',a)>0) then
    {cela signifie en gros que la personne donne son nom}
    writeln('enchanté ', nom_de_la_personne );
    {en gros dans la phrase ecrite, ce qui ne fais pas partie des propositions serait considéré comme le prénom et sera rajouté en fonction de ce qu a marqué la personne}
    comme ca peut importe son nom la réponse sera adapté,
    et j'aimerais que ce nom soit mémorisé tout le long de la conversation comme une variable pour le ressortir de temps en temps dans certaines réponses futures


    j'avais pensé a:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (pos('appelle',a)>0) and (pos('je',a)>0) then
    begin
    {j insere une nouvelle variable qui enregistre le prenom}
    b:=a
    writeln('enchanté ',b);
    end
    'b' serai le prénom tout du long de la conversation,
    seulement le problème qui reste c'est que la personne ne réponse pas seulement pas son prénom mais par une phrase entière, souvent "je m'appelle machin"
    donc faudrait que j'isole le "machin" (prenom) du reste de la phrase

    Et si jamais il ne fais pas de phrase et répond directement a la question "comment tu t appelles?" par son prénom, alors ca ne colle pas au "if (pos(" car pour être détecté la phrase doit contenir le mot clé "appelle" et "je"
    c'est assez long et je ne sais pas si c'est bien expliqué mais j'espère que vous voyez ce que je veux dire et qu'il y a un moyen de faire ca

  17. #37
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 29
    Points : 59
    Points
    59
    Par défaut
    Je n'avais pas vu ton post.

    déjà évites les variables qui n'ont pas de nom explicite
    remplace les "a" par "reponse" et les "b" par "prenom"

    Ensuite en lisant ton code et tes réponses, je vois que tu ne tiens pas vraiment compte des conseils et remarques : Utliliser indexOf à la place de pos, gérer les accents et ponctuations...

    Puisque tu en es à :
    ... chaque fois que je le fais tester a quelqu'un je lui précise des le début qu'il ne faut pas de symboles, et remplacer les apostrophes par des espaces
    alors tu ne veras pas d'objections à ce que lorsque ton programme ne comprend pas a qu'a écrit b c'est qu'il réponde à b "je n ai pas compris votre reponse 'a' ... "

  18. #38
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    désolé du retard,
    en effet j'utilise toujours les (pos() car j'ai essayé index of et s'en est suvi tout une liste d'erreur que je ne comprenais pas lors de la compilation, pareil pour les accents et ponctuation, du coup je prefere faire quelque chose de moins bien mais que je comprend une fois expliquée ( l'histoire des "pos" est toute simple malgré que je ne la connaissait pas avant) plutot que d'essayer quelque chose que je ne comprend pas et que je ne pourrait pas utiliser dans d'autres programmes car j'aurais eu une réponse préconçu que je ne comprend pas,

    par contre j'ai pas compris la seconde partie de ton message,
    il ne peut rien répondre a "b" puisque b n'existe pas , ce n'était qu'un exemple de ce que je voulais faire, mais je sais pas comment isoler une partie de la réponse

    et quant aux nom des variables..., je sais mea culpa mais comme il s'agit de comparer des solutions, quand je rajoute des sujet de conversation au fur et a mesure c'est plus rapide d'ecrire "(pos('...',a)>0)" que "(pos('...',reponse)>0)"
    du coup tant que je n'ai que peu de variable je prefere rajouter entre accolades " {a=reponse de l utilisateur}" sur ma ligne de variables
    pour si jamais un jour j'oubliai

  19. #39
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Loupsio Voir le message
    en effet j'utilise toujours les (pos() car j'ai essayé index of et s'en est suvi tout une liste d'erreur que je ne comprenais pas lors de la compilation, pareil pour les accents et ponctuation, du coup je prefere faire quelque chose de moins bien mais que je comprend une fois expliquée ( l'histoire des "pos" est toute simple malgré que je ne la connaissait pas avant) plutot que d'essayer quelque chose que je ne comprend pas et que je ne pourrait pas utiliser dans d'autres programmes car j'aurais eu une réponse préconçu que je ne comprend pas
    Tu as raison, mais le mieux reste encore de demander ce que tu ne comprends pas. J'ai cru au début que tu te fichais de ma réponse ...

    Donc, voici le code précédent :
    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
    var Mots : TStringList;
     
    ...
     
    Question:=LowerCase(Question);
     
    for i:=0 to Length(Question) do
    begin
      if Question[i] in ['.',';',',','?',':','!','(',')',''''] then Question[i]:=' ';
      if Question[i] in ['é','è'] then Question[i]:='e';
      if Question[i] in ['à','â'] then Question[i]:='a';
      if Question[i] in ['ç'] then Question[i]:='c';
      if Question[i] in ['ô'] then Question[i]:='o';
    end;
     
    //Ici, on a supprimé les majuscules, tous les accents, et la ponctuation
     
    Mots:=TStringList.Create;
    Mots.Delimiter:=' ';
    Mots.DelimitedText:=Question;
     
    //Ici, la phrase est dans un tableau. Pour tester si la phrase contient un mot, il suffit de faire : Mots.IndexOf('bonjour') qui renvoie une valeur différente de -1 si le mot est présente dans la phrase.
     
    Mots.Free;
    Premièrement, nous effacons les caracteres spéciaux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Question:=LowerCase(Question);
     
    for i:=0 to Length(Question) do
    begin
      if Question[i] in ['.',';',',','?',':','!','(',')',''''] then Question[i]:=' ';
      if Question[i] in ['é','è'] then Question[i]:='e';
      if Question[i] in ['à','â'] then Question[i]:='a';
      if Question[i] in ['ç'] then Question[i]:='c';
      if Question[i] in ['ô'] then Question[i]:='o';
    end;
    La boucle parcours tout les caractères, et les change si nécéssaire. La fonction LowerCase permet de rendre le texte en minuscules.

    Ensuite nous nous servons d'une TStringList.

    Le TStringList est un type spécialement utilisé pour stocker et manipuler plusieurs chaines de caractères (ajouter, supprimer, etc.) un peu a la manière d'un tableau.
    Pour l'utiliser, il faut (comme tous les objets) le créer, et a la fin, le libérer. Voici comment faire (notre variable s'appelle Mots) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Mots:=TStringList.Create;   //Création
    ...
    Mots.Free;   //Libération
    Ensuite, une fois créée, nous pouvons nous servir de cette liste. Nous la remplissons de manière automatique. Nous lui donnons le caractere de délimitation (ici l'espace), et la phrase à analyser. La liste découpe la phrase au niveau des espaces, et récupère une liste qui contient plusieurs chaines de caracteres (chacune est un mot de la phrase initiale).

    C'est le rôle de ces 2 lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Mots.Delimiter:=' ';
    Mots.DelimitedText:=Question;
    Ensuite, nous pouvons accéder a chaque mot de la liste en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mots[i];     //L'utilisation est la même que pour un tableau
    Dans ton cas, nous allons nous servir d'une procedure très utile, qui est IndexOf. Cette fonction prend en argument une chaine de caractere, et regarde si une chaine de sa liste est identique a la chaine en argument. Si c'est le cas, cette fonction retourne la position (= le numéro de la case) du mot recherché. Si elle ne le trouve pas, elle renvoie -1.

    Donc, en combinant tout ca, nous obtenons le code cité plus haut.

    Exemple :

    La phrase saisie est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Salut, je m'appelle Julien.
    Après la première boucle for, notre phrase est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    salut  je m appelle julien
    Quand nous remplissons notre liste, nous obtenons une liste comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    salut
    je
    m
    appelle
    julien
    Si nous faisons un IndexOf('appelle'), la fonction nous renvoie 3 (la position dans la liste). Donc le test (IndexOf('appelle')<>-1) est vrai, ce qui signifie que le mot est présent dans ta liste.

    Maintenant, tu cherches a récupérer le prénom. Normalement, dans la plupart des cas, le prénom devrait être le mot juste après "appelle". Donc, nous pourrions l'afficher en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WriteLn('Enchanté, ',Mots[I+1]);    //I est la position du mot 'appelle' dans la phrase.
    J'espere avoir été clair, si ce n'est pas le cas, dis le moi.

    Bonne chance

  20. #40
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2011
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 47
    Points : 17
    Points
    17
    Par défaut
    nan t'inquiète si je viens apprendre quelques truc ici, c'est pas pour ignorer les réponses qui me sont proposés , j'y avait même passé du temps sur ca, au début j'ai fait du copier coller, après j'ai changé tous les "question" de ton code pas des "a" pour voir si ca marchait mieux, j'avais essayé d'autre truc mais je pouvais pas avancer comme je comprenais pas le code lui même, par exemple je ne sais même pas ce que signifie TStringList donc j'avais décider d'en rester a ce que je comprenais

    alors procédons étapes par étapes,
    pour les caractères spéciaux:
    1) chaques fois que tu écris "question" et "question[i]" c'est ma variable "a"?
    si c'est ca il va vraiment falloir que je change son nom (même si ca va me prendre du temps de changer pour toutes les lignes)

    2)
    a quoi correspond le "for i=0"
    chez moi le "i" n'est jamais égal a 0 puisque il me sert de random quand il y a plusieurs réponses possible, pour varier un peu (genre les phrases incomprises j'entre plusieurs phrases, une pour i=1 une autre pour i=2 ... et le random détermine laquelle choisir)

    3) que signifie le "length" dans la boucle for?

Discussions similaires

  1. Réponses: 14
    Dernier message: 09/04/2004, 13h44
  2. [amc designer] création d'une base postgresql
    Par david42 dans le forum PostgreSQL
    Réponses: 9
    Dernier message: 12/03/2004, 11h08
  3. Création d'une base avec IbConsole
    Par Lucien dans le forum Outils
    Réponses: 3
    Dernier message: 02/03/2004, 18h34
  4. création d'une batabse .gdb
    Par jejestyle dans le forum Bases de données
    Réponses: 3
    Dernier message: 23/02/2004, 00h29
  5. [BES] Création d'une variable d'environnement
    Par NGI80 dans le forum Autres
    Réponses: 2
    Dernier message: 17/10/2002, 07h31

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