Accueil || BàO 1 || BàO 2 || BàO 3 || BàO 4 || Analyse

Pour l'extraction des patrons nous avons choisi la : NOM PREP NOM Le programme prend en entrée le fichier .xml etiqueté de la rubrique extraite. Le programme va parcourir l'arborescence à la recherche de balises data, plus exactement des balises data commençant alises data PREP et NOM, le reste n'étant pas pris en compte. En sortie on obtient alors un fichier xml ou txt contenant les différentes phrases repérées par le patron.

Pour réaliser cette étape, 4 méthodes nous on été demandées :

PARTIE CORDIAL

Cette méthode utilise un script qui nécessitera en entrée les fichiers étiquetés par Cordial (.cnr) des différentes rubriques et un fichier de Patrons .txt crée au préalable dans lequel on aura ecrit les patrons que l'on souhaite extraire (ici nous avons choisi d'extraire les NOM PREP NOM et NOM KON NOM). Le fichier de sortie est sous format txt. Cependant dans ce dernier nous avons dû supprimer ttes les lignes vides car le script à laisser les patrons à la place où il les avait trouvé dans le fichier. L'opération a donc été répété pour les 3 rubriques.

Voici le code pour la extraction de patron Cordial en Perl (programme de Jean-Michel Daube) :

													
#!/usr/bin/perl
use utf8;
binmode STDOUT,":utf8";
# Programme d'extraction de patron
# sur sortie Cordial
# Usage : perl pg.pl cordialFile patrons
#----------------------------------
open(FIC,"<:encoding(utf8)",$ARGV[0]);
my $chaine="";
while (my $ligne=<FIC>) {
    # je veux voir la POS et le TOKEN
    # sous cette forme : POS_FORME
    chomp $ligne; # inutile a priori...
    if (($ligne=~/^([^\t]+)\t[^\t]+\t([^\t]+)$/) and ($ligne!~/PCTFORTE/)) {
        my $f=$1;
        my $c=$2;
        $f=~s/ /#/g;
        $chaine = $chaine . $c."_".$f." ";
    }
    else {
        #print $chaine;
        #$continu=<STDIN>;
        open(TERM,"<:encoding(utf8)",$ARGV[1]);
        while (my $terme=<TERM>) {
            chomp($terme);
            #comment transformer : NCMP ADJMP
            #en                  :  NOM_([^ ]+) ADJ_([^ ]+)
            # pour ensuite cherche $terme dans $chaine
            $terme=~s/([^ ]+)/$1_\[\^ \]+/g;
            #print "TERME :", $terme,"\n";
            # ou $terme=~s/(\w+)/$1_\\w\+/g ;
            while($chaine=~/($terme)/g) {
                #print "CORRESPONDANCE...\n";
                my $correspondance=$&;
                $correspondance=~s/[A-Z0-9]+_//g;
				$correspondance=~s/#/ /g;
                print $correspondance,"\n";
            }


        }
        close(TERM);
        #--------------------------------
        # a la fin
        $chaine="";
    }
}
print $chaine;
close(FIC);
				
			

Voici les patrons recherchés

Voici les sorties :

< Cordial | Perl > | XSLT >> | HAUT

PARTIE XQuery

Cette 2nde méthode utilise les fichiers étiquetés par treetagger dans la BAO2 sous format xml. En effet, pour la realiser nous devons nous servir de l'application BASEX. Cette dernière fonctionne par requêtes XQUERY ou XPATH, ici on utilisera des requêtes XQUERY. La requête devra donc repérer une balise étiquetée NOM suivi d'une balise étiquetée PREP suivie elle-même par une balise NOM et en extraire le Text. La même requête est utilisée pour l'extraction des patrons NOM KON NOM.

Voici le code pour les requêtes pour le patron NOM-KON-NOM et NOM-PRP-NOM :

											
	###### NOM-PRP-NOM #########
	<corpus>
	{ for $art in doc("sortie_3214")//article
	for $elt in $art/element
	let $nextelt := $elt/following-sibling::element[1]
	let $nextelt2 := $nextelt/following-sibling::element[1]
	where $elt/data[1] = "NOM" and $nextelt/data[1] = "KON" and $nextelt2/data[1] = "NOM"
	return <NOMPRPNOM>{$elt/data[2]/text(), " ", $nextelt/data[2]/text(), " ",$nextelt2/data[2]/text()}</NOMPRPNOM>
	} </corpus>

	####### NOM-KON-NOM #######
	<corpus>
	{ for $art in doc("sortie_3214")//article
	for $elt in $art/element
	let $nextelt := $elt/following-sibling::element[1]
	let $nextelt2 := $nextelt/following-sibling::element[1]
	where $elt/data[1] = "NOM" and $nextelt/data[1] = "KON" and $nextelt2/data[1] = "NOM"
	return <NOMPRPNOM>{$elt/data[2]/text(), " ", $nextelt/data[2]/text(), " ",$nextelt2/data[2]/text()}</NOMPRPNOM>
	} </corpus>
											
										

