Análisis de texto en InfoSphere Warehouse, Parte 3: Desarrollar e integrar motores de análisis de texto UIMA personalizados

Obtenga conocimientos de negocios a partir de datos no estructurados

En los dos primeros artículos de la serie, conoció las capacidades de análisis de texto de IBM®InfoSphere®Warehouse, cómo usar expresiones comunes y diccionarios para extraer información a partir de texto, y cómo publicar los resultados mediante un informe Cognos. El presente artículo describe cómo usar el marco Unstructured Information Management Architecture (UIMA) para crear un anotador de texto personalizado y usarlo en InfoSphere Warehouse. La capacidad de InfoSphere Warehouse para usar anotadores basados en UIMA en flujos analíticos es una característica poderosa. Se pueden escribir anotadores personalizados que pueden extraer casi toda la información a partir de texto. Además, se pueden usar anotadores basados en UIMA provistos por IBM, otras compañías y muchas universidades. Por ejemplo, se pueden encontrar anotadores UIMA que acortan palabras y extraen conceptos, como personas o sentimientos.

Stefan Abraham, Software Engineer, WSO2 Inc

Stefan Abraham photographStefan Abraham es Software Engineer en el IBM Research & Development Lab en Boeblingen, Alemania. Trabaja en componentes de análisis de textos y en componentes de interfaz de usuario relacionados con minería de datos en InfoSphere Warehouse.



Simone Daum, Software Engineer, WSO2 Inc

Simone Daum photoSimone Daum es Software Engineer en el IBM Research & Development Lab en Boeblingen, Alemania. Trabaja en herramientas de preparación de datos para minería de datos y en análisis de textos en InfoSphere Warehouse.



Benjamin G. Leonhardi, Software Engineer, WSO2 Inc

Author Photo: Benjamin LeonhardiBenjamin Leonhardi es Software Engineer para minería de datos en InfoSphere Warehouse en el IBM Research & Development Lab en Boeblingen, Alemania. Trabaja en visualización de minería, minería de textos y soluciones de información de minería.



27-08-2009

Introducción

Como se describe en los artículos anteriores de esta serie, InfoSphere Warehouse brinda herramientas para el análisis de texto basado en expresiones comunes y diccionarios. Probablemente, éstos sean los dos enfoques más comunes para extraer información a partir de texto, pero en muchos casos estos dos enfoques no alcanzan.

El análisis de texto de InfoSphere Warehouse se genera en el marco UIMA, un marco abierto que permite el desarrollo de aplicaciones analíticas extensibles. UIMA soporta el desarrollo de aplicaciones analíticas de diversos módulos. Por ejemplo, un módulo podría extraer o anotar una persona a partir de texto, en tanto otro trata de encontrar relaciones entre tales anotaciones. La conexión, los datos de entrada y de salida los define UIMA mediante un sistema de tipo jerárquico. El marco UIMA está disponible en diferentes lenguajes de programación, dentro de los cuales Java®es el más usado comúnmente. Con InfoSphere Warehouse, usted puede importar Java Analysis Engines (motores de análisis) basados en UIMA para ampliar considerablemente sus capacidades de análisis de texto. Estos anotadores personalizados se pueden usar en flujos analíticos con el operador TextAnalyzer. Al igual que los operadores Dictionary y Regular Expression, las entidades encontradas se mapean con columnas de tablas de bases de datos y luego se pueden procesar y usar como cualquier otra información estructurada.

Este artículo describe los conceptos básicos del marco UIMA y le brinda la información teórica y práctica necesaria para crear su propio motor de análisis UIMA y usarlo en InfoSphere Warehouse. Ello incluye una explicación de cómo configurar el entorno de desarrollo del marco UIMA basado en Eclipse y de cómo escribir su propio sistema de tipo simple y descripción de anotador como interfaces del motor de análisis. Por lo tanto, este artículo muestra cómo escribir el código Java que realiza el análisis real de los documentos. Una vez finalizado el desarrollo, conocerá cómo exportar su código como archivo Processing Engine ARchive (PEAR), un estándar UIMA para empaquetar e implementar anotadores. Por último, el artículo explica cómo importar el archivo PEAR a InfoSphere Warehouse y usarlo en un flujo analítico para extraer información a partir de texto. Este ciclo completo se explica mediante un simple ejemplo que analiza texto y devuelve todas las palabras que contienen cinco vocales o más.

Escribir anotadores personalizados es una manera útil de resolver un problema de negocios específico. Asimismo, la página principal de Apache UIMA y algunas universidades tienen repositorios de motores de análisis disponibles en forma gratuita que ofrecen soluciones existentes que se pueden usar en InfoSphere Warehouse. También hay muchas compañías que venden soluciones existentes. De manera que al usar el enfoque estándar abierto de UIMA, usted tiene la ventaja de poder potenciar el trabajo que otros hayan hecho para resolver problemas similares.

