Seis errores que eran el mismo error: por qué un chequeo en verde es más peligroso que ninguno
Seis errores que eran el mismo error
El Corpus Integrativo reúne dieciocho fuentes en 3.788.294 formas de 4.735 doculectos sobre 225 macrosistemas, con procedencia por fila y una capa calculada de 3.091.596 esqueletos consonánticos que ninguna fuente aporta.
La capa base es agregación: cada forma viene de otro sitio, y los sitios son buenos. Lo que se aporta no es «más datos». Es una unión que se puede auditar hasta la fuente de cada cifra, una representación fonológica calculada con las mismas reglas para los 225 macrosistemas, y los huecos declarados con su coste medido.
Pero lo más transferible del paper es otra cosa, y ocupa su sección más larga.
El problema que no se manifiesta como problema
Un corpus integrado de dieciocho fuentes acumula errores que no parecen errores. No hay excepción, ni fila que falte, ni consulta que falle.
Hay una cifra ligeramente distinta de la que debería ser, y nada la señala.
El paper publica, con el corpus, el aparato construido para hacer visible esa clase de fallo: 60 invariantes que fallan en vez de avisar —y los cinco que sólo avisan, enumerados uno a uno—, un contrato de esquema que declara qué significa cada columna y con cuál se confunde, y meta-chequeos cuyo objeto no es el dato sino el alcance del propio aparato.
Y publica su justificación: seis errores reales de este proyecto. Cinco de los seis pasaron todas las comprobaciones que había en su momento.
Los seis
1. El nulo que medía nuestro propio sorteo. Tres papers publicaron cifras de enriquecimiento con su intervalo de confianza. El nulo se estimaba barajando ochenta mil veces, y el intervalo se presentaba como si midiera la incertidumbre de los datos. Medía la del sorteo. Se descubrió al quitar seis formas turcas y ver que el nulo se movía un 14 % — imposible si el intervalo describiera la población. Sustituido por la forma cerrada, las cifras cambiaron: 225× → 218×, 77× → 78×, 39× → 37×.
Qué no lo detectó: nada. El intervalo era ancho, y un intervalo ancho parece prudencia.
2. El anexo empalmado tres veces, con 8/8 chequeos en verde. Seis papers llevaban su anexo pegado tres veces. Los seis pasaban los ocho chequeos. El chequeo comprobaba que el anexo existiera. Existía. Tres veces.
La diferencia entre ≥1 y == 1 es todo el error.
3. Cinco de seis scripts que daban un resultado distinto en cada corrida. La consulta que carga los datos de una familia no tenía ORDER BY. PostgreSQL no promete orden sin él, y no lo daba. Aguas abajo, Counter.most_common(1) rompía los empates por orden de inserción. Resultado publicado: la tabla de sustituciones decía b→p a 0,5× o b→n a 1,9× según la corrida.
Qué no lo detectó: las cifras eran plausibles las dos veces. Nadie corre el mismo script dos veces para comparar.
4. Dos columnas con el mismo nombre y distinto significado. form.source_id es la fuente de la forma; lect.source_id, la de la ficha de la lengua. El código cargaba la segunda en un campo llamado fuente. Consecuencia publicada: una sección entera del paper indoeuropeo decía que una fuente perdía el 65,6 % de sus formas cuando pierde el 100 %.
El error nació de un nombre.
5. El invariante de licencia que informaba cero teniendo 2.140 filas dentro. Al retirar del corpus las fuentes no redistribuibles, el barrido borró 5.971 filas y el invariante informó cero en cuarentena. Había 2.140: una tabla guardaba la procedencia en una columna llamada source, sin sufijo, y ni el barrido ni el invariante la miraban.
Lo detectó otro chequeo — el meta-chequeo de redes de cognación, que se quejó de una red sin invariante declarado.
6. El meta-chequeo que informaba el 120 % de cobertura. El denominador lo calculaba yo, duplicando las expresiones regulares del analizador en vez de pedirle las suyas. Las dos versiones divergieron y el cociente se fue por encima de uno.
La lección, en cinco palabras: preguntarle al parser, no reimplementarlo.
La forma común, que es la tesis
Los seis son el mismo error.
Una comprobación que cubría menos de lo que su nombre prometía, e informaba conformidad exactamente cuando había fallo.
El chequeo del anexo prometía «el anexo está bien» y comprobaba que existiera. El invariante de licencia prometía «no hay cuarentena» y miraba una de las dos columnas donde puede haberla. El meta-chequeo prometía «cobertura» y dividía por un número que se inventaba.
En los tres casos, el verde era más peligroso que la ausencia de chequeo, porque un chequeo verde clausura la pregunta.
Cinco reglas, para cualquiera que publique datos
- Escribe qué NO cubre cada chequeo, junto a lo que cubre. Si no se puede escribir, el chequeo no está entendido.
- Haz que fallen, no que avisen. Un aviso en un log de cien líneas no existe.
- Descubre del catálogo, no de una lista mantenida a mano.
- Prueba que disparan. Introduce el fallo, comprueba que el chequeo lo ve, revierte. Un chequeo que nunca ha disparado no está probado — sólo no ha fallado todavía, que no es lo mismo.
- Mide la cobertura del propio aparato, y haz que eso también falle.
Una nota sobre la cobertura
El paper da la cobertura por capas y no como cifra única, porque no existe: dos consumidores del mismo corpus —una capa de consulta de la historia de una palabra y un catálogo de correspondencias forma–sentido— necesitan capas distintas y llegan a cifras distintas, las dos correctas.
Esta sección no es una confesión. Es el único material que demuestra que el aparato sirve para algo: un invariante que nunca ha disparado no está probado, y un aparato descrito sin los fallos que lo originaron es una lista de buenas intenciones.
El paper: Corpus Integrativo (PDF) · English version
La capa de consulta: Meulemans — nombrada en homenaje a C. S. Meulemans, fundador de la endolingüística junto con J. Á. Elias.