10/04/2006
En el vasto universo del procesamiento de datos y el análisis de texto, a menudo nos encontramos con la necesidad de comparar cadenas de texto. Ya sea para corregir errores ortográficos, encontrar duplicados, agrupar elementos similares o incluso en aplicaciones de bioinformática, medir la "distancia" o "similitud" entre dos secuencias es una tarea fundamental. Aquí es donde entra en juego TextDistance, una poderosa y versátil librería de Python diseñada específicamente para este propósito.

TextDistance se presenta como una navaja suiza para la comparación de secuencias. Con una implementación pura en Python, más de 30 algoritmos diferentes bajo el capó y una interfaz de uso increíblemente sencilla, se convierte en una herramienta indispensable en el arsenal de cualquier desarrollador que trabaje con datos de texto. En esta guía completa, exploraremos a fondo cómo instalar, utilizar y sacar el máximo provecho de esta fantástica librería.
¿Qué es y Por Qué Usar TextDistance?
TextDistance es una librería que ofrece un conjunto completo de algoritmos para calcular la distancia de similitud entre dos o más secuencias. Su filosofía se centra en la simplicidad y la potencia, permitiendo a los desarrolladores acceder a métricas complejas con apenas unas pocas líneas de código.
Sus características principales la hacen destacar:
- Extensa Colección de Algoritmos: Incluye más de 30 algoritmos, desde los clásicos basados en edición como Levenshtein hasta métodos fonéticos como MRA o basados en compresión como NCD.
- Implementación Pura en Python: Funciona de manera nativa sin dependencias complejas, lo que facilita su instalación y uso en cualquier entorno.
- Uso Sencillo e Intuitivo: Todos los algoritmos comparten una interfaz común y fácil de aprender.
- Comparación Múltiple: Permite comparar más de dos secuencias a la vez, una característica no siempre presente en otras librerías.
- Optimización de Velocidad: Aunque su base es Python puro, puede utilizar librerías externas escritas en C (si están instaladas) para alcanzar la máxima velocidad posible en algoritmos críticos.
Instalación de TextDistance
La instalación es muy sencilla y se realiza a través de pip. Sin embargo, existen diferentes variantes según tus necesidades de rendimiento.
Instalación Estándar
Para la versión básica con la implementación pura en Python, que es suficiente para muchas tareas y para empezar a experimentar, simplemente ejecuta:
pip install textdistanceInstalación con Extras para Máximo Rendimiento
Si planeas usar TextDistance en un entorno de producción o con grandes volúmenes de datos, es altamente recomendable instalarla con las dependencias opcionales. Esto permitirá a la librería utilizar implementaciones externas mucho más rápidas para los algoritmos más comunes.
pip install "textdistance[extras]"Instalación para Algoritmos Específicos
También puedes instalar las optimizaciones solo para los algoritmos que necesites. Por ejemplo, si solo te interesa la distancia de Hamming:
pip install "textdistance[Hamming]"Los algoritmos que actualmente se benefician de estas optimizaciones son: DamerauLevenshtein, Hamming, Jaro, JaroWinkler y Levenshtein.
Uso Básico y Métodos Fundamentales
Una de las grandes ventajas de TextDistance es su API consistente. Todos los algoritmos se pueden utilizar de dos maneras y comparten un conjunto de métodos comunes.

Tomemos como ejemplo la distancia de Hamming, que cuenta el número de posiciones en las que dos cadenas de igual longitud son diferentes.
import textdistance # Forma 1: Llamada directa al algoritmo # Calcula la distancia (1, porque 'e' y 'x' son diferentes) print(textdistance.hamming('test', 'text')) # Forma 2: Instanciando la clase del algoritmo hamming_instance = textdistance.Hamming() # Métodos comunes disponibles en la instancia # .distance(): Calcula la distancia entre secuencias # Devuelve 1 print(hamming_instance.distance('test', 'text')) # .similarity(): Calcula la similitud (caracteres iguales) # Devuelve 3 ('t', 's', 't') print(hamming_instance.similarity('test', 'text')) # .normalized_distance(): Distancia normalizada entre 0 y 1 # Devuelve 0.25 (1 diferencia / 4 caracteres totales) print(hamming_instance.normalized_distance('test', 'text')) # .normalized_similarity(): Similitud normalizada entre 0 y 1 # Devuelve 0.75 (3 similitudes / 4 caracteres totales) print(hamming_instance.normalized_similarity('test', 'text'))Este patrón se repite para todos los algoritmos de la librería, lo que hace que cambiar de un método a otro sea trivial.
Explorando la Variedad de Algoritmos
La verdadera potencia de TextDistance radica en su enorme catálogo de algoritmos. Se pueden agrupar en varias categorías, cada una adecuada para diferentes tipos de problemas.
Algoritmos Basados en Edición
Estos algoritmos miden la distancia en términos del número de operaciones (inserciones, eliminaciones, sustituciones) necesarias para transformar una cadena en otra. Son los más comunes para la corrección ortográfica y la detección de errores tipográficos.
| Algoritmo | Clase | Descripción Breve |
|---|---|---|
| Hamming | Hamming | Cuenta las posiciones en las que los caracteres son diferentes. Requiere cadenas de la misma longitud. |
| Levenshtein | Levenshtein | El famoso algoritmo que cuenta el número mínimo de ediciones (inserción, eliminación, sustitución) para cambiar una palabra por otra. |
| Damerau-Levenshtein | DamerauLevenshtein | Una extensión de Levenshtein que también considera la transposición de dos caracteres adyacentes como una sola edición. |
| Jaro-Winkler | JaroWinkler | Mide la similitud basándose en los caracteres compartidos y las transposiciones. Es especialmente bueno para nombres propios cortos. |
Algoritmos Basados en Tokens
Estos métodos dividen las cadenas en partes (tokens), que pueden ser palabras o n-gramas (secuencias de 'n' caracteres), y luego comparan los conjuntos de tokens. Son ideales para comparar documentos o frases.
Algoritmos Basados en Compresión (NCD)
La Distancia de Compresión Normalizada (NCD) es un concepto fascinante. La idea es que si dos cadenas son muy similares, se pueden comprimir juntas de manera más eficiente que por separado. TextDistance implementa esto usando varios algoritmos de compresión como ZLib, LZMA y BZ2.
Algoritmos Fonéticos
Estos algoritmos no comparan cómo se escriben las cadenas, sino cómo suenan. Son extremadamente útiles para buscar nombres que pueden tener múltiples ortografías pero una pronunciación similar (por ejemplo, "Smith" y "Smythe"). Algunos ejemplos en la librería son MRA y Editex.

