Boîte à outils 3



Extraction de patrons



Cordial :


Cette troisième étape du projet concerne l’extraction des patrons morpho-syntaxiques, raison pour laquelle nous avons étiqueté notre corpus pendant la BaO2. Pour ce faire, nous avons décidé d’employer la solution proposée par Serge Fleury.


Pour extraire les patrons morpho-syntaxiques des fichiers étiquetés par Cordial, nous avons utilisé un programme écrit en Perl qui contient une solution proposée par Serge Fleury, qui consiste en chercher le motif dans le fichier, puis regarder la ligne suivante s’il est trouvé.


Ci-dessous le programme perl pour extraire le motif NOM-ADJ :


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#!/usr/bin/perl
# ALKHADHAR Noor et HERNANDEZ Madeleine
# M1 TAL PPE S2 // 2016 - 2017

=for comment
BaO3 : Extraction des patrons morpho-syntanxiques
Solution proposÈe par Serge FLEURY
Pour la rerche du patron NOM ADJ
Ce programme prend en argument le nom du fichier cordial (.cnr)
Il lit le fichier ligne ‡ ligne
Si la catÈgorie morpho-syntaxique (3Ëme colonne) correspond au premier item 
du  patron recherchÈ, on cherche le deuxiËme item dans la ligne suivante
Sortie : sÈquence des tokens extraits (1Ëre colonne) dans un fichier TXT
=cut

use strict;
use warnings;
use utf8;

open(FILE, "<:encoding(UTF-8)", "$ARGV[0]") or die "Error opening file";

my @lines = <FILE>;
close(FILE);

my %patrons_dico=(); # Patrons extraits
my $ctr_pos = 0;     # Compteur de patrons extraits

# patron : NOM ADJ
while(my $line = shift(@lines)) {
    chomp $line;
    $line =~ s/\r//;
    my $sequence = "";
    my $lng = 0;

    if($line =~ /^([^\t]+)\t[^\t]+\tNC.*/) {
		my $form = $1;
		$sequence .= $form;
		$lng = 1;
		my $nxt_line = $lines[0];

		if($nxt_line =~ /^([^\t]+)\t[^\t]+\tADJ.*/) {
			my $form = $1;
			$sequence .= " ".$form;
			$lng = 2;
		}
    }
    if($lng == 2) {
		$patrons_dico{$sequence}++;
		$ctr_pos++;
    }
}

# crÈation fichier de sortie
my $filename = substr($ARGV[0], 0, -4);
$filename = $filename."_NM-ADJ_cordial.txt";

open(my $OUTPUT, ">:encoding(UTF-8)", $filename) or die "Error opening file";

foreach my $patron (sort {$patrons_dico{$b} <=> $patrons_dico{$a}} (keys %patrons_dico)) {
	print $OUTPUT "$patron : $patrons_dico{$patron}\n";
}
close($OUTPUT);

print "NOMBRE DE PATRONS EXTRAITS : $ctr_pos";
exit;


Nous avons aussi modifié le programme pour rechercher le motif NOM-PREP-NOM ; vous pouvez le télécharger ici. Il s’agit des fichiers en texte brut contenant la liste des séquences retrouvées et, respectivement, leur nombre d’occurence.




TreeTagger :



Extraction depuis les fichiers étiquetés par TreeTagger


Pour l’extraction des patrons depuis les fichiers étiquetés par TreeTagger, nous avons utilisé le même programme en le modifiant pour pouvoir mettre un fichier XML en entrée. Il a suffi de changer les expressions régulières utilisées pour les mettre au format des balises XML de l’étiquetage fait par TreeTagger.



35
36
37
38
39
40
41
42
43
44
45
46
    if($line =~ /<element><data type=\"type\">NOM<\/data><data type=\"lemma\">[^<]+<\/data><data type=\"string\">([^<]+)<\/data><\/element>/) {
		my $form = $1;
		$sequence .= $form;
		$lng = 1;
		my $nxt_line = $lines[0];

		if($nxt_line =~ /<element><data type=\"type\">ADJ<\/data><data type=\"lemma\">[^<]+<\/data><data type=\"string\">([^<]+)<\/data><\/element>/) {
			my $form = $1;
			$sequence .= " ".$form;
			$lng = 2;
		}
    }


Télécharger la version NOM-ADJ ici



Télécharger la version NOM-PREP-NOM ici



Nous avons aussi effectué la recherche des patrons dans les fichiers étiquetés par TreeTagger pour les rubriques Entreprises et Sciences, encore pour les deux motifs.



Télécharger nos résultats ici




TreeTagger avec XPATH :



Une méthode alternative d’extraire les séquences recherchées à partir des fichiers étiquetés par TreeTagger utilise des requêtes XPATH dans une feuille de style XSLT.


La feuille de style que nous avons utilisée pour extraire le patron NOM-ADJ


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:output method="text" encoding="UTF-8" />
	<xsl:template match="/">
		<xsl:apply-templates select="./PARCOURS/FILTRAGE/item/*[self::title or self::description]/document/article/element" />
	</xsl:template>

	<xsl:template match="element">
		<xsl:choose>
			<xsl:when test="(./data[contains(text(),'NOM')]) and (following-sibling::element[1][./data[contains(text(),'ADJ')]])">
				<xsl:value-of select="./data[3]" /><xsl:text> </xsl:text>
			</xsl:when>
			<xsl:when test="(./data[contains(text(),'ADJ')]) and (preceding-sibling::element[1][./data[contains(text(),'NOM')]])">
				<xsl:value-of select="./data[3]" /><xsl:text>&#xa;</xsl:text>
			</xsl:when>
		</xsl:choose>
	</xsl:template>
</xsl:stylesheet>

<!-- pour extraire les patrons, depuis la ligne de commande : 
	xsltproc ext_pat_TT_NM-ADJ.xsl RUBRIQUE.xml -->


et pour extraire le patron NOM-PREP-NOM (telecharger ici)


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
	<xsl:output method="text" encoding="UTF-8" />
	<xsl:template match="/">
		<xsl:apply-templates select="./PARCOURS/FILTRAGE/item/*[self::title or self::description]/document/article/element" />
	</xsl:template>

	<xsl:template match="element">
		<xsl:if test="(./data[contains(text(),'NOM')])">
			<xsl:variable name="p1" select="./data[3]/text()" />
			<xsl:if test="following-sibling::element[1][./data[contains(text(),'PRP')]]">
				<xsl:variable name="p2" select="following-sibling::element[1]/data[3]/text()" />
				<xsl:if test="following-sibling::element[2][./data[contains(text(),'NOM')]]">
					<xsl:variable name="p3" select="following-sibling::element[2]/data[3]/text()" />
					<xsl:value-of select="$p1" /><xsl:text> </xsl:text><xsl:value-of select="$p2" /><xsl:text> </xsl:text><xsl:value-of select="$p3" /><xsl:text>&#xa;</xsl:text>
				</xsl:if>
			</xsl:if>
		</xsl:if>
	</xsl:template>
</xsl:stylesheet>

<!-- pour extraire les patrons, depuis la ligne de commande : 
	xsltproc ext_pat_TT_NM-PREP-NM.xsl RUBRIQUE.xml -->


Vous pouvez également telecharger les résultats obtenus en liant la feuille de style directement dans le fichier XML.



Pour les patrons NOM-ADJ de la rubrique Entreprises



Pour les patrons NOM-PREP-NOM de la rubrique Sciences