Dans la boîte à outils 3, on va extraire des patrons à partir de sorties produites à la deuxième étape. Nous avons choisi d'extraire les patrons contenant les noms communs masculins singuliers suivis d'une préposition puis d'un adjectif (masculin singulier) ou d'un adeverbe : NCMS PREP ADJMS et NCMS PREP ADV. Pour ce faire, on a utilisé deux différentes méthodes : extraction de patrons à partir de sorties brutes de l'étiquetage via Cordial et extraction de patrons sur les sorties au format XML de l'étiquetage via Treetagger.
Pour télécharger le programme qu'on a utilisé, cliquez ici.
Le script qu'on va présenter ci-dessous, inspiré par une solution de Michel Daube, prend le fichier de sortie avec l'etiquetage produit par Cordial, le parcourt et extrait les patrons morpho-syntaxiques. Au tout début, on déclare des listes (vides, au départ) et on s'attend à les remplir avec les motifs recherchés :
# Declaration des listes, au depart il est vide. # On peut aussi ecrire my (@LISTEDETOKEN, @LISTEDEPOS);my @LISTEDETOKEN=();
my @LISTEDEPOS=();
# On s'attend d'avoir un argument lorsqu'on lance ce programme# On récupère le texte etiqueté
open(TEXT, $ARGV[0]);
Puis on parcourt le fichier ligne par ligne: dans les chaînes nous rencontrons les formes, les lemmes et les parties du discours. On va extraire les parties qui correspondent à ce qu'on cherche et on va les mettre dans les listes ouvertes au début :
if($ligne=~/^[^\t]+\t[^\t]+\t[^\t]+$/)
{
# Ces variables changent de ligne à ligne, on le met dans une liste# On découpe un fichier qui est structuré, on récupère avec une tabulationmy ($token, $lemme, $pos) = split("\t", $ligne);
# On vérifie qu'on a bien extrait ce qu'on voulaitprint"POS : <$pos> LEMME: <$lemme> FORME : <$token> \n";
# la commande "push" va ajouter les éléments de LIST à ARRAY
push(@LISTEDETOKEN, $token);
push(@LISTEDEPOS, $pos);
}
On va chercher le deuxième argument du motif cherché avec la commande open(TERM, $ARGV[1]);. Puis, à partir de notre liste, on va créer une variable scalaire :
# Join reunit une liste et un scalaire, le séparateur est l'espace " "my $suitedepos=join(" ", @LISTEDEPOS);
# On parcourt le fichier pour extraire les patrons qui nous intéressent.# La valeur de $term est la ligne courante :while (my $term=<TERM>){
chomp($term);
my $i=0;
chomp(my $nompatron=$term);
print"nom patron <$nompatron> \n";
$nompatron=~s/ /_/g;
open(OUT, ">$nompatron.txt");
# Chaque fois que dans la liste de pos il y a le terme cherché, le script le signale.# En fait, g est un flag qui recupère toutes les occurrences.# Sans g il va boucler sur la premier occurrence :print"suitedepos est : <$suitedepos> fin \n\n\n\n\n\n\n\n\n\n";
print" term : <$term> \n";
On recupère ce qui vient avant les mots cherchés pour faire un "contrôle croisé" et avoir toutes les bonnes chaînes qui correspondent au patron recherché :
while ($suitedepos=~/$term/g){
# La variable par defaut pour recupérer ce qui vient avantmy $avant=$`;
# print "avant : <$avant> \n";my $nombredeblanc=0;
while ($avant=~/ /g){
$nombredeblanc++;
}
print"Nombre de blanc avec match: $nombredeblanc\n";
$i++;
my @listeelementpatron=split(/ /,$term);
# print "listeelementpatron : <$listeelementpatron> \n";my $longueurpatron=$#listeelementpatron+1;
# print "longueur patron <$longueurpatron> \n";for (my $k=0;$k<$longueurpatron;$k++) {
print OUT "$LISTEDETOKEN[$nombredeblanc+$k] ";
# print "$term : MATCH OK $i \n";
}
print OUT "\n";
}
close(OUT);
print"il y a $i occurences \n";
Pour télécharger les résultats d'extraction du patron NCMS PREP ADJMS, cliquez ici.
Pour télécharger les résultats d'extraction du patron NCMS PREP ADV, cliquez ici.
On a proposé une deuxième solution, inspirée par le script de Rachid Belmouhoub, en utilisant la bibliothèque XML::XPath pour parcourir les sorties de produites par Treetagger. On a recherché le motif prep + nom + adjectif. Un avantage de cette solution est le fait de ne pas préciser - par exemple - nom masculin singulier, et de donner des résultats plus généraux, par exemple "nom". Un autre avantage est la puissance du script. Par contre, cette solution est prend beaucoup de temps pour la mettre en ouvre. On a lancé le script sur tous les flux RSS de 2011 de notre rubrique "à la une" mais 12+ heures après, la machine travaillait encore. Donc, on a divisé le fichier à traiter (de 36 MB en 12 parties) et les sorties obtenues représentent un échantillon des flux RSS. Pour télécharger le script, cliquez ici.
Pour télécharger les résultats d'extraction du patron PREP NOM ADJ, obtenus par cette deuxième solution, cliquez ici.