Archives du tag : Analysis engine

Principes d’une chaîne de traitements UIMA

L’objectif d’une chaîne de traitements UIMA est d’extraire de façon automatique des informations structurées à partir d’un document non structuré (texte, image, vidéo, etc.). Une chaîne de traitements UIMA respecte généralement les étapes suivantes :
  1. Charger un document non structuré (comme le texte du Petit Prince de Saint-Exupéry dans l’illustration ci-dessous).
  2. Générer le schéma d’annotation commun (Common Analysis Structure ou CAS) qui encapsulera toutes les annotations concernant le document analysé, ainsi que le document lui-même.
  3. Enchaîner les composants d’annotation (un segmenteur, un analyseur d’entités nommées et un annalyseur morpho-syntaxique dans l’illustration ci-dessous).
  4. Générer une sortie (généralement un fichier xmi) à partir des annotations contenues dans le CAS (le fichier xmi généré est visualisé dans l’outil UIMA Document Viewer dans l’illustration ci-dessous).
Exemple de chaîne de traitements UIMA
Publié dans UIMA, TALN | Tagué , , | Laisser un commentaire

Qu’est-ce que UIMA ?

UIMA (Unstructured Information Management Architecture) est un framework de développement et de déploiement d'applications de traitement des données non structurées. Lancé par IBM, et maintenant en incubation à la fondation Apache, UIMA est en cours de normalisation à l'OASIS (Organization for the Advancement of Structured Information Standards). L'objectif de ce framework est de proposer une architecture supportant les différentes étapes du traitement d'un document non structuré (texte, image, vidéo, etc.) en vue d'en extraire de façon automatique des informations structurées. UIMA ne décrit ni comment ces informations doivent être extraites du texte, ni la façon de s'en servir. Par contre, cette plate-forme de développement prend en charge de nombreuses problématiques de façon native comme la réutilisation de composants, la montée en charge et le déploiement distribué, la prise en compte des erreurs, la mise en œuvre de services web, etc.

Le site Apache UIMA propose un schéma illustrant bien les différentes facettes d’UIMA.

Les composants (Components) sont les briques de base permettant de bâtir une application UIMA complète. Les composants d’annotation (Annotators sur le schéma) sont les composants qui supportent la responsabilité la plus importante qui est d’effectuer des traitements (un traitement par composant en principe). Le système de types permet de définir la hiérarchie de types (type au sens informatique du terme) qui supportera les annotations (i.e. c’est le diagramme de classes des annotations).

Les Frameworks sont l’ensemble des bibliothèques et outils permettant de développer et d’exécuter des applications UIMA.

Publié dans UIMA | Tagué , | Laisser un commentaire

Composant d’annotation (Analysis Engine)

Le composant d’annotation (Analysis Engine ou AE) est le composant élémentaire d’une chaîne de traitements UIMA. Son rôle est d’effectuer un traitement (comme l’étiquetage morpho-syntaxique) en utilisant éventuellement des annotations contenues dans le CAS (comme une segmentation en mots) et en produisant de nouvelles annotations dans le CAS (comme les étiquettes morpho-syntaxique de chacun des mots).

Un composant d’annotation UIMA (Analysis Engine) est constitué de deux parties distinctes :

  • Un descripteur de composant (componant descriptor) qui constitue la partie déclarative. Il contient des méta-données qui décrivent le composant (types de données en entrée et en sortie, identité …) et est stocké dans un fichier XML.
  • Un annotateur (Annotator) qui est en fait le code (en Java par exemple) effectuant le traitement proprement dit du composant.

En résumé :

Composant d’annotation = Descripteur de composant + Annotateur
Analysis Engine = Componant Descriptor + Annotator

Publié dans UIMA | Tagué , , | Laisser un commentaire

UIMA : La chaîne de traitement (Collection Processing Engine)

Collection Processing Engine

Une chaîne de traitement UIMA comporte trois types d’éléments :
  1. Le Collection Reader : généralement le premier élément de la chaîne, il permet de créer des CAS autour de chaque ressource.
  2. Les Analysis Engines (AE) : raison d’être de la chaîne, ils effectuent les traitements en utilisant les annotations contenues dans le CAS et en produisant de nouvelles annotations dans le CAS. Un CAS Consumer est un Analysis Engine particulier qui n’est pas destiné à enrichir un CAS mais qui génère une sortie (généralement un fichier) à partir des annotations contenues dans le CAS.
  3. Le Workflow Controller : c’est lui qui orchestre l’exécution des Analysis Engines. On peut distinguer deux types de Workflow Controller :
    • le CPM (Collection Processing Manager ou CPM) et les service Vinci (Vinci Services) ;
    • et le tout nouveau AS (Asynchronous Scaleout) bien plus flexible.
