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.