Programmation pour le TAL
Cours Java
- Visibilité/portée des variables, valeurs et références
"Programmer en Java" : lire le début de la section 4 (Affectation et comparaison d'objets) jusqu'à la section 4.3 du chapitre 6,
et le début de la section 6 (Règles d’écriture des méthodes) jusqu'à la section 6.3 (Propriétés des variables locales) du même chapitre.
Présentation
- Les tableaux : lire les sections 1 à 3 du chapitre 7 (les tableaux) de "Programmer en Java"
Cours UML
- Agrégation et composition
- Un seul critère à retenir pour choisir entre agrégation et composition entre une classe Partie et une classe Tout :
une instance de la classe Partie peut-elle être simultanément en relation avec plus d'une instance de la classe Tout ?
Si la réponse est oui, il s'agit d'une agrégation. Si la réponse est non (une instance de la classe partie
ne peut pas être, à un moment donné, en relation avec plus d'une instance de la partie Tout), c'est une composition.
Ne raisonnez pas en termes de construction/destruction, ni sur deux relations à la fois (e.g. Population/Personne et Club/Personne dans le transparent de la présentation ci-dessus).
Correction UML
Autonomie : objets géométriques
Exercice sur Java à rendre.
L'exercice porte sur l'implémentation du système de dessin vectoriel dont nous avons commencé à donner une modélisation UML.
Le projet final de l'U.E. porte sur l'extraction de triplets syntaxiques,
maus nous utiliserons les objets géométriques pour illustrer les nouvelles notions abordées dans le cours sur Java
(en commençant ci-dessous notamment par les constructeurs et la surdéfinition/surcharge de méthodes).
- Téléchargez et importez le paquet sajous.litl.geom : geom.tar.gz
- Exécutez la méthode main() de la classe TestGeomObjects. N'hésitez pas à modifier des instructions,
à en ajouter, à en commenter d'autres pour observer les différences dans l'exécution.
L'objectif n'est bien-sûr pas de constater "que ça marche", mais de comprendre ce qui se passe et pourquoi.
Un bon réflexe pour s'assurer de la compréhension des mécanismes mis en œuvre est d'ajouter des instructions d'affichage
dans les différentes méthodes, par exemple :
System.out.println ("Passage dans le constructeur 3 de la classe X")
- Exécutez le programme sans toucher au code, puis commentez la méthode toString() dans la classe Segment et réexécutez.
Que se passe-t-il ? (décommentez ensuite la méthode toString() de Segment)
- On veut implémenter le déplacement (la translation) des objets.
Un déplacement se caractérise par la donnée d'un vecteur (dx, dy), pour "déplacement sur l'axe des abs./ord."
ou "delta x/y" (il s'agit de décalages, positifs ou négatifs, sur les deux axes du repère).
Une méthode translate (int dx, int dy) est déjà donnée pour la classe PointMobile.
Quand on invoque cette méthode sur une instance de la classe, le point est déplacé.
Implémentez une méthode équivalente (même signature) dans la classe Segment et testez-là dans le main()
de la classe TestGeomObjects.
- Donnez une implémentation de la classe Circle (getters/setters, constructeurs, méthodes toString () et translate ()
et testez-là dans la classe TestGeomObjects.
Astuces Eclipse
- Complétion automatique : Eclipse analyse votre code en permanence et
sait, entre autres choses, quelle objet a été déclaré, quelle méthode peut-être invoquée sur tel objet, etc.
Dans le main() de TestGeomObjects, l'objet sgmt a été déclaré.
Si à la fin de la méthode, vous tapez "sg" et que vous appuyez sur Ctrl+espace, Eclipse complète le nom de l'objet.
Si ensuite, vous saisissez "." (le code est alors "sgmt.") et que vous appuyez sur Ctrl+espace,
Eclipse vous propose la liste des méthodes que vous pouvez invoquer sur cet objet.
C'est pratique pour éviter les erreurs de saisie.
- Génération automatique de getters/setters : dans la classe Circle, sélectionnez les lignes qui correspondent aux membres radius et center, puis menu Source/Generate getters and Setters (ou clic-droit sur la sélection/source/Generate getters and Setters).
Cliquez dans les deux cases à cocher à gauche de chacun des noms de membres, puis, en bas, sur Generate.
Mot-clé this
Dans les setters générés automatiquement, notez l'utilisation de this.
Vous pouvez également observer cette utilisation, par exemple, dans le constructeur de la classe PointFixe.
Une implémentation pourrait être, par exemple :
public FixedPoint (int ord, int abs)
{
x = ord;
y = abs;
} // FixedPoint ()
Ici, le nom des arguments (ord, abs) est différent de celui des membres (x, y) : pas de problème.
Mais si on nomme les arguments x et y, ils masquent la visibilité des membres (de même nom) de l'objet.
Si on écrit "x = x", les deux occurrences de x réfère à l'argument et l'affectation
a un effet nul. La solution mise en œuvre dans Java est d'accéder
aux membres d'un objet, lorsqu'ils sont masqués, par this.nomMembre.
Dans l'implémentation ci-dessous
public FixedPoint (int x, int y)
{
this.x = x;
this.y = y;
} // FixedPoint ()
x et y désignent les valeurs des arguments passés au constructeur, et this.x/this.y désignent les membres de l'objet.
On affecte donc les valeurs des arguments aux membres de l'objet.
Lire à ce sujet la section 9.5 du chapitre 6 de "Programmer en Java".
this () est aussi le moyen d'invoquer un constructeur depuis un autre constructeur :
dans la classe FixedPoint, le constructeur FixedPoint (int x, int y, String objName)
invoque le constructeur de la même classe FixedPoint (int x, int y, String objName).
Autonomie : projet sur l'extraction de triplets syntaxiques
- Lire la description de l'objectif du projet.
La lecture des deux articles (surtout les sections sur l'extraction et la normalisation de relations syntaxiques)
pourra se faire tout au long de l'U.E.
- Exercice Java
- Importez dans un projet Eclipse les sources Java syntacticDeps.jar (annexe C du document sur Eclipse) sans créer de nouveau package : cliquez seulement, dans le package explorer, sur le répertoire "src" de votre projet avant l'import
- Importez dans ce projet l'archive talismaneReader.jar (annexe D du document sur Eclipse) dont les sources ne sont pas fournies. Cliquez, dans le package explorer, sur le nom de votre projet avant l'import
- Observez les classes Token, Sentence, SyntacticDependency et IndirectDependency
- Créez une classe DependenciesBuilder avec une méthode main()
- Importez la classe TalismaneReader : ajoutez avant le début de définition de la classe (Class DependenciesBuilder) la ligne suivante :
import sajous.litl.readers.*;
- Créez une méthode lookForUnknownLemmas() qui cherche les tokens dont le lemme est inconnu de l'analyseur syntaxique
et affiche leurs formes de surface et leurs catégories syntaxiques
- Créez une méthode lookForNmodAdj() qui repère dans la phrase les triplets NC <-- mod -- Adj et les affiche (e.g. <NC:méthode; mod; Adj:efficace>,
<NC:système; mod; Adj:complexe>, etc.)
- Le code de la méthode main pourrait être le suivant :
TalismaneReader reader = new TalismaneReader();
reader.readSentence("/chemin/TAL_Samples/phrase1.tal");
// affichage de la phrase
Sentence sent = reader.getSentence();
sent.display();
// affichage des triplets NC-mod-Adj
DependenciesBuilder depBuilder = new DependenciesBuilder ();
depBuilder.setSentence (sent);
depBuilder.lookForNmodAdj ();
Échantillons de phrases "talismanisées" extraites du corpus TALN : TAL_Samples.tar.bz2
[ Mention légale ]