Mostrando entradas con la etiqueta Java. Mostrar todas las entradas
Mostrando entradas con la etiqueta Java. Mostrar todas las entradas

miércoles, 7 de junio de 2017

Ya disponible la biblioteca Java del etiquetador morfosintático petraTAG

Hace ya bastante tiempo que está disponible la aplicación petraTAG, que además de permitir realizar el etiquetado morfosintáctico de cualquier texto en español, también incluye numerosas herramientas para analizar los resultados del etiquetado, pero... ¿qué ocurre cuando queremos integrar un etiquetado eficaz en nuestra propia aplicación?

Para facilitar la integración del motor de etiquetado de petraTAG en cualquier proyecto, acabamos de lanzar en nuestra web la primera versión abierta del motor de etiquetado. Para descargarla, solo tenemos que dirigirnos a la página de la API de la ayuda en línea de petraTAG y descargar el archivo petraTAG-API1.0.zip, que contiene la biblioteca y todos los archivos necesarios para etiquetar un texto en español o inglés.

Vamos a ver cómo utilizar esta biblioteca con un ejemplo muy sencillo que desarrollaremos en Netbeans. Para crear el proyecto, solo tenemos que elegir FileNew Project. En el cuadro de diálogo que aparecerá, elegimos JavaJava Application. Un nuevo cuadro de diálogo nos pedirá que elijamos el nombre del proyecto y la carpeta donde se guardará. En nuestro caso, vamos a elegir como nombre del proyecto petraTAGdemo.

Ahora tenemos que vincular nuestra biblioteca así que, en el árbol del proyecto que aparece a la izquierda, nos situamos encima del proyecto que acabamos de crear y elegimos Properties. Nos vamos ahora a la categoría Libraries y agregamos los dos archivos jar que contiene el zip: Utiles.jar y petraTAG.jar.

¡Ya queda muy poco! Solo tenemos que copiar la carpeta languages que hemos descargado anteriormente en el directorio raíz del proyecto que hemos creado y podremos comenzar a crear a escribir el código de nuestra aplicación. Para comprobar que funciona, podemos escribir lo siguiente:

package petratagdemo;

import petratag.TaggedSentence;
import petratag.Language;

public class PetraTAGdemo {

    public static void main(String[] args) {
        Language language=new Language();       
        language.init("ES");
       
        String text="Este texto es un ejemplo.";
        TaggedSentence sentence=new TaggedSentence();
        sentence.tag(text, language);
       
        for (int n=1;n<=sentence.length;n++) {
            System.out.println(sentence.tokens[n]+" - "+sentence.lemmas[n]+" - "+sentence.posTags[n]);
        }
    }
}


Si lo ejecutamos, deberíamos obtener el siguiente resultado:

- Loaded 271681 dictionary entries and 60 locutions.
Este - este - dd0ms0
texto - texto - ncms000
es - ser - vsip3s0
un - uno - di0ms0
ejemplo - ejemplo - ncms000
. - . - Fp


Pero, ¿cómo funciona? Vamos a ver paso a paso este pequeño programa para ver cómo se etiqueta el texto.

Comencemos con:

        Language language=new Language();       
        language.init("ES");

Para etiquetar un texto, debemos definir un idioma que creamos aquí con la primera línea. La segunda línea carga los datos necesarios para un idioma concreto. Actualmente, solo están disponible el español y el inglés, pero sería fácil crear otros idiomas. Solo es necesario cargar un idioma una vez y, si no queremos etiquetar en varios idiomas, basta con definir un objeto Language, por lo que es habitual definirlo como objeto estático para toda nuestra clase.

        String text="Este texto es un ejemplo.";
        TaggedSentence sentence=new TaggedSentence();
        sentence.tag(text, language);

