Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1239 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  perl + comparaison + xml

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

perl + comparaison + xml

n°2186040
rim_enis
j'aime ENIS
Posté le 16-04-2013 à 11:18:41  profilanswer
 

Bonjour ,
Je débute encore avec perl , j'ai un fichier XML "BaseEtiquette" sous cette forme :

 

<?xml version="1.0" encoding="UTF-8"?>
<listeDesEtiquettes>

 

<mot>
<synonyme>أَيْ</synonyme>
<etiquette>Confirmation</etiquette>
</mot>

 

<mot>
<synonyme>تْفَضَّلْ</synonyme>
<etiquette>Politesse</etiquette>
</mot>
</listeDesEtiquettes>

 

J'ai reussi à récuperer un tableau qui contient tous les synonymes @tabMot  et un tableau des etiquettes @tabEtiquettes ;
j'ai un autre fichier qui contient des phrases , mon but est d'associer pour chaque mot de chaque phrase son etiquette , mon idée est de parcourir les phrases mot par mot et si le mot existe dans @tabMot alors je recupère sa position $pos et je fait une concaténation avec @tabEtiqeutte[$pos] pour avoir en fin un fichier en sortie de la forme suivante :
mot1 <etiquette1> mot 2 <etiquette2> ...
voici un exemple de mon fichier d'entré :
أَيْ تْفَضَّلْ خُويَا
مْعَ وَقْتَاشْ بِاللَهْ إِيْ إِيْ التْرَانْ يِمْشِي
 en fait j'ai essayé le code suivant avec seulement la première phrase de mon fichier d'entré :

