IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

Problème de segmentation de mots arabes


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 53
    Points : 25
    Points
    25
    Par défaut Problème de segmentation de mots arabes
    Bonsoir,
    Je suis débutante en perl, j'ai un script pour segmenter un mot en arabe existant d'un fichier et le mettre dans un autre fichier, mais ce script m'affiche des caractère bizarre
    Merci de m'aider
    Voici mon script
    @tab = <F>;
    my $size = $#tab+1;
    for ($i = 0; $i < $size; $i++)
    {
    chomp($tab[$i]);
    @words = split(//, $tab[$i]);
    foreach my $val ( @words )
    {
    print FIC "$val\n";

    }

    }

  2. #2
    Membre averti
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Points : 320
    Points
    320
    Par défaut
    1/ utilises les balises code
    2/ la ligne de print pourquoi ecris tu "FIC"
    voici ce que tu as écrie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    @tab = <F>;
    my $size = $#tab+1; 
    for ($i = 0; $i < $size; $i++)
    {
    chomp($tab[$i]);
    @words = split(//, $tab[$i]);
    foreach my $val ( @words ) 
    {
    print FIC "$val\n"; 
     
    }
     
    }
    voici ce que je ferait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @tab = <F>;
    my $size = scalar(@tab); 
    for ($i = 0; $i < $size; $i++)
    {
    chomp($tab[$i]);
    @words = split(/ /, $tab[$i]);#j'imagine que tu veux retrouver les mots
    print "ligne => ".$i."\n";
    foreach my $val ( @words ) 
    {
    print "\tmots => ".$val."\n"; 
     
    }
     
    }
    j'ai pas tester mais je pence que ça devrait aller.
    Pourquoi faire simple quand on peut faire compliqué.

  3. #3
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Et tant qu'à mettre entre balises, autant indenter correctement.

    Et voici comment je modifierais pour ma part:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @tab = <$F>; # perso, je préfère itérer ligne par ligne c'est mieux quand le fichier est très gros, mais bon, je laisse comme cela
    chomp @tab; # autant "chomper" tout le tableau d'un seul coup
    my $size = scalar(@tab); 
    for my $i (0..$size -1) { # en fait je ferais plutôt: "for my $one_tab (@tab) {", mais il faudrait trop changer ce qui suit.
                            # Le "my" est important parce qu'il y a forcément un "use strict" et "use warnings" au début même s'il ne figure pas dans le bout de code présenté dans le post
         @words = split(/ /, $tab[$i]);#j'imagine que tu veux retrouver les mots
         print "ligne => ".$i."\n";
         foreach my $val ( @words )  {
              print "\tmots => ".$val."\n"; 
         }
    }
    Reste à savoir si cela correspond vraiment au besoin de Bayouta, ce dont je ne suis pas sûr car sa demande manque de précision.

  4. #4
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 53
    Points : 25
    Points
    25
    Par défaut
    merci pour vos réponses, mais mon problème réside encore.
    je vais l'expliquer encore: j'ai un fichier qui contient des mots en arabe voyellé , et je dois segmenter ces mots en des caractéres et mettre le résultat dans un fichier, mais le script que j'ai ecrit m'affiche des caractére bizarre

  5. #5
    Membre averti
    Avatar de magicshark
    Homme Profil pro
    Dans une SS2I donc pas que JAVA
    Inscrit en
    Octobre 2011
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dans une SS2I donc pas que JAVA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 133
    Points : 320
    Points
    320
    Par défaut
    ça serait pas le probleme résolu ici ?
    Pourquoi faire simple quand on peut faire compliqué.

  6. #6
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 53
    Points : 25
    Points
    25
    Par défaut
    ça marche si je veux segmenter en mots mais en caractère non plus.
    voici le résultat retourné
    Fichiers attachés Fichiers attachés

  7. #7
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    Bonjour,
    vite fait j'ajoute dans la structure de Lolo78.

    NB, dès qu'on manipule des chaînes de caractères complexes, comme l'arabe, il FAUT être PARTOUT en utf8. Les caractères arabes sont codés sur 2 octets.
    PAROUT =
    - dans le code du programme perl il faut use utf8;
    - quand on lit un fichier arabe il doit être encodé utf8, ce qui implique <:encoding(UTF-8)
    - quand on écrit en arabe dans un fichier il faut y écrire en utf8, ce qui implique >:encoding(UTF-8)
    Dans les éditeurs de texte (UltraEdit, Bloc-notes...) il faut sauvegarder avec l'option UTF8 ! (Par exemple pour Bloc-notes-->Enregistré Sous--> Encodage UTF-8).

    Enfin sur la console DOS, perso je n'ai jamais pu afficher des caractères arabes, mais il doit y avoir un truc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #!/usr/bin/perl
    use strict;
    use warnings;
    use utf8;
    use File::Spec;														# Permet une meilleure gestion des noms des chemins sous tous les OS.
     
    my $RepBase = 'C:\DevPerl';
    my $FicAraIn  = File::Spec->catfile( $RepBase, 'TexteArabe.utf8' );
    my $FicAraOut = File::Spec->catfile( $RepBase, 'TexteArabeSortie.utf8' );
     
    open ( IN_Ara, '<:encoding(UTF-8)', $FicAraIn )
    	or die "Impossible ouvrir fichier $FicAraIn en lecture\n";
     
    open (OUT_Ara, '>:encoding(UTF-8)', $FicAraOut )
    	or die "Impossible ouvrir fichier $FicAraOut en sortie\n";
     
     
    my @tab = <IN_Ara>; # perso, je préfère itérer ligne par ligne c'est mieux quand le fichier est très gros, mais bon, je laisse comme cela
    chomp @tab; # autant "chomper" tout le tableau d'un seul coup
    my $size = scalar(@tab); 
    for my $i (0..$size -1) { # en fait je ferais plutôt: "for my $one_tab (@tab) {", mais il faudrait trop changer ce qui suit.
                            # Le "my" est important parce qu'il y a forcément un "use strict" et "use warnings" au début même s'il ne figure pas dans le bout de code présenté dans le post
         my @words = split(/ /, $tab[$i]);#j'imagine que tu veux retrouver les mots
         print "ligne => ".$i."\n";
         foreach my $val ( @words )  {
              print "\tmots => ".$val."\n";
              print OUT_Ara $val."\n";
         }
    }
     
    close IN_Ara;
    close OUT_Ara;
    Je regrette, je n'arrive pas à coller les deux fichiers en arabe (image Dev_1.jpg)


    Fichier en entrée :
    مَاذَا يَشْرَبُ عَفِيف ؟
    عَفِيف يَشْرَبُ الْحَلِيب
    مَاذَا يَشْرَبُ فَرِيد ؟
    فَرِيد يَشْرَبُ الْمَاء
    يَشْرَبُ الْحَلِيب
    Fichier en sortie :
    مَاذَا

    يَشْرَبُ

    عَفِيف

    ؟
    عَفِيف

    يَشْرَبُ

    الْحَلِيب
    مَاذَا

    يَشْرَبُ

    فَرِيد

    ؟
    فَرِيد

    يَشْرَبُ

    الْمَاء
    يَشْرَبُ

    الْحَلِيب
    Si c'est bien la question que tu poses !! ??

    [Edit 05:20]
    Après lecture il me semble que tu veux découper en caractère :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #!/usr/bin/perl
    use strict;
    use warnings;
    use utf8;
    use File::Spec;														# Permet une meilleure gestion des noms des chemins sous tous les OS.
     
    my $RepBase = 'C:\DevPerl';
    my $FicAraIn  = File::Spec->catfile( $RepBase, 'TexteArabe.utf8' );
    my $FicAraOut = File::Spec->catfile( $RepBase, 'TexteArabeSortie.utf8' );
     
    open ( IN_Ara, '<:encoding(UTF-8)', $FicAraIn )
    	or die "Impossible ouvrir fichier $FicAraIn en lecture\n";
     
    open (OUT_Ara, '>:encoding(UTF-8)', $FicAraOut )
    	or die "Impossible ouvrir fichier $FicAraOut en sortie\n";
     
     
    my @tab = <IN_Ara>; # perso, je préfère itérer ligne par ligne c'est mieux quand le fichier est très gros, mais bon, je laisse comme cela
    chomp @tab; # autant "chomper" tout le tableau d'un seul coup
    my $size = scalar(@tab); 
    for my $i (0..$size -1) { # en fait je ferais plutôt: "for my $one_tab (@tab) {", mais il faudrait trop changer ce qui suit.
                            # Le "my" est important parce qu'il y a forcément un "use strict" et "use warnings" au début même s'il ne figure pas dans le bout de code présenté dans le post
         my @words = split(/ /, $tab[$i]);#j'imagine que tu veux retrouver les mots
         print "ligne => ".$i."\n";
         foreach my $val ( @words )  {
              print "\tmots => ".$val."\n";
              print OUT_Ara $val."\n";
              foreach my $car ( split //,$val) {
              			print "\tcaractère => ".$car."\t";
              			print OUT_Ara $car."\t";
            	}
            	print OUT_Ara "\n\n";
         }
    }
    close IN_Ara;
    close OUT_Ara;
    Avec mots découpés en caractère :
    مَاذَا
     م َ ا ذ َ ا


    يَشْرَبُ
    ي َ ش ْ ر َ ب ُ


    عَفِيف
    ع َ ف ِ ي ف


    ؟
    ؟

    عَفِيف
    ع َ ف ِ ي ف


    يَشْرَبُ
    ي َ ش ْ ر

    Tu remarqueras que les diacritiques (accents) sont représentés au dessus d'un petit cercle en pointillé !!!

    Ce sont les joies des manipulations des caractères arabes
    J'ai dû écrire quelque part que l'informatique avait été inventé par des occidentaux pour des occidentaux...

    Pour la manipulation des accents je te renvoie (MERCI magicshark) :
    http://www.developpez.net/forums/d13...e/#post7136317

    [Edit 05:45]
    Il ne t'échapperas que le découpage du mot donne les caractères pris de gauche à droite dans le mot.
    Et oui il faut gérer çà aussi

  8. #8
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2013
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2013
    Messages : 53
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup dmganges , mon probléme est résolu

  9. #9
    Membre chevronné Avatar de dmganges
    Homme Profil pro
    Retraité. Ne recherche pas un emploi.
    Inscrit en
    Septembre 2011
    Messages
    1 392
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Retraité. Ne recherche pas un emploi.
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2011
    Messages : 1 392
    Points : 2 044
    Points
    2 044
    Par défaut
    De RIEN !
    S'il te plait, ne fait pas comme rimenis, clique sur le bouton vert <Résolu> ça aide les personnes qui font des recherches !
    Merci !

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

Discussions similaires

  1. [MySQL] problème envoi mail pour mot de passe
    Par bonsam dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 17/11/2006, 20h57
  2. problème apostrophe dans un mot
    Par krole57 dans le forum Delphi
    Réponses: 1
    Dernier message: 16/06/2006, 17h51
  3. Problème de segmentation.
    Par Gryzzly dans le forum C
    Réponses: 12
    Dernier message: 27/12/2005, 11h02
  4. problème nom de champ = mot clé
    Par JYH dans le forum Bases de données
    Réponses: 1
    Dernier message: 05/12/2005, 12h13
  5. Problème de segmentation ?
    Par julson dans le forum Assembleur
    Réponses: 2
    Dernier message: 23/12/2004, 18h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo