Précédent Remonter Suivant
Chapitre 8 Fouille de textes
Les chapitres précédents relevaient du "traitement automatique du langage" et aussi de l'"ingénierie linguistique". Ils visaient à présenter l'ensemble des concepts et outils élaborés par les linguistes et les informaticiens pour étudier aussi précisément que possible les capacités expressives des langues naturelles. Malheureusement, "en pratique", c'est-à-dire face à de vraies données textuelles, peu de ces outils sont réellement applicables. Souvent, leur état de développement ne les rend tout simplement pas aptes à se confronter à un texte quelconque : il n'existe par exemple aucun analyseur syntaxique du français capable d'analyser toutes les phrases d'un article de journal courant. Mais, même s'il était possible, ce traitement exhaustif ne serait pas toujours souhaitable car il serait trop coûteux en temps de calcul. Quand il s'agit par exemple de rechercher une information précise dans une encyclopédie, il y a de meilleures méthodes à mettre en oeuvre que de traduire en formules logiques toutes ses phrases.

Dans ce chapitre, nous allons tenter d'appliquer les outils linguistiques à notre disposition à la "fouille de textes". L'enjeu de ce domaine est la manipulation rapide et efficace de grandes quantités de textes, pour lesquels il n'est pas envisageable de procéder à une analyse syntaxico-sémantique complète. Nous allons dresser un panorama des "tâches" très générales auxquelles elle se confronte. La plupart de ces tâches sont abordées avec des méthodes numériques plus que symboliques. Mais la plupart peuvent aussi bénéficier largement de certains outils issus du traitement des langues.

Nous allons donc d'abord passer en revue les "ressources linguistiques" disponibles, et les méthodes employées pour les obtenir. Nous montrerons ensuite que les textes sont des données complexes qui peuvent être codées de manières diverses. Chaque application particulière requerra un codage adapté. Nous allons aussi présenter rapidement le domaine de l'apprentissage automatique parce qu'il est de plus en plus utilisé, soit pour acquérir ou améliorer des ressources, soit pour accomplir certaines tâches de fouille de textes. Ce sont ces tâches qui nous occuperont pour finir. Chacune d'elle mériterait un chapitre, mais cela nous éloignerait trop de l'objectif initial de ce document, et nous nous en tiendrons donc à une présentation succinte

1 Ressources

L'ingénierie linguistique contemporaine est fondée sur la notion de ressource. Une ressource est un ensemble de données ou un programme réunissant des informations linguistiquement pertinentes, et utiles dans un cadre applicatif. Elle doit être utilisable "par elle-même", sans être pour cela nécessairement intégrée dans une chaîne de traitements complexes.

En fait, la plupart des programmes pour lesquels nous avons cité des sites Web dans les chapitres précédents (en particulier, en chapitre 4, section 2.4 et en chapitre 5, section 2.9) peuvent être considérés comme des ressources, en particulier : Mais, pour se confronter à des "textes bruts", certains outils apparemment plus "rudimentaires" sont aussi nécessaires, comme : Et tous les programmes capables d'identifier certains groupes de mots particuliers (cf. chapitre 5, section 1.2) comme : peuvent aussi rendre de grands services.

Les ressources prennent aussi parfois la forme de données plus que de programmes. Parmi celles-ci, citons : Enfin, on considère aussi comme des ressources des collections de textes, ou encore d'enregistrements audio et/ou vidéo, réunis de façon cohérente : enregistrements de conversations téléphoniques, transcriptions écrites de discussions avec des enfants, recueil de textes littéraires, d'articles de journaux, de dépêches de presse, de sites Web, de mails ou de SMS... En la matière, on peut envisager une multitude de données possibles. A condition qu'elle soit représentative d'un certain usage de la langue, on appelle une telle collection un corpus.

Certains corpus ont des propriétés particulières. Ils peuvent par exemple être accompagnés d'informations supplémentaires : quand on dispose d'un ensemble d'articles de revues, on peut avoir en plus la rubrique (économie, sport, culture...) dont ils relèvent ; s'il s'agit de mails, il peut être intéressant de savoir lesquels, parmi eux, sont des "spams" (courriers indésirables), etc. Ces informations seront précieuses dans certaines applications.

