Série 2 : Etiquetage


TreeTagger



A partir de la même arborescence que pour la série 1, il s'agit d'étiqueter le contenu des balises <description> avec TreeTagger.

Appliqué sur le dossier 2005 on obtient en sortie le fichier 2005.xml
Puis en lui appliquant une feuille de style on obtient cette visualisation où les noms apparaissent en rouge.

Le contenu du programme :


#!/usr/bin/perl
<<DOC;
Format d\'entree : un texte étiqueté et lemmatisé par tree tagger
Format de Sortie : le même texte au format xml
DOC


# Usage
$ChaineUsage="Usage : tt2xml.pl <Fichier>\n";
if (@ARGV!=1) {
die $ChaineUsage;
}

$t=0;
&ouvre;
&entete;
my $rep="$arg";
# on s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
print "Quelle est la balise à extraire ?\n";
$exp=<STDIN>;
chomp $exp;
&parcoursarborescencefichiers($rep);
&fin;
&ferme;



# Récupération des arguments et ouverture des tampons


sub ouvre {
$arg = $ARGV[0];
$FichierSortie= $arg . ".xml";
open(Sortie,">$FichierSortie");
}
# Entête de document XML
sub entete {
print Sortie "<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"no\"?>\n<?xml-stylesheet type=\"text/xsl\" href=\"StyleT.xsl\"?>\n";
print Sortie "<document>\n<Nom>Aurélia Trinquier</Nom>\n";
}

sub parcoursarborescencefichiers {
my $path = shift(@_);
opendir(DIR, $path) or die "ne peut ouvrir $path: $!\n";
my @files = readdir(DIR);
closedir(DIR);
foreach my $file (@files) {
next if $file =~ /^\.\.?$/;
$file = $path."/".$file;
if (-d $file) {
&parcoursarborescencefichiers($file); #recurse!
}
if (-f $file) {
# TRAITEMENT à réaliser sur chaque fichier

open(FILEINPUT,$file);

print Sortie "<fichier>\n<nom>$file</nom>\n";
while ($ligne = <FILEINPUT>)
{
if ($ligne=~/<$exp>(.*)<\/$exp>/)
{ open(OUTPUT,">resultats.txt");
print Sortie "<description>\n";
$ligne=$1;

# Rectification des problèmes de codage

$ligne=~s/(&#39;)/\'/g;
$ligne=~s/(&#34;)/\"/g;
$ligne=~s/à©/é/g;
$ligne=~s/é/é/g;
$ligne=~s/ê/ê/g;
$ligne=~s/è/è/g;
$ligne=~s/Ã/à/g;
$ligne=~s/ç/ç/g;
$ligne=~s/à§/ç/g;
$ligne=~s/à´/ô/g;
$ligne=~s/(é)/é/g;
$ligne=~s/(ê)/ê/g;

# Séparation du texte en 1 mot par ligne

$ligne=~s/( )/\n/g;
$ligne=~s/([,\;:!?\.'\"\(\)])/\n$1\n/g;
print OUTPUT $ligne;

#Fermeture du fichier resultats.txt

close(OUTPUT);


#Lancement du TreeTagger
system ("bin/tree-tagger.exe -token -lemma lib/french.par resultats.txt treetagger.txt");

open(TREE,"treetagger.txt");

while ($tree = <TREE>) {
if ($tree!~/\ô\¯\:\.\ô\¯\:\.\./ ) {
# Remplacement des guillemets par <![CDATA["]]> (évite erreur d'interprétation XML)
$tree=~s/\"/<![CDATA[\"]]>/g;
$tree=~s/(<unknown>)/unknown/g;
# Suppression des caractères générés par TreeTagger empêchant la bonne formation du fichier xml
$tree=~s/(.*°I..)//g;
$tree=~s/([^\t]*)\t([^\t]*)\t([^\n]*)\n/<element>\n <data type=\"cat\">$2<\/data>\n <data type=\"lemme\">$3<\/data>\n <data type=\"mot\">$1<\/data>\n<\/element>/;

print Sortie $tree;
}

}
close(TREE);
print Sortie "\n</description>\n";
}
}


print Sortie "</fichier>\n";
}
# Fin de fichier
sub fin {
print Sortie "</document>\n";
}
}
}
# Fermeture des tampons
sub ferme {
close(Sortie);
}