BAO 3

BAO 3

La BAO 3 a pour objectif de permettre une recherche de patrons, c'est-à-dire d'une suite d'étiquettes spécifique en parcourant une liste des tokens et une liste de leurs étiquettes correspondantes.

Pour ce faire nous avons utilisé les fichiers résultants de deux étiqueteurs différents que nous avons déjà présentés dans la section de BAO 2 (Treetagger et Cordial).

Nous avons utilisé deux scripts différents; l'un nous permettant de faire appel au fichier tokénisé et étiqueté par Cordial, l'autre utilisant le fichier de Treetagger.

Pour une meilleure légibilité et compréhension et comme ces deux scripts nous ont été présentés par deux professeurs différents, nous nous référerons à ces deux versions de script sous les initiales des professeurs nous les ayant présentés: JMD et RB.

Script PERL JMD de la BAO 3:

									
#!/usr/bin/perl

use warnings;
use strict;

#Recherche de patron morphosyntaxiques dans le fichier taggé par cordial
#lecture du fichier cordial et mise en place dans trois listes: le token, le lemme et l'étiquette.

#----------------START-Declaration-Variables---------------
my @LISTETOKEN=();
my @LISTELEMME=();
my @LISTETQT=();
my $output1 = "resultatsCordial$ARGV[0].txt";
#----------------END-Declaration-Variables----------------

#----------------START-Arguments-Entree-(input)----------------
open(PATRON,"$ARGV[1]");
my @LISTEPATRON=<PATRON>;
close(PATRON);
open (FILEOUT,">>$output1");
open(CORDIAL, "$ARGV[0]");
#----------------END-Arguments-Entree-(input)----------------

#----------------START-Commandes---------------
#boucle lisant chaque ligne du fichier cordial
while(my $ligne=<CORDIAL>)
	{
	$ligne =~s/\r// ;
	chomp($ligne);  
	#condition pour retrouver des lignes specifiques
	if ($ligne=~/^([^\t]+)\t([^\t]+)\t([^\t]+)$/) 
		{
		#creation de variables
		my($token,$lemme,$etqt)=($1 ,$2 ,$3 );
		#condition recherchant les ponctuations
		if ($etqt!~/PCTF/)
			{
			#la fonction push rajoute des éléments à la fin d'une liste
			push(@LISTETOKEN, $token);
			push(@LISTELEMME, $lemme);
			push (@LISTETQT, $etqt); 
			}
		else 
			{
			#appel de fonction
			&compare (\@LISTETOKEN,\@LISTETQT);
			#purgation des listes
			@LISTETOKEN = ();
			@LISTELEMME = () ;
			@LISTETQT = () ;
			}
		}
	}
close(FILEOUT);
#----------------END-Commandes---------------

