2011-10-12 14 views
5

Ho un ampio database con un elenco di istituzioni (università, ospedali, ecc.). I nomi delle istituzioni provengono da diverse fonti e possono essere scritti in modo diverso per la stessa istituzione. Possono essere errati, ad esempio, o le parole possono essere abbreviate ("uni" o "univ" o "università")ricerca approssimativa in un database

Dato un nome che ho bisogno di inserire nel database, c'è un modo pratico per scoprire se questa istituzione è già nel database? Questo non è un progetto di ricerca, quindi sto cercando una soluzione che sia ragionevolmente veloce.

Sto usando django e postgresql, ma non importa, suppongo.

+0

Quale versione di PostgreSQL è in esecuzione? – Kuberchaun

+0

Posso installare qualsiasi versione. Quindi, l'ultimo credo. – akonsu

risposta

5

Questo è il problema di record linkage. Molti database forniscono metodi di base per questo, come personaggio di livello n -gram corrispondenza, in cui un termine come "università" si espande in

[ "uni", "NR", "Ive", "ver", "ERS", ...]

per n = 3. Il database potrebbe indice di tutti tali n -grams e consentire una ricerca con una sorta di corrispondenza ponderata. pg_trgm sembra fare esattamente questo, provalo.

0

Sembra che tu voglia trovare un valore nel database con una piccola distanza lessicale dal valore che ti viene dato. Trovare le cose con prefissi è abbastanza semplice, ma le parole con errori di ortografia sono più difficili. Potresti voler leggere Peter Norvig's post on spell correctors.

+0

Sarebbe bello se l'algoritmo di Norvig non fosse così estremamente ingenuo. Gli automi Levenshtein ponderati (forse in una forma trie) lo farebbero funzionare, ma dovrebbero comunque essere implementati sul lato del database per prevenire un numero estremo di accessi per ogni ricerca fuzzy. Buona fortuna... –

1

Probabilmente dovresti cercare di utilizzare un motore di ricerca dedicato. Django-haystack consente di facilmente aggiungere motori di ricerca come Solr, Whoosh o Xapian al progetto.

Problemi correlati