Pruebas y QA · 6 min de lectura

Parser de direcciones en 2026: tokenización, ambigüedad y alternativas

Cómo construir un parser de direcciones que reconozca la incertidumbre: un pipeline por etapas, orden de campos según el país, manejo de ambigüedades, puntuaciones de confianza y casos de referencia.

Por Charlie Simmon ·

Un parser de direcciones convierte una cadena en campos estructurados: línea 1, línea 2, ciudad, región, código postal y país. Eso suena a dividir por comas hasta que te encuentras con una dirección alemana donde el código postal precede a la ciudad, una dirección japonesa escrita de mayor a menor unidad, o una línea estadounidense donde "St" forma parte del nombre de la ciudad y no es un sufijo de calle.

Esta guía describe un parser que es honesto sobre la ambigüedad. La regla de diseño es simple: parsea solo lo que la gramática admite, puntúa lo que parseaste y devuelve la cadena original intacta cuando la confianza es baja. Un parser que devuelve campos incorrectos en silencio es peor que uno que se niega, porque los campos incorrectos se almacenan y el original se descarta.

Qué puede y qué no puede recuperar el parseo

El parseo recupera la estructura que estaba presente en el texto: el código postal, el código de región, la ciudad y la línea de calle, en ese orden de fiabilidad. No puede recuperar información que nunca se escribió. Una cadena sin designador de unidad no contiene un número de unidad, y ninguna cantidad de inferencia debería inventarlo.

Tampoco puede confirmar que los campos sean verdaderos. Parsear "123 Main St, Springfield, IL 62701" produce campos coherentes, y la dirección puede seguir siendo ficticia o la ciudad puede no coincidir con el ZIP. El parseo es una operación de texto. La verificación es una operación de datos, y ambas nunca deberían compartir un nombre de función ni un mensaje de éxito.

  • Recuperable: código postal, región, ciudad, línea de calle, designador de unidad
  • No recuperable: una unidad faltante, un país faltante, una ciudad incorrecta
  • Nunca inferir un país a partir de un prefijo telefónico o un idioma
  • Nunca rellenar un campo vacío con un valor predeterminado plausible

Un pipeline de cuatro etapas

La primera etapa es la normalización: recortar, colapsar espacios internos, reemplazar espacios de no separación, normalizar variantes de puntuación y decidir si se pasa a mayúsculas. Mantén el original intacto para la alternativa. La segunda etapa es la segmentación: dividir por comas cuando existan; de lo contrario, dividir según la gramática del país. La tercera etapa es la clasificación: etiquetar cada segmento como postal, región, ciudad, calle o unidad usando el conjunto de reglas del país. La cuarta etapa es la asignación: mapear etiquetas a campos, resolver conflictos y puntuar el resultado.

Mantener las etapas separadas hace que los modos de fallo sean separables. Un error de segmentación se ve distinto de un error de clasificación, y cada etapa se puede probar unitariamente con su propio corpus. También te permite detenerte antes: si el país es desconocido, omite la clasificación por completo y devuelve los segmentos con la confianza por campo marcada como desconocida.

  • Normalizar sin destruir el original
  • Segmentar primero por coma, después por gramática
  • Clasificar con un conjunto de reglas específico del país
  • Asignar, luego puntuar, luego decidir si aceptar

Orden de campos según el país

El orden de los campos es la mayor fuente de parseos incorrectos, porque los mismos tokens se mueven de lugar. Estados Unidos, Canadá, el Reino Unido y Australia colocan el código postal después de la ciudad. Alemania, Francia, los Países Bajos y Bélgica lo colocan antes de la ciudad. Japón lo coloca primero, antes de la prefectura. Brasil coloca el código postal después del estado con un separador.

Por eso el parser debe conocer el país antes de clasificar nada. Inferir el país a partir de la propia cadena es circular: el patrón postal puede sugerir uno, pero muchos patrones se solapan. Pide el país desde el formulario, la configuración regional o un selector explícito, y marca el parseo como de baja confianza cuando falte, en lugar de adivinarlo a partir de un token de dos letras que podría ser un estado o un país.

