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 :

table de hachage perl


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 20
    Points
    20
    Par défaut table de hachage perl
    Bonjour,

    Je voudrais indexer ma base qui contient 10 documents par une liste de mots. Ma liste de mots se présente dans un fichier comme ci-dessous:
    mot1
    mot2
    mot3
    mot4

    le resultat escompté est un fichier qui se présente sous la forme suivante où chaque ligne représente la frequence du mot dans le document de la base:
    D1 D2.....D10
    mot1 f11 f12....f110
    mot2 f21 f22....f210
    mot3 f31 f32....f310
    mot4 f41 f42....f410

    Merci de votre aide

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 427
    Points : 459
    Points
    459
    Par défaut
    ce que tu veux faire est un index inversé
    cherche sur cpan les termes inverted index et tu trouvera ton bonheur

    par exemple:
    Search-Mousse
    Search::InvertedIndex
    Kinosearch
    Plucene (a eviter, tres lent)
    Lucene
    CLucene
    DBIx-TextIndex
    Xapian
    Freq
    Swish-e
    Search-Indexer

    etc...
    Recherche staigiaire(s) motivé(s) sur projet perl/reseau a grande echelle. Me contacter par mp.

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2004
    Messages
    48
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 48
    Points : 20
    Points
    20
    Par défaut table de hachage perl
    Bonjour ,

    J'ai essayé ce bout de code mais ça marche pas:
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
     
    open(fid_doc,"corpus.txt") || die ("couldn't open corpus.txt!");
    while (<fid_doc>)
    	{
    	 push(@file_doc,$_); #Files constituting the corpus
    	}
    close(fid_doc);
     
    $N_doc = $#file_doc + 1;
     
    foreach $i (0..$#file_doc) 
    	{
    	 &occurrence($file_doc[$i]);
    	 #print $file_doc[$i]. "\n";
    	}
     
     
    open(fid_req,"requete.txt") || die ("couldn't open requete.txt!");
    while (<fid_req>)
    	{
    	 push(@file_req,$_); #Files constituting the queries
    	}
    close(fid_req); 
    $N_req = $#file_req + 1;
     
    foreach $i (0..$#file_req)
    	{
    	 &occurrence_req($file_req[$i],$i);
    	 #print $file_req[$i]. "\n";
    	}
     
    #**************************************************************
    display(corpus_traited_word,terms_traited_word,graphe_word,\%occurrence_matrix);
    #**************************************************************
    #			
    #**************************************************************
    #			occurrence procedure
    #**************************************************************
    sub occurrence
    {
     my @word_list;
     open(fid,$_[0]) || die ("couldn't open file.txt!");
     while (<fid>)
    	{
    	 @word_list = (@word_list,split(/[\n\*]/,$_));
    	}
     close(fid); 
     
     
    #**************************************************************
     foreach $word (@word_list) 
    	{
    	 @{$occurrence_matrix{$word}}[$_[1]]++;
             #print $word;
    	}
     delete $occurrence_matrix{""};
     
    }
    #**************************************************************
    #**************************************************************
    #			occurrence_req procedure
    #**************************************************************
    sub occurrence_req
    {
     my @word_list;
     open(fid,$_[0]) || die ("couldn't open file.txt!");
     while (<fid>)
    	{
    	 @word_list = (@word_list,split(/[\*\n]/,$_));
     
    	}
     close(fid); 
     
    $i = 0;
    while ($i<$#word_list)
     	{
    	 if(@{$occurrence_matrix{$word_list[$i]}} != undef)
    		{
    		 @{$occurrence_matrix{$word_list[$i]}}[$_[1]]= $word_list[$i+1] ;
      print $word_list[0];
    		}
           $i=$i+2
    	}
    delete $occurrence_matrix{""};
     
    }
     
     
     
    #**************************************************************
    #			Displaying the Results
    #**************************************************************
    sub display
    	{
    	 open(fid,">$_[0].txt") || die ("couldn't open corpus_traited.txt!");
    	 open(fid_t,">$_[1].txt") || die ("couldn't open terms_traited.txt!");
    	 open(fid_g,">$_[2].txt") || die ("couldn't open graphe.txt!");
    	 my $ref_occurrence_matrix;
    	 $ref_occurrence_matrix = $_[3];
         	 @key = keys(%{$ref_occurrence_matrix});
         	 foreach $i (0..$#key) 
           		{
            	 if (length(@key[$i]) == 2)
        	 		{
        	  		 delete $$ref_occurrence_matrix{@key[$i]};
        	 		}
           		}
         	 @key = sort(keys(%{$ref_occurrence_matrix}));
             $N_mot = $#key + 1;
         	 print fid "nombre de documents: $N_doc", "\n";
          	 print fid "nombre de requetes: $N_req", "\n";
         	 print fid "nombre de mots: $N_mot", "\n";
         	 print fid_g "$N_doc $N_req $N_mot", "\n";
         	 foreach $i (0..$#key) 
           		{
            	 print fid @key[$i];
    		 print fid_t @key[$i];
            	 for($j = 0;$j <= ($#file_doc + $N_req);$j ++) 
         	 		{
        	  		 print fid "\t";
    			 if(${$$ref_occurrence_matrix{@key[$i]}}[$j] == undef)
        		 		{
        		 		 print fid "0";
        	 	 		 print fid_g "0 ";
        				}
        	  		 else
        				{
        		  		 print fid ${$$ref_occurrence_matrix{@key[$i]}}[$j];
        		 		 print fid_g "${$$ref_occurrence_matrix{@key[$i]}}[$j] ";
        		 		}
        	 		}
             	 print fid "\n";
    		 print fid_t "\n";
              	 print fid_g "\n";
           		}
            close(fid); 
    	close(fid_t);
            close(fid_g); 
    	}
    J'ai une liste de mots dans un fichier corpus.txt sous la forme suivante:
    mot1
    mot2
    ..
    et ma liste de documents est dans le fichier requete.txt où chaque document est sous la forme suivante:
    mot1 * freq du mot1
    je veux avoir le resultat suivant:

    mot1 freq11 freq12
    mot2 freq21 freq22
    où chaque mot a sa frequence dans le document
    merci de votre aide

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2006
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 38
    Points : 34
    Points
    34
    Par défaut
    déja si tu met ton code il faudrait l'erreur que génère ce code si tu dis qu'il marche pas

    Sinon je ferais quelque chose comme ça pour ton problème :

    1/ si j'ai bien compris ton problème le fichier corpus.txt ne te sert à rien l'information est déjà dans tes fichiers document (listés eux même dans requete.txt)

    2/ voila donc le code que je testerais :

    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
     
    open(fid_req,"requete.txt") || die ("couldn't open requete.txt!");
    while (<fid_req>) {
             chomp;
    	 push(@file_req,$_); #Files constituting the queries
    }
    close(fid_req); 
     
    foreach $file(@file_req) { ##pour chaque fichier
    	 open(FILE,$file) or die "impossible d'ouvrir $file : $!\n";
    	 while(<FILE>) {
    		  chomp;
    		  @line=split(/[\s\*]/,$_);
    		  $results{$line[0]}{$file}=$line[1];
    	 }
    }
     
    ###AFFICHAGE
    foreach $key(keys %results) {
    	 print "$key";
    	 foreach $file(keys %{$results{$key}}) {
    		  print "\t$results{$key}{$file}";
    	 }
    	 print "\n";
    }

Discussions similaires

  1. mettre un fichier xml dans un table de hachage perl
    Par tunwim dans le forum Langage
    Réponses: 26
    Dernier message: 27/03/2013, 21h21
  2. Réponses: 9
    Dernier message: 15/03/2013, 16h18
  3. [PERL] - Table de hachage
    Par Lolie11 dans le forum Langage
    Réponses: 3
    Dernier message: 08/04/2009, 12h03
  4. [Conception] Table de hachage et doublons de clés
    Par mammou dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 13/05/2004, 19h16
  5. Réponses: 2
    Dernier message: 05/02/2004, 12h54

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