Extraction de graphies dans un corpus : Différence entre versions

De Wicri Manuel
imported>Jacques Ducloy
(Outils disponibles dans Dilib)
imported>Jacques Ducloy
(Outils disponibles dans Dilib)
Ligne 25 : Ligne 25 :
 
     |wiki=Outils
 
     |wiki=Outils
 
     |page=Dilib, module RegExp, constructeur RegExpCreate
 
     |page=Dilib, module RegExp, constructeur RegExpCreate
     |texte=RegExpCreate}} , qui permet de compiler une expression régulière,
+
     |texte=RegExpCreate}} , qui permet de compiler une expression régulière. Elle prend un seul paramètre : l'expression régulière.
 
* {{Wicri lien avec icône
 
* {{Wicri lien avec icône
 
     |wiki=Outils
 
     |wiki=Outils
 
     |page=Dilib, module RegExp, fonction RegExpExtract
 
     |page=Dilib, module RegExp, fonction RegExpExtract
     |texte=RegExpExtract}} qui extrait la graphie reconnue.
+
     |texte=RegExpExtract}}, qui extrait la graphie reconnue.
  
 
==Programme final==
 
==Programme final==

Version du 25 avril 2015 à 11:46

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.

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