Algunas de las áreas activas y más interesantes en relación con el análisis de texto son la investigación científica y la detección de emociones. En materia de detección de emociones, el motor de análisis trata de determinar qué tan positivo o negativo se siente alguien acerca de algún producto o servicio determinado. Un ejemplo práctico de detección de emociones sería monitorear foros, blogs y revisar sitios Web después del lanzamiento de un producto para determinar la reacción del público. También se pueden monitorear recursos similares para medir de qué manera una nueva campaña de marketing cambió la opinión de la gente acerca de un producto. Si bien estos tipos de aplicaciones son muy interesantes, representan sólo un subconjunto de los motores de análisis disponibles que pueden usarse en InfoSphere Warehouse para extraer información a partir de datos no estructurados de su almacén de datos.


Conceptos UIMA

Como se describe en la sección anterior, InfoSphere Warehousing ofrece características de análisis de texto basadas en Unstructured Information Management Architecture (UIMA). Se pueden usar funciones de análisis de texto incorporadas, principalmente extracción de entidades nombradas basadas en expresiones comunes y diccionarios, según se explicó en los artículos anteriores de esta serie. También se pueden usar componentes de análisis de texto compatibles con Apache UIMA personalizados para implementar soluciones de análisis de texto más avanzadas. Los componentes están disponibles a través de IBM service engagements (contratos de servicios), IBM Research, otras compañías y universidades. También los puede crear usted mismo usando UIMA SDK.

¿Qué es UIMA?

UIMA es una arquitectura de componentes y una implementación de marco de software para el análisis de contenido no estructurado, como texto, video y audio. El objetivo de este marco es tener una plataforma común para análisis no estructurado que pueda proporcionar componentes de análisis reutilizables que reduzcan la duplicación de los esfuerzos de desarrollo.

La arquitectura de UIMA le permite conectar componentes de análisis personalizados y combinarlos con otros. Sus aplicaciones UIMA no necesitan conocer los detalles de cómo trabajan los componentes de análisis en forma conjunta para crear los resultados. Las tareas de integrar e instrumentar los diversos componentes de análisis las administra el marco UIMA.

Una aplicación UIMA puede analizar texto plano e identificar entidades, como personas, lugares y organizaciones, o puede identificar relaciones, como “trabaja para” o “ubicado en”. Las aplicaciones, por lo general, se descomponen en componentes. Por ejemplo "language identification" => "language specific segmentation" => "sentence boundary detection" => "entity detection (nombres de personas/lugares, etc.)".

Tal vez haya dependencias entre componentes. Por ejemplo, se debe realizar una “language specific segmentation” (segmentación específica de lenguaje) antes de iniciar la “sentence boundary detection” (detección de límites de oración) para este lenguaje. Cada componente es independiente y se puede combinar con otros componentes. Cada componente, escrito en Java o C++, implementa interfaces definidas por el marco y brinda metadatos autodescriptivos a través de archivos descriptores XML. El marco UIMA administra los componentes y el flujo de datos entre ellos.

Motores de análisis, anotadores y Estructura de Análisis Común (CAS)

Motores de análisis son los bloques de creación centrales en UIMA. Un motor de análisis contiene uno o más anotadores u otros motores de análisis. Cada anotador implementa una función de análisis de texto específica. Este empaquetamiento recurrente le permite construir motores de análisis complejos a partir de motores simples. Cada anotador almacena sus resultados en estructuras de características tipificadas, que son sencillamente estructuras de datos que tienen un tipo y un conjunto de pares (atributo, valor).

Unaanotaciónes un tipo particular de estructura de característica que se adjunta a una región del artefacto que se analiza. Por ejemplo, las anotaciones pueden adjuntarse a un tramo de texto en un documento. En este caso, las anotaciones contienen una posición inicial y una posición final específicas dentro del documento. Esto significa que se prestan con facilidad a la especificación de los resultados de extracción de información. Por ejemplo, en el siguiente texto una anotación Company abarcaría las posiciones 19 a 21:

UIMA comenzó como una iniciativa de IBM, pero pasó a ser de código abierto en 2008

Todas las estructuras de características, entre ellas, las anotaciones, se representan en la Estructura de Análisis Común (CAS) de UIMA, que es la estructura de datos principal a través de la cual se comunican todos los componentes UIMA.

La figura 1 muestra un motor de análisis que contiene anotadores para reconocimiento de entidades nombradas, análisis gramatical y detección de relaciones. Observe que el Relationship Annotator puede detectar relaciones sin considerar el texto del documento real, pero analizando conceptos y anotaciones gramaticales existentes en la Estructura de Análisis Común.

Figura 1. Motor de análisis de texto que contiene anotadores para análisis gramatical, detección de entidades nombradas y detección de relaciones.
Mapping shows how annotators combine in a text analysis engine to extract CeoOf relationship from a string of text

El sistema de tipo UIMA

El sistema de tipo UIMA define los diversos tipos de objetos que pueden encontrarse en los documentos y que pueden extraerse mediante motores de análisis. Por ejemplo, Person podría ser un tipo.