#----------------START-Definition-Fonction---------------
sub  compare 
	{
	#declaration de variables
	my($first,$second)=@_;
	my @LISTETOKEN=@$first;
	my @LISTETQT=@$second;
	#boucle recherchant le patron dans la liste des patrons
	foreach my $patron (@LISTEPATRON)
		{
		chomp $patron ;
		my $txtetqt=join(" ",@LISTETQT);
		#boucle recherchant les patrons dans la liste d'etiquettes
		while ($txtetqt =~/$patron/g) 
			{
			#compteur des espaces blancs dans le contexte gauche
			my $contextebefore=$`;
			my $compteurBlancs=0;
			#boucle recherchant les espaces blancs
			while ($contextebefore=~/ /g)
				{
				$compteurBlancs++;
				}
			#sortie des resultats
			my @patronencours = split(/ /,$patron);
			my $lenPatron=$#patronencours;
			print "patron en cours :$patronencours\n";
			my $blancsup=$compteurBlancs + $lenPatron;
			print FILEOUT "@LISTETOKEN[$compteurBlancs..$blancsup] \n";
			
			}
		}

	}
#----------------END-Definition-Fonction---------------
									
								

Si vous désirez connaître nos résultats et notre analyse nous vous invitons à visiter la section ANALYSES de notre site web.

Script PERL RB de la BAO 3:

									

#/usr/bin/perl

DOC; 
Nom : Rachid Belmouhoub
Avril 2012
 usage : perl bao3_rb_new.pl fichier_tag fichier_motif
Modifié par: COLLOMB - ALFONSO
Avril 2016
DOC

use strict;
use warnings;
use utf8;
use XML::LibXML;

#----------------START-Definition-Encodages-Entree-et-Sortie----------------
binmode STDIN,  ':encoding(utf8)';
binmode STDOUT, ':encoding(utf8)';
#----------------END-Definition-Encodages-Entree-et-Sortie----------------

#----------------START-Arguments-Entree-(input)----------------
if($#ARGV!=1)
	{
	print "usage : perl $0 fichier_tag fichier_motif";exit;
	}
my $tag_file= shift @ARGV;
my $patterns_file = shift @ARGV;
#----------------END-Arguments-Entree-(input)----------------

#----------------START-Creation-et-Utilisation-Objet-XML::LibXML----------------
#exploration du fichier de sortie tree-tagger XML
my $xp = XML::LibXML->new(XML_LIBXML_RECOVER => 2);
$xp->recover_silently(1);
my $dom    = $xp->load_xml( location => $tag_file );
my $root   = $dom->getDocumentElement();
my $xpc    = XML::LibXML::XPathContext->new($root);
#----------------END-Creation-et-Utilisation-Objet-XML::LibXML----------------

#----------------START-Ouverture-et-Fermeture-Fichiers-Motifs----------------
open(PATTERNSFILE, $patterns_file) or die "can't open $patterns_file: $!\n";
#boucle pour recherche et lecture du fichier contenant les motifs, un motif par ligne
while (my $ligne = <PATTERNSFILE>) 
	{
	#appel de la fonction d'extraction
	&extract_pattern ($ligne);
	}
close(PATTERNSFILE);
#----------------END-Ouverture-Fichiers-Motifs----------------

#----------------START-Definition-Fonctions---------------
#fonction construction des chemins XPath
sub construit_XPath{

	#Récupération de la ligne du motif recherché et initialisation du chemin XPath
	my $local_ligne=shift @_;
	my $search_path="";
	
	#Supression du retour à la ligne et retour chariot
	chomp($local_ligne);
	$local_ligne=~ s/\r$//;
	
	#Récupération des étiquettes et des tokens
	my @tokens=split(/ /,$local_ligne);
	$search_path="//element[contains(data[\@type=\"type\"],\"$tokens[0]\")]";	
	my $i=1;
	#Boucle vérifiant que le compteur n'exède pas la limite de quantité des tokens
	while ($i > $#tokens) 
	#requête et chemin XPATH
		{
		$search_path.="[following-sibling::element[1][contains(data[\@type=\"type\"],\"$tokens[$i]\")]";
		$i++;
		}
	my $search_path_suffix="]";
	$search_path_suffix=$search_path_suffix x $i;
	$search_path.="[following-sibling::element[1][contains(data[\@type=\"type\"],\"".$tokens[$#tokens]."\")]"
					.$search_path_suffix;
		 print  "XPATH: $search_path\n";
	return ($search_path,@tokens);
}

#fonction d'extraction du motif
sub extract_pattern{
	#récupération de la ligne du motif recherché
	my $ext_pat_ligne= shift @_;

	#appel de la fonction construit_XPath
	my ($search_path,@tokens) = &construit_XPath ($ext_pat_ligne);
	
	#définition du nom du fichier de résultats pour le motif
	my $match_file = "res_extract-".join('_', @tokens).".txt";

	#ouverture fichier de résultats encodé en UTF-8
	open(MATCHFILE,">:encoding(UTF-8)", "$match_file") or die "can't open $match_file: $!\n";

	#liste de nodes
	my @nodes=$root->findnodes($search_path);
	
	#boucle parcourant chaque noeud XML 
	foreach my $noeud (@nodes) 
		{
		my $form_xpath="";
		$form_xpath="./data[\@type=\"string\"]";
		
		#initialisation du compteur
		my $following=0;

		#recherche du noeud data contenant la forme correspondant au premier élément du motif
		print MATCHFILE $xpc->findvalue($form_xpath,$noeud);
		
		#boucle d'extraction des formes correspondants aux éléments suivants du motif
		while ( $following < $#tokens) 
			{
			$following++;
			my $following_elmt="following-sibling::element[".$following."]";	
			$form_xpath=$following_elmt."/data[\@type=\"string\"]";
			print MATCHFILE " ",$xpc->findvalue($form_xpath,$noeud);
			}
		print MATCHFILE "\n";
		}
	#fermeture du fichiers de motifs
	close(MATCHFILE);
}
#----------------END-Definition-Fonctions---------------
									
								

Si vous désirez connaître nos résultats et notre analyse nous vous invitons à visiter la section ANALYSES de notre site web.