También disponible en: English · Português · Français · العربية
Similitud de textos: siete medidas en paralelo
Todas las medidas habituales de similitud entre cadenas calculadas a la vez, para que veas cuál necesita de verdad tu problema.
¿Qué es la similitud de textos?
La similitud de textos es un número que dice cuánto se parecen dos cadenas, normalmente escalado de forma que 1 es idéntico y 0 no tiene nada en común. Es lo que hay debajo de la búsqueda difusa, de limpiar duplicados en una lista de clientes, de cazar una errata en un código de producto y de casar un nombre tecleado por una persona con otro guardado en una base de datos.
El problema es que no hay una única definición. Levenshtein cuenta cuántas ediciones de un carácter separan a las dos. Jaro cuenta caracteres coincidentes y cuánto están desordenados. Dice y Jaccard ignoran la posición por completo y comparan conjuntos de pares de letras contiguas. La subsecuencia común más larga pregunta cuánto de una cadena sobrevive dentro de la otra en orden. Son preguntas distintas y dan respuestas distintas.
Esta página calcula siete a la vez en lugar de elegir una por ti, porque elegir una es la decisión de verdad y casi siempre se toma sin darse cuenta.
Cómo usarla
- Pon dos cadenas en los cuadros de arriba. Todas las medidas puntúan el par al instante, con el recuento de ediciones en bruto al lado de las dos que se basan en distancias.
- Después prueba el panel de ordenación. Dale algo que buscar y una lista de candidatas, una por línea. Cada medida ordena la lista por su cuenta e informa de su ganadora.
- Mira discrepar a las ganadoras. La línea de debajo de esa tabla cuenta cuántas respuestas distintas salieron de una sola lista. Cuando dice más de una, la medida que habrías elegido estaba haciendo trabajo de verdad.
Cuánto discrepan, medido
No es una preocupación teórica. Tomando el código fuente de este sitio como corpus y sacando tríos aleatorios de identificadores en camelCase, Levenshtein y Jaro-Winkler colocan las mismas dos candidatas en orden distinto el 27,7% de las veces sobre 3.479 pares. Frente a la medida Ratcliff/Obershelp que usa difflib de Python, Levenshtein discrepa en el 25,5%.
El efecto es peor en el caso que la gente construye de verdad: elegir la coincidencia más cercana de una lista. Eligiendo entre un grupo de 400 candidatas, Levenshtein y Jaro-Winkler nombraron ganadora distinta en el 62% de las consultas. Esa cifra depende del tamaño del grupo, así que toma el 27,7% como el titular honesto y esta otra como demostración de hacia dónde se mueve.
El ejemplo cargado por defecto es el caso clásico. Busca la errata recieve entre receive, relieve, reprieve, retrieve y recipe. Levenshtein a secas prefiere relieve, porque está a una sustitución mientras que receive está a dos ediciones: las letras estaban intercambiadas y Levenshtein no tiene concepto de intercambio. Damerau-Levenshtein, que cuenta cambiar dos caracteres contiguos como una sola edición, puntúa receive y relieve igual con 0,857 y elige la primera de las dos. Jaro-Winkler pone receive estrictamente arriba con 0,967. Tres comportamientos de una misma lista, y solo uno te da la palabra que querías.
¿Cuál deberías usar?
Para erratas humanas, Damerau-Levenshtein suele ser mejor opción por defecto que Levenshtein a secas, porque intercambiar dos letras es uno de los fallos más frecuentes y Levenshtein lo cobra el doble. Para nombres, Jaro-Winkler se diseñó justo para eso en la oficina del censo de Estados Unidos, y su bonificación por prefijo refleja que la gente acierta el principio de un nombre mucho más que el final.
Para textos más largos donde se mueven palabras enteras, las medidas de conjuntos van mejor. Dice y Jaccard comparan bolsas de pares de letras contiguas, así que reordenar les importa mucho menos, y ordenan igual entre sí: Jaccard simplemente puntúa siempre más bajo para el mismo par, lo que sorprende a quien compara umbrales copiados de sitios distintos.
La única generalización honesta es que un umbral no es transferible. Un corte de 0,8 significa algo bastante distinto con Jaccard que con Jaro-Winkler, y para el par MARTHA y MARHTA cargado arriba las puntuaciones van de 0,250 a 0,961 según a qué medida preguntes. Cualquier umbral que heredes de una entrada de blog va pegado a una medida, y la medida casi nunca se indica.
Lo que esta página no puede decirte
Ninguna de estas medidas entiende el significado. Gato y felino puntúan casi cero; colour y color puntúan alto. Si necesitas saber que dos frases dicen lo mismo con otras palabras, la similitud entre cadenas es la herramienta equivocada y ningún umbral la va a salvar.
También se basan en caracteres, y carácter aquí significa punto de código y no lo que tú llamarías una letra. Eso arregla el fallo habitual de que un emoji cuente como dos caracteres y dos emojis distintos salgan a dos ediciones, pero se queda corto de los grupos de grafemas: una bandera o un emoji con tono de piel siguen siendo varios puntos de código, y las definiciones clásicas de estas medidas no entran ahí.
Por último, el panel de ordenación resuelve los empates por orden de entrada. Cuando dos candidatas puntúan igual gana la que esté más arriba en tu lista, y eso es una propiedad de esta herramienta y no de la medida. Se muestran las puntuaciones para que veas cuándo ha pasado.
¿Por qué es gratis?
Las siete medidas son unas pocas decenas de líneas de aritmética que se ejecutan en tu navegador. Nada de lo que escribes se sube, no se registra nada y no hay cuenta que crear.
Sin registro, sin límites y sin marca de agua en nada de lo que copies.