Stage - DLST

Transcription

Stage - DLST
Université Joseph Fourier
Département Licence Sciences & Technologie
RAPPORT DE STAGE
RÉSUMÉS AUTOMATIQUES DE
RECHERCHES GOOGLE
Sarazin Paul
Laboratoire d’accueil : LIG - Laboratoire d’Informatique de Grenoble
Directoire de laboratoire : MARTIN Herré
Responsable du stage : AMINI Massih-Reza
Licence Mathématique et Informatique Internationale – 1° année
2012 – 2013
REMERCIEMENTS
Je tiens tout d’abord à remercier mon tuteur, M. Amini, maître de conférence et chercheur au LIG,
pour ses conseils, son soutien et sa bonne humeur qui m’ont permis de passer un très bon stage.
Je remercie également M. Martin, directoire du LIG, de m’avoir accueilli comme stagiaire au sein de
son département.
Je tiens à remercier l’ensemble de l’équipe du LIG pour leur accueil et leur disponibilité pendant la
durée de mon stage.
Je tiens aussi à remercier M. Arrighi, M. Gaussier, M. Borne, M. Colonel-Bertrand et M. Verné de
m’avoir aidé à trouver ce stage.
Je tiens enfin à remercier l’université Joseph Fourier de m’avoir donné la chance de faire ce stage
rémunéré.
Toutes ces personnes ont contribué, par leur disponibilité et leur bonne humeur, à rendre mon stage
enrichissant et motivant.
2
TABLE DES MATIÈRES
1. Introduction ………………………………………………………………………… 5
1.1. Contexte
1.2. Sujet
1.3. Motivations
2. Planification ………………………………………………………………………… 6
2.1. Timeline
2.2. Connaissance à acquérir
3. 1er semaine …………………………………………………………………………… 7
3.1. Perl
3.1.1. Particularité du langage
3.1.2. Expression régulière
3.1.3. Table de hachage
3.2. Module de résumé
3.2.1. Collections d’articles tests
3.2.2. Extraction du texte
3.2.3. Normalisation du texte
3.2.4. Filtrage du texte
3.2.5. Scoring simplifié
e
4. 2 semaine ………………………………………………………………………… 11
4.1. Module de résumé
4.1.1. Scoring
4.1.2. Exportation HTML des résultats
4.2. Module d’importation des résultats Google
4.2.1. Apprentissage rapide du PHP orienté objet
4.2.2. Compréhension du code du module
4.2.3. Gestion des problèmes
4.3. Création du site web LAMP
4.3.1. Mise en place du code HTML, CSS et PHP
4.3.2. Création du logo LAMP
e
5. 3 semaine ………………………………………………………………………… 14
5.1. Compatibilité de la langue française
5.2. Module d’importation des résultats Google
5.2.1. Création du module d’importation des résultats Google
5.2.2. Réorganisation de l’arborescence
5.3. Implémentation du module de résumé au site web
5.3.1. Modification du module de résumé
5.3.2. Simplification du module de scoring
e
6. 4 semaine ………………………………………………………………………… 18
6.1. Extraction de pages HTML depuis internet
3
6.1.1. Difficulté du processus
6.1.2. Nouveau module d’extraction
6.2. Finalisation du site
6.2.1. Refonte de l’interface
6.2.2. Aperçu du site Lamp
6.3. Recherche sur Wikipédia
6.3.1. Récupération des pages Wikipédia
6.3.2. Extraction du texte
6.3.3. Intégration au site Lamp
6.4. Améliorations possibles
7. Conclusion ………………………………………………………………………… 24
7.1. Apports du stage dans ma formation
7.2. Compétences acquises
8. Bibliographie ………………………………………………………………………… 25
4
1. INTRODUCTION
1.1 CONTEXTE
Situé sur le campus de Grenoble, le LIG (le laboratoire d’informatique de Grenoble)
est un centre de recherche qui vise, je cite, à « contribuer au développement des
aspects fondamentaux de la discipline (modèles, langages, méthodes, algorithmes)
et pour développer une synergie entre les défis conceptuels, technologiques et
sociétaux associés à cette thématique. ». J’ai été accueilli par M. Amini, mon tuteur,
dans le cadre des stages d’excellences mis en place par l’université de Grenoble.
Ce stage permet aux élèves ayant obtenu de bons résultats aux examens de faire
un stage rémunéré dans un organisme de recherche.
1.2 SUJET
Après avoir écumé les offres de stages sans en trouver une qui me plaisait, j’ai
décidé d’aller chercher moi-même un stage qui me correspondrait mieux. Comme
j’étais intéressé par le domaine du résumé de texte, j’ai contacté plusieurs personnes
qui m’ont dirigé vers M. Amini, chercheur au LIG et enseignant à l’université Joseph
Fourrier, qui a accepté de me prendre comme stagiaire. M. Amini est chercheur
dans le domaine de l’apprentissage automatique sur de grands ensembles de
données. Le sujet a muri avec ses conseils pour aboutir à sa forme finale que je
reprends : « résumé en ligne de documents retournés par un moteur de recherche :
avec le foisonnement des documents électroniques et des sites web, il devient de
plus en plus difficile de trouver l’information précise parmi celles existantes. Les
moteurs de recherche actuels n’apportent qu’une solution partielle à ce problème
en mettant en gras les mots de la requête de ceux des documents retournés. Le but
de ce stage est de trouver les phrases les plus pertinentes des documents et de les
présenter ».
1.3 MOTIVATIONS
Je suis intéressé par le traitement de grands ensembles de données, une tache
presque impossible à réaliser il y a 50 ans de cela, mais devenue possible avec les
ordinateurs et leurs puissances de calcul. Décomposer un processus complexe,
comme résumer un texte, pour en faire un programme informatique est une tâche
qui m’attire beaucoup et que j’avais envie d’approfondir. De plus, Internet est une
source infinie d’information et il est indispensable de trouver des méthodes pour
rendre ces informations plus accessibles. Concevoir un prototype capable de
résumer les requêtes du moteur de recherche le plus populaire de nos jours, Google,
est un projet qui me motive énormément. Le site internet y ajoute encore de l’intérêt,
car je trouve important que mon travail débouche sur quelque chose de concret.
5
2. PLANIFICATION
2.1 TIMELINE
Le stage durant un mois, nous avons décidé de diviser le projet en trois grandes
parties. Chaque partie durera environ une semaine. La dernière semaine servira à
rajouter des fonctionnalités et à peaufiner le projet.
Module de résumé
1re semaine
Extraction des résultats
retournés par le moteur
de recherche
2e semaine
Affichage des résultats
sur un site internet
3e semaine
2.2 CONNAISSANCE À ACQUÉRIR






