rah!

rah!

rah!

>>>Principe de la BaO#3

Utiliser Cordial pour étiqueter les sorties .txt de la BaO#1 et améliorer les scripts d'extraction de patrons de RB et JMD.


>>>Cordial

Cordial est un étiqueteur fonctionnant sous Windows uniquement. Cordial ne supporte pas l'UTF-8 ! Il prend en entrée les sorties .txt en ISO-8859-15, et donne en sortie un fichier .cnr encodé de même en ISO-8859-15. Le fichier de sortie contient par ligne: un mot, son lemme et son étiquette séparés par des tabulations.

Utilisation de Cordial.
Sous Windows, ouvrir le fichier .txt précedemment encodé en ISO-8859-1 (ou 15). cordial_1 Cliquer dans la barre des menus sur "Syntaxe" puis sur l'onglet "Etiquetage de texte" cordial_2 Une fenêtre "Paramétrage de l'étiquetage" s'ouvre:
  • Décocher toutes les cases sauf lemme.
  • Dans "Numérotation des mots de chaque phrase" mettre NON.
  • Dans "Type grammatical" mettre Abrégé en majuscules.
  • Dans "Codage spécialisé" mettre Aucun.
  • Dans "Traitement des erreurs" mettre Ne pas corriger, ne pas signaler.
cordial_3 Exemple de sortie de cordial:

Le le DETDMS radieux radieux ADJMIN éveil éveil NCMS de de PREP la le DETDFS mémoire mémoire NCFS du du DETDMS cinéma cinéma NCMS cambodgien cambodgien ADJMS


>>>Extraction de patron avec une expression régulière

En partant du script de JMD vu en cours on a réécrit le script de façon à ce que l'on puisse choisir un patron parmi une liste de patron possible.

perl BaO3_JMD.pl SORTIE_RRS_CULTURE.cnr

L'appel se fait sans précision d'un ficher de motif.

On créé deux tableaux avec my @NOMDUTABLEAU; que l'on initialise comme étant vides @NONDUTABLEAU=();

my @LISTETOKEN=();
my @LISTEPOS=();

On récupère le fichier étiqueté par Cordial.

open(TEXT,$ARGV[0]);#Récupération du texte étiqueté.

Puis on récupère, pour chaque ligne correctement étiquetée, la liste des tokens et la liste des POS.

	######################################################################
	#Récupération dans des tableaux des listes de tokens et d'étiquettes.#
	######################################################################
	
while(my $ligne=<TEXT>) #Va lire ligne à ligne
{
	$ligne=~s/\r//g;
	chomp $ligne;	
	if($ligne=~/^[^\t]+\t[^\t]+\t[^\t]+$/)#dans regex ^ = début de ligne et $ = fin de ligne
	{
		my ($token,$lemme,$pos)=split(/\t/,$ligne);#\t tabulation
		#print "POS : <$pos> lemme : <$lemme> mot : <$token> \n";#vérification

		#Remplissage des listes pour ranger les pos et tokens
		push (@LISTETOKEN,$token);
		push (@LISTEPOS,$pos); 
	}
}

La vérification sert à savoir si la ligne est bien formée.
C'est à dire si la ligne commence ^ bien par quelque chose qui n'est pas une tabulation [^\t] présent au moins une fois +, puis qui est suivie par une tabulation \t suivie de quelque chose qui n'est pas une tabulation présent au moins une fois, puis une tabulation suivit de quelque chose qui n'est pas une ponctuation présent au moins une fois qui termine le document $!

Soit 3 mots/symboles/ponctuations, séparés par des tabulations, qui commencent et terminent la ligne.

if($ligne=~/^[^\t]+\t[^\t]+\t[^\t]+$/)#dans regex ^ = début de ligne et $ = fin de ligne

En créant une liste exhaustive des patrons, on en profite pour les compter. La commande system permet d'écrire comme sur le terminal, et créée un fichier contenant une seule occurrence (-u) de chaque POS et classée par ordre alphabétique (sort). -o permet de nommer le fichier de sortie.

				##############################################
				#Création d'une liste exhaustive des patrons.#
				##############################################
				
open(OUT, ">./dossier/toto.txt") or die "n'a pas pu ouvrir toto.txt";#On crée/ouvre un fichier.txt dans le quel on va mettre les patrons uniques. 
foreach my $element(@LISTEPOS)#Pour tous les éléments ...
{
	$cmp= $cmp+1;
	print OUT "$element\n";	
}