PaísOrdenEjemplo
Estados UnidosCalle, ciudad, ST ZIP1420 SW Alder St, Portland, OR 97205
CanadáCalle, ciudad, ST A1A 1A188 Queen St W, Toronto, ON M5H 2M5
AlemaniaCalle, ZIP ciudadUnter den Linden 77, 10117 Berlin
FranciaNúmero calle, ZIP ciudad12 Rue de Rivoli, 75004 Paris
Países BajosCalle número, ZIP ciudadDamrak 1, 1012 LG Amsterdam
JapónZIP, prefectura, ciudad, calle100-0001 Tokyo, Chiyoda, Chiyoda 1-1
BrasilCalle, ciudad - ST, ZIPAv. Paulista 1000, Sao Paulo - SP, 01310-100

Los casos ambiguos que vale la pena manejar

Los designadores de unidad secundaria son la ambigüedad más común. "Apt", "Ste", "Unit", "Fl" y "Rm" son fiables cuando van seguidos de un identificador, pero "Unit 5" también puede ser el nombre de una calle, y "Building 3" puede ser la dirección principal de un campus. Un parser debería extraer una unidad solo cuando el designador va seguido de un número o un token alfanumérico corto y aparece después del número de calle.

Los sufijos de calle son la segunda trampa. Un token como "Way", "Court" o "Park" puede ser un sufijo, un nombre de calle o una ciudad. Los direccionales tienen el mismo problema: "N" puede ser un predireccional, una abreviatura de nombre de calle o una región. Usa la posición relativa al número de casa y la estructura de comas, y cuando dos lecturas sean ambas plausibles, conserva el segmento original y baja la confianza en lugar de elegir.

EntradaLecturas plausiblesManejo seguro
12 Court StSufijo de calle o parte del nombreConservar la línea de calle completa
Unit 5, 100 Main StUnidad antes de la calleAsignar unidad, conservar calle
100 N Park AveDireccional más sufijoConservar los tokens de calle en orden
Springfield Rd, SpringfieldSufijo en el nombre de la ciudadPreferir el límite de la coma
Tokyo, Chiyoda 1-1Ciudad y bloqueUsar la gramática del país
Apt 4B 12 MainUnidad sin comaExtraer y luego volver a puntuar

Puntuación de confianza y umbrales

Puntúa cada campo y luego el registro. Un campo tiene alta confianza cuando coincidió con un patrón anclado del país y su posición concordó con el orden esperado. Tiene confianza media cuando el patrón coincidió pero la posición se infirió, y baja cuando se asignó por eliminación. Un registro solo tiene alta confianza cuando todos los campos obligatorios son de alta confianza y no hay segmentos sin ubicar.

Establece un umbral y hazlo cumplir. Por encima del umbral, acepta y almacena. Por debajo, conserva la cadena original y marca el registro para revisión en lugar de escribir una suposición en las columnas estructuradas. Expón la puntuación y los motivos en la respuesta de la API, porque el revisor necesita saber qué campo falló, no solo que algo falló.

CampoSeñal de alta confianzaSeñal de baja confianza
PostalCoincidencia anclada, posición correctaPatrón coincidente pero desplazado
RegiónCódigo conocido para el paísToken de dos letras sin coincidencia
CiudadA la izquierda del postal o a la derecha de la calleAsignada por eliminación
CalleContiene un número de casa y un nombreNombre sin número
UnidadDesignador más identificador después de la calleDesignador dentro del nombre de la calle

Estados de error que deberías devolver

Un resultado de parseo debería tener resultados explícitos, no un booleano. País faltante significa que la gramática no puede ejecutarse. Código postal faltante importa en países que lo tienen y es normal en Hong Kong y los EAU. Un segmento no ubicable significa que la estructura de comas y la gramática no concuerdan, y el registro necesita ojos humanos.

Asigna a cada resultado un código estable para que los llamadores puedan ramificar sin analizar texto libre. Devuelve la entrada normalizada, la entrada original, los valores de los campos con su confianza y la lista de segmentos sin ubicar. Ese payload permite que una interfaz resalte el token exacto que falló en lugar de mostrar un error genérico en la parte superior del formulario.

  • MISSING_COUNTRY: no hay gramática disponible, no adivines
  • MISSING_POSTAL: un error donde el país tiene códigos, normal donde no los tiene
  • UNPLACED_SEGMENT: una parte delimitada por comas no coincidió con ningún campo
  • AMBIGUOUS_UNIT: un designador de unidad con más de una lectura
  • REGION_MISMATCH: código de región no válido para el país proporcionado