Voici les résultats pour NOM-PRP-NOM:

Voici les résultats pour NOM-KON-NOM:

PARTIE PERL

Voici le code pour les requêtes pour le patron NOM-KON-NOM et NOM-PRP-NOM :

										

########### PROG 1#################
open(FILE,"$ARGV[0]");
#--------------------------------------------
# le patron cherche ici est du type NOM ADJ";
# le modifier pour extraire NOM PREP NOM
#--------------------------------------------
my @lignes=<FILE>;
close(FILE);
while (my $ligne=shift(@lignes)) {
    chomp $ligne;
    my $sequence=" ";
    my $longueur=0;
    if ( $ligne =~ /<element><data type=\"type\">NOM<\/data><data type=\"lemma\">[^<]+<\/data><data type=\"string\">([^<]+)<\/data><\/element>/){
		my $forme=$1;
		$sequence.=$forme;
		$longueur=1;
			my $nextligne=$lignes[0];
			if ( $nextligne =~ /<element><data type=\"type\">PRP<\/data><data type=\"lemma\">[^<]+<\/data><data type=\"string\">([^<]+)<\/data><\/element>/){
				my $forme=$1;
				$sequence.=" ".$forme;
				$longueur=2;
					my $nextligne=$lignes[1];
					if ( $nextligne =~ /<element><data type=\"type\">NOM<\/data><data type=\"lemma\">[^<]+<\/data><data type=\"string\">([^<]+)<\/data><\/element>/){
						my $forme= $1;
						$sequence.=$forme;
						$longueur=3;

					}
			}
    }

	if ($longueur == 3) {
	print $sequence,"\n";
	}
}
###################### PROG 2 #############
open(FILE,"$ARGV[0]");
#--------------------------------------------
# le patron cherche ici est du type NOM ADJ";
# le modifier pour extraire NOM PREP NOM
#--------------------------------------------
my @lignes=<FILE>;
close(FILE);
while (my $ligne=shift(@lignes)) {
    chomp $ligne;
    my $sequence=" ";
    my $longueur=0;
    if ( $ligne =~ /<element><data type=\"type\">NOM<\/data><data type=\"lemma\">[^<]+<\/data><data type=\"string\">([^<]+)<\/data><\/element>/) {
		my $forme=$1;
		$sequence.=$forme;
		$longueur=1;
		my $nextligne=$lignes[0];
		if ( $nextligne =~ /<element><data type=\"type\">KON<\/data><data type=\"lemma\">[^<]+<\/data><data type=\"string\">([^<]+)<\/data><\/element>/) {
			my $forme=$1;
			$sequence.=" ".$forme." ";
			$longueur=2;
				if ( $ligne =~ /<element><data type=\"type\">NOM<\/data><data type=\"lemma\">[^<]+<\/data><data type=\"string\">([^<]+)<\/data><\/element>/) {
					my $forme=$1;
					$sequence.=$forme;
					$longueur=3;
		}
    }
    if ($longueur == 3) {
	print $sequence,"\n";
    }
}

Voici les résultats pour NOM-PRP-NOM:

PARTIE XSLT

Cette 3ème méthode utilise également les fichiers étiquetés par treetagger dans la BAO2 sous format xml. En effet, pour la realiser nous nous sommes servis du logiciel Oxygen. Ce dernier nous permet de créer des feuilles de style XSLT qui affichent le contenu d'un fichier XML. La feuille de style devra donc repérer une balise étiquetée NOM suivi d'une balise étiquetée PREP suivie elle-même par une balise NOM et en extraire le Text. La même requête est utilisée pour l'extraction des patrons NOM KON NOM.

Voici le code pour les requêtes pour les patrons PRO-VER-PRP-ADJ-NOM NOM-KON-NOM et NOM-PRP-NOM :

										

#### PRO-VER-PRP-ADJ-NOM #########

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output method="text" encoding="utf-8"/>
    <xsl:template match='/'>
        <xsl:apply-templates select='//element'/>
    </xsl:template>

    <xsl:template match="element">
    <xsl:choose>
        <xsl:when test="((./element[contains(./data[1], 'PRO')]
            [following-sibling::element[1][contains(./data[1], 'VER')]]
            [following-sibling::element[2][contains(./data[1], 'PRP')]]
            [following-sibling::element[3][contains(./data[1], 'ADJ')]]
            [following-sibling::element[4][contains(./data[1], 'NOM')]])|
            (./element[contains(./data[1],'VER')]
            [preceding-sibling::element[1][contains(./data[1],'PRO')]]
            [following-sibling::element[1][contains(./data[1], 'PRP')]]
            [following-sibling::element[2][contains(./data[1], 'ADJ')]]
            [following-sibling::element[3][contains(./data[1], 'NOM')]])|
            (./element[contains(./data[1],'PRP')]
            [preceding-sibling::element[1][contains(./data[1],'VER')]]
            [preceding-sibling::element[2][contains(./data[1], 'PRO')]]
            [following-sibling::element[1][contains(./data[1], 'ADJ')]]
            [following-sibling::element[2][contains(./data[1], 'NOM')]])|
            (./element[contains(./data[1],'ADJ')]
            [preceding-sibling::element[1][contains(./data[1], 'PRP')]]
            [preceding-sibling::element[2][contains(./data[1], 'VER')]]
            [preceding-sibling::element[3][contains(./data[1], 'PRO')]]
            [following-sibling::element[1][contains(./data[1], 'NOM')]])|
            (./element[contains(./data[1],'NOM')]
            [preceding-sibling::element[1][contains(./data[1], 'ADJ')]]
            [preceding-sibling::element[2][contains(./data[1], 'PRP')]]
            [preceding-sibling::element[3][contains(./data[1], 'VER')]]
            [preceding-sibling::element[4][contains(./data[1], 'PRO')]])/data[3])">
            <xsl:value-of select="./data[3]"/><xsl:text> </xsl:text>
        </xsl:when>
        <xsl:when test="(./data[1][contains(text(), 'PRO')]) and
            (following-sibling::element[1][./data[1][contains(text(), 'VER')]]) and
            (following-sibling::element[2][./data[1][contains(text(), 'PRP')]]) and
            (following-sibling::element[3][./data[1][contains(text(), 'ADJ')]]) and
            (following-sibling::element[4][./data[1][contains(text(), 'NOM')]])">
            <xsl:value-of select="./data[3]"/><xsl:text> </xsl:text>
        </xsl:when>
        <xsl:when test="(./data[1][contains(text(), 'VER')]) and
            (preceding-sibling::element[1][./data[1][contains(text(), 'PRO')]]) and
            (following-sibling::element[1][./data[1][contains(text(), 'PRP')]]) and
            (following-sibling::element[2][./data[1][contains(text(), 'ADJ')]]) and
            (following-sibling::element[3][./data[1][contains(text(), 'NOM')]])">
            <xsl:value-of select="./data[3]"/><xsl:text> </xsl:text>
        </xsl:when>
        <xsl:when test="(./data[1][contains(text(), 'PRP')]) and
            (preceding-sibling::element[1][./data[1][contains(text(), 'VER')]]) and
            (preceding-sibling::element[2][./data[1][contains(text(), 'PRO')]]) and
            (following-sibling::element[1][./data[1][contains(text(), 'ADJ')]]) and
            (following-sibling::element[2][./data[1][contains(text(), 'NOM')]])">
            <xsl:value-of select="./data[3]"/><xsl:text> </xsl:text>
        </xsl:when>
        <xsl:when test="(./data[1][contains(text(), 'ADJ')]) and
            (preceding-sibling::element[1][./data[1][contains(text(), 'PRP')]]) and
            (preceding-sibling::element[2][./data[1][contains(text(), 'VER')]]) and
            (preceding-sibling::element[3][./data[1][contains(text(), 'PRO')]]) and
            (following-sibling::element[1][./data[1][contains(text(), 'NOM')]])">
            <xsl:value-of select="./data[3]"/><xsl:text> </xsl:text>
        </xsl:when>
        <xsl:when test="(./data[1][contains(text(), 'NOM')]) and

            (preceding-sibling::element[1][./data[1][contains(text(), 'ADJ')]]) and
            (preceding-sibling::element[2][./data[1][contains(text(), 'PRP')]]) and
            (preceding-sibling::element[3][./data[1][contains(text(), 'VER')]]) and
            (preceding-sibling::element[4][./data[1][contains(text(), 'PRO')]])">
            <xsl:value-of select="./data[3]"/><xsl:text>
                    </xsl:text>
        </xsl:when>
    </xsl:choose>
    </xsl:template>