L’outil graphique Collection Processing Engine Configurator (UIMA CPE GUI sous Eclipse), instancie un Workflow Controller du type CPM appelé FixedFlow qui consiste simplement à enchaîner séquentiellement un Collection Reader, puis un certain nombre d’Analysis Engine et enfin un CAS Consumer, comme illustré sur la figure en début de billet. UIMA représente une telle chaîne de traitement dans un descripteur appelé Collection Processing Engine (CPE).
Publié dans UIMA | Tagué | Laisser un commentaire

Tutoriel UIMA III : enchaîner des composants d’annotation

Apache UIMA utilise le même type de fichier de description (Component Descriptor) pour désigner un composant ou une chaîne de traitement. Le fichier descripteur est :
  • soit configuré comme primitif dans le cas où il décrit un traitement élémentaire (comme dans le Tutoriel UIMA I),
  • soit configuré comme agrégé (aggregate) dans le cas où il fait référence à d’autres descripteurs de fichiers primitifs ou agrégés.
L’opération consistant à enchaîner plusieurs composants est extrêmement simple et ne requiert aucune écriture de code.
  1. Créer un Aggregate Analysis Engine Descriptor :
    File → New → Others → UIMA → Analysis Engine Descriptor File ; préciser le nom dans le champs File name: puis Finish. Faire ensuite un clic droit sur le fichier .xml ainsi créé puis Open With → Component Descriptor Editor. Dans l’onglet Overview, cocher Aggrerate comme Engine Type.
  2. Dans l’onglet Aggregate, ajouter tous vos annotateur en cliquant sur Add…
  3. Enfin, dans l’onglet Capabilities, il faut préciser les types utilisés, et s’ils le sont en entrée ou en sortie, en cliquant sur Add Type.
  4. Il ne reste plus qu’à tester l’Aggregate Analysis Engine Descriptor en utilisant le Document Analyzer comme décrit à la fin du Tutoriel UIMA I.
Publié dans UIMA | Tagué , | Laisser un commentaire

Tutoriel UIMA II : paramétrage d’un composant d’annotation

  1. Déclarer des paramètres
    Pour déclarer des paramètres pour un composant, il suffit de se rendre dans l’onglet Parameters du descripteur XML de l’annotateur (clic droit sur le fichier .xml puis Open With → Component Descriptor Editor). L’onglet Parameter Settings permet de donner une valeur par défaut aux paramètres déclarés.
  2. Accéder aux paramètres
    Supposons que le paramètre maChaine de type String ait été préalablement déclarée au niveau du descripteur XML de l’annotateur (cf. ci-dessus). On peut accéder à ce paramètre dans le code Java de l’annotateur de la manière suivante :
    String monParametre = (String) this.getContext().getConfigParameterValue("maChaine");
    La méthode getContext() permet de récupérer un objet du type UimaContext qui centralise l’accès aux différentes facettes du contexte de l’annotateur comme les paramètres ou l’historique des événements (logging).
  3. Accéder aux paramètres depuis la méthode initialize()
    Un moyen plus propre d’accéder aux paramètres est de surcharger la méthode initialize(UimaContext), appelée automatiquement par le framework lors de l’instanciation de l’annotateur, qui reçoit justement comme paramètre un objet du type UimaContext :
    private String monParametre;
    public void initialize(UimaContext aContext) throws ResourceInitializationException {
       super.initialize(aContext);
       monParametre = (String) aContext.getConfigParameterValue("maChaine");
    }
Tutoriel et guide du développeur UIMA (puis cliquer sur Tutorials and Users’ Guides)
Sommaire UIMA sur ce blog
Publié dans UIMA | Tagué , | Laisser un commentaire

Tutoriel UIMA I : création d’un composant d’annotation (Analysis Engine) en utilisant le JCas