Construir un corpus de referencia y mutarlo

Empieza con un corpus pequeño verificado a mano, de una a tres direcciones por país, cada una con los valores de campo esperados escritos por alguien que lee el correo de ese país. De veinte a cuarenta casos es suficiente para detectar regresiones estructurales y lo bastante pequeño para revisarlo en una pull request. Guárdalo como datos, no como aserciones enterradas en el código de prueba.

Luego muta cada caso mecánicamente: quita comas, cambia mayúsculas y minúsculas, colapsa espacios dobles, inserta un espacio de no separación, intercambia dos líneas, abrevia un sufijo y añade una unidad. La salida esperada de una mutación no siempre es idéntica, pero debería mantenerse dentro de una tolerancia definida, y la confianza debería bajar en lugar de que los campos cambien en silencio. Registra la precisión y la exhaustividad por campo para que una corrección de ciudad no rompa el postal sin que se note.

MutaciónCambio de ejemploComportamiento esperado
Quitar comas1420 SW Alder St Portland OR 97205Mismos campos, menor confianza
Minúsculasportland, or 97205Mismos campos tras la normalización
Espacio doblePortland, OR 97205Mismos campos, espacios colapsados
NBSP entre ciudad y estadoPortland, OR con U+00A0Mismos campos, NBSP normalizado
Intercambiar ciudad y regiónOR Portland 97205Marcado, no intercambiado en silencio
Truncar la calle1420 SW AlderCalle conservada, ciudad aún encontrada

Cuándo no parsear en absoluto

No parsees notas de forma libre, instrucciones de entrega ni nada que un humano haya escrito como prosa. "Leave at the side gate, second house after the blue one" no tiene campos, y extraer tokens de ahí produce basura con mucha confianza. Guárdalo como un bloque de texto adjunto al pedido.

No parsees escrituras que tu conjunto de reglas no cubra. Una dirección japonesa en kanji necesita una gramática japonesa; ejecutar un tokenizador de escritura latina sobre ella dividirá en los límites equivocados y perderá la prefectura. No parsees direcciones que no tengan número de calle o que usen un nombre de edificio como localizador principal, lo cual es común en partes de Asia y en direcciones de campus. En todos estos casos, la salida correcta es la cadena original más un estado claro de "no parseado".

  • Instrucciones de entrega: guardar como texto, nunca como campos
  • Escrituras no admitidas: devolver el original con un estado explícito
  • Direcciones con nombre de edificio: no forzar un número de casa
  • PO boxes y rutas rurales: parsear con una regla específica del país, no genérica
  • Cualquier cosa ya estructurada: validarla en lugar de volver a parsearla

Preguntas

¿Puede un parser de direcciones garantizar campos correctos?+
No. Recupera la estructura presente en el texto y puntúa su propia confianza. Los campos que nunca se escribieron no se pueden recuperar, y el parseo nunca demuestra que una dirección sea real.
¿Por qué importa el país antes de parsear?+
El orden de los campos varía: Alemania y Japón colocan el código postal antes de la ciudad, Japón lo coloca primero y Estados Unidos lo coloca al final. Sin un conjunto de reglas por país, los mismos tokens se asignan a los campos equivocados.
¿Qué debería hacer un parser con baja confianza?+
Conservar la cadena original, devolver los campos parciales con sus puntuaciones y marcar el registro para revisión. Escribir una suposición en columnas estructuradas pierde la única copia fiable de la entrada.
¿Cuántas direcciones de prueba necesito?+
De veinte a cuarenta casos verificados a mano, de uno a tres por país, más mutaciones mecánicas. Es suficiente para detectar regresiones estructurales sin crear un corpus que nadie revisa.
¿El sitio parsea direcciones por mí?+
La herramienta de parser de direcciones expone el modelo de campos y las reglas de formato. No verifica la entregabilidad ni afirma que los campos parseados describan una ubicación real.

Los ejemplos son sintéticos. No utilices una dirección generada para verificaciones de identidad, registro de cuentas ni entregas.

Estándares de referencia

Leer a continuación

Todas las guías