Concetto di ricerca fuzzy del database

12

Ci ho pensato e ho cercato di trovare delle soluzioni su come cercare in un database una fuzzy, se per esempio un utente digita un errore di ortografia. Qualche problema lampante con la logica dietro questo? Funzionerà e è stato fatto prima?

La nostra tabella che vogliamo cercare:

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

Quindi memorizziamo il corpo del testo non elaborato per la visualizzazione fisica. Le altre 2 colonne sono usate per le ricerche che sono precalcolate nel seguente modo:

Soundex

Il corpo è diviso nelle sue parole e tradotto nella sua versione soundex. IE, il corpo risultante potrebbe essere qualcosa del tipo:

H252 B54 C23 E33... etc

Quindi qualcuno potrebbe entrare in "dinosore" e il corpo dell'articolo legge "dinosauro" entrambi valutano in B26. Quindi eseguiamo un LIKE sul valore soundex del termine di ricerca.

Carattere codificato

Dato un mapping di caratteri che mappa i caratteri in numeri primi, IE:

h = 2
e = 3
l = 5
o = 7
p = 11
c = 13

help = 2*3*5*11     =   330
hello = 2*3*5*5*7   =   1050
hell = 2*3*5*5      =   150
hlep = 2*5*3*11     =   330
cello = 13*3*5*5*7  =   6825

Se un utente intendeva digitare "ciao" ma ha cambiato due o più caratteri, ad esempio "hlelo", valuterebbe lo stesso numero. Dividi il corpo grezzo in parole, primo codifica ogni parola e archivia nel database dandoti un campo simile a:

330 6825 330 1050... etc

A quel punto, ci piacerebbe cercare su questo valore per corrispondere ai mistypes.

Vantaggi

  • Errori protetti contro
  • Le ortografie errate fonetiche sono protette contro
  • Altro non di madrelingua inglese
  • Funzionerà in qualsiasi lingua (dove soundex funziona)

Commenti e pensieri? Una sorta di ricerca su più livelli. Ovviamente puoi aumentare i valori di peso per renderlo ancora migliore (ad esempio, una corrispondenza letterale del corpo del testo vale di più), ma è una buona soluzione per gli errori di ortografia e per i madrelingua inglesi che eseguono ricerche?

    
posta Tom 03.03.2011 - 16:58
fonte

4 risposte

2

Esistono numerosi altri algoritmi di ricerca. Smith-Waterman è uno dei migliori per il testo umano, mentre BLAST è (finora) il migliore per la ricerca di sequenze di DNA. Quando ti viene presentato del testo con vari errori di ortografia come hlep anziché help , allora stai cercando la distanza minima di modifica .

Per una libreria che implementa un certo numero di queste funzioni in CLR in SQL Server 2005 (e versioni successive), guarda il progetto source forge SimMetrics . post sul blog su SimMetrics .
link

Soundex è stato sviluppato perché le differenze primarie tra le variazioni linguistiche regionali erano quasi esclusivamente nelle vocali - motivo per cui lancia le vocali. Non è buono a far fronte alle lettere trasposte.

    
risposta data 03.03.2011 - 19:37
fonte
2

Apache Solr, supporta sinonimi e correzioni ortografiche - sebbene sia ancora un po 'approssimativo ai bordi.

Le ricerche fuzzy possono essere implementate usando Ngrams,

Porter Stemmer: link

e un database di lingua come link

... ma progetti come Xapian e Solr gestiscono gran parte di ciò per te.

Se vuoi creare il tuo motore di ricerca / analisi del termine di ricerca delle parole, ti suggerisco di inserire i token o i termini generati in un database esistente progettato per eseguire la ricerca della lingua.

    
risposta data 03.03.2011 - 18:45
fonte
1

Ho fatto qualcosa del genere un po 'indietro per gli indirizzi che avrebbero controllato quante modifiche ci sarebbero voluti per trasformare una stringa in un'altra stringa, e restituire un valore numerico compreso tra 0 e 1 per quanto fossero vicini i due.

Ha funzionato benissimo poiché avrebbe restituito un valore elevato per articoli come N / Nord, St / Street, EastMain / MainEast, ecc. L'idea è venuta da questo link CodeProject

    
risposta data 03.03.2011 - 19:51
fonte
0

Se stai abbinando nomi, persone o luoghi, un elenco di sinonimi può funzionare molto meglio.

Soundex non corrisponde a "Dick == Richard" "Kit == Christopher" o "Ms. == Mrs."

    
risposta data 03.03.2011 - 18:29
fonte

Leggi altre domande sui tag