El objeto que contendrá los datos del etiquetado es TaggedSentence y para etiquetar el texto, solo tenemos que llamar al método tag, indicando el idioma y el texto que queremos etiquetar.

        for (int n=1;n<=sentence.length;n++) {
            System.out.println(sentence.tokens[n]+" - "+sentence.lemmas[n]+" - "+sentence.posTags[n]);
        }

Al etiquetar el texto, se han rellenado automáticamente tres matrices que incluyen todos los datos que necesitamos: los tokens (o palabras), los lemas y las etiquetas morfosintáticas, que siguen la convención establecida en el etiquetario del proyecto. Con este bucle, recorremos todos sus valores.

Aparte del etiquetado, la biblioteca incluye muchas funciones que aumentan su utilidad. No obstante, hemos optado por elegir un ejemplo sencillo que explique claramente los elementos básicos del etiquetado. Para más información, podéis consultar la página informativa sobre la clase. Próximamente, comentaremos algunas posibilidades más y, si tenéis cualquier duda, será para nosotros un placer responder a cualquier pregunta.

jueves, 28 de agosto de 2014

petraTAG: Una cuestión de tamaño

Al etiquetar un texto, la primera impresión es que cuanto mayor sea el diccionario, mejor. Ciertamente, las mayores dimensiones del diccionario ralentizarán el procedimiento y el número mayor de entradas del diccionario ocasionarán un mayor gasto de memoria. Aún así, dadas las capacidades de los modernos ordenadores y teniendo en cuenta que el etiquetado con frecuencia solo debe realizarse una vez, parece preferible emplear un diccionario lo más completo posible... o al menos así era hasta la llegada de los modernos teléfonos inteligentes.

En este tipo de dispositivos, por mucho que aumenten sus características, las limitaciones de memoria y la necesidad de optimizar el uso de la batería obligan a buscar soluciones más eficientes. De hecho, es cierto que una gran parte de las entradas del diccionario nunca se utilizarán, bien porque son palabras raramente utilizadas (¿alguien ha empleado alguna vez «descentralizárnoslos»?) o bien porque pertenecen a campos muy específicos («metilendioximetanfetamina» no es una palabra que suela salir en una conversación).

La cuestión es, entonces, ¿cómo separar el grano de la paja? Una revisión manual no solo sería extremadamente lenta, sino que además tal vez ni siquiera eficiente. Como solución, petraTAG ha añadido una nueva función de exportación de reglas de desambiguación que crea un diccionario reducido, que solo contiene las palabras que contiene el texto etiquetado. Por ejemplo, al extraer las entradas necesarias para etiquetar la novela «Crepúsculo», nos encontramos con un diccionario con 12.352 entradas, un número muy alejado de las 266.790 entradas (¡y subiendo!) que contiene el diccionario más reciente de petraTAG.



Para facilitar aún más este procedimiento, esta función no borra las entradas presentes en el archivo indicado, sino que añade únicamente las nuevas, lo que facilita en gran medida la ampliación de diccionarios según las necesidades, sin que sea preciso partir de cero una y otra vez. Ahora, crear con petraTAG un diccionario personalizado es más fácil que nunca.

sábado, 17 de noviembre de 2012

petraTAG: versión 1.2

Mientras que las principales novedades de la última versión de petraTAG fueron la incorporación de nuevas funciones que facilitaran las búsquedas y las estadísticas, esta nueva versión de petraTAG, que puede descargarse ya desde la página del proyecto en SourceForge, se ha centrado en mejorar y ampliar las funciones ya existentes. Entre las mejoras más importantes cabe destacar:
  • Compatibilidad con archivos .rtf, .doc y .docx. Ahora es posible cargar y realizar búsquedas en archivos en estos formatos.
  • Función de paginación. En las versiones anteriores, al cargar un número elevado de líneas y consultar el etiquetado, petraTAG podía tardar bastante tiempo en mostrarlo, dando la impresión haberse quedado bloqueado. Ahora, cuando el tamaño del etiquetado es excesivo, se muestra en varias páginas por las que es posible desplazarse escribiendo un número de página en el cuadro de la parte inferior de la pantalla o utilizando las flechas de avance y retroceso.
  • Función de guardado de informe. Una opción en el menú Archivo permite guardar el contenido de cualquier informe que se esté mostrando.
  • Ampliación del diccionario de etiquetado. El diccionario contiene ahora cerca de 900 nuevos lemas, que permiten reconocer con mayor precisión más  de 5000 palabras.