Code :
  1. open(F,'E:\\Mastère_2013\\perlXML\\Corpusss.txt') or die ("Erreur d'ouverture " ) ;
  2. my @Ti = <F>;
  3. @words = split(/ /, $Ti[$0]);
  4. for ($i = 0; $i < $#words+1; $i++)
  5. {
  6.   chomp;
  7.   s/^\s+|\s+$//g;
  8.   for($j = 0; $j < $#tabMot+1; $j++)
  9.   {
  10.    chomp;
  11.   s/^\s+|\s+$//g;
  12.   if($words[$i] eq $tabMot[$j])
  13.   {
  14.   my $PosEtiq = $j;
  15.   $words[$i] = $words[$i]." " .$tabEtiquettes[$PosEtiq];;
  16.   print "ok";
  17.   }
  18.   else
  19.   {
  20.   print "no";
  21.   }
  22.   }
  23. }
 

mon problème est que malgré les mots sont egaux mais toujours les résultats sont fausses ...
c'est quoi le problème ?? et y'a t'il une autre solution que me permet d'associer a chaque mot une etiquette sans passer par le tableau @words et sans faire le split
Merci d'avance


Message édité par rim_enis le 16-04-2013 à 11:19:53
mood
Publicité
Posté le 16-04-2013 à 11:18:41  profilanswer
 

n°2186129
gilou
Modérateur
Modzilla
Posté le 16-04-2013 à 20:21:56  profilanswer
 

Bonjour, le problème vient peut être de ce que vous n'êtes plus dans un encodage de base, et qu'il faut l'indiquer explicitement avec un use feature 'unicode_strings';

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. use feature 'unicode_strings';
  6.  
  7. # en entrée, une reference sur un hash %syn et le nom du fichier xml
  8. # en sortie %syn est rempli avec comme les synonymes comme clés et les étiquettes comme valeurs.
  9. sub parseBase ($$) {
  10.  use XML::Simple;
  11.  my $href = shift;
  12.  my $data = XMLin(shift);
  13.  foreach(@{$data->{mot}}) {
  14.    $href->{$_->{'synonyme'}} = $_->{'etiquette'};
  15.  }
  16. }
  17.  
  18.  
  19. my %syn;
  20. parseBase(\%syn, 'BaseEtiquette.xml');
  21.  
  22.  
  23. open my $fh,  "<:utf8", 'corpus.txt';
  24. open my $fh1, ">:utf8", 'result.txt';
  25. my $linenum = 0;
  26. foreach(<$fh> ) {
  27.  # Si BOM initiale
  28.  unless ($linenum++ and /^\x{feff}/) {
  29.    s/^\x{feff}// ;
  30.    print $fh1 "\x{feff}";
  31.  }
  32.  my @words = split /\b/;
  33.  foreach (@words) {
  34.    print $fh1 $_;
  35.    # si le mot figure dans la liste des synonymes
  36.    if ($syn{$_}) {
  37.      print $fh1  " $syn{$_} ";
  38.    }
  39.  }
  40. }
  41. close $fh1;
  42. close $fh;

BaseEtiquette.xml et corpus.txt sont deux fichiers en utf-8 ou j'ai mis vos données exemple.
Le split sur \b (frontière de mots) a des chances d'être plus général que celui sur \s
Le résultat est écrit dans un fichier utf-8, result.txt
Selon les logiciels, l'affichage des lignes mixtes est OK ou non: c'est OK sous emacs, mais l'ordre des mots est inversé sous notepad.
 
A+,

Message cité 1 fois
Message édité par gilou le 16-04-2013 à 23:08:30

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2186150
gilou
Modérateur
Modzilla
Posté le 16-04-2013 à 23:17:24  profilanswer
 

Et sinon, déjà dans votre code,
@words = split(/ /, $Ti[$0]);
C'est complètement faux.
$0 c'est le nom du script perl en cours d'execution.
Donc aucune chance que @words contienne quelque chose.
Et si @words est vide, il n'y aura pas de comparaison d'effectuée.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2186151
rim_enis
j'aime ENIS
Posté le 16-04-2013 à 23:25:45  profilanswer
 

bonsoir,
Merci beaucoup gilou pour votre aide , c'est très gentil de votre part , comment je peux inverser l'ordre des mots puisque je travaille avec notepad ?? et comment je peux ajouter au début et la fin de chaque ligne un mot dans le fichier résultat  ??  
Merci d'avance

n°2186152
rim_enis
j'aime ENIS
Posté le 16-04-2013 à 23:50:28  profilanswer
 

gilou a écrit :

Et sinon, déjà dans votre code,
@words = split(/ /, $Ti[$0]);
C'est complètement faux.
$0 c'est le nom du script perl en cours d'execution.
Donc aucune chance que @words contienne quelque chose.
Et si @words est vide, il n'y aura pas de comparaison d'effectuée.
 
A+,


 
 
c'est une faute de frappe , le problème était un problème d'encodage :)

n°2186184
rim_enis
j'aime ENIS
Posté le 17-04-2013 à 09:31:13  profilanswer
 

gilou a écrit :

Bonjour, le problème vient peut être de ce que vous n'êtes plus dans un encodage de base, et qu'il faut l'indiquer explicitement avec un use feature 'unicode_strings';

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. use feature 'unicode_strings';
  6.  
  7. # en entrée, une reference sur un hash %syn et le nom du fichier xml
  8. # en sortie %syn est rempli avec comme les synonymes comme clés et les étiquettes comme valeurs.
  9. sub parseBase ($$) {
  10.  use XML::Simple;
  11.  my $href = shift;
  12.  my $data = XMLin(shift);
  13.  foreach(@{$data->{mot}}) {
  14.    $href->{$_->{'synonyme'}} = $_->{'etiquette'};
  15.  }
  16. }
  17.  
  18.  
  19. my %syn;
  20. parseBase(\%syn, 'BaseEtiquette.xml');
  21.  
  22.  
  23. open my $fh,  "<:utf8", 'corpus.txt';
  24. open my $fh1, ">:utf8", 'result.txt';
  25. my $linenum = 0;
  26. foreach(<$fh> ) {
  27.  # Si BOM initiale
  28.  unless ($linenum++ and /^\x{feff}/) {
  29.    s/^\x{feff}// ;
  30.    print $fh1 "\x{feff}";
  31.  }
  32.  my @words = split /\b/;
  33.  foreach (@words) {
  34.    print $fh1 $_;
  35.    # si le mot figure dans la liste des synonymes
  36.    if ($syn{$_}) {
  37.      print $fh1  " $syn{$_} ";
  38.    }
  39.  }
  40. }
  41. close $fh1;
  42. close $fh;

BaseEtiquette.xml et corpus.txt sont deux fichiers en utf-8 ou j'ai mis vos données exemple.
Le split sur \b (frontière de mots) a des chances d'être plus général que celui sur \s
Le résultat est écrit dans un fichier utf-8, result.txt
Selon les logiciels, l'affichage des lignes mixtes est OK ou non: c'est OK sous emacs, mais l'ordre des mots est inversé sous notepad.
 
A+,


 
Bonjour gilou, j'ai pas compris que fait exactement ce code :  

Code :
  1. unless ($linenum++ and /^\x{feff}/) {
  2.     s/^\x{feff}// ;
  3.     print $fh1 "\x{feff}";
  4.   }


 
 
aussi j'ai fait : ( pour ajouter <deb> au début de chque ligne de mon fichier resultat et <fin> a la fin mais les 2 expressions ne fonctionnent pas !!!!

Code :
  1. $_ =~ s/ +$/ <deb> /g;
  2. $_ =~ s/^\s+/ <fin> /g;


 
et comment je peu inverser l'ordre sachant que j'utilise notepad ???  
Merci de me répondre je serai très reconnaissante

n°2186225
gilou
Modérateur
Modzilla
Posté le 17-04-2013 à 11:43:33  profilanswer
 

rim_enis a écrit :


 
Bonjour gilou, j'ai pas compris que fait exactement ce code :  

Code :
  1. unless ($linenum++ and /^\x{feff}/) {
  2.     s/^\x{feff}// ;
  3.     print $fh1 "\x{feff}";
  4.   }


Tiens, à la relecture, je vois que ça marche, mais pas pour la bonne raison, et que le test n'est pas correct.

Code :
  1. unless ($linenum++ or not /^\x{feff}/) {
  2.    s/^\x{feff}// ;
  3.    print $fh1 "\x{feff}";
  4.  }


Si on n'est pas sur la première ligne, ou si on n'a pas de BOM en début de ligne, on de fait rien, tandis que si on est en première ligne et qu'on a une BOM en début de ligne, on la vire du texte traité, et on la recopie en sortie.
En fait, ce code était utile quand je testais avec votre code pour le split sur \s, car il splittait le premier mot au premier blanc, et donc ce premier mot avait la BOM en premier caractère. Il servait à traiter ce cas particulier. Mais maintenant que je splitte sur \b (ce qui de plus conserve tous les caractères en entrée, votre code avait lui le problème que vous perdiez des blancs en sortie, d'ou une fusion de certains mots), il splitte la première ligne avec la BOM en premier élément du tableau, et le premier mot en second.
Ce code est donc devenu inutile, et vous pourriez le supprimer, sauf que, comme vous voulez ajouter <deb> en début de ligne, il va devenir utile.
 
 

rim_enis a écrit :

aussi j'ai fait : ( pour ajouter <deb> au début de chque ligne de mon fichier resultat et <fin> a la fin mais les 2 expressions ne fonctionnent pas !!!!

Code :
  1. $_ =~ s/ +$/ <deb> /g;
  2. $_ =~ s/^\s+/ <fin> /g;



Euh, plutôt que faire ça, imprimez directement <deb> et <fin> en début et fin de chaque ligne. Par contre, ici, il va falloir alors tenir compte de la BOM et de la fin de ligne

Code :
  1. foreach(<$fh> ) {
  2.  unless ($linenum++ or not /^\x{feff}/) {
  3.    s/^\x{feff}// ;
  4.    print $fh1 "\x{feff}";
  5.  }
  6.  print $fh1 "<deb>";
  7.  my @words = split /\b/;
  8.  foreach (@words) {
  9.    print $fh1 "<fin>" if (/\n$/);
  10.    print $fh1 $_;
  11.    if ($syn{$_}) {
  12.      print $fh1  " $syn{$_} ";
  13.    }
  14.  }
  15. }


 
 

rim_enis a écrit :

et comment je peu inverser l'ordre sachant que j'utilise notepad ???

Aucune idée.
Si vous prenez le corpus et que vous tapez Confirmation après le premier mot, notepad inverse l'ordre des mots dès qu'on tape le C (en tout cas sur ma machine), c'est son interprétation de l'ordre de la ligne (qui contient les mots dans le bon ordre pourtant).  
Si vous rajoutez un <debut> en début de ligne, ça change encore ce type d'interprétation (pour mon emacs). Bref, c'est un pb d'interprétation par chaque logiciel de lignes mixtes (ordre droite-gauche et ordre gauche-droite).
Si vous savez taper une phrase mixte comme il faut en sortie, collez la telle quelle ici, que je voie l'ordre interne des mots attendus, et on pourra adapter le code de sortie.
Il faut probablement jongler avec des insertions de Unicode RIGHT-TO-LEFT MARK (my $RLM = "\x{200F}";) et Unicode LEFT-TO-RIGHT MARK (my $LRM = "\x{200E}";).
Après avoir testé, il suffit que je remplace print $fh1 "<deb>"; par print $fh1 "$RLM"; print $fh1 "<deb>"; pour que tout soit OK avec mon emacs.
 
   
A+,


Message édité par gilou le 17-04-2013 à 12:16:42

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2186257
gilou
Modérateur
Modzilla
Posté le 17-04-2013 à 13:42:22  profilanswer
 

Bon, après pas mal de tâtonnements, avec ceci on obtient le bon ordre avec notepad et emacs:

Code :
  1. my $LRM = "\x{200E}"; # Left-Right Mark
  2. my $RLM = "\x{200F}"; # Right-Left Mark
  3. my $LRE = "\x{202A}"; # Left-Right Embedding
  4. my $RLE = "\x{202B}"; # Right-Left Embeding
  5. my $PDF = "\x{202C}"; # Pop Directional Formatting
  6. ....
  7. foreach(<$fh> ) {
  8.  unless ($linenum++ or not /^\x{feff}/) {
  9.    s/^\x{feff}// ;
  10.    print $fh1 "\x{feff}";
  11.  }
  12.  print $fh1 "$RLM";
  13.  print $fh1 "$LRE<deb>$PDF$RLM";
  14.  my @words = split /\b/;
  15.  foreach (@words) {
  16.    print $fh1 "$LRE<fin>$PDF$RLM" if (/\n$/);
  17.    print $fh1 $_;
  18.    if ($syn{$_}) {
  19.      print $fh1  "$LRE $syn{$_} $PDF$RLM";
  20.    }
  21.  }
  22. }


print $fh1 "$RLM"; => une marque Right-Left en début de ligne
print $fh1  "$LRE xxx $PDF$RLM"; => un bloc en ordre Left-Right est encadré par $RLE ... $PDF  et on rétablit l'ordre  avec $RLM (j'aurais pense que le PDF le faisait, mais ça n'a pas l'air d'être le cas, peut être parce qu'il n'y a pas de vrai caractère à direction Right-Left en début de ligne)
A+,


Message édité par gilou le 17-04-2013 à 14:10:06

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2192296
rim_enis
j'aime ENIS
Posté le 30-05-2013 à 18:38:25  profilanswer
 

Bonjour Gilou,  
J'ai changé mon système d'exploitation , je travaille maintenant avec ubunto 12.10 , et par defaut il ya la version perl 5.14 , je veux installer la version 5.16.3 , est ce que vous avez une idée comment mettre à jour la version 5.14 , j'ai beaucoup cherché sur net mais j'ai pas reussi à resoudre le pblme.
Merci de me répondre

n°2192297
gilou
Modérateur
Modzilla
Posté le 30-05-2013 à 18:49:18  profilanswer
 

Il faut adapter ce qui est indiqué ici:
 
http://ubuntuforums.org/showthread.php?t=1860750
http://askubuntu.com/questions/119 [...] stall-perl
 
Noter qu'avec la version 5.14, vous avez déjà une version de Perl assez efficace à priori.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
mood
Publicité
Posté le 30-05-2013 à 18:49:18  profilanswer
 

n°2192299
rim_enis
j'aime ENIS
Posté le 30-05-2013 à 19:02:14  profilanswer
 

Merci pour votre réponse ,
je vais voir les liens , avec la version 5.14 mes scripts ne marchent pas

n°2192300
rim_enis
j'aime ENIS
Posté le 30-05-2013 à 19:08:49  profilanswer
 

Gilou pouvez vous voir avec moi le problème ,  
je veux executer ce script sur ubunto avec la version 5.14 :  

Code :
  1. #! /usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use XML::Simple;
  5. use Encode;
  6. use autodie;
  7. use feature 'unicode_strings';
  8. # en entrée, une reference sur un hash %syn et le nom du fichier xml
  9. # en sortie %syn est rempli avec comme clés et les étiquettes comme valeurs.
  10. sub parseBase ($$) {
  11.   use XML::Simple;
  12.   my $href = shift;
  13.   my $data = XMLin(shift);
  14.   foreach(@{$data->{mot}}) {
  15.     $href->{$_->{'synonyme'}} = $_->{'etiquette'};
  16.   }
  17. }
  18. my %syn;
  19. parseBase(\%syn, '/home/hp/Bureau/MesScripts/etiquetageSemantique/BaseEtiquette.xml');
  20. open my $fh,  "<:utf8", '/home/hp/Bureau/MesScripts/etiquetageSemantique/in.txt';
  21. open my $fh1, ">:utf8", '/home/hp/Bureau/MesScripts/etiquetageSemantique/resultat.txt';
  22. my $linenum = 0;
  23. foreach(<$fh> ) {
  24. # Si BOM initiale
  25. unless ($linenum++ or not /^\x{feff}/) {
  26.     s/^\x{feff}// ;
  27.     print $fh1 "\x{feff}"; 
  28.   }
  29.      #print $fh1 " <deb> ";
  30.      my @words = split /\b/;
  31.  foreach (@words)
  32.       {
  33.      #print $fh1 " <fin> " if (/\n$/);
  34.      print $fh1 $_;
  35.    # si le mot figure dans la liste des synonymes
  36.     if ($syn{$_}) {
  37.  
  38.       print $fh1  " $syn{$_} "; print "\n";
  39.     }
  40.   }
  41. }
  42. close $fh1;
  43. close $fh;


 
j'ai deja installer les modules necessaires pour la manipulation des fichier xml , mais il ya l'erreur suivant: [b][b]Not an ARRAY reference at /home/hp/Bureau/MesScripts/etiquetageSemantique/essai.pl line 16.[/b][/b]

n°2192309
gilou
Modérateur
Modzilla
Posté le 30-05-2013 à 21:36:15  profilanswer
 

Remplacez la ligne  
$href->{$_->{'synonyme'}} = $_->{'etiquette'};
qui a une syntaxe peut être pas supportée par la version 5.14
par
$$href{$_->{'synonyme'}} = $_->{'etiquette'};
et ça devrait rouler.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2192312
rim_enis
j'aime ENIS
Posté le 30-05-2013 à 21:52:53  profilanswer
 

Bonsoir,  
j'ai résolu le problème , mais je trouve toujours des problèmes : dans mon fichier xml le poit d'interrogation en arabe possède l'etiquette suivante :  
<mot>
<synonyme>؟</synonyme>
<etiquette>Point_Interrogation</etiquette>
</mot>  
 
et le resultat de l'execution est :  
أَيْ Confirmation  
 تْفَضَّلْ Politesse  
 خُويَا Appelation  
 
مْعَ etq1  
 وَقْتَاشْ Demande-Horaire  
 بِاللَهْ Politesse  
 إِيْ Confirmation  
 إِيْ Confirmation  
 التْرَانْ Marq_Train  
 يِمْشِي etq2  
 ؟
 
pourquoi  ؟ est affiché sans etiquette ???

n°2192320
gilou
Modérateur
Modzilla
Posté le 30-05-2013 à 23:18:20  profilanswer
 

Parce que le split /\b/ fait une scission sur les frontières de mots, et que le ؟ n'est pas considéré comme faisant un mot.
Si vous voulez splitter sur certaines ponctuations, il faudra en tenir compte dans l'expression régulière: split /(\b|\x{061F})/ (061F est le codage unicode de ؟ )
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2192356
rim_enis
j'aime ENIS
Posté le 31-05-2013 à 12:39:10  profilanswer
 

Merci infiniment Gilou ,  
Alors si je veux splitter sur d'autre ponctuation il suffit de faire : my @words = split /(\b|\x{061F} |\x{060C} )/;  ???

n°2192379
gilou
Modérateur
Modzilla
Posté le 31-05-2013 à 14:22:12  profilanswer
 

Tout à fait.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2192383
rim_enis
j'aime ENIS
Posté le 31-05-2013 à 14:35:34  profilanswer
 

Gilou , merci beaucoup pour votre aide...

n°2198497
rim_enis
j'aime ENIS
Posté le 23-07-2013 à 14:33:27  profilanswer
 

Bonjour gilou,  
 
je serai très reconnaissante si vous pouvez m'aider à resoudre mon problème, en fait j'ai 3 fichier :  
 
out33.txt ( un fichier que pour chaque mot en arabe est associé une etiquette en français ) et qui contient :  
 
 بِيَايْ billet  
 لْتُونِسْ tunis  
 بْقَدَاهْ combien
 ؟ Point_Interrogation
 
 آتِيدْيُونْ etudiant  
 لْتُونِسْ tunis  
 بْقَدَاهْ combien
 ؟ Point_Interrogation
 
un fichier fich2.xml :
 
<?xml version="1.0" encoding="UTF-8"?>
<liste-des-etiquettes>
 
 
<mot>
<synonyme>لْتُونِسْ</synonyme>
<etiquette>tunis</etiquette>
</mot>
 
<mot>
<synonyme>بِيَايْ</synonyme>
<etiquette>billet</etiquette>
</mot>
 
<mot>
<synonyme>قَدَّاهْ</synonyme>
<etiquette>combien</etiquette>
</mot>
 
 
<mot>
<synonyme>؟</synonyme>
<etiquette>Point_Interrogation</etiquette>
</mot>
 
 
</liste-des-etiquettes>
 
et un fichier fich3.xml  
 
<?xml version="1.0" encoding="UTF-8"?>
<liste-des-classes>
 
<classe>
<nom>Stations</nom>
<etiquette1>tunis</etiquette1>
<etiquette2>gabess</etiquette2>
<etiquette3>sfax</etiquette3>
</classe>
 
 
<classe>
<nom>Type-Voyageurs</nom>
<etiquette1>abonnement</etiquette1>
<etiquette2>etudiant</etiquette2>
</classe>
 
 
<classe>
<nom>Tichet</nom>
<etiquette1>billet</etiquette1>
<etiquette2>billets</etiquette2>
</classe>
 
 
 
 
<classe>
<nom>Demande-destination</nom>
<etiquette1>combien</etiquette1>
</classe>
 
 
<classe>
<nom>Ponctuation</nom>
<etiquette1>Point_Exclamation</etiquette1>
<etiquette2>Point</etiquette2>
<etiquette3>Point_Interrogation</etiquette3>
</classe>
 
 
</liste-des-classes>
 
je veux remplacer chaque mot par la classe à quelle elle appartient a partir de l'etiquette par exemple pour l'entré suivant :  
 بِيَايْ billet  
 لْتُونِسْ tunis  
 بْقَدَاهْ combien
 ؟ Point_Interrogation
 
 آتِيدْيُونْ etudiant  
 لْتُونِسْ tunis  
 بْقَدَاهْ combien
 ؟ Point_Interrogation
 
le résultat sera :
Tichet + Stations + Demande-destination  
Type-Voyageurs + Stations + Demande-destination  
 
 
pouvez vous m'aider SVP ..
merci de me répondre
très cordialement
rim

n°2198771
gilou
Modérateur
Modzilla
Posté le 25-07-2013 à 17:10:40  profilanswer
 

Bonjour
1) Vous parsez fich2.xml et crééz un hash qui a pour clé un synonyme et pour valeur son étiquette. Appellons ce hash %h1
2) vous parsez fich3.xml et crééz un hash dont les clés sont les étiquettes et les valeurs les noms des classes. Appellons ce hash %h2
3) vous parsez out33.txt et pour chaque mot m en début de ligne, vous imprimez $h2{$h1{mot}}
Bref, c'est tellement basique (contrairement à vos questions précédentes) que je ne vois pas pourquoi vous avez besoin d'aide dans ce cas précis.