D'autres corpus répondent à des besoins très spécifiques. Par exemple, un concordancier est un corpus mettant en évidence les contextes d'utilisation d'un certain mot. Ces contextes se présentent en général comme une fenêtre avec un nombre fixe de mots "avant" et "après" l'occurrence du mot en question. Il sert aux lexicographes, qui étudient les usages des mots, pour écrire leurs définitions dans un dictionnaire. Certains programmes sont capables de bâtir automatiquement un concordancier, quand on leur fournit un ensemble de textes et un mot cible.

La plupart des ressources précédentes sont monolingues, c'est-à-dire spécifiques d'une langue donnée. Quand elles concernent plusieurs langues distinctes, elles sont dîtes multilingues : c'est le cas des dictionnaires bilingues, ou encore des corpus alignés qui sont des textes disponibles dans plusieurs langues, où les passages qui sont des traductions les uns des autres sont accessibles les uns à partir des autres.

La constitution d'une ressource est une tâche longue et difficile : elle demande souvent des compétences complexes, et presque toujours beaucoup de travail. Des sociétés privées vivent de la vente de certaines de ces ressources : elles sont donc rarement gratuites.

2 Représentations d'un texte

La représentation des données linguistiques n'allant pas au-delà de la taille d'une phrase ne pose pas trop de problèmes : il suffit la plupart du temps de les considérer comme des séquences de symboles prises dans un alphabet fini. Le codage des caractères lui-même peut pourtant faire l'objet de choix assez divers (code ASCII, UTF-8, unicode, etc.) sur lesquels nous ne nous étendrons pas. Mais les textes sont des données encore plus complexes et certaines applications les codent dans des structures particulières.

Un texte peut en effet être envisagé en tant que : Il existe des corpus dans chacun de ces formats, et des programmes qui permettent de passer de certaines de ces représentations à certaines autres. Certains documents, en particulier les fichiers HTML, peuvent ainsi être considérés soit en tant que séquences de caractères, soit en tant qu'arbres. Les corpus constitués de phrases analysées syntaxiquement (aussi appelés corpus arborés ou treebanks en anglais) sont les plus rares, car ils demandent un travail considérable : les arbres y sont en général codés dans un format XML.

