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