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

SGBD Perl Discussion :

Problème d'encodage perl


Sujet :

SGBD Perl

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Problème d'encodage perl
    Salut à tous!

    J'ai un problème urgent avec mon code, en fait j'essaie de comparer les chaînes de caractères (verbes) contenues dans deux fichiers (f1 et f2). Le programme est censé vérifier par exemple si le mot préférer ou fonctionné contenu dans le premier fichier(f1) apparaît également dans le second(f2). Auquel cas il le signale. Mon code fonctionne bien pour les mots qui n'ont aucun accent. Par contre, lorsqu'il s'agit des mots contenant des caractères accentués (comme ceux des exemples ci-dessus), mon code ne renvoie aucun résultat.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
     
    #!/usr/bin/perl -w
     
    #ligne de commande : perl extraction_phrase.pl -file <fichier.html> -list <fichier-formeverbales+lemmes>
     
     
    #====================================================================
    use strict;
    use locale;
    use utf8;
    use Encode;
    use Getopt::Long;
    use HTML::TreeBuilder;
    #binmode STDOUT, 'utf8';
    binmode STDIN, 'utf8';
     
    #====================================================================
    # options
    sub usage {
        warn "Usage :
       -file           # fichier à analyser
       -list           # fichier contenant les verbes+lemmes
       \n"
    }
     
    my $corp;
    my $listverbs;
     
    unless (&GetOptions(
    	     "file=s", \$corp,
    		 "list=s", \$listverbs,
    	)) 
    {
        warn "Probleme d'options\n";
        &usage;
        die;
    }
    #=====================================================================
     
     
    my $ligne;
    my @lignes;
    my $forme;
    my $infinitif;
    my %tabformesV;
     
     
    sub FormesV{
        my ($f) = $_[0];
        open (F, $f) or die "impossible d'ouvrir '$f' \n" ;
        warn "Lecture du fichier \n";
        binmode(F, ':utf8');
     
    	while (<F>) {
        	next if (/^#/);
    		$ligne = $_;
    		chomp ($ligne);
    		#print "===$ligne===\n";
        	($forme, $infinitif) = split (/\|/, $ligne);
    		$tabformesV{lc($forme)} = $infinitif;
    	}
     
    }
    &FormesV($listverbs);
     
    sub Lecture_et_traitement {
        my ($c) = $_[0];
        open (C, $c) or die "impossible d'ouvrir '$c' \n" ;
        warn "Lecture et traitement du document \n";
        binmode(C, ':utf8');
        my $tree = HTML::TreeBuilder->new; # empty tree
        $tree->parse_file($c);
        my $root = HTML::TreeBuilder->new_from_file($c);
    	my @tabphrases = $root->look_down('_tag', 'p');
    	foreach my $p(@tabphrases){
    		my $phrase = $p->as_text;
    		#print "$phrase", "\n";
    		my @tabverbes = $p->look_down('_tag', 'b');
    		foreach my $v (@tabverbes){
    			my $verbe = $v->as_text;
    			#print "$verbe\n";
    			chomp ($verbe);
    			$verbe =lc($verbe);			
    			$verbe =~ s/^ //g;
    		        $verbe =~ s/j' |j'|je |tu |elle |nous |vous |ils |elles |il |lui |lui-même |me |moi |moi-même |te |toi |toi-même |elle-même |nous-même |vous-même |eux |eux-même |soi-même |toi-meme |elle-meme |nous-meme |vous-meme |soi-meme |toi meme |elle meme |nous meme |vous meme|eux meme |soi meme |soi même |toi même |elle même |nous même |vous même |moi-même |moi meme| moi-meme eux |eux meme |m' |ma |t' |ne |pas |y |ça |ce |n' |s' |c' |en |on |l' |le |la |les |leurs |pas //ig;
    		    $verbe =~ s/q' |que |qu' //ig;
    			$verbe =~ s/ $//g;
    			if (exists $tabformesV{lc($verbe)}) {
    				print "$verbe ==> $tabformesV{$verbe}\n";
    				#print "===>$phrase", "\n";
    			}
    			else{
    				 print "++++$verbe++++\n";
     
    			}
     
    		}
     
    	}
     
        $tree = $tree->delete;
    }
    &Lecture_et_traitement($corp);
     
    Merci d'avance pour vos proposition :)

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Bonjour,

    Il faudrait déjà connaitre l'encodage de tes fichiers. Vu ton code, je suppose qu'ils sont encodés en UTF-8 (et non utf8).
    Corrige donc déjà cela et on en reparle après.

    Autre remarque, l'appel de la fonction open ne me plait pas, tu devrais l'écrire de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    #!/usr/bin/perl
     
    #ligne de commande : perl extraction_phrase.pl -file <fichier.html> -list <fichier-formeverbales+lemmes>
     
     
    #====================================================================
    use strict;
    use warnings;
    use locale;
    use utf8;
    use Encode;
    use Getopt::Long;
    use HTML::TreeBuilder;
    #binmode STDOUT, 'utf8';
    binmode STDIN, 'utf8';
     
    #====================================================================
    # options
    sub usage {
        warn "Usage :
       -file           # fichier à analyser
       -list           # fichier contenant les verbes+lemmes
       \n"
    }
     
    my $corp;
    my $listverbs;
     
    unless (&GetOptions(
    	     "file=s", \$corp,
    		 "list=s", \$listverbs,
    	)) 
    {
        warn "Probleme d'options\n";
        &usage;
        die;
    }
    #=====================================================================
     
     
    my $ligne;
    my @lignes;
    my $forme;
    my $infinitif;
    my %tabformesV;
     
     
    sub FormesV{
        my ($f) = $_[0];
        open  F, '<:encoding(UTF-8)', $f or die "impossible d'ouvrir '$f' \n" ;
        warn "Lecture du fichier \n";
     
    	while (<F>) {
        	next if (/^#/);
    		$ligne = $_;
    		chomp ($ligne);
    		#print "===$ligne===\n";
        	($forme, $infinitif) = split (/\|/, $ligne);
    		$tabformesV{lc($forme)} = $infinitif;
    	}
     
    }
    &FormesV($listverbs);
     
    sub Lecture_et_traitement {
        my ($c) = $_[0];
        open  C, '<:encoding(UTF-8)', $c or die "impossible d'ouvrir '$c' \n" ;
        warn "Lecture et traitement du document \n";
     
        my $tree = HTML::TreeBuilder->new; # empty tree
        $tree->parse_file($c);
        my $root = HTML::TreeBuilder->new_from_file($c);
    	my @tabphrases = $root->look_down('_tag', 'p');
    	foreach my $p(@tabphrases){
    		my $phrase = $p->as_text;
    		#print "$phrase", "\n";
    		my @tabverbes = $p->look_down('_tag', 'b');
    		foreach my $v (@tabverbes){
    			my $verbe = $v->as_text;
    			#print "$verbe\n";
    			chomp ($verbe);
    			$verbe =lc($verbe);			
    			$verbe =~ s/^ //g;
    		        $verbe =~ s/j' |j'|je |tu |elle |nous |vous |ils |elles |il |lui |lui-même |me |moi |moi-même |te |toi |toi-même |elle-même |nous-même |vous-même |eux |eux-même |soi-même |toi-meme |elle-meme |nous-meme |vous-meme |soi-meme |toi meme |elle meme |nous meme |vous meme|eux meme |soi meme |soi même |toi même |elle même |nous même |vous même |moi-même |moi meme| moi-meme eux |eux meme |m' |ma |t' |ne |pas |y |ça |ce |n' |s' |c' |en |on |l' |le |la |les |leurs |pas //ig;
    		    $verbe =~ s/q' |que |qu' //ig;
    			$verbe =~ s/ $//g;
    			if (exists $tabformesV{lc($verbe)}) {
    				print "$verbe ==> $tabformesV{$verbe}\n";
    				#print "===>$phrase", "\n";
    			}
    			else{
    				 print "++++$verbe++++\n";
     
    			}
     
    		}
     
    	}
     
        $tree = $tree->delete;
    }
    &Lecture_et_traitement($corp);
     
    Merci d'avance pour vos proposition :)
    Regarde et lit notre FAQ, il y a des questions inintéressantes :

  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Problème d'encodage
    Salut,

    Merci pour ta réponse @Djibril. J'ignorais qu'il y a une différence entre utf8 et UTF-8. Mes fichiers sont tous en UTF-8 et j'ai fait ce que tu as dit, et également changé la manière d'appeler ma fonction "open" mais ça ne marche toujours pas.

    voici les trois préambules que j'ai testés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #====================================================================
    use strict;
    use locale;
    use Encode;
    use Getopt::Long;
    use HTML::TreeBuilder;
    binmode STDIN, 'UTF-8;
    binmode STDOUT, 'UTF-8
     
    #====================================================================
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #====================================================================
    use strict;
    use locale;
    use utf8;
    use Encode;
    use Getopt::Long;
    use HTML::TreeBuilder;
    #====================================================================
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #====================================================================
    use strict;
    use locale;
    use utf8
    use Encode;
    use Getopt::Long;
    use HTML::TreeBuilder;
    binmode STDIN, 'UTF-8;
    binmode STDOUT, 'UTF-8
    #====================================================================
    Avec chacun de ces préambules, aucun changement, le résultat est le même, pas de mots accentués reconnus. De plus, les lignes " binmode STDIN, 'UTF-8'; " et " binmode STDOUT, 'UTF-8'; " renvoient un message d'erreur "unkwon perlIO layer "UTF". Ou alors on n'appelle pas l'encodage UTF-8 de cette façon?

    Merci

  4. #4
    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
    Bonsoir,

    essaie ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    binmode STDIN, ':utf8';
    Et pareil pour STDOUT ou un handler de fichier.

    Mais pour un fichier il vaut mieux le faire à l'ouverture du fichier avec un truc de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    open my $FH, "<:utf8", $fichier or die "ouverture impossible de $fichier $!";

  5. #5
    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
    J'ajoute qu'un tuto sur l'encodage Unicode a été mis en ligne récemment. Tu y trouveras sans doute des informations intéressantes.

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Bonsoir,

    Il faudrait nous en dire plus :
    • version de Perl ;
    • système d'exploitation ;
    • Exemple de fichiers ;
    • ...


    Et nous dire ce que tu souhaites concrètement faire.

  7. #7
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Problème d'encodage
    Bonjour,

    Merci pour ta réponse @Lolo78 et pour le lien vers le tuto, j'ai fait les changements que tu m'as proposés mais toujours rien...

  8. #8
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Problème d'encodage
    Bonsoir,

    @Djibril,
    Voici les informations demandées
    • version de Perl : version perl : perl 5, version 18, subversion 2 (v5.18.2)
    • système d'exploitation : Linux 3.13.0-34-generic #60-Ubuntu UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
    • Exemple de fichiers : ci-joints
    • ...


    Je réexplique de façon détaillée ce que j'essaie de faire. J'ai deux fichiers qui selon la commande "file" sont bien en UTF-8 :

    f1: un fichier html contenant des phrases avec des verbes conjugués sous différentes formes (exemple : Ce chien a aboyé toute la nuit durant)
    f2: un fichier txt qui contient uniquement des formes conjuguées des verbes, associées à leurs infinitifs comme ceci:
    a abaissé|abaisser
    a abandonné|abandonner
    a abouti|aboutir
    a aboyé|aboyer
    etc...

    Mon but est de comparer les deux fichiers, afin d'identifier les formes verbales qui apparaissent à la fois dans les deux fichiers, comme on peut l'observer ci-dessus avec la forme "a aboyé".

    Le problème est que ma comparaison ne marche que pour les formes verbales non accentuées (j'ai servi, je marche, etc), je les identifie toutes sans problème. Cependant lorsqu'il s'agit des formes verbales ayant un accent, comme "a aboyé", le "matching" ne fonctionne pas.

    Je pense savoir exactement la source du problème. En effet, après avoir exécuté les différentes solutions que vous m'avez proposées, j'ai essayé de faire afficher le contenu de mes fichiers. Tous les mots s'affichent bien pour le fichier des verbes (f2) mais voici ce que j'obtiens pour le fichier des phrases (f1) :

    1) ont été rencontrées
    140 personnesNC ont été rencontrées entre novembre 1998 et avril 2000 ( médecinsNC généralistesADJ et spécialistes exerçant en établissement hospitalier
    2) être utilisées
    Les céphalosporinesNC ne peuvent pas être utilisées chez les patientsNC qui présentent une hypersensibilité de type 1 aux pénicillines
    etc...

    Les mots accentués n'apparaissent pas bien, ce qui explique pourquoi ils ne matchent pas les mots de f2.

    La question maintenant c'est comment convertir ce fichier en UTF-8 puisque la commande "file" me dit qu'il est déja en UTF-8 mais en réalité il semble ne pas l'être puisque les caractères accentués n'y apparaissent pas bien.

    Merci d'avance
    Fichiers attachés Fichiers attachés

  9. #9
    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
    Bonjour,

    je viens d'essayer ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    use strict;
    use warnings;
     
    my $fichier = "phrases.txt";
    open my $FH, "<:encoding(UTF-8)", $fichier or die "ouverture impossible de $fichier $!";
    binmode STDOUT, 'utf8';
    print $_ while <$FH>;
    et ça a l'air de fonctionner correctement. Voici un petit extrait de ce que ça m'affiche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <p>Connaître les coordonnées des membres de la SFC et de ses filiales . </p>

  10. #10
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Problème d'encodage
    Bonjour,

    Merci pour ta réponse Lolo78. Oui j'ai essayé d'afficher le contenu du fichier juste après l'ouverture, telle que tu l'as fait et ça affiche très bien. Mais je constate que, lorsque j'essaie d'afficher le contenu du fichier après avoir appelé HTML::Treebuilder, le problème des accents recommence. Le problème semble donc provenir de l'utilisation du module HTML::Treebuilder. Mais j'ignore comment le résoudre. Quelqu'un aurait-il une idée?
    Dans le code ci-dessous, j'ai mis en évidence les lignes du print fonctionne bien et de celui qui fournit un affichage problématique

    Merci


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    #!/usr/bin/perl
     
    #ligne de commande : perl extraction_phrase.pl -file <fichier.html> -list <fichier-formeverbales+lemmes>
     
     
    #====================================================================
    use strict;
    use warnings;
    use locale;
    use utf8;
    use Encode;
    use Getopt::Long;
    use HTML::TreeBuilder;
    binmode STDOUT, 'utf8';
    binmode STDIN, 'utf8';
     
    #====================================================================
    # options
    sub usage {
        warn "Usage :
       -file           # fichier à analyser
       -list           # fichier contenant les verbes+lemmes
       \n"
    }
     
    my $corp;
    my $listverbs;
     
    unless (&GetOptions(
    	     "file=s", \$corp,
    		 "list=s", \$listverbs,
    	)) 
    {
        warn "Probleme d'options\n";
        &usage;
        die;
    }
    #=====================================================================
     
     
    my $ligne;
    my @lignes;
    my $forme;
    my $infinitif;
    my %tabformesV;
     
     
    sub FormesV{
        my ($f) = $_[0];
        open  F, '<:encoding(UTF-8)', $f or die "impossible d'ouvrir '$f' \n" ;
        warn "Lecture du fichier \n";
     
    	while (<F>) {
        	next if (/^#/);
    		$ligne = $_;
    		chomp ($ligne);
    		#print "===$ligne===\n";
        	($forme, $infinitif) = split (/\|/, $ligne);
    		$tabformesV{lc($forme)} = $infinitif;
    	}
     
    }
    &FormesV($listverbs);
     
    sub Lecture_et_traitement {
        my ($c) = $_[0];
        open  C, '<:encoding(UTF-8)', $c or die "impossible d'ouvrir '$c' \n" ;
        warn "Lecture et traitement du document \n";
    #===================================================un print ici affiche le texte correctement=======================
        my $tree = HTML::TreeBuilder->new; # empty tree
        $tree->parse_file($c);
        my $root = HTML::TreeBuilder->new_from_file($c);
    	my @tabphrases = $root->look_down('_tag', 'p');
    	foreach my $p(@tabphrases){
    		my $phrase = $p->as_text;
    #============================================	#print "$phrase", "\n";================== à partir d'ici, l'affichage n'est plus correct
    		my @tabverbes = $p->look_down('_tag', 'b');
    		foreach my $v (@tabverbes){
    			my $verbe = $v->as_text;
    			#print "$verbe\n";
    			chomp ($verbe);
    			$verbe =lc($verbe);			
    			$verbe =~ s/^ //g;
    		        $verbe =~ s/j' |j'|je |tu |elle |nous |vous |ils |elles |il |lui |lui-même |me |moi |moi-même |te |toi |toi-même |elle-même |nous-même |vous-même |eux |eux-même |soi-même |toi-meme |elle-meme |nous-meme |vous-meme |soi-meme |toi meme |elle meme |nous meme |vous meme|eux meme |soi meme |soi même |toi même |elle même |nous même |vous même |moi-même |moi meme| moi-meme eux |eux meme |m' |ma |t' |ne |pas |y |ça |ce |n' |s' |c' |en |on |l' |le |la |les |leurs |pas //ig;
    		    $verbe =~ s/q' |que |qu' //ig;
    			$verbe =~ s/ $//g;
    			if (exists $tabformesV{lc($verbe)}) {
    				print "$verbe ==> $tabformesV{$verbe}\n";
    				#print "===>$phrase", "\n";
    			}
    			else{
    				 print "++++$verbe++++\n";
     
    			}
     
    		}
     
    	}
     
        $tree = $tree->delete;
    }
    &Lecture_et_traitement($corp);

  11. #11
    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
    Essaie peut-être ceci. Tu ouvres le fichier avec la syntaxe ci-dessus. Gobe tout le fichier dans une variable (en localisant la variable de séparation des enregistrements $/). Puis essaie d'appeler la méthode parse_file sur une référence vers cette variable. Je n'ai aucune idée si ça va marcher et ne peux pas tester maintenant, mais ça vaut sans doute le coup d'essayer. Quelque chose comme ça (encore une fois, pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    my $fichier = "phrases.html";
    open my $FH, "<:encoding(UTF-8)", $fichier or die "ouverture impossible de $fichier $!";
    my $file_content;
    {
         local $/;
         $file_content = <$FH>;
    }
    my $tree = HTML::TreeBuilder->new;
    $tree->parse_file(\$file_content);
    # ...

  12. #12
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Problème d'encodage
    Bonjour,

    Je viens d'essayer ceci, mais j'ai un message d'erreur : "Not a GLOB reference at /usr/lib/perl5/HTML/Parser.pm line 101, <$FH> line 1."
    J'avoue que j'ai eu du mal à intégrer le bout de code que tu m'as proposé dans le ie en utilisant "getoption". Peut-être j'ai mal écrit le code?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    #!/usr/bin/perl -w
    #ligne de commande : perl extraction_phrase.pl -file <fichier.html> -list <fichier-formeverbales+lemmes>
     
     
    #====================================================================
    use strict;
    use locale;
    use utf8;
    use Encode;
    use Getopt::Long;
    #use XML::Twig;
    use HTML::TreeBuilder;
    #binmode STDOUT, 'UTF-8';
    #binmode STDIN, 'UTF-8'; 
    binmode STDIN, ':utf8';
    binmode STDOUT, ':utf8';
     
     
    #====================================================================
    # options
    sub usage {
        warn "Usage :
       -list           # fichier contenant les verbes+lemmes
       \n"
    }
     
    #my $corp;
    my $listverbs;
     
    unless (&GetOptions(
    #	     "file=s", \$corp,
    		 "list=s", \$listverbs,
    	)) 
    {
        warn "Probleme d'options\n";
        &usage;
        die;
    }
    #=====================================================================
     
     
    my $ligne;
    my @lignes;
    my $forme;
    my $infinitif;
    my %tabformesV;
     
     
    sub FormesV{
        my ($f) = $_[0];
    	open  F, '<:encoding(UTF-8)', $f or die "impossible d'ouvrir '$f' \n" ;
    	#open  F, "<:utf8", $f or die "ouverture impossible de $f $!";
        #open (F, $f) or die "impossible d'ouvrir '$f' \n" ;
        warn "Lecture du fichier \n";
        #binmode(F, ':UTF-8');
     
    	while (<F>) {
        	next if (/^#/);
    		$ligne = $_;
    		chomp ($ligne);
    		#print "===$ligne===\n";
        	($forme, $infinitif) = split (/\|/, $ligne);
    		$tabformesV{lc($forme)} = $infinitif;
    	}	
    }
    &FormesV($listverbs);
     
     
    my $fichier = "cardio-pro-seg-ag.html"; #ce fichier remplace le fichier phrases.html
     
    sub Lecture_et_traitement {
    	my ($c) = $_[0];
    	open my $FH, "<:encoding(UTF-8)", $c or die "ouverture impossible de $c $!";
    	warn "Lecture et traitement du document \n";
    	my $file_content;
    	{
         local $/;
         $file_content = <$FH>;
    	}
    	my $tree = HTML::TreeBuilder->new;
    	$tree->parse_file(\$file_content);
        my $root = HTML::TreeBuilder->new_from_file(\$file_content);
    	my @tabphrases = $root->look_down('_tag', 'p');
    	foreach my $p(@tabphrases){
    		my $phrase = $p->as_text;
    		#print "$phrase", "\n";
    		my @tabverbes = $p->look_down('_tag', 'b');
    		foreach my $v (@tabverbes){
    			my $verbe = $v->as_text;
    			#print "$verbe\n";
    			#print "===>$phrase", "\n";
    			chomp ($verbe);
    			$verbe =lc($verbe);			
    			$verbe =~ s/^ //g;
    		    $verbe =~ s/j' |j'|je |tu |elle |nous |vous |ils |elles |il |lui |lui-même |me |moi |moi-même |te |toi |toi-même |elle-même |nous-même |vous-même |eux |eux-même |soi-même |toi-meme |elle-meme |nous-meme |vous-meme |soi-meme |toi meme |elle meme |nous meme |vous meme|eux meme |soi meme |soi même |toi même |elle même |nous même |vous même |moi-même |moi meme| moi-meme eux |eux meme |m' |ma |t' |ne |pas |y |ça |ce |n' |s' |c' |en |on |l' |le |la |les |leurs |pas //ig;
    		    $verbe =~ s/q' |que |qu' //ig;
    			$verbe =~ s/ $//g;
    			if (exists $tabformesV{lc($verbe)}) {
    				#print "$verbe ==> $tabformesV{$verbe}\n";
    				#print "===>$phrase", "\n";
    			}
    			else{
    				 #print "++++$verbe++++\n";
     
    			}
     
    		}
     
    	}
     
        $tree = $tree->delete;
    }
    &Lecture_et_traitement($fichier);

  13. #13
    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
    C'était juste une idée.

    Si tu as une variable scalaire contenant beaucoup de lignes de texte, il est possible de passer une référence à cette variable à la fonction open en sorte qu'ensuite, on lise sur le descripteur de fichier obtenu comme si c'était un simple ficher. Par exemple le petit script suivant et son affichage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    perl -e 'my $texte = " texte \n multiligne \n encore une ligne \n encore une \n";
    open my $FH, "<", \$texte or "die ouverture impossible $!";
    print $_ while <$FH> ;'
     texte
     multiligne
     encore une ligne
     encore une
    J'espérais que la stratégie employée ci-dessus pourrait peut-être marcher avec la méthode parse_file du module HTML::TreeBuilder, mais ce n'est apparemment pas le cas. L'erreur "Not a GLOB reference ..." indique que la méthode parse_file ne fonctionne pas sur ce point comme la fonction open.

    Mais en relisant la documentation de HTML::TreeBuilder:
    2. then use one of the methods from HTML:arser (presumably with $tree->parse_file($filename) for files, or with $tree->parse($document_content) and $tree->eof if you've got the content in a string) to parse the HTML document into the tree $tree.
    il semble que tu peux employer directement la chaîne de caractère qui vient d'être alimentée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $tree->parse_file($file_content);
    Je ne peux toujours pas tester, je te laisse essayer.

  14. #14
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Problème d'encodage
    Merci pour tes différentes idées Lolo78

    J'ai testé mais le problème persiste...

  15. #15
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Problème d'encodage
    Bonjour à tous

    Mon problème avec les accents n'est toujours pas résolu. Quelqu'un saurait-il comment gérer les problèmes d'encodage observés après le parsing d'un fichier en utilisant HTML::Treebuilder?

    Merci

  16. #16
    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
    La classe HTML::Treebuilder hérite de la classe HTML:: Parser qui, dans son abondante documentation affirme qu'il sait traiter de l'Unicode/UTF-8 (à partir de Perl 5.8):

    HTML:: Parser can parse Unicode strings when running under perl-5.8 or better. If Unicode is passed to $p->parse() then chunks of Unicode will be reported to the handlers. The offset and length argspecs will also report their position in terms of characters.

    It is safe to parse raw undecoded UTF-8 if you either avoid decoding entities and make sure to not use argspecs that do, or enable the utf8_mode for the parser. Parsing of undecoded UTF-8 might be useful when parsing from a file where you need the reported offsets and lengths to match the byte offsets in the file.

    If a filename is passed to $p->parse_file() then the file will be read in binary mode. This will be fine if the file contains only ASCII or Latin-1 characters. If the file contains UTF-8 encoded text then care must be taken when decoding entities as described in the previous paragraph, but better is to open the file with the UTF-8 layer so that it is decoded properly:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       open(my $fh, "<:utf8", "index.html") || die "...: $!";
       $p->parse_file($fh);
    If the file contains text encoded in a charset besides ASCII, Latin-1 or UTF-8 then decoding will always be needed.

  17. #17
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Je regarde ce soir.

  18. #18
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Ton programme est-il encodé en UTF-8 ?
    Avec tes deux fichiers d'exemple, on devrait avoir quel résultat ?

  19. #19
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 10
    Points : 1
    Points
    1
    Par défaut Problème d'encodage
    Bsr,

    Oui mon script est bien encodé en UTF-8.

    Je crois avoir trouvé la solution. Vraiment un truc tout bête! Je viens de mettre en commentaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #binmode STDIN, 'utf8';
    #binmode STDOUT, 'utf8';
    Curieusement j'ai un bon affichage . Je suis pourtant persuadée d'avoir déja essayé ça mais sans que cela ne résolve le problème d'affichage! Bah tant mieux si ça marche cette fois

    Merci à tous pour vos contributions.
    Bonne soirée

  20. #20
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 818
    Points : 499 183
    Points
    499 183
    Par défaut
    Après un peu de réécriture, voici ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    #!/usr/bin/perl
     
    #ligne de commande : perl extraction_phrase.pl -file <fichier.html> -list <fichier-formeverbales+lemmes>
     
    #====================================================================
    use strict;
    use warnings;
    use locale;
    use utf8;
    use Encode;
    use Getopt::Long;
    use HTML::TreeBuilder;
     
    ActiverAccents();
     
    #====================================================================
    # options
    my $corp;
    my $listverbs;
     
    GetOptions( "file=s", \$corp, "list=s", \$listverbs, );
     
    my $ref_tabformesV = FormesV($listverbs);
    Lecture_et_traitement($corp, $ref_tabformesV);
     
    sub FormesV {
    	my $file_liste = shift;
    	my %tabformesV;
     
    	open my $fh, '<:encoding(UTF-8)', $file_liste or die "impossible d'ouvrir '$file_liste' \n";
    	print "Lecture du fichier\n";
     
    	while ( my $ligne = <$fh> ) {
    		chomp $ligne;
    		next if ( $ligne =~ /^#/ );
     
    		#print "===$ligne===\n";
    		my ( $forme, $infinitif ) = split( /\|/, $ligne );
    		if ( my ( $forme, $infinitif ) = split( /\|/, $ligne ) ) {
    			$tabformesV{ lc($forme) } = $infinitif;
    		}
    	}
    	return \%tabformesV;
    }
     
    sub Lecture_et_traitement {
    	my ($fichier, $ref_tabformesV) = @_;
    	open my $fh, '<:encoding(UTF-8)', $fichier or die "impossible d'ouvrir '$fichier' \n";
    	print "Lecture et traitement du document \n";
     
    	my $root = HTML::TreeBuilder->new_from_file($fh);
    	my @tabphrases = $root->look_down( '_tag', 'p' );
    	foreach my $p (@tabphrases) {
    		my $phrase = $p->as_text;
    		my @tabverbes = $p->look_down( '_tag', 'b' );
    		foreach my $v (@tabverbes) {
    			my $verbe = $v->as_text;
     
    			#print "$verbe\n";
    			chomp($verbe);
    			$verbe = lc($verbe);
    			$verbe =~ s/^ //g;
    			$verbe =~
    s/j' |j'|je |tu |elle |nous |vous |ils |elles |il |lui |lui-même |me |moi |moi-même |te |toi |toi-même |elle-même |nous-même |vous-même |eux |eux-même |soi-même |toi-meme |elle-meme |nous-meme |vous-meme |soi-meme |toi meme |elle meme |nous meme |vous meme|eux meme |soi meme |soi même |toi même |elle même |nous même |vous même |moi-même |moi meme| moi-meme eux |eux meme |m' |ma |t' |ne |pas |y |ça |ce |n' |s' |c' |en |on |l' |le |la |les |leurs |pas //ig;
    			$verbe =~ s/q' |que |qu' //ig;
    			$verbe =~ s/ $//g;
    			if ( exists $ref_tabformesV->{ lc($verbe) } ) {
    				print "$verbe ==> " . $ref_tabformesV->{ lc($verbe) } . "\n";
     
    				#print "===>$phrase", "\n";
    			}
    			else {
    				print "++++$verbe++++\n";
     
    			}
     
    		}
     
    	}
     
    	close($fh);
    }
     
     
    sub ActiverAccents {
    	my $encodage;
     
    	# Windows
    	if ( lc($^O) eq 'mswin32' ) {
    		eval {
    			my ($codepage) = ( `chcp` =~ m/:\s+(\d+)/ );
    			$encodage = "cp$codepage";
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};
    	}
    	else {
    		$encodage = `locale charmap`;
    		eval {
    			foreach my $h ( \*STDOUT, \*STDERR, \*STDIN, ) {
    				binmode $h, ":encoding($encodage)";
    			}
    		};
    	}
    	return $encodage;
    }
    Ce qui me donne ce résultat :
    Lecture du fichier
    Lecture et traitement du document
    ++++devenez++++
    ++++sommes nous++++
    ++++archives++++
    ++++parrainées++++
    ++++dossier++++
    ++++extérieures++++
    ++++dossier++++
    ++++cardiologues++++
    ++++êtes++++
    ++++prise++++
    ++++procédures++++
    ++++prise++++
    ++++soumettez++++
    ++++prise++++
    ++++risque++++
    ++++ayant++++
    ++++est++++
    ++++estimée++++
    ++++prenant++++
    ++++risque++++
    sont dominées ==> dominer
    ++++est favorisé++++
    ++++lire++++
    ++++pdf++++
    ++++presse++++
    ++++se connecter++++
    ++++sont activés++++
    ++++..++++
    ++++devez++++
    ++++pouvoir++++
    ++++connecter++++
    ++++perdu++++
    Programme exécuté sous Windows. Tu prêtera une attention au code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $root = HTML::TreeBuilder->new_from_file($fh);
    Documentation du module :
    When you pass a filename to parse_file, HTML::Parser opens it in binary mode, which means it's interpreted as Latin-1 (ISO-8859-1). If the file is in another encoding, like UTF-8 or UTF-16, this will not do the right thing.

    One solution is to open the file yourself using the proper :encoding layer, and pass the filehandle to parse_file.
    Voilà, bonne soirée !

Discussions similaires

  1. [CSV] Problème d'encodage
    Par simoryl dans le forum Langage
    Réponses: 13
    Dernier message: 18/04/2012, 16h20
  2. Problème d'encodage en Unicode
    Par Skreo dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 28/12/2005, 11h43
  3. Problème d'encodage sur MySql 4.1
    Par Blanchet dans le forum Outils
    Réponses: 1
    Dernier message: 04/12/2005, 05h53
  4. [XML::PARSER] Problème d'encodage
    Par frangin2003 dans le forum Modules
    Réponses: 13
    Dernier message: 05/09/2005, 15h59
  5. Problème execution script perl
    Par 00sebbe dans le forum Apache
    Réponses: 1
    Dernier message: 29/08/2005, 15h43

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