Entre los tipos se encuentran las características. Por ejemplo, Age y Occupation podrían definirse como características del tipo de Person. Otros ejemplos de tipos podrían ser Organization, Company, Money, Product o NounPhrase.

Los sistemas de tipos son específicos de cada dominio y de cada aplicación. Los tipos se pueden organizar en taxonomías. Por ejemplo, Company podría definirse como un subtipo de Organization, o NounPhrase podría ser un subtipo de ParseNode.

Un tipo general y común que se usa generalmente en el análisis de texto para deducir tipos adicionales es el tipo Annotation, suministrado por el marco UIMA. Se puede usar el tipo Annotation para etiquetar regiones en los documentos. El tipo Annotation abarca las características Begin y End. Los valores de estas características delimitan un tramo. Por ejemplo, en la siguiente cadena de texto (la misma cadena que se analiza en la figura 1), la anotación Person comienza en la posición 0 y finaliza en la posición 10:

Fred Center es el CEO de Center Micros

El primer paso para desarrollar un anotador es definir los tipos de CAS Feature Structure (estructura de características CAS) sobre los que trabaja. Esto se realiza en un archivo XML llamado Type System Descriptor. UIMA define los tipos incorporadosTOP, que son la raíz del sistema de tipos (análogo a Object en Java),Annotation, que se describe precedentemente y otros. UIMA también define tipos de rango básicos para características comoBoolean,IntegeryDouble, al igual que matrices de estos tipos primitivos.

Archivos Processing Engine ARchives (PEAR)

Una vez que haya desarrollado y probado con éxito un motor de análisis, podrá empaquetarlo para su implantación en otra aplicación como componente de análisis (de texto) preconfigurado. El formato de empaquetamiento de anotador en UIMA se denomina PEAR, que significa Processing Engine Archive (archivo de motor de procesamiento). El formato PEAR contiene toda la información necesaria para ejecutar el componente de anotador ajustado. Para conocer más detalles acerca del formato de empaquetamiento PEAR, consulte el Capítulo PEAR Reference de la documentación de referencia de UIMA.

Usando el operador Text Analyzer en InfoSphere Warehouse Design Studio, podrá importar cualquier motor de análisis de texto compatible con Apache UIMA para anotar conceptos en un texto no estructurado. Use el asistente Analysis Engine Import (Importar motor de análisis) para importar estos archivos PEAR preconfigurados. Si se creó un motor de análisis usando una versión UIMA anterior, como IBM UIMA, deberá migrarse primero tal motor. El proceso de migración se describe en la próxima sección.


UIMA e InfoSphere Warehouse

Como se mencionó en las secciones anteriores, pueden importarse motores de análisis UIMA preconfigurados (archivos PEAR) a InfoSphere Warehouse. Esto le permite ampliar las capacidades de análisis de texto de InfoSphere Warehouse para satisfacer sus requisitos específicos.

Esta sección presenta información general sobre cómo se representan en la base de datos los resultados del análisis de texto generados por los motores de análisis. También explica de qué manera puede usarse InfoSphere Warehouse para importar y ejecutar motores de análisis de texto creados con versiones anteriores de UIMA.

Mapeo de los resultados del análisis con columnas en la base de datos

En InfoSphere Warehouse, el análisis de datos no estructurados exige que los datos existan en la base de datos como una columna con un tipo de dato de carácter (CHAR, VARCHAR o CLOB). UIMA administra el contenido de columna de texto determinado de cada fila de tabla como un documento de texto.

Los resultados de análisis generados, derivados del tipo de Annotation, se almacenan en la CAS. Se usa un CAS Consumer para escribir los contenidos de los resultados seleccionados en la base de datos usando JDBC. Cada característica seleccionada genera una nueva columna.

A fin de especificar cuáles son los resultados de análisis que deben escribirse en la base de datos, se configuran las propiedades del operador Text Analyzer, o más precisamente, la pestaña Analysis Results (Resultados de análisis). Use esta pestaña para especificar qué tipo de anotación contiene el resultado del análisis (por ejemplo, el tipo Company).

Como se describió anteriormente, cada anotación comprende características incorporadas, como Begin y End, y también puede tener características personalizadas, como Full_Legal_Name o CEOpara el tipo Company. El tipo de anotación seleccionado especifica los resultados que son de su interés, y las características seleccionadas de este tipo de anotación especifican la parte detallada de interés. Cada característica genera una columna en la base de datos.

La tabla de base de datos resultante no necesita contener columnas creadas sólo a partir del análisis, también puede contener columnas de las tablas de datos de entrada. Esto le permitiría, por ejemplo, relacionar posteriormente los resultados con el texto original.

Este proceso se resume en la figura 2. Como se describe en la figura, el CAS Consumer se configura en la pestaña Analysis Result del operador Text Analyzer para escribir el contenido de Begin, End, y características Full_Legal_Name en la tabla resultante.

Figura 2. Flujo UIMA para analizar una columna de texto y escribir los resultados del análisis en una tabla
UIMA flow showing that analysis of sample text string results in International Business Machines being written as Full_Legal_Name in the resulting table.