system("sort -u -o ./dossier/toto2.txt ./dossier/toto.txt");#system(); permet d'écrire en ligne de commande.
print "Nombre de tokens : $cmp \n"; 
close(TEXT);
close(OUT);

Maintenant que l'on a tous les POS de façon unique on fait appel au sous-programme &choix qui permet de récuperer un patron donné par l'utilisateur. Le patron récupéré peut être composé de 1 ou plusieurs POS à chercher. Ces POS peuvent être non spécifiés.

&choix;#appel au sous-programme choix

L'affichage créé par &choix se fait sur 4 colonnes remplies par les POS détectés dans le document.

Nombre de tokens : 93923 
[1] ADJFP		[2] ADJFS		[3] ADJHFS		[4] ADJHMS		
[5] ADJIND		[6] ADJINT		[7] ADJINV		[8] ADJMIN		
[9] ADJMP		[10] ADJMS		[11] ADJNUM		[12] ADJORD		
[13] ADJPIG		[14] ADJSIG		[15] ADV		[16] COO		
[17] DETDEM		[18] DETDFS		[19] DETDMS		[20] DETDPIG		
[21] DETIFS		[22] DETIMS		[23] DETPOSS		[24] INT		
[25] NCFIN		[26] NCFP		[27] NCFS		[28] NCHFS		
[29] NCHMS		[30] NCHSIG		[31] NCI		[32] NCMIN		
[33] NCMP		[34] NCMS		[35] NCPIG		[36] NCSIG		
[37] NHMIN		[38] NPFIN		[39] NPFP		[40] NPFS		
[41] NPHFS		[42] NPHMS		[43] NPHSIG		[44] NPI		
[45] NPMIN		[46] NPMP		[47] NPMS		[48] NPPIG		
[49] NPSIG		[50] PARTEUPH		[51] PCTFAIB		[52] PCTFORTE		
[53] PDP		[54] PDS		[55] PIFS		[56] PII		
[57] PIMP		[58] PIMS		[59] PIPIG		[60] PISIG		
[61] PP		[62] PPER1P		[63] PPER1S		[64] PPER2P		
[65] PPER2S		[66] PPER3P		[67] PPER3S		[68] PREP		
[69] PRFS		[70] PRI		[71] PRMS		[72] SUB		
[73] VCONP1S		[74] VCONP2P		[75] VCONP3P		[76] VCONP3S		
[77] VIMPP1P		[78] VIMPP2P		[79] VIMPP2S		[80] VINDF1P		
[81] VINDF1S		[82] VINDF2P		[83] VINDF3P		[84] VINDF3S		
[85] VINDI1P		[86] VINDI1S		[87] VINDI2P		[88] VINDI3P		
[89] VINDI3S		[90] VINDP1P		[91] VINDP1S		[92] VINDP2P		
[93] VINDP2S		[94] VINDP3P		[95] VINDP3S		[96] VINDPS3P		
[97] VINDPS3S		[98] VINF		[99] VPARPFP		[100] VPARPFS		
[101] VPARPMP		[102] VPARPMS		[103] VPARPRES		[104] VSUBP1P		
[105] VSUBP2P		[106] VSUBP2S		[107] VSUBP3P		[108] VSUBP3S		
Quel patron voulez-vous ? 
Veuillez taper le numéro correspondant.
Si vous voulez n'importe quel patron tapez une erreur.

On récupère une réponse de l'utilisateur sur le terminal avec <STDIN> qui nous permettra avec une expression régulière de retrouver tous les choix de l'utilisateur dans les POS. Puis on vérifie si la réponse donnée est bien une réponse attendue (si c'est bien un des chiffres correspondant à une étiquette). Si l'utilisateur ne donne pas de patron on recherchera le patron par defaut qui est n'importe lequel (dans l'expression regulière ça donne (.*?) pour la construction du titre ça sera x).

Le sous-programme &continuer permet de savoir si l'utilisateur veut rentrer un autre POS dans son motif à rechercher. Si l'utilisateur veut continuer, il relance &choix. Comme &continuer est contenu dans &choix il est récursif et se lancera jusqu'à ce que l'utilisateur dise non.

Maintenant que l'on a un motif contenant un ou des POS, on peut rechercher à l'intérieur des tableaux de POS pour essayer de les matcher avec.

