Extraction de graphies dans un corpus
Cette page introduit un tutoriel sur l'extraction de graphies dans un corpus significatif.
Nous prendrons pour exemple une analyse d'un corpus extrait d'ISTEX sur la philologie. Celui-ci fait l'objet d'une plate-forme de curation et d'exploration sur Wicri/Linguistique.
Le problème posé est relativement simple : quelles sont toutes les graphies contenant la racine « philolog » dans un corpus.
Sommaire
Manipulations d'expressions régulières dans DILIB
Les graphies recherchées par exemple « philologie » ou « philology » peuvent être reconnues par des expressions régulières.
Les expressions régulières autour de la philologie
Il convient de distinguer les contextes sélectionnées et les graphies effectivement extraites. Par exemple une expression comme [Pp]hilogogue
va permettre de sélectionner des phrases contenant « philologue » ou « philologues ». Mais seule la forme « philologue » sera effectivement extraite.
Le corpus Philologie est conséquent : 23 000 documents, dont certains sont volumineux. Il est donc intéressant de se constituer un répertoire de toutes les graphies possibles.
Pour extraire tous les suffixes, on peut imaginer une première expression régulière du type :
[Pp]hilolog[a-z]*
Dans le programme qui suit, on utilise une expression à plus large couverture qui permet de reconnaître préfixes ou suffixes, indépendamment de la casse.
[A-Za-z]*[Pp][Hh][Ii][Ll][Oo][Ll][Oo][Gg][A-Za-z]*
Outils disponibles dans Dilib
La manipulation des expressions régulières en langage C n'est pas évidente pour des programmeurs non spécialistes. Dilib apporte un ensemble de fonctions simplificatrices.
Dans un premier temps, 2 fonctions vont être utilisées :
- ( ) RegExpCreate , qui permet de compiler une expression régulière. Elle prend un seul paramètre : l'expression régulière.
- ( ) RegExpExtract, qui extrait la graphie reconnue.
Voici un premier programme qui permet d'afficher la première forme reconnue dans un document.
Pour lire le document, on utilise l'interface Buffer, avec notamment l'emploi de BufferGets qui permet d'importer un document Sxml de taille quelconque.
#include "Buffer.h"
#include "RegExp.h"
#include <stdio.h>
#include <string.h>
int main()
{
RegExp *rePhilo;
Buffer *bufDoc;
char *match;
char *beginToParse;
rePhilo=RegExpCreate("[A-Za-z]*[Pp][Hh][Ii][Ll][Oo][Ll][Oo][Gg][A-Za-z]*");
bufDoc=NewBuffer();
beginToParse=BufferGets(bufDoc);
match=RegExpExtract(rePhilo, beginToParse);
if (match)
{
printf("%s", match);
putchar('\n');
}
exit(EXIT_SUCCESS);
}
Programme final
Pour pouvoir faire facilement des énumérations, le programme génère des triplets contenant :
- la chaîne reconnue,
- la clé HFD,
- un numéro d'ordre (numMatch).
#include "Buffer.h"
#include "RegExp.h"
#include <stdio.h>
#include <string.h>
int main()
{
RegExp *rePhilo;
Buffer *bufDoc;
Buffer *bufKey;
rePhilo=RegExpCreate("[A-Za-z]*[Pp][Hh][Ii][Ll][Oo][Ll][Oo][Gg][A-Za-z]*");
bufDoc=BufferCreate(1000,1000);
bufKey=NewBuffer();
while (BufferGets(bufDoc))
{
char *posTab;
char *match;
char *beginToParse;
int numMatch;
posTab=strchr(BufferString(bufDoc), '\t');
if (posTab)BufferStrncpy(bufKey, BufferString(bufDoc), posTab-BufferString(bufDoc));
beginToParse=BufferString(bufDoc);
numMatch=0;
match=RegExpExtract(rePhilo, beginToParse);
while (match)
{
numMatch++;
printf("%s", match);
free (match);
if (posTab)
{
printf("\t%s\t%d\n", BufferString(bufKey), numMatch);
}
else putchar('\n');
beginToParse=RegExpLoc2;
match=RegExpExtract(rePhilo, beginToParse);
}
}
exit(EXIT_SUCCESS);
}
Si le source est rangé dans un fichier « findPhilolog », la compilation se fait ainsi :
gcc findPhilolog.c $DILIB_CC -o findPhilolog
Adaptations volumétriques
Le temps de traitement séquentiel du corpus philologie est relativement long. Ainsi, pour le corpus complet, une commande comme :
time HfdCat $WICRI_ROOT/Wicri/Linguistique/corpus/Philologie.storage/CorpusIstexVM2/*.hfd \
| ./findPhilolog > resultPhilolog.txt
donne :
real 14m27.714s user 13m33.421s
Le fichier resultPhilolog.txt est donc une suite de triplets tels que :
philological 000000 1 philological 000000 2 Philological 000000 3 ... whichhisrphilologic 000002 5 ...
Il contient 53 000 entrées. Il peut être utilisé pour des recherches plus précises qui seront très rapides. Ainsi la commande suivante permet d'obtenir le nombre de graphies différentes reconnues.
cat resultPhilolog.txt | SgmlFast -c3 | SgmlFast -c2 | sort -u | wc
donne quasi instantanément 245 graphies différentes.
Plus précisément la commande :
time cat resultPhilolog.txt | SgmlFast -c3 | SgmlFast -c2 | sort -u | wc
affiche 0m0.958s comme temps de traitement.
En quelques secondes (3 précisément), la suite de commandes :
cat resultPhilolog.txt \
| SxmlSelect -p @1 -p @2@3 \
| sort \
| IndexBuildRec \
| SxmlSelect -g idx/f/1 -g idx/k/1 -p @g1 -p @g2 \
| sort -rn
donne le principal résultat recherché :
20695 Neophilologus 15106 Philology 7896 Philological 2483 PHILOLOGICAL 1456 philology 1406 philological 1260 Philologie 330 philologie 309 philologists 260 philologist 198 Philologica 190 Philologus 100 Philologen 98 philologica 85 PHILOLOGY 84 Philologisch 76 Philolog 69 philologically 66 Neuphilologische 56 philologischen 56 philologische 55 Philologische 54 Philologia 49 Syphilology 40 Philologists 38 philologicorum 36 philologisch 35 philologique 35 Neophilologica 33 Philologos 32 Philologi 30 philologic 30 Philologist 29 Philologico 28 Philologiae 24 philologos 24 Philologique 23 Philologicall 22 philologiques 22 Philologisches 21 philologicis 21 Philologicis 19 philologico 19 Philologischer 17 philologue 17 Philologe 17 PHILOLOGIST 16 Philologien 15 philologischer 15 philologicum 14 Philologicae 13 philolog 13 Philologiques 13 PHILOLOGUS 12 neophilologica 12 Philologencongres 12 PHILOLOGIA 11 philologi 10 ophilologique 10 Philologicus 10 PHILOLOGICO 9 philologicall 9 philologer 9 SYPHILOLOGY 8 philologus 8 philologies 8 philologici 8 philologiae 8 Philologorum 8 Philologici 8 Neuphilologie 7 philologice 7 philologers 7 PHILOLOGISTS 7 PHILOLOGIE 7 PHILOLOGICA 6 philologues 6 philologis 6 philologicae 6 Philologice 6 Philologic 6 Philologias 6 Altphilologie 5 philologia 5 Sociophilological 5 Philologicum 5 Philologenverbandes 5 PHILOLOG 5 Editionsphilologie 4 philologisches 4 philologischem 4 philologicus 4 ophilologie 4 neophilologus 4 Philologka 4 Philologentagung 4 PHILOLOGJCAL 4 PHILOLOGI 4 Neophilologische 4 Altphilologe 3 syphilology 3 philologians 3 neuphilologischen 3 Zukunftsphilologie 3 Philologit 3 Philologischhistorische 3 Philologiestudiums 3 Philologiestudenten 3 Philologicc 3 Philologer 3 PHILOLOGICAE 3 PHILOLOGIC 3 Neophilologique 3 Nationalphilologien 2 syphphilology 2 pragmaphilology 2 philologorum 2 philologiqu 2 philologicas 2 philologian 2 philologae 2 nonphilologists 2 Philologues 2 Philologs 2 Philologm 2 Philologishe 2 Philologis 2 Philologik 2 Philologieli 2 Philologicz 2 Philologically 2 Philologers 2 PHILOLOGr 2 PHILOLOGILE 2 PHILOLOGICIS 2 PHILOLOGICAAL 2 Neuphilologentage 2 Fremdsprachenphilologie 1 whichhisrphilologic 1 tophilology 1 rhefaurusPhilolog 1 rephilologisation 1 philosphilolog 1 philologyv 1 philologussa 1 philologum 1 philologs 1 philologry 1 philologricall 1 philologrical 1 philologkt 1 philologit 1 philologistic 1 philologiral 1 philologilt 1 philologil 1 philologiils 1 philologifis 1 philologiff 1 philologiegeschichtlichen 1 philologiec 1 philologicc 1 philologicarum 1 philologicarl 1 philologiadi 1 philologcrs 1 philologS 1 nonphilological 1 aludlphilologic 1 Zukunftsphilologen 1 TothePHILOLOG 1 TPhilologicis 1 Sanskritphilologie 1 SacredPhilology 1 Pragmaphilology 1 Philologws 1 Philologorllm 1 Philologo 1 Philologlca 1 Philologlae 1 Philologix 1 Philologito 1 Philologisierung 1 Philologiseh 1 Philologischen 1 Philologiqucs 1 Philologioo 1 Philologilm 1 Philologiko 1 Philologika 1 Philologij 1 Philologiiu 1 Philologihn 1 Philologifl 1 Philologiese 1 Philologies 1 Philologiegeschichte 1 Philologiecal 1 Philologicx 1 Philologicorum 1 Philologicor 1 Philologicmri 1 Philologiciil 1 Philologicifque 1 Philologiciae 1 Philologicaw 1 Philologicas 1 Philologicar 1 Philologicam 1 Philologiarum 1 Philologiai 1 Philologiaal 1 Philologenversammlung 1 Philologenvers 1 Philologenverbands 1 Philologenverband 1 Philologentag 1 Philologenkreises 1 Philologenkongress 1 Philologa 1 PhilologUica 1 PHILoLOGICAL 1 PHILOLOGos 1 PHILOLOGOS 1 PHILOLOGJICAL 1 PHILOLOGIQUES 1 PHILOLOGICORUM 1 PHILOLOGICEA 1 PHILOLOGICALLEARstNo 1 PHILOLOGER 1 Offenbarungsphilologie 1 ObfcrvationcsPhilolog 1 Neuphilologischer 1 Neophilologrca 1 Neophilologos 1 Namenphilologische 1 Grimmelshausenphilologie 1 GlaffliPhilologia 1 Editionsphilologen 1 DiffertationeslPhilologice 1 Celticphilologist 1 CPhilological 1 BythePHILOLOGICAL 1 Autorphilologie 1 Altphilologenverbandes