Citation :

le résultat sera :
Tichet + Stations + Demande-destination  
Type-Voyageurs + Stations + Demande-destination  


Non, ce sera
Tichet + Stations + Demande-destination + Ponctuation
Type-Voyageurs + Stations + Demande-destination  + Ponctuation
Si vous ne voulez pas de  + Ponctuation en sortie, il faudra adapter le code pour en tenir compte
A+,


Message édité par gilou le 25-07-2013 à 17:15:52

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2198806
rim_enis
j'aime ENIS
Posté le 26-07-2013 à 01:01:13  profilanswer
 

Bonsoir  
merci pour votre réponse , pour le hash %h2 comment je peux mettre plusieurs valeurs comme clé ??

n°2198807
rim_enis
j'aime ENIS
Posté le 26-07-2013 à 01:15:11  profilanswer
 

l'idée est basique et simple mais parceque je débute avec perl les choses me parait un peu flou en fait j'arrive pas à resoudre le problème

n°2198847
gilou
Modérateur
Modzilla
Posté le 26-07-2013 à 12:56:34  profilanswer
 

rim_enis a écrit :

Bonsoir  
merci pour votre réponse , pour le hash %h2 comment je peux mettre plusieurs valeurs comme clé ??

Ce n'est pas ce que j'ai dit.
En parsant
<classe>  
<nom>Stations</nom>  
<etiquette1>tunis</etiquette1>  
<etiquette2>gabess</etiquette2>  
<etiquette3>sfax</etiquette3>  
</classe>  
votre code devra faire
$h2{tunis} = 'Stations';
$h2{gabess} = 'Stations;
$h2{sfax} = 'Stations;
A+,


