Boite à Outils - Série 3

Extraction de patrons

Nous avons ici extrait des patrons morpho-syntaxiques à partir de nos fichiers étiquetés, soit les fichiers.cnr et les fichiers.xml étiquetés par la Boite à Outils 2.

Nous avons procédé de trois manières différentes.

1. Première méthode - avec fichier patron


#!/usr/bin/perl
use utf8;
binmode STDOUT, ":utf8";

open (FIC, "<:encoding(utf-8)", $ARGV[0]);
open (MOTIF, "<:encoding(utf-8)", $ARGV[1]);

my @PATRON = <MOTIF>;
my @TOKEN=();
my @ETIQ=();

while (my $ligne = <FIC>)
{
    $ligne=~s/\r//;
    chomp($ligne);
    
    if ($ligne=~/^([^\t]+)\t([^\t]+)\t([^\t]+)$/)
    {

        if ($ligne!~/^PCTF/) 
        {
            chomp($ligne);
            my @LISTE = split(/\t/, $ligne);
            push(@TOKEN,$token[0]);
            push(@ETIQ,$etiq[2]);
        }
        else
        {
            &routine
            @TOKEN = ();
            @ETIQ = ();
        }
    }
}
close FIC;
close MOTIF;

#-----------------------------------------------------
sub routine {
    my ($first,$second)=@_;
    my @TOKEN=@$first;
    my @ETIQ=@$second;
    foreach my $patron (@LISTEPATRON) {
        $patron=~s/\r//;
        chomp $patron;
        my $texte_des_pos=join(" ",@ETIQ);
        while ($texte_des_pos=~/$patron/g)
        {
            my $contextebefore=$`;
            my $compteespace=0;
            while ($contextebefore=~/\t/g)
            {
                $compteespace++;
            }
            
            my @PATRONENCOURS=split(/ /, $patron);
            my $longueurpatron=$#PATRONENCOURS;
            my $total = $compteurblanc + $longueurpatron;
            print "@TOKEN[$compteurblanc..$total] \n";
        } 
    }
}
									

Exemple de sortie

La sortie correspond ici au fichier patron suivant : NCFS PREP NCFS / NCMS PREP NCFS / NCMS ADJMS

1.1 Première méthode - sans fichier patron



#!/usr/bin/perl
# extraction de patrons sur sortie Coridal
# commande : perl patron.pl new_3208.cnr
#----------------------------------------
open(FILE,"$ARGV[0]");

my @lignes=<FILE>;
close(FILE);
my %dicopatron=();
while (my $ligne=shift(@lignes)) {
    chomp $ligne;
    my $sequence="";
    my $longueur=0;
    if ( $ligne =~ /^([^\t]+)\t[^\t]+\tNC.*/) {
		my $forme=$1;
		$sequence.=$forme;
		$longueur=1;
		my $nextligne=$lignes[0];
		if ( $nextligne =~ /^([^\t]+)\t[^\t]+\tPREP.*/) {
			my $forme=$1;
			$sequence.=" ".$forme;
			$longueur=2;
			my $nextnextligne=$lignes[1];
			if ( $nextnextligne =~ /^([^\t]+)\t[^\t]+\tNC.*/) {
			my $forme=$1;
			$sequence.=" ".$forme;
			$longueur=3;
			}
		}
    }
    if ($longueur == 3) {
		# print $sequence;
		$dicopatron{$sequence}++; 
    }
}
foreach my $patron (sort {$dicopatron{$b} <=> $dicopatron{$a}} (keys %dicopatron)) {
	print "$patron : $dicopatron{$patron}\n";
			

Exemple de sortie

2. Deuxième méthode - XQuery

Requête

La requête suivante extrait les patrons NOM PRP NOM.

Résultat

On obtient en sortie :

3. Troisième méthode - XSLT

Feuille de style

La feuille de style suivante extrait les patrons NOM PRP NOM.

Exemple de sortie