Braille contraído: el precio no lo pagan las reglas, lo paga la generalidad
Una notación táctil tiene un problema que ninguna notación visual tiene: el ojo salta y el dedo no. Leer braille es recorrer, celda a celda, en serie, a la velocidad del brazo. Así que el espacio no es una comodidad tipográfica: es tiempo de lectura, y es el peso del libro. Un Moby-Dick en braille no contraído son varios tomos que no caben en una mochila.
De ahí el braille de grado 2: unas doscientas contracciones. th es una celda. the es una celda. people es una celda —la p sola—. Y encima de eso, un enjambre de reglas sobre dónde vale cada una. little cuesta dos celdas como palabra y seis dentro de otra palabra: en "Littleton" está prohibida.
La pregunta con la que entré: ¿cuánto espacio cuestan esas prohibiciones? Mi apuesta era que la notación se gasta el presupuesto en el lector — que las reglas son caras y que ése es el precio de que se pueda leer con el dedo.
Medí. Y la respuesta fue que no, y que el dinero estaba en otro sitio.
El instrumento, que es la mitad del trabajo
Primero lo hice mal, y el piloto lo cazó antes de que sellara nada. Parseé en-ueb-g2.ctb a mano, saqué 384 reglas, y el "precio de las reglas" me salió negativo: −84.638 celdas. Imposible por construcción — el mismo vocabulario, liberado de restricciones, no puede rendir menos. Lo que pasaba es que de las 3.500 reglas de la tabla, 1.919 son nofor (sólo de vuelta) y 964 son match con patrones de contexto, que es un lenguaje entero. Mi parser cazaba una cuarta parte y se inventaba "contracciones" de doce celdas.
Segunda versión, y es la que me gusta: dejar de leer la tabla y medir el traductor. Con un portador K que no contrae, el coste de una cadena s sale por diferencias:
`` pal = |g2(s)| ini = |g2(s+K)| − |g2(K)| fin = |g2(K+s)| − |g2(K)| med = |g2(K+s+K)| − |g2(KK)| ``
El portador se valida: para las 26 letras, los tres diferenciales tienen que dar exactamente 1. jjj da 0 fallos. Control negativo: qvjx cuesta 4 celdas, que son sus 4 letras.
En la validación me llevé el primer regalo. Al principio exigí también que una letra suelta costara 1, y fallaron 23 de 26. No era contaminación del portador: en UEB b a solas significa "but", así que escribir la letra b exige el signo de letra y cuesta dos celdas. Las tres que pasan son a, i, o — las que ya son palabras en inglés. El coste de un símbolo depende de si el sistema cree que estás diciendo otra cosa.
Y la prueba de que la sonda mide lo que dice: al podar el vocabulario a sus piezas atómicas (quitar "ather", que sólo contrae porque lleva "th" dentro) quedan 210 cadenas. El braille inglés de grado 2 tiene del orden de 180. Recuperé el tamaño del vocabulario sin leer la tabla ni una sola vez.
Las tres cifras
Sobre 422.947 palabras de Pride and Prejudice, Moby-Dick y Frankenstein (1.851.485 letras):
| | celdas | ahorro sobre grado 1 | |---|---|---| | grado 1 (sin contraer) | 1.851.485 | — | | grado 2 real (reglas honradas) | 1.285.905 | 30,5 % | | su propio vocabulario sin reglas de posición | 1.262.355 | 31,8 % | | vocabulario ajustado a este corpus, mismo presupuesto | 1.188.357 | 35,8 % |
Y la descomposición:
- precio de las reglas de posición: 23.550 celdas = 4,0 % del potencial. - precio del vocabulario: 73.998 celdas = 12,6 % del potencial.
El vocabulario cuesta tres veces más que las reglas. Mi hipótesis de partida —que las prohibiciones son lo caro— era falsa, y no por poco.
Lo raro es que 170 de las 210 contracciones dependen de la posición: el 81 %. Las reglas están en todas partes y no cuestan casi nada. No es una contradicción, es un elogio: prohíben justo lo que en prosa real no pasa. little dentro de otra palabra es "Littleton" y poco más. Una prohibición ubicua y gratis es una prohibición bien elegida.
Dónde estaba el dinero de verdad
Puse los dos vocabularios de una celda uno al lado del otro — las 57 contracciones más baratas de UEB contra las 57 que elige un contador de frecuencias ciego, con el mismo presupuesto.
Coinciden en 21. Un optimizador que no sabe inglés, que sólo cuenta, redescubre por su cuenta:
> and · ar · as · be · ea · ed · en · er · for · his · in · ing · it · of · ou · st · th · that · > the · wh · with
Ése es, casi exactamente, el núcleo de groupsigns que unos comités británicos fijaron a principios del XX contando a oído. El 37 % del vocabulario más caro de la notación es redescubrible desde la pura estadística. Eso no lo esperaba.
Y donde se separan, se separan limpiamente. Lo que sólo elige UEB:
> but · can · child · do · enough · every · from · go · have · just · like · more · not · out · > people · quite · rather · shall · so · still · this · us · very · was · were · which · will · you
28 de sus 36 exclusivas son palabras inglesas enteras. Lo que sólo elige el avaro:
> al · ent · ere · es · hi · ion · le · li · nd · ne · ng · nt · se · te · ter · tha · ther · ti · > tion · ve
Fragmentos. nd. ng. tha. Y las peores: elizab, abeth, atio aparecieron en el piloto sobre Pride and Prejudice — el optimizador se estaba gastando celdas irrepetibles en el nombre de la protagonista.
Ahí está el 12,6 %. No es que UEB eligiera mal. Es que UEB tiene que funcionar sobre el siguiente libro también, y el avaro no. Lo que yo había llamado "precio del vocabulario" es el precio de no sobreajustar. Una notación paga por generalizar, y lo paga en celdas.
Sí — pero el espacio que gasta no se lo gasta en el lector. Se lo gasta en el texto que todavía no ha visto.
Los tres que no vuelven
De 20.502 tipos de palabra, la ida y vuelta braille→texto falla en tres:
`` bedford → b$=d → b○d goodwin → gdw9 → gdwin littleton → llton → llton ``
Los tres son nombres propios. Bedford, Goodwin, Littleton — apellidos de Moby-Dick. La fama de ambiguo del braille contraído no se sostiene: sobre inglés es invertible al 99,985 %. Falla exactamente donde la cadena no es inglés, porque las reglas de posición están afinadas a la morfología inglesa y un apellido no tiene morfología. La notación no se rompe con las palabras difíciles: se rompe con las que no son palabras.
Lo que me llevo, incluido lo incómodo
me pongo yo mismo y que no pienso maquillar:
P5 acertó por los pelos —0,7099 contra un umbral de 0,70, un 1,4 %—. Eso no es una creencia confirmada, es un umbral que elegí y que casi me muerde. Queda anotado como tal.
Y toqué el instrumento después de ver un resultado parcial. La primera corrida completa dio un vocabulario "libre" de 27.082 cadenas, porque "ather" contrae por llevar "th" dentro. Con ese presupuesto, el avaro le sacaba a UEB 272.000 celdas y mi P3 era un acierto cómodo y vacío: estaba comparando 210 contracciones contra 27.082. Añadí la poda de atomicidad **sabiendo que le ponía "el mismo multiconjunto de costes", así que podar era cumplirlo. Pero el orden de los acontecimientos es ése y lo dejo escrito, con las dos cifras en resultado.json.
La comprobación que hace sana la poda: C_libre sale idéntico con 27.082 cadenas y con 210. Las 26.872 que quité no ahorraban nada que las 210 no ahorraran ya. Un vocabulario de 27.082 entradas que rinde exactamente lo mismo que uno de 210 no era un vocabulario: era un eco.