Sto cercando una libreria JavaScript di ricerca fuzzy per filtrare un array. Ho provato a usare fuzzyset.js e fuse.js , ma i risultati sono pessimi (ci sono demo che puoi provare sulle pagine collegate).
Dopo aver letto alcune letture a distanza di Levenshtein, mi sembra una scarsa approssimazione di ciò che gli utenti cercano quando digitano. Per chi non lo sapesse, il sistema calcola quanti inserimenti , cancellazioni e sostituzioni sono necessari per far corrispondere due stringhe.
Un ovvio difetto, che è stato risolto nel modello Levenshtein-Demerau, è che sia il blub che il boob sono considerati ugualmente simili al bulbo (ciascuno richiede due sostituzioni). È chiaro, tuttavia, che la lampadina è più simile al blub che al boob , e il modello che ho appena citato lo riconosce consentendo le trasposizioni .
Voglio usarlo nel contesto del completamento del testo, quindi se ho un array ['international', 'splint', 'tinder']
e la mia query è int , penso che international dovrebbe classificarsi più in alto di splint , anche se il primo ha un punteggio (più alto = peggiore) di 10 rispetto a quest'ultimo 3.
Quindi quello che sto cercando (e creerò se non esiste), è una libreria che faccia quanto segue:
- Pesa le diverse manipolazioni del testo
- Pesa ogni manipolazione in modo diverso a seconda di dove compaiono in una parola (le prime manipolazioni sono più costose delle ultime)
- Restituisce un elenco di risultati ordinati per pertinenza
Qualcuno si è imbattuto in qualcosa di simile? Mi rendo conto che StackOverflow non è il posto giusto per chiedere consigli sul software, ma implicito (non più!) In quanto sopra è: sto pensando a questo nel modo giusto?
modificare
Ho trovato un buon documento (pdf) sull'argomento. Alcune note ed estratti:
Le funzioni di distanza di modifica affine assegnano un costo relativamente inferiore a una sequenza di inserimenti o eliminazioni
la funzione distanza Monger-Elkan (Monge & Elkan 1996), che è una variante affine della funzione distanza Smith-Waterman (Durban et al.1998) con parametri di costo particolari
Per la distanza Smith-Waterman (wikipedia) , "Invece di guardare la sequenza totale, l'algoritmo Smith-Waterman confronta segmenti di tutte le lunghezze possibili e ottimizza la misura di somiglianza". È l'approccio n-gram.
Una metrica sostanzialmente simile, che non si basa su un modello di distanza di modifica, è la metrica Jaro (Jaro 1995; 1989; Winkler 1999). Nella letteratura record-linkage, sono stati ottenuti buoni risultati utilizzando varianti di questo metodo, che si basa sul numero e sull'ordine dei caratteri comuni tra due stringhe.
Una variante di ciò dovuta a Winkler (1999) utilizza anche la lunghezza P del prefisso comune più lungo
(sembra essere inteso principalmente per stringhe brevi)
Ai fini del completamento del testo, gli approcci Monger-Elkan e Jaro-Winkler sembrano avere più senso. L'aggiunta di Winkler alla metrica Jaro appesantisce efficacemente l'inizio delle parole in modo più pesante. E l'aspetto affine di Monger-Elkan significa che la necessità di completare una parola (che è semplicemente una sequenza di aggiunte) non la sfavorirà troppo pesantemente.
Conclusione:
la classifica TFIDF si è comportata meglio tra diverse metriche di distanza basate su token e una metrica di distanza di modifica affine-gap ottimizzata proposta da Monge ed Elkan ha funzionato meglio tra diverse metriche di distanza di modifica di stringa. Una metrica della distanza sorprendentemente buona è uno schema euristico veloce, proposto da Jaro e successivamente esteso da Winkler. Funziona quasi come lo schema Monge-Elkan, ma è un ordine di grandezza più veloce. Un modo semplice per combinare il metodo TFIDF e Jaro-Winkler è sostituire le corrispondenze di token esatte utilizzate in TFIDF con corrispondenze di token approssimative basate sullo schema Jaro-Winkler. Questa combinazione ha prestazioni leggermente migliori rispetto a Jaro-Winkler o TFIDF in media e occasionalmente funziona molto meglio. È anche vicino in termini di prestazioni a una combinazione appresa di molte delle migliori metriche considerate in questo documento.
krole
non viene restituita Final Fantasy V: Krile
, anche se mi piacerebbe. Richiede che tutti i caratteri della query siano presenti nello stesso ordine nel risultato, il che è piuttosto miope. Sembra che l'unico modo per avere una buona ricerca fuzzy sia avere un database di errori di battitura comuni.