rapport.tex (120455B)
1 \documentclass[a4paper,11pt,french]{article} 2 3 \widowpenalty=9999 4 \clubpenalty=9999 5 6 \def\android{Android\texttrademark{}} 7 8 \usepackage[frenchb,english]{babel} 9 \usepackage[T1]{fontenc} 10 \usepackage[utf8]{inputenc} 11 \usepackage{um2/um2} 12 \usepackage{verbatim} 13 \usepackage{graphicx} 14 \usepackage{alltt} 15 \usepackage{enumitem} 16 \usepackage{tikz} 17 \usetikzlibrary{shapes,positioning,snakes,calc} 18 19 20 \usepackage{tikz} 21 \usetikzlibrary{shapes,positioning,snakes,calc} 22 23 \setlength{\parindent}{0pt} 24 \setlength{\parskip}{2ex} 25 26 27 \title{Rapport de TER 28 \\Master 1 Informatique 29 \\---\\ 30 Reconception du jeu Pticlic sous \android{}} 31 \author{Yoann \textsc{Bonavero} \and Bertrand \textsc{Brun} \and John \textsc{Charron} \and Georges \textsc{Dupéron}} 32 33 \begin{document} 34 35 \maketitle 36 37 \pagenumbering{roman} 38 \pagestyle{empty} 39 \thispagestyle{empty} 40 41 \tableofcontents 42 43 44 \pagestyle{empty} 45 \thispagestyle{empty} 46 \newpage 47 \pagenumbering{arabic} 48 \setcounter{page}{1} 49 \pagestyle{plain} 50 51 \selectlanguage{frenchb} 52 \begin{abstract} 53 PtiClic est un jeu de mots où des utilisateurs jouent et des données lexicales et sémantiques sont récoltées automatiquement ou 54 semi-automatiquement. De telles approches pour peupler une base de données sont rapides, efficaces, peu coûteuses et présentent bien 55 d'autres avantages. Dans PtiClic, les joueurs associent des idées à des mots et marquent des points si leurs réponses correspondent aux 56 réponses d'autres utilisateurs. PtiClic est une application Web qui a été créée par Mathieu Lafourcade et Virginie Zampa. 57 58 L'objectif du présent projet est de créer un prototype pour téléphones sous Android. Cette nouvelle version permettrait à des utilisateurs 59 de jouer n'importe quand et n'importe où. Le sujet du projet a été élargi pour inclure une application qui pourrait fonctionner sur un 60 grand nombre de téléphones mobiles et non pas seulement ceux sous Android. Les avantages, les inconvénients, les problèmes et les 61 solutions associés à l'adaptation de ce jeu pour smartphone sont présentés dans ce document. 62 \end{abstract} 63 64 \selectlanguage{english} 65 \begin{abstract} 66 PtiClic is a fun game word game in which users play and lexical and semantic data is collected automatically or semi-automatically. Such 67 methods of populating a database are fast and inexpensive and have many other advantages. In PtiClic, players associate ideas with words 68 and score points if their answers correspond to that of other users. PtiClic is a Web-based game which was created by Mathieu Lafourcade 69 and Viginie Zampa. 70 71 The purpose of this project is to create a prototype for telephones using the Android operating system. The application would permit users 72 to play anywhere, anytime. The topic of the project was widened to include an application that can run on many different types of 73 smartphones, not only those using the Android operating system. The advantages, drawbacks, problems and solutions associated with adapting 74 the application for mobile phones are discussed throughout the document. 75 \end{abstract} 76 \selectlanguage{frenchb} 77 \pagebreak 78 79 \section{Introduction} 80 81 PtiClic\footnote{http://www.pticlic.org} est un jeu qui a été conçu et développé par Matthieu Lafourcade et Virginie Zampa. Le jeu a été créé afin de faire des études sur le vocabulaire et la sémantique sur des sujets de divers horizons dans un contexte ludique et motivant. Un mot central apparait, un nuage de mots entoure le mot central et le joueur clique et dépose des mots du nuage dans des catégories proposées sous forme d'énoncés. 82 83 Par exemple, pour le mot central «bicyclette», les mots «pédale», «piéton», «pied», «automobile», «Sébastien Chabal», «Lance Armstrong», «pédalier», «voiture», «yeux», «rapide», «routier», «maillot», «pédaler», «dopage», «véhicule», «musclé», «nez», etc. sont proposés. Le joueur dépose ces mots dans les catégories «\dots{} est une partie de 'cycliste'», «Un contraire de 'cycliste' est \dots{}», «'cycliste' a un rapport avec \dots{}», «Une caractéristique de 'cycliste' est \dots{}» ou aucune de ces catégorie. Un score est obtenu en soustrayant les mots manquants et les mots incorrects aux mots corrects. 84 85 Des linguistes et des informaticiens récupèrent les données liées aux parties jouées, ce qui leur permet de faire de la recherche dans leurs domaines respectifs. Le réseau lexical peut aussi être utilisé directement dans des applications pour le traitement automatique du langage. 86 87 Notre travail consiste à créer une version du PtiClic sous \android{}, une version du jeu adaptée pour téléphone mobile. Le sujet du TER définit clairement l'objectif de ce projet~: 88 89 \begin{quotation} 90 \noindent L'étude et le prototypage d'une version fonctionnant sur \android{} semble intéressante. En particulier on s'intéressera à deux aspects~: 91 \begin{itemize} 92 \item les contraintes imposées par l'environnement smartphone 93 \item le biais qu'imposent ces contraintes sur le jeu et les données récoltées. 94 \end{itemize} 95 96 \noindent Il s'agira donc de modéliser une version adaptée aux smartphones et d'en implémenter un prototype fonctionnel. 97 \end{quotation} 98 99 Dans un premier temps, une version de base a été conçue et réalisée. Ensuite, il a été prévu d'ajouter des fonctionnalités supplémentaires. La démarche adoptée par notre groupe a été une approche incrémentale et itérative. Initialement, quatre itérations et quatre livraisons devaient donner comme résultat une version de base et des versions plus élaborées~: un joueur pourrait, entre autres, modifier ses préférences ou choisir son niveau. L'idée était aussi de rendre le jeu plus attrayant afin d'accroître le nombre de sujets participant aux études liées au résultat des données extraites des parties jouées. 100 101 Nos objectifs initiaux ont changé, nous avons créé deux prototypes~: l'un sous Android en Java, l'autre en HTML5 élargissant notre public, leur donnant la possibilité de jouer au jeu sur divers types de smartphones. 102 103 104 \pagebreak 105 106 107 \section{Analyse de l'existant} 108 109 L'application du jeu PtiClic d'origine est une application disponible en ligne sur \url{http://www.lirmm.fr/pticlic/pticlic.php}. Lors de 110 la réalisation de ce projet, nous n'avions pas accès au code source de l'application ni à des diagrammes UML. La seule partie de cette 111 application qui nous a été fournie est une archive de la base de données dans un format textuel. 112 113 L'analyse de l'existant consistait donc d'une analyse du format et du contenu de cette archive ainsi que l'application sur Internet que nous avons testé et analysé. Il était également possible d'avoir d'autres informations concernant l'application Web PtiClic à travers de nombreux articles écrits sur ce sujet et en communiquant avec les créateurs du jeu. 114 115 \subsection{Le déroulement du jeu} 116 117 L'utilisateur clique sur le bouton «Je joue~!». Un mot\footnote{Nous parlerons de 'mots' dans cette discussion, mais un mot peu aussi être un mot composé, un syntagme ou une phrase.} se dirige vers le centre de la page, c'est le «mot central». D'autres mots viennent entourer le mot central, ce sont les «mots nuage». La police du mot central est plus grande que celle des mots nuages. Le mot central et les mots du nuage sont de couleurs contrastées. 118 119 \subsubsection{Le mise en page du jeu} 120 121 \begin{figure}[h!] 122 \centering 123 \includegraphics[width=14cm]{img/PtiClicJeu.png} 124 \caption{Version originale du jeu PtiClic de Mathieu Lafourcade et Virginie Zampa} 125 \end{figure} 126 127 Les relations apparaissent à droite des mots. Une partie peut comporter d'une à quatre relations. Un carré apparaît à droite de la relation suivi de la relation sous forme d'énoncé tel que «\emph{(mot central)} est en rapport avec\dots{}», «Quoi/Qui pourrait \emph{(mot central)}~?». S'il y a plus d'une relation, les relations apparaissent les unes en dessous les autres, toujours à droite des mots. 128 129 Encore plus à droite, un bref explicatif du principe du jeu, et tout en bas, le bouton «J'ai fini~!», 130 131 Le principe du jeu est simple. Lorsque l'utilisateur estime qu'un mot nuage est lié au mot central par une des relations, il glisse et dépose le mot nuage sur le carré de la relation. Si l'utilisateur pense qu'aucune des relations ne convient, il laisse le mot dans le nuage tout simplement. 132 133 \subsubsection{Le déroulement de la partie} 134 135 \begin{figure}[h!] 136 \centering 137 \includegraphics[width=14cm]{img/PtiClicJeu2.png} 138 \caption{Version originale du jeu PtiClic de Mathieu Lafourcade et Virginie Zampa -- Déroulement de la partie} 139 \end{figure} 140 141 142 Si le joueur se trompe, il peut double-cliquer sur le carré pour extraire le dernier mot déposé. En fait, le joueur peut double-cliquer 143 autant de fois qu'il veut pour extraire autant de mots qu'il souhaite qui ont été mis dans la relation préalablement un par un afin de modifier ses choix. Lorsque le 144 joueur a fait ses choix et souhaite terminer la partie, il clique sur «J'ai fini~!», ce qui le renvoie vers la page des résultats et du 145 score. Il n'y a aucune limite de temps pour terminer une partie. 146 147 \begin{figure}[h!] 148 \centering 149 \includegraphics[width=14cm]{img/PtiClicResultats.png} 150 \caption{Version originale du jeu PtiClic de Mathieu Lafourcade et Virginie Zampa -- Page score} 151 \end{figure} 152 153 La page des scores contient aussi le corrigé de la partie\footnote{Un joueur joue contre un autre joueur. Le «corrigé» contient donc les réponses qui correspondent à celles du joueur contre qui il joue. En conséquence, une «bonne» réponse peut correspondre à deux mauvaises réponses, mais qui ont été choisies par les deux joueurs en question. Toutefois, le poids des relations augmentent seulement si plusieurs paires de joueurs donne les mêmes réponses.}. Les mots qui ont été mis dans la bonne categorie apparaissent en vert, les 154 mauvaises réponses en rouge et les omissions en gris. Un point est marqué par bonne réponse tandis qu'une mauvaise réponse ou une omission 155 fait perdre un demi-point. Lorsque deux réponses sont possibles, le point est marqué quelque soit la relation choisie. Le score final est 156 soit un entier, soit un entier plus un demi point~; il peut être négatif, nul ou positif. 157 158 Lorsque l'on clique sur le bouton «J'ai vu~!», on retourne sur la page d'accueil. 159 160 \subsubsection{L'écran d'accueil du site} 161 \begin{center} 162 \includegraphics[width=14cm]{img/PtiClicAccueil.png} 163 \end{center} 164 165 Le joueur par défaut est l'utilisateur "joueur". Il est aussi possible de s'inscrire sur le site afin de créer son propre identifiant et mot 166 de passe afin de cumuler des points à chaque partie jouée. Les dix joueurs qui ont cumulé le plus grand nombre de points sont inscrits sur la 167 liste des «Top 10». Les points cumulés par le joueur «joueur», qui est l'ensemble de parties jouées par des internautes non inscrits au 168 site, figurent parmi les «Top 10». A droite de ceci, le score du joueur en question, c'est-à-dire la somme totale des scores de toutes les 169 parties jouées par l'utilisateur. Si l'utilisateur veut jouer une partie de plus, il clique sur le bouton «Je joue~!» en bas de la page et 170 une nouvelle partie est entamée. 171 172 Huit styles de couleurs sont disponibles et modifiables dans le menu déroulant en haut à droite de la page d'accueil. D'autres modifications résultent lors d'un changement de style, par exemple, les phrases associées aux relations. Lorsque le joueur s'authentifie avec succès, son identifiant apparaît dans le fond de page en très grande taille. 173 174 Lorsqu'un utilisateur souhaite s'inscrire au site, il est invité à lire un document explicatif concernant l'objectif du jeu dans le cadre du projet 175 de recherche de ce dernier. Il est aussi averti du contenu potentiel du jeu~: comme les mots centraux et du nuage peuvent être fournis par d'autres 176 utilisateurs, le vocabulaire rencontré peut ne pas convenir aux moins de 16 ans. 177 178 179 180 \subsection{L'archive de la base de données} 181 182 L'archive de la base de données est un fichier plat d'environ 2~000~000 lignes. Ce fichier contient un grand nombre de caractères accentués et 183 la version à notre disposition lorsque nous avons commencé à l'analyser, en extraire des données puis à créer notre propre base de données 184 n'était pas encodée en UTF-8. 185 186 La base de données de laquelle est extraite cette archive provient d'un autre jeu de l'équipe TALN\footnote{Traitement Automatique du Langage Naturel, NLP en anglais, Natural Language Processing} du Lirmm, nommé JeuxDeMots. L'objectif principal de JeuxDeMots est d'ajouter des mots et des expressions au réseau lexical alors que l'objectif principal de PtiClic est d'accroître le nombre de relations sémantiques entre les mots du réseau. 187 188 L'archive contient en tout début des remerciements et quelques explications des acronymes et des abréviations utilisés, puis des statistiques, à savoir, le nombre d'occurrences de relations, la fréquence des noeuds, les 50 termes les plus fréquents. Plus un terme ou expression est fréquent, plus son poids est élevé. 189 190 L'archive a proprement parler contient deux grandes parties~: une partie 'noeuds' (\verb!NODES!) et une partie 'relations' (\verb!RELATIONS!). La partie 'noeuds' contient sont de divers types. Les noeuds de type 'terme' contiennent non seulement des adjectifs, des adverbes, des substantifs et des verbes, mais aussi des locutions et des syntagmes, des mots tels que les prépositions, les conjonctions, les pronoms, les articles et les déterminants. Les substantifs peuvent être des noms propres, y compris des noms de lieux, des noms de personnes. Il existe de noeuds qui donnent d'autres informations, et on verra plus tard que ceux qui nous intéressent le plus, outre les termes, sont ceux concernant la catégorie grammaticale des mots et d'autres informations métalinguistiques plus précises. 191 192 Dans la partie 'mots et expressions', chaque entrée -- chaque ligne -- contient un $eid$ (Entry IDentifier), un nom $n$ (name), un type $t$ et un poids $w$ (weight). En voici un exemple~: 193 \indent% 194 \begin{verbatim} 195 eid=231064:n="pour femme":t=1:w=50 196 \end{verbatim} 197 198 Pour la partie relation, l'identifiant est le $rid$ (Relation IDentifier), le noeud de début $n1$ (starting node), le noeud de fin $n2$ (ending node), le $type$ (relation type) et le poids $w$ (weight). En voici un exemple~: 199 \begin{verbatim} 200 rid=430049:n1=82029:n2=151553:t=12:w=18 201 \end{verbatim} 202 203 \subsection{Analyse plus approfondie du jeu} 204 Bien que l'archive de la base de données contienne 55 relations différentes, la version en ligne du jeu PtiClic n'en utilise que treize (uniquement celles qui sont pertinentes pour le jeu)~: 205 206 \begin{itemize} 207 \item r\_associated|0|idée|Tout terme lié d'une façon ou d'une autre au mot cible\dots{} Ce mot vous fait penser à quoi~? 208 \item r\_syn|5|synonyme|A partir d'un terme, il est demandé d'énumérer les synonymes ou quasi-synonymes de ce terme. \item r\_isa|6|générique|'animal' est un générique de «chat', «mammifère', «être vivant' etc. en sont d'autres\dots{} 209 \item r\_anto|7|contraire|'chaud' est le contraire de «froid', vous vous rappelez~?~:) 210 \item r\_hypo|8|spécifique|'mouche', «abeille', «guêpe' sont des spécifiques de «insecte»\dots{} 211 \item r\_has\_part|9|partie|Il faut donner des parties/constituants/éléments du mot cible. Par exemple, «voiture» pourrait avoir comme parties~: «porte», «roue», «moteur»\dots{} 212 \item r\_holo|10|tout|Le tout est ce qui contient l'objet en question. Pour «main', on aura «bras', «corps', «personne', etc. On peut aussi voir le tout comme l'ensemble auquel appartient un élément, comme «classe' pour «élève'. 213 \item r\_agent|13|action>agent|L'agent (qu'on appelle aussi le sujet) est l'entité qui effectue l'action. Par exemple dans - Le chat mange la souris -, l'agent est le chat. Des agents typiques de «courir» peuvent être «sportif», «enfant»\dots{} 214 \item r\_lieu|15|chose>lieu|A partir d'un nom d'objet (ou autre), il est demandé d'énumérer les lieux typiques où peut se trouver l'objet en question. 215 \item r\_instr|16|action>instrument|L'instrument est l'objet avec lequel on fait l'action. Dans - Il mange sa salade avec une fourchette -, fourchette est l'instrument. Des instruments typiques de «tuer» peuvent être «arme», «pistolet», «poison»\dots{} 216 \item r\_carac|17|caractéristique|Pour une terme donné, en général un objet, il est demandé d'énumérer les caractéristiques possibles et/ou typiques de cet objet. Par exemple, pour «eau' on pourra avoir «liquide', «froide', «chaude', etc. 217 \item r\_lieu\_action|30|lieu>action|A partir d'un lieu, énumérer les action typiques possibles dans ce lieu. 218 \item r\_action\_lieu|31|action>lieu|A partir d'une action (un verbe), énumérer les lieux typiques possibles où peut être réalisée cette action. 219 \end{itemize} 220 221 Pour un mot central donné, seulement un nombre limité de relations sont possibles. Les adverbes et les locutions adverbiales sont relativement peu fréquents. La grande majorité des mots sont des substantifs, des verbes et des adjectifs ainsi que des locutions nominales, verbales et adjectivales. La relation "patient" est possible pour un mot central qui est un verbe, mais elle est plus complexe car elle ne fonctionnera que si le verbe en question est transitif. 222 223 \pagebreak 224 225 \section{Analyse des besoins} 226 227 Comme tout outil, l'environnement smartphone présente à la fois des avantages et des inconvéniants. 228 229 Les avantages sont nombreux~: un instrument portatif avec un bref temps de démarrage adapté à effectuer des tâches ponctuelles souvent de courte durée avec un écran tactile permettant d'agir directement sur des éléments affichés sur son écran. Le smartphone présente encore d'autres avantages, il est à la fois un lecteur mp3, un dictaphone, un appareil, un chronomètre et réveil, pour ne citer que quelques exemples. 230 231 Les inconvénients par rapport à un ordinateur classique sont aussi nombreux. L'écran est nettement plus petit limitant l'espace de travail 232 et obligeant davantage de navigation de page en page. L'entrée des données est plus difficile, il n'existe pas de clavier, ou bien seulement 233 un clavier virtuel ou un micro-clavier intégré. Malgré les avantages de l'écran tactile, son utilisation permet une précision bien moindre 234 que l'utilisation d'une souris à cause de la petite taille de l'écran et des doigts et mains qui bloquent la vue de l'écran lors du 235 glissement-et-déposé par exemple. 236 237 Le faible espace de stockage et les limites d'autonomie et d'énergie se traduisent par une nécessité d'économie de la part des concepteurs 238 d'applications par rapport aux ordinateurs classiques, de plus en plus performants actuellement. C'est pour cette raison que le smartphone 239 n'est pas le plus adapté pour effectuer des tâches de longue haleine telles que la rédaction des textes ou l'édition de vidéos. Notamment, dans notre cas, 240 l'utilisation du réseau est lente, potentiellement coûteuse pour l'utilisateur -- les forfaits facturant souvent à la quantité de données -- et 241 consommatrice d'énergie. 242 243 Les applications bien adaptées au smartphone sont des applications telles que les calculatrices, les logiciels de prise de notes, les jeux 244 simples (casual games) et le jeu PtiClic n'est pas une exception à cette dernière catégorie. L'avantage de ces applications sur un smartphone est 245 qu'il est possible d'y jouer lorsque l'on est en file d'attente à la Poste ou à la Préfecture ou bien dans les transports en commun. En effet, lorsque l'on a un smartphone, on peut jouer n'importe quand et n'importe où. Un tel 246 prototypage du jeu demande toutefois une réflexion non seulement quant aux limites d'un smartphone mais aussi ses avantages. 247 248 Le jeu de base du PtiClic sous \android{} présente plus ou moins les mêmes cas d'utilisations que l'application d'origine. Toutefois, le 'comment' de ces cas d'utilisation sont loin d'être les mêmes, la plus grande différence étant la gestion des mots nuage. Une discussion de ce sujet fera l'objet des chapitres 'Conception' et 'Réalisation'. 249 250 \pagebreak 251 252 \section{PtiClic et le TALN} 253 254 255 Les projets JeuxDeMots et PtiClic s'inscrivent dans le domaine de la recherche en traitement automatique du langage naturel, et plus précisément dans celui du traitement de la sémantique du langage. Les données et les conclusions issues de ces projets pourraient contribuer directement ou indirectement à la recherche et à des applications en traduction automatique, l'indexation des textes, les correcteurs automatiques d'orthographe et de grammaire, la classification et la catégorisation des documents, des algorithmes de moteurs de recherche. 256 257 258 \subsection{Ferdinand de Saussure, la linguistique moderne, le TALN, JeuxDeMots et PtiClic} 259 260 Dans la partie qui suit, des notions de linguistique générale seront évoquées suivies d'une discussion d'applications dans le traitement automatique du langage naturel~: les dichotomies signifié-signifiant, langue et parole, synchronie et diachronie et l'arbitraire du signe. C'est Ferdinand de Saussure (1857-1913), fondateur de la linguistique moderne, qui a défini formellement pour la première fois ces concepts fondamentaux dans son Cours de linguistique général\footnote{Ferdinand de Saussure, Cours de linguistique générale, édition originale~: 1916, édition 1979~: Payot, Paris. Il s'agit d'une oeuvre posthume rédigée à partir de notes de cours par deux disciples de Saussure~: Charles Bally et Albert Sechehaye. La publication de cet ouvrage marque le début de la linguistique moderne.}. 261 262 \subsubsection{Le signe linguistique~: signifié, signifiant, référent} 263 264 Selon Saussure, le signe linguistique est une entité à deux faces~: le signifiant et le signifié. Ce principe semble assez simple. A un mot est associé un concept. Le mot 'cheval', c'est-à-dire son occurence orale ou écrite, le signifiant,\footnote{Pour Saussure, le signifiant est la version phonique d'un mot, ce qui est logique car la version graphique du mot n'est qu'une représentation écrite de la version phonique} nous évoque la représentation mentale que nous avons d'un cheval, le signifié. 265 266 267 \begin{figure}[h!] 268 \centering 269 \includegraphics[width=0.5\textwidth]{img/signe-conceptimageacoustique.jpeg} 270 \caption{Une représentation d'une idée, d'une chose, etc. est associée à la forme phonique d'un mot.} 271 \end{figure} 272 273 \begin{figure}[h!] 274 \centering 275 \includegraphics[width=0.5\textwidth]{img/signe-cheval.jpeg} 276 \caption{A la représentation qu'on a d'un cheval est associée la forme phonique du mot cheval} 277 \end{figure} 278 279 Cette notion semble assez simple mais, au contraire, la relation signifié-signifiant est très complexe. Cette entité a un très grand nombre de caractéristiques et le signifiant comprend des dénotations ainsi que des connotations qui peuvent être liées à des contextes multidimensionnels, généraux et spécifiques. Puis, à la notion de concept s'ajoute l'objet lui-même... s'il s'agit d'un objet physique~! Et s'il s'agit d'une émotion~? D'une action~? D'un sentiment~? D'une idée abstraite~? 280 281 282 On peut aussi parler de sens figuré et de sens propre des mots. Par exemple au mot «poésie» on pourrait associer les idées «littérature», «écrivain», «auteur», «strophes», etc. mais aussi «musique», «rêve», «amour». On parlera de ce deuxième sens lorsque l'on parle de la notion de «bruit» dans la relation entre mots ou expressions. Et si on prenait en compte la polysémie d'un signifiant~? 283 284 285 Un demi-siècle plus tard, Emile Benveniste ajouta une autre dimension à ce schéma intégrant un «référent» qui remplace le «signifié», le «signifié» étant, pour Benveniste, la dénotation du mot, c'est-à-dire bien l'objet lui-même. 286 287 \begin{figure}[h!] 288 \centering 289 \includegraphics[width=0.5\textwidth]{img/trianglesemiotique.jpeg} 290 \caption{Le signifiant de Saussure correspond au référent de Benveniste, le signifiant de Benveniste étant la dénotation du signifié alors que le référent est la représentation mentale ou «concept» du signifié, qui englobe aussi des connotations qui peuvent être de nature très étendue telle que les contextes et les expériences personnelles que quelqu'un associe à un signifié.} 291 \end{figure} 292 293 Bien que ce modèle soit plus complet, cet ajout ne simplifie en rien notre travail. 294 295 Un des obectifs des projets JeuxDeMots et PtiClic est d'établir des informations complexes concernant la représentation mentale d'un signifiant à travers ses liens avec d'autres signifiants. Bien que le langage soit limité, le langage demeure un des moyens de communication les plus efficaces de l'homme.\footnote{Un des moyens les plus efficace car les images, les vidéos, etc. sont aussi des moyens de communication qui peuvent être aussi efficace que le langage. Cependant, dans la majorité des cas, le langage reste le mode de communication qui permet de s'exprimer avec le plus de précision} 296 297 Dans le réseau lexical de JeuxDeMots, le signifiant est élargi pour comprendre non seulement des mots mais aussi des locutions, des expressions et des raffinements sémantiques. Lorsqu'un mot est polysémique, il peut avoir plusieurs entrées distinctes. Par exemple, pour le mot «boîte», on trouve «boîte (contenant)», «boîte (entreprise)», «boîte (de nuit)», «boîte (conserve)», etc. 298 299 On verra que, dans le réseau lexical de JeuxDeMots/PtiClic, il est possible de décrire à l'aide d'autres mots un grand nombre de traits sémantiques d'un signifiant au moyen d'un nombre assez important de relations que ce signifiant entretient avec d'autres signifiants (relations sortantes). Qui plus est, les traits sémantiques du signifiant en question sont encore élargis car il est aussi possible de lui associer des signifiants dont il fournit des traits sémantiques (relations entrantes). 300 301 \subsubsection{L'arbitraire du signe} 302 303 A l'exception de quelques onomatopées, le lien entre un mot (sous forme orale ou écrite) et son concept est complètement arbitraire. Le mot pour «arbre» en anglais est «tree», «Baum» en allemand. Il n'y a aucun rapport entre la représentation phonique ou graphique d'un mot et sa signification. 304 305 Le fait que le signe linguistique soit arbitraire rend le travail des chercheurs et des informaticiens en TALN bien plus difficile. Aucun élément dans le mot écrit (qui représente sa forme orale), ou plutôt d'une famille de mots, nous donne des indices quant au sens d'un mot. Il est toutefois possible de déduire le sens d'un mot à partir d'autres mots apparentés ou en se servant des notions d'étymologie provenant d'autres langues (par exemple, le latin et le grec) ou issues de la même langue. Cependant, cela peut aussi donner lieu à des faux amis ou des faux apparentés. 306 307 Ce fait peut sembler évident, mais il est bon d'en être conscient. En effet, si le signe linguistique n'était pas arbitraire, il serait théoriquement possible d'écrire un algorithme pour déduire le sens d'un mot à partir du signifiant, c'est-à-dire le signifié à partir du signifiant, ce qui n'est pas le cas, d'où la complexité du problème que pose la sémantique. 308 309 310 \subsubsection{Synchronie et diachronie} 311 312 La notion de synchronie correspond à l'étude ou l'analyse d'une langue à un moment donné, figé dans le temps. La diachronie, elle, s'intéresse à l'évolution d'une langue. 313 314 Quoiqu'il soit intéressant d'étudier une langue à un moment donné dans le temps, cela ne correspond pas au monde réel. Une langue évolue quotidiennement grâce à ou à cause des nouveaux produits introduits sur le marché et les événements politiques du monde entre autres. Il est donc important de pouvoir tenir compte de ces changements. Ils sont pris en compte dans la base de données de JeuxDeMots grâce au fait que le réseau lexical évolue en temps réel~; le jeu qui alimente ce réseau est en ligne et est alimenté de manière continue. Une telle base de données permet aussi d'associer à de nouvelles entrées des dates précises. Il est aussi possible de se servir d'autres outils en TALN et en sémantique plus précisément pour mettre à jour une telle base de données, la LSA, l'analyse sémantique latente, par exemple, qui sera décrite ci-dessous. 315 316 Un exemple d'une application qui pourrait prendre en compte la diachronie est un moteur de recherche basé sur un réseau lexical mis à jour en temps réel ou à intervalle de temps très court. Lorsqu'une affaire paraît à la une des journaux concernant un homme politique ou une catastrophe, les relations sémantiques qu'entretiennent les mots maîtres avec les mots subordonnés changent. 317 318 \subsubsection{Langue et parole} 319 320 Une autre notion fondamentale de linguistique générale est la dichotomie «langue» et «parole». La «parole» est associée à l'acte individuel de langage alors que «langue» est la représentation collective de l'ensemble des actes de parole dans l'esprit d'un locuteur natif. La «parole» est hétérogène, individuelle, active alors que la «langue» est collective, sociale, individuelle, passive. 321 322 Enfin, pour avoir une représentation de signification qui est légitime, il est absolument nécessaire qu'il y ait un très grand nombre de sources et/ou de personnes qui alimentent le réseau lexical, sinon, les résultats risquent d'être biaisés. Dans la dichotomie «langue»/«parole» de Saussure, il est essentiel qu'un tel réseau soit une représentation sociale et homogène de la langue en question. Autrement dit, il faut que la base soit représentative de la «langue» et non pas de la «parole» ni quelque part entre «langue» et «parole». Ceci implique qu'il faut aussi des données d'une diversité de sources et de types de sources~: sources écrites et orales, de tous domaines, de tous niveaux de langue. 323 324 D'emblée, la base de données JeuxDeMots/PtiClic n'est pas «parole» pure car il est nécessaire que deux utilisateurs donnent les mêmes réponses pour que leurs réponses soient validées. En outre, le fait que le poids d'une relation augmente lorsque plusieurs paires d'utilisateurs donnent la même réponse tend vers la «langue» plutôt que vers la «parole». Enfin, il est souhaitable qu'un très grand nombre d'utilisateurs contribuent à la base de données JeuxDeMots parce que, justement, il faut que les informations contenues dans la base relèvent réellement de «langue» selon le sens saussurien de ce mot. 325 326 327 \subsection{Le réseau lexical de JeuxDeMots} 328 329 La base de données utilisée pour PtiClic est la même de celle utilisée pour JeuxDeMots ou, dit de manière plus précise, PtiClic utilise la base de données de JeuxDeMots. Les nouveaux termes, ou noeuds, sont introduits dans JeuxDeMots ainsi que de nouvelles relations, mais l'objectif principal de PtiClic est d'introduire de nouvelles relations parmi des noeuds existants. Il n'est pas possible d'ajouter de nouveaux noeuds lors d'une partie de PtiClic, seulement de nouvelles relations. 330 331 Un noeud peut correspondre à un mot («pomme»), une expression («avant toute chose»), ce sont les noeuds de type 1. Ces termes figureront dans le mot central et les mots nuage de nos parties. Les noeuds de type 4 sont ceux associés aux catégories grammaticales des mots et contient les attributs genre et nombre également («Adj:Fem+SG:InvGen+PL»). D'autres métadonnées concernant les noeuds de type 1 se trouvent dans les noeuds de type 18 qui nous donnent des informations concernant le niveau de langue («Langue:soutenu», «Langue:familier») et la transitivité des verbes («Ver:Intransitif») entre autres. 332 333 Les noeuds de type 36 nous donnent des informations métalinguistiques bien plus précises que la catégorie grammaticale. Par exemple, si nous souhaitons que les réponses possibles soient non seulement des substantifs mais aussi des objets réels, on pourrait filtrer les résultats grâce au noeud «\ 334 L'application pourrait bénéficier d'une restructuration du code. Nous avons effectué cette restructuration et un gros 335 nettoyage du code du client, mais le serveur n'est pas aussi propre et extensible que souhaitable. 336 \_INFO-SEM-THING». Si l'on souhaite que les réponses possibles soient des évènements, des personnes ou des lieux, on peut se servir des relations «\_INFO-SEM-EVENT», «\_INFO-SEM-PERS» et «\_INFO-SEM-PLACE» respectivement. Encore faut-il que des relations vers ces noeuds soient alimentées préalablement. 337 338 Cinquante-cinq types différents de relations existent qui donnent des informations de nature morphologique, sémantique et métalinguistique. 339 340 Il existe environ 230~000 noeuds de type 1 («term»). Moins de 106~000 de ces mots contiennent des relations sortantes de type 0 («r\_idea»), qui est le type de relation le plus général dont toutes les autres relations sémantiques sont des sous-ensembles à quelques exceptions de près, ce qui représente moins de 50\% des noeuds. Si on prend l'ensemble des relations existant dans la version originale du jeu PtiClic, seulement 122~000 noeuds ont des relations sortantes et moins d'un quart des noeuds du réseau lexical ont des relations entrantes. 341 342 Il serait intéressant d'introduire de nouvelles relations entrantes et sortantes là où il n'en existe aucune. Toutefois, cela serait très difficile voire impossible à partir des relations déjà existantes. Si l'on introduit des mots par hasard dans le nuage, il serait très improbable qu'il y ait des relations avec un mot central, aussi choisi par hasard. Les joueurs du PtiClic ne s'intéresseraient plus au jeu et l'alimentation de la base serait ralentie voire arrêtée. Il faudrait un moyen auxiliaire pour introduire de nouvelles relations de ce genre dans la base. 343 344 \subsection{LSA et le réseau lexical de JeuxDeMots} 345 346 PtiClic combine deux moyens pour la création d'une partie, c'est-à-dire la composition mot central et mots nuages~: LSA et le réseau lexical de JeuxDeMots.\footnote{PtiClic et PtiClic-kids~: Jeux avec les mots permettant une double acquisition. In proc TICE 2010, 7e coloque TICE, Nancy~: 6-8 décembre 2010 et PtiClic: a game for vocabulary assessment combining JeuxDeMots and LSA. In proc of CICLing (Conference on Intelligent text processing and Comptational Linguistics). Mexico~: 1-7 mars.} 347 348 349 \subsubsection{La LSA} 350 351 Il existe plusieurs systèmes et algorithmes pour évaluer le rapport sémantique entre des mots. Une méthode consiste à chiffrer le lien entre deux mots. Si l'on représente ces liens par un graphe, il y aura un seul lien ou arête (non orientée) entre deux mots ou noeuds donnés et une valeur associée à la relation qu'entretiennent ces deux mots. Un tel système est la LSA\footnote{Wikipedia, 'Latent Semantic Analysis' et 'Analyse sémantique latente', http:\/\/en.wikipedia.org\/wiki\/Latent\_semantic\_analysis et http:\/\/fr.wikipedia.org\/wiki\/Analyse\_s\%C3\%A9mantique\_latente}. 352 353 Sans entrer dans les détails de l'algorithme de la LSA, qui est brevetée et payante, cette approche consiste à générer un graphe de relations entre mots à partir de textes écrits. Le résultat de l'algorithme donne un graphe de noeuds (mots) et d'arcs (estimation du degré de lien sémantique entre deux mots) comme dans la figure \ref{fig:lsa}. 354 355 356 \begin{figure} 357 358 \begin{center} 359 360 \pgfdeclarelayer{background} 361 \pgfdeclarelayer{foreground} 362 \pgfsetlayers{background,main,foreground} 363 \begin{tikzpicture}[ 364 txt/.style = {fill=white,font=\footnotesize,scale=0.75, inner sep=1pt}, 365 earlymidway/.style = {pos=0.4}, 366 latemidway/.style = {pos=0.6} 367 ] 368 \node (n0) {mot4}; 369 \node[above left = 2cm of n0] (n1) {mot1}; 370 \node[above right = 2cm of n0] (n2) {mot3}; 371 \node[below left = 2cm of n0] (n3) {mot2}; 372 \node[below right = 2cm of n0] (n4) {mot5}; 373 374 \foreach \direction/\nfrom/\nto/\angle/\pos/\anchor/\text in { 375 -/n0/n1/15/near end/east/0.28, 376 % 377 -/n0/n2/-20/midway/center/0.48, 378 % 379 -/n0/n3/-15/near end/east/0.12, 380 % 381 -/n0/n4/-15/very near end/east/0.4, 382 % 383 -/n1/n2/-20/midway/center/0.94, 384 % 385 -/n1/n3/-15/near end/east/0.75, 386 % 387 -/n1/n4/-15/very near end/east/0.42, 388 % 389 -/n2/n3/-15/near end/east/0.04, 390 % 391 -/n2/n4/-15/very near end/east/0.39, 392 % 393 -/n3/n4/-20/midway/center/0.88 394 }{ 395 \draw[\direction] (\nfrom) to[bend left=\angle] (\nto); 396 \begin{pgfonlayer}{foreground} 397 \path[\direction] (\nfrom) to[bend left=\angle] node[\pos, anchor=\anchor, txt] {\text} (\nto); 398 \end{pgfonlayer} 399 } 400 \end{tikzpicture} 401 402 \end{center} 403 \caption{Résultat de la LSA} 404 \label{fig:lsa} 405 \end{figure} 406 407 408 La LSA est plus fiable lorsque les textes utilisés pour générer les poids de relations sémantiques sont des corpus spécialisés et donc relativement homogène. C'est une méthode rapide, facile à réaliser, efficace. Les données récoltées rélèvent en général de la langue écrite et donc d'un niveau de langue soutenue et riche. Un tel corpus contient une grande quantité de vocabulaire passif. 409 410 Il est plus difficile de se servir de la LSA pour des textes généralistes car elle ne traite pas la polysémie. Si l'on souhaite étudier la langue parlée, il faut des corpus qui soient des transcriptions de discours oraux. 411 412 Les inconvénients de la LSA sont nombreux. Outre le fait qu'elle n'aborde pas le problème de la polysémie alors qu'en moyenne un mot donné a quatre significations différentes, lorsqu'il s'agit de textes écrits, les mots les plus courants et les plus évidents sont souvent omis~; les rédacteurs préfèrent utiliser des mots plus recherchés et éviter la répétition afin de conserver un bon style. Ceci peut aller à l'encontre des statistiques sur le poids des relations entre les mots.\footnote{Ceci n'est pas vrai si les types de textes utilisés correspondent exactement aux types de textes auxquelles le résultat de la LSA est appliquée.} La LSA ne nous donne aucune information sur la syntaxe ni la morphologie des mots. Elle ne nous donne aucune information sur la nature des relations (synonymie, contenant/contenu, etc.). Enfin, la LSA traite chaque mot séparément. Autrement dit, chaque élément d'un mot composé est traité individuellement et confondu avec des occurrences individuelles de ces mêmes mots. 413 414 Malgré ces inconvénients, malgré des 'erreurs' produites par la LSA, elle est utilisée aujourd'hui car elle nous donne beaucoup d'informations sémantiques justes concernant la relation entre les mots d'un corpus. 415 416 \subsubsection{Le réseau lexical de JeuxDeMots} 417 418 Etant donné la complexité du signe linguistique, l'idée d'associer à un signe linguistique plusieurs liens sémantiques est très intéressante. Bien que cela augmente la complexité de nos applications, ce choix est tout à fait justifié. On se rend compte que les définitions et les résultats des dictionnaires classiques et de synonymes et antonymes sont insuffisants et ne nous donnent que des informations limitées concernant la valeur sémantique d'un mot, surtout qu'ils nous donnent peu ou pas d'informations sur la valeur sémantique qu'entretiennent deux mots donnés. En effet, le fait même d'avoir des données concernant plusieurs types de relations existant entre différents mots nous donne plus d'informations quant aux connotations et aux dénotations d'un mot donné que celles d'un dictionnaire classique. 419 420 A l'inverse de la LSA, le réseau lexical de JeuxDeMots est un réseau basé largement sur un vocabulaire actif composé de relations générales, le lexique, relevant plutôt de la langue orale, est alimenté de manière spontanée par des utilisateurs jouant au jeu. Ce réseau traite la polysémie, contient un grand nombre d'informations concernant la morphologie, la sémantique et des aspect métalinguistiques des termes. 421 422 L'inconvénient est que ces informations peuvent contenir des bruits et des silences.\footnote{Lafourcade et Zampa, PtiClic: A Game for Vocabulary Assessment Combining JeuxDeMots and LSA. In proc of CICLingj(Conference on Intelligent text processing and Computational Linguistics). Mexico, 1-7 March, 2009}. Des bruits sont des associations imprécises, qui en général doivent être plus faibles. Ceci peut arriver lorsque les réponses attendus sont celles correspondant au sens propre d'un mot alors que l'utilisateur donne un sens figuré ou bien fait de l'humour, après tout, il s'agit bien d'un jeu. L'exemple du mot poésie par exemple et l'association 'est lié à' peut donner lieu à des réponses de sens propre ('auteur', 'rhyme', etc.) ou de sens figuré ('symphonie', 'amour', etc.). L'autre inconvénient est que le réseau JeuxDeMots contient un grand nombre de silences. Un 'silence' est défini comme une association n'existant pas ou qui devraient être plus forte. En effet, les informations sémantiques du réseau JeuxDeMots sont très hétérogènes et pas représentatif de la réalité alors que la LSA est plus hétérogènes quant à sa relation aux textes utilisés pour sa génération. 423 424 Un graphe du réseau lexical de JeuxDeMots est de la forme qui suit, toutefois, il faut imaginer non pas cinq noeuds, mais plus de 200 000 noeuds~: 425 426 427 428 \begin{figure} 429 \begin{center} 430 \pgfdeclarelayer{background} 431 \pgfdeclarelayer{foreground} 432 \pgfsetlayers{background,main,foreground} 433 \begin{tikzpicture}[ 434 txt/.style = {fill=white,font=\footnotesize,scale=0.75, inner sep=1pt}, 435 earlymidway/.style = {pos=0.4}, 436 latemidway/.style = {pos=0.6} 437 ] 438 \node (n4) {mot4}; 439 \node[above left = 2cm of n4] (n1) {mot1}; 440 \node[above right = 2cm of n4] (n3) {mot3}; 441 \node[below left = 2cm of n4] (n2) {mot2}; 442 \node[below right = 2cm of n4] (n5) {mot5}; 443 444 \foreach \direction/\nfrom/\nto/\angle/\pos/\anchor/\text in { 445 ->/n4/n3/15/near end/east/idée associée 450, 446 <-/n4/n3/0/midway/center/idée associée 250, 447 <-/n4/n3/-15/near start/west/hyperonyme 50, 448 % 449 ->/n4/n5/-20/midway/center/idée associée 25, 450 % 451 ->/n3/n5/-15/near end/east/hyponyme 50, 452 ->/n3/n5/0/latemidway/east/locution 70, 453 ->/n3/n5/15/latemidway/west/idée associée 25, 454 <-/n3/n5/30/near end/west/idée associée 25, 455 % 456 ->/n1/n2/-15/very near end/east/hyperonyme 70, 457 <-/n1/n2/0/latemidway/center/idée associée 50, 458 <-/n1/n2/15/very near end/west/hyperonyme 50, 459 % 460 ->/n1/n4/-15/near end/center/domaine 25, 461 ->/n1/n4/5/midway/center/idée associée 310, 462 % 463 ->/n1/n5/-30/very near end/east/domaine 25, 464 % 465 ->/n1/n3/40/midway/center/idée associée 200, 466 ->/n1/n3/25/midway/center/hyperonyme 80, 467 <-/n1/n3/12/midway/center/hyponyme 100, 468 <-/n1/n3/0/midway/center/idée associée 60 469 }{ 470 \draw[\direction] (\nfrom) to[bend left=\angle] (\nto); 471 \begin{pgfonlayer}{foreground} 472 \path[\direction] (\nfrom) to[bend left=\angle] node[\pos, anchor=\anchor, txt] {\text} (\nto); 473 \end{pgfonlayer} 474 } 475 \end{tikzpicture} 476 \end{center} 477 \caption{Graphe à très petit échelle du réseau lexical JeuxDeMots} 478 \label{} 479 \end{figure} 480 481 482 Le réseau lexical de JeuxDeMots permet aussi de générer un graphe donnant un seul arc entre deux mots similaire au graphe créer par la LSA. L'algorithme pour générer un graphe contenant des simples liens entre noeuds et qui donne des résultats très proche de la LSA est décrit dans Lafourcade et Zampa 2011.\footnote{PtiClic et PtiClic-kids~: Jeux avec les mots permettant une double acquisition. In proc TICE 2010, 7e coloque TICE, Nancy~: 6-8 décembre 2010} 483 484 \subsection{Analyse pour la réalisation du projet PtiClic sous Android et Smartphone} 485 486 \subsubsection{Généralités} 487 488 Toute la discussion précédente concernant PtiClic et le TALN à l'exception de l'algorithme décrit précédemment était une discussion d'ordre général concernant la raison d'être des projets JeuxDeMots et PtiClic. Le partie qui suit concerne des idées, des informations et des algorithmes directement liés au présent projet. 489 490 Nous avons sous-estimé la dimension TALN du projet lors de notre planification initiale. Pour cette raison, une analyse spécifiquement destinée à ce sujet a fait l'objet d'un travail, hélas vers la fin du projet. 491 492 Il existe un paquetage TALN dans le code source du projet. L'idée de départ était d'effectuer des expériences dans un premier temps, de créer une bibliothèque TALN pour la génération automatique des parties puis d'intégrer cette bibliothèque au projet. Hélas, ce paquetage est toujours au stade éxpérimental et n'a pas été intégré au projet. 493 494 \subsubsection{Analyse} 495 496 Tout d'abord, il est important de se rappeler que 45\% des noeuds ('termes') du réseau lexical de JeuxDeMots n'ont aucune relation sémantique sortante et que plus de 70\% des ces nodues n'ont aucune relation sémantique entrante. A part la possibilité d'utiliser le lien d'apparenté entre mots afin d'introduire de nouveaux liens sémantiques\footnote{Si par exemple le mot 'lait' contient un grand nombre de liens sémantique, il serait envisageable d'utiliser la relation 22, r\_family pour trouver des mots apparentés ('laitière' par exemple, le cas échéant) mais qui n'ont pas de relations sémantiques et en introduire de nouvelles relations à ces mots} là où il n'en existe aucun, il n'est pas possible de créer des jeux intéressant en choisissant un bouquet mot central / mots nuage par hasard. 497 498 En effet, l'introduction de nouvelles relations mettant en jeu des noeuds n'ayant aucune relation sémantique associée ne sera pas abordée dans la partie qui suit car nous n'avions pas les moyens de mettre en oeuvre de tels procédés et un tel travail va au-delà du sujet du présent TER.\footnote{Une discussion concernant ce sujet a eu lieu avec Monsieur Lafourcade, qui nous a indiqué clairement de ne pas nous occuper de ce problème précis} 499 500 Le nouveau paquetage TALN prévoit d'utiliser onze relations. Ces onzes relations imposent des contraintes qui doivent absolument être respectées. 501 502 La relation 0, r\_idea, est la relation la plus générale~; toute autre relation sémantique est a priori un sous-ensemble de la relation 0. 503 504 \begin{figure}[h!] 505 \begin{center} 506 \hskip -15.1em 507 \begin{minipage}{15em} 508 \begin{tabular}{ | l | l | l | l | p{5cm} |} 509 \hline 510 \footnotesize{Relation} & \footnotesize{Mot central} & \footnotesize{Mots nuage} & \footnotesize{Remarques} \\ \hline 511 \footnotesize{-1 'mn' n'est pas lié à 'mc'} & \footnotesize{\shortstack{adj adv n v}} & \footnotesize{\shortstack{adj adv n v}} & \footnotesize{} \\ \hline 512 \footnotesize{0 'mc' est en rapport avec 'mn'} & \footnotesize{\shortstack{adj adv n v}} & \footnotesize{\shortstack{adj adv n v}} & \footnotesize{} \\ \hline 513 \footnotesize{5 'mc' est un synonyme de 'mn'} & \footnotesize{\shortstack{adj adv n v}} & \footnotesize{\shortstack{adj adv n v}} & \footnotesize{\shortstack{même POS}} \\ \hline 514 \footnotesize{6 'mc' est une sorte de 'mn'} & \footnotesize{n} & \footnotesize{n} & \footnotesize{} \\ \hline 515 \footnotesize{7 Un contraire de 'mc' est 'mn'} & \footnotesize{\shortstack{adj adv n v}} & \footnotesize{\shortstack{adj adv n v}} & \footnotesize{\shortstack{même POS}} \\ \hline 516 \footnotesize{8 Un spécifique de 'mc' est 'mn'} & \footnotesize{n} & \footnotesize{n} & \footnotesize{} \\ \hline 517 \footnotesize{9 'mn' est une partie de 'mc'} & \footnotesize{n} & \footnotesize{n} & \footnotesize{} \\ \hline 518 \footnotesize{10 'mc' fait partie de 'mn'} & \footnotesize{n} & \footnotesize{n} & \footnotesize{} \\ \hline 519 \footnotesize{13 'mn' pourrait 'mc'} & \footnotesize{v} & \footnotesize{n} & \footnotesize{} \\ \hline 520 \footnotesize{15 Le lieu pour 'mc' est 'mn'} & \footnotesize{n v} & \footnotesize{\shortstack{n}} & \footnotesize{} \\ \hline 521 \footnotesize{16 Instrument pour 'mc' est 'mn'} & \footnotesize{v} & \footnotesize{n} & \footnotesize{} \\ \hline 522 \footnotesize{17 Un caractéristique de 'mc' est 'mn'} & \footnotesize{n} & \footnotesize{adj} & \footnotesize{} \\ \hline 523 \end{tabular} 524 \end{minipage} 525 \end{center} 526 \caption{Tableau «catégorie grammaticale» / relations} 527 \end{figure} 528 529 On voit que les relations n'utilise que quatre catégories grammaticales~: des noms, des verbes, des adjectifs et des adverbes. Les adverbes sont bien moins fréquents que les noms, les verbes et les adjectifs. 530 531 Dans la relation 0, la relation la plus générale, n'importe quelle catégorie de mot peut être associée à n'importe quelle autre catégorie de mot, ce qui n'est pas le cas des autres relations sémantiques. Dans les relations de synonymies et d'antonymies, le mot central peut être de n'importe quelle des ces quatre catégories grammaticales, mais les mots nuage corresondants doivent être de la même catégorie grammaticale que le mot central. Il n'est pas possible qu'un nom ait comme synonyme un adjectif ou un verbe. D'autres relations impose des contraintes bien plus fortes. Dans la relation 13 ('mc'\footnote{mot central} pourrait 'mn'\footnote{mot nuage}, le mot central doit être un verbe et le mot nuage doit être un adjectif, sinon il est sûr et certain que la relation, si elle a été choisie, est fausse. Ces contraintes doivent être prises en compte dans l'application non seulement dans l'algorithme de génération de nuage mais aussi lorsqu'un joueur tente de donner une telle réponse. Une telle réponse ne doivent jamais être correcte, même si deux joueurs jouant l'un contre l'autre donne de telles réponses. Par ailleurs, de telles réponses pourraient être pénalisées plus fortement ou être utilisées pour détecter des personnes ou logiciels malveillants tentant de nuire à la base de données. 532 533 Le fait que les mots soient de la bonne catégorie grammaticale est une condition nécessaire mais pas suffisante. Par exemple, dans la relation 10, 'mc' fait partie de 'mn', la phrase "'écran' fait partie de 'ordinateur'" tient la route, mais la phrase "'humidité' fait partie de 'honnêteté'" est un non sens. Pour cette raison, il serait intéressant que les noeuds de type 36 qui nous donnent des informations métalinguistiques supplémentaires pour nous indiquer s'il s'agit de lieux, de choses, de personnes, etc. pourrait nous être d'une grande utilité. Néanmoins, il s'agit d'une condition qui est nécessaire, mais toujours insuffisante~: la phrase "'roue' fait partie d'un 'arbre'" et des phrases de ce genre ne nous aident pas et ne rend pas le jeu intéressant pour l'utilisateur. D'autres filtres pourraient être utilisés afin d'accroître les probabilités qu'un nuage généré automatiquement crée une partie intéressante, la relation de domaine, qui est assez général. 534 535 Mais il y a encore une autre dimension de ces relations dont il faut être vigilent~: toutes les relations ne sont pas compatibles. Pour prendre un exemple simple, mettons qu'une partie était composée de deux relations, les relations 9 ('mn' est une partie de 'mc') et 13 ('mn' pourrait 'mc'). Dans la relation 9, le mot central doit être un nom alors que dans la relation 13 il doit être un verbe. A l'exception d'un nombre très limité de mots qui peuvent être à la fois un verbe et un nom\footnote{Mais même dans ce cas, aucun problème existe car les deux mots seraient des noms ou des verbes. Le problème se pose justement lorsque cela n'est pas la cas.}, il faudrait éviter de combiner ces deux relations. Des exemples de relations qui peuvent être combinées sans problèmes sont les relations 6, 8, 9 et 10. On pourrait aussi combiner ces quatre relations avec les relations de synonymie et d'antonymie si on choisit des substantifs pour ces derniers. Les relations 5 et 7, de synonymie et d'antonymie, vont parfaitement ensemble. 536 537 538 \subsubsection{Algorithmique} 539 540 Il est plus intéressant de créer le nuage à partir de la relation 0 et d'introduire des relations plus spécifiques, c'est-à-dire n'importe quelle relation à l'exception de la relation 0, car presque toute relation est un sous-ensemble de la relation 0, la relation d'antonymie étant parfois une exception à la règle. 541 542 L'isolation d'une seule relation permet d'établir si oui ou si non un mot est lié à un autre mot. Lorsqu'il y a deux ou plusieurs relations, le fait qu'un mot peut appartenir à un seul relation diminue le nombre de fois qu'un mot sera inclu dans l'une des deux relations. 543 544 Lorsque l'on trouve un moyen d'introduire de nouvelles relations tels que la LSA, il serait intéressant dans un premier temps d'introduire un mot central, des mots nuages générés par la LSA ou une autre méthode et uniquement la relation 0 afin que les joueurs valident les relations de fortes poides de la LSA. Ensuite, ces mots validés pourraient être utilisés pour la création de nuage et des parties générées qui ne mettent en jeu que des relations plus spécifiques (autre que la relation 0) afin d'affiner les relations qu'entretient le mot central aux mots nuage. 545 546 Introduire la relation 0 et d'autres relations n'est en principe pas une bonne idée étant donné qu'il est presque sûr et certain que ceci donne lieu à deux réponses possibles. L'utilisateur n'aurait qu'à donner la relation qui est plus sûr, la relation, ce qui ne nous aide pas quant à avoir des informations sémantiques plus spécifiques concernant le mot central et inversement au mot nuage en question. Les seules raisons valables d'introduire la relation 0 parmi d'autres relations est de combler des problèmes liés à la génération de nuage et, en même temps, de travailler sur l'affinement des liens sémantiques et l'alimentation de la relation 0 afin de créer de nouveaux nuages dans de futures parties. 547 548 Il est intéressant de varier le nombre de relations. Avoir une seule relation permet d'isoler une lien sémantique et de savoir si oui ou non il est valable. 549 550 Si nous nous occupons pas d'introduire de nouvelles relations aux noeuds qui n'ont aucune relation sémantique sortante ou entrante, outre l'affinage des informations sémantiques de la base en partant de la relation 0 pour la génération du nuage et en introduisant des relations plus spécifiques, il est possible de renforcer des relations déjà existantes et d'en introduire de nouvelles relations en se servant des stratègies spécifiques à des relations ou plus précisement à des paires de relations. 551 552 Pour la synonymie, il est intéressant d'explorer les possibilités d'un nuage créé à partir d'un synonyme d'un synonyme ou bien d'un synonyme d'un synonyme d'un synonyme. De même, pour l'antonymie, un synonyme d'un antonyme ou un antonyme d'un synonyme. Le résultat est parfois très bon, parfois complètement inutile à cause de la polysémie d'un mot intermédiaire dont on se sert comme pivot. 553 554 On peut parfois faire des observations et des constatations lors de telles expériences. Par exemple, pour la relation 8, "Un spécifique de 'mc' est 'mn'", on peut générer le nuage en créant un spécifique d'un générique d'un spécifique. Pour le mot 'véhicule', cela pourrait donner 'bus', qui pourrait donner 'mode de transport', qui pourrait donner 'train', 'avions', 'bicyclette'. Ou bien, deuxième cas de figure, 'véhicule' nous donne 'scooter' qui nous donne 'deux-roues'. Ce qui est intéressant est que, dans les deux cas, les termes génériques pourraient éventuellement générer des nuages qui sont des sous-ensembles l'un de l'autre~: Est-ce que tout deux-roues est un véhicule~? Est-ce que tout 'véhicule' est un 'mode de transport'. Si ce fait est établi, il serait possible de le prendre en compte dans le réseau lexical. 555 556 Pour conclure, les expériences menées dans le paquetage TALN ont été très enrichissantes dans l'interaction entre l'homme et la machine. Ayant des connaissances linguistiques, il est très intéressant de partir d'une idée, de lancer un algorithme avec un grand nombre de données, d'avoir les résultats instantanément puis d'en faire de déductions,\footnote{telles que celles de la relation 8 décrites dans le paragraphe précédent} ensuite, de modifier l'algorithme grace à ce que l'algorithme précédent nous a appris. En effet, l'homme apprend de la machine, et la machine 'apprend' de l'homme, qui modifie ses algorithmes. Ces expériences nous permet d'apprendre des faits sur la langue et le langage qui ne serait pas possible sans l'outil informatique que nous avons à notre disposition aujourd'hui. 557 558 \pagebreak 559 560 \section{Conception et Réalisation} 561 562 \subsection{Outils} 563 564 Notre projet s'est découpé en deux grosses parties. La première partie, la \og{}partie serveur\fg{}, permet de réaliser des actions sur l'ensemble de la base de données (génération de parties, validation de parties\ldots), 565 la réalisation de celle-ci s'est fait principalement en PHP, l'autre étant du SHELL. 566 La seconde partie, la \og{}partie client\fg{}, permet à l'utilisateur de pouvoir interagir avec le serveur, de pouvoir jouer à PtiClic. On verra que le premier prototype a été réalisée en Java en utilisant le framework \android{} alors que la deuxième version a été réalisée en HTML5 et JavaScript. 567 568 \subsubsection{PHP} 569 Nous avons utilisé PHP pour la création du serveur. PHP est un langage impératif, il dispose aussi depuis la version 5 de fonctionnalités objet, mais nous ne les avons pas utilisées dans notre projet. Outil par excellence pour produire des pages Web dynamiques, c'est pour cette raison que nous l'avons utilisé dans notre projet. C'est un langage souple, multiplateforme, libre et gratuit. 570 Nous avons utilisé PHP pour la création de notre site Web \url{http://www.pticlic.fr} ainsi que pour la génération de partie, à savoir la création, la génération, l'envoi et la récupération de parties PtiClic. 571 572 \subsubsection{SHELL} 573 Nous nous sommes servi aussi du langage SHELL. Ce langage est surtout utilisé pour l'initialisation du serveur lors de son installation sur un serveur. Son but, pour notre projet, est de récupérer la dernière archive de la base de données, de convertir cette archive en SQL et de peupler la base de données. 574 575 \subsubsection{SQLite3} 576 SQLite est une bibliothéque, écrite en C, qui propose un moteur de base de données relationnelle accessible par le langage SQL. Contrairement aux serveurs de bases de donnée traditionnels comme MySQL ou PostgreSQL, sa particularité est de ne pas reproduire le schéma habituel client-serveur mais d'être directement intégrée aux programmes. L'intégralité de la base de données est stockée dans un fichier indépendant de la plateforme. Le code source de SQLite est dans le domaine public, ce qui permet son utilisation sans restrictions aussi bien dans les projets open source que dans les projets propriétaires. 577 578 \subsubsection{Java} 579 La partie client du projet a été réalisée en Java. Ce langage est le langage le plus utilisé dans le monde par les développeurs. Java reprend en grande partie la syntaxe du langage C++, néanmoins il a été épuré des concepts les plus déroutants de C++ tels que les pointeurs, les références et l'héritage multiple. La grande spécificité de ce langage est sa portabilité. En effet, lors de la compilation, un \emph{bytecode} est généré et celui-ci est ensuite lu par une machine virtuelle dépendante de la platforme utilisée. 580 581 \subsubsection{HTML5, JavaScript et JQuery} 582 583 La deuxième version de l'application, écrite en HTML5, utilise le langage JavaScript pour l'interaction avec l'utilisateur. La bibliothèque JQuery a été lourdement utilisée pour abstraire l'interface DOM\footnote{Document Object Model} fournie par le navigateur pour interagir avec le document HTML. Cette bibliothèque, qui est extensible, permet entre autres de manipuler facilement des collections entières d'éléments pour les modifier en même temps, de faire des requêtes complexes sur le document pour en récupérer une portion destinée à être manipulée et 584 fournit aussi une couche d'abstraction pour les requêtes réseau asynchrones et la manipulation de données au format JSON\footnote{JavaScript Object Notation}, qui est le format utilisé dans les échanges entre le client et le serveur. Dans le cadre de ce projet, nous avons été amenés à écrire plusieurs petites extensions à la bibliothèque JQuery, ce qui a été à chaque fois une tâche relativement aisée, vérifiant ainsi l'extensibilité de cette bibliothèque. 585 586 \subsubsection{Gestionnaire de versions~: Git et GitHub} 587 588 Pour synchroniser nos efforts sur le projet, nous avons utilisé le gestionnaire de versions distribué Git et hébergé notre projet sur la plateforme GitHub. Un des avantages d'un gestionnaire de version distribué par rapport à un gestionnaire de versions centralisé tel que SVN est qu'il n'y a pas besoin d'un serveur central pour synchroniser deux copies du projet. Ainsi, nous avons pu partager nos modifications via une clé usb, même dans des lieux avec une connectivité réduite, comme l'Université Montpellier II où nous avons régulièrement travaillé. 589 De plus, Git possède un algorithme de résolution des conflits d'édition beaucoup plus efficace que celui de SVN, ce qui nous a permis de développer certaines fonctionnalités dans des branches séparées et de les fusionner par la suite avec la branche principale sans avoir à craindre une fusion manuelle des deux branches. 590 591 Une autre fonctionnalité appréciable de Git est que chaque «clone» d'un dépôt conserve tout l'historique du projet, si bien qu'un crash du serveur n'impacte pas du tout le projet~: on met en place un autre serveur sur lequel on envoie une copie du projet et tout fonctionne comme avant. 592 593 Nous avons choisi la plateforme d'hébergement GitHub pour la facilité de la mise en place d'un dépôt Git (quelques clics suffisent), sa disponibilité élevée par rapport à un serveur personnel et parce que nous avions déjà utilisé cette plateforme avec succès dans d'autres projets. 594 595 Github offre des fonctionalités supplémentaires telles que des graphes permettant de visualiser l'avancement du projet, un outil de rapport de bug et un wiki pour la documentation. Nous n'avons cependant pas utilisé ces deux dernières fonctionnalités, préférant un simple fichier texte pour garder une trace des bugs à corriger et des tâches à effectuer. Une des raisons motivant ce choix est qu'un des membres du groupe possède un ordinateur relativement peu performant et une connexion à Internet très peu fiable, qui rendent l'utilisation de ces services difficile voire impossible lors des fréquentes coupures du réseau. 596 597 598 \subsubsection{Environnement intégré de développement~: Eclipse} 599 Eclipse est un environnement intégré de développement extensible et polyvalent permettant de créer des projets mettant en oeuvre un très grand nombre de langages de programmation. Il est écrit en Java, et c'est avec ce langage que l'on peut créer de nouvelles extensions. La grande force de cet environnement est qu'il est développé autour des plugins pour pouvoir l'étendre. 600 Son choix d'utilisation vient aussi du fait qu'il est présent sur les ordinateurs de l'Université Montpellier II. 601 602 \subsubsection{\android{}} 603 \android{} est un système d'exploitation open source pour smartphones. Pour ce TER nous avons donc utilisé le framework proposé par Google, pour le developpement d'application sur ce SE.\footnote{Système d'Exploitation} Il est basé sur le langage Java, ce qui permet un apprentissage plus aisé du fait que Java est le langage de programmation le plus utilisé dans le monde. 604 605 \android{} est un système d'exploitation pour téléphone mobile basé sur le noyau Linux développé par \android{} Inc., racheté par Google en 2005. Google et d'autres membres du Open Handset Alliance ont par la suite contribué à son développement et le \android{} Open Source Project (AOSP) est chargé de la maintenance et l'évolution d'\android{}. Ce système d'exploitation est utilisé notamment dans des smartphones, appelés aussi ordiphones, «terminaux de poche» ou «téléphones intelligents», produits et distribués par un grand nombre de fabriquants de téléphones mobiles. Le nombre de téléphones mobiles intégrant le système d'exploitation d'\android{} a crû sensiblement récemment. 606 607 Un grand nombre de développeurs ont créé des applications pour étendre la fonctionnalité des téléphones sous \android{} et il y a aujourd'hui 608 plus de 200~000 applications disponibles sur Android Market. Bien qu'\android{} Market soit le magasin en ligne opéré par Google, il existe d'autres distributeurs 609 d'applications \android{}. La majorité des applications sont écrites en Java, bien qu'il soit possible de développer des applications en 610 Python, en Ruby et d'autres par le biais du \android{} Scripting Environment. 611 612 \paragraph{Software Development Kit (SDK)} 613 Le SDK d'\android{} posséde un grand nombre de classes et de paquetages sur l'ensemble des fonctionnalités proposées par les périphèriques embarquant ce SE. On peut par exemple trouver un paquetage spécialisé dans les accès réseau, bluetooth ou pour la géolocalisation. Le developpement avec ce framework repose sur le modèle MVC\footnote{Model View Controller}. Les modèles de cette architecture sont principalement représentés avec des classes simple héritant directement de \verb!java.lang.Object!. Les contrôleurs, eux, héritent de la classe \verb!android.app.Activity! ou d'une de ses classes enfants. Quant aux vues, elles sont représentées au format XML. 614 La connexion entre les contrôleurs et les vues est réalisée grâce à la methode \verb!public View findViewById (int id)! de la classe \verb!android.app.Activity!, qui parcours l'arbre XML pour récuperer l'objet correspondant à l'id passé en paramétre. 615 616 \paragraph{Developper Toolkit (ADT) Plugin} 617 L'ADT est un plugin développé par Google pour faciliter le developpement d'application \android{} avec Eclipse. Il propose un menu permettant de créer des projets de type \android{} déjà parametrés selon les besoins, mais aussi un gestionnaire d'emulateur, une disposition (au sens d'Eclipse) DDMS\footnote{Dalvik Debug Monitor Server} permettant de contrôler l'emulateur\dots{} 618 619 620 621 \subsection{Vue d'ensemble} 622 623 \subsubsection{Cahier des charges initial} 624 Avant le début du projet, nous avions planifié l'implémentation des fonctionnalités souhaitées de notre application. Le déroulement du travail devait s'effectuer en quatre itérations, décrites ci-dessous. Chaque itération comprenait 2 semaines pour l'implémentation des fonctionnalités, une semaine pour d'éventuelles améliorations ou pour 625 implémenter des détails que nous n'aurions pas eu le temps d'implémenter et une semaine pour corriger les bugs signalés lors des alpha-tests. Après chaque itération, nous devions livrer une version stable aux alpha-testeurs, pour un alpha-test de deux semaines. 626 627 \begin{itemize} 628 \item Itération 1 629 \begin{itemize} 630 \item Serveur capable de générer les parties (choix du mot central et des mots du nuage). 631 \item Application \android{} qui récupère une partie, et permet d'y jouer. 632 \item Gestion des logins/mot de passe. 633 \end{itemize} 634 \item Itération 2 635 \begin{itemize} 636 \item Ajout de niveaux de difficulté sur les parties. 637 \item Mode «Marathon»~: faire la plus longue partie possible avec un maximum de $n$ fautes. 638 \item Mode «Shoot'em up»~: Une seule relation et tous les mots du nuage affichés en même temps. L'utilisateur doit cliquer sur les mots qui appartiennent à cette relation puis indiquer qu'il a terminé. Ce mode est assez proche conceptuellement du fonctionnement original de PtiClic. 639 \end{itemize} 640 \item Itération 3 641 \begin{itemize} 642 \item Thèmes pour l'apparence et pour des questions d'accessibilité~: modification des couleurs et des tailles des éléments. 643 \item Intégration d'un réseau social pour promouvoir l'application. 644 \item Mode de jeu «Multijoueur»~: Deux joueurs jouent à la même partie et leurs scores sont comparés. 645 \end{itemize} 646 \item Itération 4 647 \begin{itemize} 648 \item Mode de jeu «Thématique»~: Après avoir choisi un thème (Noël, Saint Valentin, etc.), on propose à l'utilisateur des parties avec des mots centraux au thème en question. 649 \item Mode de jeu «Chrono»~: une seule relation, les mots du nuage apparaissent et disparaissent assez rapidement, obligeant l'utilisateur à cliquer sur la relation uniquement pour les mots qui y appartiennent, autrement le mot va implicitement à la poubelle. Ce mode nécessitait d'implémenter la possibilité de mettre en pause le jeu étant donné que le temps y a une importance. 650 \item Interface vocale, pour améliorer l'accessibilité de l'application. 651 \end{itemize} 652 \end{itemize} 653 654 655 Le diagramme de Gantt en annexe \ref{sec:gantt-original} présente l'ordonancement et l'affectation des tâches de chacunes des itérations. 656 657 L'itération 1 a pris plus de temps que prévu car nous ne savions pas que le code et d'autres aspects de l'existant ne nous seraient pas fournis au moments où nous avons effectué le diagramme de Gantt. Les difficultés en partant d'une simple archive de base de données nous a demandé une grande réflexion (voir la partie \ref{sec:difficultes}). 658 659 Entre autres, nous avons passé du temps à améliorer et régler les paramètres de l'algorithme de génération de parties, étant donné que l'algorithme naïf entamé vers les stades initiaux de réalisation donnait des résultats assez mauvais. 660 661 Nous avons dû aussi effectuer les améliorations suivantes à la partie serveur de l'application~: 662 \begin{itemize} 663 \item Refus d'enregistrer les réponses pour une partie si elle a déjà été jouée afin de prévenir les tentatives de tricherie de la part des joueurs 664 \item Protocole de transmission des erreurs entre le serveur et le client, par exemple lorsqu'un paramètre manque à la requête, ou lors d'un accès à une partie inexistante. 665 \end{itemize} 666 667 En outre, nous pensions initialement fournir directement l'application aux alpha-testeurs, mais étant donné la nécessité d'avoir les noms d'utilisateurs 668 et des mots de passe dans la base, il semblait peu avantageux de gérer ces points manuellement. Nous avons aussi dû créer un site Web à destination 669 des utilisateurs, pour qu'ils puissent s'inscrire, télécharger l'application comprenant des explications sur la procédure d'installation). Aussi, à la fin de l'itération 1, après notre première livraison alpha-testeurs, et après l'accord de notre tuteur, nous avons radicalement changé le cahier des charges~: 670 671 \begin{itemize} 672 \item Itération 1 673 \begin{itemize} 674 \item Serveur robuste capable de générer les parties d'une qualité acceptable 675 \item Application \android{} qui récupère une partie et permet d'y jouer avec un écran permettant aux utilisateurs de configurer 676 l'application (adresse du serveur, login et mot de passe) 677 \item Gestion des logins/mot de passe sur le serveur et le client 678 \item Site Web de présentation du projet 679 \end{itemize} 680 \item Itération 2 681 \begin{itemize} 682 \item Passage d'une version native à une version Web «Précédent» pour pouvoir toucher plus d'utilisateurs, inspirée aussi du fait que l'environnement de développement ADT est très contraignante 683 \item Ajout d'un bouton «j'aime» ou «j'aime pas» permettant aux joueurs d'avoir des «amis» etc. 684 \item Outil de création manuelle de parties accessible aux joueurs sur le site avec les extensions du serveur nécessaires 685 \item Pousser plus loin la recherche sur les méthodes de création de parties et étude de la base du point de vue linguistique et TALN 686 \end{itemize} 687 \end{itemize} 688 689 Globalement, nous avons donc réduit le nombre de fonctionnalités à implémenter, tout en étoffant celles que nous avons conservé, afin 690 d'éviter d'avoir une application offrant une multitude de fonctionnalités qui seraient implémentées de manière superficielle. 691 692 Comme une vue égal une activité si l'on veux que notre application présente plus d'une fenêtre il faut pouvoir lancer d'autre activité, et pouvoir revenir à la précédente. Pour ce faire une activité peut lancer une sous-activité qui sera empiler pour afin de pouvoir revenir à la précédente activité une fois celle-ci achevé. L'envoie de paramétres d'une activité à une autre est réalisé par les «Intention» (Intent). 693 694 695 696 % TODO~: Factoriser ce qui suit en avant, apres et mettre la section du dessus entre les parties factoriser. Bertrand 697 698 \subsubsection{Le premier prototype} 699 700 La première version de l'application était une application native, c'est-à-dire qu'elle fût réalisée entiéremenent en Java avec le framework \android{}. Comme on peut le voir sur la figure \ref{fig:archi-proto1}, l'application est composée de plusieurs parties. Tout d'abord, au lancement de l'application, l'activité «Ecran principal» est lancée. Cette activité permet la navigation dans l'application, à savoir la navigation entre les différentes vues que possédent l'application. Ces autres vues sont «Préférences», qui comme son nom l'indique permet d'afficher les préférences, «Jeu», qui permet de joué, et «Score» et «A propos», qui donne des informations concernant le jeu. 701 Nous avons aussi dans cet architecture des classes métiers permettant de réaliser des actions sur le réseau et de sauvegarder les préférences de l'utilisateur dans le téléphone. 702 703 704 705 \begin{figure}[h!] 706 \begin{center} 707 \begin{tikzpicture}[ 708 bend angle=10, shorten >=0.05cm, shorten <=0.05cm, text height=0.35cm, 709 communication/.style={draw,dashed,<->} 710 ] 711 712 \node[draw] (appli) {Application \android{}}; 713 % Pour que l'animation ne bouge pas. 714 \path[use as bounding box] (-5.2,0.4) rectangle (5.2,-5.1); 715 716 \path node[draw,below=of appli] (frontpage) {Écran principal}; 717 \path[draw,->] (appli) -- (frontpage); 718 719 \path node[draw,below=of frontpage, anchor=north east, xshift=-0.3cm] (game) {Jeu}; 720 \path[draw,->] (frontpage) -- (game); 721 722 \path node[draw,left=of appli] (prefs) {Préférences}; 723 724 \path node[draw,below=of prefs,xshift=0.1cm] (reseau) {Réseau}; 725 \path[communication] (game) -- (prefs); 726 \path[communication] (game) -- (reseau.south east); 727 728 \path[draw,->] (game.south west) ++ (0,0.35cm) arc (90:360:0.35cm); 729 730 \path node[draw,below=of frontpage, anchor=north west, xshift=0.3cm] (score) {score}; 731 \path[draw,->] (game) -- (score); 732 733 \path[draw,->] (score) -- (frontpage); 734 735 \path node[draw,below left=of frontpage] (prefs-screen) {Préférences}; 736 \path node[draw,below right=of frontpage] (about) {À propos}; 737 \path[draw,->] (frontpage) -- (prefs-screen); 738 \path[draw,->] (frontpage) -- (about); 739 \path[communication] (prefs-screen.north west) to[bend left] (prefs.south west); 740 \path[communication] (prefs-screen) -- (reseau); 741 \end{tikzpicture} 742 \end{center} 743 \caption{Architecture du premier prototype} 744 \label{fig:archi-proto1} 745 \end{figure} 746 747 \subsubsection{Modification du cahier des charges} 748 749 A la fin de la première iteration, nous avons décidé de ne plus utiliser le système de création de vues proposé par le SDK d'\android{} car, 750 pour nous, la création de vues en passant par le format proposé nous prenait énormement de temps à réaliser. \android{}, supportant le framework WebKit 751 ainsi que JavaScript dans son integralité, et notre groupe ayant un peu plus d'expérience dans le développement d'application Web de par 752 notre formation, nous avons décidé de développer les vues de l'application PtiClic en HTML5/JavaScript. De ce fait, l'application à été 753 simplifiée -- en une seule activité -- et une classe \verb!JavascriptInterface! réalisant un pont entre le code JavaScript et les fonctionnalitées du 754 téléphone à été ajoutée. 755 756 Un autre avantage à l'utilisation d'une application Web pour développer PtiClic est le public visé. En effet, le 757 but de ce jeu étant de récupèrer des données d'un grand nombre d'utilisateurs, fournir l'application à d'autres personnes que celles 758 disposant d'un smartphone sous \android{} nous a semblé donc interressant. En effet, la version HTML5 est jouable à partir de n'importe quel navigateur Web, que ce soit un ordinateur classique ou un smartphone. 759 760 761 \subsubsection{Le deuxième prototype} 762 Pour le deuxième prototype, nous avons radicalement changé la manière dont nous avons traité les vues de notre application. L'utilisation du framework WebKit nous a permis de simplifier grandement notre application sous smartphone. 763 764 Comme vous pouvez le constater sur la figure \ref{fig:archi-proto2}, nous disposont à présent d'un gros module traitant tout les détails de l'application (jeu, score, information). Nous avons tout de même gardé la gestion des préferences sur le téléphone car le système sous \android{} était plus facile à utiliser que la réalisation de notre propre système de préférences, qui aurait pu utiliser par exemple le cache ou les cookies. % TODO~: Georges peut tu confirme~? 765 La communication entre le code Javascript de l'application et les préferences du téléphone se fait par le biais d'une classe Java injectée dans l'espace de nom global du code Javascript. 766 767 768 \begin{figure}[h!] 769 \begin{center} 770 \begin{tikzpicture}[ 771 bend angle=10, shorten >=0.05cm, shorten <=0.05cm, text height=0.35cm, 772 communication/.style={draw,dashed,<->} 773 ] 774 775 \node[draw] (appli) {Application \android{}}; 776 % Pour que l'animation ne bouge pas. 777 \path[use as bounding box] (-5.2,0.4) rectangle (5.2,-5.1); 778 779 \path node[draw,left=of appli] (prefs) {Préférences}; 780 781 \node[below=of appli, text height=0.25cm, minimum width=2cm] (fake-webkit) {\phantom{Webkit}}; 782 \path node[draw,below=of fake-webkit, text height=1.5cm, minimum width=2cm, text centered] (html5) {\shortstack{Html5\\JavaScript\\JQuery\\CSS}}; 783 784 \path[draw,->] (html5.south east) ++ (0,0.35cm) arc (90:-180:0.35cm); 785 786 \path node[draw,below=of appli, text height=0.25cm, minimum width=2cm] (webkit) {Webkit}; 787 \path[draw,->] (appli) -- (webkit); 788 \path[draw,->] (webkit) -- (html5); 789 790 \path node[coordinate] (waypoint) at ($0.5*(webkit.center)+0.5*(webkit.west)$) {}; 791 \path[communication] (html5) to[controls=(waypoint) and (waypoint)] node[pos=0.16, anchor=east, xshift=-0.1cm, font=\small] {Interface JavaScript} (prefs.south east); 792 \end{tikzpicture} 793 \end{center} 794 \caption{Architecture du second prototype} 795 \label{fig:archi-proto2} 796 \end{figure} 797 \pagebreak 798 799 \subsection{Base de données} 800 801 Le schéma relationnel suivant a été modélisé à partir des informations de l'archive de la base de données d'origine et nos besoin en matière d'authentification et de sécurité côté serveur~: 802 803 804 {\footnotesize 805 NODE(\underline{eid}, name, \#type, weight) \\ 806 RELATION(\underline{rid}, \#start, \#end, \#type, weight) \\ 807 TYPE\_NODE(\underline{num}, name) \\ 808 TYPE\_RELATION(\underline{num}, name, extended\_name, info) \\ 809 USER(\underline{login}, mail, hash\_passwd, \#score, ugroup, cgCount) \\ 810 GAME(\underline{gid}, \#eid\_central\_word, \#relation\_1, \#relation\_2, difficulty, author, nb\_like, nb\_dislike) \\ 811 GAME\_CLOUD(\underline{gid, num}, difficulty, \#eid\_word, totalWeight, probaR1, probaR2, probaR0, probaTrash) \\ 812 PLAYED\_GAME(\underline{pgid, \#login}, \#gid, timestamp, like) \\ 813 PLAYED\_GAME\_SEQUENCE(\underline{id}); \\ 814 PLAYED\_GAME\_CLOUD(\underline{\#pgid, \#gid, \#login, num}, type, \#relation, weight, score) \\ 815 COLON\_NODES(\underline{eid}) \\ 816 RANDOM\_CLOUD\_NODE(\underline{eid}, nbneighbors) \\ 817 RANDOM\_CENTER\_NODE(\underline{eid}) \\ 818 USER\_INFO(\underline{\#user, key}, value) \\ 819 } 820 821 Si nous reprenons nos deux petits exemples d'entrées NODE et RELATION de l'archive de la base de données, il devient clair que les tables NODE et 822 RELATION y correspondent strictement à la structure d'origine~: \verb!eid=231064:n="pour femme":t=1:w=50!, où «eid» correspond à «EID», $n$ à 823 «name», $t$ à «type» et $w$ à «weight» de la table NODE de notre base~; \verb!rid=430049:n1=82029:n2=151553:t=12:w=18! où $rid$ correspond à «rid», 824 $n_1$ à «start», $n_2$ à «end», $t$ à «type» et $w$ à «weight» de la table RELATION de notre base. 825 826 827 \subsection{Le modéle MVC d'\android{}} 828 Pour le développement d'application sur mobile, Google propose d'utiliser le patron de conception MVC. On peut trouver sur Internet une multitude d'implémentation d'MVC, Google n'echappe pas à la régle en proposant 829 le sien (voir figure \ref{fig:MVC}). 830 La particularité du modèle MVC de Google tient au tour du principe d'activité. En effet les écrans des téléphones portables étant bien plus petits que ceux de nos ordinateur, il faut pouvoir adpter l'interface des applications. Pour ce faire il existe 831 sous \android{} le concepte d'«activité». 832 Une activité représente une sous application, c'est-à-dire qu'une application est représentée par plusieurs vues affichants les informations importantes que le développeur veut montrer à l'utilisateur. Autrement dit, à une vue 833 correspond une activité. 834 835 \begin{figure}[h!] 836 \begin{center} 837 \begin{tikzpicture}[bend angle=10, shorten >=0.1cm, shorten <=0.1cm] 838 \node[draw] (activite) {Contrôlleur (Activité)}; 839 \node[draw,below right=of activite, anchor=east, xshift=1cm] (modele) {Modèle}; 840 \node[draw,below left=of activite, anchor=west, xshift=-1cm] (xml) {Vue (XML)}; 841 \draw[->] (activite.east) ++(0,+.1cm) to[out=0, in=90] ($(modele.north)+(+.1cm,0)$); 842 \draw[<-] (activite.east) ++(0,-.1cm) to[out=0, in=90] ($(modele.north)+(-.1cm,0)$); 843 \draw[->] (activite.west) ++(0,+.1cm) to[out=180, in=90] ($(xml.north)+(-.1cm,0)$); 844 \draw[<-] (activite.west) ++(0,-.1cm) to[out=180, in=90] ($(xml.north)+(+.1cm,0)$); 845 \end{tikzpicture} 846 \caption{Le modéle MVC proposé par Google} 847 \label{fig:MVC} 848 \end{center} 849 \end{figure} 850 851 Comme une vue se traduit par une activité, si l'on veux que notre application présente plus d'une fenêtre, il faut pouvoir lancer d'autres activités et pouvoir revenir à la précédente. Pour cela, une activité peut lancer une sous-activité qui sera empilée pour afin de pouvoir revenir à la précédente activité une fois la sous-activité achevée. L'envoie de paramétres d'une activité à une autre est réalisé par les «Intention»\footnote{'intent' en anglais.}. 852 853 854 855 856 \subsection{Site Internet} 857 858 Lorsqu'une nouvelle application ou jeu est développé, il est essentiel de faire connaître l'application. 859 La communication est une étape fondamentale dans la chaîne de création d'une application et la création d'un jeu n'en fait pas exception. 860 Internet est devenu un support de communication très important et très influant qui permet de faire découvrir aux 861 personnes qui l'utilise un grand nombre de nouveaux produits. Il permet également dans certain cas d'influencer son public. 862 L'outil Internet, et plus particulièrement de développement d'un site Web, s'est révélé la solution adaptée à nos besoins. 863 864 Le site Internet est une vitrine de notre application. Il permet de présenter notre projet et le jeu sur la plateforme \android{}. 865 866 Si on veut faire passer un message clair et précis, le support de communication doit également être clair, intuitif et ergonomique. Le site Internet 867 doit par conséquent être constitué d'un nombre limité de pages aérée, chacune des pages ciblant un thème important et ayant donc un objectif bien précis. 868 869 \begin{center} 870 \includegraphics[width=14cm]{img/siteAccueil.png} 871 \end{center} 872 873 Dans les parties suivantes, les différentes pages de notre site seront décrites. 874 875 876 877 \subsubsection{Téléchargement} 878 879 \begin{center} 880 \includegraphics[width=14cm]{img/siteTelechargement.png} 881 \end{center} 882 883 La page 'Téléchargement' contient des instructions pour installer l'application Android de PtiClic. L'application peut être télécharger directement à partir d'un téléphone ou bien par le biais d'un ordinateur classique. 884 885 Quant à la version HTML5, aucune installation est nécessaire, mais il est nécessaire de s'inscrire et s'authentifier afin d'y jouer. 886 887 \subsubsection{L'inscription} 888 Si une personne est intéressée par notre jeu et qu'il souhaite y jouer, il devra tout d'abord s'inscrire afin qu'il 889 soit reconnu par le système. Cette opération est réalisée à partir du site à l'aide d'un formulaire comportant 890 trois informations obligatoires~: 'nom d'utilisateur', 'mot de passe' et 'mail'. Le formulaire se limite à champs (deux champs 'mot de passe') pour éviter de décourager les utilisateurs de s'inscrire. 891 892 \begin{center} 893 \includegraphics[width=14cm]{img/siteInscription.png} 894 \end{center} 895 896 L'inscription se réalise la première fois qu'un internaute souhaite jouer au jeu~; lorsque l'on essayé de jouer au jeu sans être authentifié, on est invité soit à s'identifier soit à s'inscrire et l'utilisateur choisit selon le cas qui lui convient. L'inscription, une fois faite, définitive, permet aux utilisateurs de jouer librement et peuvent comparer leur performances à d'autres joueurs. 897 898 \subsubsection{Contact} 899 Pour qu'une application soit en accord avec ses utilisateurs, il faut un certain temps et apporter un certain nombre 900 de modifications pour répondre à la demande et aux besoins de l'utilisateur final. Dans le but de récupérer les avis positifs et négatifs, les remarques et les critiques des utilisateurs, un formulaire de contact est disponible sur le site. 901 902 \begin{center} 903 \includegraphics[width=14cm]{img/siteContact.png} 904 \end{center} 905 906 Ce formulaire est accessible sans inscription, ce qui permet d'envoyer un message s'il y a un problème lors de l'inscription au l'authentification, pour signaler un bogue concernant le site ou pour faire d'autres commentaires d'ordre général. 907 908 \subsubsection{La création de parties} 909 Un algorithme automatique de création de parties permet de créer un grand nombre de parties. Cependant, ce moyen 910 de génération de partie est assez limité et donne régulièrement des résultat trop peu satisfaisant voire même incohérents. 911 912 Pour palier à ce problème, une solution est de mettre en place un service permettant non pas à la machine, mais à des joueurs de créer eux-même des parties. Grâce à cette page, il est dorénavant possible d'obtenir des parties bien plus intéressantes, des parties qui contiennent un lexique spécifique à un domaine bien précis si le joueur est spécialiste d'un domaine précis ou bien des parties contenant de l'humour, par exemple. 913 914 915 \begin{center} 916 \includegraphics[width=14cm]{img/siteCreerParties.png} 917 \end{center} 918 919 Cette page permet de créer des parties de taille et de thèmes variés. Les joueurs peuvent choisir des mots ou des expressions qu'ils souhaitent voir dans une partie ainsi que deux relations principales. 920 Outre l'attractivité et l'intérêt de cette fonctionnalité, le joueur est mis en valeur du fait qu'il participe non seulement en tant que joueur, mais en tant que contributeur au projet. Les parties ainsi créées sont jouées par d'autres joueurs, améliorent la qualité des parties et le créateur et il serait même envisageable dans une future version de l'application de tenir le créateur de la partie au courant des joueurs qui ont joué sa partie et les scores obtenus. 921 922 La partie création de partie a été développé en JavaScript au lieu de PHP, ce qui a permis d'avoir une interaction en temps avec l'utilisateur. En effet, lorsqu'un utilisateur saisit un mot ou expression, il est important pour lui de savoir si ce mot existe ou non. De ce fait, une requête est émise en direction du serveur afin de vérifier la validité du mot ou expression saisi. Lorsqu'un utilisateur souhaite créer une nouvelle partie 923 il ne sais pas forcément combien de mots va composer sa partie. Il devra par conséquent être en mesure d'augmenter au besoin le nombre de mots composants la partie. 924 925 \subsubsection{Jouez en ligne~!} 926 La seconde évolution majeure concernant le deuxième prototype du jeu est qu'il est possible de jouer directement depuis 927 le site Internet sans forcément disposer de téléphone sous \android{}. Cette option permet de toucher un public bien plus large sans pénaliser ceux qui disposent d'un smartphone \android{} 928 929 Une page du site Internet sera donc consacrée 930 à la création manuelle de partie. Elle permetra de créer des parties de taille variée et de thème différents. Le joueurs pourra 931 indiquer les mots qu'il souhaites voir dans la partie ainsi que les deux relations principales. 932 Les parties ainsi créées pourront être jouées par les autres joueurs et permettrons d'améliorer l'attractivité et l'intérêt du jeu. 933 934 935 \subsection{Version html5 du jeu} 936 \label{sec:html5} 937 \subsubsection{Architecture} 938 939 La version HTML5 du jeu comporte 6 écrans~: 940 \begin{itemize} 941 \item Le «splash» au démarrage; 942 \item L'éran d'accueil, avec des liens vers les 4 autres (sauf score); 943 \item L'écran du jeu, avec le mot central, le mot du nuage et les quatre relations; 944 \item Le score, affiché à la fin de la partie; 945 \item Les préférences, qui permettent de choisir le thème de couleurs de l'application; 946 \item L'écran de connexion, sur lequel on peut se rendre depuis l'écran d'accueil, et qui s'affiche automatiquement lorsqu'on tente de faire 947 une action (jouer ou modifier les préférences) sans être connecté; 948 \item L'écran «À propos», qui explique l'origine du jeu. 949 \end{itemize} 950 951 952 953 \begin{figure}[h!] 954 \centering 955 \includegraphics[width=0.3\textwidth]{img/phone-splash.png} 956 \caption{Le «splash» au démarrage} 957 \end{figure} 958 959 \begin{figure}[h!] 960 \centering 961 \includegraphics[width=0.3\textwidth]{img/phone-frontpage-deco.png} 962 \caption{L'éran d'accueil, avec des liens vers les quatre autres (sauf score)} 963 \end{figure} 964 965 \begin{figure}[h!] 966 \centering 967 \includegraphics[width=0.3\textwidth]{img/preterit02.jpg} 968 \caption{L'écran du jeu, avec le mot central, le mot du nuage et les quatre relations} 969 \end{figure} 970 971 \begin{figure}[h!] 972 \centering 973 \includegraphics[width=0.3\textwidth]{img/phone-score.png} 974 \caption{Le score, affiché à la fin de la partie} 975 \end{figure} 976 977 \begin{figure}[h!] 978 \centering 979 \includegraphics[width=0.3\textwidth]{img/phone-preferences.png} 980 \caption{Les préférences, qui permettent de choisir le thème de couleurs de l'application} 981 \end{figure} 982 983 \begin{figure}[h!] 984 \centering 985 \includegraphics[width=0.3\textwidth]{img/phone-cnx.png} 986 \caption{L'écran de connexion, sur lequel on peut se rendre depuis l'écran d'accueil, et qui s'affiche automatiquement lorsqu'on tente de faire} 987 \end{figure} 988 989 990 \begin{figure}[h!] 991 \centering 992 \includegraphics[width=0.3\textwidth]{img/phone-info.png} 993 \caption{L'écran «À propos», qui explique l'origine du jeu} 994 \end{figure} 995 996 997 Chaque écran est contenu dans un élément HTML (\verb!<div/>!) qui est affiché uniquement lorsque l'utilisateur est sur cet écran. 998 999 La navigation entre les écrans et entre chaque mot du nuage lorsqu'on joue s'effectue en modifiant l'identifiant de fragment 1000 de l'URL, c'est à dire la partie après le \verb!#!. De cette manière, chaque état est stocké dans l'historique du navigateur, et on peut revenir à 1001 l'écran précédant à l'aide des boutons «Précédent» et «Suivant» classiques. De plus, cela permet d'annuler le choix d'une relation pour 1002 un mot donné simplement en cliquant sur «Précédent». 1003 1004 L'état du programme -- écran en cours, thème de couleurs, structure de données représentant la partie en cours lorsqu'elle a été récupérée et de même pour les scores -- est stocké dans une variable nommée \verb!runstate!. Cependant, si l'on considère l'enchaînement d'actions 1005 suivantes, on se rend compte qu'il doit y avoir une décorrelation entre l'état du programme tel que dictée par l'URL et l'état réel du 1006 programme~: 1007 1008 \begin{itemize} 1009 \item L'utilisateur clique sur «Jouer», ce qui l'amène à l'URL \verb!#game!; 1010 \item L'écran de connexion est affiché pour que l'utilisateur s'identifie sans modifier l'URL (pour ne pas enregistrer cette étape 1011 transitoire dans l'historique). 1012 \item Une fois l'utilisateur connecté, la partie commence. 1013 \end{itemize} 1014 1015 Cette décorrelation apporte une certaine complexité au code de transition entre les états du programme, d'autant plus que l'application 1016 effectue des requêtes réseau asynchrones, par exemple pour récupérer la partie durant lesquelles n'importe quelle séquence «Précédent» / 1017 «Suivant» ou de modification arbitraire peut avoir lieu. Ainsi, entre le moment où l'on effectue une requête pour récupérer une nouvelle 1018 partie et le moment où cette requête aboutit, l'utilisateur peut avoir cliqué sur «Précédent», ce qui le ramène à l'écran d'accueil (auquel 1019 cas il ne faut pas afficher la partie lors de la réception), mais il peut aussi après ce «Précédent» faire «Suivant», auquel cas on se 1020 retrouve de nouveau sur l'écran du jeu, et il faut donc afficher la partie lors de sa réception (et ne pas faire une deuxième requête 1021 puisqu'il y en a déjà une en cours). 1022 1023 Pour gérer cela, nous avons implémenté une routine de transition entre les états qui envoie la séquence de messages suivante au nouvel 1024 écran~: 1025 \begin{itemize} 1026 \item «goto», qui envoie le message «leave» à l'écran en cours, met à jour la variable runstate.screen, et communique quelques informations 1027 à l'application hôte en Java sous Android 1028 \item «pre-enter», qui permet à l'écran d'effectuer des requêtes réseau avant son affichage; 1029 \item «enter», qui affiche l'écran, et modifie dynamiquement son contenu si nécessaire (par exemple affichage du texte décrivant les 1030 relations dans l'écran du jeu) 1031 \item «update» appellée une première fois juste après l'affichage de l'écran et à chaque changement d'URL qui ne modifie pas l'écran. Cela 1032 permet par exemple à l'écran du jeu de détecter qu'une réponse a été donnée pour un des mots du nuage et d'afficher le mot suivant. 1033 \end{itemize} 1034 1035 Un changement d'URL déclenche donc soit un «goto», soit un «update», ce qui permet d'afficher l'écran voulu, tandis que les écrans peuvent 1036 s'envoyer les uns les autres ces messages (principalement le message «goto») pour basculer de l'un à l'autre sans modifier l'URL. 1037 1038 \subsubsection{Concepts et techniques de programmation} 1039 1040 Les actions à déclencher lors de la réception du résultat d'une requête réseau ainsi que le cache partiel des parties et des scores (qui 1041 permet de ne pas renvoyer une requête qui est déjà en cours ou a déjà abouti) sont implémentés en utilisant le paradigme de programmation 1042 fonctionelle avec évaluation paresseuse, le côté «évaluation paresseuse» étant émulé en encapsulant le code dans des fonctions anonymes 1043 (lambda fonctions). 1044 1045 Nous avons aussi employé une forme limitée de programmation réactive pour le cache, implémentée via l'objet \verb!Deferred! de JQuery. 1046 1047 Enfin, nous avons utilisé les capactités de JavaScript lui-même, qui est un langage objet basé sur les prototypes (et non les classes) pour 1048 étendre le langage là où cela s'est avéré nécessaire. 1049 1050 \subsubsection{API Client-serveur} 1051 Le client et le serveur utilisent tout deux une API qui permet de facilement remplacer un des deux composants. Tous les appels au serveur se font en HTTP GET et peuvent avoir les deux paramètres \verb!user! et \verb!password!. De plus, elles peuvent renvoyer une erreur au format suivant~: 1052 \begin{alltt} 1053 \{"error":\textit{Code d'erreur}, "msg":\textit{Message d'erreur}, "isError":true\} 1054 \end{alltt} 1055 1056 Voici les principaux messages que supporte le serveur~: 1057 \begin{itemize} 1058 \item Récupérer une partie jouable~: 1059 1060 \verb!server.php?action=0! 1061 { 1062 \small 1063 \begin{alltt} 1064 \{ 1065 \quad"author":"\textit{Créateur de la partie}", 1066 \quad"gid":\textit{Numéro de la partie}, 1067 \quad"pgid":\textit{Numéro de la partie jouable}, 1068 \quad"relations":[ 1069 \quad\quad\{"id":7,"name":"Un contraire de %mc est %mn"\}, 1070 \quad\quad… 1071 \quad], 1072 \quad"center":\{"id":\textit{eid mot central},"name":"\textit{Mot central}"\}, 1073 \quad"cloud":[ 1074 \quad\quad\{"id":\textit{eid mot nuage},"name":"\textit{Mot nuage}"\}, 1075 \quad\quad… 1076 \quad] 1077 \} 1078 \end{alltt} 1079 } 1080 \item Répondre à une partie~: 1081 1082 \verb!server.php?action=1&gid=!\textit{\texttt{numéro de partie}}\verb!&pgid=!\textit{\texttt{numéro de partie}} 1083 1084 Cette requête doit aussi prendre un couple \textit{\texttt{numéro du mot du nuage}}\verb!=!\textit{\texttt{numéro de la relation}} pour 1085 chaque réponse. Elle renvoie la structure suivante~: 1086 { 1087 \small 1088 \begin{alltt} 1089 \{ 1090 \quad"scoreTotal":\textit{Score pour la partie}, 1091 \quad"alreadyPlayed":\textit{true si la partie a déjà été jouée, false sinon}, 1092 \quad"author":\textit{Créateur de la partie}", 1093 \quad"minScore":\textit{Plus petit score pour un mot}, 1094 \quad"maxScore":\textit{Plus grand score pour un mot}, 1095 \quad"newGame":\textit{Nouvelle partie, même format que action=0}, 1096 \quad"scores":[ 1097 \quad\quad\{"name":"\textit{Mot nuage}", "score":\textit{Score pour le mot}\} 1098 \quad] 1099 \} 1100 \end{alltt} 1101 } 1102 1103 \item D'autres actions de moindre intérêt sont disponibles, et permettent de~: 1104 \begin{description} 1105 \item[\verb!action=2!] Déclencher la création automatique de parties 1106 \item[\verb!action=3!] Vérifier si un couple utilisateur/mot de passe est valide 1107 \item[\verb!action=4!] Vérifier si un mot existe dans la base de données 1108 % N°5 : 1109 \item[\verb!action=5!] Récupérer la liste des relations disponibles («fait partie de», «synonyme»…) 1110 \item[\verb!action=6!] Stocker une partie créée manuellement 1111 \item[\verb!action=7!] Récupérer les préférences de l'utilisateur 1112 \item[\verb!action=8!] Modifier les préférences de l'utilisateur 1113 \item[\verb!action=9!] Terminer la session et déconnecter l'utilisateur 1114 % n°10 : 1115 \item[\verb!action=10!] Indiquer si l'utilisateur aime ou non la partie à laquelle il a joué. 1116 \end{description} 1117 1118 \end{itemize} 1119 1120 1121 \subsection{Algorithmes de création du nuage} 1122 1123 (voir aussi la partie 4) 1124 1125 Pour construire le nuage de mots à partir d'un mot central et de deux relations, nous avons étudié les algorithmes suivants. 1126 1127 \subsubsection{Mots à proximité} 1128 \begin{figure}[ht] 1129 \begin{center} 1130 \begin{tikzpicture}[ 1131 mynode/.style = {circle, minimum size=1.5cm}, 1132 mc/.style = {mynode,draw=red,text=red}, 1133 mn/.style = {mynode,draw}, 1134 mi/.style = {mynode,draw=gray,text=gray}, 1135 rel/.style = {font=\footnotesize}, 1136 guess/.style = {->,dashed}, 1137 exist/.style = {->}, 1138 auto,swap 1139 ] 1140 \node[mc] (mc) {Chat}; 1141 \node[mn] (mn0) at (0,3) {Souris}; 1142 \node[mi] (mi1) at (3,-2) {matou}; 1143 \node[mn] (mn2) at (6,0) {animal}; 1144 \node[mn] (mn3) at (-3,-2) {félin}; 1145 \path[exist] (mc) edge[bend right] node[rel]{idée associée} (mn0); 1146 \path[exist] (mc) edge node[rel]{synonyme} (mi1); 1147 \path[exist] (mi1) edge node[rel]{sorte de} (mn2); 1148 \path[guess,swap] (mc) edge node[rel]{sorte de~?} (mn2); 1149 \path[guess,swap] (mc) edge[bend left] node[rel]{\shortstack{sorte de~?\\synonyme~?\\\dots}} (mn0); 1150 \path[exist] (mn3) edge[bend right] node[rel]{spécifique} (mc); 1151 \path[guess] (mc) edge[bend right] node[rel]{sorte de~?} (mn3); 1152 \end{tikzpicture} 1153 \caption{Algorithme de création d'un nuage de mot par sélection des mots proches du mot central.} 1154 \label{fig:algo-proximite} 1155 \end{center} 1156 \end{figure} 1157 1158 Cet algorithme (Fig. \ref{fig:algo-proximite}) sélectionne des mots proches du mot central en empruntant~: 1159 \begin{itemize} 1160 \item La relation «Idée Associée», pour la spécialiser; 1161 \item Des relations qui «entrent» dans le mot central; 1162 \item Un enchaînement de deux relations. Dans ce dernier cas, le fait qu'une des deux relations soit «Sysnonyme» est privilégié. 1163 \end{itemize} 1164 1165 Cet algorithme a donné de bons résultats après que nous ayons filtré les mots centraux pour ne prendre en compte que ceux dont le nombre de 1166 relations sortantes dépassaient un certain seuil, de manière à s'assurer qu'ils auraient suffisemment de liens pour pouvoir construire un 1167 nuage intéressant. De plus, nous avons pondéré la fréquence à laquelle les différentes méthodes (arc avant, arc arrière, enchaînement de 1168 deux arcs) étaient utilisées, de manière à avoir plus de mots du nuage pertinants. 1169 1170 L'avantage de cet algorithme est d'avoir une assez grande couverture du voisinage du mot central et la possibilité de raffiner les 1171 relations («Idée Associée» vers une autre relation par exemple). Un inconvénient est que les relations proposées ne sont pas toujours 1172 pertinantes (relation «sorte de» pour des verbes par exemple). De plus, l'algorithme pourra proposer en déduction de l'enchaînement de deux 1173 relation une relation quelconque, qui ne sera pas forcément logique par rapport aux deux autres. 1174 1175 Pour résoudre ce dernier défaut, nous avons élaboré un autre algorithme. 1176 1177 \subsubsection{Algorithme des «triangles»} 1178 \label{sec:algo-triangles} 1179 \begin{figure}[ht] 1180 \centering 1181 \begin{center} 1182 \begin{tikzpicture}[ 1183 mynode/.style = {circle, minimum size=1.5cm}, 1184 mc/.style = {mynode,draw=red,text=red}, 1185 mn/.style = {mynode,draw}, 1186 mi/.style = {mynode,draw=gray,text=gray}, 1187 rel/.style = {font=\footnotesize}, 1188 guess/.style = {->,dashed}, 1189 exist/.style = {->}, 1190 auto 1191 ] 1192 \node[mc] (mc) {Mot central}; 1193 \node[mi, above right=of mc] (mi) {Intermédiaire}; 1194 \node[mn, below right=of mi] (mn) {Mot nuage}; 1195 1196 \path[draw,->] (mc) edge node {Relation 1} (mi); 1197 \path[draw,->] (mi) edge node {Relation 2} (mn); 1198 \path[draw,->] (mc) edge node[swap] {Relation déduite} (mn); 1199 \end{tikzpicture} 1200 \end{center} 1201 \caption{Une relation déductible grâce aux deux autres} 1202 \label{fig:algo-triangles} 1203 \end{figure} 1204 1205 Cet algorithme (Fig. \ref{fig:algo-triangles}) compte le nombre de «triangles» (cliques composées de trois noeuds) que l'on peut trouver 1206 dans les relations existantes, pour un triplet de relations donné, et le divise par le nombre d'occurences des deux côtés du triangle (du 1207 mot central au mot intermédiaire, et du mot intermédiaire au mot nuage), sans prendre en compte le troisième côté. Cela permet d'associer à 1208 chaque triplet de relations la probabilité qu'on puisse déduire la troisième à partir des deux autres. 1209 1210 La génération du nuage se déroule alors de la manière suivante~: On sélectionne tous les mots que l'on peut atteindre par l'enchaînement de 1211 deux relations, et on les inclue dans le nuage en fonction de la probabilité qu'on puisse déduire une des deux relations de la partie en 1212 utilisant les deux relations empruntées. 1213 1214 Cette technique est équivalente à l'utilisation d'un réseau de neurones (Fig. \ref{fig:reseau-neurones}) pour classifier les mots du nuage 1215 parmi les différentes relations disponibles. 1216 1217 \begin{figure}[ht] 1218 \begin{center} 1219 \begin{tikzpicture}[ 1220 node/.style={draw,ellipse,font=\footnotesize, minimum width=3cm, minimum height=0.7cm}, 1221 hidden/.style={minimum width=4cm} 1222 ] 1223 \node[node,anchor=east] (R1) at (-3.5,1.2) {Type relation 1}; 1224 \node[node,anchor=east] (R2) at (-3.5,-1.2) {Type relation 2}; 1225 \node[node, hidden] (H1) at (0,2.4) {$R1 = 5 \wedge R2 = 5$}; 1226 \node[node, hidden] (H2) at (0,1.2) {$R1 = 5 \wedge R2 = 7$}; 1227 \node[node, hidden] (H3) at (0,0) {…}; 1228 \node[node, hidden] (H4) at (0,-1.2) {$R1 = 22 \wedge R2 = 13$}; 1229 \node[node, hidden] (H5) at (0,-2.4) {$R1 = 22 \wedge R2 = 22$}; 1230 \node[node,anchor=west] (R31) at (3.5,1.2) {Synonyme}; 1231 \node[node,anchor=west] (R32) at (3.5,0) {Contraire}; 1232 \node[node,anchor=west] (R33) at (3.5,-1.2) {…}; 1233 1234 \foreach \hidden in {H1,H2,H3,H4,H5}{ 1235 \draw (R1.east) -- (\hidden.west); 1236 \draw (R2.east) -- (\hidden.west); 1237 } 1238 \foreach \hidden in {H3,H4,H5}{ 1239 \draw (\hidden.east) -- (R31.west); 1240 \draw (\hidden.east) -- (R32.west); 1241 \draw (\hidden.east) -- (R33.west); 1242 } 1243 \draw[draw=green!50!black] (H1.east) edge node[near start,text=green!50!black] {1} (R31.west); 1244 \draw[draw=red] (H2.east) edge node[near start,text=red] {0} (R31.west); 1245 \draw[draw=red] (H1.east) edge node[near start,text=red] {0} (R32.west); 1246 \draw[draw=green!50!black] (H2.east) edge node[near start,text=green!50!black] {1} (R32.west); 1247 \draw (H1.east) -- (R33.west); 1248 \draw (H2.east) -- (R33.west); 1249 \end{tikzpicture} 1250 \caption{Réseau de neurones pour la classification des mots du nuage parmi les relations disponibles, en fonction des arcs qui les 1251 ratachent au mot central.} 1252 \label{fig:reseau-neurones} 1253 \end{center} 1254 \end{figure} 1255 1256 Les probabilités recueillies par l'algorithme décrit ci-dessus correspondent à la valeur de sortie des neurones de la couche interne, et les 1257 types des relations sur les deux premiers arcs correspondent à la fonction d'activation de ces mêmes neurones. Pour chaque type du troisième 1258 arc, on a une catégorie en sortie du réseau de neurones. 1259 1260 Par exemple, sur la figure \ref{fig:reseau-neurones}, sachant que la relation 5 est «Synonyme» et la relation 7 «Contraire», le premier 1261 neurone de la couche interne s'active si les deux relations qui relient le mot central au mot du nuage sont toutes deux «Synonyme». Sa 1262 valeur de sortie pour la catégorie «Synonyme» est alors proche de 1 (le synonyme d'un synonyme est souvent un synonyme), tandis que sa 1263 valeur pour la catégorie «Contraire» est proche de 0 (le contraire d'un synonyme est un contraire, pas un synonyme). 1264 1265 Cet algorithme a donné d'excellents résultats pour les relations qui pouvaient se déduire avec de fortes probabilités, cependant bon nombre 1266 de relations ne s'appliquent à des mots n'appartenant qu'à une partie du discours donnée (nom, adjectif, verbe…), et la probabilité de les 1267 voir apparaître en déduction de deux autres était très faible. 1268 1269 \subsubsection{Algorithme des «triangles» avec les parties du discours} 1270 1271 Nous avons donc élaboré une variante (Fig. \ref{fig:algo-triangles-pos}) de cet algorithme qui prenait en compte les parties du discours 1272 (Part Of Speach) auxquelles appartenaient les noeuds. 1273 1274 \begin{figure}[ht] 1275 \centering 1276 \begin{center} 1277 \begin{tikzpicture}[ 1278 mynode/.style = {circle, minimum size=1.5cm}, 1279 mc/.style = {mynode,draw=red,text=red}, 1280 mn/.style = {mynode,draw}, 1281 mi/.style = {mynode,draw=gray,text=gray}, 1282 rel/.style = {font=\footnotesize}, 1283 guess/.style = {->,dashed}, 1284 exist/.style = {->}, 1285 auto 1286 ] 1287 \node[mc] (mc) {\shortstack{Mot central\\POS 1}}; 1288 \node[mi, above right=of mc] (mi) {\shortstack{Intermédiaire\\POS 2}}; 1289 \node[mn, below right=of mi] (mn) {\shortstack{Mot nuage\\POS 3}}; 1290 1291 \path[draw,->] (mc) edge node {Relation 1} (mi); 1292 \path[draw,->] (mi) edge node {Relation 2} (mn); 1293 \path[draw,->] (mc) edge node[swap] {Relation déduite} (mn); 1294 \end{tikzpicture} 1295 \end{center} 1296 \caption{Une relation déductible grâce aux deux autres} 1297 \label{fig:algo-triangles-pos} 1298 \end{figure} 1299 1300 Le probleme qui s'est alors posé, est que'avec environ 12 parties du discours différentes, et 16 relations différentes, le nombre de 1301 6-uplets distincts dans l'ensemble $POS^3\times Rel^3$ s'élevait à plus de 7 millions. Cela signifie que nous avions plus de 7 millions de 1302 «types» de triangles à considérer, alors que seulement peu d'entre eux montraient une réelle possibilité de déduction. De plus, il n'y a 1303 dans la base de données qu'environ un million de relations existantes, nous nous trouverions donc dans une situation de surapprentissage. 1304 1305 Ce problème montre la nécessité d'étudier manuellement quelles parties du discours ont un intérêt pour quelles relations, afin de réduire 1306 l'espace des 6-uplets constitués des parties du discours des noeuds et des types de relations formant les arcs qui permettent la déduction 1307 du dernier arc. 1308 1309 1310 \subsection{Protection contre les attaques des joueurs} 1311 1312 Le serveur prévient quelques types d'attaques que des joueurs pourraient effectuer pour améliorer leur score. Entre autres, lorsqu'un joueur 1313 a envoyé ses réponses à une partie et que ses scores lui ont été envoyés, la modification des réponses est refusée s'il tente de renvoyer 1314 d'autres réponses. Cela permet d'éviter qu'un joueur améliore son score en donnant les réponses attendues une fois qu'il les connaît. 1315 1316 Nous n'avons cependant pas de protection contre un utilisateur qui donnerait exprès les mauvaises réponses (une forme de SPAM qui influerait 1317 la base de données). La détection de ce comportement est difficile car il est tout à fait possible que les réponses que notre algorithme 1318 estime être les bonnes soient justes et il est tout à fait légitime qu'un utilisateur soit en désacord avec les uns avec les autres. 1319 1320 Dans le cas de l'utilisation d'un robot pour donner en masse de mauvaises réponses, il serait possible de détecter la fréquence élevée des 1321 parties jouées, ce qui n'empêcherait cependant pas un robot de se créer plusieurs comptes pour éviter cette détection. De même que la 1322 détection de courriers indésirables est difficile dans le cadre de la messagerie électronique, la détection de la transmission massive de 1323 mauvaises réponses à notre serveur est compliquée, d'autant plus que peu de données sont transmises pour chaque partie. 1324 1325 \pagebreak 1326 1327 \section{Discussion et conclusion} 1328 \label{sec:difficultes} 1329 1330 Dès le début du projet, nous avons été confrontés à de nombreux problèmes. L'émulateur \android{}, qui devait nous permettre de tester 1331 l'application lors du développement, s'est révélé être extrêmement lent au point d'être inutilisable sur les ordinateurs de plusieurs membres 1332 du groupe. Pour contourner ce problème, nous avons installé l'émulateur sur les machines du RezUFR (bâtiments 5, 6 et 16), mais sa 1333 configuration s'est avérée problématique, ce qui nous a fait perdre beaucoup de temps, pour finalement nous rendre compte que l'installation était plutôt instable. 1334 1335 En ce qui concerne le travail sur le serveur, la tâche a été compliquée par des erreurs de syntaxe (guillemets non échappés, etc.) dans 1336 l'archive de la base de données qui nous a été fournie, ce qui nous a obligés à passer du temps à contourner ces erreurs avant de pouvoir 1337 analyser la base de données. Pour cette analyse, le volume de données à traiter (base de données de plus de 100Mo) nous a ralentis lors de 1338 l'élaboration de l'algorithme de création de parties. 1339 1340 Lors de la construction des requêtes utilisées dans le serveur, nous nous sommes confrontés à d'autres problèmes~: SQLite3 n'est pas capable d'utiliser un index pour la requête extérieure sur une requête du type 1341 \texttt{select * from (select * from table where condition) where condition} . 1342 Il y a eu par conséquent nécessité de réécrire certaines requêtes avec des jointures a priori beaucoup moins efficaces, cependant cette perte d'efficacité est compensée par l'utilisation d'index désormais possible. 1343 1344 SQLite3 tranforme les requêtes de la forme \texttt{select * from table limit 100 order by random();} en une requête qui récupère tout l'ensemble 1345 de résultats, ajoute une colonne random(), prend les 100 premiers résultats et les trie. Mais cela l'oblige à récupérer chauqe ligne de l'ensemble des 1346 résultats et de calculer le random() pour chaque ligne, pour ensuite ignorer tout ce qui dépasse la ligne 100. Cela est évidemment très coûteux 1347 dans le cadre de requêtes avec beaucoup de résultats. Nous avons donc dû isoler la requête avec \verb!limit! de son \verb!order by! avec 1348 des «hacks» assez tordus pour tromper l'optimiseur. 1349 1350 1351 Quant au développement de l'application Java, le langage de description des interfaces utilisateur d'\android{}, qui est une application XML, 1352 s'est montré peu pratique pour la construction de l'interface d'un jeu, et difficile à modifier pour de petits ajustements (ajout d'un 1353 bouton, d'une icône…). C'est une des raisons pour l'abandon de la plateforme \android{} + Java, en faveur de HTML5 + CSS + JavaScript. 1354 1355 Du côté de l'application HTML5, l'omniprésence d'évènements asynchrones a été la source de nombreux bugs. De plus, des légères différences de 1356 comportement entre le navigateur Web d'\android{} sur le téléphone physique, sa version dans l'émulateur et les navigateurs sur les ordinateurs de bureau ont fait que certains problèmes ne se posaient que 1357 sur le téléphonne physique, ce qui a rendu leur résolution difficile. 1358 1359 Bien que fonctionnelle, notre application peut encore être améliorée. L'implémentation d'un des modes de jeu prévus au départ rendrait le jeu plus attrayant, par exemple 1360 le mode «thématique», pourrait être couplé avec un mode «l'image cachée»~: on choisit un thème et au bout de plusieurs parties on découvre une 1361 image associée à ce thème. 1362 1363 Par ailleurs, l'application pourrait bénéficier d'une restructuration du code. Nous avons effectué cette restructuration et un gros 1364 nettoyage du code du client, mais le serveur n'est pas aussi propre et extensible que souhaitable. 1365 1366 Un autre aspect qui pourrait être amélioré est la qualité des nuages des mots générés. Actuellement, l'algorithme de génération des nuages ne tient pas 1367 compte de la partie du discours à laquelle le mot central et les mots du nuage appartiennent. Par exemple, la relation «fait partie de» n'a 1368 de sens que pour des noms, alors que notre algorithme peut aussi bien la choisir avec un adjectif comme mot central. 1369 1370 Nous avons pensé à utiliser une forme de réseau de neurones pour déterminer si un mot central et des mots du nuage sont pertinants pour une 1371 relation donnée. Nous avons commencé à réaliser un tel algorithme, mais son implémentation nécessite une étude plus approfondie du problème (voir section \ref{sec:algo-triangles}). 1372 1373 Un paquetage TALN a été développé indépendemment et les résultats sont prometteurs, mais ce paquetage est toujours au stade expérimental et les classes qui étaient prévues d'être intégrées au projet n'ont pas vu le jour. 1374 1375 1376 Le client et le serveur constituent tous les deux des briques logicielles réutilisables. Le serveur peut être réutilisé assez facilement 1377 pour d'autres applications qui souhaiteraient afficher par exemple le nuage pour un mot donné. Le client communique avec le serveur en 1378 utilisant seulement quelques types de requêtes différents et pourrait donc être couplé avec un autre serveur sans que cela nécessite beaucoup de modifications.\footnote{Nous pensons ici au serveur existant de la version de PtiClic réalisée par le LIRMM.} 1379 1380 Le client est aussi extensible~: son architecture permet l'ajout de nouveaux écrans, de nouveaux thèmes, voire de nouveaux modes de jeu. Le 1381 fait qu'il soit écrit principalement en HTML5 et JavaScript permet de l'adapter à la plupart des téléphonnes intelligents et aux tablettes tactiles à 1382 moindre coût. 1383 1384 Nous espérons que notre travail pourra être réutilisé par l'équipe du LIRMM pour offir une interface au jeu PtiClic qui soit compatible avec 1385 les plateformes mobiles. 1386 1387 \newpage 1388 1389 \section{Bibliographie} 1390 \subsection{PtiClic et TALN} 1391 1392 Lafourcade, Mathieu, Making people play for Lexical Acquisition. In Proc. SNLP 2007, 7th Symposium on Natural Language Processing. Pattaya, Thailande, 13-15 December 2007. 1393 1394 Lafourcade, Mathieu and Alain Joubert, Computing trees of named word usages from a crowdsourced lexical network. In proc Computational Linguistics Applications - International Multi-Conference on Computer Science and Information Technology, Wisla, Pologne, 18-20 October 2010. 1395 1396 Lafourcade, Mathieu and Alain Joubert, Détermination et pondération des raffinements d'un terme à partir de son arbre des usages nommés. In proc of TALN'10, Montreal, Canada, 19-23 Juillet 2010. 1397 1398 Lafourcade, Mathieu and Alain Joubert, JeuxDeMots~: un prototype ludique pour l’émergence de relations entre termes. In proc of JADT'2008, Ecole normale supérieure Lettres et sciences humaines , Lyon, France, 12-14 mars 2008. 1399 1400 Lafourcade, Mathieu and Virginie Zampa, PtiClic~: a game for vocabulary assessment combining JeuxDeMots and LSA. In proc of CICLing (Conference on Intelligent text processing and Comptational Linguistics). Mexico~: 1-7 mars 2009. 1401 1402 Lafourcade, Mathieu and Virginie Zampa, PtiClic et PtiClic-kids~: Jeux avec les mots permettant une double acquisition. In proc TICE 2010, 7e coloque TICE, Nancy~: 6-8 décembre 2010 et PtiClic: a game for vocabulary assessment combining JeuxDeMots and LSA. In proc of CICLing (Conference on Intelligent text processing and Comptational Linguistics). Mexico~: 1-7 mars, 2010. 1403 1404 Schwab, Didier and Mathieu Lafourcade, Modelling, Detection and Exploitation of Lexical Functions for Analysis, ECTI Journal, 2007, Vol.2, No2, ISSN 1905-050X, pp 97-108. 1405 1406 Wikipedia, Latent Semantic Analysis http:\/\/en.wikipedia.org\/wiki\/Latent\_semantic\_analysis. 1407 1408 Wikipedia, Analyse sémantique latante, http:\/\/fr.wikipedia.org\/wiki\/Analyse\_s\%C3\%A9mantique\_latente. 1409 1410 1411 \subsection{Linguistique} 1412 1413 Saussure, Ferdinand de, Cours de linguistique générale, édition originale~: 1916, édition 1979~: Payot, Paris. 1414 1415 1416 \subsection{Java} 1417 1418 Code Conventions for the Java Programming Language, Oracle, 1999. (\url{http://www.oracle.com/technetwork/java/codeconvtoc-136057.html, www.oracle.com/technetwork/java/codeconventions-150003.pdf}) 1419 1420 \subsection{\android{}} 1421 1422 Android Developer, 2011. (\url{http://developer.android.com/}) 1423 1424 1425 1426 1427 1428 % \section{Notes Georges} 1429 % Les relations suivantes seront peut-être utilisées (* = oui, c'est sûr, on a/doit faire les icônes et des requêtes sql)~: 1430 1431 % \begin{tabular}{|c|l|l|l|} 1432 % \hline 1433 % icône~? & nom & num & signification \\ 1434 % \hline 1435 % $*$ & r\_syn & 5 & synonyme (chat -> matou) \\ 1436 % $*$ & r\_anto & 7 & antonyme (bon -> mauvais) \\ 1437 % $*$ & r\_has\_part & 9 & A comme partie (chat -> patte) \\ 1438 % $*$ & r\_holo & 10 & Fait partie de (patte -> chat) \\ 1439 % & r\_agent & 13 & Peut exécuter comme action (chat -> manger) \\ 1440 % & r\_patient & 14 & Peut subir comme action (chat -> laver) \\ 1441 % & r\_carac & 17 & Caractéristique (chat -> affectueux (ou pas…)) \\ 1442 % \hline 1443 % \end{tabular} 1444 1445 \newpage 1446 1447 \appendix 1448 1449 \section{Diagramme de Gantt prévisionnel} 1450 \label{sec:gantt-original} 1451 \noindent 1452 \hskip -2.6cm% 1453 \includegraphics[trim=1.7cm 19cm 1.7cm 4cm,clip,width=20cm]{../feuille-route/gp-pticlic.pdf} 1454 \newpage 1455 1456 % \section{Annexe A} 1457 1458 % \subsection{14 janvier 2010} 1459 1460 % Durée du projet 4 mois (4 itérations de 4 semaines) 1461 1462 % Conventions de code~: \url{http://java.sun.com/docs/codeconv/html/CodeConventions.doc6.html} 1463 1464 % Code (noms de variables, etc.) en anglais, commentaires en français, javadoc en français. 1465 1466 % \subsection{26 janvier 2011} 1467 % Mettre le serveur (PHP) sur free.fr, pour pouvoir tester facilement 1468 1469 % Utilisation d'une classe \verb!Constant! 1470 1471 % Écran d'accueil du jeu~: Image (splash), puis directement les icônes des modes de jeu + configuration, au lieu d'avoir un écran avec le logo et jouer/config, suivi du choix du mode de jeu. 1472 1473 \section{Mentions légales} 1474 Android is a trademark of Google Inc. Use of this subject to Google Permissions. 1475 1476 1477 \end{document}