Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| tc_info:2020_cm_textes [2023/11/30 00:09] – [5. Modèles génératifs] edauce | tc_info:2020_cm_textes [2025/04/23 10:59] (Version actuelle) – edauce | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| + | ===== Algorithmes sur les Textes ===== | ||
| + | |||
| + | ==== 1 Données texte ==== | ||
| + | |||
| + | ===1.1 Encodage des données=== | ||
| + | |||
| + | On distingue classiquement deux grandes catégories de données : | ||
| + | |||
| + | * données **quantitatives**: | ||
| + | * numérique entier ou réel, discrètes ou continues, bornées ou non. ex: poids, taille, âge, taux d’alcoolémie, | ||
| + | * temporel : date, heure | ||
| + | * numéraire | ||
| + | * etc... | ||
| + | * données **qualitatives**: | ||
| + | * de type vrai/faux (données booléennes). ex: marié/non marié, majeur/non majeur | ||
| + | * de type appartenance à une classe. ex: célibataire/ | ||
| + | * de type texte (autrement dit “chaine de caractères”). ex: nom, prénom, ville,... | ||
| + | |||
| + | |||
| + | |||
| + | <note important> | ||
| + | D'un point de vue informatique, | ||
| + | |||
| + | Une valeur numérique (digitale) consiste en: | ||
| + | * un champ de bits (dont la longueur est exprimée en octets) | ||
| + | * un processus de décodage : le **format** (ou type) | ||
| + | </ | ||
| + | |||
| + | * Les données manipulées par un programme: | ||
| + | * sont codées sous un format binaire, | ||
| + | * correspondant à un des types informatiques que vous connaissez déjà : | ||
| + | * entier, | ||
| + | * chaîne de caractères, | ||
| + | * réel simple ou double précision etc... | ||
| + | * ce qui implique en particulier : | ||
| + | * une précision finie, | ||
| + | * éventuellement des contraintes de place (le nom ou le prénom ne pouvant pas dépasser n caractères, | ||
| + | |||
| + | |||
| + | === 1.2 Codage des caractères === | ||
| + | <code java> | ||
| + | char x; | ||
| + | x = ' | ||
| + | </ | ||
| + | * '' | ||
| + | * ''' | ||
| + | |||
| + | * | ||
| + | * Codage ASCII : | ||
| + | * codage de symboles du clavier numérique. | ||
| + | * Le nombre de symboles étant inférieur à 256, on le code sur un octet : 2⁸ (= 256) valeurs différentes | ||
| + | * Codage UTF-8 : | ||
| + | * codage universel qui permet entre autre de coder les accents | ||
| + | * Codage latin-1 (caractères latins étendus) | ||
| + | * etc... | ||
| + | |||
| + | < | ||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | |||
| + | <note important> | ||
| + | Il existe différents encodages binaires possibles pour les caractères : | ||
| + | * le code ASCII code les caractères du clavier anglais sur 7 bits, ce qui permet d' | ||
| + | * ainsi : | ||
| + | <code java> | ||
| + | char c = '/'; | ||
| + | int code = (int) c; | ||
| + | System.out.println(code); | ||
| + | </ | ||
| + | * | ||
| + | * affiche la valeur '' | ||
| + | </ | ||
| + | |||
| + | voir aussi : {{https:// | ||
| + | |||
| + | === 1.3 Codage des mots et du texte === | ||
| + | Chaîne de caractère : | ||
| + | <code java> | ||
| + | String s = " | ||
| + | </ | ||
| + | * '' | ||
| + | * ''" | ||
| + | * " | ||
| + | * assimilable à un tableau de caractère : | ||
| + | <code java> | ||
| + | for (char c : s.toCharArray()) { | ||
| + | System.out.println(c); | ||
| + | } | ||
| + | </ | ||
| + | Affiche : | ||
| + | b | ||
| + | o | ||
| + | n | ||
| + | j | ||
| + | o | ||
| + | u | ||
| + | r | ||
| + | |||
| + | Le programme affiche les caractère 1 par 1, c’est une " | ||
| + | |||
| + | <note important> | ||
| + | * La norme UTF-8 encode les caractères sur un nombre d' | ||
| + | * Exemple : le smiley ''' | ||
| + | <code java> | ||
| + | String s = " | ||
| + | int code = s.codePointAt(0); | ||
| + | System.out.println(code); | ||
| + | </ | ||
| + | * On peut inversement afficher le caractère à partir de son code entier : | ||
| + | <code java> | ||
| + | int code1 = 233; | ||
| + | int code2 = 119070; | ||
| + | |||
| + | char char1 = (char) code1; | ||
| + | String char2 = new String(Character.toChars(code2)); | ||
| + | |||
| + | System.out.println(char1); | ||
| + | System.out.println(char2); | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | **Donnée texte** | ||
| + | |||
| + | Un texte, au même titre qu'un mot, est une chaîne de caractères (dont la longueur est définie par la longueur de | ||
| + | la séquence de caractères qui définissent le texte, ponctuations, | ||
| + | |||
| + | |||
| + | Par définition les caractères séparateurs définissent la taille des espaces entre les mots, ainsi que les passages à la ligne lors de l' | ||
| + | |||
| + | <note tip> ** Les caractères séparateurs ** | ||
| + | * <code java>'' | ||
| + | * <code java>' | ||
| + | * <code java>' | ||
| + | * <code java>' | ||
| + | * <code java>' | ||
| + | * etc. | ||
| + | </ | ||
| + | |||
| + | **Codage du texte** | ||
| + | |||
| + | L' | ||
| + | |||
| + | Pour traduire une //chaîne de caractères// | ||
| + | * ainsi, dans le système décimal, la position du chiffre dans le nombre définit à quelle puissance de 10 il appartient (unité, dizaines, centaines, etc...) Le chiffre le plus à gauche a la puissance la plus élevée et celui le plus à droite la puissance la plus faible. | ||
| + | * Si on suppose, pour simplifier, que chaque caractère est codé par un entier entre 0 et 255 (soit le code ASCII " | ||
| + | * Un tel nombre s' | ||
| + | * Il existe une fonction '' | ||
| + | * Exemple : | ||
| + | <code java> | ||
| + | String s = " | ||
| + | | ||
| + | // Encodage de la chaîne en bytes en utilisant UTF-8 | ||
| + | byte[] b = s.getBytes(); | ||
| + | | ||
| + | // Affichage des bytes encodés | ||
| + | for (byte byteValue : b) { | ||
| + | System.out.print(byteValue + " "); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ce qui affiche: | ||
| + | < | ||
| + | 112 97 117 108 46 112 111 105 116 101 118 105 110 64 99 101 110 116 114 97 108 101 45 109 97 114 115 101 105 108 108 101 46 102 114 | ||
| + | </ | ||
| + | |||
| + | Un nombre en base 256 est difficile à lire et interpréter. On le traduit en base 10 : | ||
| + | <code java> | ||
| + | // Conversion des bytes en BigInteger | ||
| + | BigInteger bigInteger = new BigInteger(b); | ||
| + | |||
| + | // Affichage du résultat | ||
| + | System.out.println(" | ||
| + | </ | ||
| + | Ce qui donne : | ||
| + | < | ||
| + | i = 852806586114976881510056778471769180697471859150728801241505293627173168229624211058 | ||
| + | </ | ||
| + | |||
| + | |||
| + | === 1.4 Textes et bases de textes === | ||
| + | |||
| + | |||
| + | * Bases de textes : ensemble constitué de plusieurs textes | ||
| + | * Bases de documents, | ||
| + | * Dossiers contenant des documents | ||
| + | * Collections de livres (électroniques) | ||
| + | * → 10 - 10⁴ | ||
| + | * Contenus en ligne (descriptifs de films, articles de journaux, descriptifs de produits.) | ||
| + | * → 10⁵ - 10⁶ | ||
| + | * Ensemble du web (les pages web, en tant que telles, peuvent être considérées comme du texte mis en forme par du html). | ||
| + | * → 10⁹ | ||
| + | * Messageries, | ||
| + | * 10³ - 10⁶ | ||
| + | ==Problématiques de la recherche de texte :== | ||
| + | |||
| + | * temps de réponse des algorithmes : | ||
| + | * l’utilisateur classique veut attendre moins de 2 à 3 secondes. | ||
| + | * Sur des bases extrêmement grandes (type recherche web), il faut donc être très performant pour atteindre ces temps de réponses. | ||
| + | * Stockage des données : | ||
| + | * intégralité des textes ou simple descriptif/ | ||
| + | * Les moteurs de recherche par exemple ne stockent aucune page web, ils ne stockent que des index et des références. | ||
| + | |||
| + | |||
| + | ==Remarque :== | ||
| + | Un document texte pourra être décrit soit comme : | ||
| + | * une séquence de caractères (lettres) | ||
| + | * une séquence de termes (mots) | ||
| + | |||
| + | ==== 2 Recherche dans les textes ==== | ||
| + | ==Exemples :== | ||
| + | * → Recherche d’un terme : “artichaud” | ||
| + | * → Recherche d’un motif (expression régulière) : une adresse email, une URL, un expéditeur, | ||
| + | |||
| + | |||
| + | |||
| + | === 2.1 Rechercher un terme === | ||
| + | |||
| + | ** Recherche simple ** | ||
| + | |||
| + | '' | ||
| + | On cherche un algorithme qui retourne toutes les occurrences (position dans le doc) d’un certain terme '' | ||
| + | |||
| + | '' | ||
| + | |||
| + | '' | ||
| + | |||
| + | "Les amis de mes amis sont mes amis." | ||
| + | | ||
| + | | ||
| + | |||
| + | * → La position de la première occurrence du terme t : | ||
| + | * → Les positions de toutes les occurrences du terme t : | ||
| + | * Complexité : $O(m \times k)$ | ||
| + | |||
| + | on note '' | ||
| + | |||
| + | < | ||
| + | Algo : recherche_simple | ||
| + | Données : d, t : chaînes de caractères | ||
| + | Début | ||
| + | n = len (d) | ||
| + | m = len (t) | ||
| + | i <-- 0 | ||
| + | tant que i < n - m: | ||
| + | j <-- 0 | ||
| + | tant que j < m et d[i+j] = t[j] : | ||
| + | j += 1 | ||
| + | si j == m : | ||
| + | | ||
| + | sinon : | ||
| + | i <-- i + 1 | ||
| + | Fin | ||
| + | </ | ||
| + | |||
| + | **Remarque :** Il peut être nécessaire de vérifier que le terme est précédé et suivi par les caractères d’espacement pour éviter de détecter les mots dont le mot recherché est préfixe ou suffixe. | ||
| + | |||
| + | Cette approche a un inconvénient : après une comparaison infructueuse, | ||
| + | |||
| + | ** Algorithme de Boyer-Moore ** | ||
| + | |||
| + | L' | ||
| + | |||
| + | * On suppose qu'on peut tester si un caractère '' | ||
| + | * Le but est de calculer un décalage permettant de ne pas inspecter les positions où il n'y a aucune chance de trouver le motif '' | ||
| + | * On commence par chercher la position '' | ||
| + | * Soit '' | ||
| + | * Si '' | ||
| + | * Sinon on note '' | ||
| + | * si '' | ||
| + | * Sinon le décalage est égal à '' | ||
| + | |||
| + | <note tip> | ||
| + | Exemple | ||
| + | RECHERCHE DE CHAINES CODEES EN MACHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | CHINE | ||
| + | RECHERCHE DE CHAINES CODEES EN MACHINE | ||
| + | </ | ||
| + | |||
| + | === 2.2 Compter les mots === | ||
| + | |||
| + | |||
| + | Lecture séquentielle des caractères : | ||
| + | "Les amis de mes amis sont mes amis." | ||
| + | | ||
| + | | ||
| + | |||
| + | * Il ne faut compter que les debuts de mots | ||
| + | * Un début de mot est un caractère // | ||
| + | < | ||
| + | {a, | ||
| + | </ | ||
| + | * Tout ce qui n'est pas alphanumérique est un caractère // | ||
| + | < | ||
| + | {!,#, | ||
| + | </ | ||
| + | * Autrement dit on compte les couples (caractère séparateur, | ||
| + | * remarque : le début de chaîne compte comme un caractère séparateur | ||
| + | |||
| + | **remarque** : pour extraire la liste des mots présents dans le texte, on doit identifier les débuts et les fins de mots : | ||
| + | * un début de mot est un couple (sep., alphanum.) | ||
| + | * une fin de mot est un couple (alphanum., sep.) | ||
| + | |||
| + | < | ||
| + | Algo : compte-mots | ||
| + | Données : | ||
| + | - d : chaîne de caractères | ||
| + | Début: | ||
| + | nb_mots <-- 0 | ||
| + | sep <-- Vrai | ||
| + | pour tout c dans d: | ||
| + | si sep est Vrai et c est alphanumérique: | ||
| + | sep <-- Faux | ||
| + | nb_mots <-- nb_mots + 1 | ||
| + | sinon si sep est Faux et c est séparateur: | ||
| + | sep <-- Vrai | ||
| + | retourner nb_mots | ||
| + | Fin | ||
| + | </ | ||
| + | |||
| + | Code équivalent : compter les mots à l'aide d'un automate fini: | ||
| + | |||
| + | {{: | ||
| + | <code python> | ||
| + | def compte_mots(d): | ||
| + | state = 0 | ||
| + | cpt = 0 | ||
| + | for i in range(len(d)): | ||
| + | if state == 0 and is_alpha(d[i]): | ||
| + | state = 1 | ||
| + | cpt += 1 | ||
| + | if state == 1 and is_sep(d[i]): | ||
| + | state = 0 | ||
| + | return cpt | ||
| + | </ | ||
| + | |||
| + | **Présentation**: | ||
| + | |||
| + | * les sommets du graphe sont les états. Un état identifie une étape de calcul. L' | ||
| + | * les arêtes représentent les transitions d' | ||
| + | |||
| + | Pour réaliser des calculs, on a besoin d' | ||
| + | |||
| + | Enfin, des résultats de calcul sont produits en sortie de l' | ||
| + | |||
| + | Plus concrètement, | ||
| + | |||
| + | **Définition**: | ||
| + | |||
| + | Un automate fini est défini par : | ||
| + | * un alphabet d' | ||
| + | * un alphabet de sortie $\Sigma$' | ||
| + | * un ensemble (fini) de sommets : $S$ | ||
| + | * un ensemble fini d' | ||
| + | * un état initial $s_0 \in S$ | ||
| + | |||
| + | L' | ||
| + | |||
| + | <note tip> | ||
| + | Exemple : un automate qui effectue l' | ||
| + | * $\Sigma = \{0, 1\}²$ | ||
| + | * $\Sigma' | ||
| + | * $S = \{1, 2\}$ | ||
| + | * $s_0 = 1$ | ||
| + | {{: | ||
| + | </ | ||
| + | La famille des automates finis définit une classe de calculs (l' | ||
| + | * séquences | ||
| + | * boucles et branchements conditionnels | ||
| + | |||
| + | Mais pas : | ||
| + | * appels récursifs | ||
| + | |||
| + | remarque: | ||
| + | * automates à piles (calcul récursif) | ||
| + | * machines de Turing et machines de Turing universelles (calcul sur des automates) | ||
| + | permettant d' | ||
| + | |||
| + | === 2.3 Recherche de motifs et expressions régulières === | ||
| + | |||
| + | De manière plus générale recherche d’expressions peut être effectuée à l’aide d’automates finis **non déterministes**. | ||
| + | * Parmi les états on distingue les états initiaux et terminaux. | ||
| + | * Il existe (parfois) plusieurs transitions possibles pour un même symbole lu | ||
| + | * Lorsque l' | ||
| + | |||
| + | Remarque : pour tout automate fini non déterministe A, il existe un automate fini déterministe A′ qui reconnait le même langage (plus compliqué à écrire). | ||
| + | |||
| + | Représentation graphique : | ||
| + | * les états dans des cercles, | ||
| + | * l’unique état initial par une flèche pointant sur un état, | ||
| + | * les états terminaux par un double cercle concentrique sur l’état. | ||
| + | * Les transitions d’état quant à elles sont représentées par une flèche allant de l’état de départ jusqu’à l’état d’arrivée indexée par le caractère (ou le groupe de caractères) autorisant la transition. | ||
| + | |||
| + | |||
| + | Lecture séquentielle des caractères : | ||
| + | "Les amis de mes amis sont mes amis." | ||
| + | | ||
| + | | ||
| + | |||
| + | |||
| + | <note tip> | ||
| + | Exemple : mots se terminant par $ab$ | ||
| + | * $\Sigma = \{a, b\}$ | ||
| + | |||
| + | L' | ||
| + | ab | ||
| + | bab | ||
| + | abab | ||
| + | bbab | ||
| + | aabab | ||
| + | abbab | ||
| + | babab | ||
| + | bbbab | ||
| + | aaabab | ||
| + | etc.. | ||
| + | | ||
| + | {{: | ||
| + | |||
| + | Pour aller plus loin : {{https:// | ||
| + | </ | ||
| + | |||
| + | **Exemples**: | ||
| + | * Reconnaître un nombre entier : '' | ||
| + | {{: | ||
| + | * Reconnaître un nombre réel : | ||
| + | * TODO | ||
| + | |||
| + | **Remarques** : | ||
| + | * Les classes d' | ||
| + | * En python, les expressions régulières s' | ||
| + | * Les expressions régulières (regex) servent à décrire des motifs complexes à chercher (" | ||
| + | |||
| + | |||
| + | Traduction de l' | ||
| + | [ab]*ab | ||
| + | | ||
| + | Remarque : les langages qui peuvent être reconnus par des expressions régulières sont appelés les //langages réguliers// | ||
| + | |||
| + | Exemples de langages non réguliers: | ||
| + | * reconnaître les palindromes | ||
| + | * reconnaître une expression arithmétique | ||
| + | * vérifier la syntaxe d'un code informatique | ||
| + | |||
| + | === Syntaxe des expressions régulières Python === | ||
| + | |||
| + | Définition : Il s’agit d’une syntaxe “condensée” de description d’automates finis permettant de reconnaître des motifs dans un texte. | ||
| + | |||
| + | En Python, les expressions régulières sont implémentées dans la librairie '' | ||
| + | |||
| + | <code python> | ||
| + | |||
| + | import re | ||
| + | |||
| + | d = "Les astronautes de la mission Gemini 8 sont désignés le 20 septembre 1965 : Armstrong est le commandant et David Scott le pilote. Ce dernier est le premier membre du groupe d' | ||
| + | |||
| + | liste_termes = re.findall(r" | ||
| + | </ | ||
| + | |||
| + | == Transitions : caractères et groupes de caractères== | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | Def : une expression est définie comme une suite de transition. Le mot est accepté lorsque la suite de transitions est respectée | ||
| + | |||
| + | Exemple : | ||
| + | r" | ||
| + | accepte chalet et chalut | ||
| + | r" | ||
| + | accepte tous les mots de 3 lettres | ||
| + | |||
| + | **Branchements et itération** | ||
| + | * Les parenthèses permettent : | ||
| + | * de factoriser une expression (qui peut alors être traitée comme une transition) | ||
| + | * '' | ||
| + | * de définir des branchements (Union): | ||
| + | * '' | ||
| + | |||
| + | * '' | ||
| + | * '' | ||
| + | * ''?'' | ||
| + | |||
| + | <note tip> ** Récapitulatif ** | ||
| + | |||
| + | 1. **Caractères littéraux :** | ||
| + | * Les caractères alphabétiques et numériques sont traités littéralement. Par exemple, le motif ''" | ||
| + | |||
| + | 2. **Caractères spéciaux :** | ||
| + | * Certains caractères ont une signification spéciale dans une expression régulière et doivent être échappés s'ils doivent être traités littéralement. Ces caractères spéciaux incluent '' | ||
| + | |||
| + | 3. **Classes de caractères :** | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | 4. **Caractères génériques :** | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | 5. **Quantificateurs :** | ||
| + | * '' | ||
| + | * '' | ||
| + | * ''?'' | ||
| + | * '' | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | 6. **Ancrages :** | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | 7. **Groupes et Alternatives :** | ||
| + | * '' | ||
| + | * '' | ||
| + | |||
| + | 8. **Échappement :** | ||
| + | * '' | ||
| + | |||
| + | </ | ||
| + | ==exemples== | ||
| + | |||
| + | * reconnaître une adresse mail : | ||
| + | < | ||
| + | | ||
| + | </ | ||
| + | ==== 3 Complétion / Correction ==== | ||
| + | Un algorithme de complétion est un mécanisme logique permettant d' | ||
| + | |||
| + | On utilise pour cela une structure de données arborescente, | ||
| + | |||
| + | On commence par construire un arbre de complétion à partir de mots de vocabulaire, | ||
| + | |||
| + | <note tip> | ||
| + | V = {art, arbre, des, dessin} | ||
| + | |||
| + | {{: | ||
| + | </ | ||
| + | |||
| + | L' | ||
| + | * Pour chaque nœud, le nombre de fils est de l' | ||
| + | * La hauteur maximale est celle de la taille maximale des mots de vocabulaire $n_{max}$ | ||
| + | * Par construction, | ||
| + | |||
| + | Une fois l' | ||
| + | |||
| + | Exemple : | ||
| + | * début de mot : '' | ||
| + | * complétions possibles : '' | ||
| + | |||
| + | ** Autre exemple:** | ||
| + | {{https:// | ||
| + | ==== 4 Comparaison/ | ||
| + | On cherche à exprimer une distance entre deux chaînes de caractères. | ||
| + | Une distance entre 2 textes d1 et d2 est telle que : | ||
| + | * dist(d1,d2) = dist(d2,d1) | ||
| + | * dist(d1,d2) ≥ 0 | ||
| + | * dist(d1,d2) + dist(d2,d3) ≥ dist(d1,d3) | ||
| + | |||
| + | === Distance de Hamming | ||
| + | La distance de Hamming entre deux chaînes de même taille est définie comme le nombre de caractères non appariés. Ainsi la distance de Hamming entre " | ||
| + | |||
| + | |||
| + | **Exemple** : | ||
| + | |||
| + | p a s s o i r e | ||
| + | | | | x x x x | | ||
| + | p a s t e q u e | ||
| + | |||
| + | distance = 4 | ||
| + | |||
| + | Peut-on généraliser cette distance à des chaînes de taille différente? | ||
| + | |||
| + | === Distance d' | ||
| + | La distance d’édition est définie, pour deux chaînes de longueur quelconque, comme le nombre minimal d’opérations permettent de transformer d1 en d2, avec les opérations suivantes : | ||
| + | * **ins**(a) ⇢ insertion du caractère a | ||
| + | * **perm** (a, b) ⇢ remplacement de a par b | ||
| + | * **del** (a) ⇢ suppression du caractère a | ||
| + | |||
| + | Il existe différentes manières de transformer la chaîne d1 en d2. On peut par exemple supprimer tous les caractères de d1 et insérer tous les caractères de d2, mais c'est rarement le nombre d' | ||
| + | |||
| + | - Exemples: | ||
| + | * distance entre " | ||
| + | < | ||
| + | - r o b - e | ||
| + | v | ^ | v | | ||
| + | a r - b r e | ||
| + | </ | ||
| + | dist = 3 | ||
| + | < | ||
| + | r o b - e | ||
| + | x | x v | | ||
| + | p o r t e | ||
| + | </ | ||
| + | dist = 3 | ||
| + | < | ||
| + | a - r b r e | ||
| + | x v | x ^ | | ||
| + | p o r t - e | ||
| + | </ | ||
| + | dist = 4 | ||
| + | |||
| + | |||
| + | ===Calcul complet cloche/ | ||
| + | |||
| + | La résolution de ce problème repose sur les principes de la programmation dynamique. | ||
| + | |||
| + | Un problème d' | ||
| + | * un problème | ||
| + | * un ensemble de solutions à ce problème | ||
| + | * une fonction de coût (ou une fonction objectif) qui attribue un coût (resp un gain) à chacune des solutions possibles apportées au problème | ||
| + | |||
| + | Le nombre de solutions possibles à un problème d' | ||
| + | |||
| + | Certains problèmes d'OC peuvent être résolus selon le principe de la **programmation dynamique** qui consiste à décomposer le problème en sous-problèmes (et en sous-solutions): | ||
| + | * soit un problème P présentant une solution S de coût C | ||
| + | * Étant donné un sous problème $p \subset P$, | ||
| + | * on liste l' | ||
| + | * et on sélectionne celle dont le coût est le plus faible | ||
| + | * on modifie S selon la sous-solution sélectionnée | ||
| + | * on met à jour le coût global | ||
| + | * on met à jour le sous-problème | ||
| + | * et on recommence jusqu' | ||
| + | |||
| + | Dans le cas de l' | ||
| + | * une solution est un ensemble de transformations acceptables pour passer de la chaîne A à la chaîne B | ||
| + | * le coût est la somme des coûts des transformations appliquées | ||
| + | * un sous-problème consiste à apparier un morceau de A avec un morceau de B | ||
| + | |||
| + | En pratique: | ||
| + | * on représente l’ensemble des transformations de d1 vers d2 sous la forme d’un tableau de (m + 1) lignes et (n + 1) colonnes, avec m = |d1| et n = |d2| | ||
| + | * pour chaque case (i,j) du tableau, | ||
| + | * le passage vers la case (i, j+1) correspond à ins(d2[j]) | ||
| + | * le passage vers la case (i+1, j) correspond à del(d1[i]) | ||
| + | * le passage vers la case (i+1, j+1) correspond à perm(d1[i], | ||
| + | * la valeur de la distance au niveau de la case (i,j) est égale au minimum de : | ||
| + | * 1 + dist(i, j+1) | ||
| + | * 1 + dist(i+1, j) | ||
| + | * dist(i+1, j+1) si d1[i]=d2[j], | ||
| + | * la distance au niveau de la case (m,n) vaut 0 | ||
| + | * la distance d' | ||
| + | |||
| + | {{: | ||
| + | |||
| + | === Algorithme === | ||
| + | |||
| + | Préparation | ||
| + | |||
| + | < | ||
| + | variables globales : d1, d2 : chaînes de caractères | ||
| + | m = |d1| | ||
| + | n = |d2| | ||
| + | </ | ||
| + | |||
| + | Récursif!! | ||
| + | < | ||
| + | algo : distance | ||
| + | données : | ||
| + | i, j : etape de calcul | ||
| + | début | ||
| + | si i = m et j = n : | ||
| + | | ||
| + | sinon si i = m : | ||
| + | | ||
| + | sinon si j = n : | ||
| + | | ||
| + | sinon si d1[i] = d2[j] : | ||
| + | | ||
| + | sinon | ||
| + | | ||
| + | fin | ||
| + | </ | ||
| + | |||
| + | === Alignement glouton === | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ==== 5. Modèles génératifs (Hors programme) ==== | ||
| + | |||
| + | Soit un document $d$ : | ||
| + | * constitué de $T$ symboles $d[1]$, …, $d[i]$, …. | ||
| + | * appartenant à l' | ||
| + | |||
| + | |||
| + | Une description statistique d’un texte correspond à un histogramme qui porte sur un ensemble de symboles : | ||
| + | |||
| + | {{: | ||
| + | |||
| + | <note tip> | ||
| + | Modèles probabiliste : la suite de symbole observés (le message) est générée par un processus aléatoire: | ||
| + | $d = (d_1, d_2, ..., d_T$) | ||
| + | * chaque $d_i$ est la réalisation d'un tirage aléatoire | ||
| + | * obéissant à une distribution de probabilité $p$ | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | Les symboles sont au choix : | ||
| + | * des caractères appartenant à un alphabet | ||
| + | * des termes appartenant à un vocabulaire | ||
| + | </ | ||
| + | |||
| + | === 5.1 Modèles probabilistes === | ||
| + | |||
| + | Les modèles probabilistes interprètent les données de type texte comme étant générées par une distribution de probabilité $P$ inconnue. | ||
| + | |||
| + | La distribution $P$ définit le langage utilisé dans le texte. On ne s' | ||
| + | |||
| + | === Fréquence d'un symbole === | ||
| + | |||
| + | Soit $\alpha \in A$ un symbole de l' | ||
| + | |||
| + | On a par définition~: | ||
| + | $$\sum_{\alpha \in V} P(X=\alpha) = 1$$ | ||
| + | |||
| + | |||
| + | < | ||
| + | **Exemple**: | ||
| + | $$\boldsymbol{p}_\text{Français} = (0.0942, 0.0102, 0.0264, | ||
| + | où | ||
| + | * $p_1 = 0.0942$ est la fréquence de la lettre ' | ||
| + | * $p_2 = 0.0102$ est la fréquence d' | ||
| + | * etc. | ||
| + | </ | ||
| + | |||
| + | |||
| + | === Probabilité jointe === | ||
| + | |||
| + | On s' | ||
| + | |||
| + | Soient $\alpha$ et $\beta$ deux symboles de l' | ||
| + | |||
| + | < | ||
| + | * Les séquences de deux caractères sont classiquement appelées des // | ||
| + | * On définit de même les // | ||
| + | * etc. | ||
| + | </ | ||
| + | |||
| + | On notera $\boldsymbol{P}_\mathcal{L}$ la matrice des fréquences des bigrammes dans un langage $\mathcal{L}$ donné, où $P_{ij}$ donne la fréquence du bigramme $(\alpha_i, | ||
| + | |||
| + | < | ||
| + | **Exemple**: | ||
| + | $$\boldsymbol{P}_\text{Français} = 10^{-5} \times \left( | ||
| + | \begin{array}{cccc} | ||
| + | 1.5 & 116.8 & 199.1 & ...\\ | ||
| + | 62.8 & 1.6 & 0.14 & ...\\ | ||
| + | 184.8 & 0 & 52.4 & ...\\ | ||
| + | & | ||
| + | \end{array} | ||
| + | \right)$$ | ||
| + | |||
| + | |||
| + | où | ||
| + | * $P_{11} = 1.5 \times 10^{-5}$ est la fréquence du bigramme ' | ||
| + | * $P_{12} = 116.8 \times 10^{-5}$ est la fréquence d' | ||
| + | * etc. | ||
| + | </ | ||
| + | |||
| + | avec bien sûr : | ||
| + | $$\sum_{(i, | ||
| + | |||
| + | <note tip> | ||
| + | voir {{http:// | ||
| + | </ | ||
| + | |||
| + | La **probabilité conditionnelle** du caractère $\beta$ étant donné le caractère précédent $\alpha$ est définie comme : | ||
| + | |||
| + | $$P(Y = \beta | X=\alpha) = \frac{|\xi \in \Xi : (X, | ||
| + | |||
| + | <note tip> | ||
| + | |||
| + | {{public: | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | Soit en français : | ||
| + | |||
| + | < | ||
| + | $$ | ||
| + | M_\text{Français} = \left( | ||
| + | \begin{array}{cccc} | ||
| + | 0.0016 & 0.0124 & 0.0211 & ...\\ | ||
| + | 0.0615 & 0.0016 & 0.0001 & ...\\ | ||
| + | 0.0700 & 0.0000 & 0.0198 & ...\\ | ||
| + | & ... &&& | ||
| + | \end{array} | ||
| + | \right) | ||
| + | $$ | ||
| + | où : | ||
| + | * $M_{11}$ est la probabilité de voir un ' | ||
| + | * $M_{12}$ est la probabilité de voir un ' | ||
| + | * etc. | ||
| + | </ | ||
| + | |||
| + | <note important> | ||
| + | La matrice des probabilités conditionnelles $M$ permet de définir un **modèle génératif** de langage inspiré des **processus aléatoires de Markov**: | ||
| + | * La production d'un mot ou d'un texte est modélisée comme un parcours aléatoire sur une chaîne de Markov définie par la matrice de transitions $M$. | ||
| + | * La fréquence d' | ||
| + | |||
| + | < | ||
| + | {{public: | ||
| + | </ | ||
| + | |||
| + | </ | ||
| + | |||
| + | On peutétendre ce principe à la distribution des mots dans les textes, ce qui permet de produire des //modèles génératifs de langage//. | ||
| + | |||
| + | * Exemple : le pseudo latin (" | ||
| + | * Exemple de pseudo-français (Utilisant une trace (mémoire) de 1 mot): | ||
| + | <note tip> | ||
| + | //j'ai vu parfois des yeux, remonter vers toi bien fatiguée! n'est pas un appel de la terre– je hume à coups mutins les voiles la blafarde lumière puisée au delà les vieux flacon débouché rien ne puis la pourriture les forêts ou bien que vénus par des choses dans les forts des senteurs confondues de ma chère, prêtre orgueilleux danse amoureusement l' | ||
| + | </ | ||
| + | |||
| + | === 5.2 Espaces de plongement (Word embedding) === | ||
| + | Le plongement des mots (word embedding) | ||
| + | * est une technique en traitement automatique du langage naturel (TALN) | ||
| + | * qui consiste à représenter les mots **sous forme de vecteurs de nombres réels dans un espace vectoriel**. | ||
| + | * L' | ||
| + | * de projeter les mots dans cet espace vectoriel | ||
| + | * où la proximité spatiale entre les vecteurs reflète la sémantique des mots. | ||
| + | |||
| + | <note tip> | ||
| + | Largement utilisés dans diverses tâches de traitement du langage naturel: | ||
| + | - classification de texte, | ||
| + | - la traduction automatique, | ||
| + | - l' | ||
| + | - la recherche d' | ||
| + | </ | ||
| + | |||
| + | **Word2Vec** est un algorithme d' | ||
| + | |||
| + | * L' | ||
| + | * Word2Vec utilise des modèles de **prédictions** pour apprendre des représentations vectorielles en analysant les contextes d' | ||
| + | |||
| + | Il existe deux architectures principales de Word2Vec : Skip-Gram et CBOW | ||
| + | |||
| + | === 1. Skip-Gram === | ||
| + | Dans l' | ||
| + | |||
| + | \[ \max \sum_{t=1}^{T} \sum_{-c \leq j \leq c, j \neq 0} \log P(w_{t+j} \mid w_t) \] | ||
| + | |||
| + | où \(T\) est la taille du corpus, \(w_t\) est le mot central, \(w_{t+j}\) est le mot contexte, et \(c\) est la taille de la fenêtre contextuelle. | ||
| + | |||
| + | === 2. CBOW (Continuous Bag of Words) === | ||
| + | Dans l' | ||
| + | |||
| + | \[ \max \sum_{t=1}^{T} \log P(w_t \mid w_{t-c}, \ldots, w_{t-1}, w_{t+1}, \ldots, w_{t+c}) \] | ||
| + | |||
| + | où \(T\) est la taille du corpus, \(w_t\) est le mot central, et \(w_{t-i}\) sont les mots contextuels dans la fenêtre de contexte. | ||
| + | |||
| + | === Fonctionnement Général === | ||
| + | Le processus d' | ||
| + | |||
| + | Une fois l' | ||
| + | |||
| + | Word2Vec a été révolutionnaire en raison de sa capacité à apprendre des représentations de mots utiles à partir de grands volumes de texte non annoté, et ses embeddings sont souvent utilisés comme points de départ pour de nombreuses tâches de traitement du langage naturel (NLP) et d' | ||