</xsl:stylesheet>

#### NOM-PRP-NOM #########
<?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=".//article/element"/>
</xsl:template>


<xsl:template match="article/element">

		<xsl:choose>
			<xsl:when test="((./element[contains(./data[1],'NOM')][following-sibling::*[1][contains(./data[1],'PRP')]]
				[following-sibling::*[2][contains(./data[1],'NOM')]])|
				(./element[contains(./data[1],'PRP')][preceding-sibling::*[1][contains(./data[1],'NOM')]]
				[following-sibling::*[1][contains(./data[1],'NOM')]])|
				(./element[contains(./data[1],'NOM')][preceding-sibling::*[1][contains(./data[1],'PRP')]]
				[preceding-sibling::*[2][contains(./data[1],'NOM')]])/data[3])"></xsl:when>
			<xsl:when test="(./data[contains(text(),'NOM')]) and
				(following-sibling::element[1][./data[contains(text(),'PRP')]]) and
				(following-sibling::element[2][./data[contains(text(),'NOM')]])">
				<xsl:value-of select="./data[3]"/><xsl:text> </xsl:text>
			</xsl:when>
			<xsl:when test="(./data[contains(text(),'PRP')]) and
				(preceding-sibling::element[1][./data[contains(text(),'NOM')]]) and
				(following-sibling::element[1][./data[contains(text(),'NOM')]])">
				<xsl:value-of select="./data[3]"/><xsl:text> </xsl:text>
			</xsl:when>
			<xsl:when test="(./data[contains(text(),'NOM')]) and
				(preceding-sibling::element[1][./data[contains(text(),'PRP')]]) and
				(preceding-sibling::element[2][./data[contains(text(),'NOM')]])">
				<xsl:value-of select="./data[3]"/><xsl:text>
				</xsl:text>
			</xsl:when>
		</xsl:choose>


