perl + comparaison + xml

perl + comparaison + xml - Perl - Programmation

Marsh Posté le 16-04-2013 à 11:18:41    

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
Reply

Marsh Posté le 16-04-2013 à 11:18:41   

Reply

Marsh Posté le 16-04-2013 à 20:21:56    

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é!  --
Reply

Marsh Posté le 16-04-2013 à 23:17:24    

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é!  --
Reply

Marsh Posté le 16-04-2013 à 23:25:45    

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

Reply

Marsh Posté le 16-04-2013 à 23:50:28    

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 :)

Reply

Marsh Posté le 17-04-2013 à 09:31:13    

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

Reply

Marsh Posté le 17-04-2013 à 11:43:33    

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é!  --
Reply

Marsh Posté le 17-04-2013 à 13:42:22    

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é!  --
Reply

Marsh Posté le 30-05-2013 à 18:38:25    

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

Reply

Marsh Posté le 30-05-2013 à 18:49:18    

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é!  --
Reply

Marsh Posté le 30-05-2013 à 18:49:18   

Reply

Marsh Posté le 30-05-2013 à 19:02:14    

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

Reply

Marsh Posté le 30-05-2013 à 19:08:49    

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]

Reply

Marsh Posté le 30-05-2013 à 21:36:15    

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é!  --
Reply

Marsh Posté le 30-05-2013 à 21:52:53    

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 ???

Reply

Marsh Posté le 30-05-2013 à 23:18:20    

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é!  --
Reply

Marsh Posté le 31-05-2013 à 12:39:10    

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

Reply

Marsh Posté le 31-05-2013 à 14:22:12    

Tout à fait.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 31-05-2013 à 14:35:34    

Gilou , merci beaucoup pour votre aide...

Reply

Marsh Posté le 23-07-2013 à 14:33:27    

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

Reply

Marsh Posté le 25-07-2013 à 17:10:40    

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é!  --
Reply

Marsh Posté le 26-07-2013 à 01:01:13    

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

Reply

Marsh Posté le 26-07-2013 à 01:15:11    

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

Reply

Marsh Posté le 26-07-2013 à 12:56:34    

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é!  --
Reply

Marsh Posté le 26-07-2013 à 14:57:30    

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

Reply

Marsh Posté le 26-07-2013 à 15:04:19    

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é!  --
Reply

Marsh Posté le 26-07-2013 à 15:34:23    

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+

Reply

Marsh Posté le 26-07-2013 à 18:44:11    

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é!  --
Reply

Marsh Posté le 26-07-2013 à 20:15:51    

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

Reply

Marsh Posté le 26-07-2013 à 21:30:30    

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é!  --
Reply

Marsh Posté le 27-07-2013 à 13:35:00    

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

Reply

Marsh Posté le 27-07-2013 à 14:24:07    

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é!  --
Reply

Marsh Posté le 27-07-2013 à 16:02:24    

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

Reply

Marsh Posté le 27-07-2013 à 16:08:44    

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. }

Reply

Marsh Posté le 27-07-2013 à 18:14:07    

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é!  --
Reply

Marsh Posté le 28-07-2013 à 16:41:05    

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

Reply

Marsh Posté le 29-07-2013 à 04:51:49    

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é!  --
Reply

Marsh Posté le 09-10-2013 à 14:12:19    

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 ???
 
 
 
 
 

Reply

Marsh Posté le 09-10-2013 à 16:52:13    

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é!  --
Reply

Marsh Posté le 09-10-2013 à 18:00:49    

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
 

Reply

Marsh Posté le 09-10-2013 à 23:36:24    

gilou plz hel me !!

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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