Pueden ocurrir posibles problemas que no son fáciles de identificar si los resultados del anotador UIMA son mayores que la columna de resultado con la cual se mapean. Por ejemplo, si la columna tiene un tipo de VARCHAR(256), los resultados que superan los 256 caracteres generan un flujo erróneo y un error SQL. Un modo sencillo de identificar este problema es usar provisoriamente tipos CLOB, que no tienen restricciones de tamaño, como las columnas de destino. Si esto resuelve el problema, su anotador tal vez devuelva valores inesperadamente extensos. Quizá sea útil determinar en el código de anotador que no podrá excederse una longitud específica en las anotaciones creadas. Ocurrirá otro problema si no hay un espacio de tabla DB2 de determinada longitud disponible.

Migración de motores de análisis basados en IBM UIMA a Apache

La versión InfoSphere Warehouse V9.5.1 y las posteriores no soportan componentes de análisis de texto empaquetados basados en IBM UIMA. Sin embargo, podrán usarse tales componentes en esas versiones siguiendo uno de los procedimientos descriptos a continuación:

  • Use la herramienta de conversión IBM UIMA a Apache UIMA para migrar el código fuente de los archivos PEAR. Para más información, vea la sección Migración de IBM UIMA a Apache UIMA en el sitio Web de UIMA.
  • Use el IBM UIMA Adapter Wrapper para Apache UIMA para ejecutar su archivo PEAR basado en IBM UIMA en un entorno de tiempo de ejecución basado en Apache UIMA. Puede usar el paquete IBM UIMA Adapter para anotadores basados en IBM UIMA cuando no esté disponible el código fuente que pueda transformar con la herramienta de conversión IBM UIMA a Apache UIMA. Para procesar estos anotadores IBM UIMA, use el paquete IBM UIMA Adapter en el nuevo tiempo de ejecución Apache UIMA. Para más información, visite la Página de UIMA en alphaWorks.

Identificación de problemas en un anotador conmutando el inicio de sesión UIMA en InfoSphere Warehouse

InfoSphere Warehouse reenvía mensajes de error que ocurren en su código de anotador hacia el seguimiento del flujo analítico. Si se activa el seguimiento de contenidos para un proceso, un flujo de datos o un flujo de minería, los registros de nivel CONFIG de UIMA y superiores se rutean hacia el registro de InfoSphere Warehousing.

En algunas ocasiones tal vez sea necesario depurar los problemas de su anotador recuperando los mensajes de registro UIMA de un nivel más preciso. Esto comprende todos los problemas que ocurren en el código UIMA de su anotador y los problemas que ocurren en el código de anotador de un anotador personalizado. Vea la documentación InfoSphereWarehouse para conocer instrucciones sobre cómo ver los registros UIMA de un flujo de datos o minería y cómo cambiar el nivel de seguimiento UIMA para obtener mayor información.


Un ejemplo de cómo crear un motor de análisis UIMA e integrarlo en InfoSphere Warehouse Design Studio

Este ejemplo muestra de qué manera escribir un simple motor de análisis UIMA usando el SDK UIMA y luego integrarlo en un flujo de análisis de texto en InfoSphere Warehouse Design Studio. El motor de análisis separa el texto del documento en palabras (previendo texto separado por espacios en blanco) y crea una anotación para todas las palabras que contengan más de cuatro vocales. Si bien no hay casos de uso de negocios para semejante motor de análisis, ofrece una manera sencilla de demostrar lo fácil que resulta crear un motor de análisis UIMA.

El ejemplo usa las Eclipse Tooling para UIMA, suministradas en Apache.org, para crear el motor de análisis. Se optó por esta opción porque brinda herramientas y editores de fácil utilización para el desarrollo de motores de análisis.

Una vez que está listo el motor de análisis, se lo empaqueta como archivo PEAR, que es el formato que InfoSphere Warehouse espera para la importación del motor de análisis. Luego se importa el motor de análisis en Design Studio y se crea un flujo usándolo en documentos de texto de muestra ubicados en la tabla de la base de datos. Para estos documentos de texto de muestra, se usa la tabla CIA.FACTBOOKS de la base de datos DWESAMP que se envía con InfoSphere Warehouse.

Instalación de UIMA

Para instalar UIMA, descargue el UIMA Java Framework & SDK (versión 2.2.2) de la página de descarga UIMA y descárguelo a su sistema de archivos. También deberá instalar los complementos UIMA Eclipse que se describen en estas instrucciones paso a paso en la documentación de configuración Apache UIMA y SDK.

Creación y prueba del motor de análisis UIMA

Un motor de análisis UIMA está compuesto por una clase Java para los anotadores contenidos y los archivos XML adicionales. La clase Java amplía una implementación de anotadores básicos provistos por el UIMA SDK. Los archivos XML adicionales describen los tipos de anotaciones que se crean (o consumen) mediante el anotador junto con otra información adicional. Los complementos UIMA Eclipse simplifican la creación de los archivos XML. Aplique los siguientes pasos para crear un motor de análisis en su entorno Eclipse.

