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.