#/usr/local/bin #---------------------------------------------------------- #utilise la bibli tk; locale simple...que le pgr va utiliser. LWP simple : bibli prédéfinie pour la récupération des url use Tk; use locale; use LWP::Simple; use Encode; use HTML::Entities; use Tk::NoteBook; # pour gérer les onglets use Tk::SMListbox; # pour dire qu'on se sert de la bibli use Win32::Process; #---------------------------------------------------------- # definition interface #------------ creation de la fenetre principale --------------------- # $mw= MainWindow->new; # créer la fenètre principale dans une variable mw $mw->title("Extracteur de textes"); # on donne un titre a la fenètre principale #---------------- on créer un premier cadre dans la fenètre principale --------------# my $cadreMenu = $mw->Frame->pack(-side => 'top', -fill => 'both'); #montre la direction dans laquelle je peux étendre la fenètre # dans l'objet 'cadre' on crée un nouvel objet "menu bouton" pour gérer les listes my $b_menu=$cadreMenu->Menubutton(-text => "File", -background =>'white', # colore en blanc les cases et devient gris qd on passe dessus -tearoff => 0, -relief => 'ridge', -menuitems => [ # liste des options visibles dans le menu bouton qu'on vient de créer et qui seront associées a des actions ['command' => "open file (txt)", -command => \&lire_File], #['command' => "load URL", #-command => \&lire_url], #['command' => "load FILE_URL", #-command => \&lire_file_url], #['command' => "URL to txt", # -command => \&url2txt], #['command' => "FILE_URL to FILE_txt", #-command => \&fileurl2txt], #['command' => "Save EDITOR", # -command => \&sauve_editor], # ['command' => "Search", # -command => \&search_in_editor], ['command' => "Exit", -command => sub {exit;}]])->pack(-side => 'left'); # création d'un deuxième onglet dans la première fenètre my $b_menu2=$cadreMenu->Menubutton(-text => "Syntaxe", -background =>'white', -tearoff => 0, -relief => 'ridge', -menuitems => [ # liste des options visibles ds le menu bouton qu'on vient de créer qui sera associée a des actions ['command' => "Treetagger", -command => \&loadtreetagger], ['command' => "Extract pattern", -command => \&extract_patern], ])->pack(-side => 'left'); # création d'un troisième onglet dans la première fenètre my $b_menu3=$cadreMenu->Menubutton(-text => "Rapport", -background =>'white', -tearoff => 0, -relief => 'ridge', -menuitems => [ ['command' => "Faire un rapport", -command => \&rapport], ])->pack(-side => 'left'); # création d'un quatrième onglet dans la première fenètre my $b_menu4=$cadreMenu->Menubutton(-text => "?", -background =>'white', -tearoff => 0, -relief => 'ridge', -menuitems => [ ['command' => "Aide", -command => \&lemanuel], ])->pack(-side => 'right'); #( cet onglet sera tout a droite de la fenètre) #------------ on créé un nouveau frame ds la main window qui va contenir les onglets -------------- # my $cadre = $mw->Frame->pack(-side => 'top', -expand=>1, -fill => 'both'); # Notebook est un widget qui permet de définir des onglets vides my $onglet=$cadre->NoteBook(-backpagecolor=> '#cc0066', -background=>'#cc0066', -disabledforeground=>'black', -foreground=>'white', -inactivebackground => '#EAADEA', #color for inactive tabs )->pack(-side=>'top', -expand=>1, -fill=>'both'); # dans l'onglet on crée des pages associées a des variables $page ... avec des labels my $page1=$onglet->add("page1",-anchor=>'w',label=>'Edition-URL',-underline=>0); my $page2=$onglet->add("page2",-anchor=>'w',label=>'Dictionnaire',-underline=>0); my $page3=$onglet->add("page3",-anchor=>'w',label=>'Concordance',-underline=>0); #my $page4=$onglet->add("page4",-anchor=>'w',label=>'Rapport sur URL',-underline=>0); my $page5=$onglet->add("page5",-anchor=>'w',label=>'Treetagger',-underline=>0); my $page6=$onglet->add("page6",-anchor=>'w',label=>'Extraction NOM/ADJ',-underline=>0); my $page7=$onglet->add("page7",-anchor=>'w',label=>'Rapport',-underline=>0); my $page8=$onglet->add("page8",-anchor=>'w',label=>'Manuel',-underline=>0); # --------Pour ma page 1 -------------# # interface de la page 1 : edition d' URL... #------------------------------------------------------------ # Création de plusieurs cadres dans la page 1 my $cadreP1=$page1->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'0'); $cadreP1->configure(-background => '#BC8F8F'); #couleur des ptites bordures ds le menu my $cadreP2=$page1->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1'); $cadreP2->configure(-background => '#BC8F8F'); my $cadreP2b=$page1->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'0'); $cadreP2b->configure(-background => '#BC8F8F'); my $cadreP3=$page1->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'0'); $cadreP3->configure(-background => '#BC8F8F'); #---------------- ma page 4 Treetagger ------------------# my $cadreP4=$page5->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1'); $cadreP4->configure(-background => '#BC8F8F'); # nouveau cadre ds treetagger $editortreetagger = $cadreP4->Scrolled("Text")->pack(-side => 'bottom', -fill => 'both', -expand => 1); $editortreetagger->Text(-setgrid=> 'true'); # ----------- ma page d'extraction --------------------- # my $cadreP5=$page6->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1'); $cadreP5->configure(-background => '#BC8F8F'); $extract = $cadreP5->Scrolled("Text")->pack(-side => 'bottom', -fill => 'both', -expand => 1); $extract->Text(-setgrid=> 'true'); #-------------------------ma page rapport ------------------------------# my $cadreP6=$page7->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1'); $cadreP6->configure(-background => '#BC8F8F'); $rapport = $cadreP6->Scrolled("Text")->pack(-side => 'bottom', -fill => 'both', -expand => 1); $rapport->Text(-setgrid=> 'true'); # # -------------------- ma page d'aide Manuel ----------------------------------------# my $cadreP7=$page8->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1'); $cadreP7->configure(-background => '#BC8F8F'); $manuel = $cadreP7->Scrolled("Text")->pack(-side => 'bottom', -fill => 'both', -expand => 1); $manuel->Text(-setgrid=> 'true'); # ------------------dans la premiere page ----------------------------# #dans cette première page je vais mettre plusieurs choses : $cadreP1->Label(-text => "URL : ", -relief => 'raised')->pack(-side => 'left', -anchor => 'w'); # Nous associons tout ce que l'utilisateur va taper à une variable url $cadreP1->Entry(-textvariable => \$url)->pack(-side => 'left', -anchor => 'w', -fill => 'x', -expand => 1); $cadreP1->Button(-text => "Load-URL", -command => sub {&lire_url})->pack(-side => 'left', -anchor => 'e'); $cadreP1->Button(-text => "URL2txt", -command => sub {&url2txt})->pack(-side => 'left', -anchor => 'e'); #--------- Editeur fenetre principale --------------- # dans le cadre je prévois d'insérer du texte qui correspond au contenu de l'url . Ensuite on va charger 'Scrolled' qui permet de définir les ascenseurs $editortexte = $cadreP2->Scrolled("Text")->pack(-side => 'bottom', -fill => 'both', -expand => 1); $editortexte->Text(-setgrid => 'true'); $search_string = ''; $w_string = $cadreP2b->Frame()->pack(-side => 'top', -fill => 'x'); $w_string_label = $w_string->Label(-text => 'Recherche de mots:', -width => 18, -anchor => 'w'); $w_string_entry = $w_string->Entry(-textvariable => \$search_string); $w_string_button = $w_string->Button(-text => 'Surligner '); $w_string_label->pack(-side => 'left'); $w_string_entry->pack(-side => 'left'); $w_string_button->pack(-side => 'left', -pady => 5, -padx => 10); $w_string->pack(-side => 'top', -fill => 'x'); $w_string_button->configure(-command => [sub {&text_search($editortexte, $search_string, 'search')}, $editortexte]); $w_string_entry->bind('' => [sub {shift; &text_search($editortexte, $search_string, 'search')}, $editortexte]); $w_string->pack(-side => 'top', -fill => 'x'); if ($mw->depth > 1) { text_toggle($editortexte, ['configure', 'search', -background => 'SeaGreen4', -foreground => 'white'], 800, ['configure', 'search', -background => undef, -foreground => undef], 200); } else { text_toggle($editortexte, ['configure', 'search', -background => 'black', -foreground => 'white'], 800, ['configure', 'search', -background => undef, -foreground => undef], 200); } #----------------------------------------------------- # pour les bouttons se trouvant en bas de la page #$cadreP3->Button(-text => "Exit", # -command => sub {exit;})->pack(-side => 'right'); #$cadreP3->Button(-text => "Save", #-command => sub {&sauve_fic})->pack(-side => 'right', # -anchor => 'e'); #$cadreP3->Label(-textvariable => \$info, #-relief => 'ridge')->pack(-side => 'bottom', #-fill => 'x'); #--------------------------------------------------------------- #---------------- ma page 2 ------------------# # ici on crée les colonnes du dictionnaire my $cadretemp=$page2->Frame(-borderwidth => '2', -relief => 'groove')->pack(-side => 'top', -fill => 'both',-expand=>'1'); $cadretemp->configure(-background => 'black'); # la fonction "expand" permet de dire que l'objet doit prendre toute la place qu'il peut dans la fenètre my $dicoG=$cadretemp->Frame(-borderwidth => '0', -relief => 'groove')->pack(-side => 'left', -fill => 'both',-expand=>'0'); $dicoG->configure(-background => '#cc0066'); #couleur de la colonne gauche dans la page du dico my $dicoD=$cadretemp->Frame(-borderwidth => '0', -relief => 'groove')->pack(-side => 'left', -fill => 'both',-expand=>'1'); $dicoD->configure(-background => 'white'); # pour le boutton my $cadretitre=$dicoG->Frame(-height => '1', -width=>'30')->pack(-side=>'top'); $cadretitre->configure(-background => '#EAADEA'); #couleur du petit cadre autour du mot concordance my $labelDico=$dicoG->Label(-text => "Dictionnaire ", -background=> 'black', -foreground=> 'white', -height=>2, -width=>20)->pack(-side => 'top', -padx=>5,-pady=>5); $labelDico->configure(-background => '#EAADEA'); # On crée le boutton concordance et on lui applique une fonction $cadretitre->Button(-text=> "Concordance",-background =>'white',-command => sub {&concordance})->pack(-side => 'top',-padx => 5,-pady=>5); # ----------- création SMlistbox ----------------- # $editortextetemporaire = $dicoD->Scrolled('SMListbox', -scrollbars => 'se', -height => 25, -width => 300, -relief => 'sunken', -sortable => 1, -selectmode => 'extended', -showallsortcolumns => 1, -takefocus => 1, -borderwidth => 1, -columns => [ [-text => 'Forme', -width => 25, -comparecommand => sub { $_[1] cmp $_[0]}], # comparecommand : paramètre de trie de la colonne # cmp : compare les éléments de la liste en tant que chaine de caractères [-text => 'Fréquence', -width => 25,-comparecommand => sub { $_[1] <=> $_[0]}], # <=> pour comparer des valeurs numériques ] )->pack(-side=>'top', -expand=>'yes', -fill =>'both', -padx=>0, -pady=>0, ); # -------------- cération de la page concordance ------------------# my$listeconcordance=$page3->Scrolled('SMListbox', # on doit mettre le concordancier dans la page 3 -scrollbars => 'se', -height => 25, -width => 300, -relief => 'sunken', -sortable => 1, -selectmode => 'extended', -showallsortcolumns => 1, -takefocus => 1, -borderwidth => 1, -columns => [ # on crée les colonnes du tableau du concordancier, il y en aura 3 [-text => 'contexte gauche', -width => 31,-fg => 'white', -bg => '#BC8F8F', -comparecommand => sub { $_[1] cmp $_[0]}], [-text => 'pole', -width => 31,-fg => 'white', -bg => '#EAADEA',-comparecommand => sub { $_[1] <=> $_[0]}], [-text => 'context droit', -width => 31,-fg => 'white', -bg => '#BC8F8F',-comparecommand => sub { $_[1] <=> $_[0]}], ] )->pack(-side=>'top', -expand=>'yes', -fill =>'both', -padx=>0, -pady=>0, ); #--------------------------------------------------------------- MainLoop; #--------------------------------------------------------------- #---------------------Procédures------------------------------ #--------------------------------------------------------------- sub lire_url { $info="Chargement $url..."; $editortexte->delete("1.0","end"); # editortexte est l'objet graphique de type editeur ds la page 1. la fonction delete #est prédéfinie et permet de vider le contenu de l'éditeur # $page est une variable qu'on crée. La fonction 'get' est prédéfinie dans la bibliothèque LWP simple. # elle prend comme argument une url et récupère le contenu my $page = get( $url ); # On regarde si la récupération s'est bien passée. Si ca ne s'est pas bien passé un message s'affiche dans cygwin if ( not defined( $page ) ){ print "Problème lors du téléchargement !\n"; } # on revient sur l'éditeur de texte et la fonction 'insert' permet d'insérer dans un éditeur une chaine de caractères $editortexte->insert("end",$page); $info = "$url chargée."; } #-------------------------procédure make dico---------------------------------------# sub makedico { my ($texteasegmenter)=@_; # @_ variable prédéfinie = le tableau spécial qui contient l'ensemble des arguments d'une procédure my @listedemots=split(/\W+/,$texteasegmenter); # on segmente le texte en cours , on aura l'ensemble des mots ds la variable my $dico=(); foreach my $mot (@listedemots) { if (exists($dico{$mot})) { $dico{$mot}++; } else{ $dico{$mot}=1; } } foreach my $mot (sort keys %dico) { $editortextetemporaire->insert("end",[$mot,$dico{$mot}]); } } # url2txt : nous voulons garder le texte sans les balises sub url2txt { $editortexte->delete("1.0","end"); # si quelque chose est écrit dans ma fenètre, ca sera effacé my $page = get( $url ); if ( not defined($page) ){ die "Problème lors du téléchargement !\n"; } #pour normaliser le contenu de la page en iso latin my $codage_page = "latin1"; if ($page =~ /\bcharset\s*=\s*([\w-]+)/i) { $codage_page = $1; eval { decode ($codage_page, "test") }; if ( defined ($@) ) { $codage_page = "latin1"; } } my $page_unicode = decode( $codage_page, $page ); my $texte_unicode = supprime_html( $page_unicode ); my $texte = normalise_latin1( $texte_unicode ); $editortexte->insert("end",$texte); # création du dictionnaire &makedico($texte); #------------------------------------------------------------- sub supprime_html { my @balises_a_ignorer = ("applet","code","embed","head","object","script","server"); my $html = shift @_; $html =~ s/\n+/ /g; $html =~ s/\r+/ /g; decode_entities($html); foreach my $balise (@balises_a_ignorer) { $html=~s/<$balise.*?<\/$balise>//ig; } $html =~ s///g; #commentaires $html =~ s/<\/?p\/?>/\n/ig; #paragraphes $html =~ s//\n/ig; #retours à la ligne $html =~ s/<\/tr>/\n/ig; #lignes de tableau $html =~ s/<\/?h[1-6]>/\n/ig; #titres $html =~ s/<\/?div.*?>/\n/ig; #sections $html =~ s/<.*?>//g; #autres balises $html =~ s/\s*\n\s*/\n/g; #espaces en début/fin de ligne $html =~ s/ +/ /g; #séquences de plusieurs espaces return $html; } sub normalise_latin1 { my $chaine = shift @_; $chaine =~ s/[\x{2019}\x{2018}]/\'/g; $chaine =~ s/[\x{201C}\x{201D}]/\"/g; $chaine =~ s/[\x{2013}\x{2014}]/-/g; $chaine =~ s/\x{2026}/.../g; $chaine =~ s/\x{0152}/OE/g; $chaine =~ s/\x{0153}/oe/g; $chaine =~ s/[^\x{0000}-\x{00FF}]//g; return $chaine; } } #--------------------------------------------------------------- sub sauve_fic { $info="Sauvegarde du fichier RESULTAT.txt..."; $nom_fic="RESULTAT.txt"; open(FIC,">$nom_fic"); print FIC $editortexte->get("1.0","end"); close(FIC); $info= "Fichier '$nom_fic' sauvegardé."; } #--------------------------------------------------------------- sub search_in_fic { $info="Recherche dans le fichier..."; &text_search($editortexte, $search_string, 'search'); if ($mw->depth > 1) { text_toggle($editortexte, ['configure', 'search', -background => 'SeaGreen4', -foreground => 'white'], 800, ['configure', 'search', -background => undef, -foreground => undef], 200); } else { text_toggle($editortexte, ['configure', 'search', -background => 'black', -foreground => 'white'], 800, ['configure', 'search', -background => undef, -foreground => undef], 200); } $info= "Recherche dans Fichier terminée."; } #--------------------------------------------------------------- sub text_search { # The utility procedure below searches for all instances of a given string in a text widget and applies a given tag # to each instance found. # Arguments: # # w - The window in which to search. Must be a text widget. # string - The string to search for. (regexp and so on...) # tag - Tag to apply to each instance of a matching string. my($w, $string, $tag) = @_; $w->tag('remove', $tag, '0.0', 'end'); (my $num_lines) = $w->index('end') =~ /(\d*)\.\d*/; for($i = 1; $i <=$num_lines; $i++) { my $line = $w->get("${i}.0", "${i}.1000"); next if not defined $line or $line !~ /($string)/; my $l = length $1; $stringRegexp=$1; my $offset = 0; while (1) { my $tmpoffset=0; my $index = index $line, $stringRegexp, $tmpoffset; last if $index == -1; $offset += $index; $w->tag('add', $tag, sprintf("%d.%d", $i, $offset), sprintf("%d.%d", $i, $offset+$l)); $offset += $l; $line = substr $line, $index+$l; if ($line=~/($string)/) { $stringRegexp=$1; $l = length $1;} } # whilend } # forend } # end text_search #--------------------------------------------------------------- sub text_toggle { # The procedure below is invoked repeatedly to invoke two commands at periodic intervals. It normally reschedules itself # after each execution but if an error occurs (e.g. because the window was deleted) then it doesn't reschedule itself. # Arguments: # # w - Text widget reference. # cmd1 - Reference to a list of tag options. # sleep1 - Ms to sleep after executing cmd1 before executing cmd2. # cmd2 - Reference to a list of tag options. # sleep2 - Ms to sleep after executing cmd2 before executing cmd1 again. my($w, $cmd1, $sleep1, $cmd2, $sleep2) = @_; # return if not Exists $w; $w->tag(@{$cmd1}); $w->after($sleep1, [sub {text_toggle(@_)}, $w, $cmd2, $sleep2, $cmd1, $sleep1]); } # end text_toggle #------------------Le concordancier -------------------------# sub concordance { #On recherche les motifs sélectionnés dans le dictionnaire #curselection : on recupère ce que le lecteur a selectionné dans la smlistbox dictionnaire,et on renvoie une liste des positions des lignes sélectionnées my @selection=$editortextetemporaire->curselection(); # on vérifie que la taille de la liste n'est pas vide (dans une liste vide le + grand élément est -1 ) if ($#selection eq -1) { return; } # créer une liste vide des mots sélectionnés par le lecteur my @listeItem=(); # on crée compteur qui va lire les lignes correcpondant aux indices sélectionnés dans la liste for (my $sel=0;$sel <= $#selection; $sel++) { my @formes=$editortextetemporaire->getRow($selection[$sel]); # ex: on a une liste = a 5 et 9 . pour tel indice $sel tu vas me chercher #la valeur associée a l'indice et une fois que tu les as, va chercher les lignes dans la smlistbox # getRow (prend le numéro de la ligne) renvoie a une liste # on veut le premier élément de la liste sélectionnée my $forme=$formes[0]; print $forme,"\n"; # je mets les mots dans la liste des items push(@listeItem,$forme); } # on récupère ds l'éditeur grace a get le contenu total my $texte=$editortexte->get("1.0",'end'); # on précise que le contexte est de 5 mots my $nbmotscontextes=5; # parcourons foreach my$motif (@listeItem) { # on lance la concordance sur $motif sur $texte # on cherche dans $texte le motif sur lequel on travaille. L'option 'g' pour prendre les motifs un par un while($texte=~/\b$motif\b/gi) { my @gauche=split(/[\W]+/,$`); my $pole=$&; my $droite=$'; # il faut enlever les blancs au début... $droite=~s/^ +//; my @droite=split(/[\W]+/,$droite); my $d=""; my $g=""; for (my $i=1;$i<=$nbmotscontextes;$i++) { $d.=" ".$droite[$i-1]; $g = $gauche[$#gauche-$i+1]." ".$g; } $listeconcordance->insert("end",[$g,$pole,$d]); #print FILEOUT "$cptfq$g $pole $d\n"; #$cptfq++; } $onglet->raise('page3'); } } sub lire_File { my $types=[ ['TextFiles', ['.txt','.dic','.par']], ['All Files',['.*']] ]; my $tmp_nom_source=$mw->getOpenFile(-filetype=>$types); #get open file : montrer une fenètre de fichiers et récupèrer le fichier qu'on sélectionne print $tmp_nom_source,"\n"; # on regarde si l'utilisateur a bien sélectionné un fichier if($tmp_nom_source=~/^$/) { return; } # on sait que j'ai un fichier. je veux l'insérer dans l'éditeur. #on crée une variable texte qui va contenir mon texte #j'ouvre le fichier sélectionné, je le parcours et je concatène chaque ligne du fichier my $texte=""; $url=$tmp_nom_source; open(TMP,$tmp_nom_source); while() { $texte.=$_; } close(TMP); $editortexte->delete("1.0","end"); $editortexte->insert("end",$texte); # makedico s'applique a mon texte &makedico($texte); } ########## on lance la tokenisation avec treetagger ####### sub loadtreetagger { my $texteentree=$editortexte->get("1.0",'end'); # ici je prends le texte et je le mets dans une variable # on récupère le texte print $texteentree,"\n"; open(FIC,">inputtreetagger.txt"); print FIC $texteentree; close(FIC); #on coupe et on met un mot par ligne system("perl tokenise-fr.pl inputtreetagger.txt > inputtreetagger2.txt"); #on lance treetagger # on définit des variables my $treetagger="inputtreetagger2.txt"; my $treetaggerout ="outputtreetagger.txt"; my $liblangue="french.par"; my $progname="tree-tagger.exe"; my $commandetreetagger="$progname $liblangue -lemma -token -sgml -no-unknown \"$treetagger\" \"$treetaggerout\""; #on lance la commande Win32::Process::Create($Win32::Process::Create::ProcessObj, "tree-tagger.exe", $commandetreetagger, 0, NORMAL_PRIORITY_CLASS, "." ) or die Win32::FormatMessage ( Win32::GetLastError() ),"\n"; $Win32::Process::Create::ProcessObj->Wait(INFINITE); # on vient de générer le fichier de sortie # pour le mettre au format xml system ("perl treetagger2xml.pl outputtreetagger.txt"); # il faut lire les résultats my $texte=""; open (TMP, "outputtreetagger.txt.xml"); while() { $texte.=$_; } close TMP; $editortreetagger->delete("1.0","end"); $editortreetagger->insert("end",$texte); $onglet->raise('page5'); } # ---------- l'extraction de patron ---------------------- # sub extract_patern { $extract->delete("1.0","end"); my $texteentree_extract= $editortreetagger->get("1.0","end");# ici je prends le texte et je le mets dans une variable # on récupère le texte open(FILE,">outputtreetagger2.txt"); print FILE $texteentree_extract,"\n"; close(FILE); open(FILE,"outputtreetagger2.txt"); #@table=$texte; @table=; close(FILE); while (@table) { my $ligne=shift(@table); my $sequence=""; # ici je cherche les noms et les adjectifs grace a une boucle 'if' if ($ligne=~/NOM<\/data>[^<]+<\/data>([^<]+)<\/data><\/element>/){ $sequence=$1; if ($table[0]=~/ADJ.*<\/data>[^<]+<\/data>([^<]+)<\/data><\/element>/){ $sequence.=" ".$1; print "$sequence\n"; $extract->insert("end","$sequence\n"); } } } # on imprime le résultat dans notre page $onglet->raise('page6'); } # ----------- Rapport ------------------- # #Pour compter le nombre de mots dans le fichier analysé sub rapport { $rapport->delete("1.0","end"); my $rapport_mot= $editortexte->get("1.0","end"); open(FILE,">le_rapport.txt"); print FILE $rapport_mot,"\n"; close(FILE); open(FILE,"le_rapport.txt"); # on veut extraire le dernier mot de chaque ligne my $compteur= 0 ; while(my $ligne=){ # on coupe les lignes en mots \W+ et on les place dans un tableau @TAB=split(/\W+/,$ligne); print "@TAB\n"; # ici on retire le dernier élément du tableau grace a 'split' $compteur+= $#TAB +1; #print OUT $compteur." ".$a."\n"; } print "le texte contient $compteur mots\n"; print "Vous avez choisi de travailler sur le texte $url \n"; #$url est le nom de la variable dans laquelle figure le nom de fichier txt ou url sur #lequel nous travaillon print "$url \n"; $rapport->insert("end","Vous avez choisi de travailler a partir de : $url \n \nLe texte chargé contient $compteur mots."); $onglet->raise('page7'); close(FILE); } # --------------- Le manuel --------------------- # sub lemanuel { $manuel->delete("1.0","end"); #open(FILE,"man.txt"); $manuel->insert("end","Bienvenue dans le manuel de mon extracteur de texte .\n\nLe but de ce programme est de :\n-pouvoir charger un fichier .txt une page url\n-céer un dictionnaire des occurrences\n-faire un concordancier à partir de n'importe quelle occurrence du dictionnaire\n-extraire un patron syntaxique du type NON/Adj\n-obtenir des informations sur le nombre d'occurrences dans le texte.\n\n1) Pour charger un texte au format .txt il vous suffit d'aller dans le menu 'File' --> 'open file (txt). A ce moment une fenètre apparait et vous pouvez choisir un texte dans votre ordinateur de travail.\nSi vous voulez travailler sur une page web, veuillez rentrer l'adresse dans la barre URL puis pressez Load-URL puis URL-to-txt afin de supprimer les balises pour pouvoir réaliser les analyses.\n\n1)a. Pour faire une recherche dans le texte, servez vous de la barre de recherche située en bas de la page principale. Entrez le mot dans la barre blanche puis pressez 'Surligner'. Le mot que vous avez recherché clignotera dans le texte du dessus.\n\n2) Pour obtenir le dictionnaire des occurrences du texte; rien de plus simple, clickez sur l'onglet dictionnaire. Les occurrences seront classées par ordre alphabétique et dans la colonne de droite, leur nombre d'apparition dans le texte sera indiqué. Si vous voulez que les occurrences apparaissent de la plus fréquente a la moins fréquente, appuyer sur 'Frequence'.\n\n3) Pour réaliser une concordance, allez sélectionner dans le dictionnaire les mots qui vous intéressent (s'il y en a plusieurs, pressez la touche Ctrl de votre clavier et sélectionnez toutes les occurrences). Une fois que vous avez choisi, pressez le boutton 'concordance' et la page s'ouvrira. Vous vérez apparaitre le contexte gauche, votre occurrence et le contexte droit.\n\n4) Pour rechercher dans le texte le patron syntaxique Nom/Adj, il fat d'abord annoter votre texte grace à la fonction Trettagger qui se trouve dans le Menu 'Syntaxe' --> 'Treetagger'. Une fois que vous avez fait ceci, la page de l'onglet Treetagger s'ouvrira et vous vérez comment est annoté le texte syntaxiquement. Pour extraire le patron particulier, allez dans le Menu 'Syntaxe' --> 'Extraction de patron' et le résultat apparaîtra à l'écran.\n\n5) Pour obtenir des informations sur le texte, allez dans le Menu 'Rapport' --> 'Faire un rapport'.\n\nPour quitter l'extracteur, cliquez soit sur la flèche tout en haut à droite ou allez dans le Menu 'File' --> 'Exit'.\n"); $onglet->raise('page8'); }