Étiquetage morphologique par Morphalou
Un programme de Frédéric Glorieux et un
projet de INaLCO/M2-IM en 2008-2009
- But poursuivi
- Principe
- Réalisation
- Morphalou
- Réalisation
en SAX
- La
classe Grammairien
- La
classe Lecteur
-
But
poursuivi
À partir d'un texte (brut) en français, produire pour chacun des mots
qui s'y trouvent
- sa nature (part-of-speech)
- son lemme
- ses flexions
Voici un
exemple où l'analyse est restreinte aux noms communs.
Essayez vous-même !
-
Principe
On procède en deux étapes d'inégale importance :
- On constitue un dictionnaire dont les mots du texte
sont les clés.
Lors de la création du dictionnaire, l'entrée associée à chaque mot est
vide.
- On "cherche" chaque mot dans le lexique,
et à partir des informations fournies par le lexique on compose
l'entrée du dictionnaire.
Toute la difficulté est dans cette recherche : une forme fléchie ne se
trouve pas directement comme clé dans le lexique !
On va donc renverser les rôles : au lieu de partir du mot à
chercher, on va partir du lexique.
La phase 2 devient donc .
On lit intégralement le lexique.
À chaque forme qu'on y rencontre, on regarde si elle figure (comme clé)
dans notre dictionnaire
(ce qui se fait en temps constant, grâce à la technique appelée hashing).
Si oui, à partir des informations fournies par l'article on compose
l'entrée du dictionnaire.
On continue la lecture du lexique...
De cette manière, le lexique est lu une seule fois - mais d'un bout à
l'autre.
-
Réalisation
-
Morphalou
Le lexique Morphalou est un lexique ouvert
des formes fléchies du
français.
Il se présente comme un fichier XML de 155 Mo, dont voici un échantillon
:
<?xml version="1.0"
encoding="UTF-8"?>
<!DOCTYPE lexicon SYSTEM "Morphalou-2.0.dtd">
<lexicon>
<lexiconInformation>
<originatingData originatingDatabase="TLF"
originatingInstitution="ATILF" />
<originatingData
originatingDatabase="Morphalou-1.0" originatingInstitution="ATILF"
/>
</lexiconInformation>
<lexicalEntry id="a_1">
<formSet>
<lemmatizedForm>
<orthography>a</orthography>
<grammaticalCategory>commonNoun</grammaticalCategory>
<grammaticalGender>masculine</grammaticalGender>
</lemmatizedForm>
</formSet>
<originatingEntry target="TLF">A, subst.
masc.</originatingEntry>
</lexicalEntry>
<lexicalEntry id="championne_1">
<feminineVariantOf
target="champion_1">champion</feminineVariantOf>
<formSet>
<lemmatizedForm>
<orthography>championne</orthography>
<grammaticalCategory>commonNoun</grammaticalCategory>
<grammaticalGender>feminine</grammaticalGender>
</lemmatizedForm>
<inflectedForm>
<orthography>championne</orthography>
<grammaticalNumber>singular</grammaticalNumber>
</inflectedForm>
<inflectedForm>
<orthography>championnes</orthography>
<grammaticalNumber>plural</grammaticalNumber>
</inflectedForm>
</formSet>
<originatingEntry
target="TLF">CHAMPION, ONNE,
subst.</originatingEntry>
</lexicalEntry>
</lexicon>
Supposons que notre texte soit "une championne, des
championnes
".
Le dictionnaire initial est
une
:
championne
:
des
:
championnes
:
Lorsque notre lecture séquentielle du fichier nous amènera à la
<lexicalEntry id="championne_1">
,
nous découvrirons successivement que les deux <inflectedForm>
qui
ont pour <orthography>
respectivement championne
et championnes
nous
intéressent !
Nous pourrons alors informer notre dictionnaire avec le genre feminine
et les nombres singular
et plural
.
La difficulté de détail est que nous ne lirons les formes fléchies
qu'après avoir lu le lemme et le genre...
il faudra donc lire soigneusement.
En pratique, on empilera les informations à toutes fins utiles, et on
les utilisera le cas échéant.
Informations supplémentaires sur Morphalou :
-
Réalisation
en SAX
Conformément aux indications du cours, on répartit
le travail en deux classes : Lecteur
et Grammairien
.
Grammairien
est la
sous-classe annoncée de org.xml.sax.helpers.DefaultHandler
,
et
Lecteur
effectue les 4
opérations de la phase 3.
-
La classe Grammairien
Elle possède comme méthodes les 3 callbacks, qui
vont travailler par modifications successives
(les informaticiens disent "effet de bord") sur une batterie
de variables d'instance,
qui définissent l'état intantané de l'objet grammairien.
Parmi ces variables deux jouent un rôle distingué :
path
, qui contient une
pile de chaînes (Stack<String>
)
représentant le chemin qui,
dans l'arbre XML, conduit à l'élément en cours de lecture ;
desMotsAuxInfos
, qui
contient le dictionnaire (HashMap<String,Vector<String>>
)
décrit au § II ci-dessus.
Cette dernière est publique (c'est la seule) car on viendra y chercher
le résultat du travail
(dans la classe Lecteur
).
Elle est initialisée par le constructeur Grammairien
,
qui prend comme argument une chaîne de caractères
qui est le contenu entier du fichier.
L'essentiel du travail est effectué par endElement
,
qui exploite minutieusement les informations
qui ont été logées dans path
et dans le
buffer text
par les deux autres callbacks,
startElement
et characters
.
-
La classe Lecteur
Elle est purement procédurale (au contraire de Grammairien
)
:
- toutes ses méthodes et tous ses attributs sont
static
- elle n'a point de constructeur : aucune
instance ne sera créée
- elle sera invoquée par sa méthode
main
.
En plus du rituel SAX décrit en cours, la classe Lecteur se charge de
l'intendance :
- convertir le fichier-source en chaîne de
caractères
- communiquer le résultat (qui peu être volumineux)
à l'extérieur.
Ici, on fait l'hypothèse que le programme tourne sur un serveur et que
ledit résultat est livré dans une page Web.
Les détails sont dans le code !