Partage
  • Partager sur Facebook
  • Partager sur Twitter

traitement de texte dans un dictionnaire

C#

Sujet résolu
    9 décembre 2021 à 21:27:07

    Bonjour, j'ai écrit un programme pour traiter un texte le placer dans un dictionnaire et son occurence comme valeur.
    Par contre au moment ou je dois extraire certaine mot inutile, j'ai pas réussis à le faire.
    J'ai créer une liste pour mettre ces mots. Par contre au moment de comparait les éléments.
    Je n'arrive pas à résoudre les messages d'erreur.

    Merci d'avance de votre aide.

    using System;
    using System.Collections.Generic;
    using System.IO;
    
    class sae11
    {
        static void Main()
        {
          Dictionary<string, int> occurencesMots = new Dictionary<string, int>();
          occurencesMots = ConstructionIndex("page1.txt",ConstructionMotVide("mot_vide.txt"));
          Affichage(occurencesMots);
        }
        public static List<string> ConstructionMotVide(string mot_vide_fichier)
        {
          List<string> mot_vide = new List<string>();
          string mot ="";
          StreamReader strReader = new StreamReader(mot_vide_fichier);
          int i = 1;
          while ((mot = strReader.ReadLine())!= null)
          {
          mot_vide.Add(mot);
          }
          i++;
          strReader.Close();
          return mot_vide;
        }
        public static Dictionary<string,int> ConstructionIndex(string nomFichier,List<string> xmot_vide)
        {
          Dictionary<string,int> occurencesMots = new Dictionary<string, int>();
          StreamReader strReader = new StreamReader(nomFichier);
          int i = 1;
          string currLine;
          while ((currLine = strReader.ReadLine()) != null)
          {
          TraitementDeLaLigne(occurencesMots, currLine, xmot_vide);
          i++;
          }
          strReader.Close();
          return occurencesMots;
        }
    
        public static void TraitementDeLaLigne(Dictionary<string, int> xOccurencesMots, string ligne, List<string> xmot_vide)
     {
       string mot = "";
    
     foreach (char ch in ligne)
     {
       foreach (string ch1 in xmot_vide){
    
     if ((!Ignorerchar(ch)) && (!IgnorercharMot_vide(ch1,ch)))
     {
    
     mot += ch;
     }
    
     else if (mot != "")
     {
     AjoutMotdict(xOccurencesMots, mot);
     mot = "";
     }
     }
     }
    }
     public static bool Ignorerchar(char ch)
     {
      bool isIgnored = false;
    
      if ((ch == '\t' || ch == '!' || ch == ' ' || ch == '?' || ch == '.' || ch == ':' || ch == ';' || ch == ','|| ch == '’'))
      {
      isIgnored = true;
      }
      return isIgnored;
     }
    
     public static bool IgnorercharMot_vide(char xch,char xch1)
     {
      bool isIgnored = false;
    
      if ((xch1.CompareTo(xch)) == 0)
      {
      isIgnored = true;
      }
      return isIgnored;
     }
        public static void AjoutMotdict(Dictionary<string,int> xOccurencesMots, string mot)
       {
        int compteur = 0;
       if (!xOccurencesMots.ContainsKey(mot))
       {
      compteur=compteur+1;
       xOccurencesMots.Add(mot,compteur);
       }
       compteur = compteur+1;
       xOccurencesMots[mot]=compteur;
       }
    
        public static void Affichage(Dictionary<string,int> xOccurences)
       {
       foreach (KeyValuePair<string, int> occ in xOccurences)
       {
         Console.Write(occ.Key + ": " +occ.Value +",");
         Console.WriteLine();
       }
       }
    
      }
    



    • Partager sur Facebook
    • Partager sur Twitter
      10 décembre 2021 à 8:21:56

      Salut,

      Tu devrais mettre le message d'erreur en question, ça éviterait de devoir copier le code et l’exécuter pour t'aider (pour la prochaine fois).

      Apparemment le problème est ligne 50:

       if ((!Ignorerchar(ch)) && (!IgnorercharMot_vide(ch1,ch)))

      Ta fonction IgnorercharMot_vide prend un char et une string en paramètre et tu lui envoie deux char.

      Commence par corriger ça et fais nous un retour.

      • Partager sur Facebook
      • Partager sur Twitter
      Fatalement vôtre
        10 décembre 2021 à 13:14:09

        D.Fate a écrit:

        Salut,

        Tu devrais mettre le message d'erreur en question, ça éviterait de devoir copier le code et l’exécuter pour t'aider (pour la prochaine fois).

        Apparemment le problème est ligne 50:

         if ((!Ignorerchar(ch)) && (!IgnorercharMot_vide(ch1,ch)))

        Ta fonction IgnorercharMot_vide prend un char et une string en paramètre et tu lui envoie deux char.

        Commence par corriger ça et fais nous un retour.

        J'ai mis un .ToString mais maintenant j'obtient pas ce que je veux. Je voulais juste avoir en clé les mots du fichier et juste ignorer celle du fichier mot_vide.

        if ( (!Ignorerchar(ch)) && (!IgnorercharMot_vide(ch1,mot1)) )
        public static bool IgnorercharMot_vide(string xch,string xch1)

        J'obtient : 

        jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: 2,
        AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu: 2,
        tttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttttrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss: 2,
        qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqquuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: 2,
        

        au lieu de :

        mot,nboccurence,
        mot2,nboccurence,
        ...



        • Partager sur Facebook
        • Partager sur Twitter
          10 décembre 2021 à 14:59:47

          Pour tester si un élément est dans une liste, pourquoi ne pas utiliser ce qui existe déjà à savoir Contains

          listemot.Contains(mot)  retourne True si mot est présent dans la listemot

          foreach(char ch in ligne) découpe ta ligne en lettre; si tu veux découper la ligne en mot un foreach(String mot in ligne.Split()) fonctionnera mieux

          ligne.Split() découpe la chaine selon un séparateur (par défaut l'espace, mais on peut lui passer un ensemble de séparateurs (ligne.Split({' ','.','?','\t','!'}) par exemple) https://docs.microsoft.com/fr-fr/dotnet/api/system.string.split?view=net-6.0 

          -
          Edité par umfred 10 décembre 2021 à 15:03:24

          • Partager sur Facebook
          • Partager sur Twitter
            10 décembre 2021 à 18:06:22

            umfred a écrit:

            Pour tester si un élément est dans une liste, pourquoi ne pas utiliser ce qui existe déjà à savoir Contains

            listemot.Contains(mot)  retourne True si mot est présent dans la listemot

            foreach(char ch in ligne) découpe ta ligne en lettre; si tu veux découper la ligne en mot un foreach(String mot in ligne.Split()) fonctionnera mieux

            ligne.Split() découpe la chaine selon un séparateur (par défaut l'espace, mais on peut lui passer un ensemble de séparateurs (ligne.Split({' ','.','?','\t','!'}) par exemple) https://docs.microsoft.com/fr-fr/dotnet/api/system.string.split?view=net-6.0 

            -
            Edité par umfred il y a 13 minutes

            J'ai ajouté le split tel que :

            foreach (string ch in ligne.Split(' ','.','?','\t','!') )

            Y a un erreur

            Unhandled Exception:
            System.ArgumentException: An item with the same key has already been added. Key: M
              at System.Collections.Generic.Dictionary`2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) [0x00196] in <12b418a7818c4ca0893feeaaf67f1e7f>:0 
              at System.Collections.Generic.Dictionary`2[TKey,TValue].Add (TKey key, TValue value) [0x00000] in <12b418a7818c4ca0893feeaaf67f1e7f>:0 
              at dictionnaire.AddWord2 (System.String xmot, System.String cle, System.Int32 valeur, System.Collections.Generic.Dictionary`2[TKey,TValue] XoccurencesMotsMod) [0x0000c] in <8f516d9069eb46e4820fc1341261afa8>:0 
              at dictionnaire.ExtractionMot_vide (System.Collections.Generic.Dictionary`2[TKey,TValue] XoccurencesMots, System.Collections.Generic.List`1[T] Xmot_vide) [0x0004a] in <8f516d9069eb46e4820fc1341261afa8>:0 
              at dictionnaire.Main () [0x00028] in <8f516d9069eb46e4820fc1341261afa8>:0 
            [ERROR] FATAL UNHANDLED EXCEPTION: System.ArgumentException: An item with the same key has already been added. Key: M
              at System.Collections.Generic.Dictionary`2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) [0x00196] in <12b418a7818c4ca0893feeaaf67f1e7f>:0 
              at System.Collections.Generic.Dictionary`2[TKey,TValue].Add (TKey key, TValue value) [0x00000] in <12b418a7818c4ca0893feeaaf67f1e7f>:0 
              at dictionnaire.AddWord2 (System.String xmot, System.String cle, System.Int32 valeur, System.Collections.Generic.Dictionary`2[TKey,TValue] XoccurencesMotsMod) [0x0000c] in <8f516d9069eb46e4820fc1341261afa8>:0 
              at dictionnaire.ExtractionMot_vide (System.Collections.Generic.Dictionary`2[TKey,TValue] XoccurencesMots, System.Collections.Generic.List`1[T] Xmot_vide) [0x0004a] in <8f516d9069eb46e4820fc1341261afa8>:0 
              at dictionnaire.Main () [0x00028] in <8f516d9069eb46e4820fc1341261afa8>:0 
            

            Je pense que je vais faire autrement parce que y a rien qui marche.



            • Partager sur Facebook
            • Partager sur Twitter
              10 décembre 2021 à 18:31:23

              c'est quoi le code de ta fonction AddWord2 appelé par ExtractionMot_vide ? le message dit que la clé 'M' existe déjà dans le dictionnaire (ta fonction initiale ContructionMotVide fonctionnait bien )

              tu as compris qu'avec le split, ch parcours chaque mot de ligne et qu'ensuite, il suffit de regarder avec xmotvides.contains(ch) si ta clé ch existe ou pas

              • Partager sur Facebook
              • Partager sur Twitter
                13 décembre 2021 à 8:58:11

                umfred a écrit:

                c'est quoi le code de ta fonction AddWord2 appelé par ExtractionMot_vide ? le message dit que la clé 'M' existe déjà dans le dictionnaire (ta fonction initiale ContructionMotVide fonctionnait bien )

                tu as compris qu'avec le split, ch parcours chaque mot de ligne et qu'ensuite, il suffit de regarder avec xmotvides.contains(ch) si ta clé ch existe ou pas


                Merci pour votre aide j'ai réussi à faire par contre je sais pas comment traiter si y a une majuscule dans le mot (si mot début de phrase).
                • Partager sur Facebook
                • Partager sur Twitter
                  14 décembre 2021 à 8:25:15

                  Désolé c'est une erreur de message

                  -
                  Edité par LepiigorTV 14 décembre 2021 à 8:25:53

                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 décembre 2021 à 10:30:19

                    >si y a une majuscule dans le mot (si mot début de phrase).

                    https://docs.microsoft.com/fr-fr/dotnet/api/system.string.tolower?view=net-6.0

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                      16 décembre 2021 à 9:05:34

                      bacelar a écrit:

                      >si y a une majuscule dans le mot (si mot début de phrase).

                      https://docs.microsoft.com/fr-fr/dotnet/api/system.string.tolower?view=net-6.0

                      Merci pour votre aide mais avant les majuscules j'ai un problème avec le split.
                      Enfet quand j'execute le programme certains des mots sont tout attaché.

                      public static void TraitementDeLaLigne(Dictionary<string, int> xOccurencesMots, string ligne, List<string> xmot_vide)
                       {
                         string mot = "";
                      
                       foreach (string ch in ligne.Split(' ','.','?','\t','!',';',',','’','\n'))
                       {
                         if (!(xmot_vide.Contains(ch))){
                      
                       mot += ch;
                       }
                      
                       else if (mot != "")
                       {
                       AjoutMotdict(xOccurencesMots, mot);
                       mot = "";
                       }
                       }
                       }


                      En sortie j'ai ça :

                      devoir: 2,
                      volontés: 2,
                      madame: 2,
                      mère: 2,
                      CommeMlle: 2,
                      coeurtrèsnoble: 2,
                      trèsbienfait: 2,
                      véritablementtouchée: 2,
                      reconnaissance: 2,
                      procédé: 2,
                      Cettereconnaissancedonna: 2,
                      réponses: 2,
                      paroles: 2,
                      certainair: 2,
                      douceur: 2,
                      suffisait: 2,
                      donner: 2,
                      l'espérance: 2,
                      hommeaussiéperdumentperdu: 2,
                      l'était: 2,
                      sortequ'il: 2,
                      flattad'unepartie: 2,
                      qu'ilsouhaitait: 2,
                      Au: 2,

                      -
                      Edité par m&m'ss 16 décembre 2021 à 9:07:22

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 décembre 2021 à 10:11:45

                        >certains des mots sont tout attaché.

                        Bin oui, c'est fait ligne 9.

                        Reprenez un papier-crayon, c'est un problème d'algorithmie.

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                          16 décembre 2021 à 11:18:43

                          pour rappel: initialement, tu parcourais les lettres de la ligne (foreach(char ch in ligne)), maintenant tu parcours les mots
                          • Partager sur Facebook
                          • Partager sur Twitter

                          traitement de texte dans un dictionnaire

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                          • Editeur
                          • Markdown