diff --git a/examen_partiel.md b/examen_partiel.md index 4bedb3f..1db61c5 100644 --- a/examen_partiel.md +++ b/examen_partiel.md @@ -693,8 +693,16 @@ $$ $$ - Mesure F1: $$ -2\left(\frac{\text{precision}\times\text{rappel}}{\text{precision}+\text{rappel}}\right) +F1 = 2\left(\frac{\text{precision}\times\text{rappel}}{\text{precision}+\text{rappel}}\right) $$ +- Mesure F: +$$ +F_{\alpha} = \frac{1}{\alpha P^{-1}+(1-\alpha) R^{-1}} +$$ + +- Si $\alpha < 0.5$, la précision est plus importante +- Si $\alpha > 0.5$, le rappel est plus important +- F1: $\alpha = 0.5$ ## Validation croisée @@ -962,7 +970,7 @@ Problème: Les mots ont souvent plus d'une étiquette, il faut alors déterminer - Probabilité de transition $A=\lbrace a_{ij} \rbrace$: modélise la séquence d'étiquettes - Probabilité d'émission $B=\lbrace b_i(k) \rbrace$: associe les mots aux étiquettes -![](hmm.png) +![Hidden Markov Model](hmm.png) Quelle est la meilleure séquence d'étiquettes qui correspond à la séquence d'observations ? @@ -1288,10 +1296,202 @@ C'est un problème d'étiquetage # Recherche d'information +**Recherche d'information**: +- Matériel (documents) +- Non-structuré +- Besoin d'information +- Grandes collections -# Wordnet +![Schéma général](recherche_info.png) +- Plusieurs modèles: + - Booléen + - Vectorial + - Probabiliste + - Latent semantic indexing + +## Recherche booléenne +- Expressions booléennes +- Retourne tous les documents qui satisfont l'expression +- Rencontré dans les bibliothèques (fonction de recherche avancée) +- Éviter d'utiliser des expressions régulières: + - Lent pour de grandes collections + - Orienté sur la ligne + - Négation n'est pas triviale + - Pas d'opérateur de proximité +- Construction d'une matrice terme-document +- Enjeux: + - Avec beaucoup de mots et de documents: matrice très large et très creuse + - N'enregistrer que les 1 +- Index inversé: + - Pour chaque terme, on garde une liste chaînée de tous les documents qui contiennent ce terme + - Structure de données: dictionnaire, trié par ordre alphabétique +- Avantages: + - Peut traiter toutes les requêtes booléennes + - Résultats précis: le document satisfait ou non +- Inconvénients: + - Il manque parfois un terme dans les longues requêtes + - Variantes morphologiques + - Texte d'ancrage + - Résultats sans ordre particulier + - Tous les résultats ont la même importance -# Premier travail pratique +![Index inversé](index_inverse.png) + +### Construire l'index inversé + +1. Prétraiter les documents + - Tokenisation + - Normalisation +2. Générer les postings (terme, identifiant document) +3. Trier les postings +4. Créer les listes et les compteurs de documents +5. Créer les structures de données (dictionnaire et listes) + +### Étapes de la requête + +- Recherche naïve: intersection des listes $O(N^2)$ +- Listes triées: avancer dans les listes en ordre croissant + +## Recherche vectorielle + +### Représentation + +Documents et requêtes: vecteurs de poids à N dimensions: + +- Poids: importance du terme $T_i$ dans le document $D_j$ +- Un terme fréquent dans un document est important +- Un terme fréquent dans plusieurs documents n'est pas important (stop words ou sujet général) +- Types de poids: + - Binaires (0 ou 1) + - Fréquence des termes (sans aucune modification) + - TF-IDF + - Poids TF-IDF: cette mesure présente plusieurs alternatives + - Information mutuelle +- Similarité entre les vecteurs +- Matrice de comptes (CountVectorizer dans scikit-learn). + +### TF-IDF + +$$ +w_{ik} = {tf}_{ik} \log(\frac{N}{n_k}) +$$ + +- $T_k$: Terme $k$ dans le document $D_i$ +- $tf_{ik}$: Fréquence de $T_k$ dans $D_i$ +- $N$: Nombre total de documents dans la collection $C$ +- $n_k$: Nombre de documents dans $C$ qui contiennent $T_k$ +- $idf_k$: Fréquence inverse de $T_k$ dans C + +### Similarité + +- Angle entre les vecteurs: produit scalaire ou cosinus. +- Certains vecteurs sont plus longs que d'autres, ce qui leur donne une importance relative. +- Il faut normaliser les vecteurs (leur donner une longueur de 1) + +$$ +\begin{aligned} +cos(\vec{q},\vec{d}) &= \frac{\vec{q} \cdot \vec{d}}{|\vec{q}||\vec{d}|} \\ +&= \frac{\sum_{i=1}^{|V|} q_{i}d_{i}}{\sqrt{\sum_{i=1}^{|V|} q_{i}^2}\sqrt{\sum_{i=1}^{|V|} d_{i}^2}} +\end{aligned} +$$ + +On peut alors retourner les documents qui ont le plus grand cosinus. +Mais on peut faire mieux en utilisant l'index inversé. + +$$ +\text{score}_d = \frac{\sum_{t} wf_{t,d}w_{t,q}}{|d|} +$$ + +Mesure de l'efficacité: + +- Précision: + +$$ +\frac{\text{pertinent et retenus}}{\text{retenus}} +$$ + +- Rappel: + +$$ +\frac{\text{pertinent et retenus}}{\text{pertinents}} +$$ + +- Mesure F +- Mean average precision: on calcule la précision pour chaque document retourné, cumulativement, pour plusieurs requêtes, et on fait la moyenne ensuite. +- Précision à 5, à 10 ... +- Mean reciprocal rank: inverse du rang du document le plus pertinent +$$ +\text{MRR} = \frac{1}{|Q|} \sum_{i=1}^{|Q|}\frac{1}{\text{rank}_i} +$$ +- Discounted cumulative gain: Tient compte du rang des documents pertinents +$$ +\text{DCG}_p=rel_1 + \sum_{i=2}^p \frac{rel_i}{\log_2{i}} +$$ + +## Lucene + +![Lucene: Indexation et recherche](lucene.png) + +# Sémantique lexicale + +- Raisonnement: idées similaires avec des mots différents (thesaurus) +- Utilisation: détection de plagiat, système question-réponses, résumé de textes +- Approches possibles: + - Taxonomie et thesaurus + - Approche distributionnelle +- Relations entre les mots (lemmes) + - Un lemme peut avoir plusieurs sens + - **Sens**: Représentation d'un aspect de la signification d'un mot + +## Relations + +Les mots et leurs sens peuvent être reliés par différentes relations: + +- Homonymie: forme commune (phonologie, orthographique ou les deux), mais sens différents + - Homophones + - Homographes + - Les deux + - Problèmes en NLP: + - Synthèse vocale (même orthographe mais phonologie différente) + - Recherche d'information (même mot, sens différents) + - Traduction automatique + - Reconnaissance vocale (même phonologie, orthographe différente) +- Polysémie: Un mot a plusieurs sens +- Synonymie: Peuvent être remplacés l’un pour l’autre +- Antonymie: s’opposent sur un aspect + - Binaire (adjectif) + - Échelle de valeurs (mesure) + - Réversibilité (action/verbes) +- Hyperonymie: plus général, regroupement +- Hyponymie: plus spécifique, sous-classe (inverse d'hyperonymie) +- Holonymie: compose le tout d'une partie (inverse de méronymie) +- Méronymie: une partie d'un tout + +## Wordnet + +Collection de sens de mots, regroupés sous la forme de *synsets*, des quasi-synonymes + +Il y a 4 types de synsets: + +- Nom +- Verbe +- Adjectif +- Adverbe + +Ils forment un graphe sémantique. Ils forment aussi une hiérarchie de concepts + +### SentiWordNet + +- Extension de WordNet pour l'analyse de sentiments et le forage d'opinions. Annotation de positivité, négativité ou neutralité. + +## Mesure de la similarité + +- Synonymie (simple) +- En pratique, on utilise la hierarchie de concepts (noms et verbes). +- On calcule la proximité par les chemins + - $pathlen(c_1,c_2)$: 1+ nombre de liens + - $sim_path(c_1,c_2) = \frac{1}{pathlen(c_1,c_2)}$ + - $wordsim(w_1,w_2) = max_{c_1 \in senses(w_1),c_2 \in senses(w_2)}$ diff --git a/index_inverse.drawio b/index_inverse.drawio new file mode 100644 index 0000000..f9af98d --- /dev/null +++ b/index_inverse.drawio @@ -0,0 +1 @@ +5ZpLc9sgEIB/jY71SEJ+9BjbadJHZtLm0PRIJSJRI+FByI/++iILLMnrpG6TGGaSS8QCC/r2wdrYQ7N8cyXwMrvhCWFe6CcbD829MAwif6L+1ZJtI5mMR40gFTTRg1rBHf1NtNDX0oompOwNlJwzSZd9YcyLgsSyJ8NC8HV/2ANn/VWXOCVAcBdjZqSDYSv/ThOZaXkwet92XBOaZnrxSajf8CeOF6ngVaFX9EL0sPtrunNsdOlXLTOc8HVHhC49NBOcy+Yp38wIq+kacGae3JrdemiayZypRqAed90fHpkcnDJZvZwghewu95i+xWbBbwpx/enbxeerj3n8Nb+ZvwuiRs0Ks0qvMhWVrEqw+I4TqXX5avF1RiW5W+K47l0rzzq2txURkmwOjNduN9gjVM5JeE6k2KohesJEw9NuOdTNdcfChm/WMS7SMqzdKt0rbtGoB03nH0hFIUBCEuWJusmFzHjKC8wuW+m0D60d84XzpUb1i0i51WGFK8n7IBUssb3X83eNH3VD+bxuzjfdzvlWt5q91ht8Gr96H16JmDzlIjq+JBYpkU8MDIfHDSoIw5Ku+js5Zh899ZZTtce9I4TjvicEZkNGRbMxPevAyvtt/L/hzXKdEPHCEVMkpgldqce0fpxhUmJhOtRCnT7XYinwrQcTeqvBNDoxmNDomcH0LPuYbXZ8fobZshIFxc55s/WjIRgDWvDwPjelEw7Q6KyQJgASPFHPDQmFjkF6DyBF9iGN3IJkbNYNN/vxFvmOUQoAJeQApcgxSiEMuKF9So7l7hDBiBvDEu7cmIaOZe8QfpgOxvbz99C1/A0/UNlPTKd8RjovJViCu1cv2acES2/7AXdYMNmnBGtvBw453zVKsPge2acUOUbJKO5mbwcwuZa+ESy/h2PrmA4rJvuYYP0dGJlDJZN9TrACHwwG1jmNXMvhyMWq6ZRvLM9LCVZNDnw3AIpL65iOlE0OVpfWMcG6KfDtuxOoL21zimBJACCRIrmofxShWjHDZUnjl7nCIhsq740O9dyZpVrtpLrxGtdeOmz+eu3VXKVAm3ZsNjxiMyN75lXzQZ7eqzUamvcEN81AT4AOFPkHil75yjqCp+CRK+s5jSXlRYGpICdeXKtolH2HLKXgCzLjjAslKXihRk4fKGMHIsxoWtRerXyHKPm0jm0aY3ahO3KaJLtr3mOZoZ87XiA5BKAQPik3hK+WG+CJfMRit7yUtEjLt2at6GzWUs3291xNOLY/m0OXfwA= \ No newline at end of file diff --git a/index_inverse.png b/index_inverse.png new file mode 100644 index 0000000..5176860 Binary files /dev/null and b/index_inverse.png differ diff --git a/lucene.drawio b/lucene.drawio new file mode 100644 index 0000000..508c255 --- /dev/null +++ b/lucene.drawio @@ -0,0 +1 @@ +5VrZUtswFP2aPNKxrTjLI0mg7Qyd0tIZ4Kkj24qtolhGVkjM11eK5VUmdWlAKfCCdLWfe3QXOQMwX20/MphEX2iAyMCxgu0ALAaOYw+tifgnJVkumYxHuSBkOFCdKsEVfkRKaCnpGgcobXTklBKOk6bQp3GMfN6QQcboptltSUlz1QSGSBNc+ZDo0msc8EidwhlX8k8Ih1Gxsj2a5i0rWHRWJ0kjGNBNTQTOBmDOKOV5abWdIyLBK3DJx50/0VpujKGY9xnghV7089w79bwgvk9u2M2tdX8CQD7NAyRrdWK1W54VEDC6jgMkZ7EGYLaJMEdXCfRl60YoXcgiviKiZouimg4xjrZPbtQujy94g+gKcZaJLmoAUIApxoACwE2F/6iQRXXsp0oIlc7DcuoKFlFQyPwNSs7xo9QTpJKOBwepuLE1TFAg7pKqUsYjGtIYkrNKOmuiVvW5oDRRWP1CnGfKMMA1p00kBVosu1Hjd5VbWfngFtXFtt64yFQt36vc4H78xXnomvlo38GVWYIsRHxPv3G3PhkikOOH5j4Orx2NwQvqr1fysKaZPGwyeagz2e5ksvVSTO667SMilp0F+EEUQ1k8x0i4EiUXy9SajCM6aiLq6ohOOgAFL2Y+3xieU8N4Dt8YnvbIMKDuGwO0NI2mALVtDZL3EQuMe8YCE6OxwNSsdiqF3Db0cTTasYcm1VMEOzVz9ANtucxeGQxlyJZq+uOyQwNuhlL8CL1dBwljQrEcKHq7s4G7EBJIcBgLgS9mREwIpAnCIvU9VQ0rHAQ73RPoITKD/l24Y8GcEsp264Ll7m+fEVOJudrJoMw/6vrbw9InTd6J9cEBRfraWzFquksJRjWX2/JHLbNIl8sUcU2v5Z6er+pxH8dzKm5ZlgoNHafvKZ1NgZ7dM4AfvZj30bPz9+F9Jj3t2xM363XM20Tj/GcB/PaaYWmFTLMZtGNT42wunhrfnbee9mSz45qk81Sj8wIz4fComruutzSCiSz6GcFCPezPjPZyPV54paD0wl/XXMyCDkd912lSvyMr62S+/XLUf69phA16ct9spGrrLztn20REnimmsaY6PUZNOaN3qAgnYyrZPFtiQlqi/pFq13VqEuIAF6XlIsDQ1S7K+DWzbQeYuCaHpPu/srg7rNfemcYtDeTXS406fHTvGM6zzZmvYV/XbdZ86Q+p39aIZZeQpUcQirYTK9Dxje91Q1FgxB8fkJhOX2ICq1s1r/QCpBNzlyNdIcj86Aio2c6SzFPTmRi1tbYxW+u4/4WtdfRvLDtKf0cwOAJCt3Mf84QuNlB/BRasdKziu73+CGzaCgz7frp/BmiiWv1UKg/Qqh+cgbPf \ No newline at end of file diff --git a/lucene.png b/lucene.png new file mode 100644 index 0000000..17ff5de Binary files /dev/null and b/lucene.png differ diff --git a/recherche_info.drawio b/recherche_info.drawio new file mode 100644 index 0000000..936b234 --- /dev/null +++ b/recherche_info.drawio @@ -0,0 +1 @@ +5VnbcpswEP0aHtvhYuP4MbHjtjNppxN3pu2jAgqoESwRwpd+fVcggrk4JZ3Y2OmTpV1dzzm7ErLhzKLNB0GS8DP4lBu26W8MZ27YtjUyL/BHWbaF5WLiFoZAMF83qgxL9ptqo6mtGfNpWmsoAbhkSd3oQRxTT9ZsRAhY15vdA6/PmpCAtgxLj/C29TvzZah3YU8q+0fKgrCc2XKnhSciZWO9kzQkPqx3TM614cwEgCxK0WZGuQKvxKXot9jjfVqYoLHs0yFOH9ebEcDiIUzt+XzBoy/f3ll6mFRuyx1THwHQVRAyhABiwq8r65WALPapGtbEWtXmBiBBo4XGX1TKrWaTZBLQFMqIa28xp5po717KdUEmPPrcBrQmiAiofKbd+AlxlCqFiEqxxX6CciLZqr4OojUTPLWrYMWCRvYlKBfjrgjP9EyG7XJc7pXPVlgMVPGWPmbGzDEuLyUt3TjbTosWVSipRBUROMI55RAIEmHDhAqGK6ei6ftaOa7WIZN0mZAc3jVGbxdHKyok3TzPUhtV3cEeaemXsa+r6yqQrDI6wp0gcs1D8eB2EHHW8rd7yt8dUv52H/nPwcsi3H/6Qu37ut/fFX1X8HZz94oSH/2jxC8OJvFzV/S4p6KnQyp63EfRC4g9ySBWtx+aLy0ReYKfpogKKVy9tF7n5/iJ2xo+c4/PXNZuT1lPhpR11/H4hmTdTNYnIOvRELJGuMT2x27lpxrs/biszjd68KK21bVXDIfJOWT5SZ9w+IRcbF56ZyGSpBIEHUT2J3APd848m097ytcyu5k5jn6nLf02c7cHkfo+ZKkyndil4wRkarYAvNUnXcbxpEv3B/igHyVNJJ3hv0raqXQGcSpFVpMjJ3ls7L6DNABGUGQdQBwEHugMOKjXjhhilSvuGecNE+EsiLHqIYj5+4eCmHmEX2pHxHyf78vI9WB4BY4sp6F2s83RtIMi+2AUtbPFkkWME8FkIfo3TMZ4XA+YDjJGxyTDbj+Z3HZds02m8IvfcJy4pnli1DgdqSzKkz1eCPAsVahhKqOpymrVo9b/QlBXIjsuQe3HGUSQ0/yk+Y+IsA5HBFar/61y386/f871Hw== \ No newline at end of file diff --git a/recherche_info.png b/recherche_info.png new file mode 100644 index 0000000..ffc88a2 Binary files /dev/null and b/recherche_info.png differ