Message édité par gilou le 26-07-2013 à 12:56:50

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2198859
rim_enis
j'aime ENIS
Posté le 26-07-2013 à 14:57:30  profilanswer
 

dans ce cas à chaque fois j'ajoute des etiquettes ds la base des classes le code sera modifé ???

n°2198862
gilou
Modérateur
Modzilla
Posté le 26-07-2013 à 15:04:19  profilanswer
 

J'ai dit que c'est votre code qui va le faire, bref, il va parser, trouver la valeur associée au tag nom, Stations, ranger ça dans une variable, que l'on pourrait appeller $nom, puis en continuant le parsing, il  va trouver la valeur associée au tag étiquette1, tunis, ranger ça dans une variable, que l'on pourrait appeller $etiquette, puis faire  $h2{$etiquette} = $nom;  
A+,


Message édité par gilou le 26-07-2013 à 15:04:52

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2198866
rim_enis
j'aime ENIS
Posté le 26-07-2013 à 15:34:23  profilanswer
 

Merci  
C'est comme vous parlez en chinois pour moi... La mort de ma fillette m'a beaucoup perturbé...  
j'ai pas beaucoup  travailler sur les tables de hachage.. Bref merci pour tous
A+

n°2198886
gilou
Modérateur
Modzilla
Posté le 26-07-2013 à 18:44:11  profilanswer
 

