BookinglyTech News
Software

RE# etiqueta texto con regex y presume de ir 4.500 veces más rápido que spaCy

El proyecto resharp etiqueta texto con expresiones regulares extendidas y mide 1,92 GB/s con ocho hilos frente a los 0,43 MB/s del NER de spaCy. El autor avisa de que no es una comparación justa.

2 min de lecturaLobsters0 vistas

El responsable de resharp ha publicado un ejercicio de etiquetado de texto —fechas, importes, porcentajes, correos, URLs, nombres, verbos— resuelto con expresiones regulares extendidas en lugar de con un modelo neuronal, y lo ha medido contra el componente NER de spaCy. La cifra que destaca: 1,92 GB/s con ocho hilos frente a los 0,43 MB/s de en_core_web_sm, alrededor de 4.500 veces más. El propio autor reconoce que la comparación es manzanas con naranjas.

El ejemplo que abre la pieza pasa de un texto plano a "On DATE 2024-01-15 NAME Alice was ADV carefully VERB sending MONEY $12.50..." y de ahí a la lista de etiquetas que contiene. Los patrones son diez y caben en un puñado de líneas; el conjunto se aplica en una sola pasada.

La fecha es un lenguaje regular

El argumento de fondo es que yyyy-MM-dd es un lenguaje regular. Se puede decidir de forma exacta si algo es una fecha, bisiestos incluidos, sin margen de error. Un NER neuronal, en cambio, devuelve porcentajes: en el ejemplo del artículo aparecen un ORG 34,1% y un DATE 55,1%, y el autor los usa para preguntarse si merece la pena "consultar a una mezcla de expertos sobre qué es una fecha".

El patrón de nombres aprovecha dos operadores de RE#, & para la intersección y ~ para el complemento, y descarta palabras frecuentes como On, In, At, To, For, Of, The o Via. Vienen a ser un AND y un NOT aplicados sobre el conjunto de coincidencias.

Un calendario en 32 estados

La parte más llamativa es cómo se encadenan if-then-else sin salir de los lenguajes regulares: ((cond & a)|(~cond & b)). Con eso se compone la regla de que febrero llega hasta el 29 si el año es bisiesto y hasta el 28 si no, que abril, junio, septiembre y noviembre se quedan en 30, y que el resto llega a 31. El patrón resultante mide 24.504 caracteres y compila a 32 estados de DFA. RE# admite hasta 65.536 por defecto. La variante que solo contemplaba febrero se quedaba en 26 estados.

El autor insiste en que el tamaño del patrón no dice nada del autómata: la gráfica de estados engaña y solo se recorren las transiciones que hacen falta.

Para quien etiqueta logs, extrae identificadores o valida formatos, la propuesta es hacerlo sin GPU, sin modelos que descargar y con un coste energético que el autor describe como prácticamente nulo: se paga una vez al compilar el autómata y a partir de ahí cuesta lo mismo que buscar una palabra. Lo que no resuelve es lo que no es regular, y ahí sigue haciendo falta otra cosa.