my $cmp2=0;
open(TERM, "<./dossier/patron.txt"); #On reprend le patron que l'utilisateur a donné.
my $suitedepos=join(" ",@LISTEPOS);#Transforme la sortie précédente en string
while (my $terme=<TERM>) #TERM sera le fichier, récupérer en entrée, qui contiendra un patron (comme NCFS_ADJFS_)
{
	chomp ($terme); #On le nettoie
	chop ($terme);#On retire le dernier caractère _
	my $titre=$terme;
	#print "~~~~~~~~~~~~~~~$titre~~~~~~~~~~~~~~~\n";
	$terme =~ s/_/ /g; #On retire les underscores
	$terme =~ s/x/.*?/g;#On remplace les x par ce qui va nous servir à chercher "n'importe quoi"

	open(OUT,">./resultats/$titre.txt");#Création du fichier.
					
				###################################
				#On match le texte avec le patron.#
				###################################
	
	while($suitedepos=~/$terme/g)#On va matcher le patron avec la liste de tous les patrons du texte et récupérer, le cas échéant, les tokens correspondant. 
	{
		my $avant=$`;
		my $nombredeblanc = 0;#On se sert des blancs pour compter le nombre de tokens.
		while($avant=~/ /g)
		{
			$nombredeblanc++;
		}
		$cmp2 = $cmp2+1;
		my @listelementpatron=split(/ /,$terme);
		my $longueurpatron=$#listelementpatron+1;
		for (my $k=0;$k<$longueurpatron;$k++)
		{
			print OUT "$LISTETOKEN[$nombredeblanc+$k] ";
		}
		print OUT "\n";
	}#fin petit while
	close(OUT);
}#fin grand while
print "il y a $cmp2 occurrences \n";	
close(TERM);

Et on termine sur un EXIT pour signaler la fin du programme.

EXIT;


>>>Extraction de patron avec path

Pour ce script on est parti du script de RB vu en cours pour le cuisiner a notre manière. Cette fois-ci pour l'appel du programme il n'y a plus besoin de donner un fichier de patron ou le fichier xml, ils seront demandés ulterieurement.

perl BaO3_RB_CHOIX_METHODE.pl

Le fichier BaO3_RB_CHOIX_METHODE permet de donner le choix de la sortie, si on veut quelle soit en .txt ou en .xml puis demande à l'utilisateur si il veut utiliser un fichier contenant des patrons ou rentrer directement sur la console un motif avec les POS existant dans le document.

Les réponses seront récupérées avec <STDIN>.

Comme précedemment le choix du patron se fait avec <STDIN> grace au sous-programme &choix adapté pour ce script (il n'y a plus de patron par defaut).
Produire la sortie en .xml ce n'est que quelques lignes de code de plus pour :
  • Changer l'extention.

    	# définition du nom du fichier de résultats pour le motif en utilisant la fonction join
    	my $match_file = "res_extract-".join('_', @tokens).".xml";
    

  • Mettre un en-tête.

    	# Ouverture du fichiers de résultats encodé en UTF-8
    	open(MATCHFILE,">:encoding(UTF-8)", "./resultat2/$titre") or die "can't open $titre: $!\n";
    	print MATCHFILE "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n";
    	print MATCHFILE "<?xml-stylesheet type=\"text/xsl\" href=\"feuillebao3_2.xsl\"?>\n";
    	print MATCHFILE "<RESULTATS>\n";
    

  • Rajouter des balises.

    # Recherche du noeud data contenant la forme correspondant au premier élément du motif		
    print MATCHFILE "\t<ligne><b$following>",$xp->find($form_xpath,$noeud)->get_node(1)->string_value,"</b$following>";
    #	Impression du contenu textuel du noeud data contenant la forme correspondant à l'élément suivant du motif
    			print MATCHFILE "<b$following>",$xp->find($form_xpath,$noeud)->get_node(1)->string_value,"</b$following>";
    

  • Rajouter une balise fermante finale.

    		}
    		print MATCHFILE "</ligne>\n";
    	}
    	print MATCHFILE "</RESULTATS>";
    	# Fermeture du fichiers de motifs
    	close(MATCHFILE);
    }
    

>>>Feuille de style

Qui dit sortie .xml dit feuille de style.

La feuille de style que j'ai créé permet d'afficher jusqu'à 5 éléments colorés différemment. Il y a une couleur pour chaque partie du motif.

Ici, le patron est DET NOM. (cliquez sur l'image pour afficher le fichier dans le navigateur): bao3_xml
Retrouvez les ressources dans la page download!