El defecto oculto en tus pruebas de autocorrección

Construyes un motor de autocorrección, un servicio de revisión ortográfica o un corrector de consultas de búsqueda. Necesitas datos de prueba, así que tomas texto limpio e introduces errores intercambiando caracteres aleatoriamente. Eliges una posición, insertas una letra al azar y lo llamas errata. Miles de equipos de ingeniería hacen exactamente esto. Y casi todos están probando contra datos que ningún humano produciría jamás.

El problema es sutil. Tus pruebas pasan. Tu autocorrector maneja las cadenas corruptas. Todo aparece en verde. Pero cuando los usuarios reales empiezan a escribir en teclados reales, tu sistema tiene dificultades con errores que nunca encontró en las pruebas, porque los errores que genera tu banco de pruebas no tienen ninguna semejanza estadística con los errores humanos reales.

Este artículo analiza exactamente por qué la mutación aleatoria de caracteres produce datos de prueba poco realistas, cómo son las erratas humanas reales desde la perspectiva de la física del teclado y cómo la generación de erratas basada en física crea datos de prueba que realmente ponen a prueba los algoritmos de corrección de los que dependen tus usuarios.

Mutación aleatoria de caracteres: cómo funciona

El enfoque de intercambio aleatorio

El enfoque típico de mutación aleatoria es engañosamente simple. Recorres una cadena carácter por carácter, lanzas un dado para cada uno y, si el resultado cae por debajo de cierto umbral, reemplazas ese carácter con una letra aleatoria del alfabeto. Cada letra tiene la misma probabilidad de ser elegida como reemplazo. El proceso no tiene conocimiento de teclados, posiciones de dedos ni comportamiento humano.

Considera lo que esto produce en la práctica. Toma una frase simple como «hello world» y mútala aleatoriamente. Podrías obtener «hxllo wkrld» una vez y «hemlo worzd» la siguiente. En el primer resultado, «e» fue reemplazada por «x» -- una letra en el lado opuesto del teclado, dos filas más arriba. Ningún mecanógrafo humano cometería ese error. En el segundo, «l» se convirtió en «m» (plausible, ya que son vecinas) pero «l» también se convirtió en «z» (nada plausible). La mutación aleatoria tropieza con un error realista ocasionalmente por pura casualidad, pero la mayoría de los errores que produce son físicamente imposibles para un humano.

El problema fundamental es que la mutación aleatoria trata cada letra como igualmente probable para reemplazar cualquier otra letra. Asigna la misma probabilidad a que «e» se convierta en «r» (la tecla directamente encima en QWERTY) que a que «e» se convierta en «z» (una tecla que un dedo humano nunca alcanzaría accidentalmente desde la posición de «e»). Esto produce una distribución de errores plana y uniforme que no se parece en nada al comportamiento real de escritura.

Por qué el autocorrector maneja fácilmente el ruido aleatorio

Los sistemas modernos de autocorrección y revisión ortográfica se basan en algoritmos de distancia de edición, modelos de lenguaje y tablas de frecuencia. Cuando intercambias «e» por «z» en «the», el corrector ve una sustitución que casi nunca aparece en sus datos de entrenamiento, porque ningún humano confunde «e» y «z» en un teclado QWERTY. Las teclas están en lados opuestos. La distancia de edición es 1, la corrección es trivial y la prueba pasa sin problemas.

Pero los usuarios reales no cometen errores trivialmente corregibles. Un usuario que escribe «the» rápidamente podría pulsar «r» en lugar de «e» porque las teclas son adyacentes. El autocorrector ahora tiene que decidir entre «the», «thr» y «three». Un usuario en un teléfono podría pulsar «y» en lugar de «t» porque las áreas táctiles se superponen verticalmente. El corrector ahora se enfrenta a «yhe» y debe sopesar mucho el contexto. Estos son los casos genuinamente difíciles, y la mutación aleatoria casi nunca los produce.

Cuando cada sustitución es uniformemente aleatoria, la distribución de probabilidad de errores es plana. Los errores reales de escritura siguen una distribución con pico pronunciado centrada en las teclas adyacentes. Tu suite de pruebas está midiendo el rendimiento en la parte fácil del espacio del problema e ignorando completamente la parte difícil.

Cómo son las erratas humanas reales

Teclas adyacentes, no caracteres aleatorios

Los estudios sobre el comportamiento de escritura muestran consistentemente que la gran mayoría de las sustituciones de un solo carácter involucran teclas que son físicamente adyacentes en el teclado. Cuando un mecanógrafo tiene la intención de presionar «d», las teclas incorrectas más comunes son «s», «f», «e» y «c» -- todas comparten un borde con «d» en una disposición QWERTY. La probabilidad de pulsar «z» o «m» en lugar de «d» es ínfima porque el dedo tendría que recorrer todo el teclado.