Crear un proyecto Java de naturaleza UIMA

  1. En su entorno Eclipse, seleccione File (Archivo) -> New (Nuevo) -> JavaProject.
  2. Ingrese un nombre de proyecto. Por ejemplo, com.ibm.developerworks.textanalysis.partIII.
  3. A continuación, agregue la naturaleza UIMA al proyecto. Esto genera una estructura de carpeta específica para el proyecto y permite realizar otras acciones sobre ella. Para agregar la naturaleza, haga clic sobre el proyecto con el botón derecho y seleccione Add UIMA Nature (Agregar naturaleza UIMA). En los siguientes pasos, sólo se utilizará la carpeta de descripción (desc) que se cree.
  4. Por último, debe agregar las bibliotecas UIMA Java a la ruta de acceso del proyecto. Para hacerlo, haga clic sobre el proyecto con el botón derecho y seleccione Build Path (Ruta de acceso) -> Add External Archives (Agregar archivos externos). Incluya todos los archivos jar de la carpeta lib de su paquete UIMA extraído.

Creación del sistema de tipos

El sistema de tipos contiene información sobre tipos de anotaciones y sus características. El anotador de muestra que usted está construyendo, crea anotaciones para palabras con una cantidad mínima de vocales, por lo tanto el sistema de tipos debería contener un tipo VowelCountAnnotation. Una característica de este tipo debería ser la cantidad de vocales que contiene la palabra.

Para crear el sistema de tipos, siga estos pasos:

  1. Haga clic con el botón derecho en la carpeta de descripción (desc) de su proyecto y seleccione New -> Other (Otro)....
  2. Seleccione UIMA -> Type System Descriptor File (Archivo descriptor del sistema de tipos) e ingrese VowelCountTypeSystem.xml como nombre de archivo.
  3. Vaya a la pestaña Type System (Sistema de tipos) en el extremo inferior del editor.
  4. Haga clic en Add Type (Agregar tipo) e ingrese com.ibm.developerworks.VowelCountAnnotation como nombre del tipo. Este tipo se hereda del tipo de Annotation.
  5. Seleccione el tipo VowelCountAnnotation y haga clic en Add (Agregar)... para agregar la característica correspondiente a la cantidad de vocales. Ingrese numberVowels como nombre de la característica.
  6. Haga clic en Browse (Navegar) y seleccione uima.cas.Integer como el tipo de rango para la característica. La Figura 3 muestra el sistema de tipos completo.
    Figura 3. Sistema de tipos
    Screen shot of the Types (or Classes) section with tree showing numberVowels feature under VowelCountAnnotation type.
  7. Guarde el sistema de tipos. Observe que el marco UIMA ya ha generado las clases JavaVowelCountAnnotation_Type.java y VowelCountAnnotation.java en el paquete com.ibm.developerworks de su carpeta de origen. Usted usará estas clases, en el código de anotador, en el paso siguiente. Si las clases Java no están generadas, haga clic en JCasGen en el editor de sistema de tipos.

Implantación de clase Java para el anotador

La implantación del anotador radica en una clase Java que amplía la implantación básica para anotador denominada JCasAnnotator_ImplBase que es suministrada por el marco UIMA.

  1. Haga clic con el botón derecho en el paquete com.ibm.developerworks y seleccione New-> Class (Clase).
  2. Seleccione VowelCounter como nombre de clase y org.apache.uima.analysis_component.JCasAnnotator_ImplBasecomo superclase.
  3. Para este anotador simple, usted sólo necesita sobrescribir el método de process, el cual recibe una clase Java JCAS— para la Estructura de Análisis Común. Este objeto contiene el texto del documento junto con meta información sobre el texto, como lenguaje del documento. También contiene las anotaciones que se crean durante la ejecución del análisis. Por ejemplo, si usted está ejecutando múltiples anotadores en una fila, el anotador puede acceder a las anotaciones que se crearon mediante la ejecución previa de los anotadores. El anotador usado para este ejercicio no lee anotación alguna; sólo crea las anotaciones VowelCountAnnotation.

El Listado 1 contiene el conjunto de códigos completo para la clase VowelCounter. Observe el método de process. Primero lee el texto del documento con getDocumentText(). Luego reemplaza cortes de línea, subrayado y guiones por espacios en blanco. Esto se debe a que el bucle siguiente separa el texto en palabras por espacios en blanco. Un verdadero análisis lingüístico obviamente será más sofisticado, pero a los fines demostrativos este enfoque simple es suficiente.

El método getNumberVowels() cuenta la cantidad de vocales que hay en cada palabra. Si la palabra contiene más de cuatro vocales, se crea una anotación. El código simplemente usa la clase VowelCountAnnotation que se creó automáticamente con el sistema de tipos junto a captadores y establecedores para la característica numberVowels y las características predeterminadas para el Begin y End de la anotación. Por último, annotation.addToIndexes() agrega la anotación al índice de anotaciones de Estructura de Análisis Común.

