use strict; use iterd; # parcours une arborescence use tagger; # encapsulation tree-tagger er Cie use XML::XPath; use XML::LibXML; use File::Basename; # # Usage : perl fils2text.pl /tmp/nuages/2006 /tmp/resdata /home/yan/treetager/cmd/tree-tagger-french # # my $rep="$ARGV[0]"; # Nom du répertoir à parcourir $rep=~ s/[\/]$//; # on s'assure que le nom du répertoire ne se termine pas par un "/" # # 1. directory des résultats # my $resultdir = "$ARGV[1]" ; # # 2. La commande pour étiqueter # my $tagcmd="$ARGV[2]"; if ( ! (-f $tagcmd && -x $tagcmd ) ) { print "Fichier $tagcmd introuvable ou non executable \n "; exit; } # system ( sprintf ("mkdir -p %s" , $resultdir ) ); # # fichier qui va cumuler le texte à étiqueter # my $filetotag = "$resultdir/filetotag"; open (HANDLETAG,">:utf8",$filetotag) or die("$!"); my $refhand = \*HANDLETAG ; # my $resultag = "$resultdir/resultag"; # # NBR (globale ) sert de compteur pour indexer les fichiers à l'intérieur d'une archive. # my $NBR = 0 ; # # On crée un itérateur ( voir classe iterd ci joint ) pour parcourir l'arborescence. # il appellera la fonction extract ( ci dessous ) sur chaque fichier # en lui passant l'info dont elle a besoin. # print "Parcours et extraction de $rep \n"; my $walker = new iterd(); $walker->setFunction ( \&extract ) ; #my $data = {'filetotag' => $refhand , 'fromfile' => $mapfromfile }; my $data = {'filetotag' => $refhand }; $walker->setData ($data) ; $walker->traverse($rep) ; close ($refhand) ; # # Le cumul est fait . On étiquette # print "tree-tagger sur $filetotag et résultat dans $resultag \n"; my $tagger = new tagger(); $tagger->setCommand ( $tagcmd ); $tagger->setTextAsFile ($filetotag); $tagger->setOutFile ($resultag); $tagger->process(); # # On lit le résultat de l'étiquetage et on crée un fichier xml correspondant au fils # en cours de traitement # la structure ainsi crée est parallèle à celle que l'on a en entrée. # my $mark = '^__{FROMFILE[0-9]+'. $rep . '/([^}]+)}__$'; # open(FIC,"<$resultag") ; my $l ; my $dom = undef ; my $root = undef ; my $fullp = undef ; my $dirnm = undef ; while ( defined( $l = ) ) { chomp $l; my @tab = (); @tab = split (/\t/ , $l); if ( $tab[0] =~ m|$mark| ) { #__{FROMFILE1/tmp/nuages/2006/Jan/18/23-30-00/0,2-3208,1-0,0.xml}__ VER:pper # toFile du précédent document et compression # alloc du nouveau if ( defined ( $dom ) ) { $dom->toFile($fullp, 2); system ( sprintf ("gzip %s" , $fullp) ); } else { $dom = XML::LibXML::Document->createDocument( "1.0", "UTF-8" ); $root = $dom->createElement( "etik" ); $dom->setDocumentElement( $root ); } $fullp = "$resultdir". "/". $1 ; $dirnm = dirname($fullp) ; system ( sprintf ("mkdir -p %s" , $dirnm) ) ; } else { my $word = $dom->createElement("w"); if ( $tab[2] =~ m// ) { $word->setAttribute("lemma","unknown"); } else { $word->setAttribute("lemma",$tab[2]); } $word->setAttribute("type",$tab[1]); $word->appendTextNode( $tab[0] ); $root->appendChild($word); } } # # dernier mkdir, dernier toFile et compression # system ( sprintf ("mkdir -p %s" , $dirnm) ) ; $dom->toFile($fullp, 2); system ( sprintf ("gzip %s" , $fullp) ); # print "Le corpus a été étiqueté dans $resultdir \n" # exit ; # #FIN ######################################################################################### # # Fonction extract: # # Elle est appelée sur chaque fichier xml de l'arborescence. # Elle recoit 2 arguments : # $file : le fichier à traiter ( extraire le texte de la balise "description" ) # data->filetotag : le fichier dans lequel écrire le texte extrair # sub extract { my ($file,$data) = @_; my $filetotag = $data->{filetotag}; # # 1.On crée un filtreur pour $file #$mot =~ m/__\{FROMFILE[0-9]+\}__/ # 0,2-3208,1-0,0.xml uniquement # if ( $file !~ /\d+,\d+-\d+,\d+-\d+,\d+\.xml$/ || -z $file ) { return ; } my $xp = XML::XPath->new(filename => $file ); my @tabres = $xp->findnodes('//item/description/text()'); # # le tableau tabres contient le texte des # balises "description". Après un nettoyage sommaire # On écrit tout ça dans $filetotag # $NBR++ ; my $key = "__{"."FROMFILE"."${NBR}".$file."}__" ; print $filetotag "$key\n" ; foreach my $node (@tabres) { my $v = $node->toString() ; if ( $v !~ /http:\/\/www\.lemonde\.fr/ ) { print $filetotag "$v\n"; } } return ; }