Este patrón de adyacencia no es arbitrario. Se deriva directamente de la física del movimiento de los dedos. Cada dedo tiene una posición base y un alcance limitado. Los errores ocurren cuando un dedo se desvía ligeramente del objetivo, lo que significa que la tecla incorrecta es casi siempre una vecina. En un teléfono, el mismo principio aplica a través del radio táctil: un toque destinado a una tecla se desborda hacia el área de la tecla adyacente.

La mutación aleatoria ignora esto por completo. Asigna la misma probabilidad a cada letra del alfabeto, lo que significa que «d» tiene la misma probabilidad de convertirse en «z» que en «s». Esto produce una distribución de errores fundamentalmente diferente a la que generan los humanos, y cualquier sistema de autocorrección ajustado para manejar errores reales se estará probando contra datos incorrectos.

Tipos de errores que la mutación aleatoria omite por completo

La sustitución de un solo carácter es solo uno de muchos tipos de errores que ocurren durante la escritura real. Los enfoques de mutación aleatoria casi nunca modelan ninguno de los siguientes:

  • Transposiciones: Intercambiar dos caracteres adyacentes («teh» en lugar de «the») representa una porción significativa de las erratas del mundo real. Ocurre cuando los dedos en teclas adyacentes se activan en el orden incorrecto.
  • Inserciones: Pulsar una tecla extra entre dos teclas previstas («thhe» en lugar de «the») ocurre cuando un dedo roza una tecla vecina durante el movimiento.
  • Omisiones: No pulsar una tecla («th» en lugar de «the») es común durante la escritura rápida cuando una pulsación no se registra o un dedo no presiona completamente la tecla.
  • Dobles pulsaciones: Presionar una tecla dos veces («thee» en lugar de «the») ocurre cuando un dedo rebota en un interruptor mecánico o una pantalla táctil registra un toque dos veces.
  • Errores de mayúsculas: Activar o soltar la tecla Shift en el momento incorrecto, produciendo «THe» o «tHe» en lugar de «The».
  • Errores de espacio: Pulsar espacio demasiado pronto («th e») o no poner espacio entre palabras («thequick») son de los errores más comunes en dispositivos móviles.

Un enfoque de pruebas que solo considera sustituciones está ignorando más de la mitad de los tipos de errores que producen los usuarios reales. Una estrategia robusta de pruebas de estrés para autocorrección debe cubrir transposiciones, inserciones, omisiones y todas las demás categorías, con cada tipo ponderado por su frecuencia en el mundo real.

Comparación de resultados lado a lado

La diferencia se hace evidente cuando comparas la misma entrada procesada con ambos enfoques a tasas de error aproximadamente similares.

Entrada: «The quick brown fox jumps over the lazy dog»

Resultado de mutación aleatoria: «Tze quiqk brxwn foz jumts oveb thr lmzy dxg»

Resultado basado en física: «The quicj brown fox jumps over teh lazy dog»

Observa lo que produjo la mutación aleatoria. Seis sustituciones, todas tomadas de posiciones arbitrarias del alfabeto. «x» reemplazando a «o» en «brown», «z» reemplazando a «h» en «The», «m» reemplazando a «a» en «lazy» -- ninguno de estos refleja un movimiento de dedo plausible en ningún teclado. Un motor de autocorrección puede corregirlos trivialmente porque cada letra incorrecta es estadísticamente improbable y la letra correcta es la única candidata sensata.

Ahora observa el resultado basado en física. Solo dos errores: «k» se convirtió en «j» (teclas adyacentes en QWERTY, el mismo dedo desviándose una columna a la derecha) y «the» se convirtió en «teh» (una transposición, el error de sincronización más común entre dedos adyacentes). Ambos son errores que los usuarios reales cometen miles de veces al día. Un motor de autocorrección debe usar el contexto para resolver «quicj» -- ¿es «quick», «juice» u otra cosa? Y debe reconocer el patrón de transposición en «teh», una errata famosamente común. Estas son correcciones más difíciles que representan el desafío real que tu sistema enfrentará en producción.

Cómo funciona la generación basada en física

LikelyTypo genera errores de escritura realistas utilizando la física del teclado en lugar de la selección aleatoria de caracteres. Cada error que produce sigue las relaciones espaciales de una disposición de teclado real. Las sustituciones favorecen las teclas adyacentes. Las transposiciones ocurren entre caracteres escritos por dedos vecinos. Las inserciones suceden en posiciones donde un dedo rozaría una tecla cercana durante el movimiento.

El sistema modela diferentes perfiles de escritura que controlan cuán propenso a errores es el resultado. Un perfil sutil introduce pocos errores a una tasa baja, imitando a un mecanógrafo cuidadoso. Un perfil de escritura rápida aumenta tanto la tasa como la variedad de tipos de errores. Un perfil de escritura agresiva produce la mayor cantidad de errores con patrones caóticos, simulando a un usuario que escribe emocionalmente y no se autocorrige. Cada perfil ajusta las ponderaciones de probabilidad para cada tipo de error de forma independiente, produciendo resultados que coinciden con la huella estadística de ese tipo de mecanógrafo.