Spoiler :

>> La mort de ma fillette m'a beaucoup perturbé
Quel malheur! Je vous présente mes sentiments de sincère sympathie.

 

Bon, j'ai codé ça vite fait, mais ça devrait faire le boulot (faudra peut être le blinder un peu), en tout cas, ça le fait sur un test rapide avec vos exemples.
J'ai du ajouter des entrées à fich2.xml: combien n'a pas la même orthographe dans out33.txt et il manque une entrée pour étudiant.

 
Code :
  1. #!/usr/bin/env perl
  2.  
  3. use strict;
  4. use warnings;
  5. use autodie;
  6. use XML::TreeBuilder;
  7.  
  8. my %h1;
  9. my $tree = XML::TreeBuilder->new();
  10. $tree->parse_file('fich2.xml');
  11. my @mots = $tree->find('mot');
  12. foreach (@mots) {
  13.  my ($synonyme, $etiquette);
  14.  foreach ($_->descendants()) {
  15.    my $tag = $_->tag();
  16.    if ($tag ~~ "synonyme" ) {
  17.      $synonyme = ($_->content_list())[0];
  18.    }
  19.    if ($tag ~~ "etiquette" ) {
  20.      $etiquette = ($_->content_list())[0];
  21.      $h1{$synonyme} = $etiquette;
  22.    }
  23.  }
  24. }
  25. $tree->delete;
  26.  
  27. my %h2;
  28. $tree = XML::TreeBuilder->new();
  29. $tree->parse_file('fich3.xml');
  30. my @classes = $tree->find('classe');
  31. foreach (@classes) {
  32.  my ($nom, $etiquette);
  33.  foreach ($_->descendants()) {
  34.    my $tag = $_->tag();
  35.    if ($tag ~~ "nom" ) {
  36.      $nom = ($_->content_list())[0];
  37.    }
  38.    if ($tag ~~ /^etiquette\d+$/) {
  39.      $etiquette = ($_->content_list())[0];
  40.      $h2{$etiquette}= $nom;
  41.    }
  42.  }
  43. }
  44. $tree->delete;
  45.  
  46. open my $fh,  "<:utf8", 'out33.txt';
  47. my $linenum = 0;
  48. my (@bloc, @words);
  49. foreach(<$fh> ) {
  50.  unless ($linenum++ or not /^\x{feff}/) {
  51.    s/^\x{feff}// ;
  52.  }
  53.  if (/^\s*$/) {
  54.    if (0+@bloc) {
  55.      print join(" + ", @bloc), "\n";
  56.      @bloc = ();
  57.    }
  58.  }
  59.  else {
  60.    s/^\s+|\s+$//g;
  61.    @words = split /\s+/;
  62.    if (defined($h1{$words[0]}) and defined($h2{$h1{$words[0]}})) {
  63.      push @bloc, $h2{$h1{$words[0]}};
  64.    }
  65.    else {
  66.       push @bloc, "???";
  67.    }
  68.  }
  69. }
  70. if (0+@bloc) {
  71.  print join(" + ", @bloc), "\n";
  72. }
  73. close $fh;
 

A+,


Message édité par gilou le 26-07-2013 à 18:44:48

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2198888
rim_enis
j'aime ENIS
Posté le 26-07-2013 à 20:15:51  profilanswer
 

quand j'ai essayé le code il y a le problème suivant  :  
XML or text declaration not at start of entity at line 2, column 0, byte 1 at /usr/lib/perl5/XML/Parser.pm

n°2198892
gilou
Modérateur
Modzilla
Posté le 26-07-2013 à 21:30:30  profilanswer
 

Chez moi,ça marche.
 
Vous avez bien un perl a jour, et vos 3  fichiers sont bien en UTF-8?
Parce que la, on dirait que fich2.xml ou fich3.xml n'est pas un fichier XML valide.
Moi j'ai copié vos exemples, les ai collé dans notepad, puis les ai sauvé comme UTF-8 et ai changé l'extension txt donnée par  notepad en xml.
 
A+,


Message édité par gilou le 26-07-2013 à 21:33:47

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2198907
rim_enis
j'aime ENIS
Posté le 27-07-2013 à 13:35:00  profilanswer
 

alors pourquoi ça marche pas chez moi , pourtant mes fichiers xml sont valides !!!

n°2198910
gilou
Modérateur
Modzilla
Posté le 27-07-2013 à 14:24:07  profilanswer
 

Ce n'est manifestement pas ce que pense le parser, vu le message

Citation :

XML or text declaration not at start of entity at line 2, column 0, byte 1 at /usr/lib/perl5/XML/Parser.pm


 
Il y aurait pas une ligne blanche avant le  
<?xml version="1.0" encoding="UTF-8"?>
parce que le message laisse supposer que c'est vu en ligne 2 et non pas en ligne 1 (le line 2, column 0, byte 1).
Et d'ailleurs, je viens de tester, en ajoutant une ligne blanche au début de fich2.xml, et j'ai exactement votre message d'erreur (sauf qu'il dit line 2, column 0, byte 2 et non line 2, column 0, byte 1).
Bref, vos fichiers xml ne sont pas valides, malgré ce que vous semblez penser, et c'est ce que détecte le parser XML (qui est très certainement expat, en dll appelée par le code perl)
 
A+,


Message édité par gilou le 27-07-2013 à 14:32:46

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2198913
rim_enis
j'aime ENIS
Posté le 27-07-2013 à 16:02:24  profilanswer
 

Gilou Merci beaucoup , je vais essayer de comprendre le code merci encore une fois :)

n°2198914
rim_enis
j'aime ENIS
Posté le 27-07-2013 à 16:08:44  profilanswer
 

Gilou pouvez vous svp m'expliquer ceci :  
 

Code :
  1. if (/^\s*$/) {
  2.    if (0+@bloc) {
  3.      print join(" + ", @bloc), "\n";
  4.      @bloc = ();
  5.    }
  6. }
  7. else {
  8.    s/^\s+|\s+$//g;
  9.    @words = split /\s+/;
  10.    if (defined($h1{$words[0]}) and defined($h2{$h1{$words[0]}})) {
  11.      push @bloc, $h2{$h1{$words[0]}};
  12.    }
  13.    else {
  14.       push @bloc, "???";
  15.    }
  16. }
  17. }
  18. if (0+@bloc) {
  19. print join(" + ", @bloc), "\n";
  20. }

