Concetto di ricerca fuzzy del database


13

Ci ho pensato e ho cercato di trovare soluzioni su come eseguire ricerche confuse in un database, se per esempio un utente digita un errore di ortografia. Qualche evidente problema con la logica dietro questo? Funzionerà e è già stato fatto prima?

Il nostro tavolo desideriamo cercare:

**tblArticles**
Body - Soundex_Body - CharacterCoded_Body

Quindi memorizziamo il corpo del testo non elaborato per la visualizzazione fisica. Le altre 2 colonne vengono utilizzate per ricerche precompilate nel modo seguente:

Soundex

Il corpo è diviso in 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 B26. Quindi eseguiamo un LIKE sul valore soundex del termine di ricerca.

Carattere codificato

Data una mappatura dei caratteri che associa i caratteri ai 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 intendesse digitare "ciao" ma ha scambiato due o più caratteri, ad esempio "hlelo", valuterebbe con lo stesso numero. Dividi il corpo crudo in parole, codifica in primo piano ogni parola e memorizza nel database dandoti un campo simile a:

330 6825 330 1050... etc

Possiamo quindi cercare su questo valore per abbinare i mistypes.

Benefici

  • Typos protetto contro
  • Ortografia fonetica errata protetta da
  • Più amichevole non madrelingua inglese
  • Funzionerà in qualsiasi lingua (dove funziona soundex)

Commenti e pensieri? Una sorta di ricerca a più livelli. Ovviamente puoi ponderare i valori di ritorno per renderlo ancora migliore (vale a dire che una corrispondenza letterale del corpo del testo vale di più), ma è una buona soluzione per errori di ortografia e madrelingua inglese che effettuano ricerche?


Sarebbe interessante vedere come si confronta con Trigram Search.
Rich

Mi piacerebbe avere qualcosa del genere per wordpress ...
Kit Menke

L'uso dei numeri primi per la funzione di hashing rende impossibile avere collisioni di parole che non includono metodi identici? Sembra che dovrebbe essere possibile avere una parola lunga con molte lettere di basso valore che ha lo stesso valore di una parola breve con poche lettere di alto valore, ma non conosco molta teoria dei numeri quindi è probabilmente ben provato in un modo o nell'altro ...
glenatron

1
@Glen Afaik moltiplicando i numeri primi genera sempre un numero univoco. Gli anagrammi si scontreranno però, ma supporranno quanto sia un problema, questo è fondamentalmente il punto di trovare rapidamente gli anagrammi.
Tom

@Glen: vedi il teorema di fattorizzazione unico per unicità.
Steven Evers,

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 un testo con vari errori di ortografia come hlepinvece di help, stai cercando la distanza minima di modifica .

Per una libreria per implementare una serie di queste funzioni in CLR in SQL Server 2005 (e versioni successive), guarda il progetto di simulazione di origine SimMetrics . Post di blog su SimMetrics .
http://staffwww.dcs.shef.ac.uk/people/S.Chapman/simmetrics.html

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


2

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

Le ricerche fuzzy possono essere implementate usando Ngram,

Porter Stemmer: http://tartarus.org/~martin/PorterStemmer/

e un database linguistico come http://wordnet.princeton.edu/

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

Se si desidera creare il proprio motore di analisi / ricerca dei termini di ricerca di parole, suggerirei di inserire i token o i termini generati in un database esistente progettato per eseguire la ricerca della lingua.


1

Qualche tempo fa ho fatto qualcosa del genere per gli indirizzi che avrebbero verificato quante modifiche sarebbero state necessarie per trasformare una stringa in un'altra stringa e restituire un valore numerico compreso tra 0 e 1 su quanto i due corrispondessero.

Ha funzionato alla grande dato che avrebbe restituito un valore elevato per articoli come N / North, St / Street, EastMain / MainEast, ecc. L'idea è nata da questo link CodeProject


Il codice che hai scritto per l'indirizzo corrisponde all'open source?
Questione del

@Thatteratters Non ho accesso al codice, ma il link nella mia risposta dovrebbe fornire la logica per questo. Fondamentalmente vuoi solo vedere quanti cambiamenti ci vorrebbe per rendere una stringa nell'altra, e meno cambiamenti allora più si avvicinano
Rachel

0

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

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.