introduction à l'informatique linguistique mathieu constant, eric laporte licence...
TRANSCRIPT
Introduction à l'informatique linguistique
Mathieu Constant, Eric Laporte
Licence d'informatique 3
Université de Marne-la-Vallée
IGM
Cours 1
Introduction
Tokenisation
Expressions rationnelles et automates finis
Introduction au langage Python
Introduction
Objectifs de l'informatique linguistique
Applications informatiques sur les langues naturelles
Génération de textes en langues naturelles (écrits, oraux)
Dialogue homme-machine (écrit, oral)
Traduction (écrit, oral)
Recherche d'information, moteurs de recherche
Extraction d'information
Vérification et correction orthographique
etc.
Introduction
Niveaux de complexité
1. Tokens
$ wc idees.txt extrait.txt
40 149 947 idees.txt
2294 16638 97724 extrait.txt
2334 16787 98671 total
Lignes, mots, caractères
Connaissances : qu'est-ce qu'un mot ?
Découper un texte en éléments simples
Introduction
Niveaux de complexité
1. Tokens
2. Morpho-syntaxique
Un robot parlant français doit pouvoir produire
Je vais fermer l'autre porte
et non
* Je vais fermer la autre porte
et doit savoir conjuguer Je vais, Il va, Nous allons...
Variations de forme et propriétés des mots
IntroductionNiveaux de complexité
1. Tokens
2. Morpho-syntaxique
3. Syntaxico-sémantique
Le robot doit pouvoir distinguer les ordres et les questions
Ferme toutes les autres portes
Toutes les portes sont-elles fermées ?
Il doit savoir que
* autre fermer je l'porte vais
n'a pas de sens, bien qu'elle contienne les mêmes mots
Structure et sens des phrases
IntroductionNiveaux de complexité
1. Tokens
2. Morpho-syntaxique
3. Syntaxico-sémantique
4. Pragmatique
Le robot doit pouvoir répondre
Non, je ne peux pas
au lieu de
Non, je ne fermerai pas les autres portes
Non, je ne le ferai pas
Comment s'exprimer pour atteindre un objectif
TokenisationTokens : éléments simples d'un texte écrit
Passer d'une séquence de caractères à une séquence de tokens
Je vais fermer l'autre porte
/Je/vais/fermer/l/'/autre/porte/
Définition des tokens
Les mots délimités par des espaces
/l'autre/ /l/'/autre/ /autre,/ /autre/,/
Expressions rationnelles
\w+ une séquence d'1 ou plusieurs caractères alphanumériques
\d+ une séquence d'1 ou plusieurs chiffres
[^\w\s] un symbole de ponctuation
Algorithme de tokenisationEntrées : le texte, séquence de caractères ; une ou plusieurs expressions
rationnelles définissant les tokens
Sorties : une séquence de tokens
tant que le texte n'est pas fini {
pour chaque expression rationnelle {
appliquer l'expression au texte en allant le plus loin possible
marquer dans le texte la position obtenue }
si aucune marque alors passer au caractère suivant
sinon {
conserver seulement la marque la plus à droite
copier sur la sortie depuis le caractère courant jusqu'à la marque
prendre comme caractère courant le caractère marqué } }
TokenisationJe vais fermer l'autre porte
|
| ^ Je
|
|
| ^ vais
|
|
...
Variante
Les expressions définissent les délimiteurs et non les tokens
Expressions rationnellesDéfinition mathématique
- les symboles de l'alphabet et le mot vide a
- les expressions obtenues avec les opérateurs :
- concaténation ab
- union a|b
- itération a*
Priorités entre opérateurs
le plus prioritaire : itération ; le moins prioritaire : union
Exemples
0|1|2|3|4|5|6|7|8|9
(0|1|2|3|4|5|6|7|8|9)(0|1|2|3|4|5|6|7|8|9)*
Expressions rationnellesNotations en grep, sed, vi, emacs, flex, perl, python...
Détails des conventions différents pour chaque programme
[0123456789] 0|1|2|3|4|5|6|7|8|9
[0-9] 0|1|2|3|4|5|6|7|8|9
[^a-zA-Z] 1 caractère autre que [a-zA-Z]
CLEF? CLE|CLEF
[0-9]+ [0-9][0-9]*
. 1 caractère autre que fin de ligne (\n)
^Le "Le" si placé en début de ligne
dernier$ "dernier" si placé en fin de ligne
\|\(\)\*\[\?\+\.\^\$\\ |()*[?+.^$\
Expressions rationnellesNotation en python
\s 1 espace, fin de ligne ou tabulation
\w 1 caractère alphanumérique
\d 1 chiffre
Automates finis
Graphes équivalents aux expressions rationnelles
Expression rationnelle brrr*!Automate fini équivalent(reconnaît exactement les mêmes séquences)
Etats : 0 1 2 3 4Transitions : 0b1 1r2 2r3 3r3 3!4Etats initiaux : 0Etats finaux : 4
0 1 2 3 4b r r !
r
Automates finis
Automate déterministe
1 état initial au plus
si 2 transitions sortent du même état et sont étiquetées par le même symbole de l'alphabet, alors elles sont égales
Un automate non déterministe
0 1 2 3 4b r r !
r
0 1 2 3 4b r r !
r
Reconnaissance par automate fini déterministe
Entrées : une séquence de symboles, un automate déterministe
Sorties : oui/non
curseur = le premier symbole de la séquence
état = l'unique état initial de l'automate
tant que vrai {
si curseur à la fin de la séquence alors
si état est final alors renvoyer oui sinon renvoyer non
sinon si transition[état, curseur] vide alors renvoyer non
sinon {
état = transition[état, curseur]
curseur = le symbole suivant } }
Automates finis non déterministes
Peuvent contenir des transitions étiquetées par le mot vide (interdit dans un automate déterministe)
L'algorithme de reconnaissance est plus compliqué
0 1 2 3 4b r r !
Automates et expressions rationnelles
Pour toute expression rationnelle il existe un automate fini équivalent et inversement
Il existe des algorithmes pour construire un automate fini équivalent à un expression donnée et inversement
Expressions simples : plus faciles à manipuler que les automatesExpressions compliquées : il y a souvent un automate équivalent
plus facile à lireExemple : (1(0|1)*|0)\.((0|1)*1)?|\.((0|1)*1|0)
0
1 34 5
0 . 1
26 7
1.
.
0
0 1
0 1
Automates et expressions rationnelles
Trouver un automate fini équivalent à une expression donnée
Union chemins en parallèle
a|c
Concaténation chemins en série
(a|c)d 1 2d
0 1a
c
0
a
c
Automates et expressions rationnelles
Itération cycle
(a(ab)*|c)d
(a|c)(ab)*d
0
12 3
a d
c
ab
1 2d
ab
0
a
c
Introduction à Python
En TP nous utiliserons NLTK, un système écrit en langage Python
Python est un langage à objets interprété
Utilisation interactive : ipython
Utilisation par scripts : python2.4 <fichier_de_script.py>
Commentaires
# Mon premier script en python
Chaînes de caractèresmessage = "Tokenisation..."print message Tokenisation...
print len(message) 15
print message + message Tokenisation...Tokenisation...
repeter = 2print message * repeter
Tokenisation...Tokenisation...
message = message * repeterprint message
Tokenisation...Tokenisation...
print message[0] T
print message[0:5] Token
print message[5:] isation...Tokenisation...
print message[0], message[1] T o
Inspection d'une expression
En mode interactif, quand on écrit une expression, Python répond en donnant la valeur
>>> message'Tokenisation...'
>>>
Listes
>>> compte = ["zero", "un", "deux"]
>>> compte[0] 'zero'
>>> compte[0:2] ['zero', 'un']
>>> suite = compte[-1:] + ['trois']
>>> suite ['deux', 'trois']
>>> compte[2] = "2"
>>> compte ['zero', 'un', '2']
>>> compte.reverse()
>>> compte ['2', 'un', 'zero']
>>> len(compte) 3
Méthodes
>>> compte.reverse()
>>> compte ['2', 'un', 'zero']
Le nom d'un objet, un point, le nom d'une méthode, les paramètres
>>> mots = ["antre", "outre", "autre"]
>>> mots.sort()
>>> mots ['antre', 'autre', 'outre']
>>> mots.append("pot")
>>> mots ['antre, 'autre', 'outre', 'pot']
Méthodes
>>> a_rebours = " ".join(compte)
>>> a_rebours '2 un zero'
>>> phrase = "Je vois l'autre."
>>> phrase.split(" ") ['Je', 'vois', "l'autre."]
Paramètres en ligne de commande
import sys
sys est le module Python qui gère la ligne de commande et autres questions liées au système
argv : liste des paramètres passés en ligne de commande
argv[0] est le nom du script
len(argv) est le nombre de paramètres
Itération
total = 0
for mot in mots:
print mot
total += len(mot)
print total
La fin du bloc for est indiquée par l'indentation
L'indentation est obligatoire
autreoutrepot18
Expressions rationnelles
>>> import re
>>> from nltk_lite.utilities import re_show
>>> phrase = "Je vois l'autre."
>>> re_show("e", phrase)J{e} vois l'autre.
>>>
"re" est le module de Python sur les expressions rationnelles
Le tokeniseur de NLTK
>>> from nltk_lite import tokenize>>> phrase = "Je vois l'autre.">>> list(tokenize.regexp(phrase, "[^\s]+")['Je', 'vois', "l'autre."]
>>>Pour ne pas mélanger les types de caractères dans un
token :>>> list(tokenize.regexp(phrase, "[\w]+|[^\s]")['Je', 'vois', 'l', "'", 'autre', '.']
>>>
Fichiers
f = open('phrase.txt', 'rU')
# ouvre le fichier en lecture
text = f.read()
# lit tout le fichier dans une chaîne de caractères
f.close()
# referme le fichier