n°2198916
gilou
Modérateur
Modzilla
Posté le 27-07-2013 à 18:14:07  profilanswer
 

Vous avez des blocs de lignes séparés par des lignes blanches.
@bloc va servir a accumuler les infos correspondant à un bloc de lignes, et est imprimé quand on rencontre des lignes blanches.
 
Si ligne vide ou blanche
if (/^\s*$/) {
si @bloc n'est pas vide  (0+@bloc est le nb d'éléments de@bloc)
if (0+@bloc) {
On imprime son contenu sur une ligne en séparant par " + "
print join(" + ", @bloc), "\n";
et on vide @bloc
@bloc = ();
 
sinon
On vire les espaces en début et en fin
s/^\s+|\s+$//g;
On découpe la ligne comme des mots séparés par des espaces
@words = split /\s+/;
si le premier mot, $words[0], a été trouvé avec une étiquette en parsant fich2.xml
if (defined($h1{$words[0]})
et si cette étiquette était dans une classe de fich3.xml
defined($h2{$h1{$words[0]}}))
alors on stocke la classe dans @bloc
push @bloc, $h2{$h1{$words[0]}};
sinon on stocke ??? dans @bloc
 
Le dernier  
if (0+@bloc) {
print join(" + ", @bloc), "\n";

c'est pour imprimer @bloc si il ne l'a pas été en fin de fichier (fichier pas terminé par une ligne vide ou blanche)
 
A+,


Message édité par gilou le 27-07-2013 à 18:17:45

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2198936
rim_enis
j'aime ENIS
Posté le 28-07-2013 à 16:41:05  profilanswer
 

Bonjour,  
Comment je peux tester si je veux pas afficher la classe ponctuation cad au lieu d'avoir : Tichet + Stations + Demande-destination + Ponctuation
je veux: Tichet + Stations + Demande-destination

n°2198947
gilou
Modérateur
Modzilla
Posté le 29-07-2013 à 04:51:49  profilanswer
 

if (defined($h1{$words[0]}) and defined($h2{$h1{$words[0]}})) {
    unless  ($h2{$h1{$words[0]}} ~~ "Ponctuation" ) {
       push @bloc, $h2{$h1{$words[0]}};
    }
}
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2206058
rim_enis
j'aime ENIS
Posté le 09-10-2013 à 14:12:19  profilanswer
 

gilou a écrit :

Parce que le split /\b/ fait une scission sur les frontières de mots, et que le ؟ n'est pas considéré comme faisant un mot.
Si vous voulez splitter sur certaines ponctuations, il faudra en tenir compte dans l'expression régulière: split /(\b|\x{061F})/ (061F est le codage unicode de ؟ )
 
A+,


 
bonjour gilou
j'ai voulu executer le code suivant :
 

Code :
  1. #! /usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use XML::Simple;
  5. use Encode;
  6. use autodie;
  7. use feature 'unicode_strings';
  8. # en entrée, une reference sur un hash %syn et le nom du fichier xml
  9. # en sortie %syn est rempli avec comme clés et les étiquettes comme valeurs.
  10. sub parseBase ($$) {
  11.   use XML::Simple;
  12.   my $href = shift;
  13.   my $data = XMLin(shift);
  14.   foreach(@{$data->{mot}}) {
  15.    # $href->{$_->{'synonyme'}} = $_->{'etiquette'};
  16.     $$href{$_->{'synonyme'}} = $_->{'etiquette'};
  17.   }
  18. }
  19. my %syn;
  20. parseBase(\%syn, '/home/hp/Bureau/BaseEtiquettes.xml');
  21. open my $fh,  "<:utf8", '/home/hp/Bureau/CorpusNettoye.txt';
  22. open my $fh1, ">:utf8", '/home/hp/Bureau/toto.txt';
  23. my $linenum = 0;
  24. foreach(<$fh> ) {
  25. # Si BOM initiale
  26. unless ($linenum++ or not /^\x{feff}/) {
  27.     s/^\x{feff}// ;
  28.     print $fh1 "\x{feff}"; 
  29.   }
  30.     # print $fh1 " <deb> ";
  31.     # my @words = split /\b/; 
  32. my @words = split /(\b|\x{061F}|\x{061B})/;
  33.  foreach (@words)
  34.       {
  35.     # print $fh1 " <fin> " if (/\n$/);
  36.      print $fh1 $_;
  37.    # si le mot figure dans la liste des synonymes
  38.     if ($syn{$_}) {
  39.  
  40.       print $fh1  " $syn{$_} \n";
  41.     }
  42.   }
  43. }
  44. close $fh1;
  45. close $fh;


 
 
voici un extrait de mon fichier corpusNettoyee.txt :
    . أَيْ تْفَضَّلْ خُويَا  
مْعَ وَقْتَاشْ بِاللهْ التْرَانْ يِمْشِي ؟  
    . مَاضِي سَاعَةْ وَ أَرْبْعَةْ
مَا ثَمَّاشْ وَاحِدْ آخِرْ تَوَّةْ ؟  
    . لاَ هَاكَ هَذَاكَ هُوَ
ثَمَّاشِي وَاحِدْ آخِرْ بَعْدُو ؟  
ثَمَّةْ الحْدَاشْ مْتَاعْ اللِيلْ  
سَلَامُ عَلَيْكُمْ بِاللهْ تِكَايْ لْتُونِسْ بْقَدَّاهْ ؟  
ثْنَاشْ وُ تْسْعَةْ مِيَّةْ
    . سَلَامُ عَلَيْكُمْ
    . زُوزْ زُوزْ لْتُونِسْ
وَقْتَاشْ يُخْرِجْ هُوَ ؟  
    . مَاضِي سَاعَةْ وُ رْبُعْ
    . أَيْ خُويَا
بِاللهْ تِسْكْرَةْ لْتُونِسْ مَاضِي سَاعَةْ
 
 
mon fichier baseetiquette.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<liste-des-etiquettes>
 
<mot>
<synonyme>!</synonyme>
<etiquette>Point Exclamation</etiquette>
</mot>
 
<mot>
<synonyme>.</synonyme>
<etiquette>Point</etiquette>
</mot>
 
<mot>
<synonyme>؟</synonyme>
<etiquette>Point Interrogation</etiquette>
</mot>
 
<mot>
<synonyme>أَيْ</synonyme>
<etiquette>confirmation</etiquette>
</mot>
 
<mot>
<synonyme>تْفَضَّلْ </synonyme>
<etiquette>politesse</etiquette>
</mot>
 
 
<mot>
<synonyme>خُويَا </synonyme>
<etiquette>nomination</etiquette>
</mot>
 
 
<mot>
<synonyme>مْعَ</synonyme>
<etiquette></etiquette>
</mot>
 
 
<mot>
<synonyme>وَقْتَاشْ</synonyme>
<etiquette>outil question demande horaire</etiquette>
</mot>
 
 
<mot>
<synonyme>بِاللهْ</synonyme>
<etiquette>demande</etiquette>
</mot>
 
 
 
<mot>
<synonyme>التْرَانْ </synonyme>
<etiquette>marq train</etiquette>
</mot>
 
<mot>
<synonyme>يِمْشِي </synonyme>
<etiquette>marq depart</etiquette>
</mot>
<mot>
<synonyme>مَاضِي-سَاعَةْ</synonyme>
<etiquette>heure</etiquette>
</mot>
 
<mot>
<synonyme>وَ </synonyme>
<etiquette>coordination</etiquette>
</mot>
 
<mot>
<synonyme>أَرْبْعَةْ </synonyme>
<etiquette>nombre</etiquette>
</mot>
 
<mot>
<synonyme>مَا-ثَمَّاشْ</synonyme>
<etiquette>indisponibilite</etiquette>
</mot>
 
 
pkoi le resultat est fausse pourtant le programme devrait etre juste
 
reultat ====>  
 
    . أَيْ confirmation  
 تْفَضَّلْ خُويَا  
مْعَ HASH(0x8ae1048)  
 وَقْتَاشْ outil question demande horaire  
 بِاللهْ demande  
 التْرَانْ يِمْشِي ؟ Point Interrogation  
 
    . مَاضِي سَاعَةْ وَ أَرْبْعَةْ
مَا ثَمَّاشْ outil question  
 وَاحِدْ آخِرْ autre  
 تَوَّةْ ؟ Point Interrogation  
 
    . لاَ هَاكَ HASH(0x8b19c94)  
 
ici je veux savoir pkoi مَاضِي سَاعَةْ وَ أَرْبْعَةْ n'est pas spliter ???
 
 
 
 
 

n°2206090
gilou
Modérateur
Modzilla
Posté le 09-10-2013 à 16:52:13  profilanswer
 

Bonjour :)
C'est splitté dans le code, simplement l'affichage ne fait rien (pas de saut de ligne après) pour les mots qui ne sont pas dans la base.
C'est très simple à modifier si on veut un saut de ligne systématique.
 

Code :
  1. #! /usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use XML::Simple;
  5. use Encode;
  6. use autodie;
  7. use feature 'unicode_strings';
  8. # en entrée, une reference sur un hash %syn et le nom du fichier xml
  9. # en sortie %syn est rempli avec comme clés et les étiquettes comme valeurs.
  10. sub parseBase ($$) {
  11.   use XML::Simple;
  12.   my $href = shift;
  13.   my $data = XMLin(shift);
  14.   foreach (@{$data->{mot}}) {
  15.     s/^\s+|\s+$//g;
  16.     next if (/^$/);
  17.     my $synonyme = $_->{'synonyme'};
  18.     next if (ref($synonyme));
  19.     $synonyme =~ s/^\s+|\s+$//g;
  20.     next if ($synonyme ~~ /^$/);
  21.     my $etiquette = $_->{'etiquette'};
  22.     next if (ref($etiquette));
  23.     $etiquette =~ s/^\s+|\s+$//g;
  24.     next if ($etiquette ~~ /^$/);
  25.     $$href{$synonyme} = $etiquette;
  26.   }
  27. }
  28. my %syn;
  29. parseBase(\%syn, 'BaseEtiquettes.xml');
  30. open my $fh,  "<:utf8", 'CorpusNettoye.txt';
  31. open my $fh1, ">:utf8", 'toto.txt';
  32. my $linenum = 0;
  33. foreach (<$fh> ) {
  34.   # Si BOM initiale
  35.   unless ($linenum++ or not /^\x{feff}/) {
  36.     s/^\x{feff}// ;
  37.     print $fh1 "\x{feff}";
  38.   }
  39.   my @words = split /(\b|\x{061F}|\x{061B})/;
  40.   foreach (@words) {
  41.     s/^\s+|\s+$//g;
  42.     next if (/^$/);
  43.     next if (/^\r?\n$/);  # élimination des mots vides, retours de ligne, etc
  44.     print $fh1 $_;
  45.     # si le mot figure dans la liste des synonymes
  46.     if ($syn{$_}) {
  47.       print $fh1  " $syn{$_}";
  48.     }
  49.     print $fh1  " \n";  # va splitter à l'affichage pour tous les mots non vides qu'ils soient dans la base ou non
  50.   }
  51. }
  52. close $fh1;
  53. close $fh;


parseBase a aissi été modifié tant que j'y étais afin de tenir compte dee entrées avec du blanc autour: <synonyme>تْفَضَّلْ </synonyme>  et des entrées vides:  <etiquette></etiquette>  
Avec vos données, j'ai maintenant en sortie:

. Point  
أَيْ confirmation  
تْفَضَّلْ politesse  
خُويَا nomination  
مْعَ  
وَقْتَاشْ outil question demande horaire  
بِاللهْ demande  
التْرَانْ marq train  
يِمْشِي marq depart  
؟ Point Interrogation  
. Point  
مَاضِي  
سَاعَةْ  
وَ coordination  
أَرْبْعَةْ nombre  
مَا  
ثَمَّاشْ  
وَاحِدْ  
آخِرْ  
تَوَّةْ  
؟ Point Interrogation  
. Point  
لاَ  
هَاكَ  
هَذَاكَ  
هُوَ  
ثَمَّاشِي  
وَاحِدْ  
آخِرْ  
بَعْدُو  
؟ Point Interrogation  
ثَمَّةْ  
الحْدَاشْ  
مْتَاعْ  
اللِيلْ  
سَلَامُ  
عَلَيْكُمْ  
بِاللهْ demande  
تِكَايْ  
لْتُونِسْ  
بْقَدَّاهْ  
؟ Point Interrogation  
ثْنَاشْ  
وُ  
تْسْعَةْ  
مِيَّةْ  
. Point  
سَلَامُ  
عَلَيْكُمْ  
. Point  
زُوزْ  
زُوزْ  
لْتُونِسْ  
وَقْتَاشْ outil question demande horaire  
يُخْرِجْ  


A vous d'adapter à vos besoins si nécessaire.
 
A+,

Message cité 2 fois
Message édité par gilou le 09-10-2013 à 16:53:47

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2206125
rim_enis
j'aime ENIS
Posté le 09-10-2013 à 18:00:49  profilanswer
 

gilou a écrit :

Bonjour :)
C'est splitté dans le code, simplement l'affichage ne fait rien (pas de saut de ligne après) pour les mots qui ne sont pas dans la base.
C'est très simple à modifier si on veut un saut de ligne systématique.
 