Rendimiento: El Secreto está en los "Extras"
La implementación en Python puro es fantástica para la portabilidad, pero puede no ser la más rápida. Para tareas que requieren un alto rendimiento, la instalación con `extras` es crucial. TextDistance es lo suficientemente inteligente como para detectar si tienes instaladas librerías más rápidas (como `rapidfuzz` o `jellyfish`) y las usará automáticamente.
La diferencia de rendimiento es abismal. Aquí una tabla comparativa de ejemplo que ilustra la velocidad de ejecución para el algoritmo Levenshtein en diferentes librerías:
| Algoritmo | Librería Externa | Tiempo Relativo |
|---|---|---|
| Levenshtein | rapidfuzz | ~0.00099s (¡La más rápida!) |
| Levenshtein | Levenshtein | ~0.00122s |
| Levenshtein | jellyfish | ~0.00254s |
| Levenshtein | pylev | ~0.15688s |
| Levenshtein | textdistance (Python puro) | ~0.53902s (La más lenta) |
La conclusión es clara: para producción, siempre usa la instalación con `extras`. Si por alguna razón necesitas forzar el uso de la implementación interna, puedes hacerlo al instanciar la clase:
# Desactiva el uso de librerías externas rápidas lev = textdistance.Levenshtein(external=False)Preguntas Frecuentes (FAQ)
¿Qué es la distancia y la similitud normalizada?
La distancia o similitud "normalizada" es simplemente el valor del cálculo ajustado para que siempre esté en un rango de 0.0 a 1.0. Un valor de `normalized_similarity` de 1.0 significa que las cadenas son idénticas, y 0.0 que son completamente diferentes. Un `normalized_distance` de 0.0 significa que son idénticas, y 1.0 que son completamente diferentes. Esto es muy útil para comparar resultados entre diferentes algoritmos o longitudes de cadena de manera consistente.
¿Cuándo debería usar un algoritmo basado en edición vs. uno fonético?
Usa un algoritmo basado en edición (como Levenshtein) cuando esperas errores tipográficos o pequeñas variaciones en la escritura (ej: "programación" vs. "programacion"). Usa un algoritmo fonético (como MRA) cuando buscas nombres o palabras que suenan igual pero se escriben diferente (ej: "Juan" vs. "Jhon").
¿Puedo comparar más de dos secuencias a la vez?
¡Sí! Esta es una de las grandes características de TextDistance. Simplemente pasa todas las secuencias que quieras comparar a los métodos.
# Calcular la distancia de Levenshtein entre tres palabras textdistance.levenshtein('test', 'text', 'tempest')¿Cómo puedo personalizar el comportamiento de un algoritmo?
Al instanciar la clase de un algoritmo, puedes pasarle argumentos. El más común es `qval`, que se usa en algoritmos basados en tokens para definir el tamaño de los n-gramas. Por defecto, `qval=1` compara por caracteres. Si lo cambias a `qval=2`, comparará por bigramas (grupos de dos caracteres).
# Comparación por caracteres (distancia = 2) textdistance.Hamming()('test', 'text') # Comparación por bigramas ('te','es','st') vs ('te','ex','xt') # La distancia es 2 porque 'es'!='ex' y 'st'!='xt' textdistance.Hamming(qval=2)('test', 'text')Conclusión
TextDistance es una librería robusta, bien diseñada y extremadamente útil para cualquier tarea que implique la comparación de cadenas de texto en Python. Su facilidad de uso, combinada con la vasta cantidad de algoritmos disponibles y la capacidad de optimizar el rendimiento mediante dependencias externas, la convierten en la opción preferida para principiantes y expertos por igual. La próxima vez que necesites encontrar duplicados, implementar un corrector ortográfico o simplemente medir qué tan parecidas son dos frases, no dudes en darle una oportunidad a TextDistance.
Si quieres conocer otros artículos parecidos a Guía Completa de la Librería TextDistance en Python puedes visitar la categoría Juegos.
