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