Code :
  1. #! /usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use XML::Simple;
  5. use Encode;
  6. use autodie;
  7. use feature 'unicode_strings';
  8. # en entrée, une reference sur un hash %syn et le nom du fichier xml
  9. # en sortie %syn est rempli avec comme clés et les étiquettes comme valeurs.
  10. sub parseBase ($$) {
  11.   use XML::Simple;
  12.   my $href = shift;
  13.   my $data = XMLin(shift);
  14.   foreach (@{$data->{mot}}) {
  15.     s/^\s+|\s+$//g;
  16.     next if (/^$/);
  17.     my $synonyme = $_->{'synonyme'};
  18.     next if (ref($synonyme));
  19.     $synonyme =~ s/^\s+|\s+$//g;
  20.     next if ($synonyme ~~ /^$/);
  21.     my $etiquette = $_->{'etiquette'};
  22.     next if (ref($etiquette));
  23.     $etiquette =~ s/^\s+|\s+$//g;
  24.     next if ($etiquette ~~ /^$/);
  25.     $$href{$synonyme} = $etiquette;
  26.   }
  27. }
  28. my %syn;
  29. parseBase(\%syn, 'BaseEtiquettes.xml');
  30. open my $fh,  "<:utf8", 'CorpusNettoye.txt';
  31. open my $fh1, ">:utf8", 'toto.txt';
  32. my $linenum = 0;
  33. foreach (<$fh> ) {
  34.   # Si BOM initiale
  35.   unless ($linenum++ or not /^\x{feff}/) {
  36.     s/^\x{feff}// ;
  37.     print $fh1 "\x{feff}";
  38.   }
  39.   my @words = split /(\b|\x{061F}|\x{061B})/;
  40.   foreach (@words) {
  41.     s/^\s+|\s+$//g;
  42.     next if (/^$/);
  43.     next if (/^\r?\n$/);  # élimination des mots vides, retours de ligne, etc
  44.     print $fh1 $_;
  45.     # si le mot figure dans la liste des synonymes
  46.     if ($syn{$_}) {
  47.       print $fh1  " $syn{$_}";
  48.     }
  49.     print $fh1  " \n";  # va splitter à l'affichage pour tous les mots non vides qu'ils soient dans la base ou non
  50.   }
  51. }
  52. close $fh1;
  53. close $fh;