Además de estas mejoras evidentes, también se han corregido varios errores y se han optimizado varias funciones para lograr un funcionamiento más intuitivo y cómodo.

De manera paralela a estas novedades, también se ha actualizado el sitio web de petraTAG, añadiendo un nuevo apartado que explica las etiquetas utilizadas y retocando varias de las secciones existentes. Además, se ha creado una nueva sección de tutoriales donde se explican paso a paso los procedimientos más importantes.


martes, 13 de noviembre de 2012

petraREV: La importancia de los espacios en blanco

La comprobación de la coherencia en la traducción es, sin duda, una de las funciones más populares de cualquier sistema de revisión asistida. Resulta fácil de comprender que un mismo texto de origen debe traducirse siempre con el mismo texto de destino, a excepción de unas cuantas excepciones que justifican que esta norma se incumpla.

Precisamente por ser una de las operaciones más eficaces, resulta particularmente frustrante que se nos muestren como distintos dos segmentos que, a simple vista, parecen exactamente idénticos. petraREV utiliza varios métodos para resaltar las diferencias pero en ocasiones no parecen capaces de hallar las diferencias entre dos segmentos. ¿Qué ocurre en esos casos?

La respuesta a esta pregunta se halla, principalmente, en los espacios en blanco. Dado que la comparación se realiza a nivel de token y no de caracteres intersticiales (principalmente espacios en blanco), el algoritmo actual es incapaz de detectar donde están las diferencias.

En realidad, hay un buen motivo para que se haya programado de ella manera. La comparación de segmentos es una tarea compleja que se complica aún más si tenemos que tratar con los espacios en blanco, ya que los seres humanos adoptamos acerca de la posición de los espacios en blanco que no son evidentes para una máquina. ¿Está asociado un espacio en blanco con la palabra anterior o con la siguiente? ¿Al mover una palabra es implícito que se traslada con ella sus espacios en blanco? ¿Se aplican estos criterios también a los espacios inicial de una frase o su posición les independiza de todas las palabras que la componen?

Aparte de toda esta complejidad, lo cierto es que cuando dos textos son sustancialmente diferentes, los espacios parecen perder importancia. Cuando una frase se ha reformulado, añadiendo palabras, cambiándolas de lugar o eliminándolas, no parece que los espacios en blanco sean tan importantes. Los espacios en blanco parecen ser importantes solo cuando todo lo demás coincide.

A partir de esta idea, se ha incorporado un algoritmo a petraREV que solo comprueba los espacios en blanco cuando todo lo demás coincida y resulta admisible exigir una correspondencia de uno a uno entre dos textos.

Aún así, siguen planteándose algunos problemas, por ejemplo, cuando hay tres segmentos con diferentes traducciones y las diferencias se concentran en espacios presentes solo en el primer segmento. Dado que al presentar las incoherencias entre más de dos segmentos, la comparación solo se establece entre los segmentos a partir del segundo y el primero, los espacios en blanco no serían visibles y, una vez mas, todos los segmentos parecerían idénticos. Rebuscado, ¿verdad?

La experiencia demuestra que estas alineaciones de circunstancias extrañas acaban pasando en la realidad. No obstante, al crear un programa de esta índole, rara vez es posible atender el 100% de los casos que acabaran sucediendo. No obstante, poder pasar del 98% al 99% ya es un logro y lo que quede será un estupendo tema sobre el que plantearse preguntas y crear una nueva versión, aún más completa.