A propos Jean-Baptiste Camps

Diplômé de l'École nationale des chartes et docteur en études médiévales de l'Université Paris-Sorbonne (la Chanson d'Otinel…, dir. Dominique Boutet ), Jean-Baptiste Camps est responsable pédagogique du master «Humanités numériques» à l'École nationale des chartes (PSL). [CV et liste des publications, voir : http://paris-sorbonne.academia.edu/JeanBaptisteCamps]

L’Information retrieval appliquée à la philologie. II. Differential term weighting

Revenons1 ici sur un projet de billet annoncé depuis quelques temps : celui de l’application possible que l’on peut faire à la philologie de traitements provenant du champ de l’Information retrieval. Cette fois-ci, il sera question du Differential term weighting.

Le principe général du Differential term weighting est de remplacer les effectifs lexicométriques bruts par une valeur calculée selon une formule déterminée. La formule choisie peut répondre à différents principes mathématiques et peut varier selon l’objectif recherché. Nous verrons d’abord les formules existantes et les principes mathématiques et objectifs auxquelles elles répondent, puis, dans un deuxième temps, on se penchera sur leur application possible aux analyses lexicométriques des textes anciens.

Les formules classiques

Avant de nous plonger en détail dans les différentes formules et leur principes et objectifs, attardons nous un peu sur les principes généraux qu’elles recouvrent. Au niveau du résultat recherché, tout d’abord, il ne nous faut pas oublier que ces formules ont été conçues sur la base d’une recherche de pertinence dans les recherches d’information, et que leur objectif est donc l’élimination du bruit dans le cadre d’une recherche plein-texte. Cet objectif diffère sensiblement du nôtre et de notre utilisation des effectifs lexicométriques. Au niveau du principe mathématique, il nous faut tout d’abord différencier deux choses : le poids local (L) qui est affecté à un nombre N d’occurrences d’un mot i dans un texte j (c’est-à-dire à la valeur qui figure, dans un tableau d’occurrences lexicométriques dans une des cellules) , et le poids global (G) qui est affecté au mot i dans l’ensemble des textes. Certaines des formules ne font usage que d’un seul de ces types de poids, d’autres utilisent les deux, sous la forme :LijxGi

Les poids locaux

Les trois types de poids locaux (Lij) employés les plus couramment sont ainsi :

  1. La fréquence brute du mot dans le document, soit Lij = Nij.
  2. Une valeur binaire : si Nij ≥ 1, alors Lij = 1, sinon Lij = 0.
  3. Une valeur logarithmique, employée généralement pour réduire les écarts trop importants entre les termes très fréquents et les termes rares, Lij = log(Nij+1).

Les poids globaux

Les poids globaux s’appuient tous sur une ou plusieurs des trois valeurs suivantes :

  1. le nombre d’occurrences du terme i dans le document j (que nous appellerons ici encore Nij).
  2. Le nombre total de documents dans lequel le terme i apparaît (que nous appellerons Di).
  3. Le nombre d’occurrences total du terme i dans l’ensemble des documents (que nous appellerons Ti).

Il faudrait pour être tout à fait complet, ajouter une dernière valeur, celle du nombre total de documents (Ndoc). Il y a, pour les poids globaux, trois méthodes principales :

1. La méthode dite « Normale » :

Cette méthode consiste donc à définir un poids global qui prenne en compte les différences entre mots très fréquents et mots peu fréquents, tout en les amoindrissant.

2. Occurrences totales sur nombre de documents où le terme est présent :

Ti/DiCette formule donne un poids global qui favorise les termes apparaissant très fréquemment dans un nombre très restreint de documents (un terme qui apparaît 100 fois dans un seul document aura un poids global de 100 ; un terme qui apparaît 100 fois dans 100 documents, aura un poids global de 1).

3. Log2(Ndoc/Di)+1Cette méthode donne un poids global qui favorise les termes qui apparaissent dans peu de documents.

La méthode 1 – entropie

Dans un article désormais un petit peu ancien, Susan T. Dumais décrit une autre méthode dont, selon elle, les résultats sont de loin supérieurs à ceux des autres2. Elle se fonde sur un calcul d’entropie ou de bruit. Mathématiquement, elle se présente ainsi :

entropyCette valeur d’entropie prend en compte la fréquence du terme dans le document concerné par rapport à la fréquence totale du terme, et la rapporte au nombre de documents total. En gros, plus le terme apparaît fréquemment dans un petit nombre de documents, plus la valeur d’entropie sera grande (elle sera supérieure pour un terme apparaissant 10 fois dans un seul document que pour un terme apparaissant en tout dix fois, mais une fois par document).

Intérêt et application de ces méthodes

L’objectif principal de ces méthodes est de fournir des documents pertinents lors d’une recherche d’information. Si elles sont extrêmement intéressantes dans leurs principes, leur utilité dans leur application à la philologie reste en partie à démontrer. On peut toutefois en retenir le principe et l’adapter à ses besoins.

Travaillant récemment, à l’aide d’analyses factorielles et de classification ascendantes hiérarchique, sur un corpus de courts textes (des vidas de troubadours contenues dans le ms. A) avec des propriétés très particulières, j’ai eu recours à une forme très basique de differential term weighting, mais celle-ci m’a été extrêmement utile et m’a permis d’exploiter le corpus sans me retrouver face à des résultats totalement biaisés. Les propriétés particulières de ce corpus étaient :

1. De se composer d’un ensemble de très courts textes, avec une moyenne de 164 mots, et une médiane de 147, qui pouvaient se répartir de ce point de vue en deux groupes principaux : entre 20 et 100 mots, et entre 100 et 300, mais malgré tout avec quelques individus aberrants pouvant dépasser 400 mots, voire atteindre 676. Comme une image vaut parfois mieux que de longs discours, voici la boîte à moustaches :Boîte à moustaches des vidas de A

2. D’utiliser un vocabulaire restreint, assez répétitif, avec un nombre délimité de formules types, et d’être donc en grande partie très homogènes du point de vue de leur lexique, provenant en outre du même manuscrit.

Ces deux éléments faisaient que l’analyse factorielle ne donnait pas grand chose, tandis que la classification ascendante hiérarchique me triait les textes uniquement d’après leur nombre de mots… Or, ce n’était pas ça qui m’intéressait, pas plus que la vérification de l’homogénéité globale de leur vocabulaire (que je connaissais déjà pour les avoir un peu pratiqués), mais bien au contraire les quelques éléments d’hétérogénéité pouvant renvoyer à des branches différentes de la tradition, à des auteurs différents, à des datations ou localisations différentes, etc. Pour pouvoir arriver à des résultats exploitables, j’ai fait usage d’une forme de poids local très rudimentaire, mais dans ce cas précis tout à fait salvatrice, en divisant le nombre d’occurrences du mot dans le document (Nij) par le nombre total de mots du document (Tj), ce qui revient à utiliser un taux :

Nij/TjÀ l’aide de ce poids local, j’ai obtenu des résultats beaucoup plus pertinents, dans lesquels j’ai déjà pu distinguer des rapprochements liés à des groupes de manuscrits, à des datations/localisations, et à des auteurs présumés. Il ne me reste plus désormais qu’à les analyser en détail !

  1. Après une période prolongée sans billet due à une période un peu chargée (colloques) de mon côté. []
  2. Dumais (Susan T.), « Improving the retrieval of information from external sources », Behavior Research Methods, Instruments, & Computers, 23 (1991), p. 229-236. []

Jean-Baptiste Camps

Diplômé de l'École nationale des chartes et docteur en études médiévales de l'Université Paris-Sorbonne (la Chanson d'Otinel…, dir. Dominique Boutet ), Jean-Baptiste Camps est responsable pédagogique du master «Humanités numériques» à l'École nationale des chartes (PSL). [CV et liste des publications, voir : http://paris-sorbonne.academia.edu/JeanBaptisteCamps]

More Posts - Website

Follow Me:
LinkedIn

L’Information retrieval appliquée à la philologie. I. Approximate string matching

Le domaine de l’Information retrieval, profondément lié dans son histoire à l’informatique, connaît sans cesse des développements très importants, au cœur de l’activité du Web, de la documentation, des moteurs de recherche. On peut comprendre la tentation d’exploiter certains des acquis de cette science pour l’appliquer aux domaines qui nous intéressent, ou, pour reprendre une métaphore dans la tonalité générale de notre carnet, de boire à cette coupe qui ne se tarit jamais. Toutefois, une telle démarche ne peut aller sans une réflexion préalable.

Il ne faut pas en effet oublier que ces outils ont été créés non pas pour faciliter le travail des philologues, pour opérer des traitements scientifiques sur des corpus de textes, mais bien dans une optique de recherche d’information et de pertinence qui diffère sensiblement de la nôtre. Ce billet se veut le premier d’une série cherchant, sans exhaustivité, à passer en revue certains des outils les plus fréquents dans le domaine de l’Information retrieval et de voir en quoi ils peuvent nous être utiles, s’ils sont applicables ou adaptables à nos sciences. À cette fin, nous commencerons par un des éléments les plus « classiques », l’Approximate string matching, dont nous connaissons tous empiriquement le principe, ne serait-ce que par notre utilisation des moteurs de recherche…

Exemple sur Google

Exemple sur Google...

1. Algorithmes et calculs de distance

La Distance de Levenshtein

La mesure de distance décrite en 1965 par le mathématicien soviétique Vladimir Levenshtein1 consiste en la somme des suppressions, remplacements ou insertions qu’il faudrait effectuer pour passer d’une chaîne de caractères à une autre. De cette façon, pour passer de

Philologe à Philologie

la distance est de 1 (une insertion) ou env. 11%. Et entre :

Philologie et Philosophie

la distance est de 3 (deux remplacements et une insertion) ou 30%. La distance de Levenshtein a été implémentée par les informaticiens Robert Wagner et Michael Fischer2  (on parle alors d’algorithme de Wagner-Fischer).

La distance de Damerau–Levenshtein

La distance dite de Damerau–Levenshtein, du nom du chercheur d’IBM Frederick J. Damerau, quant à elle, se distingue de la distance de Levenshtein en ce qu’elle inclue, outre les suppressions, remplacements ou insertions, un quatrième type d’opération, à savoir l’interversion de caractères adjacents. Ainsi, la distance  entre

Philoloige et Philologie

est de 2 selon la mesure de Levenshtein, et seulement de 1 selon la mesure de Damerau-Levenshtein.

Autres mesures de distance

Si ces deux mesures de distance entre chaînes de caractères sont celles que l’on rencontre le plus fréquemment, il en existe d’autres. On citera ainsi pour mémoire la Distance de Hamming, qui ne fonctionne qu’avec des chaînes du même nombre de caractères et consiste en la somme de caractères différents à la même position. D’après cette mesure, la distance entre

Histoire et Histeire

est de 1, tandis qu’entre

Histoire et Hstoires

elle est de 7. Il faut dire que cette mesure de distance, qui correspond assez peu au fautes de frappe habituelles, est peu utilisée en tant que telle dans le domaine de la recherche d’information.

2. Mise en œuvre

Des modules Perl existant permettent de mettre en œuvre ces calculs. Nous parlerons ici brièvement des deux principaux, Text::WagnerFischer et String::Approx (je déconseille d’utiliser Text::Levenshtein qui a apparemment des problèmes avec utf8 et,  chez moi  en tout cas, donne des résultats faux…).

Text::WagnerFischer sert à la comparaison entre deux chaînes de caractères et permet d’obtenir le résultat de  la mesure de distance, ainsi :

#!/usr/bin/perl
use Text::WagnerFischer qw(distance);
print distance("bonjour","bonsoir") ;

donne comme résultat 2 (deux substitutions en l’occurrence). Mais ce module permet également d’aller un peu plus loin en configurant séparément (mais dans cet ordre) le coût d’une correspondance, d’une suppression/insertion, et d’une substitution. Ainsi, pour reprendre l’exemple précédent :

print distance([0,1,1],"bonjour","bonsoir") ;
print distance([-1,2,3],"bonjour","bonsoir");

Si le résultat de la première commande donnera toujours 2 (deux substitutions dont le coût est 1), la seconde donnera cinq correspondances et deux substitutions, soit -1*5 + 3 *2, c’est-à-dire 1 (ce n’est qu’un exemple).

Le module String::Approx, quant à lui, permet, de façon relativement simple, non plus de simplement comparer des chaînes de caractères (i.e. établir la distance qui les sépare), mais de relever directement les chaînes qui correspondent à une autre pour une distance préétablie (par défaut 10%). Ainsi, dans le script suivant :

use String::Approx 'amatch';
@mots = qw("bonjous", "bonjours", "bonsoir", "adieu");
@resultat1 = amatch("bonjour", @mots);
@resultat2 = amatch("bonjour",["25%"], @mots);

la liste @resultat1 comprendra les mots “bonjous”, “bonjours” et la liste @resultat2 les mots “bonjous”, “bonjours”, “bonsoir” (la distance spécifiée étant de 25%).

3. Exemple d’application

Pour prendre un exemple un peu plus intéressant, j’ai testé ce module sur un corpus de textes occitans médiévaux. J’y ai recherché le terme cansos avec la distance par défaut de 10%. Dans ma liste de résultats se trouvent les termes suivants :

cansonetas, 1
cansos, 5
cansson, 5
canssons, 5
canssos, 7
chansos, 2

Ce résultat est intéressant, car ne s’y trouvent en effet que des graphies différentes de cansos, (excepté cansonetas, ce qui nous apprend par la même occasion que amatch est programmé pour s’arrêter dès qu’il trouve une correspondance, en l’occurrence canson[etas], ce qui peut-être particulièrement gênant si l’on veut traiter des monosyllabes). Toutefois, toutes les formes de cansos ne figurent pas dans cette liste : il y manque notamment chansson, chanssons et chanssos. On peut tenter d’augmenter la distance, en la fixant par exemple à 20%, mais dans ce cas, on obtient également tout une série de termes qui on peu de choses à voir avec nos chansons, en vrac canorgues, Cartosa, enansset, fermanssa, percassava3

Pour conclure, on pourra noter que, si ces modules peuvent en effet donner des résultats intéressants, il manque, pour correspondre tout à fait à nos besoins, la possibilité de configurer indépendamment des coûts permettant de différencier certaines substitutions bénignes (comme la simple variation graphique entre i et y ou l’alternance c/ch par exemple) de celles qui ne le sont pas. Pour ce faire, a priori, il faudra plutôt recourir à une grammaire d’expressions régulières.

  1. Vladimir I. Levenshtein, « Binary codes capable of correcting deletions, insertions, and reversals », dans Soviet Physics Doklady, 10 (1966), p. 707-710. []
  2. Robert A.Wagner et Michael J.Fischer, « The string- to-string correction problem », dans Journal of the ACM, 21(1974), p. 168–173. []
  3. Les précédentes versions de String::Approx contenaient une commande aregex() qui aurait permis de contourner en partie ces difficultés par l’emploi d’expressions régulières, mais celle-ci n’existe hélas plus dans la dernière version. []

Jean-Baptiste Camps

Diplômé de l'École nationale des chartes et docteur en études médiévales de l'Université Paris-Sorbonne (la Chanson d'Otinel…, dir. Dominique Boutet ), Jean-Baptiste Camps est responsable pédagogique du master «Humanités numériques» à l'École nationale des chartes (PSL). [CV et liste des publications, voir : http://paris-sorbonne.academia.edu/JeanBaptisteCamps]

More Posts - Website

Follow Me:
LinkedIn

Du texte à l’écran : L’édition de textes à l’heure de l’électronique

J’ai assisté, le jeudi 4 novembre, à un Atelier organisé par l’École nationale des chartes et l’Università degli studi di Siena ad Arezzo, intitulé Du texte à l’écran : L’édition de textes à l’heure de l’électronique, dont le programme est disponible ici, et j’aimerais vous faire profiter des quelques notes que j’ai prises à cette occasion.

La matinée était consacrée, avec un parti-pris pratique appréciable, à la présentation d’expériences d’éditions, dont la diversité était un point fort. Ainsi, après un mot de bienvenue du directeur de l’ENC, Jacques Berlioz, la journée s’est ouverte sur une présentation, par Florence Clavaud, du travail qu’elle a effectué en collaboration avec le Groupe de recherche sur les pouvoirs et les sociétés de l’Occident médiéval et moderne (le GREPSOMM) pour convertir de façon semi-automatisée les 387 minutes correspondant à l’année 1437 dans la pratique de Pierre Christofle, notaire à Orléans, depuis le format Open document, utilisé  pour leur travail préparatoire par les chercheurs canadiens, au format XML TEI, adapté à une publication en ligne, qui ne saurait tarder, sur la plateforme d’édition électronique de l’ENC, ELEC. Camille Desenclos a ensuite poursuivi sur la TEI, avec la présentation du travail d’édition entrepris pour son mémoire de Master II et portant sur la correspondance active de l’ambassade du Duc d’Angoulême (1620-1621), corpus constitué de 87 lettres. Elle a montré en  quoi elle avait été amenée à opérer des choix d’encodage en raison d’une forme d’inadéquation de la TEI à l’édition de correspondances. Elle a également souligné qu’au sein du projet TEI, un groupe spécialement dédié aux correspondances travaillait à la définition de bonnes pratiques et à la création de nouveaux éléments et classes adaptés.

On s’est ensuite éloigné temporairement de la TEI, avec une présentation par Elisa Brunoni et Irene Giacomelli de l’édition digitale du Corpus Rhythmorum Musicum (IVe-IXe siècle), dirigée par Francesco Stella, édition très riche, notamment du côté de l’interactivité et des statistiques textuelles, concernant entre autres choses l’ordre syntaxique (vers par vers !) ou les cas employés. S’il est permis de faire une légère critique sur cette présentation, par ailleurs passionnante et concernant une édition très aboutie, on pourra déplorer le manque relatif de détails techniques sur la réalisation concrète de la base de données qui est derrière l’édition.

Pont entre les travaux des érudits français et italiens, la communication de Laura Gili s’est penchée sur les possibilités procurées par l’outil électronique pour les éditions multilingues. Elle a également introduit la question du lien entre édition papier et électronique, problématique qui a été ensuite reprise par Anne Rochebouet, qui a présenté l’intérêt indéniable de LaTeX pour les éditions critiques sous forme papier, tant en ce qui concerne la présentation d’un apparat critique sur plusieurs étages de notes, la mise en vis-à-vis de textes sur plusieurs colonnes ou sur deux pages, ou la typographie impeccable que permet ce logiciel de traitement de texte, certes un peu atypique à l’heure de l’hégémonie du WYSIWYG, mais dont l’efficacité n’est plus à démontrer.

L’après-midi s’est ensuite ouverte par une présentation, par Frédéric Glorieux et Vincent Jolivet, de Diple, modules et méthodes pour l’édition en ligne de documents TEI. Diple fournit plusieurs outils pour qui voudrait se lancer dans l’édition en TEI : un module de conversion de fichiers Open document en fichiers XML TEI ; le schéma TEI utilisé par ELEC ; un module, XREM, de génération automatique de la documentation d’un fichier XML ; une libraire PHP permettant de générer le site de consultation…  Devant tant d’outils permettant virtuellement de faire une édition électronique de façon automatisée, une question récurrente et fondamentale a refait surface : Peut-on faire une édition en XML sans connaître les balises ? Si l’on ne peut proposer de réponse univoque à cette question, on notera toutefois que, si des développements permettent d’automatiser la partie la plus technique du travail d’édition en ligne, la responsabilité des choix scientifiques, y compris en ce qui concerne le balisage, et leur justification repose nécessairement sur l’éditeur.

La dernière partie de cette journée a enfin été consacrée à l’exploitation des éditions électroniques, avec en premier lieu une intervention de Dominique Stutzmann sur l’exploitation de l’information paléographique du matériau écrit. La démonstration s’est appuyée sur l’exemple des différentes formes du s et des variations dans le système abréviatif. Une analyse en composantes principales exceptionnellement claire a montré sur le plan factoriel envisagé une division de la population en deux groupes selon un critère chronologique (avant ou après 1169). L’intervenant a également renvoyé à un article de Nicolas Mazziotta dans Corpus relatif à ces questions d’encodage des abréviations du français médiéval1 et souligné à la fois la multiplicité des initiatives actuelles et l’importance de l’élaboration d’une norme d’encodage, nécessaire à la pérennité et l’interopérabilité.

Ce fut alors au tour de Frédéric Glorieux et Renaud Alexandre de présenter le projet OMNIA, Outils et méthodes numériques pour l’interrogation et l’analyse de textes médiolatins2, en mettant l’accent sur le besoin de numérisation et de mise en ligne des ressources lexicographiques existantes et l’utilisation des documents numérisés « pour mettre en place des procédures de recherche formalisées et largement assistées ». Pour satisfaire à ce dernier objectif, il est indispensable de recourir à des outils de lemmatisation, de génération de tables de cooccurrence et d’interrogation chronologique. Nous ne pouvons en effet que souligner l’importance de ces besoins, pas uniquement spécifiques au latin médiéval, mais valant également pour les langues romanes médiévales3.

Last but not least, la journée s’est conclue par une intervention de Francesco Stella sur des Expérimentations de statistique linguistique sur un genre littéraire : l’épître latine. S’il est impossible de résumer en détail ici cette communication particulièrement riche, on s’attardera sur un point très intéressant soulevé dans le débat : faut-il lemmatiser ? En effet, dans une certaine mesure, lemmatiser c’est détruire de l’information linguistique, comme il a été souligné avec un renvoi aux théories de Michel Banniard, bâties en bonne part sur l’observation des formes. On ne peut néanmoins s’empêcher de constater, en consultant de nombreuses études de statistiques textuelles, et particulièrement en regardant « en bas » des tableaux d’occurrences, que l’importance  de certains lemmes dont beaucoup de formes différentes sont employées (et je pense particulièrement aux verbes) est masquée par l’absence de lemmatisation. En attendant de consacrer un billet entier à cette question, je me contenterai de noter ici, avec D. Stutzmann, qu’il serait intéressant d’étudier ce qui se passe au moment de la lemmatisation, c’est-à-dire l’utilisation des cas et des genres propre à chaque lemme, et de conclure avec l’ensemble des participants qu’une étude sérieuse se doit d’envisager à la fois l’utilisation des formes brutes et des lemmes.

Au moment de conclure ce billet, je m’aperçois que cette journée d’études a déjà fait l’objet d’un fort intéressant compte rendu, que je vous invite à consulter également, sur le blog de Dominique Stutzmann.

  1. Nicolas Mazziotta, « Traiter les abréviations du français médiéval. Théorie de l’écriture et pratiques d’encodage », Corpus [En ligne], n°7 | novembre 2008, mis en ligne le 13 novembre 2009, Consulté le 18 décembre 2010. URL : http://corpus.revues.org/index1517.html []
  2. On trouvera une présentation générale de ce projet, datant de 2009, dans Bruno Bon, « OMNIA: outils et méthodes numériques pour l’interrogation et l’analyse des textes médiolatins (2) », Bulletin du centre d’études médiévales d’Auxerre | BUCEMA [En ligne], 14 | 2010, mis en ligne le 14 octobre 2010, Consulté le 18 décembre 2010. URL : http://cem.revues.org/index11566.html []
  3. La question des outils existants  de lemmatisation pour l’ancien français ou l’ancien occitan fera d’ailleurs ici même l’objet d’un billet détaillé. []

Jean-Baptiste Camps

Diplômé de l'École nationale des chartes et docteur en études médiévales de l'Université Paris-Sorbonne (la Chanson d'Otinel…, dir. Dominique Boutet ), Jean-Baptiste Camps est responsable pédagogique du master «Humanités numériques» à l'École nationale des chartes (PSL). [CV et liste des publications, voir : http://paris-sorbonne.academia.edu/JeanBaptisteCamps]

More Posts - Website

Follow Me:
LinkedIn

Identification automatique des noms propres

Voici un des premiers résultats de mes expérimentations avec Perl, à savoir un script qui permet, avec une marge d’erreur relativement faible (env. 1% dans mon corpus test1) d’identifier automatiquement les noms propres.

L’idée originelle est d’utiliser l’encodage « naturel» des textes, c’est-à-dire l’ensemble des  symboles et diacritiques traditionnels (ponctuations, accents, majuscules, etc.). En l’occurrence, pour les noms propres, cet encodage consiste en l’utilisation d’une majuscule au début du mot. Le problème principal réside alors dans la présence de majuscules également en tête de phrase (heureusement que nous ne prenons pas comme exemple un texte allemand contemporain !). Dans un premier temps, après avoir nettoyé tout ce qui ne nous est pas nécessaire, le script constitue donc deux listes. La première contient tout les mots commençant par une majuscule et ne se trouvant pas en début de phrase et qui sont donc nécessairement des noms propres ; la seconde, tous les mots se trouvant en début de phrase, qui peuvent être des noms propres, mais pas forcément.

#on récupère tout les mots qui commencent par une majuscule, sans être précédé par un point ou un guillemet.
@NomP = $texte =~ /[^.!?«»]\s+(\b[A-Z]\w+)/g;
@NomP = grep {/\w+/} @maj;
#Puis on récupère tout ce qui correspond à un point ou un guillemet, un espace, et une majuscule.
@debutPhrase = $texte =~ /[.!?«»]\s+([A-Z]\w+)/g;
@debutPhrase = grep {/[^\s.!?«»]/} @debutPhrase;

Maintenant que nous avons ces deux listes, nous avons d’ores et déjà récupéré une bonne partie des noms propres, mais il est encore possible d’améliorer le script et de faire diminuer le nombre de mots incertains (ceux de la liste @debutPhrase). Pour ce faire, on procède à une comparaison des deux listes (en incluant la variation du système bicasuel de l’occitan médiéval). Si le mot « indécis » correspond à un de ceux de la liste de noms propres, il est transféré dans cette liste2 :

Comparaison entre les deux listes (en incluant les variations graphiques)

De 57 mots dans la liste @debutPhrase, on passe à 40, dont seulement 6 vrais noms propres, chiffre qui est à opposer aux  460 noms propres trouvés, soit 98,71% de réussite, ce qui n’est pas si mal que ça (je suis bien sûr preneur de toute suggestion d’amélioration).

  1. Ce corpus test se compose d’une quarantaine de vidas, courts textes biographiques occitans du XIIIe siècle, racontant la vie d’un troubadour. []
  2. Autrement dit, si notre mot qui porte une majuscule et se trouve en début de phrase apparaît ailleurs dans le texte, portant une majuscule, mais sans être en début de phrase, il s’agira d’un nom propre. Dans le cas contraire, la situation reste indécise : il peut soit s’agir d’un nom commun, soit bel et bien d’un nom propre n’apparaissant qu’une seule et unique fois dans le corpus []

Jean-Baptiste Camps

Diplômé de l'École nationale des chartes et docteur en études médiévales de l'Université Paris-Sorbonne (la Chanson d'Otinel…, dir. Dominique Boutet ), Jean-Baptiste Camps est responsable pédagogique du master «Humanités numériques» à l'École nationale des chartes (PSL). [CV et liste des publications, voir : http://paris-sorbonne.academia.edu/JeanBaptisteCamps]

More Posts - Website

Follow Me:
LinkedIn

Réaliser un tableau d’occurrences lexicales avec Perl

Voici un exemple des traitements que l’on peut réaliser (relativement) aisément avec Perl. Il s’agit ici d’un petit script permettant, à partir d’un fichier en entrée contenant plusieurs textes séparés par le symbole §, de créer un tableau au format csv contenant, pour chaque texte, le nombre d’occurrences de chaque forme.

Pour commencer, il nous faut nettoyer en supprimant les majuscules et la ponctuation du texte, contenu dans la variable $texte, puis créer une liste d’occurrences des formes du texte complet, sous la forme d’une table de hachage, en utilisant une sous-routine compteur dont il sera question plus loin :

$texte =~ s/\_|\t|\.|\:|\,|\;|\«|\»|\)|\(|\'|\~|’|…|\?|\n/ /g;
%occurrencesTexteComplet = &compteur($texte);

Une fois cette tâche effectuée, nous allons maintenant séparer le texte complet, en une série de sous-textes en utilisant le symbole § :
@sous_textes = split(/§/, $texte);

Nous pouvons à présent comparer les listes d’occurrences de chaque sous-texte avec celui du texte complet :

Comparaison des deux tableaux d'occurrences

Et voilà, il ne nous reste plus qu’à générer le fichier de sortie, au format csv, que l’on pourra par la suite ouvrir avec Calc (ou Excel), importer dans R, etc.

Mise en forme du csv

La sous-routine compteur

Il s’agit d’une sous-routine que Perl rend assez simple, car c’est le type de traitement pour lequel il a été conçu. Elle compte un à un les mots d’un texte, et, à chaque fois qu’un mot réapparaît, elle ajoute 1 au compteur :

La sous-routine compteur

Jean-Baptiste Camps

Diplômé de l'École nationale des chartes et docteur en études médiévales de l'Université Paris-Sorbonne (la Chanson d'Otinel…, dir. Dominique Boutet ), Jean-Baptiste Camps est responsable pédagogique du master «Humanités numériques» à l'École nationale des chartes (PSL). [CV et liste des publications, voir : http://paris-sorbonne.academia.edu/JeanBaptisteCamps]

More Posts - Website

Follow Me:
LinkedIn

Un premier pas avec Perl

Dans la perspective de choisir un langage de programmation pour réaliser des programmes de traitement textuel, je me suis décidé, pour commencer, à comparer deux langages, un de relativement bas niveau (en l’occurence C++, mais j’aurais également pu choisir Java) et un de plus haut niveau (en l’occurence Perl, mais j’aurais pu aussi choisir Python).

 

Le test consiste à réaliser, sans connaissance a priori de ces deux langages, en un quart d’heure ou une demie heure, un programme très simple, version un tout petit peu plus évoluée d’un hello world ! qui demande à l’utilisateur combien de fois il veut qu’on lui dise « Bonjour ! » et effectuant cette opération1 :

À gauche, le code C++, à droite le code Perl

Première constatation, Perl paraît à la fois plus concis et un petit peu moins précis (moins propre ?) puisqu’on ne déclare pas la nature de la variable. En dehors de cela, rien de trépidant. Ce qui est plus intéressant, en revanche, c’est que l’on dispose d’au moins une autre solution très simple en Perl (qui, admettons-le, a été créé pour faire des traitements textuels, ce qui n’est pas le cas de C++) :

Alternative en Perl

Et voilà ! En un mirobolant total de 3 lignes de code, c’est fait. Voilà qui aurait tendance à prêcher pour Perl, même si ça n’a pas la rigueur et la beauté abstraite du C++.

  1. Je précise que je ne suis pas informaticien de formation, et ai donc sur le sujet le regard, peut-être un peu naïf, du néophyte. Que les programmeurs veuillent bien m’en excuser ! []

Jean-Baptiste Camps

Diplômé de l'École nationale des chartes et docteur en études médiévales de l'Université Paris-Sorbonne (la Chanson d'Otinel…, dir. Dominique Boutet ), Jean-Baptiste Camps est responsable pédagogique du master «Humanités numériques» à l'École nationale des chartes (PSL). [CV et liste des publications, voir : http://paris-sorbonne.academia.edu/JeanBaptisteCamps]

More Posts - Website

Follow Me:
LinkedIn