LTAL, TP 05.10

La séance entière est consacrée à un seul sujet, qui sera utilisé aussi plus tard. Ayez sous la main mon cours, et la documentation du module re de Python.

Regardez ce site : https://sites.google.com/site/gothnlp/links/regular-expressions, et suivez (si vous voulez) quelques liens. Si quelqu'un est intéressé par les livres : Natural Language Processing with Python (Bird, Klein, Loper, sur NLTK) et/ou Speech and Language Processing (Jurafsky, Martin), faites-moi savoir. La version draft de ce dernier (incomplète, mais avec plusieurs chapitres intéressants) était en ligne.


Expressions régulières

Le concept principal dans tout ce domaine est celui de motif (pattern). Un pattern peut être [équivalent à] une simple chaîne de caractères, mais en général représente une classe de chaînes, potentiellement infinie, grâce aux méta-caractères comme '*' ou '+'.

Exercice 1. (La reprise de l'exercice de la semaine dernière).

  1. Écrire une expression régulière - d'abord sur papier, ensuite essayez de l'implémenter - qui reconnaît toute chaîne qui commence par au moins deux caractères "a" consécutifs, suivis par un nombre quelconque (zéro inclus) de caractères "b".

  2. Écrire une expression régulière basé sur l'alphabet ("a", "b", "c"), qui reconnaît tous les mots de ce langage, qui contiennent au moins une occurrence de 'b'.

  3. Écrire une expression régulière basé sur l'alphabet ("a", "b", "c") qui reconnaît une chaîne contenant le nombre pair de "a" et le nombre pair de "b". Commencez par l'alphabet ("a", "b"), et si votre expression est correcte, pensez comment et où ajouter les caractères "c".

  4. Une liste numérique (entière) en Python est représentée par la chaîne genre "[12,-148, 0,45971 ,10]". C'est une séquence entre crochets. Elle peut être vide, avoir un seul nombre – séquence de chiffres, ou plusieurs nombres séparés par des virgules. La séquence ne peut ni commencer, ni se terminer avec une virgule. Les espaces avant ou après la virgule sont permis.
    Écrire un pattern régulier qui accepte de telles chaînes. Réfléchir comment grâce à un tel motif (peut-être étendu avec les dispositifs de groupement), récupérer tous les nombres de cette liste.
Bien sûr, testez vos solutions sur des échantillons "bons" et "mauvais". Utilisez findall, ou d'autres procédés, comme match (mais c'est plus compliqué).


Exercice 2.

Voici quelques problèmes plus compliqués...

  1. Essayez d'écrire l'expression régulière reconnaissant les nombres en chiffres romains. La solution complète, avec l'élimination des séquences illégales, comme 'IXVXDILXDI' est très difficile, pour le moment traitez le problème superficiellement.

  2. Un Grand Classique : reconnaissance des nombres réels.
    Dans un langage de programmation typique, les nombres réels peuvent avoir les formes : 12.76, +12.0, -3.651e11, 0.1e-6, 4e+2, etc. C'est à dire : un signe optionnel, la partie entière, le point décimal, la fraction, et la partie exponentielle ("... Eα" ... *10α), bien sûr, optionnelle. La partie entière et la fraction, sont des séquences de chiffres. En présence de la partie exponentielle le point décimal et la fraction sont redondantes 2e3 est correct. Le nombre dans la partie exponentielle est entier, une sequence de chiffres avec un signe optionnel.

    Construisez un pattern qui s'accorde avec ces nombres. Testez-le sur, par exemple (minimal) :
    tst = "a 12.37 b -24.999, +3e5; -6.0e+42, z -00.23e-777"

  3. Chargez la "Déclaration DH", et listez tous les mots qui se terminent par "ment". Un mot est une séquence contiguë de lettres


Solutions (à venir)

Semaine suivante
Retour à l'index