Listado 1. VowelCounter.java
package com.ibm.developerworks;

import java.util.ArrayList;
import java.util.Collections;
                
import org.apache.uima.analysis_component.JCasAnnotator_ImplBase;
import org.apache.uima.analysis_engine.AnalysisEngineProcessException;
import org.apache.uima.jcas.JCas;
                
public class VowelCounter extends JCasAnnotator_ImplBase {
                
    // the vowels threshold. Words that have more vowels than this will be annotated
    int vowelThreshold = 4;
                
    @Override
    public void process(JCas cas) throws AnalysisEngineProcessException {
       // get document text
       String doc = cas.getDocumentText();
                
       // replace line breaks, underscores and hyphens by blanks
       doc = doc.replaceAll("\n", " ");
       doc = doc.replaceAll("_", " ");
       doc = doc.replaceAll("-", " ");
                
       // iterate over the words and count vowels
       int currentPos = 0;
       while (currentPos < doc.length()) {
          int posNextDelimiter = doc.indexOf(' ', currentPos);
          int end = posNextDelimiter;
          if (posNextDelimiter == -1) {
              end = doc.length();
          }
                
          int numberVowels = getNumberVowels(doc.substring(currentPos, end));
          if (numberVowels > vowelThreshold) {
              this.addAnnotation(currentPos, end, numberVowels, cas);
          }
          currentPos = end + 1;
       }
    }
                
    protected void addAnnotation(int begin, int end, int numberVowels, JCas cas) {
       VowelCountAnnotation annotation = new VowelCountAnnotation(cas);
       annotation.setBegin(begin);
       annotation.setEnd(end);
       annotation.setNumberVowels(numberVowels);
       annotation.addToIndexes();
    }
                
    /**
     * Returns the number of vowels a, e, i, o, u, A, E, I, O, U in the word
     * 
     * @param word
     *           the input word
     * @return the number of vowels in the word
     */
    protected int getNumberVowels(String word) {
    if ((word == null) || (word.length() == 0))
       return 0;
                
    // initialize the list of vowels
    // (this can also be moved to the initialize()-method of the annotator
    // for performance optimization)
    ArrayList<Character> vowels = new ArrayList<Character>();
    Collections.addAll(vowels, 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U');
                
    int numberOfVowels = 0;
    for (int i = 0; i < word.length(); i++) {
       if (vowels.contains(word.charAt(i))) {
          numberOfVowels++;
       }
    }
    return numberOfVowels;
  }
}

Creación del archivo descriptor

Para completar el motor de análisis, se necesita crear un archivo descriptor que vincule la clase Java y el sistema de tipos y que contenga otras opciones de configuración. Para crear el descriptor, siga estos pasos:

  1. Haga clic con el botón derecho en la carpeta de descripción (desc) de su proyecto y seleccione New-> Other (Otro)....
  2. Seleccione UIMA-> Analysis Engine Descriptor File (Archivo descriptor de motor de análisis) e ingrese VowelCounter.xml como nombre de archivo.
  3. Vaya a la pestaña Overview (General) del editor y seleccione al archivo de clase JavaVowelCounter.
  4. En la pestaña Type System (Sistema de tipos) en la sección Imported Type Systems (Sistemas de tipo importado), haga clic en Add para importar su sistema de tipos VowelCountTypeSystem.xml por ubicación.
  5. Para definir qué clase de anotaciones son de salida del anotador, vaya a la pestaña Capabilities (Capacidades) y haga clic en Add Type (Agregar tipo).
  6. En la fila para VowelCountAnnotation, haga clic en la columna Output (Salida) para declarar este tipo de Annotation como el tipo de salida del anotador, según se muestra en la Figura 4.
    Figura 4. La pestaña Capabilities
    Screen shot of the Component Capabilities section with VowelCountAnnotation type selected as Output.
  7. Guarde el archivo descriptor.

Pruebas del anotador

Durante el desarrollo del anotador, quizás usted desee probarlo con algún texto de muestra, puede hacerlo fácilmente con el Document Analyzer (Analizador de documentos) que es suministrado por UIMA JDK. Para ejecutar el analizador, siga estos pasos:

  1. Haga clic con el botón derecho en el proyecto Java y seleccione Run As (Ejecutar como)-> Java Application (Aplicación Java).
  2. Seleccione org.apache.uima.tools.docanalyzer.DocumentAnalyzer como aplicación.
  3. En el diálogo, una Location (Ubicación) del Descriptor XML de motor de análisis con su archivo descriptor VowelCounter.xml y haga clic en Interactive (Interactivo).
  4. Escriba algún texto de muestra en el campo de texto y haga clic en Analyze (Analizar). La Figura 5 muestra un ejemplo de cómo aparecen las anotaciones en el analizador de documentos.
    Figura 5. Anotaciones en el analizador de documentos
    Sample text in the document analyzer. The word warehouse in the sample text is highlighted as a VowelCountAnnotation.

Exportación del motor de análisis

Para usar el motor de análisis en InfoSphere Warehouse Design Studio, siga estos pasos para agruparlo como un archivo PEAR:

