Extraction de graphies dans un corpus

De Wicri Manuel
logo travaux page en cours de rédaction

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.

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 :

  • ( LogoWicriWicriFrMars2010.png ) RegExpCreate , qui permet de compiler une expression régulière. Elle prend un seul paramètre : l'expression régulière.
  • ( LogoWicriWicriFrMars2010.png ) 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 :

  1. la chaîne reconnue,
  2. la clé HFD,
  3. 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