clasificador lingüístico de textos en java
Transcription
clasificador lingüístico de textos en java
CLASIFICADOR LINGÜÍSTICO DE TEXTOS EN JAVA Óscar Alberto García Pérez Ignacio Martínez Fernández Universidad Carlos III de Madrid Universidad Carlos III de Madrid [email protected] [email protected] ABSTRACT En éste documento se pretende presentar un sistema de clasificación automática de textos en función del idioma en el que estén escritos. Se proponen dos algoritmos diferentes, uno tradicional de diccionario y uno novedoso que se basa en la frecuencia de aparición de cada una de las letras del abecedario en el texto. Se comparan las ventajas y desventajas de cada algoritmo. Palabras clave Clasificador, Textos, Documentos, Idioma. 1. INTRODUCCIÓN La clasificación de textos por categorías es una técnica bastante útil y utilizada, especialmente en los últimos tiempos. Vivimos en una sociedad que maneja y consume grandes cantidades de información, y, cada vez más, ésta se encuentra en formato electrónico. El auge de Internet y la gran demanda de información por parte de sus usuarios hacen que la buena y rápida clasificación de dichas bases de datos sea primordial para que el acceso a la información no se convierta en una tarea caótica. Los clasificadores de textos tradicionales se basan en observar las palabras que aparecen en el texto y calcular la probabilidad de que ese conjunto de palabras pertenezcan a cada una de las posibles categorías de decisión. Aquella categoría que consiga una mayor probabilidad será la categoría elegida como solución. Este tipo de algoritmos necesitan tener una base de datos con palabras de cada una de los conjuntos de decisión, y aumentará la probabilidad de acierto cuanto mayor sea la base de datos, a costa de tener un mayor coste computacional. Técnicas como la anteriormente comentada se puede utilizar a la hora de clasificar textos según su idioma. Se elegiría un idioma mirando la aparición de las palabras del texto en cada uno de los diccionarios. Este será el primer algoritmo que presentemos en este informe. Algoritmos basados en la utilización de diccionarios son los que se usan en la mayoría de los casos, pero pueden requerir un coste computacional elevado para altos valores de número de idiomas o de tamaño de diccionarios. Para intentar cubrir las debilidades de este tipo de algoritmos, proponemos la utilización de un algoritmo alternativo y novedoso basado en la frecuencia de aparición de cada una de las letras del alfabeto en el texto a clasificar. 2. ALGORITMO DICCIONARIO 2.1 Funcionamiento BASADO EN El primer algoritmo esta diseñado a partir de un algoritmo de diccionario, minimizando la lista de palabras, y puntuando por aparición. Utilizamos un sencillo algoritmo de puntuación, evitando complicar el algoritmo. Simplemente con una lista de palabras, que se generaron a partir del conjunto de entrenamiento, vamos sumando puntos y en función de estos tomamos la decisión. Siendo este algoritmo el más sencillo sus resultados se utilizarán para validar el siguiente algoritmo. Como hemos simplificado al máximo el algoritmo, es probable que se produzcan fallos. 2.2 Implementación Para implementar este algoritmo, partiendo de 5 idiomas (alemán, español, francés, inglés e italiano), utilizamos 24 palabras para identificar en idioma, estas palabras fueron escogidas por ser aquellas con mayor número de apariciones en los textos de prueba. Estas palabras resultaron ser: P={des, le, et, la, les, de, à, en, los, a, y, el, que, in, and, of, the, to, die, der, if, di, e, che }. Que son artículos y preposiciones en los diferentes idiomas aquellas palabras que aparecían en dos idiomas se tuvieron en cuenta en ambos. Pensamos que al implementar un decisor basado en un algoritmo de puntos, sin ponderaciones, la tasa de fallos aumentaría, pero como ya hemos dicho anteriormente este algoritmo nos interesaba rápido, con una eficiencia suficiente como para tomarlo de referencia. Si vemos los resultados en el apartado 4, con este simple algoritmo se consiguió el objetivo de fallos y, dada su corta lista de palabras, la velocidad resultó ser muy elevada. Puede no decidir si ninguna palabra aparece en el diccionario. Para un número elevado de idiomas puede requerir una ingente cantidad de memoria y el retardo para el acceso a la misma seria enorme. 3. ALGORITMO BASADO EN LA FRECUENCIA DE APARICIÓN DE LAS LETRAS 3.1 Funcionamiento Este segundo algoritmo trata en el diseño de un sistema que a partir de los porcentajes de aparición de cada una de las letras del abecedario en un texto, sea capaz de determinar el idioma de dicho texto. Ilustración 2-2: Clasificador de diccionario, esquema de funcionamiento. 2.3 Propiedades Para realizar este sistema, se va a usar una red de perceptrones (ver Figura 3.1). El problema de usar perceptrones es que cada uno de estos elementos solo se pueden usar para clasificación binaria o estimación. Dado que nuestro problema es de clasificación en más de dos grupos, hemos optado por realizar una red de varios perceptrones. A cada uno de estos perceptrones se le asigna un idioma (hay tantos perceptrones como idiomas clasifique el sistema), y se le entrena para que distinga entre textos del idioma que se le ha asignado y el resto de idiomas. 2.3.1 Ventajas El coste computacional es bajo, siendo mayor el tiempo de acceso y búsqueda de cada palabra en los diferentes diccionarios. El sistema de puntuación y decisión es muy básico. Los textos bilingües resultan adecuados para decidir aunque por simplicidad no se toma la decisión de si es o no bilingüe. Es capaz de tomar una decisión siempre. Resulta muy sencillo de implementar una vez elegido el diccionario y el idioma. Suponiendo que la salida ideal para el idioma asignado a cada perceptrón es 1, y la salida para el resto de idiomas es cero, podemos considerar la salida x del perceptrón del idioma L ante la entrada de un texto T como una expresión proporcional a la probabilidad de L dado T: x L ∝ p( L | T ) Aplicando un criterio similar a MAP (máximo a posteriori), podemos decidir acerca del idioma del texto L’ sin más que elegir el idioma correspondiente al perceptrón con el mayor valor a su salida: L' = max( x L ) L La probabilidad de acierto es muy alta para textos no demasiado largos. Puede decidir entre idiomas parecidos, aunque presenta problemas para aquellos que comparten preposiciones o determinantes iguales (francés-español, alemán-inglés,…), llegando a no decidir. 2.3.2 Desventajas Dependiendo de la longitud del diccionario es más o menos sensible al formato del conjunto de palabras, en nuestro caso como los diccionarios son extremadamente reducidos resulta desventajoso. Ilustración 3-1: Esquema del perceptrón Ilustración 3-2: Esquema del sistema completo 3.2 Implementación El algoritmo implementado en nuestra aplicación es capaz de distinguir entre los siguientes idiomas: español, inglés, francés, alemán e italiano. Se ha usado un conjunto de de textos de entrenamiento compuesto por 10 textos de cada idioma (50 textos de entrenamiento en total). Con estos textos se han entrenado cada uno de los perceptrones del sistema para calcular sus pesos wi. Las distribuciones de letras de los textos de entrenamiento se muestran a continuación clasificados por idiomas (se muestran el valor mínimo y máximo de aparición de cada letra en el total de 10 textos de cada idioma): Ilustración 3-3: Distribución de letras en textos en Español Ilustración 3-7: Distribución de letras de textos en Italiano Ilustración 3-4: Distribución de letras en textos en Inglés El conjunto de caracteres utilizado es: C= {Aa, Bb,…, Zz, Çç, Ññ, ´, `, ¨, ^} El conjunto incluye las letras del alfabeto tradicional (A-Z), la ‘ñ’ y la ‘ç’, y las vocales acentuadas con los acentos ´, `, ¨ y ^. Cada letra se considera independientemente de si está en mayúsculas o en minúsculas, esto es, la ‘A’ y la ‘a’ se cuentan en el mismo grupo. Esto genera un total de 32 grupos, que equivalen al número de entradas del sistema (y de cada perceptrón). 3.3 Propiedades 3.3.1 Ventajas Ilustración 3-5: Distribución de letras en textos en Francés El mayor coste computacional está en el cálculo de las estadísticas del texto (frecuencia de aparición de cada carácter) y es prácticamente fijo una vez dado el texto. Dicho coste no crece de manera tan considerable al añadir más idiomas nuevos soportados. No es sensible al formato del conjunto de palabras, por lo que es capaz de decidir en textos que no tengan oraciones, sino un conjunto de nombres, un conjunto de adjetivos, un conjunto de verbos,… Es capaz de tomar una decisión siempre. Sencillo de implementar una vez entrenado. La probabilidad de acierto es bastante alta para textos lo suficientemente largos. Ilustración 3-6: Distribución de letras en textos en Alemán 3.3.2 Desventajas No decide bien en textos bilingües. Decide siempre, por lo que decidirá incorrectamente si se introduce un texto de un idioma no soportado. Puede tener problemas para decidir entre idiomas con distribuciones de letras similares (francés-catalán, alemánholandés,…). Para un número elevado de idiomas soportados, puede requerir un sistema con elementos que tengan mayor capacidad expresiva1 que un perceptrón lineal. 4. BATERIA DE PRUEBAS Para probar las prestaciones de ambos, se generó un conjunto de test, formado por tres grupos de test de 50 textos cada uno, diez con cada uno de los idiomas (excluyendo nombres propios). A continuación tenemos el listado comparativo de cada prueba: Para textos de 10 palabras: Tabla 4-1: Resultados de la batería de pruebas de 10 palabras. Clasificador IDIOMA Aleman0 Aleman1 Aleman2 Aleman3 Aleman4 Aleman5 Aleman6 Aleman7 Aleman8 Aleman9 Total Alemán Español0 Español1 Español2 Español3 Español4 Español5 Español6 Español7 Español8 Español9 Total Español Frances0 Frances1 Frances2 Frances3 1 Porcentajes ACIERTA FALLA X X X X X X X X X X 8 2 X X X X X X X X X X 8 2 X X X X Diccionario ACIERTA FALLA X X X X X X X X X X 6 4 X X X X X X X X X X 10 0 X X X X Capacidad expresiva: capacidad del decisor de trazar fronteras lo suficientemente complejas Frances4 Frances5 Frances6 Frances7 Frances8 Frances9 Total Francés Ingles0 Ingles1 Ingles2 Ingles3 Ingles4 Ingles5 Ingles6 Ingles7 Ingles8 Ingles9 Total Ingles Italiano0 Italiano1 Italiano2 Italiano3 Italiano4 Italiano5 Italiano6 Italiano7 Italiano8 Italiano9 Total Italiano TOTAL X X X X X X X X X 6 X 4 X X X X X X X X X 8 2 X X X X X X X X 7 37 X X X 6 X X X X X X X X X X 10 X X 4 0 X X X X X X 3 13 5 37 X X X X 5 13 En este caso obtenemos un 74 % de acierto en cada algoritmo, destacar que el diccionario tiene idiomas con un 100% de acierto, más adelante volveremos a este punto, comentándolo con mayor profundidad. Textos con 30 palabras: Tabla 4-2: Resultados de la batería de pruebas de 30 palabras. Clasificador IDIOMA Aleman0 Aleman1 Aleman2 Aleman3 Aleman4 Aleman5 Aleman6 Aleman7 Aleman8 Aleman9 Total Alemán Español0 Español1 Español2 Porcentajes ACIERTA FALLA X X X X X X X X X X 10 0 X X X Diccionario ACIERTA FALLA X X X X X X X X X X 9 1 X X X Español3 Español4 Español5 Español6 Español7 Español8 Español9 Total Español Frances0 Frances1 Frances2 Frances3 Frances4 Frances5 Frances6 Frances7 Frances8 Frances9 Total Francés Ingles0 Ingles1 Ingles2 Ingles3 Ingles4 Ingles5 Ingles6 Ingles7 Ingles8 Ingles9 Total Ingles Italiano0 Italiano1 Italiano2 Italiano3 Italiano4 Italiano5 Italiano6 Italiano7 Italiano8 Italiano9 Total Italiano TOTAL X X X X X X X 9 X X X X 1 X X X X X X 9 X X X X X X X X X X 10 X X X X X X X X X X 10 48 X X X X X X X 10 X X X X X X X X 0 X 1 0 X 9 X X X X X X X X X X 10 X X X X X X X 1 0 X X 0 2 X 8 46 2 4 En este caso los aciertos aumentan hasta un 96% con los porcentajes y un 92% con el diccionario. Y para los textos de 50 palabras: Tabla 4-3: Resultados de la batería de pruebas de 50 palabras. Clasificador Porcentajes Diccionario IDIOMA Aleman0 Aleman1 Aleman2 Aleman3 Aleman4 Aleman5 ACIERTA X X X X X X ACIERTA X X FALLA FALLA X X X X Aleman6 Aleman7 Aleman8 Aleman9 Total Alemán Español0 Español1 Español2 Español3 Español4 Español5 Español6 Español7 Español8 Español9 Total Español Frances0 Frances1 Frances2 Frances3 Frances4 Frances5 Frances6 Frances7 Frances8 Frances9 Total Frances Ingles0 Ingles1 Ingles2 Ingles3 Ingles4 Ingles5 Ingles6 Ingles7 Ingles8 Ingles9 Total Ingles Italiano0 Italiano1 Italiano2 Italiano3 Italiano4 Italiano5 Italiano6 Italiano7 Italiano8 Italiano9 Total Italiano TOTAL X X X X 10 X X X X X X X X X X 10 X X X X X X X X X 9 X X X X X X X X X X 10 X X X X X X X X X X 10 49 0 0 X 1 0 X X X X 9 X X X X X X X X X X 10 X X X X X X X X X X 10 X X X X X X X X X X 10 X X X X X X X X 1 0 0 0 1 0 1 X 9 48 1 2 Lo que representa que con 50 palabras el algoritmo basado en porcentajes tiene una proporción de aciertos del 98% y nuestro algoritmo basado en diccionario un 96%. 5. IMPLEMENTACIÓN EN JAVA 5.1 Interfaz gráfica. 5.1.1 Menú El menú se compone de dos submenús con las mínimas opciones que son: elegir el clasificador, y opciones de salir; destacar que el programa tiene memoria respecto al clasificador. La interfaz implementada intentamos que resultara amigable y atractiva, ya que, a la hora de la verdad los algoritmos de clasificación son para clientes, que no tienen por qué entender lo que hay detrás. Modos de introducir el texto Menú Área de texto Barra de progreso Ilustración 5-1: Interfaz gráfica. 5.1.2 Modos de introducir el texto. 5.1.4 Diagramas Incluimos en esta versión dos formas de introducir el texto, desde un fichero o desde el área de texto, ver ilustración 5-1. Para mostrar la solución utilizamos dos tipos de diagramas, de sectores para que el usuario vea cuales son los idiomas que ha identificado y en qué proporción, y porque se decanta por uno o por otro. El segundo es un diagrama de barras con la frecuencia de aparición de cada carácter en el texto. Para facilitarle las tarea al usuario se incluyó un filtro para seleccionar fichero, dentro de la habitual ventana para elegir fichero, JFileChooser, una vez seleccionado el fichero el programa lo procesa y devuelve la solución. Se asociaron diferentes iconos para ficheros con extensiones txt, java, class, jar y html (o htm), para que al usuario le resultara mas sencillo elegir el fichero a procesar. 5.1.4.1 Diagrama de sectores En el área de texto, se puede escribir y pegar texto, con lo que serviría para análisis de textos más cortos, aunque en esta versión no se toma en cuenta, y la cantidad de texto es indiferente. 5.1.3 Barra de progreso La barra de progreso cumple dos misiones importantes, hacerle ver al usuario que está procesando y minimizar la ventana principal para dar paso a los diagramas que muestran la solución. Ilustración 5-2: Diagrama de sectores. Como se puede observar el diagrama de sectores muestra al pasar el ratón por encima la puntuación obtenida por el idioma, lo realizamos ayudándonos de la librería JFreeChart [1]. 5.1.4.2 Diagrama de barras Como futura mejora, se podría implementar el algoritmo de entrenamiento, que por tiempo y retrasos en el proceso no se portó el código a java, y para entrenar la red neuronal del algoritmo de porcentajes utilizamos Matlab. 5.3 Requisitos El requisito fundamental en un PC con JDK 6.0, ya que las librerías para los diagramas en 3D lo requieren. La librería se adjunta al programa, es gratuita. 6. CONCLUSIONES Ilustración 5-3: Diagrama de barras. En la leyenda podemos ver todos los caracteres que consideramos a la hora de analizar el porcentaje de aparición de letras en un idioma. Al igual que el diagrama anteriormente expuesto, se realizó con ayuda de la librería JFreeChart [1]. 5.1.4.3 La solución La solución para que no haya lugar a dudas, se muestra en una ventana emergente, como podemos ver en la siguiente figura: Nuestro algoritmo basado en porcentajes resulta ser muy bueno, para textos medianos y grandes, escritos en un solo idioma. Además el gasto computacional de este algoritmo es muy bajo y los incrementos en el número de idiomas pasan desapercibidos, pues solo tiene que ejecutarse el perceptrón del nuevo idioma, las búsquedas no varían pues solo se realiza una ante la entrada, después se trabaja con los porcentajes. Si observamos los resultados de las pruebas, existen 2 idiomas que por diccionario resultan óptimos: el inglés y el español, que con diez palabras conseguimos un 100% de aciertos, mientras que calculando porcentajes necesitamos al menos treinta palabras para conseguir un porcentaje similar. Aunque resulta inadecuado para textos cortos, hemos visto que presenta características similares a el otro algoritmo basado en diccionario, para suplir este problema, propondríamos en uso de un algoritmo mixto, dependiente de la longitud del texto. La primera parte utilizarían un algoritmo basado en diccionario, más desarrollado, con más palabras por idioma. Y cuando el texto sea de un tamaño mayor, utilizaríamos nuestro algoritmo basado en porcentajes de aparición. 7. BIBLIOGRAFÍA [1] JFreeChart : a free chart library for the Java(tm) platform. http://www.jfree.org/ Ilustración 5-4: La solución. 5.2 Algoritmos Se implementaron los dos algoritmos, intentando tener la máxima generalidad posible. Hemos comentado anteriormente la funcionalidad de los mismos y en el punto seis procederemos a la comparación de dichos algoritmos. [2] R. Herbrich, "Learning Kernel Classifiers: Theory and Algorithms", MIT Press, (2001). ISBN 0-262-08306-X. [3] David MacKay,” Information Theory, Inference, and Learning Algorithms”, http://www.inference.phy.cam.ac.uk/mackay/itila/book.html [4] Apuntes de Inteligencia en Redes de Comunicaciones, del mismo curso y titulación.