¿Cómo funcionan los fuzzy matches? Explicación muy básica

Hace algún tiempo, cuando me dio por desarrollar mi propia herramienta de traducción asistida, estuve investigando sobre cómo se calculaban los fuzzy matches / concordancias parciales. Quería saber cuál era la magia que se ocultaba tras esa sencilla combinación de teclas que recuperaba traducciones de segmentos parecidos al que estabas traduciendo.

Lo cierto es que, el método empleado, por suerte, no es ningún misterio. Aunque cada herramienta lo ha personalizado y configurado a su gusto, añadiendo o quitando parámetros y opciones, todas ellas parten de una misma base: la distancia de edición o distancia de Levenshtein.

¿Qué es la distancia de edición?
Si acudimos a Wikipedia, la definición que encontramos es la siguiente:

[La distancia de edición] es el número mínimo de operaciones requeridas para transformar una cadena de caracteres en otra, se usa ampliamente en teoría de la información y ciencias de la computación.

Respecto a las operaciones mencionadas en la definición, se añade:

Se entiende por operación, bien una inserción, eliminación o la sustitución de un carácter.

¿Cómo se calcula la distancia de edición?
Se emplea un algoritmo ideado por Vladimir Levenshtein en 1965 (tecnología punta, como se puede apreciar), de ahí que la Distancia de edición sea más conocida en el mundillo informático como Distancia de Levenshtein.
No voy a poner el código, pero se puede consultar aquí adaptado a la mayoría de lenguajes de programación que se usan en la actualidad.
Básicamente, y como ya he mencionado, este algoritmo calcula los cambios que tiene que sufrir una cadena para convertirse en otra.

¿Cómo acaba esto convertido en un fuzzy match?
Las cadenas sobre las que se calcula la distancia de edición son el segmento original con el que estás trabajando y el resto de segmentos del proyecto o memoria de traducción. De este modo, se calcula la distancia de edición y, para aquellos casos en los que la distancia de edición es inferior al 70% (el umbral estándar que hay en la mayoría de herramientas de traducción asistida), se almacena una referencia a dicho segmento para recuperar su traducción en caso de necesitarla.

¿Es así de sencillo?
Sí y no. Este es el funcionamiento básico, a partir del cual se parte. Pero, como ya se ha comentado más arriba, existen variaciones y personalizaciones que juegan con este algoritmo como base y lo mejoran. Por ejemplo, existe la Distancia de Damerau-Levenshtein, que calcula de forma diferente el número de operaciones requeridas para transformar una cadena en otra y, por tanto, ofrece otros resultados.

Fuentes:
Distancia de Levenshtein

¿Qué os ha parecido que la principal característica de las herramientras de traducción asistida se base en una idea de 1965? :slight_smile:

6 me gusta

¡Qué tema tan interesante, @Arturo! Muchas gracias por compartir tu conocimiento aquí con todos. :smiley:

Veo que no fui el único loco al que se le ocurrió hacer una herramienta de este estilo. Por suerte desistí al poco tiempo de pensarlo, sobre todo porque el plan era desarrollarlo en Visual Basic (concretamente como complemento para Excel), je, je.

Imaginaba que al final todo se basa en una comparación de caracteres y palabras similares; lo malo es que eso puede dar lugar a falsos positivos generalmente. ¿Sabes si se puede consultar en algún lado la evolución de este algoritmo? Aunque entiendo que en realidad no ha cambiado demasiado. Sí que es cierto que ahora tenemos el contexto de cada cadena, por lo que dependiendo del segmento anterior y posterior al actual, podemos obtener más o menos precisión (o, mejor dicho, una coincidencia parcial más útil).

No sé si está exactamente relacionado con esto, pero lo que me fascina es cómo existe ahora la posibilidad de autocompletar traducciones según lo que haya en la memoria. Parece una tontería, pero cuando tienes una memoria grande, te ahorra cierto trabajo (al menos con Memsource).

Dicho esto, por mi experiencia, a veces los fuzzy matches los carga el diablo. No sé si me ahorran tanto tiempo, porque al final acabo mirándolos con lupa. No es la primera vez que se me cuela un error por no fijarme del todo bien en cuáles eran los cambios exactos… ¿A alguien más le ha pasado eso? :sweat_smile:

1 me gusta

Oh, es una pena. Habría estado bien ver eso :stuck_out_tongue: Yo sí acabé de programarlo, pero era una herramienta muy concreta para un proyecto muy concreto, ya hablaremos de eso en otro contexto :slight_smile:

Pues lo desconozco, pero tengo tanto interés como tú. Que yo sepa, todas parten de modificaciones de Levenshtein, pero claro, nunca vamos a tener acceso a los cambios que hayan hecho… :frowning:

Esto también me ha llamado la atención a mí, me imagino que se hará con búsquedas relativas a partir de segmentos fragmentados pero no tengo ni idea, lo tengo pendiente de investigar.

:raising_hand_man:

1 me gusta

Claro, ¡ya me contarás! Yo también he hecho cosillas para usos concretos y la verdad es que es impresionante lo que se puede llegar a hacer en la automatización de tareas. :slight_smile:

A ver si la inteligencia artificial ayuda en algo a las memorias de traducción… Hoy en día parece que todo es IA, es tremendo. :grin:

1 me gusta

Interesantísimos los intríngulis e interioridades de los algoritmos que tanto nos ayudan y que tan claramente ha explicado @Arturo.

2 me gusta