Langage Perl (plus particulièrement les tables de hachage et les expressions
régulières)
Langage HTML et CSS (création d’un site web en totalité, design, utilisation
des formulaires, des sessions, etc.)
Langage PHP et PHP objet (site web dynamique, utilisation de la bibliothèque
Curl)
Linux (utilisation d’un ordinateur sous Ubuntu, installation de programmes,
utilisation de la console de commande (chmod, su, sudo, history …))
Création d’icône pour le site web avec Gimp.
Planifier et mener un projet de a à z.
6
3. 1RE SEMAINE
3.1 PERL
Un des atouts du Perl est sa capacité à traiter d’importants volumes de données sans
avoir à écrire beaucoup de lignes de code. Ce langage permet de manipuler du
texte de façon précise grâce à sa très bonne prise en charge des expressions
régulières (que nous verrons un peu plus loin). C’est donc le langage de
programmation rêvé pour programmer le moteur qui résumera nos textes.
3.1.1. Particularité du langage
Le Perl est un langage de programmation assez facile d’apprentissage. Sa syntaxe
se rapproche de celle du C. Celui-ci propose la prise en charge native des
expressions régulières et des tables de hachage qui sont très utiles pour la
constitution d’un dictionnaire et la reconnaissance de mot, des tâches importantes
pour résumer un texte. Pour apprendre le Perl, j’ai beaucoup utilisé le livre
« Introduction à Perl » des éditions O’Reilly. J’ai aussi eu recours aux forums internet
pour trouver certaines informations, Perl disposant d’une communauté très active.
3.1.2. Expression régulière
Les expressions régulières permettent d’extraire facilement des parties d’un texte qui
ont certains attributs. C’est très utile pour filtrer le code HTML d’une page web
remplie de balises, de publicités et de JavaScript. Par exemple l’expression « $phrase
~=/(w+)/ » permet de récupérer le premier mot d’une phrase. Il y a cependant des
subtilités qu’il faut connaitre et dont je reparlerais plus loin. Par exemple, les accents
de la langue française posent problème dans cette expression. Les possibilités de
substitution de Perl sont aussi très utiles. Elles permettent de remplacer certaines
parties d’un texte par d'autres, ce qui est pratique dans bien des situations, pour
supprimer les espaces superflues d’un texte par exemple.
Les expressions régulières m’ont servi à récupérer les parties intéressantes d’une
page HTML, puis m’ont été utiles pour normaliser le texte (simplifier sa syntaxe en
supprimant les majuscules, les points…). Elles m’ont aussi servi lors du filtrage du texte
par l’antidictionnaire, sur lequel je reviendrais plus loin. Enfin, j’ai utilisé les expressions
régulières pour compter le nombre d’apparitions des mots dans les textes.
7
3.1.3. Table de hachage
Les tables de hachage sont similaires aux tableaux à la différence que ce n’est pas
un nombre qui permet de retrouver une valeur, mais un mot (que l’on appelle une
clé). Il ne peut y avoir deux clés identiques dans une même table. Dans la pratique,
cela permet de retrouver beaucoup plus facilement certaines informations. À la
place de numéroter les cases, on leur donne un nom. Il suffit ensuite d’appeler une
case pour avoir sa valeur. Ainsi, si je créé une table de hachage qui contient tous les
mots d’un texte, je suis assuré que le même mot n’apparaitra pas deux fois dans ma
table. En imaginant que j’ai incrémenté la valeur d’une clé (d’un mot) à chaque fois
que je l’ai rencontré dans le texte, il me suffit pour connaitre le nombre
d’occurrence du mot « je » de taper : mots_du_texte{je} et la table me renvoie sa
valeur. Si le mot appelé n’existe pas, le programme me renvoie la valeur 0 au lieu de
planter. C’est toute la beauté du Perl.
3.2.
MODULE DE RÉSUMÉ
Le module de résumé est au cœur de mon stage. C’est une partie complexe et il a
fallu faire des choix : il y a une infinité de manières de résumer un texte. Après avoir lu
plusieurs documents à ce sujet, notamment la thèse de mon tuteur, monsieur Amini,
nous avons choisi de créer un module de résumé basé sur des mesures de similarité.
Le nom semble cacher des notions particulièrement complexes, mais vous verrez
qu’il n’en est rien. De plus, le résumé mis en place est de type extractif, ce qui signifie
que nous récupèrerons directement du texte les phrases les plus pertinentes. Il n’y
aura pas de reformulation d’idée, travail qui demande bien plus de connaissance et
de temps.
Voici un schéma qui présente les différentes étapes de notre module de résumé.
Collection de
documents
HTML
Extraction
du texte
Normalisation
du texte
Voyons plus en détail chacune d’entre elles.
Filtrage
du texte
Scoring
Phrases
pertinentes
3.2.1. Collections d’articles tests
Pour évaluer l’efficacité de notre module de résumé et afin de comparer l’efficacité
de plusieurs méthodes que nous mettrons en place, il nous fallait, avant de travailler
sur des documents retournés par un moteur de recherche, travailler en local.
M. Amini a gentiment mis à ma disposions une banque de données de plusieurs
centaines de textes anglais regroupés par sujet. Bien qu’étant en HTML, la syntaxe a
été harmonisée afin de faciliter l’extraction de l’article du reste de la page.
8
3.2.2. Extraction du texte
Dans l’idéal, le texte qui nous intéresse nous arriverait propre et il n’y aurait plus qu’à
le résumer. Malheureusement, si vous avez déjà observé le code HTML d’une page
web, vous savez que celui-ci est loin d’être utilisable directement. Les balises du
code HTML découpent l’article en laissant des bouts de phrases incohérents.
L’entête de la page HTML ne présente aucun intérêt (si ce n’est la langue de
l’article). Il est donc important, dans un premier temps, à l’aide des expressions
régulières, de récupérer les informations qui nous intéressent. Dans la collection
d’articles tests, tous les articles présentaient une mise en page soignée et
globalement identique d’un document à l’autre. Ce qui est loin d’être le cas sur
internet. Dans un premier temps, nous allons configurer l’extracteur pour cette
collection, et nous l’adapterons aux pages plus complexes lors des prochaines
semaines.
3.2.3. Normalisation du texte
La première étape est de parser notre texte, c’est-à-dire de mettre une phrase par
ligne. Ce n’est pas si évident que cela, il faut prendre en compte les acronymes, les
points de suspension et autres pour ne pas avoir de saut de ligne au milieu d’une
phrase.
Puis il faut enlever tout ce qui ne nous intéresse pas dans le texte (et dans la
requête). Tout ce qui n’est pas un mot, un espace, un retour de ligne, un signe de
ponctuation (…) est supprimé. On met la totalité du texte en minuscule pour que
« jaune » et « Jaune » correspondent bien au même mot. Pour finir, on enlève tous les
espaces et sauts de ligne inutiles que le processus a laissés pour nous retrouver avec
un texte propre et facilement exploitable.
3.2.4. Filtrage du texte
Dans la majorité des langues, il y a des mots qui ne portent que peu de sens. Par
exemple, « la » ou « ce » ne nous permettent pas de nous avancer quant au sujet
d’un texte. Pour accélère le traitement, et pour rendre le processus de résumé plus
efficace, il est nécessaire d’enlever ces mots. Il suffit de comparer chaque mot du
texte avec une base de données, appelé « antidictionnaire », qui contient la liste des
mots d’une langue qui ne portent pas d’intérêt significatif. On charge
préalablement ces mots dans une table de hachage pour accélérer le traitement.
On regarde alors si les mots du texte font partie de cette table. Si c’est le cas, ils sont
supprimés.
9
3.2.5. Scoring simplifié
Il existe une multitude de méthodes pour classer les phrases d’un ensemble de
documents. L’une des plus simples est de compter le nombre de mots dans la phrase
qui font partie de la requête. Les phrases contenant le plus de mots de la requête
obtiennent le score le plus élevé. Les résultats d’un tel scoring sont corrects, même si
les phrases les plus longues sont clairement avantagées. Pour l’instant, le programme
affiche les cinq phrases qui ont obtenu le plus haut score sur le terminal.
10
4. 2e SEMAINE
4.1 MODULE DE RÉSUMÉ
Cette 2e semaine va être l’occasion d’améliorer le module de scoring. Je vais aussi
mettre en place le programme qui permet de récupérer les résultats d’une requête
Google. Je commencerais également à mettre en place le site web qui permettra à
un internaute de faire une recherche et de voir les résultats.
4.1.1 Scoring
Je débute cette nouvelle semaine par l’implémentation d’un module de scoring
plus poussé. Pour cela, on commence par calculer ce qu’on appelle le document
frequency (abrégé idf) de chaque mot des textes de la collection. On crée une liste
de tous les mots présents, avec sur chaque ligne le mot suivi de son idf. L’idf est égal
au logarithme du nombre total de mots divisé par le nombre d’occurrences de ce
mot-ci : idf (mot) =
(
). Puis on supprime tous les mots qui ont un idf inférieur à 5.
Cette étape réalisée, on charge les pairs mots/idf dans une table de hachage et
l'on calcule un score pour chaque phrase selon la formule :
Score (phrase, requête) =
∑(
(
√∑(
(
. Ainsi, pour chaque mot m de la requête, on
multiplie le nombre d’occurrences de ce mot dans la phrase (#m) par son idf et l’on
somme toute ces valeurs. On divise alors ce nombre par la formule du dessous (qui
correspond à une norme entre les vecteurs requête et phrase), ce qui permet
d’éviter que les longues phrases obtiennent un meilleur score à cause du nombre de
mots plus élevé qui les composent.
Les phrases qui obtiennent le score le plus élevé sont alors placées en haut d’une
liste et sont supposées être les phrases les plus pertinentes vis-à-vis de la requête.
4.1.2 Exportation HTML des résultats
Afin de pouvoir afficher les résultats sur la page HTML d’un site, il faut que le
programme les exporte dans un format affichable sur internet. Il est très facile
d’intégrer une page HTML à un site web, je vais donc faire en sorte que les résultats
sortent en tant que tels. Je mets en place une sous fonction qui affiche les résultats
de manière ordonnée : un paragraphe contient en sous-titre le nom de la page
d’où provient la phrase (sur lequel on peut cliquer pour visiter la page) suivie par la
phrase en question. Ces résultats sont ordonnés selon le score obtenus, avec un
nombre de résultats à afficher paramétrable.
11
4.2 MODULE D’IMPORTATION DES RÉSULTATS GOOGLE
Maintenant que l’on a un module de résumé fonctionnel, il s’agit de récupérer les
textes non plus dans notre collection test, mais dans l’immensité d’internet. Le
moteur Google étant très populaire, nous avons décidé de l’utiliser afin de nous
fournir des pages web pertinentes par rapport à la requête de l’utilisateur. Mon
tuteur, M. Amini, avait sous la main un module tout prêt qu’il avait utilisé il y a
quelque temps et qui semblait marcher. Je me suis donc attablé à la lecture du
code afin de comprendre son fonctionnement.
4.2.1. Apprentissage rapide du PHP orienté objet
Ce module étant écrit en PHP objet, je me penche sur la lecture d’un cours sérieux
trouvé sur internet afin de pouvoir comprendre le code du module. C’est la première
fois que je fais de la programmation orientée objet mais je comprends assez bien le
concept et je fais quelques exercices pour assimiler les notions.
4.2.2. Compréhension du code du module
Une fois paré pour comprendre le code du module d’importation, j’entame sa
lecture. J’ai besoin de le paramétrer afin de récupérer un certain nombre de
documents dans la langue de mon choix. Cependant, bien que le programme
semble tourner, celui-ci ne revoit aucun résultat. Après avoir parcouru le code du
module pour identifier les erreurs et avoir modifié certaines parties pour essayer de
l’adapter à mon cas, il s’avère que ce module est inopérant.
4.2.3. Gestion des problèmes
Le module d’extraction Google a en fait plusieurs années (plus de 6 ans) et il est
donc plus que probable que celui-ci ne soit plus effectif à l’heure actuelle. Au vu du
temps passé sur ce module sans obtenir de résultat, je décide de mettre cette partie
de côté et de créer mon propre module d’extraction des résultats Google la
semaine prochaine.
12
4.3.
CRÉATION DU SITE WEB LAMP
Nous avons décidé de créer un site web pour présenter les résultats du module de
résumé. Il est en quelque sorte l’aboutissement du stage, sa vitrine. J’ai choisi
d’appeler ce site Lamp.
4.3.1. Mise en place du code HTML, CSS et PHP
Je pose les bases du site Lamp en créant la page qui présente les résultats d’une
recherche. Je mets en place le code HTML ainsi que le code CSS qui permet
d’agencer les résultats. La présentation s’inspire de celle des moteurs de recherche
actuels. La page des résultats retournée par le programme de résumé est ajoutée à
l’aide de la commande PHP include.
4.3.2. Création du logo LAMP
Pour améliorer le design de mon site web, je décidé de lui créer un logo. Comme je
suis sous Linux je décide d’apprendre rapidement à me servir de Gimp, un logiciel
d’édition d’image assez puissant. Après quelques recherches et un peu de travail,
j’aboutis au résultat actuel dont je suis satisfait.
13
5. 3e SEMAINE
La troisième semaine marque la mise en place du site web. Bien entendu, les
résultats retournés ne seront pas parfaits car il reste beaucoup d’amélioration à
apporter au niveau du programme de résumé. Ce sera l’occasion d’avoir un
prototype opérationnel du site final, qui sera ensuite amélioré lors de la quatrième
semaine pour atteindre le résultat final exigé.
5.1. COMPATIBILITÉ DE LA LANGUE FRANÇAISE
Je débute cette semaine par la modification du code Perl du module de résumé
afin que celui-ci fonctionne avec le français et les autres langues européennes. Il
faut alors que le programme reconnaisse les caractères
[àáâãäåçèéêëìíîïðòóôõöùúûüýÿ] comme du texte. De plus, le programme de
filtrage doit charger l’antidictionnaire adapté à la langue du texte.
5.2. MODULE D’IMPORTATION DES RÉSULTATS GOOGLE
Le module que j’ai essayé la semaine dernière ne marchant pas, j’ai décidé de
créer moi-même mon module d’importation des résultats Google en PHP.
5.2.1. Création du module d’importation des résultats Google
Le squelette de mon module d’importation va fonctionner comme le montre le
schéma ci-dessous :
Requête
utilisateur
Importation de la page
Google affichant les
résultats de la requête
Filtrage du
code HTML
et
récupération
des liens
Récupération
du code HTML
des liens
Afin de récupérer le code HTML des pages, on va utiliser la
Envoie des
librairie PHP Curl. On envoie la requête de l’utilisateur à
textes au
Google directement à l’aide du lien. Puis on récupère le
module de
résultat sous forme de fichier texte. On utilise un programme
résumé
Perl pour récupérer les liens sur la page, puis on utilise à
nouveau Perl pour récupérer le code HTML de ces liens.
Je télécharge et installe Xampp sur Linux, un logiciel qui transforme un ordinateur en
serveur. Je pourrais ainsi directement évaluer les résultats du module d’importation
14
et son implémentation dans le site web. Après essais, il fonctionne à merveille. Vu
que le serveur va devoir traiter un grand nombre de requête, il est important d’avoir
un agencement clair des données de chaque page web. Je décide donc de fixer
une fois pour toutes l’arborescence du site Lamp.
5.2.2. Réorganisation de l’arborescence
Dans un premier temps, le programme récupère les résultats du module
d’importation des résultats Google. On obtient alors des fichiers bruts. Puis on les
utilise dans le module de résumé qui créé des fichiers .txt, .temp, .norm et un fichier
resultat.html. Ce dernier fichier est récupéré et afficher sur le site web. J’ai besoin de
définir une arborescence claire afin de m’y retrouver et de savoir à n’importe qu’elle
moment où se trouve ce que je cherche. Je pose donc l’arborescence comme
ceci :
Liens Google et
fichiers HTML des
pages extraites
Programmes
Données
et
Brute
propres à la
Programmes
requête 1
Perl
Lamp
Fichiers HTML,
CSS et PHP du
site web
$requete_1
Textes
Données temporaires
relatives aux requêtes
des utilisateurs
$ requête_2
Résumé
Fichiers texte .txt,
.temp, .norm et
résultat.HTML
Les textes d’une requête donnée sont enregistrés dans le dossier du même nom que
la requête (encodé, car certains caractères sont interdits pour les noms de dossier).
Ainsi il est aisé de vérifier le bon résultat d’une requête adressé au site Lamp. Le
dossier brut contient le code HTML de la page Google, la liste des liens Google que
l’on y extrait et les codes HTML des pages web ainsi récupérés. Les documents de ce
dossier restent inchangés afin de pouvoir conserver une copie propre des fichiers
récupérés et de les comparer aux résultats obtenus après extraction et
normalisation. Le dossier résumé contient toutes les modifications apportées aux
textes, les fichiers .txt sont les fichiers extraits de la page web, les fichiers .temps sont
les fichiers normalisés et les fichiers .norm sont les fichiers finaux, ceux que l’on a filtrés
à l’aide de l’antidictionnaire. Le résultat du scoring, le fichier resultat.html, destiné à
être affiché sur la page web, et lui aussi stocker dans le dossier Résumé.
15
5.3. IMPLEMENTATION DU MODULE DE RÉSUMÉ AU SITE WEB
Alors que chaque programme a été implémenté et testé séparément, il est
maintenant venu le moment de les réunir et de les faire fonctionner ensemble pour
aboutir au programme final qui sera utilisé sur le site web.
5.3.1. Modification du module de résumé
Lors de leur mise en place, chaque programme vérifiait tous les paramètres qui lui
étaient transmis pour éviter d’aboutir à des erreurs, par exemple lors de l’ouverture
d’un fichier qui n’existe pas. Pour gagner du temps, on vérifie maintenant tous les
paramètres au début du programme final. De même, on doit modifier les adresses
de sauvegarde et de lecture des fichiers pour qu’elles correspondent à la nouvelle
arborescence présentée à la partie précédente.
Un des nouveaux problèmes qui se pose est le passage des pages de notre
collection de test, codés proprement, aux pages internet qui bénéficient d’une
présentation aléatoire, souvent bien moins soignés. L’extracteur que nous avions mis
en place a donc beaucoup de mal à extraire correctement le texte et il n’est pas
rare de retrouver des balises script à l’intérieur d’un texte brut. Une correction rapide
mise en place est de supprimer les balises à l'intérieur des phrases récupérées, ce qui
améliore grandement les résultats. Cependant, ce module sera repris et amélioré
lors de la quatrième semaine afin de produire des résultats plus satisfaisants.
Enfin il est à noter que j’ai passé beaucoup de temps à résoudre un bug. Certains
modules Perl me renvoyaient une erreur au lieu de fonctionner quand je les
exécutais depuis le site web alors qu’ils fonctionnaient parfaitement quand je les
exécuter depuis la console de commande. Il s’est avéré qu’exécuter un programme
Perl depuis un autre programme Perl, lui-même appeler par un programme PHP,
engendré des erreurs. J’ai donc rapidement recodé les programmes afin qu’ils soient
tous exécutés à la suite par le module PHP.
5.3.2. Simplification du module de scoring
Pour finir cette semaine, j’ai décidé de fusionner les modules de scoring en un seul
programme. Tous les modules de scoring ayant des parties communes, il est inutile
de répéter celles-ci à chaque fois. Il est aussi plus facile de rajouter de nouveaux
modules de scoring, car il suffit de changer l’argument que l’on envoie au
programme pour l’exécuter.
Je vous présente les modules de scoring qui seront présents sur le site final :
Le module de scoring simplifié qui a été présenté la première semaine.
Le module de scoring « normal » codé la deuxième semaine.
16
Se rajoutent à ces deux modules de scoring deux nouveaux modules de scoring que
j’ai écrit cette semaine :
Le module de scoring sans requête : Utilise la même formule que le module de
scoring normal, mais prend tous les mots de la phrase en compte. Ainsi, ce module
ne prend plus en compte la requête et renvoie simplement les phrases les plus
pertinentes de chaque document fourni par Google.
Le module de scoring mix : C’est un mélange entre le module de scoring normal et
le module de scoring sans requête. Il est possible de donner plus ou moins de poids à
chaque module de scoring. Dans mon cas, j’ai décidé de donner un rapport de 10
au module de scoring normal, c’est-à-dire que les mots de la requête auront 10 fois
plus d’importance que les autres mots.
La semaine prochaine est la dernière de mon stage. Le site commence à marcher,
mais il reste beaucoup de détail à régler pour que le programme marche comme je
le souhaite.
17
6. 4e semaine
Ma dernière semaine sera consacrée à l’amélioration du projet. Le site retourne déjà
des résultats, mais ils ne sont pas très satisfaisants. On retrouve quelques balises script
et autres à l’intérieur des résumés. Dans un premier temps je vais donc améliorer
l’extracteur afin de le rendre plus performant sur les pages que l’on peut croiser sur
internet. Puis j’implémenterais l’interface finale de Lamp, permettant à l’utilisateur de
modifier les paramètres de recherche tels que le module de scoring à utiliser. Ceci
permettra à l’utilisateur de personnaliser les résultats en fonction de ses besoins. Pour
finir, et pour montrer que le programme mis en place peut facilement être adapté,
je rajouterais Wikipédia dans la liste des moteurs de recherche afin que l’utilisateur
puisse afficher d’autres résultats que ce fournis par Google.
6.1.
EXTRACTION DE PAGES HTML DEPUIS INTERNET
Le module d’extraction mis en place la première semaine était prévu pour les pages
de la collection test. Celui-ci ne donnant que des résultats médiocres sur les pages
trouvées sur internet, j’ai décidé de créer un nouvel extracteur qui donnera des
résultats plus satisfaisants.
6.1.1. Difficulté du processus
L’extraction du texte pertinent d’une page HTML récupéré sur internet est assez
complexe. Chaque page web devrait respecter les standards imposés par la W3C,
mais on se rend rapidement compte que très peu de sites suivent à la clé les
recommandations fixées. Cela rend le travail d’extraction de texte de n’importe
quelle page web très compliqué. L’objectif ici était de coder un extracteur qui
fonctionne sur une majorité de sites.
6.1.2. Nouveau module d’extraction
La plupart du temps, le texte se trouve à l’intérieur de balises paragraphes <p>, titres
<h2> ou <text>. Bien entendu, chacune de ces balises peut s’écrire de différentes
manières, <h2 id=soustitre> par exemple, ce qui rend plus difficile leur repérage. En
fin de compte on aboutit à des formules assez complexes pour pouvoir récupérer le
18
texte qui se trouve à l’intérieur. Voici un exemple d’expression que j’ai utilisée dans le
programme final :
$ligne =~ m#<h[0-9](?: (?:.*?))?>(.*?)</h[0-9]>#ig)
On remarque l’utilisation de parenthèses non capturantes, capturantes (pour
récupérer le texte qui se trouve dedans), d’ensemble de caractère, de
quantificateurs non gourmands (par défaut Perl va récupérer la plus grande partie
de la ligne qui correspond à l’expression, ce qui signifie que si il y a plusieurs
expressions correspondantes sur la ligne on va récupérer tout ce qu’il y a entre). Le i
en fin de ligne signifie qu’on ne prend pas en compte la casse, le g permet de
demander à Perl de matcher toutes les expressions présentes dans la phrase. C’est
assez important, car il arrive très souvent qu’une ligne contienne de nombreuses
expressions, j’ai même vu des sites web entièrement codés sur une ligne.
Une fois récupéré, le texte est loin d’être propre, car de nombreuses balises se
trouvent au milieu des phrases. On trouve des balises <strong> </strong> par
exemple, mais aussi beaucoup de balises script qu’il faut bien entendu filtrer.
On obtient alors notre texte brut, qui dans la majorité des cas est assez propre, et l'on
peut passer au résumé qui lui reste identique à la version précédente.
6.2. FINALISATION DU SITE
Le site final va enfin pouvoir être mis en place. On pourra ensuite rajouter des
options, mais les fonctions principales resteront identiques et opérationnelles.
6.2.1. Refonte de l’interface
Il est temps de donner au site Lamp sa forme définitive. Le site s’inspire d’une
présentation à la Google que je trouve efficace. Une page d’accueil ou la barre de
recherche est centrée et où les options se placent en dessous. Puis une page qui
s’affiche quand une recherche est lancée, la configuration de la recherche se
place alors en haut et laisse de l’espace pour l’affichage des résultats. Il est
évidemment possible de relancer une recherche directement depuis cette page.
J’ai aussi fait en sorte que les options sélectionnées et la requête ne s’effacent pas
entre les différentes pages, ce qui apporte un confort non négligeable lors de la
navigation. Je vous présenterais des captures de l’interface un peu loin.
6.2.2. Aperçu du site Lamp
Pour vous donner une idée du travail qui a été réalisé, voici un tour rapide du site.
19
Page d’accueil du site Lamp. Le logo est centré et volumineux, la barre de
recherche se trouve en dessous, et les options prennent placent ensuite. Parmi les
différentes options, la langue de la recherche, le type de scoring appliqué, le
nombre de phrases à afficher par document et le moteur de recherche à utiliser.
Une page d’accueil avec requête et options configurées.
Puis l’utilisateur lance la recherche en appuyant sur la touche entrée. Un écran de
transition invite l’utilisateur à patienter pendant la génération des résultats.
20
Comme vous pouvez le voir, la barre de recherche a pris sa nouvelle forme
allongée, plus discrète. Toutes les options restent évidemment accessibles. Vous
pouvez enfin voir l’affichage des résultats ci-dessous.
Chaque résultat comprend l’adresse du site (sur laquelle vous pouvez cliquer pour
vous rendre directement sur la page en question) suivi par les 3 phrases les plus
pertinentes de cette page.
21
6.3.
RECHERCHE SUR WIKIPÉDIA
Pour finir ce stage, je vais implémenter la possibilité de faire ses recherches sur autre
chose que Google. J’ai choisi Wikipédia, car c’est un site populaire (dans le top 10
des sites les plus visités au monde,) jouissant d’une grande exhaustivité (plus de 22
millions d’articles, même si cela reste négligeable par rapport à Google). Et les
résultats sont souvent plus sérieux que ce que l’on peut trouver sur les sites web en
général. De plus, les pages Wikipédia disposent d’une mise en forme homogène, ce
qui va me permettre de récupérer aisément les parties intéressantes d’un article et
d’afficher des résultats plus propres que pour Google.
6.3.1. Récupération des pages Wikipédia
Wikipédia a mis en place une page spéciale sur son site pour récupérer les pages
qui nous intéresse. L’avantage est que la récupération est très rapide, alors qu’avec
Google il fallait récupérer chaque lien séparément en interrogeant le serveur du site
en question. La récupération Wikipédia fonctionnant avec un formulaire, on utilise la
bibliothèque Curl pour simuler l’envoi des paramètres. Wikipédia nous retourne alors
une page en pseudo HTML avec le résultat de la recherche. Cependant, deux
problèmes sont à noter : si la recherche correspond à un article, Wikipédia nous
retourne uniquement cet article, et pas les articles qui sont proches de celui-ci. Si
l’article n’existe pas, Wikipédia nous renvoie une page sans article. Le site marche
ainsi. C’est quelque chose que l’on pourrait évidemment améliorer sur une
prochaine version du site.
6.3.2. Extraction du texte
La présentation du texte sur la page Wikipédia étant très simple, inutile de réutiliser
l’extracteur complexe que l’on avait mis en place pour les pages retournées par
Google. C’est autant de calculs en moins et de temps gagné. Cependant, la
présentation des pages Wikipédia fait qu’il y a des spécificités à prendre en compte.
On peut croiser des « balises » de cette forme : ((roi | roi de France | souveraineté))
ou de celle-ci : {{reine}} qui ne nous intéresse pas. Il faut donc quand même repasser
sur le texte récupéré pour le rendre plus lisible.
6.3.3. Intégration au site Lamp
Voici un exemple de recherche Wikipédia afin de vous montrer que le
fonctionnement reste le même que pour une recherche Google.
22
Comme vous le voyez ci-dessus, la page de transition indique que l’on effectue une
recherche sur Wikipédia. Puis les résultats apparaissent à l’écran. Le nombre de
résultats à afficher a été réglé sur 10, le type de scoring sur scoring mix, la langue sur
Français et le moteur de recherche sur Wikipédia.
6.4. AMÉLIORATIONS POSSIBLES
Le projet est fini et fonctionne de manière satisfaisante. On pourrait bien entendu
encore l’améliorer. Voici quelques idées qui rendraient Lamp encore meilleur :
La prise en charge de nouvelles langues, d’autres moteurs de recherche, un
programme qui récupère les pages plus rapidement, un extracteur de texte plus
performant et de nouveaux modules de scoring.
23
7. Conclusion
7.1. APPORTS DU STAGE DANS MA FORMATION
Je suis actuellement en L1 de mathématique et informatique internationale. J’ai
pour l’instant l’intention de devenir chef de projet informatique. Ce stage m’a permis
de travailler dans un contexte professionnel où j’ai pu mener un projet dans sa
totalité, ce qui m’a beaucoup plu. J’ai aussi eu la chance d’approcher le monde
de la recherche et de me faire une idée plus précise de ce domaine plaisant. J’ai
ainsi eu la chance de travailler dans un contexte international au sein du LIG et
d’avoir échangé en anglais avec des chercheurs de différentes nationalités pour
certaines parties du projet. Cela renforce ma conviction de partir à l’étranger en
troisième année d’étude.
7.2. COMPÉTENCES ACQUISES
Ce stage a été l’occasion d’apprendre énormément de choses. C’était la première
fois pour moi que je devais tenir un projet aussi conséquent, du début à la fin, en
gérant les imprévues et les délais qui étaient imposés. La réalisation du site Lamp est
en quelque sorte la vitrine de mon travail, car il reprend tout ce qui a été réalisé pour
le présenter sous une interface claire et soigné.
Pour réaliser le site il m’a fallu apprendre le HTML, le CSS, le PHP objet. J’ai aussi dû
apprendre à utiliser Gimp pour réaliser le logo du site. Il m’a fallu installer un serveur
sur la machine Linux que j’utilisais pour pouvoir tester le site.
Le Perl m’a permis de concevoir le module d’extraction et le module de résumé, où
j'ai beaucoup utilisé les expressions régulières et les tables de hachage.
24
8. Bibliographie
M. Amini, Apprentissage automatique et recherche de l’information : application à
l’extraction d’information de surface et au résumé de texte, thèse de doctorat de
l’université Paris 6, juillet 2001, 209p.
Randal L. Schwartz, Brian d.Foy, Tom Phoenix, Introduction à Perl, 4e edition, O’Relly,
fevrier 2006, 286p.
M. Nebra, Apprenez à créer votre site web avec HTML5 et CSS3, Le site du zéro, mis à
jour d’avril 2013.
http://www.siteduzero.com/informatique/tutoriels/apprenez-a-creer-votre-site-webavec-HTML5-et-CSS3
M. Nebra, Concevez votre site web avec PHP et MySQL, Le site du zéro, mis à jour de
mai 2013.
http://www.siteduzero.com/informatique/tutoriels/concevez-votre-site-web-avecphp-et-mysql
Beaucoup de forums sur l’utilisation de linux et le codage en Perl, plus
particulierement :
http://forum.ubuntu-fr.org
http://forum.hardware.fr
25