</xsl:template>


</xsl:stylesheet>



##### NOM-PRP-NOM ##########
<?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=".//article/element"/>
</xsl:template>


<xsl:template match="article/element">

		<xsl:choose>
			<xsl:when test="((./element[contains(./data[1],'NOM')][following-sibling::*[1][contains(./data[1],'KON')]]
				[following-sibling::*[2][contains(./data[1],'NOM')]])|
				(./element[contains(./data[1],'KON')][preceding-sibling::*[1][contains(./data[1],'NOM')]]
				[following-sibling::*[1][contains(./data[1],'NOM')]])|
				(./element[contains(./data[1],'NOM')][preceding-sibling::*[1][contains(./data[1],'KON')]]
				[preceding-sibling::*[2][contains(./data[1],'NOM')]])/data[3])"></xsl:when>
			<xsl:when test="(./data[contains(text(),'NOM')]) and
				(following-sibling::element[1][./data[contains(text(),'KON')]]) and
				(following-sibling::element[2][./data[contains(text(),'NOM')]])">
				<xsl:value-of select="./data[3]"/><xsl:text> </xsl:text>
			</xsl:when>
			<xsl:when test="(./data[contains(text(),'KON')]) and
				(preceding-sibling::element[1][./data[contains(text(),'NOM')]]) and
				(following-sibling::element[1][./data[contains(text(),'NOM')]])">
				<xsl:value-of select="./data[3]"/><xsl:text> </xsl:text>
			</xsl:when>
			<xsl:when test="(./data[contains(text(),'NOM')]) and
				(preceding-sibling::element[1][./data[contains(text(),'KON')]]) and
				(preceding-sibling::element[2][./data[contains(text(),'NOM')]])">
				<xsl:value-of select="./data[3]"/><xsl:text>
				</xsl:text>
			</xsl:when>
		</xsl:choose>


</xsl:template>


</xsl:stylesheet>

description code:

Avec les balises xsl:template match="" nous pouvons appeler le contenu de balises dans l'arborescence du fichier XML. Avec les balises xsl:apply-templates select="" nous pouvons demander à appliquer un modèle qui une fois défini pourra être appelé par la balise précédement décrite. les [nombre] permettent de sélectionner l'occurrence de telle ou telle balise quand plusieurs ont le même nom.

Voici les résultats pour NOM-PRP-NOM:

Voici les résultats pour NOM-KON-NOM:

Voici les résultats pour PRO-VER-PRP-ADJ-NOM:

haut de page