Boîte à outils 2
Pour pouvoir extraire des structures morpho-syntaxiques, il faut d'abord étiqueter morphologiquement les données avec un POS-tagger comme TreeTagger ou Cordial.
Ce script est sensiblement identique au tout premier : il ajoute seulement à la chaîne de traitement une fonction qui se charge de l'étiquetage via TreeTagger.
#/usr/bin/perl
my $rep="$ARGV[0]";
my $rubrique = "$ARGV[1]";
my %dico;
# On s'assure que le nom du répertoire ne se termine pas par un "/"
$rep=~ s/[\/]$//;
# Variable contenant le flux de sortie
my $output1="$rubrique.xml";
# Ouverture du fichier de sortie
if (!open (FILEOUT,">$output1")){die "Pb a l'ouverture du fichier $output1"};
print FILEOUT "\n";
print FILEOUT "<parcours>\n";
print FILEOUT "\t<nom>Zakarya</nom>\n";
close (FILEOUT);
#Lancement de la récursion, qui se terminera après examen de toute l'arborescence.
&parcoursarborescencefichiers($rep);
open (FILEOUT,">>:encoding(utf-8)", $output1);
print FILEOUT "<parcours>\n";
close(FILEOUT);
exit;
sub parcoursarborescencefichiers
{
my $path = shift(@_) ;
opendir(DIR, $path) or die "can't open $path: $!\n";
my @files = readdir(DIR);
closedir(DIR);
foreach my $file (@files)
{
next if $file =~ /^\.\.?$/;
$file = $path."/".$file; #2016/01/19,00,00
if (-d $file)
{
print " début répertoire ==> $file\n";
&parcoursarborescencefichiers($file);
print " fin répertoire ==> $file\n";
}
if (-f $file)
{
if ($file =~ /$rubrique.+\.xml$/)
{
print "<",$i++,"> ==> ",$file,"\n";
#traitement pour extraire texte
$codage = "utf-8";
open (FIC, "<:encoding($codage)", $file);
open (OUT, ">>:encoding($codage)", "$rubrique.txt");
open (OUT2, ">>:encoding($codage)", "$rubrique.xml");
#ramener tout le flux textuel de FIC sur une seule ligne
my $texte="";
while (my $ligne = <FIC>)
{
chomp $ligne;
$ligne =~ s/\r//g;
$texte = $texte . $ligne;
}
close FIC;
# Extraction du contenu des balises
while($texte =~ m/>\s+<title>([^<]+?)<\/title><link>(?:[^<]+?)<\/link><description>([^<]+?)<\/description>/)
{
my $titre = $1;
my $description = $2;
# Mise en forme des titres
$titre.=".";
$titre=~s/\?\.$/\?/;
# L'impression ne se déroule que si le titre est unique
if (!(exists $dico{$titre}))
{
$dico{$titre} = 1;
print TEXT "Titre : $titre\n";
print TEXT "Description : $description\n\n";
# Etiquetage par TreeTagger
my ($titretag,$descriptiontag) = &etiquetage($titre,$description);
print XML "\t<item>\n" ;
print XML "\t\t<title>$titre</title>\n" ;
print XML "\t\t<description>$description</description>\n";
print XML "\t</item>\n"
}
}
}
}
close TEXT;
close XML;
}
}
sub etiquetage
{
my ($t,$d)= @_;
# Traitement du titre
open(TMP,">:encoding(utf8)","titre.txt");
print TMP $t;
close TMP;
# Lancement de l'étiquetage par TreeTagger
system("perl tokenise-utf8.pl titre.txt | tree-tagger.exe -token -lemma -no-unknown french-utf8.par > titre_tag.txt");
system("perl treetagger2xml-utf8.pl titre_tag.txt utf8");
#résultat est contenu dans titre_tag.txt.xml
open(TMP2, "<:encoding(utf8)","titre_tag.txt.xml");
my $t_tag="";
my $ligne = <TMP2>;
while (my $ligne = <TMP2>)
{
$t_tag = $t_tag . $ligne;
}
close TMP2;
# Traitement de la description
open(TMP,">:encoding(utf8)","description.txt");
print TMP $d;
close TMP;
# Lancement de l'étiquetage par TreeTagger
system("perl tokenise-utf8.pl description.txt | tree-tagger.exe -token -lemma -no-unknown french-utf8.par > description_tag.txt");
system("perl treetagger2xml-utf8.pl description_tag.txt utf8");
#résultat est contenu dans titre_tag.txt.xml
open(TMP2, "<:encoding(utf8)","description_tag.txt.xml");
my $d_tag="";
my $ligne = <TMP2>;
while (my $ligne = <TMP2>)
{ #chomp $ligne;
$d_tag = $d_tag . $ligne;
}
close TMP2;
return($t_tag,$d_tag);
}
On obtient alors un fichier XML taggé :
<element><data type="type">DET:ART</data><data type="lemma">un</data><data type="string">Une</data></element>
<element><data type="type">NOM</data><data type="lemma">photographie</data><data type="string">photographie</data></element>
<element><data type="type">VER:pper</data><data type="lemma">prendre</data><data type="string">prise</data></element>
<element><data type="type">PRP</data><data type="lemma">à</data><data type="string">à</data></element>
<element><data type="type">NAM</data><data type="lemma">Manchester</data><data type="string">Manchester</data></element>
<element><data type="type">VER:pres</data><data type="lemma">montrer</data><data type="string">montre</data></element>
<element><data type="type">DET:ART</data><data type="lemma">le</data><data type="string">les</data></element>
<element><data type="type">NOM</data><data type="lemma">excès</data><data type="string">excès</data></element>
<element><data type="type">PRP</data><data type="lemma">de</data><data type="string">de</data></element>
<element><data type="type">DET:ART</data><data type="lemma">le</data><data type="string">la</data></element>
<element><data type="type">NOM</data><data type="lemma">soirée</data><data type="string">soirée</data></element>
<element><data type="type">PRP:det</data><data type="lemma">du</data><data type="string">du</data></element>
<element><data type="type">NAM</data><data type="lemma">unknown</data><data type="string">Nouvel</data></element>
<element><data type="type">NAM</data><data type="lemma">unknown</data><data type="string">An</data></element>
<element><data type="type">SENT</data><data type="lemma">.</data><data type="string">.</data></element>
On s'est aussi servi du logiciel Cordial pour étiqueter nos données. Vous trouverez ci-contre un exemple de sortie Cordial.
Jean-Marie Jean-Marie NPMS
Le Pen Le pen ADJMS
suscite susciter VINDP3S
la le DETDFS
polémique polémique NCFS
au au DETDMS
Parlement parlement NCMS
européen européen ADJMS