mercredi 20 juin 2012

Extraire le texte de documents HTML en créant des annotations à la place des balises

Traiter du SGML (e.g. HTML) ou du XML (i.e. SGML davantage contraint) est une activité commune dans nos chaînes de traitement TAL (Traitement Automatique des Langues). Par ailleurs, souvent les traitements que nous souhaitons réaliser (segmentation en phrases, en mots, étiquetage morpho-syntaxique, reconnaissance d'entités nommées...) ne fonctionnent que sur du texte simple (plain text).

1. Tika MarkupAnnotator vs. uima-connectors XML2CAS

A ma connaissance, il y a au moins deux composants UIMA "librement" disponibles pour 
  1. extraire le texte d'un document SGML sans en modifier ses offsets 
  2. transformer les balises d'un document SGML en annotations UIMA au dessus des zones de texte couvertes.
Il s'agit du Tika MarkupAnnotator [1] et du uima-connectors XML2CAS [3]. 
  • Pour chacun d'eux l'on peut spécifier la vue à analyser et la vue dans laquelle il faut produire le texte.
  • Chacun d'eux produit des annotations correspondantes aux balises. Le système de types est évidement différent dans sa forme même si l'on retrouve globalement dans le fond la même information. 
  • XML2CAS travaille seulement avec de l'XML et vous autorise à spécifier les noms des éléments que vous voulez transformer en annotations afin de restreindre la taille du CAS
  • MarkupAnnotator offre la possibilité de traiter de l'XML mal formée (i.e. du SGML et en particulier HTML). Cela relativement simplement en ajoutant la bibliothèque du TagSoup parser dans le classpath [5].
Le premier est disponible dans les Annotator addons de Apache UIMA [2] et le second requiert de récupérer la bibliothèque uima-common pour fonctionner (au final [3] et [4]).


2. Quelques détails sur mon test
Personnellement j'ai testé les deux au sein d'un projet java Eclipse en déclarant les dépendances  suivantes dans mon classpath (en plus de celles de UIMA):
  • UIMA_HOME/addons/annotator/TikaAnnotator/lib/tika-core-0.7.jar
  • UIMA_HOME/addons/annotator/TikaAnnotator/lib/tika-parsers-0.7.jar
  • UIMA_HOME/addons/annotator/TikaAnnotator/lib/uima-an-tika.jar
  • chemin/vers/votre/lib/uima-common-v120111.jar
  • chemin/vers/votre/lib/uima-connectors-v111205.jar
  • chemin/vers/votre/lib/tagsoup-1.2.1.jar
J'ai ajouté la UIMA nature au projet et ajouté le répertoire desc aux build path pour me faciliter la tâche. J'ai créé un descripteur d'Analysis Engine que j'ai changé en aggregate afin de rajouter, les composants que je souhaitais tester, dans ma pipeline (section aggregate du descripteur) : 
MarkupAnnotator et connectors.xml.XML2CASAE.
J'ai surchagé les paramètres des deux composants (section parameter) et n'ai pas oublié de les configurer (section parameter settings). 
Puis j'ai déclaré les types en sortie (section capabilities).
Enfin j'ai lancé ma chaîne à l'aide du Document Analyser. Lorsque j'ai testé sur du HTML je n'avais pas retiré le composant XML2CAS de ma pipeline.