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

Langage Perl Discussion :

Recherche de mots


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Par défaut Recherche de mots
    Bonjour,

    Je souhaite tester si tous les mots d'un fichier existent dans un deuxième fichier.
    J'ai inséré tous les mots de chaque fichier dans un tableau.

    1er fichier:

    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
    open $fic,'<',$dico or die "fichier non ouvert\n";
    # je stocke les mots du dictionnaire dans un tableau
    while (<$fic>) {
      for $e(split){
        $e=~s/ //g;
        push @dico_words,$e;
      }
    }
    close $fic;
     
    @que_dans_dico{@dico_words}=();
     
    2eme fichier:
    open ARA, "".$mytrad."" or die "$mytrad does not exist";
     
    @allMots=();
    while ($line =<ARA>) {
    	$line=~s/\n//g;
    	@mots = split (/ /,$line);
     
    	foreach $mot (@mots){
    		push(@allMots,$mot);
    	}
     
    }
    close ARA;
     
    print "mots qui n'existent pas \n";
     
    foreach $mot(@allMots){
    	if ( grep( /^$mot$/,@dico_words ) ) {
    	   print "Matched $mot\n";
    	} else {
    	   print "Not Matched $mot\n";
    	}
     
    }
    J'ai utilisé grep mais c'est une fonction lourde.. en plus elle ne m'affiche pas les mots contenant certains caracteres comme le $ par exemple..

    Est ce que qq'un a une meilleure idée de recherche de mots d'un fichier dans un autre fichier?

    Merci

  2. #2
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    Tu devrais utiliser des hash, avec les mots comme clés. Les avantages sont d'une part que chaque mot n'y figurera qu'une fois, même s'il apparaît plusieurs fois dans le texte examiné (ce qui, certes, ne devrait pas être le cas du dictionnaire), et d'autre part la recherche y est beaucoup plus efficace qu'un grep.

    Cherche un peu dans cette direction.

  3. #3
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Par défaut
    Il me semble que si j'utilise un tableau, chaque mot apparaitra une seule fois aussi!

    Je me suis dirigé vers l'idée de faire deux boucles imbriquées foreach afin de parcourir les tableaux mot par mot et tester..

    Je ne sais pas c'est quoi la différence avec le hashage? est ce qu'il y a vraiment un gain de temps ou c'est pareil?

  4. #4
    Membre chevronné
    Avatar de Schmorgluck
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2006
    Messages : 371
    Par défaut
    Citation Envoyé par sousou_ Voir le message
    Il me semble que si j'utilise un tableau, chaque mot apparaitra une seule fois aussi!
    Pas du tout, un tableau peut contenir 50 fois la même donnée. Et comme à aucun moment dans ton script tu ne vérifie si le mot est déjà présent...

    Je me suis dirigé vers l'idée de faire deux boucles imbriquées foreach afin de parcourir les tableaux mot par mot et tester..
    Inefficace. Ça peut éventuellement valloir le coup, dans un but d'économie de mémoire, si l'un de tes fichiers est très gros, mais ça sera très lent à exécuter (même si on peut envisager des optimisations).

    Je ne sais pas c'est quoi la différence avec le hashage? est ce qu'il y a vraiment un gain de temps ou c'est pareil?
    Oui, gain de temps très important. Lis la FAQ pour en savoir davantage.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Citation Envoyé par sousou_ Voir le message
    Il me semble que si j'utilise un tableau, chaque mot apparaitra une seule fois aussi!

    Je me suis dirigé vers l'idée de faire deux boucles imbriquées foreach afin de parcourir les tableaux mot par mot et tester..

    Je ne sais pas c'est quoi la différence avec le hashage? est ce qu'il y a vraiment un gain de temps ou c'est pareil?
    Oui il y a un gain de temps très important en utilisant le hash comme structure de données pour le dictionnaire au lieu d'une recherche séquentielle, surtout si le dictionnaire est de taille significative.

  6. #6
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    127
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 127
    Par défaut
    JE vous remercie pour vos réponses !
    Est ce que je dois remplacer les tableaux par des hash?
    J'ai regardé le FAQ, et d'après ce que j'ai compris dans le tableau de hashage il n'ya pas d'ordre et donc il serait inutile de faire les boucles for imbriquées à la fin?

    Comment pourrais-je alors lancer la recherche?

    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
     
    open $fic,'<',$dico or die "fichier non ouvert\n";
    # je stocke les mots du dictionnaire dans un tableau                                                                                                     
    while (<$fic>) {
      for $e(split){
        $e=~s/ //g;
        push @dico_words,$e;
      }
    }
    close $fic;
    @que_dans_dico{@dico_words}=();
     
    #Extraction de mots inconnus en utilisant le dictionnaire                                                                                                
    open ARA, "".$mytrad."" or die "$mytrad does not exist";
    @allMots=();
    while ($line =<ARA>) {
            $line=~s/\n//g;
            @mots = split (/ /,$line);
            $n = 0;
            foreach $mot (@mots){
                    push(@allMots,$mot);
            }
     
    }
    close ARA;
     
    print "mots qui n'existent pas dans le dico \n";
    foreach $mot(@allMots){
        # 0 = mot non trouve, sinon 1                                                                                                                        
        $motTrouve="0";
        foreach $e(@dico_words){
    	if ( "$mot" eq "$e" ) {
                $motTrouve="1";
            }
        }
        if (("$motTrouve" eq "0") && ( "$mot" ne "_")) {
            print "mot non trouvé $motTrouve , $mot\n";
            open (BWFILE, ">> $res") or die "Impossible d'ouvrir file en ajout : $!\n";
            print BWFILE "$mot\n";
            close(BWFILE);
        }
    Merci.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Le hash devrait remplacer le tableau pour le dictionnaire uniquement. Un hash associe une valeur à une clef. La clef du hash serait le mot du dictionnaire, et la valeur n'a pas d'importance, on peut mettre 1 par exemple.

    Le code:
    est à remplacer par:
    à supposer que %dico_hash soit déclaré plus haut dans le code.


    Ensuite ce bout de code de recherche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        $motTrouve="0";
        foreach $e(@dico_words){
    	if ( "$mot" eq "$e" ) {
                $motTrouve="1";
            }
        }
        if (("$motTrouve" eq "0") && ( "$mot" ne "_")) {
          .. suite ...
    peut être remplacé par la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     if ( (!exists $dico_hash{$mot}) &&  ( "$mot" ne "_")) {
      ... suite...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Recherche sur mots de 3 lettres
    Par mamizo dans le forum Bases de données
    Réponses: 7
    Dernier message: 16/02/2005, 14h59
  2. [TP]Recherche de mots dans un Doc.
    Par Loceka dans le forum Turbo Pascal
    Réponses: 8
    Dernier message: 04/10/2004, 19h04
  3. Recherche des mots contenant ...
    Par Asdorve dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/06/2004, 10h23
  4. Réponses: 10
    Dernier message: 22/05/2004, 13h51
  5. Recherche multi-mots sur une seule colonne
    Par Badiste dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2004, 11h24

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