Clase Fonetica: anatomía de una solución criolla de búsqueda fonética
Anatomía de la clase Fonetica: una solución criolla en C# para convertir nombres en códigos fonéticos y buscar coincidencias útiles.

Lic. Carlos Enrique Loria Beeche.

Fuente histórica de mi biblioteca de controles

Esta entrada es un complemento técnico del artículo Raíces fonéticas: cuando un nombre encuentra a la persona correcta.

En aquel artículo expliqué cómo una búsqueda fonética inspirada en técnicas como Soundex podía ayudar a encontrar personas aunque sus nombres estuvieran escritos de forma distinta. Aquí quiero bajar un nivel más y mirar la anatomía de una clase concreta: una clase que formó parte de mi biblioteca de controles y que ayudaba a convertir nombres escritos por personas en códigos fonéticos útiles para buscar coincidencias.

La clase se llama Fonetica. Probablemente nació originalmente en C++, hacia finales de los años ochenta o principios de los noventa, cuando trabajaba en sistemas de reservaciones y recepción hotelera. Más adelante, con la llegada de C# y el ecosistema .NET, la convertí a una clase reutilizable dentro de mi software.

No era una implementación pura de Soundex. Era una solución propia, criolla, inspirada en búsquedas fonéticas y adaptada a problemas reales: nombres escritos de distintas maneras, tildes omitidas, apellidos incompletos, errores de digitación y variaciones de pronunciación.

El nombre seguía siendo humano; el código fonético era una pista para que el sistema pudiera buscar mejor.

Investigar también depende de las herramientas y de las personas

Antes de entrar en la anatomía de la clase, quiero dejar claro algo: esta solución no nació de la nada. Nació de años de trabajo, de curiosidad técnica, de investigación y también de la ayuda de personas que, en momentos importantes, me mostraron caminos nuevos.

En aquellos años, investigar un tema técnico no era como hoy. La búsqueda tradicional significaba ir a una biblioteca, conocer autores, buscar títulos, revisar índices, conseguir manuales o esperar revistas técnicas. El conocimiento llegaba, pero muchas veces llegaba con rezago.

Por eso quiero agradecer a Miguel Fonseca Borrasé. Miguel fue una de las personas que me ayudó a descubrir herramientas que, para la época, eran verdaderas ventanas al mundo. Me enseñó a usar Gopher y Archie, herramientas que permitían explorar servidores, recorrer directorios, localizar archivos y encontrar información técnica distribuida en universidades y centros de cómputo.

Gracias a ese tipo de búsquedas era posible investigar temas como Soundex, algoritmos, protocolos, sockets y técnicas de programación. No era tan inmediato como abrir un buscador moderno, pero para quienes estábamos aprendiendo y construyendo software, era una puerta inmensa.

Recuerdo que usaba esas herramientas para investigar en un servidor de la Escuela de Ciencias de la Computación e Informática de la Universidad de Costa Rica llamado Chacal. En aquellos tiempos parecía casi obligatorio que todo centro de cómputo tuviera un servidor llamado Wolf; pero en la ECCI, con carácter propio, teníamos Chacal.

Más adelante, también con Miguel, vi por primera vez herramientas como Mosaic y Netscape, cuando apenas empezaba a tomar forma visible la World Wide Web.

Uno no aprende solo. Siempre hay alguien que enseña una herramienta, abre una puerta o deja una curiosidad sembrada.

Por eso esta clase Fonetica no representa solamente una pieza de código. También representa una época: una forma de investigar, de buscar conocimiento, de experimentar y de convertir ideas encontradas en soluciones útiles para problemas reales.

Fuente original de la clase

Para quienes quieran revisar el código completo, he publicado la fuente en formato de texto. Lo rotulo como fuente original porque corresponde al código de la clase, aunque el archivo se haya subido como .txt para facilitar su publicación y descarga desde WordPress.

Descargar fuente original de la clase Fonetica

La idea central

La clase recibe un nombre escrito por una persona y lo transforma en una representación fonética numérica. Esa representación no pretende reemplazar el nombre original. Su función es ayudar al sistema a comparar nombres y encontrar posibles coincidencias.

En el comentario original de la clase aparece un ejemplo que resume muy bien la intención:

'Carlos Loria Beeche' --- '1962 69 42'

Es decir:

Carlos  → 1962
Loria   → 69
Beeche  → 42

El resultado final:

Carlos Loria Beeche → 1962 69 42

Ese código no está hecho para que una persona lo lea como si fuera un nombre. Está hecho para que el sistema pueda buscar mejor.

Vista general de la clase

La imagen destacada de esta entrada muestra el diseño top-down de la clase. Vista desde arriba, la lógica es sencilla:

Nombre escrito
     ↓
codigoFonetico(nombre)
     ↓
fonemas(nombre)
     ↓
tokenAfonema(token)
     ↓
consonanteAFonema(char)
     ↓
Código fonético resultante

La clase separa el problema en pasos pequeños. Primero recibe el nombre completo. Luego lo divide en palabras. Después transforma cada palabra en una secuencia fonética. Finalmente une esos resultados para producir el código completo.

Una buena solución no siempre nace de una gran función complicada; muchas veces nace de dividir bien el problema.

Primera parte: estructura general y entrada

La primera parte de la clase contiene el namespace, la declaración de la clase, las tablas internas de equivalencia y los métodos principales de entrada.

Estructura general de la clase Fonetica
Estructura general de la clase: constantes fonéticas, método codigoFonetico y método fonemas.

La clase utiliza varias cadenas internas que funcionan como tablas de conversión:

AX            → letras o grupos de letras relevantes
AY            → códigos fonéticos equivalentes
consonantes   → caracteres considerados consonantes útiles
vocales       → vocales usadas para reglas especiales

La idea es crear un mapa entre letras y grupos fonéticos. Por ejemplo, letras como C, K y Q pueden acercarse porque, en muchos nombres, pueden representar sonidos similares.

El método principal es:

codigoFonetico(nombre)

Ese método llama a:

fonemas(nombre)

Y fonemas(nombre) divide el nombre completo en palabras. Por ejemplo:

Carlos Loria Beeche
     ↓
Carlos
Loria
Beeche

Cada palabra se envía a tokenAfonema(token), donde se aplican las reglas fonéticas más importantes.

Segunda parte: tokenAfonema y las primeras reglas

El método tokenAfonema trabaja con una sola palabra, es decir, con un token sin espacios. Por ejemplo: Carlos, Loria o Beeche.

Primero convierte el token a mayúsculas y lo transforma en un arreglo de caracteres. Eso permite recorrer la palabra letra por letra y tomar decisiones según el contexto.

Reglas iniciales de tokenAfonema en la clase Fonetica
Reglas iniciales de tokenAfonema: preparación del token, tratamiento de Y y detección de LL.

En esta etapa aparecen reglas propias de la fonética del español y de los nombres que se encontraban en recepción.

Por ejemplo, la doble LL se trata como un fonema especial:

LL → fonema 5

Esto permite que la clase no vea simplemente dos letras L separadas, sino un sonido que puede tener identidad propia dentro del nombre.

También aparece la regla de la Y. La intención del comentario original es importante: la Y puede comportarse de forma distinta según su contexto. Puede sonar como vocal, o puede acercarse al sonido de LL cuando va seguida de vocal.

Este tipo de reglas muestran que la clase no se limita a eliminar caracteres. Intenta interpretar ciertos sonidos.

La búsqueda fonética no consiste solo en quitar letras; consiste en decidir qué diferencias importan para encontrar mejor.

Tercera parte: la letra C y las consonantes repetidas

Una de las reglas más interesantes está en el tratamiento de la letra C.

La C no siempre suena igual. Depende de la letra que viene después. Por eso la clase distingue varios casos.

Reglas de C y consonantes repetidas en la clase Fonetica
Reglas de C y consonantes repetidas: la C se interpreta según la letra siguiente.

La lógica puede resumirse así:

CH      → sonido CH
CA      → sonido cercano a K
CO      → sonido cercano a K
CU      → sonido cercano a K
CK      → sonido cercano a K
CE      → sonido cercano a S
CI      → sonido cercano a S

Esto tiene mucho sentido en una búsqueda fonética. Una C seguida de A, O o U no se comporta igual que una C seguida de E o I.

Por ejemplo:

Casa    → C con sonido K
Coco    → C con sonido K
César   → C con sonido S
Ciro    → C con sonido S
Chepe   → CH como sonido propio

La clase también reduce consonantes repetidas. Si encuentra dos consonantes iguales seguidas, conserva una representación fonética y elimina la repetición.

Consonante repetida
     ↓
Se conserva una representación
     ↓
Se reduce ruido en la comparación

Esto ayuda a acercar nombres que pudieron haber sido escritos con letras duplicadas por error o por variación ortográfica.

Cuarta parte: limpieza final y mapeo de consonantes

Después de aplicar reglas especiales, la clase hace una limpieza final. Recorre la cadena, convierte consonantes pendientes a fonemas, elimina espacios en blanco innecesarios y compacta el resultado.

Limpieza final y mapeo de consonantes en la clase Fonetica
Limpieza final: compactación del resultado y conversión de consonantes a códigos fonéticos.

El método clave en esta etapa es:

consonanteAFonema(char x)

Este método busca la consonante dentro de la tabla AX y devuelve el carácter equivalente desde AY.

En forma conceptual, el mapa fonético queda así:

CKQ           → 1
CH/S/X/Z      → 2
D/T           → 3
B/V/W         → 4
G/J/Y/LL      → 5
F/L           → 6
M/N/Ñ         → 7
P             → 8
R             → 9

Si el carácter no aparece como consonante reconocida, la función devuelve un blanco. En la práctica, eso elimina vocales y caracteres especiales que no aportan al código fonético.

Construyendo el ejemplo: Carlos Loria Beeche

Ahora podemos entender el ejemplo original de la clase:

'Carlos Loria Beeche' --- '1962 69 42'

Carlos → 1962

En Carlos, la C inicial se trata como sonido cercano a K porque va seguida de A. Luego se conservan sonidos relevantes como R, L y S. Las vocales desaparecen durante el proceso.

C A R L O S
↓   ↓ ↓   ↓
1   9 6   2

Carlos → 1962

Loria → 69

En Loria, las letras relevantes son principalmente L y R. Las vocales se eliminan.

L O R I A
↓   ↓
6   9

Loria → 69

Beeche → 42

En Beeche, la B se transforma en el grupo fonético 4. La combinación CH se transforma en el grupo fonético 2. Las vocales se eliminan.

B E E C H E
↓     ↓
4     2

Beeche → 42

Por eso el nombre completo termina convertido en:

Carlos Loria Beeche → 1962 69 42

El resultado no reemplaza el nombre. Lo acompaña como una clave fonética para buscar coincidencias.

Por qué esta clase era útil

En un sistema de reservaciones, un huésped podía aparecer escrito de muchas maneras:

Carlos
Karlos
Karl
Carlo
C. Loria
Carlos Loría
Carlos Loria Beeche

Una búsqueda exacta podía fallar. Una búsqueda fonética podía acercar posibles coincidencias.

La clase Fonetica ayudaba a convertir nombres escritos de forma variable en códigos más comparables. Luego, combinada con la entidad Miembros, las raíces fonéticas y el motor de base de datos, el sistema podía presentar al usuario una lista de posibles perfiles relacionados.

La decisión final seguía siendo humana. El sistema no decía mágicamente “esta es la persona”. Lo que hacía era buscar mejor, reducir ruido y presentar mejores opciones.

La inteligencia no estaba en adivinar, sino en adaptarse mejor a la realidad de los nombres escritos por personas.

Una solución criolla, pero no improvisada

Esta clase resume bien lo que para mí significa una solución criolla bien entendida.

No era copiar un algoritmo internacional sin pensar. Tampoco era inventar desde cero ignorando lo que ya existía. Era estudiar ideas como Soundex, comprender el problema real, adaptar reglas al idioma y al negocio, y construir una herramienta útil para el sistema.

En ese sentido, la clase Fonetica no es solo una pieza de código. Es una pequeña muestra de cómo las estructuras de datos, las búsquedas fonéticas y la experiencia práctica pueden encontrarse en una solución concreta.

Cuando el software aprende a buscar de una forma más parecida a como las personas reconocen nombres, empieza a servir mejor.

Artículo relacionado

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *