Estoy buscando una biblioteca de JavaScript de búsqueda difusa para filtrar una matriz. Intenté usar fuzzyset.js y fuse.js , pero los resultados son terribles (hay demostraciones que puede probar en las páginas vinculadas).
Después de leer un poco sobre la distancia de Levenshtein, me parece una mala aproximación de lo que buscan los usuarios cuando escriben. Para aquellos que no lo saben, el sistema calcula cuántas inserciones , eliminaciones y sustituciones se necesitan para hacer coincidir dos cadenas.
Un defecto obvio, que se corrige en el modelo de Levenshtein-Demerau, es que tanto el blub como el boob se consideran igualmente similares al bulbo (cada uno requiere dos sustituciones). Sin embargo, está claro que bulb es más similar a blub que boob , y el modelo que acabo de mencionar lo reconoce al permitir transposiciones .
Quiero usar esto en el contexto de la finalización de texto, por lo que si tengo una matriz ['international', 'splint', 'tinder']
y mi consulta es int , creo que internacional debería tener una clasificación más alta que la tablilla , aunque la primera tiene una puntuación (más alta = peor) de 10 frente al 3 de este último.
Entonces, lo que estoy buscando (y crearé si no existe) es una biblioteca que haga lo siguiente:
- Pesa las diferentes manipulaciones de texto
- Pesa cada manipulación de manera diferente dependiendo de dónde aparecen en una palabra (las manipulaciones tempranas son más costosas que las manipulaciones tardías)
- Devuelve una lista de resultados ordenados por relevancia.
¿Alguien se ha encontrado con algo como esto? Me doy cuenta de que StackOverflow no es el lugar para pedir recomendaciones de software, pero implícito (¡ya no!) En lo anterior es: ¿estoy pensando en esto de la manera correcta?
Editar
Encontré un buen artículo (pdf) sobre el tema. Algunas notas y extractos:
Las funciones afines de distancia de edición asignan un costo relativamente menor a una secuencia de inserciones o eliminaciones
la función de distancia de Monger-Elkan (Monge y Elkan 1996), que es una variante afín de la función de distancia de Smith-Waterman (Durban et al. 1998) con parámetros de costo particulares
Para la distancia de Smith-Waterman (wikipedia) , "En lugar de mirar la secuencia total, el algoritmo de Smith-Waterman compara segmentos de todas las longitudes posibles y optimiza la medida de similitud". Es el enfoque de n-gramas.
Una métrica muy similar, que no se basa en un modelo de distancia de edición, es la métrica de Jaro (Jaro 1995; 1989; Winkler 1999). En la literatura sobre vinculación de registros, se han obtenido buenos resultados utilizando variantes de este método, que se basa en el número y el orden de los caracteres comunes entre dos cadenas.
Una variante de esto debido a Winkler (1999) también usa la longitud P del prefijo común más largo
(parece estar destinado principalmente a cadenas cortas)
Para completar el texto, los enfoques de Monger-Elkan y Jaro-Winkler parecen tener más sentido. La adición de Winkler a la métrica de Jaro pondera de manera efectiva los comienzos de las palabras más. Y el aspecto afín de Monger-Elkan significa que la necesidad de completar una palabra (que es simplemente una secuencia de adiciones) no la desaprovechará demasiado.
Conclusión:
la clasificación TFIDF se desempeñó mejor entre varias métricas de distancia basadas en tokens, y una métrica de distancia de edición de brecha afín sintonizada propuesta por Monge y Elkan se desempeñó mejor entre varias métricas de distancia de edición de cadenas. Una métrica de distancia sorprendentemente buena es un esquema heurístico rápido, propuesto por Jaro y luego ampliado por Winkler. Esto funciona casi tan bien como el esquema Monge-Elkan, pero es un orden de magnitud más rápido. Una forma sencilla de combinar el método TFIDF y Jaro-Winkler es reemplazar las coincidencias de token exactas utilizadas en TFIDF con coincidencias de token aproximadas basadas en el esquema Jaro-Winkler. Esta combinación tiene un rendimiento ligeramente mejor que Jaro-Winkler o TFIDF en promedio y, en ocasiones, funciona mucho mejor. También se acerca en rendimiento a una combinación aprendida de varias de las mejores métricas consideradas en este documento.