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 :

Liste thématique xml


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut Liste thématique xml
    Bonjour,

    je cherche à faire une recherche thématique dans un texte à l'aide d'un script PERL. Je m'explique :

    en input :

    un fichier XML : <titrelivre>bla bla...</titrelivre><resumelivre>Oui-oui se promenait dans sa voiture rouge et jaune. [...]</resumelivre>

    en ressource externe :

    une liste de mot (un mot/ligne) sur le thème de l'automobile :

    voiture
    volant
    roue
    [...]

    en résultat :

    un fichier XML : <titrelivre>bla bla...</titrelivre><resumelivre>Oui-oui se promenait dans sa <theme>voiture</theme> rouge et jaune. [...]</resumelivre><mots-theme>voiture, [...], [...]</mots-theme>


    Pour résumer je souhaiterai rajouter la balise <theme> quand on retrouve dans le texte un mot de la liste thématique mais aussi que les mots retrouvés à partir de la liste thématique soit insérés dans le fichier XML séparés par une virgule.

    Je suis novice en PERL et je ne sais par où commencer.

    Merci d'avance de votre aide.

  2. #2
    Membre éclairé
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Par défaut
    Bonjour,

    Si tu ne connais pas bien perl, tu devrais jeter un oeil au tuto de Sylvain Lhullier qui t'expliquera très bien les fonctions dont je vais te parler (un autre tuto de ton choix sera aussi surement très bien )

    1- Mets dans une hash ou un tableau tes mots thématiques

    2- Lis ton fichier XML ligne par ligne. A chaque ligne tu feras une succession d'étapes:

    -Dans une boucle foreach, cherches tous tes mots clés($theme) dans la ligne courante. Pour chercher ces mots clés, tu peux faire une expression régulière qui remplacera automatiquement la variable $theme par <theme>$theme</theme>.

    -Ta recherches te servira aussi de test. S'il est positif (c'est à dire que tu as effectivement trouvé le mot $theme), stockes ton mot thème dans un tableau, ou directement sous forme d'une variable de type string ($currentThemes).

    Quand ta boucle foreach est termignée, concatène ta ligne avec ta balise <mots-theme>$currentThemes</mots-theme>

    C'est un algorithme très général je te laisse chercher un peu pour le détail du code

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Pour commencer, choisis-toi un parseur XML (un parseur DOM sera pratique pour modifier la structure par la suite, XML::DOM par exemple).

    Ensuite, parcours lis ton fichier de theme et stocke les informations dans un hash, comme ceci par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    open my $THEME, "<", "themes.txt" or die "Can't ope, themes.txt for reading: $!";
    my %theme = map { chomp; $_ => 1 } <$THEME>;
    Ensuite, à l'aide du parseur, parcours tous les tags <resumelivre> et pour chacun, applique une modification à l'aide, par exemple, d'une expression régulière de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    my @mots_theme = ();
    $resume =~ s{\b(\w+)\b}{exists $theme{$1} ? (push @mots_theme, $1, "<theme>$1</theme>") : $1}ge;
    Puis après chaque tag <resumelivre>, tu y ajoutes un frère <mots-theme> dont le contenu sera constitué ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $mots_theme = join ",", @mots_theme;
    Voila, il ne te reste plus qu'à mettre un peu de glue entre tout ça, et peut-être te poser les bonnes questions sur la portée de @mots_theme.

    Cordialement.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    Merci à vous deux pour vos réponses.

    Alors j'ai bien réussi à faire quelques brides du script en combinant vos deux réponses. Mais la chose que je n'arrive pas à comprendre et la lecture du fichier XML. J'ai bien lu en détail le tutoriel sur Perl et les fichiers XML mais rien n'y fait, je n'arrive pas trouver le code qui lis mon fichier xml ligne par ligne et qui lorsqu'il rencontre le tag <resumelivre> il modifie ce que je veux.

    J'avais trouvé le script ParseurXMLSimple ici :

    http://djibril.developpez.com/tutori.../perl-xml/#LVI

    mais je ne comprends plus rien à partir du commentaire Procédures.

    La glue ne veut peut adhérer avec moi

  5. #5
    Membre éclairé
    Homme Profil pro
    BioInformaticien
    Inscrit en
    Décembre 2012
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : BioInformaticien
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2012
    Messages : 49
    Par défaut
    N'hésite pas a montrer ton avancée qu'on puisse t'indiquer quoi faire

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    open(XmlFile,"chemin/vers/xml") or die("open: $!");
    while( defined( $line = <XmlFile> ) ) {	#Fais défiler les lignes une par une dans la variable $line
    	foreach my $theme (@AllThemes){
    		$line =~ s/$theme/<theme>$theme<\/theme>/g;	#ajoute les balises theme ; 
    		print $line;	#pour vérifier que tu as bien ce que tu cherches
    	}
    }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2011
    Messages : 77
    Par défaut
    Voici où j'en suis dans mon script :

    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
    #! /usr/bin/perl
    use strict;
    use warnings;
    use XML::Simple;
     
     
    #Liste de themes dans un hash
    open my $THEME, "<", "themes.txt" or die "Can't open themes.txt for reading: $!";
    my %theme = map { chomp; $_ => 1 } <$THEME>;
     
    my $xml = new XML::Simple;
     
    #Lecture du fichier xml ligne par ligne
    my $data = $xml->XMLin('exempleXML.xml');
     
    my @mots_theme = ();
     
    foreach my $abstract ( @{$data->{resumelivre}})
    $abstract =~ s{\b(\w+)\b}{exists $theme{$1} ? (push @mots_theme, $1, "<theme>$1</theme>") : $1}ge;
     
    #Ajout d'un frère à <resumelivre>
     
    #Contenu de mots_theme
    my $mots_theme = join ",", @mots_theme;


    Encore merci.

  7. #7
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Il faut que tu mettes des accolades autour des opérations de ton foreach.

    Sinon, je suppose que @{$data->{resumelivre}} ne va pas convenir pour parcourir tous les élément resumelivre, mais je peux me tromper, je ne connais pas bien le module XML::Simple.
    A ta place, je partirais en mode debug pour découvrir comment est structuré $data et le parcourir convenablement (ou je lirais la doc en profondeur).

Discussions similaires

  1. [SimpleXML] Gestion d'une liste avec xml
    Par juninho269 dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 29/05/2008, 17h06
  2. Combobox, list et XML
    Par faithinlove dans le forum Flash
    Réponses: 1
    Dernier message: 26/03/2008, 10h04
  3. [Package listings] Commentaires XML et quote
    Par arnobidul dans le forum Mise en forme
    Réponses: 0
    Dernier message: 27/07/2007, 11h54
  4. [JDOM] Probleme liste et XML
    Par xavier1936 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 16/04/2007, 17h59
  5. [XML]Liste élément XML
    Par SteelBox dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 15/06/2006, 00h11

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