  1. Haga clic con el botón derecho en el proyecto Java y seleccione Generate PEAR file (Generar archivo PEAR).
  2. En el asistente, una Component Descriptor (Descriptor de componente) con su archivo descriptor VowelCounter.xml y haga clic en Next (Siguiente) dos veces.
  3. En la página del archivo PEAR, ingrese la ruta en donde debería guardarse el archivo PEAR. Por ejemplo, c:\VowelCounter.pear.
  4. Haga clic en Finish (Finalizar). Ahora el motor de análisis ya está listo para ser importado y usado en Design Studio.

Importación y uso del motor de análisis en InfoSphere Warehouse Design Studio

Usted puede importar motores de análisis que estén en el formato de archivo PEAR a un proyecto de Data Warehousing y usarlo en un flujo de análisis con el operador Text Analyzer (Analizador de textos).

Creación de un proyecto de Data Warehousing en Design Studio

  1. Del menú de Design Studio, seleccione File -> New -> Data Warehouse Project (Proyecto de almacenamiento de datos).
  2. Ingrese un nombre de proyecto en el asistente.
  3. Haga clic en Finish.

Importación del motor de análisis

  1. Haga clic con el botón derecho en la carpeta Analysis Engines (Motores de análisis) (debajo de Text Analysis [Análisis de textos]) en su proyecto y seleccione New -> Analysis Engine.
  2. Una Analysis Engine con el archivo PEAR que exportó previamente al sistema de archivos.
  3. Haga clic en Finish.

Creación del flujo de datos

  1. Haga clic con el botón derecho en la carpeta Data Flows (Flujos de datos) en su proyecto de almacenamiento de datos y seleccione New -> Data Flow.
  2. En el asistente, ingrese un nombre para el flujo de datos. Por ejemplo, Count Vowels.
  3. Especifique que desea trabajar contra una base de datos y haga clic en Next.
  4. Seleccione la base de datos DWESAMP y haga clic en Finish.

Definición del flujo de datos

Los siguientes pasos describen cómo definir el flujo de datos de manera que lea el texto de la tabla CIA.FACTBOOK en la base de datos de muestra DWESAMP, ejecute el motor de análisis en el texto y escriba las anotaciones en una nueva tabla de base de datos.

La tabla de origen es leída por un operador de Table Source (Origen de tabla). El motor de análisis se ejecuta con un operador de Text Analyzer (Analizador de textos). El último operador en el flujo es un operador de Table Target (Destino de tabla) en donde usted desea escribir las anotaciones.

