<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"             "http://www.w3.org/TR/REC-html40/loose.dtd"> <HTML> <HEAD><TITLE>Stage de programmation Trouver des synonymes </TITLE> <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <META name="GENERATOR" content="hevea 1.05"> <link rel="stylesheet" href="http://www.douetteau.com/main.css" type="text/css">   </HEAD> <BODY > <!--HEVEA command line is: hevea StageMaitrise2.tex --> <!--HTMLHEAD--> <!--ENDHTML--> <!--CUT DEF section 1 -->   <H1 ALIGN=center>Stage de programmation<BR>Trouver des synonymes </H1>  <H3 ALIGN=center>Florian Douetteau<BR>Florian.Douetteau@ens.fr</H3>  <H3 ALIGN=center>septembre 2000</H3><!--TOC section Choisir un sujet-->  <H2>Choisir un sujet</H2><!--SEC END --> J'ai effectu mon stage de matrise au sein du Centre de Mathmatiques Appliques de l'Ecole des Mines (Paris). Franois Bourdoncle et son quipe y dveloppent un moteur de recherche. J'y ai travaill  la ralisation d'un dictionnaire de synonymes. <BR> <BR> <!--TOC section Comprendre le sujet. Se documenter-->  <H2>Comprendre le sujet. Se documenter</H2><!--SEC END --> <!--TOC subsection Qu'est-ce qu'un synonyme ? -->  <H3>Qu'est-ce qu'un synonyme ? </H3><!--SEC END -->  Le but de mon stage tait de gnrer un fichier des synonymes,  partir des quelques millions de document venant du Web stocks en local. Il ne s'agissait  <B>pas</B> pour autant de gnrer informatiquement  <B>un quivalent des dictionnaires des synonymes papier</B>. Un telle projet n'aurait t ni ralisable ni utile.  En effet, dans le cadre des moteurs de recherche,  les dictionnaires de synonymes sont utiliss principalement pour  <B>tendre les requtes venant des utilisateurs</B>, et non pas pour amliorer son style ou pour se cultiver. Dans la suite, on devrait donc entendre par dictionnaire de synonyme : ``quelque chose qui tend efficacement les requtes dans le moteur de recherche dvelopp au CMA''. Ceci dfinit une notion originale de synonymie, qui a forcment quelque chose  voir la notion courante de synonymie, mais qui dpend en tout cas fortement du corpus et du fonctionnement du moteur. <BR> <BR> Mme si j'ai pris assez vite conscience du distinguo qui pouvait exister entre ma notion intuitive de synonymie et la notion de synonymie sur laquelle je devais travailler, je ne me suis pas rendu compte de mon manque d'ides thoriques et a fortiori pratiques pour <B>mesurer la qualit des dictionnaires de synonymes</B>. C'tait l une (grave?) erreur, dont je ne saisirais les consquences qu'au dbut de ma phase intense de tests (dcrite dans <B>Avancer dans l'implmentation</B>, plus bas) <BR> <BR>  <BR><BR><BR><B>Leon que j'en ai tir</B> : Il est facile de croire  tort qu'on a bien cern son sujet et dfini son projet  <BR><BR>Je n'avais jamais fait de linguistique computationnelle auparavant, d'o d'importants besoins de documentation.  Pour me documenter sur le sujet j'avais recours  trois sources principales : un trs bon livre <I>handbook</I> de linguistique computationnelle - Foundations of statistical natural language processing Christopher D. Manning et Hinrinch Schtze, MIT press -, la recherche d'articles sur Internet, et bien-sr le savoir-faire des autres membres du laboratoire.<BR> <BR> L'ide suivante, finlement assez simple, se dgageait des diffrents articles :  deux mots sont synonymes s'ils apparaissent en compagnie des mme mots dans le corpus.<BR> <BR> Pour mesurer ceci, on calcule les <B>probabilits de cooccurences</B> pour toutes les paires de mots du corpus. Ces probabilits s'obtiennet en comptant le nombre de fois o deux mots apparaissent ``simultanment'', puis en divisant ce nombre par les nombres totaux d'apparitions de ces deux mots dans le corpus.  Le tableau des probabilits de cooccurences d'un mot avec les autres mots du corpus constitue son ``contexte global''. C'est une sorte de signature smantique du mot. On compare finalement ces contextes globaux, et on extrait ceux qui sont proches : on a alors dcouvert deux synonymes. <BR> <BR> Pour fixer les ides, voici une description de l'algorithme   la base du travail report par ce document :  <BR><BR><OL type=1> <LI>  Avoir un dictionnaire, permettant d'identifier un mot  un nombre le reprsentant.   <LI> Crer la matrice COOCCURENCE de taille n*n o n est le nombre de mots du corpus, et le tableau POIDS de taille n.  <LI> Pour chaque occurence d'un mot <I>a</I> dans le corpus (parser) <UL> <LI>  Considrer le contexte (<I>b</I><SUB><FONT SIZE=2>1</FONT></SUB>, ... <I>b</I><SUB><FONT SIZE=2><I>k</I></FONT></SUB>) de cette occurence du mot ( k peut-tre fixe ou correpondre  la taille de la phrase, paragraphe ou document o apparait cette occurence du mot)   <LI> Ajouter <I>k</I>  <I>POIDS</I>[<I>a</I>]  <B>TODO </B> <LI> Ajouter 1  <I>COOCCURENCE</I>[<I>a</I>,<I>b</I><SUB><FONT SIZE=2><I>i</I></FONT></SUB>] pour <I>i</I> = 1 ... <I>k</I>  </UL>  <LI> Obtenir une matrice de <B>probabilit</B> de cooccurence :   i.e faire pour tout i, j :   <DIV ALIGN=center><I>COOCCURENCE</I>[<I>i</I>,<I>j</I>] = <I>COOCCURENCE</I>[<I>i</I>,<I>j</I>] / (<I>POIDS</I>[<I>i</I>] * <I>POIDS</I>[<I>j</I>]) </DIV>  <LI> Normaliser la matrice suivant la norme carre   <LI> Faire tous les produits scalaires des lignes, et les afficher par ordre dcroissant </OL> <BR><BR><BR> <BR> Les articles disponibles sur le Web contenaient beaucoup d'ides intressantes sur les synonymes, mais ils ne concernaient malheureusement que des corpus restreints et spcialiss (recherche dans des bases de donnes scientifiques) ou s'intgraient dans des systmes d'interface utilisateurs particuliers. <BR> <BR>  <BR><BR><BR><B>Leon que j'en ai tir</B> : Ne pas oublier de rflchir  quelle partie de son travail peut s'inspirer des travaux existants et quelle partie doit tre invente <BR><BR>J'ai donc dcid d'implmenter l'algorithme simple de comparaison des lignes d'une matrice de cooccurence  et cela d'une manire suffisement modulaire pour permettre facilement de tester toute sorte d'amliorations. Je voulais pouvoir facilement :  <UL> <LI>  changer facilement le genre de donnes contenues dans les lignes de la matrice  <LI> changer la structure de donnes utilise par la matrice.  <LI> construire et insrer des filtres  tous les stades du calcul. </UL> <!--TOC section Envisager l'implmentation-->  <H2>Envisager l'implmentation</H2><!--SEC END --> Pour l'implmentation, j'avais la chance de pouvoir compter sur les bibliothques dj dvelopps dans le cadre du moteur de recherche. En particulier, un stagiaire du laboratoire - Franois Lagunas - tait (et est) en  train de dvelopper une bibliothque spcialise dans le traitement statistique, la <B>statlib </B>.<BR> <BR> Une de mes premires tches a donc t de ``rentrer'' dans une librairie sans cesse modifie, par encore termine, et par consquent pas trs bien documente, le tout crit entirement <B>en C</B>, language que je devais moi aussi utiliser pour crire mes programmes. <BR> <BR> La <B>statlib </B>tait dfinissait des systmes de ``boites et tuyaux'' gnriques, permettant de manipuler des donnes statistiques et capables de s'emboiter les uns dans les autres. <BR> <BR> Aprs quelques temps pass dans des essais divers, j'ai conclu (un peu trop rapidement peut-tre) que la <B>statlib </B>n'tait, d'une part pas suffisemment stable et finalise pour que je l'utilise efficacement, et d'autre part pas totalement adapte  mes besoins : la structure de donnes principale que j'avais  utiliser tait une <B>matrice</B> de probabilit de cooccurence, structure qui  <B>ne s'adaptait pas</B> trs bien finalement avec la <B>statlib </B>dans l'tat de dveloppement dans laquelle elle se trouvait. (La <B>statlib </B>ne permettait pas par exemple  l'poque de grer des ensembles d'ensembles) <BR> <BR> Enfin, l'interface de haut niveau qu'offrait la libraire de Franois pour les entres-sorties m'avait fait oublier de m'intresser  certains aspects de leur structure bas niveau, ce qui a t la source de confusions couteuses en temps au dbut de mon stage. <BR> <BR> J'ai donc dcid de dvelopper par moi-mme une petite librairie de manipulation de donnes, en m'inspirant bien-sr d'une partie du travail qu'tait en train d'accomplir Franois.  Cette librairie devait implmenter des structures de donnes au polymorphisme restreint (je voulais surout pouvoir changer le type des structures de donnes (liste, tableau ...) , et le type des donnes statistiques contenus (chaine de caractres, identificateurs entiers ...) ). <BR> <BR> La premire ide qui m'est venue pour assurer ce <B>polymorphisme en C</B> a t de crer un language <B>``C modulaire''</B> incorporant un systme de modules `` la ML'' et d'crire un prprocesseur de ce language vers le C. J'ai rnonc (un peu vite encore peut-tre)  cette ide qui me semblait trop complexe et pas assez portable.  La seconde ide tait d'implmenter ce polymorphisme en C directement, en utilisant un style de programmation proche de la <B>programmation objet</B>.  Cette solution avait l'avantage de rester plus proche de la <B>statlib </B>. <BR> <BR> Pour fixer les ides, voil un extrait du code qui explicite de manire satisfaisante la structure de ma petite bibliothque : <BR> <BR>  <PRE><FONT SIZE=1> /*  Key est le type de donnes des cls identifiant les ``Element'' :  soit une paire d'entiers,  soit un pointeur vers, par exemple, un chane de caractres.  Notez que sur Alpha les ``int'' font 32 bits de longs,  et les pointeurs sont sur 64 bits.  */ union Key {    pairOfInt pair ;    void* ptr ;  } /*  Element est la structure utilis pour stocker  toutes les formes de paires cl - donne statistique  (par exemple cle = paire de mots, donne statistique = pointeur  vers un tableau de flottants )  */ struct  Element {  Key key; /* cl : un nombre, un pointeur vers un chane */  void* data ; /* donnes statistique associes    (tableau de flottants ...) */ } ... /* Type stocke le ``type'' d'un Element,   savoir les fonctions copy, print, compare, etc ...  qu'il faut utiliser pour le genre de cl et  de donnes statistiques utiliss par cet lment.   */ struct Type {         Element* copy(Element) ;         void print(Element) ;          int compare(Element, Element) ;          ... }  Type NewNumberType(int size) ;  /* type des lments indexs par un nombre,  avec size flottants associs */ ... /* Container est l'interface commune   toutes les structures contenant des lments.  La prsente d'un champs Type permet d'assurer  le polymorphisme de ces container  (les containers sont polymorphes,  mais contiennet des lments de type uniforme) */ struct Container {          Type type /* type des lments contenus dans le Container */       Element get(Container this, Element findthisKey) ;      /* obtenir un lment de mme cl                                           dans le container ... */          void put(Container this, Element tobeput) ;     /* ajouter cet lment dans le container */          Element getLast(Container this)  ;     /* obtenir le dernier lment ajout */          void iterator(Container this, void f(Element, void*) ) ;                     /* appliquer f  tous les lments du container */ ...           void* data ; /* reprsentation interne */          }  Container NewStandardContainer() ;  Container NewArrayContainer() ;  Container NewListContainer() ;  ...          struct Event {  void EventHandler(Event, void* data);   /* fonction appele pour transmettre l'venement */ Array(EventListener) receptors ;   /* ceux qui recoivent l'evenements */          } struct EventListener { void* father ;  void listen(void* father, void* data)  } struc Pipe {          Container container ;   /* ``file d'attente'' du tuyau */         EventListener incoming ;   /* que faire  l'arrive d'un nouvel lment */          Event outcoming ;   /* vnement appel au dpart d'un lment */         bool filter(Element) ;   /* filtrage des lments rentrants */         void modifier(Element*) ;    /* opration  effectuer sur tous les lments rentrants */                  ... } Pipe NewStandardPipe() ;  Pipe NewWebPipe() ;  ... </FONT></PRE>J'ai ainsi implment des ArrayContainer, ListContainer, BufferContainer, WebDocumentPipe, PrintPipe, etc ... et ai utilis ces briques fondamentales et extensibles pour mon implmentation.<BR> <BR>  <BR><BR><BR><B>Leon que j'en ai tir</B> : Ne jamais hsiter  se demander si les outils qu'on vous proprose sont vritablement adapts  vos besoins. Si on vous offre une couche de haut niveau, se demander en quoi consiste la couche de bas niveau correspondante. <BR><BR><!--TOC section Avancer dans l'implmentation. Faire des tests-->  <H2>Avancer dans l'implmentation. Faire des tests</H2><!--SEC END --> En m'appuyant sur ma bibliothque, j'ai dvelopp un programme gnral crant une matrice de probabilit de coocurrence  partir des documents du Web, comparant ses lignes et affichant les rsultats .<BR> <BR> La premire version de mon programme tait la plus simple possible : elle considrait tous les mots des documents et considrait comme cooccurent deux mots apparaissant dans le mme document. <BR> <BR> Les rsultats obtenus par ce premier programme tait des plus mauvais.  La suite de mon travail a consist  identifier et  tester des paramtres permettant d'obtenir de meilleurs rsultats. <BR> <BR> J'ai travaill sur les aspects suivants, que j'ai pu tester et implmenter rapidement grce  la modularit de mon implmentation : <BR> <BR> <DL COMPACT=compact> <DT><DD><B>Quelle notion de coocurence ?</B>  <UL> <LI>   La premire question qui se pose est celle de la taille des contextes. Quel est le contexte d'une occurence d'une mot ? Le document dans laquelle elle apparait ? La phrase ? Juste les mots prcdents et suivants ?   <LI> On pourrait vouloir tenir compte de la <B>distance entre les mots </B> dans l'valuation de la cooccurence. Si oui comment ?   <LI> Plutt que de stocker des ensembles de mots comme contexte, une heuristique envisageable pouvait tre de stocker des ensembles de <B>paires de mots</B> : par exemple, enregistrer pour chaque occurence d'un mot la paire mot precdent-mot suivant comme informations de contexte. </UL>   <DT><DD><B>Quels mots ?</B> <UL> <LI>  Franois Lagunas avait implment, grce  la <B>statlib </B>, un systme efficace de lemmatisation.  Cet outil pourrait-il m'tre utile  la recherche de synonymes ?  <LI> Comment tenir compte des mots de liaisons (conjonction de coordination ...) dans l'valuation des contextes ?  </UL>  <DT><DD><B>Quelle source ?</B>  Outre les documents du Web disponibles en local, je pouvais envisager de lancer mon programme de recherche de synonymes sur d'autre sources ou heuristiques fournies par le laboratoire, par exemple :  <UL> <LI>  Utilier un listing d'expressions courantes extrait du Web.  <LI> Ne s'intresser qu'aux <B>occurences</B> de mots n'<B>apparaissant</B> que <B>deux fois</B> dans le document en cours.  </UL>  <DT><DD><B>Quelle structure de donnes ? </B>  La matrice de cooccurence devait possder des caractristiques peu communes,  priori : 3 . 10<SUP><FONT SIZE=2>5</FONT></SUP> lignes et colonnes potentielles, permettre des insertions sufisemment rapides pour pouvoir traiter plusieurs millions de documents ( donc plusieurs milliards d'insertions ) en un temps raisonnable, permettre de calculer les produits scalaires de toutes ces lignes toujours en un temps raisonnable. Quelle structure choisir ?  </DL>Pour rpondre  ces questions, il m'a fallu faire un grand nombre de ``tests'' de diffrentes versions de mon programme (5  10 tests par jour).<BR> <BR> <!--TOC subsection Comment organiser les tests ?-->  <H3>Comment organiser les tests ?</H3><!--SEC END --> Ma dmarche habituelle tait de lancer des tests sur un  <B>petit corpus</B> (quelques milliers documents) pour vrifier si un <B>bug</B> ne s'tait pas introduit et si la vitesse du programme tait satisfaisante, sur un corpus un <B>peu plus grand</B> (quelques centaine de milliers de documents) pour avoir une premire ide du rsultat et ajuster les paramtres numriques du programme, et enfin sur un <B>gros corpus</B> (quelques millions de documents) pour conclure.<BR> <BR> <!--TOC subsection Comment mesurer la qualit de mes rsultats ?-->  <H3>Comment mesurer la qualit de mes rsultats ?</H3><!--SEC END --> Comme je l'ai dit tantt, je n'avais pas  priori de notion de ce qu'tait un bon dictionnaire de synonymes.  La partie ``valuation'' de mes tests, partie essentielle pour la bonne marche de mon projet,  tait donc laise quelque part  ma seule <B>intuition</B>. <BR> <BR>  <BR><BR><BR><B>Leon que j'en ai tir</B> : Si des tests qualitatifs doivent tre faits, ne pas oublier d'adopter une mthode standard d'valuation <BR><BR><!--TOC section Rpondre aux questions. Se remettre en question-->  <H2>Rpondre aux questions. Se remettre en question</H2><!--SEC END --> <!--TOC subsection Quelle genre de rsultats ai-je obtenu ?-->  <H3>Quelle genre de rsultats ai-je obtenu ?</H3><!--SEC END -->  <DL COMPACT=compact> <DT><DD><B>Des groupes caractristique de synonymes</B> Ce qui ressort en premier lieu ce sont des groupes smantiques : les nombres, les tailles des fichiers (8k, 4k ...), les noms de villes, les noms de nationalit se retrouvent ``synonymes''  <DT><DD><B>Des groupes issus du spamming </B> A cause du spamming se retrouvent synonymes les mots que les sites ``X'' utilisent comme accroche pour les moteurs du recherche : mpeg, pamela, pix, ... etc   <DT><DD><B>De bonnes synonymies, parfois</B> par exemple  <PRE> usuall1 0.400950 typical1 support1        0.095102 care1                 0.045518 assistance .... technolog1      0.026938 research1 ... section1        0.159296 chapter1         0.002159 volume1 ... performance1    0.029282 productivity microsoft1      0.012368 ms                 0.001989 macintosh1  </PRE> <DT><DD><B>des antonymes</B> par exemple <PRE> small1  0.090594 larg1 </PRE> <DT><DD><B>Des mots de la meme famille ...</B> par exemple : <PRE>  going1  0.069821 goes1         0.030827 happen1         0.021006 went1 ... take1   0.      198949 taking1 level1  0.076289 volume1 </PRE> <DT><DD><B>Des mots vaguement relis smantiquement</B> <PRE> know1   0.192646 want1 change1 0.043156 consideration1 library1        0.014324 universiti1 format1 0.000011 viewer1 president1      0.003324 senator1 technical1      0.093809 financial </PRE> <DT><DD><B>(beaucoup trop) de mauvais synonymes, pas vraiment explicables</B>  <PRE> figure1 0.005164 level1         0.004830 price1         0.003608 updat1 find1   0.069392 devot1 feedback1       0.005071 links1 </PRE></DL><!--TOC subsection Quelle rponses puis-je donner aux questions poss ?-->  <H3>Quelle rponses puis-je donner aux questions poss ?</H3><!--SEC END --> <DL COMPACT=compact> <DT><DD><B>A propos de la taille des contextes</B> Des articles concernant la recherche dans des bases de donnes spcialiss se proposaient de considrer comme cooccurents deux mots contenus dans un mme document. Mais pour un corpus aussi touffu que le Web mieux vaut, et de loin, se limiter  des <B>petits contextes</B> (maximum 4 mots)   <DT><DD><B>A propos de la prise en compte de la distance entre les mots</B> amliore les rsultats mais pas de manire extraordinaire.  <DT><DD><B>A propos de l'heuristique ``Paires mot prcdent mot suivant''</B> Cette heuristique donne de bons rsultats sur les fichiers de phrases mais pas sur les fichiers du Web ; considrer des paires augmente en effet la taille des contextes ce qui se rvle fatal sur un corpus comme le Web o on peut trouv un mot en compagnie de beaucoup de mots diffrents (par rapport  un fichier d'expressions courantes)   <DT><DD><B>A propos des structures de donnes</B> J'ai voulu au dpart coder ma matrice comme une table de hashage contenant des pointeurs vers des tables de hashage... ensuite pour conomiser de la mmoire, j'ai voulue faire des tables de hashage intelligentes qui grossisaient et se filtraient automatiquement (en fonction de l'importance statistique des donnes contenues). De telles solutions se sont rvles beaucoup trop lentes et compliques  mettre en place. A la fin, ma matrice n'tait plus qu'un tableau de listes, et mon conomisation de la mmoire consistait simplement  ne plus insrer de nouveaux mots dans ces listes une fois qu'elle tait pleines ! Cela a donc t une leon de <B>simplicit</B>   <DT><DD><B>A propos de la lemmatisation</B> Travailler sur les lemmes plutts que sur les mots m'a sembl avantageux  la fois du point de vue des rsultats et du point de vue de la simplicit de la mise en oeuvre : la rduction de la taille du dictionnaire opre par la lemmatisation permet en effet de se passer de table de hashage pour coder ma matrice de cooccurence. Autre point intressant, en slectionnant parmi les synonymes obtenus ceux qui avait des prfixes communs, j'ai obtenu des listes de candidats  une lemmatisation trop faible. La synonymie pourrait permettre d'<B>amliorer les rsultats de la lemmatisation</B> par compression implmente par Franois Lagunas.  <DT><DD><B>A propos du filtrage des mots</B> Le ``spamming'' pollue beaucoup la recherche de synonymes et m'a fait perdre beaucoup de temps. Le seul moyen que j'ai trouv pour le rsoudre est d'liminer btelement les documents contenant certains mots ou associations de mots.   <DT><DD><B>A propos du choix de la source</B> Il m'a sembl <B>trs peu souhaitable</B> d'utiliser le Web directement comme corpus pour le choix des synonymes ; les web contient des documents de type trs diffrents, o les mots apparaissent avec de nombreux sens. Beaucoup de documents ne contiennent pas vritablement de sens, et il est par la meme difficile d'en extraire ... Partir d'un <B>fichier d'expressions courantes</B> ou utiliser l'heuristique <B>``deux occurences dans le document''</B> a men rapidement  de bien meilleurs rsultats.   <DT><DD><B>A propos du filtrage des rsultats</B> Une heuristique intressante consiste  <B>ne pas considrer comme synonymes des mots qui apparaissent dans le contexte global l'un de l'autre.</B> Cette heuristique permet notemment d'viter la pollution due aux collocations (paires de mots apparaissant suivant l'un aprs l'autre), qui fournissent des mots aux contextes proches, mais plus parce qu'ils apparaissent frquemment ensemble qu'autre chose. </DL><!--TOC subsection En quoi mon travail a-t-il t utile ?-->  <H3>En quoi mon travail a-t-il t utile ?</H3><!--SEC END --> L'quipe de Franois Bourdoncle n'a pas encore repris mon travail sur les synonymes. Ils m'assurent cependant que les diffrentes exprimentations que j'ai pu faire leur fournisse une exprience trs utile.  Parmi les applications :  <UL> <LI>  L'extension des requtes  <LI> L'amlioration de la lemmatisation  <LI> L'identification de groupes de mots (noms de villes, etc ... )  </UL><!--TOC subsection En quoi ce stage m'a-t-il t utile ?-->  <H3>En quoi ce stage m'a-t-il t utile ?</H3><!--SEC END --> La linguistique algorithmique m'a sembl tre une discipline difficile  aborder, en tant  qu'il faut pas mal d'exprience pour trouver les bonnes heuristiques et pour discrimer ce qui est calculable de ce qui ne l'est pas. <B>Je n'ai donc pas acquis beaucoup de comptences sur le plan thorique</B> mais c'est peut-tre un poncif du genre ``stage court de programmation''. Par contre, sur le plan des <B>comptences de programmation et organisationnelles</B> ce stage m'a sembl trs profitable.  <UL> <LI>  J'ai cris  l'occasion de ce stage mon plus gros projet tournant en C (10.000 lignes), ce qui m'a permis d'amliorer mon expertise de ce langage.   <LI> Les problmes de programmation auquels j'ai t confront m'ont donn des ides sur la conception de langage de programmation.  <LI> La quantit de donnes  traiter m'a oblig  optimiser mes programmes et  mettre en pratiques certaines de mes connaissances en algorithmique.   <LI> Le contact avec les autres projets en cours de ralisation dans le laboratoire a t pour moi l'occasion de s'intresser aux technologies du Web. ( XML, WAP, XSL, JAVA)  <LI> L'criture a posteriori d'un rapport de stage m'a permis de certains manques de rflexion dans l'organisation de mon travail.  <LI> Se mettre  un projet non personnel m'a oblig  plus documenter mon code et  laisser plus de traces de mon travail.  </UL> <BR><BR><BR><B>Leon que j'en ai tir</B> : Avant de passer une journe  dbuger, faire sortir plus de traces  ses programmes <BR><BR> <BR><BR><BR><B>Leon que j'en ai tir</B> : Noter ce qu'on fait au cours du stage pour crire son rapport. Demander avant le dbut du stage en quoi ce rapport doit consister ...  <BR><BR><!--HTMLFOOT--> <!--ENDHTML-->  <!--FOOTER--> <HR SIZE=2> <BLOCKQUOTE><EM>This document was translated from L<sup>A</sup>T<sub>E</sub>X by </EM><A HREF="http://pauillac.inria.fr/~maranget/hevea/index.html"><EM>H</EM><EM><FONT SIZE=2><sup>E</sup></FONT></EM><EM>V</EM><EM><FONT SIZE=2><sup>E</sup></FONT></EM><EM>A</EM></A><EM>. </EM></BLOCKQUOTE></BODY> </HTML>  