Les documents de type "articles" sont souvent associés aussi à des métadonnées qui énumèrent certaines de leurs propriétés (par exemple : leur(s) auteur(s), leur date date d'écriture, les mots clés qui décrivent leur contenu, etc.). Le projet du "Web sémantique" envisage de généraliser cette description à toutes les informations présentes sur Internet, et les données de ce type (au format RDF ou OWL, standards XML du W3C) pourraient bien dans les années à venir devenir aussi courantes que les pages HTML à l'heure actuelle.

Enfin d'autres représentations encore sont possibles, si on accepte de s'affranchir complètement de la notion de séquence. En effet, il existe de nombreux programmes (notamment dans le domaine de l'apprentissage automatique, dont il sera question dans la section suivante) dont les données de base sont de la forme "attributs/valeurs" : typiquement, des nombres, des vecteurs ou des tableaux de données. Pour pouvoir appliquer ce genre de programmes à des textes, certains auteurs ont eu l'idée de coder les textes sous la forme de sac de mots. Dans une représentation de ce genre, un texte est réduit à une liste d'occurrences de ses mots, indépendamment de leur ordre d'apparition dans le texte. Mais, dans ce cas aussi, de nombreuses variantes sont envisageables.

Tout d'abord, un tri est généralement effectué pour ne prendre en compte que les mots signifiants des textes : c'est pour cela que les listes de "mots vides" ou "antidictionnaires" peuvent être très utiles. Des critères statistiques peuvent aussi être mis à contribution, pour éliminer les mots trop ou pas assez fréquents, ou supposés non informatifs.

Ensuite, un prétraitement des mots restants peut être effectué, afin de limiter le nombre d'unités de comptage : on peut ne garder que les lemmes, voire que les "racines" des mots présents, on peut ne tenir compte que des mots d'une certaine catégorie, ou même que de ceux figurant dans une liste prédéfinie. L'ensemble des unités ainsi sélectionnées, considérées comme indépendantes, sont classées dans un ordre arbitraire (généralement l'ordre alphabétique) et constituent la base (au sens mathématique d'une base vectorielle) de la représentation. Chaque texte peut désormais être représenté par un vecteur de nombres dont la n-ième composante compte le nombre d'occurrences du n ième mot de la base dans ce texte.

Une variante très connue et utile de cette représentation est appelée "TF-IDF" ("TF" pour "term frequency" et "IDF" pour "inverse document frequency"). Elle s'applique aux textes qui font partie d'un corpus. L'idée est simplement de multiplier la n ième composante de chaque vecteur (qui est sa valeur "TF") par un coefficient qui dépend de la fréquence de l'unité correspondante dans l'ensemble des documents de ce corpus. Ce coefficient "IDF(m)" pour un mot (ou une unité) m vaut précisément : log(|D|/DF(m)) où |D| est le nombre total de documents dans le corpus, et DF(m) le nombre de documents contenant l'unité m. On accorde ainsi plus de poids aux unités souvent présentes dans un texte mais rares dans l'ensemble du corpus, et inversement on minimise l'importance des unités trop souvent présentes dans l'ensemble des textes.

Des extensions de ce mode de représentation sont bien sûr possibles. Par exemple on peut transformer des fichiers HTML ou XML en "sacs de balises", ou en "sacs de chemins" ou encore en "sacs de fourches", ou en tout autre type de "sacs" de données dont il n'y a plus qu'à compter le nombre d'occurrences dans le fichier (avec coefficients multiplicateurs éventuels).

Si on s'en tient aux textes, on peut aussi prendre pour base des couples d'unités et compter le nombre de co-occurrences de chaque couple à l'intérieur d'une certaine "fenêtre" : on obtient alors une matrice dont les lignes et les colonnes sont les unités de la base et où chaque case contient le nombre de fois où ces deux unités apparaissent "proches" (c'est-à-dire séparées par un nombre maximal fixé à l'avance de mots ou de caractères) dans le texte. Aussi frustrantes puissent-elles sembler d'un point de vue linguistique, ces représentations numériques rendent de grands services, car elles permettent de traiter les textes comme n'importe quelle autre donnée mathématique.

3 L'apprentissage automatique

Une tendance actuelle très forte en TALN et en ingénierie linguistique consiste à exploiter les avancées récentes qu'a connues le domaine de l'apprentissage automatique. Cette branche de l'intelligence artificielle étudie comment il est possible d'écrire des programmes qui s'améliorent par l'expérience, en se confrontant à des données. Plutôt que d'écrire soi-même un programme qui, par exemple, associe à chaque mot son étiquette grammaticale, on a intérêt à en écrire un qui apprend à le faire à partir d'exemples. Alors qu'un programme écrit "à la main" est en général spécifique d'une langue donnée, un programme d'apprentissage automatique s'adapte à la langue des exemples qu'on lui soumet. On espère donc, en adoptant cette démarche, gagner en temps de développement et en efficacité, et coller mieux à la réalité des données réellement observables.

L'apprentissage automatique est un domaine trop vaste pour être exploré de façon exhaustive dans ce document : on se contentera ici d'introduire quelques-uns de ses concepts clés. Tout d'abord, on distingue traditionnellement l'apprentissage non supervisé et l'apprentissage supervisé. L'apprentissage non supervisé vise tout simplement à tenter d'extraire de l'information d'ensembles de données fournies sans indication supplémentaire, sans cible explicite. Par exemple, à partir d'un ensemble de points dans un espace, on peut se fixer comme objectif de les regrouper en "classes", en "paquets" : c'est la tâche de "clustering" (ou "classification non supervisée"). On peut éventellement disposer tout de même du nombre maximal de classes à constituer, ou de mesures de "densité" des paquets à obtenir. De nombreux algorithmes existent pour réaliser cette tâche. Le principal problème qui se pose dans ce contexte est souvent de trouver un critère quantitatif objectif pour évaluer la qualité de leur résultat.

En apprentissage supervisé, en revanche, on suppose disposer de données étiquetées, c'est-à-dire de données pour lesquelles le résultat visé par l'apprentissage est explicitement disponible. Le schéma de la figure 8.1 explicite la situation de "l'apprenant" dans ce cas. Les intervenants et symboles présents dans cette figure ont la signification suivante :


Figure 8.1 : schéma de l'apprentissage supervisé


Par exemple, si on cherche à apprendre à associer aux mots d'un texte leur étiquette grammaticale, alors chaque texte est une donnée xi et f(xi) est le texte étiqueté (on pourrait aussi prendre chaque mot indépendamment les uns des autres, mais dans ce cas on ne pourrait pas distinguer "ferme" qui est un verbe de "ferme" qui est un nom commun, par exemple).

Certains chercheurs ont étudié le domaine de l'apprentissage automatique de façon théorique, et en ont tiré des conséquences utiles à tous. On est certain, par exemple, qu'il n'existe aucun programme qui soit meilleur que les autres sur tous les problèmes possibles. Ce résultat est un théorème qui porte le nom de "no free lunch"... Cela signifie surtout que chaque type de problème impose de faire des choix, des hypothèses spécifiques supplémentaires quant à la nature de la fonction à apprendre. Ces choix sont appelés des biais.

Les programmes d'apprentissage automatique supervisés les plus utilisés réalisent des tâches de classification automatique binaire. Dans ce type de tâches, la fonction à apprendre associe à chaque donnée une étiquette parmi deux possibles, notées "+" et "-". Le "concept cible" est ainsi l'ensemble des données qui doivent recevoir l'étiquette "+". Les données étiquetées fournies à l'apprenant sont alors appelés soit des "exemples positifs" (s'ils ont l'étiquette "+") soit des "exemples négatifs" (s'ils ont l'étiquette "-"). Les biais adoptés portent sur la forme de la fonction qui calcule la valeur de l'étiquette en fonction de la donnée. Citons les méthodes les plus connues : De tels programmes apprennent par exemple à "classer" à partir d'exemples les personnes susceptibles de développer une certaine maladie. L'état de santé de chacune d'elle est présentée sous la forme "attributs/valeurs" : chaque xi est donc un ensemble de données décrivant l'âge, le sexe, le poids, la pression artérielle, le taux de collesterol, etc. d'un individu et la valeur du "diagostic" ui dit s'il est ou non susceptible de développer la maladie en question. Les banquiers utilisent aussi ce genre de systèmes pour savoir s'ils peuvent ou non accorder en confiance un prêt à leurs clients. Nous allons voir dans la section suivante les applications possibles de ces programmes à la classification de textes.

4 Tâches principales de la fouille de textes

Dans cette section, nous allons énumérer les trois principales tâches auxquelles s'attaque la fouille de textes. Chacune de ces tâches sera un cas particulier du schéma général de la figure 8.2, pour lequel nous préciserons :


Figure 8.2 : schéma général d'une tâche de fouille de textes


La tâche la plus "naturelle" à envisager, étant donnée la section précédente, est la classification de textes. Elle consiste à ranger des textes ou des documents dans des "classes" prédéfinies : La recherche d'information (ou RI) est l'autre "tâche" générale d'ors et déjà omniprésente dans nos usages quotidiens des ordinateurs. Nous la sollicitons chaque fois que nous recherchons des documents répondant à une "requête". Enfin, l'extraction d'information est la dernière tâche fondamentale que nous voulons présenter ici. Comme son nom l'indique, elle se fixe comme objectif d'extraire de textes des informations factuelles précises. Imaginons par exemple les textes de petites annonces de vente de voitures, rédigées librement. Les informations qu'elles contiennent peuvent se résumer à la valeur de quelques "champs" factuels : qui vend quelle type de voiture, de quel kilométrage, à quel prix, etc. On appelle wrapper (terme anglais qui signifie "envelopper") un programme capable de remplir automatiquement les valeurs de ces champs à partir du texte initial de la petite annonce. Un wrapper est nécessairement spécialisé dans le traitement d'un certain type de textes : celui qui traite les petites annonces de vente de voiture ne saura pas quoi faire d'annonces de locations d'appartements, et inversement.
5 Autres tâches plus complexes

La fouille de textes s'attaque à d'autres tâches que nous ne détaillerons pas. Citons tout de même l'indexation automatique, qui consiste à extraire de textes les termes qui pourront servir de mots clés attachés à ces textes. Ces termes sont habituellement repérés par des méthodes statistiques, en cherchant les mots qui y sont significativement plus présents que dans un corpus standard de la langue. De même, les méthodes de résumé automatique se focalisent, pour la plupart, sur l'extraction des phrases caractéristiques d'un texte, sur la base de la fréquence d'apparitions des mots qu'elles contiennent. Le résumé obtenu n'est ainsi que la mise bout à bout de phrases statistiquement représentatives. On le voit, ces tâches font peu appel à des ressources sophistiquées.

D'autres tâches générales se contentent d'enchaîner les traitements réalisant des tâches plus élémentaires. C'est le cas des systèmes "question/réponse". Un tel système peut être vu comme un moteur de recherche sophistiqué : l'utilisateur lui pose une question en langue naturelle (par exemple "quand est né Mozart ?"), le système doit fournir la réponse factuelle à la question (et non un document contenant cette réponse comme le ferait un moteur classique). Cette réponse doit être extraite d'un corpus d'informations générales, ou trouvée sur le Web. Pour atteindre cet objectif, les systèmes question/réponse procèdent généralement par étapes : Chacune de ces étapes fait donc appel à l'un des programmes de la section précédente. Certains systèmes "question/réponse" font appel à des ressources un peu plus sophistiquées, comme les analyseurs syntaxiques (notamment pour analyser la question), mais aucun ne cherche à réaliser un analyse syntaxico-sémantique complète de l'ensemble des données auxquelles il a accès : ce ne serait absolument pas raisonnable en termes de temps de calculs. Plusieurs "challenges" internationaux portent sur la comparaison des performances de ces systèmes.

Pour finir, évoquons très brièvement le cas de la traduction automatique. C'est une tâche dont l'intérêt applicatif ne fait aucun doute, mais qui est particulièrement difficile. Nous avons vu dans la section historique du chapitre 2 qu'elle a été étudiée très tôt par les pionniers de l'intelligence artificielle. Son cas est intéressant, parce qu'il résume bien à lui tout seul les alternatives qui se posent au domaine du traitement des langues.

A une extrémité du spectre, on peut procéder comme cela est synthétisé de façon humoristique sur la couverture de ce document : en ne faisant appel à aucune ressource linguistique si ce n'est un "corpus aligné" qui met en vis-à-vis des phrases traduites les unes des autres, et en comptant des co-occurrences de mots. Ce n'est pas très satisfaisant d'un point de vue linguistique mais ça marche : récemment, Google a gagné un challenge internationnal de traduction automatique, grâce à un programme qui procédait de la sorte (un peu plus sophistiqué tout de même), mais fondé sur un "corpus aligné" gigantesque qui a fait toute la différence. Le challenge portait sur la traduction de textes chinois et arabes, et aucun des programmeurs de Google embauché pour y participer ne parlait ces langues : la "chambre chinoise" (cf. chapitre 6, section 2.1) a pourtant parfaitement fonctionné !

A l'autre extrémité, on peut chercher à écrire un programme de traduction sur le modèle du schéma de la figure 2.2, en passant par toutes les étapes intermédiaires détaillées au fil de nos chapitres : analyse syntaxico-sémantique de la phrase initiale, représentation de son sens par un modèle formel, puis synthèse de sa traduction dans une autre langue. C'est cette méthode qui était privilégié dans les années 70-80. Elle demande beaucoup de travail, n'est malheureusement pas applicable à très grande échelle et, comme aucun des traitements auxquels elle fait appel n'est exempt d'erreurs, donne au bout du compte de moins bons résultats que les techniques statistiques pourtant moins "intelligentes".

Toutes les approches intermédiaires sont possibles. Un minimum d'analyse syntaxique contribue à améliorer significativement les méthodes numériques les plus rudimentaires. La traduction automatique est sans doute le "lieu" privilégié où cette hybridations entre méthodes symboliques et numériques sera expérimentée avec le plus d'acuité.

6 Sites Web

Pour la plupart des ressources et des tâches citées dans ce chapitre, il existe de nombreux programmes gratuits et sites Web. Voici un échantillon représentatif de ceux qui sont testables en ligne :
Précédent Remonter Suivant