Ce billet décrit comment créer un composant d’annotation (Analysis Engine) UIMA simple qui segmente un fichier texte en mots.
  1. Préparation du projet dans Eclipse
    Lancer Eclipse puis : File → New → Other… → Java → Java Project → Next. Saisir un nom dans le champs Project name: puis cliquer sur Finish.
    Il faut ensuite attacher la librairie UIMA au projet : Project → Properties → Java Build Path → LibrariesAdd External JARs… ; sélectionner le fichier uima-core.jar dans le répertoire apache-uima/lib.
  2. Définir un type dans le schéma d’annotation
    Le schéma d’annotation commun (Common Analysis Structure ou CAS dans UIMA) encapsule toutes les annotations concernant le document analysé ainsi que le document lui-même. Nous aurons besoin du type Token dans cette structure, nous allons donc le déclarer dans un système de types : File → New → Others → UIMA → Type System Descriptor File ; préciser le nom dans le champs File name: puis Finish.
    Faire ensuite un clic droit sur le fichier .xml ainsi créé puis Open With → Component Descriptor Editor. Dans l’onglet Type System cliquer sur Add Type et saisir le nom dans le champs Type Name: (ex : Token) et préciser uima.tacs.Annotation dans le champs Supertype:.
    L’action d’enregistrer vos modifications doit générer automatiquement les fichiers associés (ex : Token_Type.java et Token.java).
  3. Développer le code de l’annotateur
    Il faut créer une classe héritant de la classe JTextAnnotator_ImplBase correspondant à l’implémentation par défaut d’un annotateur de données textuelles : File → New → Class ; saisir le nom de la classe dans le champs Name: TokenAnnotator ; préciser la classe org.apache.uima.analysis_component.JCasAnnotator_ImplBase dans le champs Superclass: ; puis cliquer sur Finish.
    Il ne reste plus qu’à écrire le code proprement dit :
    import org.apache.uima.analysis_component.JCasAnnotator_ImplBase;
    import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
    import org.apache.uima.jcas.JCas;
    import java.text.BreakIterator;
    public class TokenAnnotator extends JCasAnnotator_ImplBase {
      public void process(JCas aJCas) throws AnalysisEngineProcessException {
        BreakIterator iterToken = BreakIterator.getWordInstance();
        iterToken.setText(aJCas.getDocumentText());
        int deb = iterToken.first();
        int fin = iterToken.next();
        while (fin != BreakIterator.DONE) {
          Token token = new Token(aJCas);
          token.setBegin(deb);
          token.setEnd(fin);
          token.addToIndexes();
          deb = fin;
          fin = iterToken.next();
        }
      }
    }

    Le code ci-dessus passe par l’interface Java JCas pour injecter les annotations dans le CAS. Le recours à cette interface n’est pas indispensable.
  4. Descripteur du composant d’annotation (Analysis Engine Descriptor)
    L’architecture UIMA impose qu’un annotateur soit décrit par un fichier XML appelé Analysis Engine Descriptor : File → New → Others → UIMA → Analysis Engine Descriptor File ; préciser le nom dans le champs File name: puis Finish.
    Faire ensuite un clic droit sur le fichier .xml ainsi créé puis Open With → Component Descriptor Editor. Indiquer le fichier java implémentant l’annotateur dans le champs Name of the java class file de l’onglet Overview.
    Dans l’onglet Type System, il faut énumérer les types que l’annotateur utilise. Cliquer d’abord sur Set DataPath dans la colonne Imported Type Systems pour indiquer le chemin du fichier XML contenant schéma d’annotation commun (Type System Descriptor). Dans la même colonne, cliquer ensuite sur Add… pour sélectionner ce fichier.
    Enfin, dans l’onglet Capabilities, il faut préciser, parmi les types énumérés dans l’onglet Type System, lesquels sont utilisés et s’ils le sont en entrée ou en sortie. Cliquer sur Add Type, sélectionner la ligne correspondant à votre token et préciser que le type est utilisé en sortie uniquement (Out) puis valider (Ok).
  5. Exécuter le Document Analyzer pour tester le composant d’annotation
    Il faut commencer par mettre à jour la variable d’environnement CLASSPATH pour y ajouter le chemin vers votre répertoire bin. Dans un shell, saisir :
    > export CLASSPATH=$CLASSPATH:chemin/vers/votre/bin
    Vous pouvez alors exécuter le script documentAnalyzer.sh qui vous permettra de tester votre composant d’annotation.
  6. Exécuter sous Eclipse le Document Analyzer pour tester le composant d’annotation
    Commencer par importer le projet exemple d’UIMA : File → Import… → General → Existing Project into Workspace → Next ; puis dans Select root directory sélectionner le répertoire racine d’UIMA ; puis Finish.
    Si ce n’est pas déjà fait, il faut ajouter votre projet dans le ClassPath de la configuration du Document Analyzer : Run → Run Configurations… → UIMA Document Analyzer → Onglet ClassPath
    Il est maintenant possible d’exécuter directement le CPE GUI pour tester le composant : Run → Run Configurations… → UIMA Document Analyzer → Run
  7. Tester le composant d’annotation avec le Document Analyzer

    Il faut remplir les champs du Document Analyzer de la manière suivante :
    • Imput Directory: UIMA_HOME/examples/data
    • Output Directory: UIMA_HOME/examples/data/processed
    • Location of Analysis Engine XML Descriptor: chemin/du/descripteur/de/composant
    Puis cliquer sur Run.

Tutoriel et guide du développeur UIMA (puis cliquer sur Tutorials and Users’ Guides)
Sommaire UIMA sur ce blog
Publié dans UIMA, TALN, Eclipse | Tagué , , , , | Laisser un commentaire