/ / Rileva i nomi duplicati tramite la corrispondenza fuzzy - c, algoritmo, sqlite, ricerca, fuzzy-search

Rileva i nomi duplicati tramite la corrispondenza fuzzy: c, algoritmo, sqlite, ricerca, fuzzy-search

Ho un database SQLite che ha (user_id,nome). Voglio rilevare se un utente è già nel sistema per nome. Il problema è che il nome proviene da un utente, il che significa che può sbagliare l'ortografia del nome o potrebbe essere una versione alternativa del nome: "Tim" vs "Timothy". Quindi mi piacerebbe una funzione che trovi la corrispondenza più vicina all'input e dia una sicurezza di similarità per determinare se esiste una corrispondenza. La confidenza dovrebbe essere compresa tra 0 e 1 (in modo da poter impostare un limite significativo).

Tavolo:

1 | Tim Best 2 | Roger Thomas 3 | Roper Bar
  • Se l'utente entra Timothy Bert la funzione dovrebbe tornare 1 | Tim Best | 0.8 (0,8 essere la fiducia, se fosse quello che è successo).
  • Se l'utente entra Roper Thomas la funzione dovrebbe tornare 2 | Roger Thomas | 0.6
  • Se l'utente entra Tim Taylor la funzione dovrebbe tornare 1 | Tim Best | 0.3
  • Se l'utente entra Foo Taylor la funzione dovrebbe tornare 2 | Roper Thomas | 0.0

Idealmente sarebbe meglio se potessi scrivere una query in SQLite per farlo, ma se non fosse possibile, prenderò anche una soluzione c.

risposte:

1 per risposta № 1

Ci sono diversi tentativi per risolvere la corrispondenza di stringa fuzzy. Google ti dice molto e così fa wikipedia. Il più popolare è Levenshtein. Altri approcci interessanti sono Jaro-Winler e Corrispondenza trigram.

La mia esperienza personale dice che devi giocarein giro con gli algoritmi che esistono. Ho avuto un problema a far corrispondere "FirstName LastName" a "LastName, FirstName" e l'unico algoritmo adatto alle mie esigenze era un Trigram modificato che ho sviluppato dai collegamenti forniti.

Per le tue esigenze, dovresti anche tenere un dizionariodi abbreviazioni Nome in modo da poter convertire ogni modulo breve al suo nome di base e quindi effettuare un confronto fuzzy. Tuttavia, questo molto probabilmente fallirà, come per es. "Tin Taylor" dove "Tin" è scritto male "Tim" non porterà a "Timothy Taylor".

Per coprirlo, avrai bisogno di una ricerca che possa "apprendere", cioè che sia stata modificata da un umano.