chapitre expressions régulières

This commit is contained in:
François Pelletier 2019-10-13 00:37:35 -04:00
parent 7803dbd5fa
commit fb18d8b5d6
5 changed files with 227 additions and 73 deletions

4
.gitignore vendored Normal file
View file

@ -0,0 +1,4 @@
.Rproj.user
.Rhistory
.RData
.Ruserdata

View file

@ -1,73 +0,0 @@
# Expressions régulières
# Tokenisation de mots et segmentation de phrases
# Normalisation
## Stemming
## Lemmatisation
## Analyse morphologique
# Distance minimale d'édition
# Modèles de langue N-grammes
## Modèles
## Estimation des probabilités
## Lissage
# Correction d'orthographe
# Classification de textes
## Naive Bayes
## Régression logistique
## Évaluation
## Métriques
## Validation croisée
# Analyse grammaticale
## Classe de mots
## POS Tags
## Analyseur
## Algorithme de Viterbi
## MEMM
## Choix d'attributs
# Analyse syntaxique
## Groupes syntaxiques
## Grammaire
## Analyseur
## CKY
## Probabiliste
## Analyseur de dépendances
## Chunking
# Recherche d'information
# Wordnet
# Cooccurences
# Premier travail pratique

4
Makefile Normal file
View file

@ -0,0 +1,4 @@
dot_compile:
dot -Tpng fsa_sheep.dot -o fsa_sheep.png
build: examen_partiel.md dot_compile
pandoc examen_partiel.md -o examen_partiel.pdf

203
examen_partiel.md Normal file
View file

@ -0,0 +1,203 @@
---
author: François Pelletier
title: Notes de cours - examen partiel
fig_caption: yes
highlight: pygments
number_sections: yes
toc: yes
toc_depth: 3
---
# Expressions régulières
## Définitions
- **Patron**: représentation compacte dun ensemble de chaînes de caractères
- **Recherche**: filtrer les textes qui correspondent au patron
## Types de recherches
- Litéral
- Classe de caractères
- Alphanumériques: `/\w/`
- Numériques: `/\d/`
- Registre de valeurs
- Lettres: `/[a-z]/`
- Chiffres: `/[0-9]/`
- Négation
- Aucun chiffre: `/[^0-9]/`
- Aucun espace: `/[^\s]/`
- Optionnel
- Orthographes alternatives: `/colou?r/`
- Mot facultatif: `/(\w+)?/`
- N'importe quel caractère: `/./`
- Alias
- Compteurs
- Zéro ou plusieurs espaces (en début de ligne): `/^\s*/`
- Un ou plusieurs caractères (un mot): `/\w+/`
- Groupes de capture
- Multiple, optionnel ou non-quantifié: `/(groupe 1)+(groupe 2)?(groupe 3)*/`
- Conditions
- `/(?(?=si_expression)alors|sinon)/`
## Erreurs possibles
- Faux positifs
- n'auraient pas dû correspondre au patron
- métrique: précision
- Faux négatifs
- auraient dû correspondre au patron
- métrique: rappel
## Python
Module **re**
|fonction|usage|
|---|---|
|compile|générer une version compilée de l'expression régulière|
|match|rechercher depuis le début d'une chaîne de caractères|
|search|rechercher dans une chaîne de caractères|
|sub|remplacer la première occurence d'un patron|
## Automates à états finis
- Servent à implémenter une version compilée des expressions régulières
- Deux types:
- Déterministes
- Probabilistes (non-déterministes)
- Représentés sous forme de graphes
- Alphabet: ensemble fini de symboles. Peuvent désigner de plus gros objets.
- Tableau: représente la fonction de transition $q_{i+1} = f(q_i,I)$ pour un état $q_i$ et un symbole en entrée $I$.
### Exemple: langage des moutons
- Expression régulière: `/baa+!/`
- Graphe:
- ![FSA sheep language](fsa_sheep.png)
- Caractéristiques:
- 5 états:
- Alphabet: a,b,!
- $q_0$ est l'état de départ
- $q_4$ est un état terminal
- 5 transitions
- Tableau
| |b|a|!|e|
|---|---|---|---|---|
|0|1||||
|1||1|||
|2||3|||
|3||3|4||
|4:|||||
### Reconnaissance déterministe
Processus qui:
- Démarre dans l'état initial
- Examine le symbole en entrée
- Consulte la table
- Sélectionne le nouvel état et met à jour le ruban
- Continue jusqu'à ce qu'on atteigne le bout du ruban
Algorithme déterministe: D-Recognise
- Une seule transition possible à chaque instant
- Interpréteur dirigé par une table de transition
- Trivial: On sait qu'on démarre sur le premier caractère et qu'on a un succès si on atteint l'état terminal à la fin du ruban. Mais, on peut atteindre l'état terminal avant la fin du ruban, et débuter ailleurs qu'au début du ruban.
Vérification d'expressions régulières:
- Traduire l'expression en table de transition
- Passer la table et la chaîne à un interpréteur
### Reconnaissance non-déterministe
Deux approches de base:
- Convertir un automate non-déterministe en automate déterministe.
- Transition $\epsilon$ qui n'avance pas le ruban.
- Gérer les différentes options comme une exploration dans un espace d'états
- Il existe au moins un chemin complet pour une chaîne définie par le langage de l'automate.
- Les chemins ne mènent pas tous à un état final.
- Aucun chemin ne mène à un état final si la chaîne ne fait pas partie du langage
- Les états de l'espace sont des paires (position du ruban, état de l'automate)
- On garde une trace des états non-explorés. Exploration en profondeur.
- Pour éviter le catastrophic backtracking, il fait éviter d'avoir deux match possibles pour le même caractère dans un groupe.
## Conclusion
Toute expression régulière peut être compilée automatiquement en un automate non-déterministe, que l'on peut convertir en automate déterministe.
# Tokenisation de mots et segmentation de phrases
# Normalisation
## Stemming
## Lemmatisation
## Analyse morphologique
# Distance minimale d'édition
# Modèles de langue N-grammes
## Modèles
## Estimation des probabilités
## Lissage
# Correction d'orthographe
# Classification de textes
## Naive Bayes
## Régression logistique
## Évaluation
## Métriques
## Validation croisée
# Analyse grammaticale
## Classe de mots
## POS Tags
## Analyseur
## Algorithme de Viterbi
## MEMM
## Choix d'attributs
# Analyse syntaxique
## Groupes syntaxiques
## Grammaire
## Analyseur
## CKY
## Probabiliste
## Analyseur de dépendances
## Chunking
# Recherche d'information
# Wordnet
# Cooccurences
# Premier travail pratique

16
fsa_sheep.dot Normal file
View file

@ -0,0 +1,16 @@
digraph fsa_sheep {
rankdir=LR;
node [shape = point, color=white, fontcolor=white]; start;
node [shape = doublecircle, color=black, fontcolor=black]; q4 [label=<q<SUB>4</SUB>>];
node [shape = circle];
q0 [label=<q<SUB>0</SUB>>];
q1 [label=<q<SUB>1</SUB>>];
q2 [label=<q<SUB>2</SUB>>];
q3 [label=<q<SUB>3</SUB>>];
start -> q0;
q0 -> q1 [ label = "b" ];
q1 -> q2 [ label = "a" ];
q2 -> q3 [ label = "a" ];
q3 -> q3 [ label = "a" ];
q3 -> q4 [ label = "!" ];
}