:: Enseignements :: Master :: M2 :: 2008-2009 :: Méthodes statistiques pour le Traitement Automatique de Documents ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | Expériences en analyse morphosyntaxique |
Le but du TP est de se familiariser avec l'apprentissage pour l'analyse morphosyntaxique utilisant des modèles de Markov cachés.
Ressources
Dans cette séance, nous utiliserons les ressources dans l'archive
tagging.zip :
- un corpus annoté pour l'apprentissage: training-corpus.txt
- un corpus annoté pour l'évaluation: testing-corpus.txt
- un automate contenant toutes les analyses possibles du corpus d'évaluation après application des dictionnaires Unitex (eval.afst2 et eval.lfst2)
- un corpus non annoté : /home/ens/mconstan/corpus/french/lm94.u8
Outils
Durant cette séance, nous vous demandons d'utiliser l'analyseur morphosyntaxique écrit en python qui se trouve ici.
Pour lancer le programme d'exemple, exécuter tests.py.
L'analyseur est basé sur les modèles de markov cachés (HMM).
Cet analyseur est appliqué à un automate du texte (classe TfsFst2).
Cet automate contient, pour chaque phrase, toutes les analyses possibles des mots: une transition étiqueté par un Tag contient une analyse.
L'analyseur utilise une classe TagInfo avec les méthodes suivantes :
-
def getLexicalInfo(self,tag) qui retourne la partie lexicale du tag (en général, la forme fléchie).
-
def getGramInfo(self,tag) qui retourne la partie grammaticale (en général, la catégorie grammaticale plus quelques traits morphologiques)
-
def getNextState(self,q,tag) retourne le prochain état du HMM (de type string), étant donné que l'on était dans l'état q et que l'on passe par un Tag tag.
Exemple: getNextState('N A','V') peut renvoyer 'A V'.
-
def tagFilterAndExpander(self,tag) renvoie une liste de Tag qui sera utilisée pour construire une liste de transitions lorsque l'on a tag dans une transition de l'automate de départ.
Cette fonction sert à la gestion des mots inconnus et des mots composés par exemple.
L'analyseur est basé sur une classe
HMM qui contient les méthodes suivantes:
-
def getInitialState(self) qui retourne l'état initial du HMM (de type string).
-
def getTransitionLogProbability(self,q,r) retourne le logarithme de la probabilité de passer de l'état q à l'état r dans le HMM.
-
getEmissionLogProbability(self,tag,q) qui retourne le logarithme de la probabilité d'émmettre la partie lexicale du Tag tag, étant donné que l'on se trouve dans l'état q du HMM.
-
def viterbi(self,observations,infos) applique l'algorithme de viterbi à l'automate d'une phraseobservations en utilisant une instance infos de type TagInfo.
Pour faire votre propre analyseur (avec sa propre phase d'apprentissage),
vous devez implanter des classes héritant de ces classes et surchargeant les méthodes que vous voulez personnaliser.
Vous pouvez vous inspirer de l'exemple.
Exercice 1 - Analyseur simple
Implémenter un analyseur simple basé sur le fait qu'une étiquette ne dépend que de sa précédente.
Les mots inconnus seront considérés comme des noms communs (N) s'ils ne commencent pas par une lettre majuscule.
Ils seront analysés comme des noms (N+Pr) propres sinon.
Les mots considérés sont des mots simples: pas de mots composés !
Etapes à suivre :
-
Il vous sera nécessaire de réaliser un petit programme comptant les différents bigrammes d'étiquettes dans le corpus d'apprentissages et le nombre d'occurrence d'un mot ayant une étiquette donné.
Ces informations seront stockés dans un fichier.
-
Implanter une classe HMM2 héritant de HMM et surchargeant les méthodes d'obtention des probabilités.
Le constructeur de HMM2 chargera les informations se trouvant dans le fichier précédent.
- Tester le nouvel analyseur sur l'automate.
Exercice 2 - Evaluation
Nous souhaitons maintenant évaluer l'analyseur précédent.
Pour cela, écrire un programme qui compare la sortie de l'analyseur avec le corpus d'évaluation.
Attention : à cause d'une différence de segmentation en mots entre le corpus annoté et Unitex, il est nécessaire de biaiser l'évaluation.
On ne considérera que les mots du corpus d'évaluation contenant uniquement des lettres et possédant une étiquette.
Quels résultats obtenez-vous ? Commenter.
Exercice 3 - Autres expériences
Vous construirez ensuite un analyseur qui considère qu'une étiquette dépend de ses deux précédentes.
Qu'obtenez-vous comme résultat?
Faites maintenant varier la taille de votre corpus d'apprentissage.
Qu'observez-vous? Pourquoi?
Exercice 4 - Bonus : classes d'équivalence
Nous revenons au cas où une étiquette dépend de sa précédente.
Considérons que le corpus d'apprentissage est réduit à 100 phrases.
L'estimation des probabilités devient peu fiable, notamment pour celle d'émission d'un mot étant donné une étiquette.
Nous décidons d'utiliser un système de classes d'équivalence pour les mots apparaissant moins de 10 fois dans le corpus.
Dans ce cas-là, on considérera que P(mot|étiquette) = P(classe du mot|étiquette).
On construira les classes de mots par regroupement automatique de mots (cf. cours).
Rendu
Vous devrez écrire un petit rapport décrivant votre travail et les résultats obtenus.
Ce rapport et vos sources devront être envoyés à Matthieu Constant avant le mercredi 4 mars 2009.
© Université de Marne-la-Vallée