
SDK Java pour construire des pipelines d'analyse qui traitent et enrichissent des données textuelles non structurées avec des annotations, des systèmes de types et des moteurs d'analyse modulaires.
[Apache UIMA][UIMA] vous aide à gérer les données non structurées (comme les textes) qui sont enrichies d'informations utiles. Par exemple, si vous souhaitez identifier une mention d'une entité dans un texte ou éventuellement lier cette entité à un jeu de données de référence, Apache UIMA fournit :
Notez que le SDK Java Apache UIMA fournit uniquement un cadre pour la construction d'analytiques, mais ne fournit aucune analytique en soi. Cependant, divers tiers s'appuient sur Apache UIMA et proposent des collections de composants d'analyse ou des solutions prêtes à l'emploi.
Apache UIMA v3.6.0 et versions ultérieures nécessite Java 17 ou version ultérieure.
L'exécution du plugin Eclipse pour UIMA nécessite de démarrer Eclipse 4.25 (2022-09) ou ultérieur avec Java 17 ou version ultérieure.
L'exécution de l'outil de migration sur les fichiers de classe nécessite l'utilisation d'un JDK Java, pas d'un JRE Java.
Les plateformes prises en charge sont : Windows, Linux et macOS. D'autres implémentations de la plateforme Java devraient fonctionner mais n'ont pas été testées de manière significative.
La plupart des scripts du répertoire /bin invoquent Java. Ils utilisent la valeur de la variable d'environnement JAVA_HOME pour localiser le Java à utiliser ; si elle n'est pas définie, ils invoquent java en s'attendant à trouver un Java approprié dans votre variable PATH.
Vous pouvez facilement ajouter le SDK Java Apache UIMA à votre projet dans la plupart des outils de construction en l'important depuis [Maven Central][MAVEN-CENTRAL]. Par exemple, si vous utilisez Maven, vous pouvez ajouter la dépendance suivante à votre projet :
<dependency>
<groupId>org.apache.uima</groupId>
<artifactId>uimaj-core</artifactId>
<version>3.6.0</version>
</dependency>
Ensuite, nous donnons quelques brefs exemples d'utilisation du SDK Java Apache UIMA et de la bibliothèque Apache uimaFIT. Apache uimaFIT est une dépendance distincte que vous pouvez ajouter :
<dependency>
<groupId>org.apache.uima</groupId>
<artifactId>uimafit-core</artifactId>
<version>3.6.0</version>
</dependency>
Le système de types définit le type d'informations que nous souhaitons attacher aux informations non structurées (ici un document texte). Dans notre exemple, nous voulons identifier les mentions d'entités, nous définissons donc un type my.Entity avec une caractéristique category qui peut être utilisée pour stocker la catégorie à laquelle appartient l'entité.
Pour illustrer les informations qu'UIMA maintient en interne sur le schéma d'annotation, nous écrivons le schéma généré au format XML à l'écran.
String TYPE_NAME_ENTITY = "my.Entity";
String TYPE_NAME_TOKEN = "my.Token";
String FEAT_NAME_CATEGORY = "category";
var tsd = UIMAFramework.getResourceSpecifierFactory().createTypeSystemDescription();
tsd.addType(TYPE_NAME_TOKEN, "", CAS.TYPE_NAME_ANNOTATION);
var entityTypeDesc = tsd.addType(TYPE_NAME_ENTITY, "", CAS.TYPE_NAME_ANNOTATION);
entityTypeDesc.addFeature(FEAT_NAME_CATEGORY, "", CAS.TYPE_NAME_STRING);
tsd.toXML(System.out);
Maintenant, nous créons un objet Common Analysis Structure (CAS) dans lequel nous stockons le texte que nous souhaitons analyser.
Encore une fois, pour illustrer les informations qu'UIMA stocke en interne dans l'objet CAS, nous écrivons une représentation XML de l'objet à l'écran.
var cas = CasFactory.createCas(tsd);
cas.setDocumentText("Welcome to Apache UIMA.");
cas.setDocumentLanguage("en");
CasIOUtils.save(cas, System.out, SerialFormat.XMI_PRETTY);
Maintenant, nous créons une annotation de type my.Entity pour identifier la mention de Apache UIMA dans le texte d'exemple.
Enfin, nous parcourons toutes les annotations dans la CAS et les affichons à l'écran. Cela inclut la DocumentAnnotation par défaut qui est toujours créée par UIMA ainsi que l'annotation my.Entity que nous avons créée nous-mêmes.
var entityType = cas.getTypeSystem().getType(TYPE_NAME_ENTITY);
var entity = cas.createAnnotation(entityType, 11, 22);
cas.addFsToIndexes(entity);
for (var anno : cas.<Annotation>select(entityType)) {
System.out.printf("%s: [%s]%n", anno.getType().getName(), anno.getCoveredText());
}
Afin d'organiser différents types d'analyse en étapes, nous les regroupons généralement dans des moteurs d'analyse individuels. Nous illustrons maintenant comment de tels composants peuvent être construits et comment ils peuvent être exécutés en tant que pipeline d'analyse.
class TokenAnnotator extends CasAnnotator_ImplBase {
public void process(CAS cas) throws AnalysisEngineProcessException {
var tokenType = cas.getTypeSystem().getType(TYPE_NAME_TOKEN);
var bi = BreakIterator.getWordInstance();
bi.setText(cas.getDocumentText());
int begin = bi.first();
int end;
for (end = bi.next(); end != BreakIterator.DONE; end = bi.next()) {
var token = cas.createAnnotation(tokenType, begin, end);
cas.addFsToIndexes(token);
begin = end;
}
}
}
class EntityAnnotator extends CasAnnotator_ImplBase {
public void process(CAS cas) throws AnalysisEngineProcessException {
var tokenType = cas.getTypeSystem().getType(TYPE_NAME_TOKEN);
var entityType = cas.getTypeSystem().getType(TYPE_NAME_ENTITY);
for (var token : cas.<Annotation>select(tokenType)) {
if (Character.isUpperCase(token.getCoveredText().charAt(0))) {
var entity = cas.createAnnotation(entityType, token.getBegin(), token.getEnd());
cas.addFsToIndexes(entity);
}
}
}
}
cas = CasFactory.createCas(tsd);
cas.setDocumentText("John likes Apache UIMA.");
cas.setDocumentLanguage("en");
var pipeline = AnalysisEngineFactory.createEngineDescription(
AnalysisEngineFactory.createEngineDescription(TokenAnnotator.class),
AnalysisEngineFactory.createEngineDescription(EntityAnnotator.class));
SimplePipeline.runPipeline(cas, pipeline);
for (var anno : cas.<Annotation>select(entityType)) {
System.out.printf("%s: [%s]%n", anno.getType().getName(), anno.getCoveredText());
}