  1. Desde la sección Sources (Origen) y Targets (Destinos) de la paleta, seleccione un operador de Table Source y arrástrelo al lienzo del editor.
  2. En el diálogo de búsqueda de la tabla de base de datos de origen, expanda el esquema CIA y seleccione la tabla FACTBOOK.
  3. Haga clic en OK (Aceptar).
  4. Haga clic en Finish.
  5. Desde la sección Text Operators (Operadores de textos), arrastre un operador Text Analyzer al lienzo. Debajo del lienzo se abre la pantalla Properties (Propiedades) del operador.
  6. En el lienzo, use una operación de arrastre para conectar el puerto de salida del operador Source Table con el puerto de entrada del operador Text Analyzer.
  7. Seleccione el operador Text Analyzer en el lienzo y defina las propiedades en la pantalla Properties de la siguiente manera:
    1. En la página Analysis Engine, seleccione la columna de texto de ingreso TEXT y configure el motor de análisis del motor importado denominado VowelCounter.
    2. En la página Analysis Results, seleccione VowelCountAnnotation como tipo de anotación. Usted podrá ver las características numberVowels, Begin, y End que ya están seleccionadas como columnas de resultado. Design Studio automáticamente agrega una columna para Covered text (Texto cubierto). La columna contiene el texto que cubren las anotaciones desde Begin a End. Esto es simplemente el texto que fue marcado por las anotaciones en el analizador de textos.
    3. En la página de las columnas de Output (Salida), seleccione la columna COUNTRY (PAÍS) de la lista de columnas disponibles y muévala a la lista de columnas de salida que aparece a la derecha. Ahora puede relacionar la anotación con la palabra clave COUNTRY del documento de texto en la que se encuentre.
  8. Para crear la tabla que contenga las anotaciones, haga clic con el botón derecho en el puerto de salida del operador Text Analyzer y seleccione Create suitable table (Crear tabla apropiada)....
  9. Ingrese VOWELCOUNTS para el nombre de tabla y CIA para el esquema.
  10. Haga clic en Finish.
  11. Por último, guarde el flujo de datos. Por ejemplo, puede guardar haciendo clic en el área del editor y presionando las teclas Ctrl+S.

El flujo de datos completo se muestra a continuación, en la Figura 6. Usted puede ejecutar el flujo de datos seleccionando DB2 UDB Data Flow (Flujo de datos DB2 UDB) -> Execute (Ejecutar).

Figura 6. Flujo de datos
The data flow in the InfoSphere Warehouse Design Studio. Table Source connected to Text Analyzer connected to Table Target.

Usted puede visualizar las anotaciones de muestra haciendo clic con el botón derecho en el operador Table target (Destino de tabla) y seleccionando Sample Contents of the Database Table (Contenidos de muestra de la tabla de base de datos). La Figura 7 muestra las primeras anotaciones que se encontraron para Afganistán.

Figura 7. Anotaciones de muestra
Sample annotations. All samples are from COUNTRY Afghanistan and show all words found with five or more vowels.

Conclusión

En este artículo ha aprendido cómo desarrollar su motor de análisis UIMA y usarlo en InfoSphere Warehouse. Unstructured Information Management Architecture (UIMA) es una plataforma de software abierta que soporta el desarrollo y la implementación de aplicaciones analíticas. Este artículo describió los conceptos UIMA necesarios para desarrollar un motor de análisis personalizado. Usted ha aprendido cómo configurar el entorno de desarrollo UIMA y cómo crear su propio anotador y usarlo en InfoSphere Warehouse para extraer información estructurada del ingreso de texto. La posibilidad de usar motores de análisis compatibles con UIMA expande enormemente las capacidades analíticas de InfoSphere Warehouse, permite desarrollar motores de análisis personalizados para proyectos que requieren tipos de análisis específicos. También permite usar activos de terceros, gratuitos o comercializados, para realizar análisis sofisticados como, por ejemplo, detección de emociones en sus datos de Warehouse.

Este artículo es el tercero y último de la serie sobre el uso de InfoSphere Warehouse para análisis de textos. El primer artículo explicó la arquitectura del análisis de textos de InfoSphere Warehouse y cómo usar las herramientas integradas para expresiones comunes para extraer información de datos de texto. El segundo artículo ofreció una descripción general del soporte para análisis basado en diccionarios, que le permite construir sus propios diccionarios y usarlos para análisis. El segundo artículo también mostró cómo distribuir fácilmente la información extraída en toda su empresa con las herramientas para creación de informes IBM Cognos. Este último artículo cierra la serie, describiendo cómo escribir sus propios anotadores UIMA personalizados y cómo usarlos en InfoSphere Warehouse.

Como se describió en el primer artículo, la información no estructurada representa una gran parte de la información disponible del negocio en la mayoría de las empresas, información que crece cada vez más rápido. El análisis de texto de InfoSphere Warehouse está construido en base a estándares abiertos como UIMA y brinda herramientas poderosas y enriquecidas que usted puede usar para desbloquear la información contenida en estos datos no estructurados. Esto le permite usar herramientas para la creación de informes de inteligencia empresarial, como Cognos, y así poder distribuir fácilmente la información extraída en toda su empresa.

Recursos

Aprender

Obtener los productos y tecnologías

  • Conozca más acerca de UIMA en el sitio Web de UIMA.
  • Encuentre vínculos a componentes UIMA y motores de análisis a disposición del público en el sitio Apache UIMA.
  • Encuentre componentes UIMA a disposición del público en el repositorio de componentes de UIMA de la Universidad de Carnegie Mellon.
  • Descargue Text Analysis Perspective for InfoSphere Warehouse Design Studio para configurar rápida y fácilmente los motores de análisis que se pueden usar en los operadores de texto.

Comentarios

developerWorks: Ingrese

Los campos obligatorios están marcados con un asterisco (*).


¿Necesita un IBM ID?
¿Olvidó su IBM ID?


¿Olvidó su Password?
Cambie su Password

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


La primera vez que inicie sesión en developerWorks, se creará un perfil para usted. La información en su propio perfil (nombre, país/región y nombre de la empresa) se muestra al público y acompañará a cualquier contenido que publique, a menos que opte por la opción de ocultar el nombre de su empresa. Puede actualizar su cuenta de IBM en cualquier momento.

Toda la información enviada es segura.

Elija su nombre para mostrar



La primera vez que inicia sesión en developerWorks se crea un perfil para usted, teniendo que elegir un nombre para mostrar en el mismo. Este nombre acompañará el contenido que usted publique en developerWorks.

Por favor elija un nombre de 3 - 31 caracteres. Su nombre de usuario debe ser único en la comunidad developerWorks y debe ser distinto a su dirección de email por motivos de privacidad.

Los campos obligatorios están marcados con un asterisco (*).

(Por favor elija un nombre de 3 - 31 caracteres.)

Al hacer clic en Enviar, usted está de acuerdo con los términos y condiciones de developerWorks.

 


Toda la información enviada es segura.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=90
Zone=Information mgmt
ArticleID=429140
ArticleTitle=Análisis de texto en InfoSphere Warehouse, Parte 3: Desarrollar e integrar motores de análisis de texto UIMA personalizados
publish-date=08272009