Procesar un texto carácter a carácter

Una de las formas más básicas y relativamente simple para procesar texto es el análisis de carácteres uno a uno. Es un sistema computacionalmente muy simple y que se puede ejecutar con muy poco coste, tan poco que yo he llegado a usarlo en un Arduino con una shield ethernet para procesar peticiones HTTP. El proceso consiste en analizar el texto carácter a carácter clasificando cada carácter en uno o varios tipos y aplicar reglas según esos tipo.

Un ejemplo de tokenizador muy simple sería un sistema que clasifica los caracteres en letras (a-zA-Z), números (0-9) y símbolos (el resto).

for char c in text {
  if tipo(c) == tipoAnteriorSimbolo {
     token += c;
  } else {
    guardarToken(token);
    token = c;
  }
  tipoAnteriorSimbolo = tipo(c);
}

Múltiples tipos por carácter.

El sistema anterior puede ser útil para tratar con lenguajes artificiales muy estrictos como como  ser el uso de comandos o protocolos, pero tiene problemas con lenguajes más “humanos”. Por ejemplo si tratamos de sacar los números de la frase : “Debe 1.000,00€ desde el día 10 de junio.” obtendremos “1”, “000”, “00”, “10”. Cuando lo correcto es: “1.000,00” y “10”. Podemos ver en este caso como hay caracteres que no son números pero deberían considerarse como tales “.,” . Una solución es que en lugar de considerar cada carácter de un solo tipo que puedan ser de varios. En este caso los caracteres “.,” pueden ser considerados signo de puntuación y número.

for char c in text {
  if tipos(c).estaEn(tiposAnteriorSimbolo) {
     token += c;
  } else {
    guardarToken(token);
    token = c;
  }
  tiposAnteriorSimbolo = tipo(c);
}

Ventana de caracteres

Cambiemos de caso, ahora miremos el texto: “Quedamos a las 10. No vino”. Aquí el problema es que nuestro sistema vera “10.” como un número, vale que luego en un procesamiento posterior podemos eliminar el punto que sobra. Pero también podemos solucionar ese problema aumentando “la ventana” que ve el algoritmo. Actualmente el algoritmo juzga el carácter actual y el anterior, se puede modificar para que además vea el siguiente carácter, de tal forma que disponga de los tipos de los tres caracteres para comparar.

Luego hay que definir reglas. Por ejemplo para que un punto cuente ha de estar rodeado de otros dos números. Si está rodeado de un número y un espacio el punto no forma parte del número.

Ventajas e inconvenientes

La principal ventaja de este algoritmo son los pocos recursos que necesita para ejecutarse. Para casos limitados puede funcionar perfectamente. Por eso puede ser ideal para usar en microcontroladores.

Su inconveniente es que no es suficiente flexible para procesar lenguajes humanos y que las reglas pueden llegar a ser muy complicadas.

Sin embargo en caso de que no puedas procesar algoritmos más complicados puede ser la única posibilidad.

Problemas con procesamiento de lenguaje natural en Español

Todos los lenguajes tienen sus particularidades que resultan problemáticas a la hora de ser procesados por un algoritmo. Pero como yo me he centrado en el español puedo resumir los problemas que me he encontrado a distintos niveles del proceso. Estas son las características más habituales que se atragantan a la hora de procesar el español:

Verbos

Nuestros verbos son un horror para muchos estudiantes y para su procesamiento por las máquinas. Literalmente cientos de formas verbales según el tiempo, número, género, aspecto y modo. Formas compuestas, perífrasis verbales, pronombres clíticos y cuando tienes todas las reglas modeladas descubres la cantidad de verbos irregulares que hay.

Tildes

aquí la “diversión” viene por dos lados. Primero que para algunos algoritmos hay que tenerlas en cuenta, para otros no. Por ejemplo para los stemmer no se tienen en cuenta para saber la conjugación verbal hay que considerarlas. Por otro lado “olvidarse” de ponerlas es muy habitual (pueden usarse como ejemplo cualquiera de mis post) y más ahora que puede ser correcto escribir la misma palabra con o sin tilde.

Ñ

La ñ, la mayoría de los lenguajes de programación y librerías están pensadas para el alfabeto inglés, por lo que la ñ (al igual que las vocales con tilde) es la gran olvidada del alfabeto español.

Flexiones

Dependiendo la función que haga una palabra puede tener distintas flexiones y hay que tenerlas en cuenta todas. Por ejemplo si quiero buscar referencias a colores hay que tener en cuenta la palabras “rojo, roja, rojos, rojos, rojizo, rojiza, rojizas, rojizos”

Las reglas que hay tiene gran cantidad de excepciones y hay que contemplar otros casos como términos cuyas palabras son distintas para cuando cambias de número o genero (toro – vaca), que las reglas aplican pero el significado es distinto (rata – rato) o con múltiples formas para la misma flexión como puede ser los aumentativos (-azo, -ton) y diminutivos (-ita, -illa, -ica) que además pueden cambiar el sentido de la palabra (listo – listillo) complicándolo todo un poco más.

Reglas poco estrictas para formar frases

Libertad al configurar las frases. Nuestras reglas para componer frases no son muy estrictas. Lo mismo podemos decir “El coche rojo de Juan”, “Es rojo el coche de Juan”.

Variantes

El español está muy extendido por todo el mundo por lo que hay distintas variantes. Pero como vivimos en un mundo muy interconectado es fácil encontrar esas variantes mezcladas, sobre todo en Internet.