El tipo de dispositivo cambia completamente el modelo físico. Un teclado físico utiliza el alcance de los dedos y el espaciado entre teclas para determinar qué teclas adyacentes son candidatas realistas de sustitución. Un teléfono utiliza el radio táctil y la densidad de pantalla, donde los errores de dedo grueso siguen una distribución de probabilidad circular alrededor del punto de toque previsto. Un teclado de deslizamiento modela los patrones de error completamente diferentes que ocurren durante la escritura por gestos, donde los errores suceden a lo largo de la trayectoria de deslizamiento entre letras. Cada dispositivo produce una distribución de errores diferente porque el mecanismo físico de cometer errores es diferente.

Un aspecto crítico es que un valor de semilla hace que el resultado sea determinista. La misma entrada más la misma semilla siempre produce el mismo resultado. Esto es esencial para las pruebas: puedes construir expectativas estables alrededor de resultados corruptos específicos y esas expectativas se mantendrán consistentemente a través de ejecuciones repetidas.

Comprendiendo los errores

Cuando pruebas el autocorrector con erratas realistas, saber exactamente qué errores se introdujeron es tan importante como el texto corrupto en sí. La generación basada en física proporciona un informe estructurado de cada error: su tipo (sustitución, transposición, omisión, inserción, doble pulsación u otros), su posición en el texto, el carácter o caracteres originales y qué los reemplazó.

Para el ejemplo anterior -- «The quicj brown fox jumps over teh lazy dog» -- el informe de errores identificaría una sustitución en la posición 8 (original «k», reemplazo «j») y una transposición en la posición 33 (original «he», resultado «eh»). Esto transforma las pruebas de autocorrección de un ejercicio de caja negra en un proceso preciso y auditable. Puedes verificar que cada error introducido fue correctamente resuelto y señalar exactamente con qué tipos de errores tiene dificultades tu sistema.

Esto es algo que la mutación aleatoria simplemente no puede proporcionar. Debido a que la mutación aleatoria no tiene un modelo de cómo es un error realista, no puede categorizar significativamente los errores que introduce. Terminas con texto corrupto y sin una comprensión estructurada de qué salió mal o por qué.

Cuándo usar cada enfoque

La mutación aleatoria de caracteres no es inútil. Tiene aplicaciones legítimas en escenarios específicos donde el ruido distribuido uniformemente es exactamente lo que necesitas:

  • Fuzzing para detectar fallos: Si estás probando que tu analizador no se bloquea con entradas arbitrarias, la mutación aleatoria es apropiada. Quieres el espacio de entrada más amplio posible, no entradas realistas.
  • Límites de robustez: El ruido aleatorio puede establecer el límite del peor caso absoluto para tu sistema. Si tu autocorrector maneja sustituciones uniformemente aleatorias, eso te dice algo sobre sus límites teóricos.
  • Entrada no proveniente del teclado: Si estás probando la corrección de errores de OCR o la recuperación de datos corruptos, la distribución de errores no está ligada a la adyacencia del teclado, y la mutación aleatoria puede aproximar mejor los errores reales.

Para todo lo demás -- especialmente para probar autocorrección, revisión ortográfica, sugerencias de búsqueda y sistemas de corrección de consultas que enfrentarán escritura humana real -- necesitas errores que sigan la física de cómo escriben realmente los humanos. La diferencia no es académica. Los sistemas de autocorrección probados exclusivamente con mutación aleatoria pasarán todas las pruebas y luego tendrán un rendimiento inferior en producción donde la distribución de errores es marcadamente diferente.

La pregunta clave es simple: ¿mis datos de prueba se parecen a mis datos de producción? Si tus usuarios escriben en teclados y teléfonos, tus datos de prueba deben contener los mismos tipos de errores que ellos cometen. Sustituciones de teclas adyacentes, transposiciones, omisiones, dobles pulsaciones y errores de mayúsculas, todos ponderados por su frecuencia en el mundo real, a través de los tipos de dispositivos específicos que realmente usan tus usuarios.

Compruébalo tú mismo

Genera erratas basadas en física de forma interactiva y compara el resultado con lo que produce la mutación aleatoria. Elige dispositivos, perfiles y disposiciones para ver cómo cada parámetro cambia los patrones de error.

Prueba la demo interactiva

La generación de erratas basada en física es un pequeño cambio en tu enfoque de pruebas que produce datos de prueba de una calidad fundamentalmente diferente. Tus pruebas de autocorrección deberían ser difíciles. Deberían revelar los casos límite que los usuarios reales encuentran. La mutación aleatoria de caracteres hace que esas pruebas sean fáciles, y las pruebas fáciles son pruebas que mienten.