parseBase a aissi été modifié tant que j'y étais afin de tenir compte dee entrées avec du blanc autour: <synonyme>تْفَضَّلْ </synonyme>  et des entrées vides:  <etiquette></etiquette>  
Avec vos données, j'ai maintenant en sortie:

. Point  
أَيْ confirmation  
تْفَضَّلْ politesse  
خُويَا nomination  
مْعَ  
وَقْتَاشْ outil question demande horaire  
بِاللهْ demande  
التْرَانْ marq train  
يِمْشِي marq depart  
؟ Point Interrogation  
. Point  
مَاضِي  
سَاعَةْ  
وَ coordination  
أَرْبْعَةْ nombre  
مَا  
ثَمَّاشْ  
وَاحِدْ  
آخِرْ  
تَوَّةْ  
؟ Point Interrogation  
. Point  
لاَ  
هَاكَ  
هَذَاكَ  
هُوَ  
ثَمَّاشِي  
وَاحِدْ  
آخِرْ  
بَعْدُو  
؟ Point Interrogation  
ثَمَّةْ  
الحْدَاشْ  
مْتَاعْ  
اللِيلْ  
سَلَامُ  
عَلَيْكُمْ  
بِاللهْ demande  
تِكَايْ  
لْتُونِسْ  
بْقَدَّاهْ  
؟ Point Interrogation  
ثْنَاشْ  
وُ  
تْسْعَةْ  
مِيَّةْ  
. Point  
سَلَامُ  
عَلَيْكُمْ  
. Point  
زُوزْ  
زُوزْ  
لْتُونِسْ  
وَقْتَاشْ outil question demande horaire  
يُخْرِجْ  


A vous d'adapter à vos besoins si nécessaire.
 
A+,


 
 
 
Gilou je vous remerci enormement , mais comme je debute encore avec perl j'ai un autre problème avec ce code :  
 
 

Code :
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use autodie;
  5. use utf8;
  6. my ($fname1, $fname2) = ('/home/hp/Bureau/ListeMotsComposee.txt','/home/hp/Bureau/CorpusNettoye.txt' );
  7. open(my $fh, $fname1);
  8. my @biwords;
  9. foreach (<$fh> ) {
  10.   chomp;
  11.   s/^\s+|\s+$//g;
  12.   push @biwords, $_;
  13. }
  14. close $fh;
  15. my @tab;
  16. open($fh, $fname2);
  17. foreach (<$fh> ) {
  18.   foreach my $r (@biwords) {
  19.     my $t = $r =~ s/ /-/r;
  20.     if (/$r/) {
  21.       s/$r/$t/g; 
  22.      # print ;
  23.   push @tab, $_;
  24.     }
  25.   }
  26. }
  27.     open my $fh1, ">:utf8", '/home/hp/Bureau/titi.txt';
  28. foreach my $elem (@tab)
  29. {
  30. print $fh1 "$elem\n";
  31. }
  32. close $fh;


 
ListeMotsComposee.txt ====>  
مَاضِي سَاعَةْ
مَا ثَمَّاشْ
مْتَاعْ اللِيلْ
مَا نِرْبَحْشْ
 
 
seront remplacer dans corpusnettoyee.txt   par :
 
مَاضِي-سَاعَةْ
مَا-ثَمَّاشْ
مْتَاعْ-اللِيلْ
مَا-نِرْبَحْشْ
 
cependant le resultat n'est pas mme lisable :
 
 
resultat ===>  .أَيْتْفَضَّلْخُويَا
 
مْعَوَقْتَاشْبِاللهْالتْرَانْيِمْشِي؟
 
. مَاضِي-سَاعَةْ وَ أَرْبْعَةْ
 
.مَاضِي-سَاعَةْوَأَرْبْعَةْ
 
مَا-ثَمَّاشْ وَاحِدْ آخِرْ تَوَّةْ ؟  
 
مَا-ثَمَّاشْوَاحِدْآخِرْتَوَّةْ؟
 
d'avance merci pour vos eclairssissements
 

n°2206156
rim_enis
j'aime ENIS
Posté le 09-10-2013 à 23:36:24  profilanswer
 

gilou plz hel me !!

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  perl + comparaison + xml

 

Sujets relatifs
recherche expert en PERLcomparaison date
[PERL] SubtitionSockets en Perl
[PERL] Récupérer des données dans un fichier txtComparaison avec drawLine ?!
Comparaison et calculs sur deux fichiers à la foisHelp comparaison de deux fichier perl
[Perl - Débutant]Probleme de comparaison de 2 chaines[Perl] Comment ignorer la casse dans une comparaison ?
Plus de sujets relatifs à : perl + comparaison + xml


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR