Progettare un semplice motore di ricerca web: come affrontare la necessità di cercare frasi esatte?

0

Sto valutando seriamente un motore di ricerca web per il mio prossimo progetto per animali domestici. Tutti i principi di base sono chiari, ma alcuni dettagli non lo sono. Vale a dire, non riesco a trovare un modo pulito per cercare per corrispondenza esatta, e. g. "The Who".

Questo requisito impone limitazioni su come posso modificare il testo sorgente:

  1. Non posso usare un elenco di parole di arresto (parole ad alta frequenza e bassa rilevanza come le preposizioni - potrebbero essere molto pertinenti in alcuni casi d'angolo!).
  2. Non posso usare lo stemming (convertire le parole nella loro forma lessicale di base). Se lo uso, non posso dire "programma" da "programmato" e così via.

Non essere in grado di trasmettere tutte le parole alle loro forme di base e buttare via le parole di basso valore comuni significa un indice molto, MOLTO più grande. E peggio ancora, per le query di ricerca comuni che traggono vantaggio dalla derivazione, come posso implementarla? L'unica soluzione che vedo è mantenere due indici, uno con parole effettive e uno con parole derivate, ma dover tenere due copie di Internet non è davvero una soluzione: uno è già abbastanza per farmi graffiare la testa.

    
posta Violet Giraffe 17.08.2016 - 22:42
fonte

3 risposte

1

Un motore di ricerca utilizza normalmente un indice invertito per poter cercare in modo efficiente grandi quantità di dati (lo stesso principio viene utilizzato se i documenti provengono da una fonte diversa da un web crawler). Hai diviso il testo in parole e per ogni parola l'indice invertito contiene ID dei documenti che contengono quella parola. Per cercare una frase, ad esempio "ricerca su Internet", è necessario trovare i documenti che contengono entrambe le parole e contenerle esattamente nell'ordine indicato. Ciò significa che è necessaria una struttura aggiuntiva per mantenere le posizioni delle parole in ciascun documento.

Ora, se vuoi una "corrispondenza esatta", le cose diventano molto più complicate. Ci sono innumerevoli possibilità anche per due parole, potrebbero essere separate da una sequenza speciale come "internet ?? # ++ - search" e non puoi avere tutti i valori possibili come chiavi nel tuo indice invertito.

Quindi, se vuoi essere in grado di trovare una sottostringa, sei praticamente obbligato a usare la ricerca lineare invece di un indice, che è proibitivamente lento. Come puoi facilmente controllare, anche Google non supporta la ricerca di sequenze di caratteri arbitrari e rimuoverà la maggior parte dei caratteri non alfanumerici.

Quindi, implementare la ricerca di frasi è abbastanza possibile, ma la ricerca esatta di corrispondenze per qualsiasi ricerca di caratteri arbitrari non è fattibile per enormi quantità di dati come la ricerca su Internet.

    
risposta data 18.08.2016 - 10:45
fonte
0

Stem, ma ordina per relazione. Le corrispondenze esatte vengono prima di tutto, quindi si chiudono le coppie lessicali (programmate rispetto alla programmazione, programmatore), quindi seguono le forme, quindi forme completamente diverse (programmatiche, programmatiche ...). I suffissi inglesi sono abbastanza coerenti, quindi mentre dovrai archiviare i tuoi dati su due tabelle correlate (per la risposta assumerò che i tuoi termini di ricerca siano memorizzati in un database) uno di questi è molto più breve dell'altro; table [x] contiene tutti gli steli che puoi pensare (o generare, sarai pazzo a farlo manualmente), mentre la tabella [y] contiene ogni suffisso rilevante. Le parole date sono suddivise in due indici, uno stelo-indice e un suffisso-indice, e tale coppia è usata nel processo di ricerca stesso.

Le parole correlate ("coppie lessicali") possono essere generate ripetendo il processo di ricerca con suffissi sempre più diversi: per prima cosa devi cercare con suffissi che sono solo uno o due caratteri fuori dall'input, quindi tre o quattro, e presto. Se gestisci parole di lunghezza arbitraria, puoi archiviare una proprietà di lunghezza standard per ogni classe di suffissi e variare le ricerche ripetute per differenza proporzionale anziché per lunghezza assoluta del carattere.

Potresti creare un parser lessicale che ordina le parole in aggettivi, nomi o verbi per rendere la corrispondenza del suffisso stelo più efficace, ma non è strettamente necessaria.

    
risposta data 18.08.2016 - 03:56
fonte
-1

Hai solo bisogno di quattro tabelle

Documento
ID PK
posizione PK
wordID


Word ID PK
parola

staminali
ID PK
stem

StemWord
stemID PK
wordID PK

Cerca parola

seleziona distinto ID d.ID dal documento d
unisciti a Word w
su w.ID = d.wordID
e w.word = 'diminuito'

Cerca gambo

seleziona distinto ID d.ID dal documento d
unisciti a StemWord sw
su sw.wordID = d.wordID
unisciti a s gambo s su s.ID = sw.stemID
e s.stem = stem ('diminuito')

È semplice. Se trovi questo complesso, ti suggerisco di usare una libreria gratuita come Solr.

    
risposta data 18.08.2016 - 14:35
fonte

Leggi altre domande sui tag