Archives du tag : CAS

Tutoriel UIMA I (variante) : code de l’annotateur utilisant directement le CAS plutôt que le JCas

La partie 3. Développer le code de l’annotateur du Tutoriel UIMA I : création d’un composant d’annotation propose le code Java d’un annotateur utilisant l’interface Java JCas du CAS pour injecter les annotations dans le CAS. Voici le code réalisant le même travail sans utiliser le JCas :
import org.apache.uima.analysis_component.CasAnnotator_ImplBase;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.cas.CAS;
import org.apache.uima.cas.FeatureStructure;
import org.apache.uima.cas.Type;
import java.text.BreakIterator;
public class TokenCASAnnotator extends CasAnnotator_ImplBase {
  public void process(CAS aCAS) throws AnalysisEngineProcessException {
    BreakIterator iterToken = BreakIterator.getWordInstance();
    iterToken.setText(aCAS.getDocumentText());
    int deb = iterToken.first();
    int fin = iterToken.next();
    while (fin != BreakIterator.DONE) {
      Type TokenCAS = aCAS.getTypeSystem().getType("Token");
      FeatureStructure fs = aCAS.createAnnotation(TokenCAS, deb, fin);v       aCAS.getIndexRepository().addFS(fs);
      deb = fin;
      fin = iterToken.next();
    }
  }
}
Publié dans UIMA, TALN | Tagué , | Laisser un commentaire

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

Tutoriel UIMA V : Parcourir des annotations en utilisant le CAS

Le CAS maintient un index pour chacun des types d’annotations. Il est possible de récupérer un iterateur permettant de parcourir les annotations d’un type donné sans utiliser les classes Java automatiquement créées par JCasGen (comme dans le Tutoriel UIMA IV). Ce tutoriel montre comment parcourir, en utilisant le CAS (plutôt que le JCas), les annotations du Tutoriel UIMA I (Token) pour afficher dans la console le texte qu’elles annotent.
  1. Il faut commencer par créer un nouveau descripteur de composant : File → New → Others → UIMA → Analysis Engine Descriptor File (cf. Tutoriel UIMA I).
  2. Il faut ensuite développer le code de l’annotateur associé en créant une classe héritant de la classe JTextAnnotator_ImplBase (cf. Tutoriel UIMA I), puis écrire le code proprement dit :
    import org.apache.uima.analysis_component.CasAnnotator_ImplBase;
    import org.apache.uima.cas.CAS;
    import org.apache.uima.cas.FSIndex;
    import org.apache.uima.cas.Type;
    import org.apache.uima.cas.FSIterator;
    import org.apache.uima.cas.text.AnnotationFS;
    public class ParcoursCasAnnotator extends CasAnnotator_ImplBase {
      public void process(CAS aCAS) {
        Type TokenCAS = aCAS.getTypeSystem().getType("Token");
        FSIndex tokenIndex = aCAS.getAnnotationIndex(TokenCAS);
        FSIterator tokenIter = tokenIndex.iterator();
        while (tokenIter.isValid()) {
          AnnotationFS annot = (AnnotationFS) tokenIter.get();
          System.out.println(annot.getCoveredText());
          tokenIter.moveToNext();
        }
      }
    }
  3. Il faut enfin créer le composant d’annotation agrégé (Tokenisation du Tutoriel UIMA I + parcours des annotations de ce tutoriel) comme décrit dans le Tutoriel UIMA III, puis tester ce composant d’annotation agrégé (Aggregate Analysis Engine Descriptor) en utilisant le Document Analyzer comme décrit à la fin du Tutoriel UIMA I.
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

Descripteur XML de composant (Component Descriptors)

Les composants UIMA sont composés de deux parties distinctes :

  1. une partie déclarative (le descripteur de composant)
  2. un code (en Java par exemple)

La partie déclarative est représentée dans un fichier XML et est appelée descripteur de composant (Component Descriptor). Le descripteur de composant contient des méta-données qui décrivent le composant. C'est le moyen qu'UIMA utilise pour mettre en œuvre les mécanismes de découverte, de réutilisation et de composition de composants.

Le descripteur de composant permet de renseigner, entre autres, les informations suivantes :

  • nom, version, auteur, description et surtout le nom de la classe implémentant le composant (onglet Overview)
  • Système de types utilisé (onglet Type System)
  • Types utilisés (i.e. requis) dans le CAS par le composant (onglet Capabilities)
  • Types renseignés dans le CAS par le composant (onglet Capabilities)

Sous Eclipse, un tel descripteur peut être édité avec le Component Descriptor Editor.

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

UIMA : Le système de types (Type System ou TS)

Pour composer un CAS, UIMA propose quelques types de base et permet de les étendre grâce au concept de système de types (Type System ou TS). Un système de types est une hiérarchie de types qui défini l’ensemble des types qu’il est possible d’utiliser dans le CAS.

Chaque composant UIMA (i.e. chaque Analysis Engines) défini son propre système de types. Pour assurer la cohérence d’une chaîne d’annotation UIMA, il est préférable que chacun des systèmes de types des composants de la chaîne soit un sous-ensemble d’un système de types plus général décrivant tous les types d’annotations que la chaîne peut produire.

Un système de types est décrit dans un fichier XML qui peut être édité sous Eclipse par le Component Descriptor Editor :

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

UIMA : Le schéma d’annotation commun (Common Analysis Structure ou CAS)

Le schéma d’annotation commun (Common Analysis Structure ou CAS) est une notion centrale dans UIMA. Le CAS encapsule toutes les annotations concernant le document analysé ainsi que le document lui-même. Un CAS comporte deux types d’éléments :
  1. Le documents, appelé Sofa pour Subject of Analysis dans UIMA.
  2. Des annotations générées par des composants d’annotation.

Le CAS est une structure orientée objets permettant aux différents composants d’une chaîne d’annotation UIMA de représenter et d’échanger leurs annotations respectives. UIMA propose quelques types de base et permet de les étendre grâce au concept de système de types (Type System).

L’interface Java permettant de manipuler le CAS depuis du code Java se nomme JCas (cf. Tutoriel IV), mais le CAS reste tout de même accessible en Java sans passer par cette interface (cf. Tutoriel V).

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