pb table de hachage

pb table de hachage - Perl - Programmation

Marsh Posté le 16-04-2006 à 17:26:03    

Bonjour à tous
 
Je souhaite crée un minidictionnaire de synonymes
Pour cela j'ai un fichier dictionaire qui  décrit une vedette puis ses synonymes. Voici un exemple :
 
satisfaire:accomplir,ex�uter,faire,observer,respecter,tenir
se conformer:observer,respecter,suivre,tenir
se maintenir:pers��er,tenir
soutenir:continuer,d�endre,maintenir,pers��er,suivre,supporter,tenir
suivre:accomplir,continuer,observer,respecter,se conformer,soutenir,tenir
supporter:maintenir,soutenir,tenir
tenir:accomplir,arr�er,conserver,continuer,d�endre,ex�uter,faire,garder,maintenir,manier,observer,occuper,pers��er,respecter,retenir,satisfaire,se conformer,se maintenir,soutenir,suivre,supporter
 
Pour obtenir un minidictionnaire, je définie une vedette principale. je regarde les synonymes de ma vedette. Puis je dois les comparer avec les autres synonymes des autres vedettes.
 
Si "tenir" est ma vedette principale , je dois comparer  ses synonymes avec ceux des autres vedettes (dans l'exemple de dico audessus, je dois donc comparer avec satisfaire, se conformer, se maintenir, ..., supporter)
Je ne conserve que les synonymes qui sont identiques à ceux de tenir. J'obtiens donc un nouveau dico appelé minidico.
J'ai donc utilisé les tables de hachage (s'il quelqu'un a une autres solutions je suis preneur), mais un petitprobleme apparait
des synonymes apparaissen en double  
 
 
 

Code :
  1. #!/usr/bin/perl
  2. $dicopath=".";
  3. $dico="$dicopath/";
  4. $dico.="$ARGV[0]";
  5. $vedetteprincipalepath=".";
  6. $vedetteprincipale.="$ARGV[1]";
  7. $syn=$ARGV[2];
  8. print ("$vedetteprincipale\n" );
  9. #ouverture du dictionnaire
  10. open(DICO, $dico);
  11. #on récupére la liste des synonyme de la vedette principale que l'on met dans un tableau
  12. #@synvedetteprinci=();
  13. while (<DICO> )
  14. {
  15.     ($vedette,$synons)=split(/:/,$_);
  16.     if(($vedette) eq ($vedetteprincipale))
  17.     {
  18. @synvedetteprinci =  split(/,/,$synons);
  19.     }
  20. }
  21. print("je lis le fichier " );
  22. print "$dico";
  23. print("========================================================================================\n" );
  24. close(DICO);
  25. #on compare les synomnyme de chaque vedette avec le résultat des synonyme de la vedette principal
  26. #S'il le synonyme apparait dana la liste on le conserve sinon on continue
  27. #on construit ainsi le nouveau minidico
  28. open(DICO, $dico);
  29. while (<DICO> )
  30. {
  31. #création de la table de hachage
  32.    ($vedette,$syno)=split(/:/,$_);
  33.     %tmp_vs=($vedette,$syno);
  34.     %ved_syn=(%ved_syn,%tmp_vs);
  35. }
  36. while (($local_ved,$local_syno) = each %ved_syn)
  37. {
  38.     @local_syno2=split(/,/,$local_syno);
  39.     print("%s \n Vedette : $local_ved \n Synonymes: \n" );
  40.     foreach $synotmp (@local_syno2){
  41. foreach $synvedette (@synvedetteprinci){
  42.     if($synvedette =~ $synotmp){
  43. #on regarde s'il le synonyme "synotmp" appartient au  synonyme de ma vedette principale
  44.   print (" \t $synotmp \n" );
  45.      }
  46. }
  47.     }
  48. }
  49. close(DICO);
  50. #on enregistre le résultat dfans le fichier
  51. open(SYN,">$syn" );
  52. print(SYN @synreduit);
  53. close(SYN);


 
 
voici un copier coller de mon résultat
 
 tenir
je lis le fichier ./minidico2_tenir.txt========================================================================================
%s
 Vedette : se maintenir
 Synonymes:
         pers��er
%s
 Vedette : satisfaire
 Synonymes:
         accomplir
         ex�uter
         faire
         faire
         observer
         respecter
%s
 Vedette : soutenir
 Synonymes:
         continuer
         d�endre
         maintenir
         maintenir
         pers��er
         suivre
         supporter
%s
 Vedette : supporter
 Synonymes:
         maintenir  
         maintenir         //NE DEVREZ PAS REAPPAITRE UNE DEUXIEME FOIS
         soutenir
%s
 Vedette :
 
 Synonymes:
%s
 Vedette : suivre
 Synonymes:
         accomplir
         continuer
         observer
         respecter
         se conformer
         soutenir
%s
 Vedette : se conformer
 Synonymes:
         observer
         respecter
         suivre
%s
 Vedette : tenir
 Synonymes:
         accomplir
         arr�er
         conserver
         continuer
         d�endre
         ex�uter
         faire
         faire
         garder
         maintenir
         maintenir
         manier
         observer
         occuper
         pers��er
         respecter
         retenir
         satisfaire
         se conformer
         se maintenir
         soutenir
         suivre
         supporter
 
 
 
si quelqu'un peut m'aider pour ceprobleme ca serait cool.
 
Cordialement
Fessebleu

Reply

Marsh Posté le 16-04-2006 à 17:26:03   

Reply

Marsh Posté le 18-04-2006 à 19:40:25    

Salut,
 
je crois que maintenir sort deux fois à cause de l'existence aussi de se maintenir.  
A vrai dire je n'ai pas trop décortiqué ton code.
J'ai fait une autre approche concernant ton traitement et d'après le résultat j'ai tiré cette conclusion.
Peut être je n'ai par raison.
 
Voilà mon script (j'ai utilisé ta liste des verbes et j'ai ajouté de choses bidon pour tester).
 
Le fichier dico.txt sur le quel j'ai travaillé

Code :
  1. satisfaire:accomplir,exécuter,faire,observer,respecter,tenir
  2. se conformer:observer,respecter,suivre,tenir
  3. se maintenir:persister,tenir
  4. soutenir:continuer,défendre,maintenir,persister,suivre,supporter,tenir
  5. suivre:accomplir,continuer,observer,respecter,se conformer,soutenir,tenir
  6. supporter:maintenir,soutenir,tenir
  7. tenir:accomplir,arrêter,conserver,continuer,défendre,exécuter,faire,garder,maintenir,manier,observer,occuper,persister,respecter,retenir,satisfaire,se conformer,se maintenir,soutenir,suivre,supporter
  8. aa:gg,fd,dssd,dfsd,dsf,tt
  9. bb:dsf,fd,gg,rrr
  10. gg:dsf,dssd,rrr,tt

Le script

#! /usr/bin/perl
 
use warnings;
use strict;
 
 
my %total_verbe;
my %result_verbe;
my @affiche;
 
# ouvrir handle vers.* dico.txt
 
open DICO,"dico.txt" or die "E/S : $!\n";
 
# récuperation des données
 
while (<DICO> ) {
  my ($verbe,$liste_synonyme) = split /:/,$_,2;
  push @{$total_verbe{$verbe}}, split /,/,$liste_synonyme ;
}
 
# la vedette principale (ton cas tenir)
 
print "Entrez le verbe vedette principale : " and chomp(my $vedette_p =<STDIN> );
 
# récuperation des verbes qu'ont parmi les synonymes la vedette principale
# ton cas : satisfaire, se conformer........,supporter
 
foreach (keys %total_verbe) {
  if( grep { /$vedette_p/ } @{$total_verbe{$_}} ) {
    push @{$result_verbe{$_}}, @{$total_verbe{$_}};
  }
}
# affichage des verbes qu'ont comme synonyme le verbe vedette principale (tenir)
 
print "Verbes qu'ont comme synonyme la vedtte principalle $vedette_p :\n";
foreach (sort keys %result_verbe) {
  print "$_\n";
}
 
# le verbe à afficher à la demande
print "Entre le verbe à consulter : " and chomp(my $v =<STDIN> );
 
foreach my $vv ( @{$result_verbe{$v}} ) {
  push  @affiche, grep { /$vv/ } @{$total_verbe{$vedette_p}};
}
 
{
  local $"="\n";
  print "$v : \n@affiche\n";
}

Le resultat

Code :
  1. lami20j@debian:~/bin/my_deb_perl$ perl dico_hardware.pl
  2. Entrez le verbe vedette principale : tenir
  3. Verbes qu'ont comme synonyme la vedtte principalle tenir :
  4. satisfaire
  5. se conformer
  6. se maintenir
  7. soutenir
  8. suivre
  9. supporter
  10. tenir
  11. Entre le verbe à consulter : supporter
  12. supporter :
  13. maintenir
  14. se maintenir
  15. soutenir
  16. lami20j@debian:~/bin/my_deb_perl$ perl dico_hardware.pl
  17. Entrez le verbe vedette principale : tenir
  18. Verbes qu'ont comme synonyme la vedtte principalle tenir :
  19. satisfaire
  20. se conformer
  21. se maintenir
  22. soutenir
  23. suivre
  24. supporter
  25. tenir
  26. Entre le verbe à consulter : se maintenir
  27. se maintenir :
  28. persister
  29. lami20j@debian:~/bin/my_deb_perl$ perl dico_hardware.pl
  30. Entrez le verbe vedette principale : tenir
  31. Verbes qu'ont comme synonyme la vedtte principalle tenir :
  32. satisfaire
  33. se conformer
  34. se maintenir
  35. soutenir
  36. suivre
  37. supporter
  38. tenir
  39. Entre le verbe à consulter : soutenir
  40. soutenir :
  41. continuer
  42. défendre
  43. maintenir
  44. se maintenir
  45. persister
  46. suivre
  47. supporter
  48. lami20j@debian:~/bin/my_deb_perl$ perl dico_hardware.pl
  49. Entrez le verbe vedette principale : gg
  50. Verbes qu'ont comme synonyme la vedtte principalle gg :
  51. aa
  52. bb
  53. Entre le verbe à consulter : aa
  54. aa :
  55. dssd
  56. dsf
  57. tt
  58. lami20j@debian:~/bin/my_deb_perl$ perl dico_hardware.pl
  59. Entrez le verbe vedette principale : gg
  60. Verbes qu'ont comme synonyme la vedtte principalle gg :
  61. aa
  62. bb
  63. Entre le verbe à consulter : bb
  64. bb :
  65. dsf
  66. lami20j@debian:~/bin/my_deb_perl$

Je n'ai pas traité l'écriture de résultat dans un autre fichier.
C'est possible qu'à cause des balises les slashes ou antislashes n'apparaissent pas comme dans le script. Je vais regarder une fois
le message valider.
 
lami20j


Message édité par lami20j le 18-04-2006 à 20:13:39
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed