ajout fin n-grammes

This commit is contained in:
François Pelletier 2019-10-18 16:07:17 -04:00
parent d285d265b4
commit dd8c887983

View file

@ -6,6 +6,8 @@ highlight: pygments
number_sections: yes
toc: yes
toc_depth: 3
geometry: "left=2cm,right=2cm,top=2cm,bottom=2cm"
fontsize: 12pt
---
# Expressions régulières
@ -398,7 +400,7 @@ $$
## Estimation des probabilités
Estimateur du maximum de vraisemblance pour les bigrammes
Estimateur du maximum de vraisemblance pour les N-grammes, déterminé à partir d'un corpus d'entraînement.
$$
\begin{aligned}
@ -408,9 +410,131 @@ P(w_i|w_{i-1}) &= \frac{\texttt{count}(w_{i-1},w_i)}{\texttt{count}(w_{i-1})} \\
\end{aligned}
$$
Pour calculer les probabilités des bigrammes, on doit faire le compte des unigrammes et des bigrammes, puis, on divise le compte du bigramme par le compte de l'unigramme
Ex:
$$
\begin{aligned}
P(\texttt{want}|\texttt{I}) \\
&= \frac{P(\texttt{I want})}{P(\texttt{I})} \\
&= \frac{827}{2533} = 0.3265
\end{aligned}
$$
- Pour éviter de calculer des probabilités trop petites, on utilise des log-probabilités que l'on additionne au lieu de multiplier.
- On doit délimiter les débuts `<s>` et les fins de phrases `</s>`. On ajoute aussi la fin de phrase au vocabulaire.
- On valide la capacité de généralisation du modèle en générant des phrases ou en analysant les modèles N-grammes (aspects reliés à une langue).
### Génération aléatoire
- Choisir un bigramme aléatoire `(<s>,w)`
- Échantillonner un bigramme `(w,x)`
- Itérer jusqu'à l'obtention d'un bigramme `(x,</s>)`
### Différents corpus
Shakespeare:
- N=884647 jetons
- V=29066 types
- 300000 types de bigrammes, sur 844M possibles, soit 0.04%
### Évaluation
Les textes générés avec des modèles d'ordres supérieurs sont plus cohérents. Ils ressemblent aux textes utilisés pour construire les modèles.
Méthodes de validation intrinsèques:
- Holdout: ensembles d'entraînement et de test
- Métrique d'évaluation:
- Perplexité (à minimiser)
- Limites:
- Données de test peuvent être très différentes des données d'entraînement
- La perplexité est une mauvaise approximation dans ce cas
$$
\begin{aligned}
PP(W) &= \sqrt[N]{\frac{1}{P(w_1,\ldots,w_N)}} \\
&= \sqrt[N]{\prod_{i=1}^{N}\frac{1}{P(w_i|w_1,\ldots,w_{i-1})}}
\end{aligned}
$$
- Méthodes extrinsèques: tester deux modèles dans une application et prendre le meilleur selon une métrique propre à l'application.
## Lissage
# Correction d'orthographe
- Les bigrammes qui sont rares ont souvent une probabilité de 0 avec la méthode du maximum de vraisemblance, car ils ne seront pas rencontrés dans le corpus d'entraînement.
- On veut les considérer dans nos calculs: on applique un lissage
### Lissage de Laplace
- Consiste à ajouter un compte de 1 à tous les n-grammes. On augmente donc la taille du corpus de $|V|$ jetons.
La probabilité de rencontrer le mot $w_i$ devient:
$$
P_{\texttt{Laplace}}(w_i) = \frac{c_i+1}{N+V}
$$
Les comptes reconstruits sont:
$$
c_i^{\star} = (c_i+1)\frac{N}{N+V}
$$
Appliqué aux bigrammes, ces équations deviennent:
$$
\begin{aligned}
P_{\texttt{Laplace}}(w_n|w_{n-1}) &= \frac{C(w_{n-1}w_n)+1}{C(w_{n-1})+V} \\
c^{\star}(w_{n-1}w_n) &= (C(w_{n-1}w_n)+1)\frac{C(w_{n-1})}{C(w_{n-1})+V}
\end{aligned}
$$
- Enjeux
- Approche trop drastique
- On peut utiliser une valeur $\delta \in [0,1]$, mais ce choix est difficile
- Pas utilisé en pratique pour les N-grammes, il y a de meilleures méthodes.
- Utilisé pour lisser d'autres types de modèles probabilistes.
- Classification de textes
- Études pilotes
- Lorsqu'il n'y a pas beaucoup de zéros.
### Autres approches de lissage:
- Si $C(xyz)=0$, on peut utiliser $p(z|y)$ et $p(z)$
- Interpolation (combinaison)
- Interpolation simple:
$$
\begin{aligned}
\hat{P}(w_n|w_{n-2}w_{n-1}) &= \lambda_{1}P(w_n|w_{n-2}w_{n-1})\\
&+\lambda_{2}P(w_n|w_{n-1})\\
&+\lambda_{3}P(w_n)\\
\sum_{i} \lambda_i&=1
\end{aligned}
$$
- Version plus sophistiquée:
$$
\begin{aligned}
\hat{P}(w_n|w_{n-2}w_{n-1}) &= \lambda_{1}(w_{n-2}^{n-1})P(w_n|w_{n-2}w_{n-1})\\
&+\lambda_{2}(w_{n-2}^{n-1})P(w_n|w_{n-1})\\
&+\lambda_{3}(w_{n-2}^{n-1})P(w_n)
\end{aligned}
$$
- Les lambdas sont déterminés à partir d'un jeu de validation (devset) séparé du jeu d'entraînement et de celui de test.
- Backoff (on utilise le premier non-nul en ordre décroissant: $C(zyx)$, $C(zy)$, $C(z)$
- Katz Backoff
- Stupid (web) backoff. Cet algorithme ne génère pas une distribution de probabilité, on identifie alors la mesure par $S$.
$$
\begin{aligned}
S(w_i|w_{i-k+1}^{i-1}) &=
\begin{cases}
\frac{C(w_{i-k+1}^i)}{C(w_{i-k+1}^{i-1})}&,\texttt{si } C(w_{i-k+1}^i) >0\\
0.4S(w_i|C(w_{i-k+2}^{i-1}))&,\texttt{sinon}
\end{cases} \\
S(w_i) &= \frac{C(w_i)}{N}\\
\end{aligned}
$$
# Classification de textes