INFO-F-101 Programmation Projet 4 Page Ranking(1/4): Création de la matrice du compte des liens Année académique 2009 2010 1 Introduction Ce projet est le premier d une série de quatre projets qui ont pour but de vous faire développer un système de page ranking. Le page ranking est un algorithme utilisé par les moteurs de recherche sur Internet (comme google), dans le but de classer les pages web selon leur degré d intérêt pour un certain critère de recherche. Pour ce faire, le page ranking analyse les liens hypertextes qui existent entre les pages web à classer. Supposons que toutes pages web qui constituent le site web à traiter sont numérotées par un nombre naturel. Le classement est effectué sur base d une matrice M qui compte le nombre de liens existant entre toute paire de pages i et j. Donc, s il y a, sur la page i, trois liens qui, une fois cliqués, redirigent vers la page j, on aura M[i][ j] = 3. Cette information sera utilisée pour réaliser le classement : ce sont grosso modo 1 les pages vers lesquelles le plus de pages pointent qui seront jugées comme «les plus intéressantes», car ce sont celles que les autres sites référencent le plus. Comme l implémentation d un algorithme de page ranking complet est un gros travail, nous avons reparti les différentes étapes de cet algorithme sur plusieurs projets. Pour ce projet, nous vous demandons d écrire un programme qui reçoit une liste de fichiers contenant des pages web et crée une matrice M qui compte le nombre de liens existant entre toute paire de pages i et j. Pour cela, vous devrez ouvrir chaque page web, écrite en HTML, et la parcourir pour compter le nombre de références, dans cette page i, vers chacune des pages j. Ce compte se retrouvera en coordonnée (i, j) de la matrice M. Les étapes suivantes de l algorithme de page ranking feront l objet de projets ultérieurs (du cours de Programmation mais aussi du cours d Algorithmique). 2 La structure du fichier contenant la liste des pages à analyser Votre programme devra ouvrir un fichier appelé listepages.txt. Ce fichier est un fichier texte. Chacune de ses lignes donne le nom d un fichier qui contient une page web à analyser. Votre programme devra analyser toutes les pages web fournies dans listepages.txt. Voici un exemple de fichier : chemin_fichier_1.html chemin_fichier_2.html 1 Ceci sera précisé plus tard. 1
chemin_fichier_3.html chemin_dernier_fichier.html Pour lire un fichier ligne par ligne, vous pouvez faire appel à la méthode getline(). Celle-ci peut s appliquer à un objet de type ifstream, et reçoit deux arguments : un tableau T et un entier i. Elle lit, sur le fichier qui correspond au ifstream, la prochaine ligne, et la stocke dans le tableau T. Si cette ligne contient plus de i caractères, seuls les i-1 premiers caractères sont lus. Cette méthode permet d éviter de devoir lire les lignes caractère par caractère (comme dans le projet précédent). Voici un exemple, ou MAX_SIZE_URL est une constante suffisamment grande : ifstream file; char path[max_size_url]; file.open("listepages.txt"); file.getline(path,max_size_url); // exemple d'appel à la fonction getline() 3 Les tables et matrices utilisées pour le projet Dans ce projet vous aurez deux tables à gérer. La première table est stockée dans la matrice char L[MAX_NB_LINK][MAX_SIZE_URL]. Chaque ligne de cette table est donc une chaîne de caractères, et contient le nom d un lien HTML. Vous devrez stocker dans L tous les liens rencontrés lors de votre analyse : que ce soit dans le fichier listepages.txt ou lors de l analyse des pages HTML elles-mêmes. Cette table permettra d attribuer un numéro à chaque page. Par exemple, si la chaîne http://www.ulb.ac.be est stockée dans le i e ligne de la table, alors i sera l identifiant unique du site http://www.ulb.ac.be. Il faut donc s arranger pour qu un même lien n apparaisse pas deux fois dans la table. Cette table devra être construite au fur et à mesure de la rencontre des différents liens. Si vous ouvrez une nouvelle page pour l analyser vérifiez si cette dernière est dans la table. Si elle y est, récupérez son indice dans la table qui fait office d index dans la matrice, sinon ajoutez la en fin de table et récupérez l indice à l insertion. Identiquement, si vous rencontrez un lien dans un fichier, récupérez son indice dans la table si le lien a déjà été inséré dans celle-ci, sinon ajoutez la. La seconde table correspondra à la matrice M décrite dans l introduction. Cette matrice sera de taille n n où n est le nombre de pages rencontrées lors de l analyse. Chaque case de M[i][ j] devra contenir le nombre de liens de la page numéro i vers la page numéro j. Les indices i et j sont obtenus à l aide de la matrice L. Ainsi, si la page A.html contient 4 liens vers B.html, que les chaînes «A.html» et «B.html» apparaissent respectivement aux lignes 9 et 3 de L, on aura M[9][3] = 4. Vous retrouverez en FIG. 1 un exemple de chacune des deux tables. Veillez à bien définir vos constantes MAX_NB_LINK et MAX_SIZE_URL de manière à ce que les tables L et M soient suffisament grandes pour accueillir toute l information demandée. Par ailleurs, la matrice M devra être déclarée double, et ce, même si elle ne doit contenir que des entiers. Ceci sera nécessaire pour réaliser les projets suivants. 4 Le langage HTML et la recherche de liens dans les pages Les pages que vous allez parcourir sont écrites en HTML. Le langage HTML permet de décrire la structure de pages sur internet. Pour cela elle utilise des balises. Une balise est décrite par un crochet 2
0 1 2./chemin_fichier_1.html./chemin_fichier_2.html http://www.w3c.org 0 M = 0 1 2 1 0 2 1 1 0 fichier 1.html fichier 2.html w3c.org FIG. 1 Exemple montrant la table des liens à gauche et la matrice correspondante à droite ouvrant (<) et un crochet fermant (>) ainsi que le nom de la balise (qui correspond généralement à sa fonction dans la structure). Par exemple la balise <p> permet de dire que ce qui va suivre correspond à un paragraphe. Toutefois pour certaines balises dites ouvrantes, il leur faut une balise fermante. Elles permettent ainsi de délimiter l action de la balise ouvrante correspondante (Par exemple </p> définit la fin du paragraphe commencé par <p>). Une balise peut définir des attributs. Par exemple une image peut avoir un attribut alt pour un texte alternatif qui permet d afficher, à la place de l image, le texte de l attribut dans le cas d une navigation à travers un navigateur texte, par exemple. Ces attributs, entourés de doubles guillemets, se trouvent après le texte nommant la balise et avant le crochet fermant. Si nous reprenons l exemple cité, cela nous donne <img alt="texte alternatif" />. La balise qui nous intéresse dans ce projet, c est la balise qui définit les liens entre deux pages HTML. Cette balise est la balise <a href="lien">contexte Cliquable</a>. Dans la plupart des cas, le contexte cliquable apparaît comme un texte souligné cliquable qui permet d accéder à la page HTML dont le nom est donné entre les guillemets, après href= 2. Voici deux exemples de tels liens 3 <a href="http://adresse_page_web" > lien visible </a> <a href="chemin_du_fichier" > lien visible </a> Enfin, remarquez qu il existe également une variante des liens <a href=""> dans laquelle le nom du lien est suivi par une chaîne commençant par #, comme dans l exemple ci-dessous : <a href="chemin_du_fichier#ancre" > lien visible </a> Dans ce cas, le # et tout ce qui suit jusqu au guillemet fermant doit être ignoré. Remarque importante Nous avons décrit les balises en utilisant des lettres minuscules, car c est la manière la plus standard d écrire du HTML. Néanmoins, il se pourrait que les balises soient écrites 2 Remarquez qu il existe aussi de balises <a name=>, mais nous ne les exploiterons pas ici. 3 Dans le premier cas, l adresse commence par http, c est donc une adresse sur le web. Dans le second cas, il n y a pas de http et il s agit donc d un nom de fichier. Votre programme doit se comporter de la même manière dans les deux cas. 3
en majuscules : <A HREF=""> par exemple. Votre programme doit être capable de gérer les deux cas! Il peut donc être utile d écrire une fonction qui convertit une chaîne de caractère en majuscules ou en minuscules... 5 La comparaison entre deux chaînes de caractères Avant de mettre à jour la matrice de comptage, il faut d abord vérifier si le lien trouvé existe déjà dans la table des liens. S il existe dans cette table, alors il suffit de récupérer son index, et de l utiliser en conjonction avec l index du fichier courant lu pour incrémenter le nombre de liens dans la matrice. Sinon, il faut introduire ce lien en bout de table et renvoyer l index de son insertion, et puis à nouveau mettre à jour la matrice comme il faut. Pour effectuer ces comparaisons, vous pouvez utiliser int strcmp(const char* s1, const char* s2), une fonction définie dans la bibliothèque <cstring>. Si la valeur renvoyée est égale à 0, alors les chaînes sont identiques. Dans ce projet vous l utiliserez comme suit : #include <cstring> using namespace std ; double M[MAX_NB_LINK][MAX_NB_LINK]; char L[MAX_NB_LINK][MAX_SIZE_URL]; int resultat; resultat = strcmp(l[i],lien); if (resultat == 0) {} // les chaines sont identiques 6 Le Projet Nous vous demandons dans ce projet de construire les deux tables décrites plus haut au travers de la fonction : cptliens(char L[MAX_NB_LINK][MAX_SIZE_URL], double M[MAX_NB_LINK][MAX_NB_LINK]) qui ouvre le fichier listepages.txt et remplit les matrices L et M tel que décrit ci-dessus. Nous vous demandons également d écrire une fonction : affiche(char L[MAX_NB_LINK][MAX_SIZE_URL], double M[MAX_NB_LINK][MAX_NB_LINK]) Elle affichera de la manière la plus efficace et cohérente possible les deux tables créées et manipulées par la fonction précédente. Exemple fourni Un exemple de site web, accompagné d un fichier listepages.txt est disponible sur la page web des TPs, sous forme d une archive zip. Vous pouvez vous en servir pour tester votre solution. 4
6.1 Rapport Nous vous demandons de rédiger un bref rapport décrivant les choix faits pour votre implantation du système et une justification de ces choix. Pour vous aider à rédiger ce rapport, nous vous conseillons de lire le document intitulé Élément de rédaction scientifique en informatique, qui est disponible à l adresse http://tinyurl.com/yzzpafd. Dans l évaluation de votre rapport, nous tiendrons particulièrement compte du caractère rigoureux et scientifique de votre présentation. Le document mentionné ci-dessous vous aidera à éviter certains pièges, et à soigner votre style de présentation. Les sections à lire tout particulièrement dans ce document sont les sections 2, 4 et 5 (les autres sections vous seront utiles pour des travaux ultérieurs). Attention, bien que ce document conseille l usage du traitement de texte LATEX, nous ne vous l imposons pas, et vous restez donc libre d utiliser un logiciel comme Word ou OpenOce Writer. Consignes pour la remise du projet À respecter scrupuleusement! 1. Votre projet doit comporter votre nom et votre numéro de groupe. 2. Votre projet doit être dactylographié. Les projets écrits à la main ne seront pas corrigés (0/10). 3. Votre code doit être commenté. 4. Vous devez respecter les modalités de remise suivante : Date de remise : le 16 novembre 2009 Lieu : au Secrétariat «étudiants» du Département d Informatique, local 2N8.104 Heure : Avant 16h Le secrétariat ferme à 16h. Après 16h, les projets sont considérés comme en retard, et vous perdez 1 point sur votre note finale (un point supplémentaire par jour de retard). Les projets en retard doivent être déposés dans la caisse prévue à cet effet près du secrétariat. 5