Ce TP est dédié à la segmentation en constituants simples non récursifs (ou "chunks").
En particulier, le but est de développer un petit chunker pour le français.
Une procédure de segmentation en chunks est en général itérative.
Chaque étape dépend de la précédente.
Par exemple, l'étape de reconnaissance des chunks nominaux (
XN) est précédée de l'étape de reconnaissance des chunks adjectivaux (
XA) :
XA-> Adv? Adj
XN-> Det XA XN
Le code en python ci-dessous montre un exemple d'une telle procédure en cascade.
import nltk
tagged_tokens = [("the", "DT"), ("little", "JJ"), ("yellow", "JJ"),
("dog", "NN"), ("barked", "VBD"), ("at", "IN"), ("the", "DT"), ("cat", "NN")]
grammar = r"""
NP: {<DT>?<JJ>*<NN.*>+} # noun phrase chunks
VP: {<TO>?<VB.*>} # verb phrase chunks
PP: {<IN> <NP>} # prepositional phrase chunks
"""
cp = nltk.RegexpParser(grammar)
cp.parse(tagged_tokens).draw()
#cp.parse(tagged_tokens)
L'expression
NN.* représente tous les noms (
NN,
NNS, ...).
Le but de cet exercice est de construire un chunker pour le français.
- Reconnaître les chunks adjectivaux (grand, très grand, vraiment très grand)
- Reconnaître les chunks nominaux et les chunks prépositionnels
- Élaborer une cascade pour reconnaître les chunks verbaux complexes (a beaucoup mangé, a pu manger})
- Tester votre chunker sur des dépêches AFP. Quels problèmes pouvez-vous identifier? Quelles en seraient les solutions?