#/usr/bin/perl <) { # on supprime avec la fonction chomp un éventuel retour à la ligne chomp($ligne); # $nb_patterns = push(@patterns,$ligne); #push rajoute dns un tableau a la suite du dernier enregistrempent, un nouveau enregistrement } # création de l'objet XML::XPath pour explorer le fichier de sortie tree-tagger XML my $xp = XML::XPath->new( filename => $tag_file ) or die "big trouble"; # # # recherche des motifs dans le fichier de sortie treetagger xml foreach my $pattern (@patterns){ # ici on a qq ch comme (NOM ADJ","N_P_N") # construction au moyen de la fonction split d'un tableau dont chaque élément a pour valeur un token du motif recherché @tokens=split(/ /,$pattern); # on split ce que j'ai dans ma liste # définition du nom du fichier de sortie pour le motif en utilisant la fonction join my $match_file = "res_extract-".join('_', @tokens).".txt"; # ts les elemts du tableau @tokens et on concatene avec _. On va avoir autant de fichiers de sortie que de lignes qui existent dans mon fichier pattern open(MATCHFILE, ">./$repsortie/$match_file") or die "can't open $match_file: $!\n"; # specifier q fichier de sortie sont e utf-8!! # appel de la procédure d'extraction des formes correspondants au motif &extract_pattern(@tokens); close(MATCHFILE); } # routine d'extraction d'un motif sub extract_pattern{ @tokenz=@_; # @_ ajouter my @tokenz pr la rendre locale et ici ele elle reste (nom,prep,nom) ce qui avant était dans @tokens (nom,prep,nom) # la fonction shift coupe le premier élement d'un tableau et le revoie en résultat $first_token=shift @tokenz; # ici ce sera nom prep nom chomp($first_token); # Initialisation du chemin xpath correspondant au motif recherché # ATTENTION ici aux effets de bord dus à la structure choisie pour le fichier tree-tagger XML # par exemple pour le motif NOM ADJ : une description d'un fil rss qui se termine par un NOM suivie d'une autre description qui commence par un ADJ ! $search_path="//element/data[1][contains(text(),\"$first_token\")]"; # commence a construire le chemin. // ts le noueds q ont pr nom lelemn de la racine.cherchons son fils data avc l'indice 1(nosso primeiro elemento é igual a isso ?SIM!) foreach my $token (@tokenz){# construction recursive du chemin xpath correspondant au motif recherché chomp($token); $search_path.="/ancestor::element/following-sibling::element[1]/data[1][contains(text(),\"$token\")]"; } # boucle sur les nœuds reconnus du chemin xpath foreach my $noeud ( $xp->find($search_path)->get_nodelist ) { #apel d fonctions q sont livres avec module xpath. xp,apel find q cherche un chemin xpath dns le document(on stocke cette valeur dans search_path)premiere ch q elle fait cest voir sil existe)apr apel de getnoeudlitse, qui ?? # initialisation du tableau des formes # on le fait ici pour des raisons évidentes d'économie de mémoire et donc de performance my @matching_tokens; # # on remonte d'un cran au nœud parent pour extraire la forme trouvée # dans le cas d'un motif NOM ADJ, c'est la forme de l'adjectif qu'on atteint $noeud_tmp=$noeud->getParentNode; #getnouedparent,donne le noued parent $i=0; foreach (@tokens){ #on pourrait faire for au lieu de foreach $i++; # on récupère la forme # noter que le "3" de getChildNode(3) correspond au "data[3]" de la feuille XSLT $motif=$noeud_tmp->getChildNode(3)->string_value; #chercje $motif a partir de $noeuttmp,la valeur du fils numero 3,apre japplique la fonctio stringvalue q me donne la forme.Si la forme de adj é republique,ce sera la forme ! # unshift(@matching_tokens,$motif) ajoute au début du tableau @matching_tokens un élément dont la valeur est le contenu de la variable $motif $nb_tokens=unshift(@matching_tokens,$motif); #unshift ajoute dns un tableau a la premiere position,ce qui a comme argument=$motif $motif=""; # on remonte recursivement aux nœuds précedents pour extraire la forme # dans le cas d'un motif NOM PRP NOM, on récupère ainsi PRP puis NOM (le premier) # noter que "precding-sibling" est l'axe inverse de "following-sibling" @noeudtmp=$xp->find("./preceding-sibling::element[1]",$noeud_tmp)->get_nodelist; # preceding-sibling::element[ = cest lke frere ainé $noeud_tmp=shift(@noeudtmp); # } # écriture des résultats dans un fichier en utilisant la fonction join, pratique ! print MATCHFILE join(' ', @matching_tokens)."\n"; } }