10.06.2013 Views

Introduzione - The e-Lite Research Group

Introduzione - The e-Lite Research Group

Introduzione - The e-Lite Research Group

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Introduzione</strong><br />

La quantità di informazioni disponibili in formato elettronico negli ultimi anni è<br />

cresciuta in maniera esponenziale, basta pensare al World Wide Web, in cui i<br />

navigatori di Internet trovano centinaia di milioni di pagine, ma anche alle banche<br />

dati disponibili on-line che coprono i campi più disparati: dalla medicina alle<br />

leggi, agli articoli scientifici.<br />

L’aumento della mole di dati consultabili ha però avuto come conseguenza da<br />

parte degli utenti l’accresciuta difficoltà di ricercare le informazioni interessanti<br />

per i propri scopi (tale difficoltà viene sovente indicata come information<br />

overload: impossibilità di trovare le informazioni rilevanti a causa dell’eccessiva<br />

quantità di informazioni da controllare) e, con essa, la necessità di avere a<br />

disposizione degli strumenti efficaci per il recupero dell’informazione.<br />

E’ in questo scenario che si colloca quel settore dell’informatica che va sotto il<br />

nome di Information Retrieval.<br />

Grandi quantità<br />

di dati testuali<br />

Information Retrieval<br />

(IR) systems<br />

Quindi, in poche parole, l’Information Retrieval si occupa dei problemi relativi<br />

alla memorizzazione, rappresentazione e reperimento di documenti.<br />

Da questo semplice grafico si deducono due dei problemi più importanti che<br />

bisogna affrontare. Il primo consiste nel fatto che l’information retrieval<br />

i<br />

Accesso il più<br />

possibile veloce ai<br />

dati rilevanti


generalmente si occupa di dati testuali: gli “oggetti” con cui si ha a che fare sono<br />

tipicamente lettere, articoli, libri, pagine web e via discorrendo. Si tratta quindi di<br />

dati non strutturati, contenenti informazioni che sono espresse in linguaggio<br />

naturale; questo comporta una serie di problematiche da affrontare quando si tratta<br />

di effettuare delle ricerche sul loro contenuto:<br />

• Ambiguità, polisemia: le parole possono avere più significati diversi<br />

• Sinonimia: ci possono essere più modi diversi per esprimere il<br />

medesimo concetto<br />

• Imprecisione: il linguaggio naturale è sovente molto vago, non è facile<br />

trovare il confine tra “abbastanza largo” e “relativamente stretto”.<br />

Talvolta in letteratura, si dice che un sistema di IR recupera informazioni che<br />

risolvono uno “stato anomalo di conoscenza” (Anomalous State of Knowledge,<br />

ASK).<br />

Una prima, banale soluzione a questo problema consisterebbe nell’associare ad<br />

ogni documento dei metadati, quali ad esempio una serie di keyword che ne<br />

identifichino il contenuto (qui si intendono metadati compilati a mano, non<br />

generati automaticamente da un calcolatore), in tal modo le ricerche verrebbero<br />

effettuate su questi metadati, anziché su tutto il contenuto dei documenti. Questa<br />

soluzione si scontra però principalmente con la difficoltà di mantenere la coerenza<br />

nella generazione degli indici, infatti l’estrazione dei concetti e delle keyword dai<br />

documenti dipende dall’esperienza e dalle opinioni di chi costruisce l’indice<br />

(alcuni esperimenti hanno dimostrato che mediamente c’è un 20% di differenza<br />

tra i termini scelti da due esperti per caratterizzare un certo documento), un<br />

concetto che per un utente è centrale in un determinato documento può risultare di<br />

scarso interesse per un altro. Gli sforzi maggiori vengono quindi rivolti verso le<br />

tecniche di full text retrieval.<br />

Il secondo problema, che è poi il nocciolo dell’information retrieval, è legato al<br />

reperimento delle informazioni, che da qui in avanti chiameremo anche<br />

documenti, rilevanti per le esigenze dell’utente. Come già detto in precedenza è<br />

impensabile che l’utente proceda con la lettura di tutti i documenti memorizzati<br />

alla ricerca di quelli significativi per la propria richiesta (nel tal caso si avrebbe<br />

ii


una situazione di perfect retrieval), bisogna quindi studiare come caratterizzare in<br />

maniera automatica la collezione di documenti e cercare di duplicare via software<br />

il processo umano di lettura. Più dettagliatamente si deve cercare di estrarre<br />

informazioni di natura sintattica e semantica dal testo ed usarle per decidere se un<br />

documento sia rilevante oppure no a fronte di una determinata richiesta. Come già<br />

detto il concetto di rilevanza è centrale nell’information retrieval, lo scopo<br />

fondamentale di una strategia automatica di retrieval è quello di restituire il più<br />

alto numero di documenti rilevanti e, allo stesso tempo, il minor numero possibile<br />

di documenti non rilevanti.<br />

Apriamo una piccola parentesi: bisogna distinguere tra due diversi tipi di recupero<br />

(o retrieval) dei dati, ossia il recupero deterministico e il recupero incerto. Nel<br />

primo, la collezione oggetto della ricerca è costituita da dati strutturati ed è divisa<br />

in due parti ben distinte: i dati che soddisfano la richiesta e quelli che non la<br />

soddisfano; si è in questa situazione quando si ha a che fare, ad esempio, con le<br />

basi di dati relazionali e con le interrogazioni espresse in linguaggio SQL.<br />

Supponiamo ad esempio di avere una tabella contenente le informazioni sui testi<br />

contenuti in una biblioteca:<br />

LIBRI<br />

Codice Titolo Autore Data_acquisizione<br />

Se voglio sapere quali libri sono stati acquisiti dopo una certa data, è sufficiente<br />

eseguire una query di interrogazione:<br />

SELECT CODICE, TITOLO, AUTORE, DATA_ACQUISIZIONE<br />

FROM LIBRI<br />

WHERE DATA_ACQUISIZIONE > #01/01/2001#<br />

In tal modo i dati contenuti nella tabella vengono inequivocabilmente suddivisi in<br />

due gruppi: quelli che soddisfano la condizione impostata nella query (e che<br />

pertanto vengono restituiti all’utente) e quelli che invece non soddisfano tale<br />

condizione.<br />

iii


Dall’altra abbiamo il recupero incerto, in cui i documenti vengono ordinati in base<br />

ad una certa funzione che ne misura la rilevanza; è anche possibile che vengano<br />

tralasciati quelli che stanno al di sotto di una certa soglia.<br />

Supponiamo ad esempio di avere una collezione di documenti e di voler<br />

sottoporre ad un ipotetico sistema la seguente richiesta (espressa per ora in<br />

linguaggio naturale):<br />

RESTITUISCI TUTTI I DOCUMENTI IN CUI SI PARLA DI TUMORI<br />

Cosa si intende di preciso: i documenti che hanno come argomento i tumori o<br />

quelli in cui se ne fa solo un accenno; inoltre, come faccio a sapere se un articolo<br />

ha come argomento principale lo studio dei tumori o se questo costituisce solo una<br />

parte minima ?<br />

Queste sono le tipiche domande a cui cerca di dare risposta un sistema di<br />

information retrieval.<br />

iv


Indice<br />

<strong>Introduzione</strong>............................................................................................................i<br />

Capitolo 1 Concetti generali ................................................................................. 1<br />

1.1 Schema di un information retrieval system................................................... 1<br />

1.2 Effectiveness ed efficiency............................................................................ 2<br />

Capitolo 2 Automatic text analysis ...................................................................... 6<br />

Capitolo 3 Strategie di retrieval ......................................................................... 11<br />

3.1 Boolean query.............................................................................................. 11<br />

3.2 Extended (Weighted) boolean query........................................................... 13<br />

3.3 Modelli booleani estesi – MMM=Mixed Min and Max.............................. 15<br />

3.4 Inference network........................................................................................ 17<br />

3.5 Vector space model ..................................................................................... 18<br />

3.6 Probabilistic retrieval .................................................................................. 23<br />

3.7 Genetic algorithm ........................................................................................ 29<br />

Capitolo 4 Utility ................................................................................................. 33<br />

4.1 Relevance feedback..................................................................................... 34<br />

4.2 Parsing ......................................................................................................... 38<br />

4.2.1 Stemming.............................................................................................. 39<br />

4.3 Clustering – Classificazione dei documenti ................................................ 45<br />

4.3.1 Single link............................................................................................. 48<br />

4.3.2 <strong>Group</strong> average link ............................................................................... 51<br />

4.3.3 Una visione alternativa del problema: SCATTER/GATHER.............. 56<br />

4.4 Latent Semantic Indexing (LSI) .................................................................. 60<br />

Capitolo 5 Implementazioni ............................................................................... 64<br />

5.1 Inverted index.............................................................................................. 64<br />

5.1.1 Procedura di ricerca.............................................................................. 68<br />

5.1.2 Costruzione di un inverted index.......................................................... 71<br />

v


Indice<br />

5.1.3 Compressione di un inverted index ...................................................... 73<br />

5.2 Signature file ............................................................................................... 75<br />

5.2.1 Metodo WS (Word Signature) ............................................................. 77<br />

5.2.2 Superimposed coding ........................................................................... 78<br />

5.2.3 Metodi basati su compressione............................................................. 79<br />

5.2.4 Bit-sliced signature file......................................................................... 81<br />

5.2.5 Frame-sliced signature file ................................................................... 83<br />

5.2.6 S-Tree ................................................................................................... 83<br />

5.2.7 Organizzazioni “Key-based”................................................................ 84<br />

Capitolo 6 Integrazione tra IR e database ........................................................ 86<br />

6.1 Integrazione di sistemi esistenti................................................................... 95<br />

6.2 Estensione di RDBMS con aggiunta di funzioni di IR ............................... 97<br />

6.3 Implementazione di un IRS come applicazione di un RDBMS................ 103<br />

Capitolo 7 Parallel information retrieval system ........................................... 109<br />

Capitolo 8 Information retrieval e Web .......................................................... 116<br />

8.1 Indexing..................................................................................................... 118<br />

8.2 Crawler/robot............................................................................................. 119<br />

8.3 Clustering .................................................................................................. 120<br />

8.4 Metasearch navigator ................................................................................ 121<br />

8.5 Ranking algorithm..................................................................................... 122<br />

8.5.1 Algoritmo PageRank .......................................................................... 123<br />

8.5.2 Algoritmo HITS ................................................................................. 124<br />

8.6 Direzioni di ricerca future ......................................................................... 127<br />

8.7 Architettura di un motore di ricerca .......................................................... 129<br />

vi


Input<br />

Capitolo 1<br />

Concetti generali<br />

1.1 Schema di un information retrieval system<br />

Vediamo ora una rappresentazione schematica, per mezzo di black box, di quello<br />

che dovrebbe essere un tipico information retrieval system.<br />

Queries<br />

Documents<br />

Feedback<br />

Processor<br />

Figura 1 - Architettura di un IR system<br />

Lo schema è costituito da tre parti principali: input, processor e output.<br />

Partiamo dal lato input dello schema: come è già stato accennato in precedenza,<br />

uno dei problemi principali consiste nell’avere una rappresentazione dei<br />

documenti che sia utilizzabile dal calcolatore; è importante sottolineare che una<br />

rappresentazione analoga dovrà essere utilizzata anche per rappresentare le<br />

richieste che l’utente sottopone al sistema (e che da qui in avanti chiameremo<br />

anche query). Tutto ciò implica che tanto i documenti, quanto le query dovranno<br />

essere sottoposti ad una fase di pre-processing al fine di ottenere una loro<br />

rappresentazione interna.<br />

Il secondo blocco, indicato come processor, è quello in cui si realizza la fase vera<br />

e propria di ricerca e di recupero all’interno dei documenti (parleremo di<br />

1<br />

Output


1 – Concetti generali<br />

documenti per semplicità, anche se in realtà il sistema lavora sempre con le loro<br />

rappresentazioni che si è costruito) in risposta alla richiesta sottoposta dall’utente,<br />

quindi è il blocco in cui verranno implementate tutte le tecniche e le strategie che<br />

vedremo più avanti.<br />

Finalmente arriviamo alla parte dell’output, che usualmente consiste in una serie<br />

di citazioni di documenti. Man mano che i risultati vengono proposti all’utente,<br />

questi può ritenerli soddisfacenti oppure no, inoltre può trarre spunto da essi per<br />

nuove direzioni di ricerca: può darsi quindi che l’utente soddisfi il proprio<br />

information need in diverse passate, da qui il ramo di feedback presente nello<br />

schema proposto.<br />

Per concludere questa breve introduzione diciamo che sono tre i campi in cui è<br />

possibile dividere la teoria dell’information retrieval:<br />

• Content analysis: descrizione del contenuto di un documento in una<br />

forma utilizzabile per essere elaborata da un calcolatore<br />

• Information structures: studio delle informazioni sui documenti rese<br />

disponibili per migliorare le strategie usate per recuperare le<br />

informazioni<br />

• Evaluation: misura della bontà dei risultati forniti dal sistema.<br />

1.2 Effectiveness ed efficiency<br />

La maggior parte delle ricerche nell’ambito dell’information retrieval sono rivolte<br />

al miglioramento di due parametri che vengono solitamente indicati come<br />

effectiveness ed efficiency.<br />

Quando si parla di efficiency si fa riferimento al consumo di risorse da parte del<br />

sistema: CPU time, memoria centrale e memoria di massa richieste, tempi di<br />

risposta, tutte grandezze che sono legate alla particolare configurazione della<br />

macchina utilizzata (questa parte viene lasciata abbastanza in disparte) e agli<br />

algoritmi di ricerca che vengono implementati. Il concetto di effectiveness,<br />

invece, è una misura della bontà del sistema, ovvero quanto il sistema è in grado<br />

2


1 – Concetti generali<br />

di soddisfare l’utente fornendogli le sole informazioni rilevanti e semplificandogli<br />

così l’attività di ricerca.<br />

I due parametri in base ai quali viene universalmente valutata l’effectiveness di un<br />

sistema di information retrieval sono precision e recall, dove:<br />

• precision = proporzione di documenti effettivamente rilevanti in<br />

rapporto ai documenti restituiti dal sistema in risposta ad una<br />

interrogazione dell’utente<br />

• recall = proporzione dei documenti rilevanti restituiti dal sistema in<br />

rapporto al totale dei documenti rilevanti (restituiti e non) presenti<br />

nella collezione esaminata.<br />

Supponiamo di poter definire, per ogni documento in una data collezione, se il<br />

documento è rilevante o meno con riferimento ad una data richiesta; l’insieme dei<br />

documenti si può quindi partizionare in quattro sottoinsiemi, dove la<br />

classificazione di un documento considera se lo stesso è rilevante o meno e se è<br />

stato reperito o meno dall’IRS.<br />

Reperiti<br />

Non reperiti<br />

RET_NREL<br />

RET_REL<br />

NRET_NREL<br />

Figura 2 - Suddivisione dei documenti per calcolare precision e recall<br />

I documenti in RET_NREL costituiscono il “rumore”, che ogni IRS dovrebbe<br />

cercare di ridurre al minimo; tali documenti vengono anche detti false drops, o<br />

false hits. I documenti in NRET_REL, viceversa, sono quelli per cui il sistema è<br />

“silenzioso”, per essi si usa anche il termine false dismissals; anche questi<br />

dovrebbero essere ridotti al minimo. Un sistema di information retrieval ideale<br />

dovrebbe avere zero false drops e zero false dismissals.<br />

3<br />

NRET_REL<br />

Rilevanti<br />

Non rilevanti


1 – Concetti generali<br />

Tornando alle nostre misure di effectiveness, si avrà<br />

• RECALL =<br />

• PRECISION =<br />

# RET _ REL<br />

# REL<br />

# RET _ REL<br />

# RET<br />

Talvolta in letteratura si incontra una terza misura:<br />

• FALLOUT =<br />

# RET _ NREL<br />

# NREL<br />

In genere, aumentando il valore di recall, la precision diminuisce e viceversa,<br />

come indicato nel grafico seguente:<br />

1<br />

Precision<br />

Query specifica<br />

0 Recall 1<br />

Figura 3 - Relazione tra precision e recall<br />

Una query molto selettiva lascia passare soltanto pochi documenti, è assai<br />

probabile che un’alta percentuale di questi sia costituita da informazioni rilevanti<br />

(high precision), ma è altrettanto probabile che un buon numero di documenti<br />

altrettanto rilevanti non siano stati recuperati (low recall); l’opposto accade nel<br />

caso di una query poco selettiva, che restituisce un gran numero di documenti.<br />

4<br />

Query generica


1 – Concetti generali<br />

Dalle formule presentate prima si nota che, mentre la precision è calcolabile a<br />

partire dalla risposta del sistema (cioè riesco a quantificare sia il numero di<br />

documenti restituiti, sia il numero di quelli ritenuti rilevanti), così non è per il<br />

recall, che richiede di conoscere quanti sono i documenti rilevanti in tutta la<br />

collezione (# RET). Per ovviare a questo problema esistono delle collezioni di<br />

documenti con associate delle richieste per le quali sono disponibili le valutazioni<br />

di rilevanza.<br />

Esiste addirittura un progetto chiamato TREC (Text REtrieval Conference) che ha<br />

lo scopo di valutare nuovi eventuali sistemi di information retrieval usando<br />

opportuni benchmark; si usa una collezione di oltre un milione di documenti<br />

(articoli del Wall Street Journal, Financial Times, Bollettini del Federal Register)<br />

e 50 query, per le quali sono noti i giudizi di rilevanza.<br />

5


Capitolo 2<br />

Automatic text analysis<br />

Per far sì che un sistema computerizzato di information retrieval possa operare per<br />

il recupero delle informazioni desiderate da un testo non strutturato, tali<br />

informazioni devono essere memorizzate all’interno del calcolatore. Abbiamo già<br />

visto che, più dei documenti veri e propri, conviene utilizzare delle<br />

rappresentazioni di questi ultimi in una forma che sia utilizzabile dal calcolatore e<br />

che generalmente viene generata automaticamente: in parole povere, dobbiamo<br />

costruire un modello.<br />

Una delle assunzioni basilari su cui è fondata la teoria dell’information retrieval è<br />

che la frequenza con cui un determinato termine compare in un testo fornisce una<br />

misura di quanto quel termine sia significativo è per il documento in esame. Da<br />

questo ne deriva che la frequenza può essere presa in considerazione per estrarre<br />

parole e frasi da utilizzare per la rappresentazione di un documento.<br />

Consideriamo a tal proposito il seguente grafico:<br />

Figura 4 - Distribuzione di Zipf<br />

6


2 – Automatic text analysis<br />

Sull’asse verticale (indicato con f) è rappresentata la frequenza con cui le varie<br />

parole compaiono in un testo, mentre sull’asse orizzontale (indicato con r) viene<br />

riportato il loro rank, ossia la posizione che occupano in un’ideale scala delle<br />

frequenze.<br />

Tracciando un grafico di f in funzione di r si ottiene una iperbole, come<br />

annunciato dalla legge di Zipf (da cui prende anche il nome la curva<br />

rappresentata), secondo la quale il prodotto della frequenza d’uso delle varie<br />

parole per la loro posizione nella scala delle frequenze è approssimativamente<br />

costante.<br />

In un insieme di dati (nel nostro caso le parole di un testo sufficientemente lungo)<br />

caratterizzati da una distribuzione di Zipf ci saranno:<br />

• Pochi elementi che compaiono molto frequentemente (rappresentati dal<br />

ramo sinistro della curva). Nel caso di linguaggio parlato si tratta di<br />

quelle parole (“the” ,”and” ecc. riportiamo parole della lingua inglese<br />

poiché tutta la letteratura fa riferimento a questa), poche, che vengono<br />

usate con estrema frequenza<br />

• Un numero considerevole, anche se non elevatissimo, di elementi che<br />

occupano posizioni intermedie sulla scala delle frequenze d’utilizzo<br />

• Un altissimo numero di elementi con frequenze tendenti a zero (il ramo<br />

destro della curva). Se ci riferiamo al linguaggio si tratta di tutte quelle<br />

parole che non vengono quasi mai utilizzate.<br />

Alcuni studiosi (in particolare H.P. Luhn ) hanno poi introdotto due valori di<br />

soglia, uno superiore e uno inferiore. Le parole che stanno oltre il valore di soglia<br />

superiore vengono considerate troppo comuni, mentre quelle al di sotto della<br />

soglia inferiore vengono considerate troppo rare; in entrambi i casi questi termini<br />

non danno un contributo significativo al contenuto del testo.<br />

Si assume che il resolving power delle parole, ossia la loro abilità di discriminare<br />

il contenuto dei documenti, raggiunga un picco in una posizione nel rank order<br />

circa a metà tra i due valori di cut-off e tenda a zero all’incirca in corrispondenza<br />

dei due sopraccitati valori di soglia.<br />

7


2 – Automatic text analysis<br />

Figura 5 - Curva di Zipf e resolving power delle parole<br />

Ovviamente i valori di soglia non sono stabiliti univocamente, ma vengono fissati<br />

di volta in volta in maniera arbitraria.<br />

Torniamo ora ad occuparci di come modellare i documenti in modo che possano<br />

essere analizzati in un sistema automatico di IR.<br />

Potremmo pensare a tale modello come ad una lista di class names, dove ogni<br />

class name rappresenta una classe di parole presenti nel testo esaminato (vedremo<br />

più avanti in che modo) che fanno tutte riferimento ad un medesimo concetto; tali<br />

class names diventeranno poi le parole significative che rappresentano il<br />

contenuto del documento.<br />

La costruzione di questo tipo di modello si articola in tre passaggi:<br />

1. Rimozione delle parole che compaiono troppo frequentemente<br />

2. Rimozione dei suffissi (suffix striping o stemming)<br />

3. Individuazione delle radici (o stem) comuni a più parole (questa<br />

operazione viene generalmente indicata come conflation).<br />

8


2 – Automatic text analysis<br />

La rimozione delle parole con un’alta frequenza di occorrenze (tali parole<br />

vengono indicate in letteratura come stop words o, più raramente, come fluff<br />

words) è un modo per implementare il cut-off di cui si è parlato con riferimento al<br />

grafico di fig. 5; l’eliminazione delle stop words è considerato universalmente (o<br />

quasi) come un passo necessario nell’implementazione di un sistema di<br />

information retrieval. I vantaggi di questa operazione sono molteplici: innanzitutto<br />

si rimuovono dei termini che non sono significativi per il contenuto del testo in<br />

quanto compaiono virtualmente in tutti i documenti: tali termini non interferiranno<br />

durante la fase di ricerca e recupero; in secondo luogo si diminuisce la dimensione<br />

del documento, generalmente tra il 30% e il 50%, con evidenti vantaggi in termini<br />

di occupazione di risorse e tempi di elaborazione.<br />

Il secondo passo per la costruzione del modello consiste nella rimozione dei<br />

suffissi dalle parole; tale operazione viene detta suffix striping oppure stemming;<br />

l’approccio standard adottato negli algoritmi di suffix striping più utilizzati<br />

consiste nell’avere una lista completa dei suffissi e nel rimuovere il più possibile<br />

quelli più lunghi, es.<br />

Purtroppo la rimozione “liberalizzata” dei suffissi può portare a commettere degli<br />

errori grossolani:<br />

CONFLICTUAL CONFLICT<br />

EQUAL EQ ???<br />

Per evitare errori di questo tipo è opportuno introdurre delle regole (di tipo quasi<br />

grammaticale) un po’ più restrittive: il suffisso verrà rimosso soltanto se tali<br />

regole saranno rispettate. Ad esempio:<br />

• Lo stem che si ottiene dalla rimozione del suffisso non deve essere più<br />

corto di un certo numero di caratteri<br />

• Lo stem che si ottiene dopo aver rimosso il suffisso non deve terminare<br />

con alcune determinate lettere o sequenze di lettere.<br />

9


2 – Automatic text analysis<br />

L’assunzione che sta alla base del terzo passo (conflation) è che, nel contesto<br />

dell’IR, se due parole hanno la medesima radice o stem, allora si riferiscono al<br />

medesimo concetto e possono essere indicizzate come un’unica entità. Questa<br />

assunzione va bene nella maggioranza dei casi, ma anche qui può portare talvolta<br />

ad errori marchiani in quanto parole molto simili possono avere significati<br />

completamente diversi (es. NEUTRON e NEUTRALISE). Poiché non esiste un<br />

metodo economico per effettuare una simile distinzione, si mette in conto che<br />

permarrà una certa percentuale di errore e si assume che tale percentuale di errore<br />

non degradi troppo l’effectiveness del sistema di IR. Si utilizzano quindi degli<br />

algoritmi di conflation che generano un set di classi, una per ogni diverso stem<br />

che è stato ottenuto.<br />

Alla fine di tutto si ottiene un modello dei documenti costituito da una lista di<br />

class name, che vengono solitamente chiamati index term o keyword.<br />

Una serie di studiosi affermano però che tutti questi passaggi provocano una<br />

riduzione dell’effectiveness del sistema; questi studiosi hanno dimostrato come<br />

alcuni tipi di parole, che normalmente verrebbero eliminate dalle stoplist oppure<br />

collassate in una classe più generale dagli algoritmi di stemming e di conflating,<br />

giochino un ruolo molto importante in alcuni tipi di contesti per discriminare il<br />

contenuto di un testo.<br />

Abbiamo fatto un discorso molto generico riguardo alla costruzione di un modello<br />

dei documenti, più avanti approfondiremo i vari concetti affrontati; è interessante<br />

però notare come i concetti espressi in questa sezione stiano alla base di quasi tutti<br />

gli algoritmi e le strategie utilizzate nei sistemi di information retrieval.<br />

10


Capitolo 3<br />

Strategie di retrieval<br />

Abbiamo visto in precedenza che un sistema di IR ha in ingresso una richiesta o<br />

query da parte dell’utente e genera una risposta costituita da un insieme di<br />

documenti; in questo capitolo ci soffermeremo su alcune possibili organizzazioni<br />

logiche di un sistema di IR (in altre parole: come modellare la collezione dei<br />

documenti esaminati) e vedremo come, in base a queste, differiscano tra di loro il<br />

modo di formulare le richieste al sistema ed il tipo di risposte che questo fornisce<br />

in uscita.<br />

Le retrieval strategy rispondono alla domanda su quale sia il metodo migliore per<br />

modellare ed ordinare i documenti, una volta noti i termini comuni ai documenti<br />

stessi ed alla query.<br />

3.1 Boolean query<br />

Tradizionalmente il progetto logico e l’implementazione dei sistemi di<br />

information retrieval sono stati influenzati dalla tecnologia dei database: il<br />

problema del recupero dei documenti è stato visto di conseguenza come una<br />

variante del recupero dei dati all’interno di una base dati. Un gran numero di<br />

sistemi di information retrieval, quindi, è basato sulla logica booleana e sulla<br />

ricerca di tipo exact matching. In un simile ambiente i documenti sono<br />

rappresentati mediante una lista di termini significativi (ottenuti più o meno nel<br />

modo visto al paragrafo precedente) che non tiene in nessun conto il contributo<br />

apportato da ogni singolo termine alla caratterizzazione del testo: una qualsiasi<br />

parola o appartiene, oppure non appartiene ad un documento; questa è l’unica<br />

informazione presa in considerazione. Lo stesso discorso vale per le query, che<br />

vengono viste come dei semplici elenchi di termini collegati tra di loro medianti<br />

11


operatori booleani. In risposta vengono restituiti quei documenti che contengono i<br />

termini presenti nella query in base alle condizioni specificate da quest’ultima; in<br />

questo modo la collezione viene partizionata esattamente in due set: i documenti<br />

che soddisfano la query e quelli che non la soddisfano.<br />

Per esempio, partendo dalla query:<br />

Q=( K1 AND K2 ) OR ( K3 AND ( NOT K4 ))<br />

la ricerca booleana restituirà tutti i documenti che hanno come index term K1 e<br />

K2, assieme a quelli contenenti K3 ma non K4.<br />

Questo tipo di organizzazione ha il vantaggio di essere relativamente facile da<br />

implementare (infatti è stata la prima adottata in IR), però ha anche una lunga<br />

serie di punti a sfavore; il primo e fondamentale consiste nella mancanza di un<br />

qualsiasi ordinamento sui documenti: tutti i documenti restituiti a fronte di una<br />

richiesta vengono considerati come se avessereo la stessa rilevanza per l’utente,<br />

una condizione, questa, decisamente poco realistica. Nel caso di grandi collezioni<br />

di documenti l’utente rischia di trovarsi nella condizione di passare da query con<br />

condizioni troppo lasche, che restituiscono un numero molto alto di documenti in<br />

maniera “piatta”, senza alcuna informazione su quali siano quelli più interessanti<br />

(bassa precision), a query con condizioni eccessivamente selettive, che<br />

restituiscono un numero esiguo di documenti (basso recall), lasciandone fuori<br />

alcuni potenzialmente rispondenti alle richieste dell’utente.<br />

A monte di questo sta anche il fatto che per utenti inesperti (quali sono nella<br />

stragrande maggioranza dei casi) risulta spesso difficile mettere le proprie<br />

esigenze in forma di query booleana, assai lontana da quello che è il linguaggio<br />

naturale. Inoltre anche un utente più esperto rischia, se non ha già una buona<br />

conoscenza del contenuto dei documenti, di costruire query non efficaci usando<br />

termini troppo generali, quindi con bassa capacità di filtrare i documenti, oppure<br />

troppo specifici, che portano ad avere un numero esiguo di documenti come<br />

risposta.<br />

12


3 – Strategie di retrieval<br />

3.2 Extended (Weighted) boolean query<br />

In base alle considerazioni fatte fino ad ora risulta che in un sistema di IR è<br />

importante avere un qualche ordinamento o ranking sul set di documenti che<br />

viene prodotto in uscita.<br />

La prima soluzione a questo problema è dato dai modelli booleani estesi in cui i<br />

concetti fondamentali sono gli stessi del modello booleano visto prima (quindi i<br />

documenti sono ancora rappresentati mediante liste di termini legati da operatori<br />

booleani).<br />

Questi tipi di modelli si caratterizzano per la presenza di pesi (weight) associati ai<br />

vari termini del testo che ne riflettono in qualche modo l’importanza relativa<br />

all’interno del documento; tali pesi permettono inoltre di adottare dei criteri di<br />

ordinamento dei documenti reperiti, infatti in fase di ricerca non si procede più<br />

soltanto ad un exact match tra i termini presenti nella richiesta e quelli del<br />

documento, ma si lavora sui pesi degli index term mentre gli operatori booleani<br />

presenti nella query vengono associati ad operatori matematici da applicare ai<br />

pesi.<br />

Ad esempio, se indichiamo con WX e WY i pesi associati a due termini X e Y si<br />

ha:<br />

BOOLEAN QUERY EXTENDED BOOLEAN QUERY<br />

X AND Y WX * WY<br />

X OR Y WX + WY<br />

NOT Y 0 SE WY>0 ; 1 se WY=0<br />

Così facendo ad ogni documento non sarà più asseganto un valore booleano, true<br />

o false, a seconda che i suoi index terms soddisfino o no la condizione spressa<br />

dalla query, bensì un valore numerico variabile all’interno di un range predefinito<br />

che permetterà di costruire una classifica dei documenti rilevanti.<br />

13


3 – Strategie di retrieval<br />

Uno dei problemi più importanti è come assegnare i pesi ai vari termini del testo:<br />

una prima semplice soluzione consiste nell’assegnare come peso la frequenza con<br />

cui ogni termine compare all’interno dei vari documenti; in letteratura viene<br />

identificata con tfij ossia term frequency, frequenza con cui il termine i-esimo<br />

della collezione degli index terms compare nel documento j-esimo. La misura<br />

appena introdotta presenta però una serie di inconvenienti: innanzitutto questo<br />

modo di procedere si basa sull’assunzione che un termine sia tanto più importante<br />

in un documento quanto più è frequente al suo interno (se si escludono,<br />

ovviamente, le stop words), un’affermazione, questa, non sempre vera; inoltre<br />

sarebbe più utile una misura che tenesse anche conto della frequenza interdocumenti<br />

anzichè soltanto di quella intra-documenti, in quanto la prima ci può<br />

dire meglio quanto un certo termine sia caratterizzante per un particolare<br />

documento (più avanti vedremo alcuni tipi di misura che utilizzano la frequenza<br />

inter-documenti). Un terzo punto a sfavore è costituito dal fatto che una simile<br />

misura tende a favorire i documenti più lunghi, in cui un certo termine occorre un<br />

numero mediamente più alto di volte: per far fronte a questo problema si procede<br />

sovente ad una normalizzazione dei pesi, cioè si ha<br />

dove<br />

w = K<br />

ij<br />

14<br />

tf ij ∗<br />

• tfij = term frequency di i all’interno del documento j<br />

• j = lunghezza del documento j (numero di index term contenuti nel<br />

documento)<br />

• K = costante arbitraria<br />

Un modello leggermente più complesso è il cosiddetto Euclidean Weighted<br />

Boolean Model, in cui le formule per calcolare il peso dei vari documenti sono<br />

date da:<br />

j


3 – Strategie di retrieval<br />

BOOLEAN QUERY EUCLIDEAN WEIGHTED<br />

X OR Y ( ) p<br />

p p<br />

15<br />

w<br />

x<br />

+ w<br />

p ⎛ p<br />

p p<br />

( 1 w ) ( ) X AND Y x 1 w ⎞<br />

y<br />

1<br />

⎜ − + −<br />

−<br />

⎟<br />

⎜ 2 ⎟<br />

⎝<br />

⎠<br />

(p=1: simple weighting; p=2: Euclidean distance weighting)<br />

Questo modello permette anche ai documenti che non soddisfano la condizione<br />

booleana espressa dalla query di avere comunque un punteggio, allorchè molto<br />

basso.<br />

3.3 Modelli booleani estesi – MMM=Mixed Min and<br />

Max<br />

Questo modello è basato sulla teoria dei Fuzzy Set; senza addentrarci troppo nella<br />

loro trattazione, un fuzzy set è un insieme per cui la funzione di apparteneza non è<br />

booleana, come si può forse capire meglio dalla figura che segue:<br />

Figura 6 - Il concetto di fuzzy set<br />

y<br />

1<br />

1


3 – Strategie di retrieval<br />

Nel caso del modello in esame ad ogni index term ti è assegnato un set (fuzzy) di<br />

documenti ed i pesi Wij [ 0,<br />

1]<br />

∈ rappresentano il grado di appartenenza del<br />

documento docj al set di ti. Per calcolare il grado di appartenenza di un documento<br />

docj all’insieme unione o intersezione dei due fuzzy set dei termini ti e tk bisogna<br />

calcolare rispettivamente<br />

Wi∪k,j = max(Wij , Wkj)<br />

Wi∩k,j = min(Wij , Wkj)<br />

Secondo la teoria dei fuzzy set, i documenti da reperire per la query “ti OR tk”<br />

sarebbero quelli del fuzzy set associato all’unione dei set dei due termini, mentre<br />

quelli per la query “ti AND tk” sarebbero quelli del fuzzy set che si ricava<br />

dall’intersezione dei due set.<br />

Il modello MMM considera pertanto max( Wij , Wkj ) come misura di similarità<br />

tra la query “ti OR tk” ed il documento docj; analogamente min( Wij, Wkj ) risulta<br />

essere la misura di similarità tra la query “ti AND tk” ed il solito documento docj.<br />

Generalizzando, siano dati un documento docj, con pesi W1j, W2j, ..., Wnj e le<br />

query<br />

QOR = ( t1 OR t2 OR ... OR tn)<br />

QAND = (t1 AND t2 AND ... AND tn)<br />

Nel modello MMM si definisce la similarità fra le query ed il documento docj<br />

come<br />

S(QOR , docj) = COR1 * max(W1j, ... , Wnj) + COR2 * min(W1J, ... Wnj)<br />

S(QAND , docj) = CAND1 * min(W1j, ... , Wnj) + CAND2 * max(W1J, ... Wnj)<br />

dove COR1 > COR2 e CAND1 > CAND2 sono dei coefficienti che danno<br />

rispettivamente maggior importanza al termine con il massimo ed il minimo peso.<br />

16


3.4 Inference network<br />

3 – Strategie di retrieval<br />

Questo modello si basa su valutazioni di “presunta rilevanza” dei documenti a<br />

fronte di combinazioni arbitrarie dei termini richiesti nella query sottoposta al<br />

sistema, valutazioni che vengono assegnate dall’utente stesso.<br />

Supponiamo ad esempio di avere:<br />

COMBINAZIONE DI TERMINI PROB. CHE SIA RILEVANTE<br />

NOT COST AND NOT PAPER 0.1<br />

COST AND NOT PAPER 0.4<br />

NOT COST AND PAPER 0.5<br />

COST AND PAPER 0.9<br />

L’utente quindi assegna una probabilità che un documento qualsiasi sia rilevante a<br />

fronte delle varie combinazioni di index term; tali valori vengono poi utilizzati<br />

assieme alla probabilità che tali combinazioni si presentino effettivamente,<br />

assegnata dal sistema in base ai valori di tf. Quindi non è più necessario<br />

mantenere una lista degli index term presenti in ogni documento, con un evidente<br />

risparmio di risorse. Il punteggio assegnato ad ogni documento è la probabilità<br />

totale che tale documento sia rilevante; sempre riferendosi al caso visto prima,<br />

supponiamo di avere un documento doc1 per cui le probabilità che i due termini<br />

siano presenti valgano rispettivamente:<br />

COST = 0.2<br />

PAPER = 0.3<br />

il punteggio assegnato a tale documento sarà quindi:<br />

(0.1)*(0.8)*(0.7) + (0.4)*(0.2)*(0.7) + (0.5)*(0.8)*(0.3) + (0.9)*(0.2)*(0.3)<br />

ottenuto da<br />

• 0.1 = probabilità che doc1 sia rilevante se “cost” e “paper” sono entrambi<br />

presenti AND<br />

• 0.8 = probabilità che “cost” sia presente AND<br />

17


3 – Strategie di retrieval<br />

• 0.7 = probabilità che “paper” sia presente<br />

per il primo monomio,<br />

• 0.4 =probabilità che doc1 sia rilevante se “cost” è presente e “paper” è<br />

assente AND<br />

• 0.2 = probabilità che “cost” sia presente AND<br />

• 0.7 = probabilità che “paper” sia assente<br />

e così via.<br />

3.5 Vector space model<br />

Il più importante tra i modelli usati per costruire un sistema di retrieval che<br />

permetta un ordinamento sul set di documenti prodotto in uscita è sicuramente<br />

quello che viene indicato come vector space model. In questo modello una<br />

collezione di documenti viene rappresentata come uno spazio n-dimensionale,<br />

dove ogni dimensione è associata ad un diverso index term presente nella<br />

collezione stessa.<br />

Figura 7 - Rappresentazione dei documenti nel vector space model<br />

Ogni documento viene quindi rappresentato mediante un vettore (t1, t2, ..., tn)<br />

dove, nel caso più semplice, ti vale 1 se il documento contiene il termine i-esimo e<br />

18


3 – Strategie di retrieval<br />

0 in caso contrario; la stessa rappresentazione verrà adottata per le query<br />

sottoposte al sistema.<br />

Supponiamo ad esempio di avere una collezione di documenti caratterizzata da 7<br />

index term: improvement, information, linguistic, overhead, retrieval, storage,<br />

systems; se avessimo la query “linguistic for information storage and retrieval<br />

systems”, questa verrebbe rappresentata mediante il vettore<br />

q = ( 0 , 1 , 1 , 0 , 1 , 1 , 1 )<br />

dove un componente vale 1 se il corrispondente termine è presente nella query e 0<br />

se non è presente. I documenti che compongono la collezione possono essere<br />

rappresentati nello stesso modo, supponiamo di avere<br />

d <br />

1 = ( 1 , 1 , 0 , 1 , 0 , 1 , 0 )<br />

d <br />

2 = ( 0 , 1 , 1 , 1 , 0 , 0 , 1 )<br />

d <br />

3 = ( 0 , 0 , 1 , 0 , 1 , 1 , 1 )<br />

Per determinare quale documento sia più simile alla query si può calcolare<br />

l’angolo tra il vettore che rappresenta quest’ultima ed i vettori che rappresentano i<br />

vari documenti: quanto più è piccolo l’angolo tra due vettori, tanto più i due<br />

vettori (nel nostro caso la query ed un documento) sono considerati simili.<br />

Uno dei modi per ottenere la misura precedente consiste nel calcolare il prodotto<br />

scalare tra i vettori; nel caso preso in esame si avrebbe quindi<br />

q* d<br />

<br />

1 = ( 0 , 1 , 1 , 0 , 1 , 1 , 1 ) * ( 1 , 1 , 0 , 1 , 0 , 1 , 0 ) = 2<br />

q* d<br />

<br />

2 = ( 0 , 1 , 1 , 0 , 1 , 1 , 1 ) * ( 0 , 1 , 1 , 1 , 0 , 0 , 1 ) = 3<br />

q* d<br />

<br />

3 = ( 0 , 1 , 1 , 0 , 1 , 1 , 1 ) * ( 0 , 0 , 1 , 0 , 1 , 1 , 1 ) = 4<br />

da cui risulta che il documento d3 è quello più similare alla query.<br />

Per migliorare la qualità di questo modello si utilizzano dei vettori pesati<br />

(weighted vectors) in cui i vari elementi non sono più soltanto 0 e 1, ma dei<br />

numeri indicanti l’importanza di quel particolare termine per il documento<br />

corrente. Abbiamo già visto in precedenza che si potrebbe utilizzare come peso il<br />

numero di occorrenze di ogni termine all’interno dei documenti, ma abbiamo già<br />

anche notato come questa misura non sia ottimale in quanto tiene conto soltanto<br />

19


3 – Strategie di retrieval<br />

della frequenza intra-documenti e non di quella inter-documenti. Per gli scopi<br />

dell’information retrieval un index term risulta utile se esplica due funzioni:<br />

1. è rilevante rispetto al contenuto del documento, quindi aiuta a recuperare il<br />

documento in fase di ricerca (recall function, intra-document)<br />

2. permette di distinguere un documento, o un gruppo di essi, dal resto della<br />

collezione in modo da non restituirne un numero troppo elevato,<br />

comprendente sia testi rilevanti, sia non rilevanti (precision function, interdocument)<br />

Queste osservazioni suggeriscono di usare delle misure di frequenza relative per<br />

privilegiare i termini che hanno un alto numero di occorrenze in alcuni documenti<br />

della collezione, ma che risultano essere poco frequenti nel complesso di tutti i<br />

documenti. Il più noto schema di pesatura dei termini che tiene conto di questi<br />

fattori è quello indicato con<br />

tf * idf<br />

ovvero term frequency and inverse document frequency, ottenuto definendo<br />

• term frequency tfij = frequenza del termine i-esimo (ti) nel documento j-<br />

esimo (dj)<br />

• inverse document frequency idfi = log2<br />

normalizzata<br />

idfi = log2<br />

⎛ ⎞<br />

⎜<br />

max_ n<br />

⎟ +1 dove<br />

⎜ ⎟<br />

⎝ ni ⎠<br />

N = numero di documenti nella collezione<br />

ni = numero di documenti contenenti l’index term ti<br />

max_n = max { ni }<br />

e il peso di ti in docj è dato da<br />

Wij = tfij * idfi<br />

20<br />

N + 1 oppure, in forma<br />

ni


3 – Strategie di retrieval<br />

L’uso di tfij permette di discriminare tra termini di uno stesso documento, mentre<br />

l’uso di idfi ne considera l’importanza nel contesto della collezione nel suo<br />

complesso.<br />

Abbiamo visto prima che per confrontare due vettori dobbiamo considerare<br />

l’angolo tra di essi, per fare questo possiamo calcolare il coseno di tale angolo con<br />

la seguente formula:<br />

cos<br />

<br />

( q,<br />

d )<br />

=<br />

n<br />

2<br />

∑qi* ∑<br />

21<br />

n<br />

∑<br />

i = 1<br />

q * w<br />

n<br />

i=<br />

1 i=<br />

1<br />

dove n è il numero di componenti dei vettori nello spazio multidimensionale<br />

considerato, qi e wi sono i componenti di q e d ; quanto più è grande il valore del<br />

coseno, tanto più i due vettori sono simili e tanto più alto è il rank del documento.<br />

<br />

S q,<br />

d che prendono il<br />

In letteratura vengono presentate altre misure di similarità ( )<br />

nome dagli studiosi che le hanno proposte ed usate:<br />

Dice: S ( q , d )<br />

<br />

Jaccard: S(<br />

q,<br />

d )<br />

<br />

= n<br />

= 2 * n<br />

n<br />

i<br />

n<br />

i<br />

∑<br />

i = 1<br />

w<br />

2<br />

i<br />

q<br />

2<br />

∑ q * ∑<br />

i<br />

i = 1 i = 1<br />

n<br />

∑q<br />

i=<br />

1<br />

i<br />

*<br />

n<br />

w<br />

i<br />

w<br />

2<br />

2<br />

2<br />

∑q+ ∑w−∑q* ∑w<br />

i<br />

i<br />

i=<br />

1 i=<br />

1 i=<br />

1 i=<br />

1<br />

Una volta calcolato il valore del coseno (o di un’altra misura di similarità) per tutti<br />

i documenti, questi possono essere ordinati in base a tale valore e presentati<br />

all’utente finale; vedremo più avanti come questo modello venga implementato<br />

nella pratica.<br />

Un’altra rappresentazione usata spesso per rappresentare il vector model in<br />

letteratura è quella matriciale; un database contenente in totale d documenti<br />

i<br />

*<br />

wi<br />

n<br />

i<br />

n<br />

i<br />

2<br />

i<br />

2


3 – Strategie di retrieval<br />

rappresentati da t index term viene rappresentato con una term-by-document<br />

matrix di dimensioni t x d, in cui l’elemento aij è il peso associato al termine i-<br />

esimo del documento j-esimo. Le colonne di tale matrice rappresentano i vari<br />

documenti e quindi vengono chiamate document vectors, mentre le righe indicano<br />

i pesi di ogni index term nei documenti e sono chiamate term vectors.<br />

Vediamo un esempio: siano dati t=6 index terms<br />

T1 = bak(e,ing)<br />

T2 = recipes<br />

T3 = bread<br />

T4 = cake<br />

T5 = pastr(y,ies)<br />

T6 = pie<br />

e n=5 documenti<br />

D1: How to bake bread without recipes<br />

D2: <strong>The</strong> classic art of viennese pastry<br />

D3: Numerical recipes: the art of scientific computing<br />

D4: Bread, pastries, pies and cakes: quantity baking recipes<br />

D5: Pastry: a book of best french recipes<br />

Da cui si ottiene la seguente matrice term-by-document 6 x 5, dove il termine aij è<br />

il numero di volte che il termine i compare nel documento j:<br />

⎛1<br />

⎜<br />

⎜1<br />

⎜1<br />

A<br />

= ⎜<br />

⎜0<br />

⎜<br />

⎜<br />

0<br />

⎜<br />

⎝0<br />

0<br />

0<br />

0<br />

0<br />

1<br />

0<br />

22<br />

0<br />

1<br />

0<br />

0<br />

0<br />

0<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

0⎞<br />

⎟<br />

1⎟<br />

0⎟<br />

⎟<br />

0⎟<br />

1<br />

⎟<br />

⎟<br />

0<br />

⎟<br />


3 – Strategie di retrieval<br />

Questo tipo di rappresentazione viene usata perchè con lacune operazioni<br />

particolari sulle matrici è possibile ricavare le relazioni geometriche esistenti tra i<br />

document vector e con esse modellare le similitudini e le differenze di contenuto<br />

dei documenti.<br />

Questo tipo di modello presenta una grossa difficoltà: l’occupazione di risorse<br />

richiesta; supponendo di avere una collezione di 10000 documenti, un vocabolario<br />

di 100000 index terms e di riservare un byte per ogni entry nella matrice ci<br />

vorrebbe 1GB di memoria per contenere quest’ultima. Il problema è<br />

effettivamente importante, però ci sono due punti a favore: il primo è che un gran<br />

numero di entry nella matrice saranno a 0, per cui si può pensare di rappresentarla<br />

come una matrice sparsa con un conseguente risparmio di risorse; inoltre si<br />

possono utilizzare opportune tecniche di compressione che permettono di ridurre<br />

ulteriormente lo spazio occupato.<br />

Un’ultima considerazione: nel modello basato sullo spazio dei vettori la query<br />

sottoposta al sistema viene rappresentata internamente mediante un vettore, quindi<br />

non è più necessario l’uso di operatori booleani; l’utente può sottoporre le<br />

richieste usando il linguaggio normale oppure con un semplice elenco di parole<br />

anzichè con formule ed operatori per lui innaturali.<br />

3.6 Probabilistic retrieval<br />

I modelli probabilistici sono caratterizzati dall’applicazione formale della teoria<br />

delle probabilità alla logica dell’information retrieval; i documenti della<br />

collezione in esame vengono ordinati in base alla probabilità che essi soddisfino le<br />

richieste dell’utente.<br />

Alcuni studiosi (Cooper - Maron) hanno formulato negli anni ’60 il cosiddetto<br />

probability ranking principle: tale enunciato afferma che se un sistema di IR<br />

restituisce i documenti esaminati in ordine decrescente della loro probabilità di<br />

essere rilevanti e se tale probabilità è calcolata il più accuratamente possibile,<br />

23


3 – Strategie di retrieval<br />

allora l’effectiveness ottenibile con tale sistema è la migliore ottenibile sulla base<br />

dei dati a disposizione.<br />

Vedremo che tutta la teoria del probabilistic retrieval si basa sul teorema di<br />

Bayes o teorema della probabilità delle cause, di cui diamo ora una brevissima<br />

trattazione.<br />

Teorema di Bayes<br />

A volte non tutti i possibili eventi sono direttamente osservabili: in tal caso<br />

la probabilità marginale P(A) è indicata come probabilità a priori.<br />

Qualora l’evento A sia in qualche modo legato ad un secondo evento B,<br />

che invece possiamo osservare, la probabilità condizionata P(A|B) prende<br />

il nome di probabilità a posteriori perchè, a differenza di quella a priori,<br />

rappresenta un valore di probabilità valutata dopo la conoscenza di B.<br />

Figura 8 - Insieme degli eventi per la teoria di Bayes<br />

In generale, però, si conosce solamente P(A) e P(B|A) (queste ultime sono<br />

dette probabilità condizionate in avanti), e per calcolare P(A|B) occorre<br />

conoscere anche P(B). Quest’ultima quantità si determina saturando la<br />

probabilità congiunta P(A|B) rispetto a tutti gli eventi marginali Ai<br />

possibili:<br />

∑P( B,<br />

Ai<br />

) = ∑<br />

P ( B)<br />

P(<br />

B | A ) * P(<br />

A )<br />

= i i<br />

24<br />

i<br />

a patto che i vari Ai siano mutuamente esclusivi ed esaustivi dello spazio<br />

degli eventi.<br />

L’ultima relazione ci permette di enunciare il teorema preannunciato, che<br />

mostra come ottenere le probabilità a posteriori a partire da quelle a priori<br />

e da quelle condizionate in avanti:<br />

P(<br />

A | B)<br />

=<br />

i<br />

P(<br />

B | Ai<br />

) * P(<br />

Ai<br />

)<br />

P(<br />

B | A ) * P(<br />

A )<br />

∑<br />

k<br />

k<br />

k<br />

i


3 – Strategie di retrieval<br />

Il modello probabilistico è simile al vector space model in quanto i documenti e le<br />

query vengono rappresentati mediante vettori; la differenza sta nel fatto che,<br />

anzichè recuperare i documenti basandosi sulla loro similarità con la query, il<br />

modello probabilistico ordina i documenti in base alla probabilità che essi siano<br />

rilevanti per la query. Questa probabilità viene calcolata utilizzando un set di<br />

documenti per i quali è noto a priori se siano rilevanti oppure no.<br />

In pratica i pesi associati agli index term che costituiscono la collezione vengono<br />

calcolati basandosi sulla loro distribuzione nei documenti che vengono osservati<br />

come campione. Se assumiamo che le distribuzioni dei vari termini siano tra di<br />

loro indipendenti, il che non è in realtà del tutto vero , la probabilità che un<br />

documento sia rilevante rispetto ad una query può essere calcolata sommando i<br />

pesi associati ai termini comuni tra tale documento e la query; tali pesi indicano<br />

infatti la probabilità che i termini della query compaiano in un documento<br />

rilevante, ma non in uno non rilevante.<br />

Il problema che ci troviamo a dover affrontare può quindi essere espresso nei<br />

seguenti termini: supponiamo di avere un documento descritto dalla<br />

presenza/assenza degli index term ricavati dalla collezione in esame; possiamo<br />

rappresentarlo mediante un vettore binario<br />

<br />

D = X , X ,..., X )<br />

( 1 2 n<br />

dove Xi = 0 o 1 indica rispettivamente l’assenza o la presenza del termine i-esimo.<br />

La seconda assunzione che si fa è che ci siano due eventi tra di loro mutuamente<br />

esclusivi, ossia<br />

E1 = il documento esaminato è rilevante<br />

E2 = il documento esaminato NON è rilevante<br />

In base alle convenzioni qui presentate, possiamo dire che per ogni documento D<br />

a noi interessa calcolare P(E1|D) oppure, analogamente P(E2|D).<br />

Abbiamo già detto che in nostro aiuto viene il teorema di Bayes, il quale ci dice<br />

che per distribuzioni discrete si ha:<br />

25


P(<br />

E<br />

3 – Strategie di retrieval<br />

| D)<br />

P(<br />

D | E ) * P(<br />

E )<br />

i<br />

i<br />

i = i=1,2<br />

P(<br />

D)<br />

Da questa formula deriva la regola di decisione di Bayes, che si può così<br />

sintetizzare:<br />

[ P E | D)<br />

P(<br />

E | D)<br />

→ D rilevante,<br />

D non rilevante]<br />

( 1<br />

2<br />

> (1)<br />

Vediamo ora un esempio di una strategia basata sul teorema prima enunciato e<br />

sulle relazioni che da esso ne conseguono. Supponiamo di avere la seguente<br />

collezione di testi: per i primi tre conosciamo a priori se siano rilevanti oppure no,<br />

mentre per il quarto vogliamo determinarlo in qualche maniera.<br />

D1: “cost of paper is up” → rilevante<br />

D2: “cost of jellybeans is up” → non rilevante<br />

D3: “salaries of CEO’s are up” → non rilevante<br />

D4: “paper: CEO’s labor cost up” → ???<br />

Dalla collezione è possibile ricavare la seguente tabella:<br />

TERMINE RILEVANTI NON RILEVANTI SIGNIFICATIVITA’<br />

paper 1 0 FORTE<br />

CEO 0 ½ CONTRARIA<br />

labor 0 0 NON RILEVABILE<br />

cost 1 ½ DEBOLE<br />

up 1 1 NON RILEVABILE<br />

Ad ogni termine si assegnano dei cosiddetti “odds of relevance”, letteralmente<br />

delle “ipotesi di rilevanza” in base alle loro frequenze nel set di documenti<br />

conosciuti preso come campione. Nel nostro caso si ha:<br />

• paper: compare in tutti i documenti rilevanti ed in nessuno di quelli non<br />

rilevanti; ne deriva che la sua presenza in un documento indica un’alta<br />

probabilità che tale documento sia rilevante<br />

26


3 – Strategie di retrieval<br />

• CEO: compare più frequentemente nei documenti non rilevanti che in<br />

quelli rilevanti, quindi la sua presenza suggerisce che un testo non sia<br />

rilevante<br />

• cost: compare in un’alta percentuale di documenti rilevanti ed in una<br />

percentuale più bassa tra quelli non rilevanti; indica rilevanza, ma in<br />

misura minore rispetto al termine “paper”<br />

• labor, up: il primo non compare nè nei documenti rilevanti, nè in quelli<br />

non rilevanti; il secondo compare con egual frequenza in entrambi gli<br />

insiemi. Entrambi non portano nessuna informazione utile.<br />

Una volta calcolati gli odds of relevance associati ai vari index term bisogna<br />

utilizzarli per calcolare la probabilità che un certo documento sia rilevante; a tale<br />

scopo si utilizzano le seguenti equazioni:<br />

odds<br />

odds<br />

doc<br />

term<br />

∏<br />

= term<br />

27<br />

( odds )<br />

odds<br />

=<br />

odds<br />

rel<br />

term<br />

non rel<br />

r + 0.<br />

5<br />

oddsrel =<br />

nei documenti rilevanti<br />

n − r + 0.<br />

5<br />

odds rel<br />

r + 0.<br />

5<br />

=<br />

n − r + 0.<br />

5<br />

non nei documenti non rilevanti<br />

r = numero di documenti contenenti il termine in esame<br />

n = numero di documenti rilevanti o non rilevanti nella collezione<br />

Prima abbiamo visto che l’index term “cost” compare in 1 su 1 dei documenti<br />

rilevanti, da cui si ha:<br />

odds<br />

rel<br />

1+<br />

0.<br />

5<br />

= = 3<br />

1−1<br />

+ 0.<br />

5


3 – Strategie di retrieval<br />

odds non rel<br />

1+<br />

0.<br />

5<br />

= = 1<br />

2 −1+<br />

0.<br />

5<br />

Quindi, se il termine “cost” compare in un documento D, si ha un indice di<br />

rilevanza 3 associato a tale documento. Proviamo ora ad effettuare il calcolo<br />

completo per tutti i termini della collezione:<br />

TERMINE RILEVANTI NON RILEVANTI<br />

ODDS OF<br />

RELEVANCE<br />

paper 1 : 1 0 : 2<br />

1.<br />

5 2.<br />

5<br />

* = 15<br />

0.<br />

5 0.<br />

5<br />

CEO 0 : 1 1 : 2<br />

0.<br />

5 1.<br />

5 1<br />

* =<br />

1.<br />

5 1.<br />

5 3<br />

labor 0 : 1 0 : 2<br />

0.<br />

5 2.<br />

5 5<br />

* =<br />

1.<br />

5 0.<br />

5 3<br />

cost 1 : 1 1: 2<br />

1.<br />

5 1.<br />

5<br />

* = 3<br />

0.<br />

5 1.<br />

5<br />

up 1 : 1 2 : 2<br />

1.<br />

5 0.<br />

5 3<br />

* =<br />

0.<br />

5 2.<br />

5 5<br />

Total<br />

odds<br />

∏<br />

= odds = 15<br />

D 4 term<br />

Tutte le relazioni prese in esame sono state ricavate applicando una serie di<br />

trasformazioni alla relazione (1); da questa Robertson e Sparck Jones hanno<br />

derivato la formula per calcolare il peso degli index term che porta il loro nome e<br />

che ricorre frequentemente in letteratura<br />

W i<br />

⎛ r + 0.<br />

5 ⎞<br />

⎜ ⎟<br />

⎝ R − r + 0.<br />

5<br />

= log<br />

⎠<br />

⎛ n − r + 0.<br />

5 ⎞<br />

⎜<br />

⎟<br />

⎝ N − n − R + r + 0.<br />

5 ⎠<br />

Il significato dei vari simboli è indicato nella tabella seguente, che viene indicata<br />

come contingency table relativa al generico termine Xi nel campione di<br />

documenti di riferimento (dove Xi=1 o 0 indica come al solito la presenza o<br />

l’assenza del termine):<br />

28


n° documenti con<br />

Xi=1<br />

n° documenti con<br />

Xi=0<br />

3 – Strategie di retrieval<br />

n° documenti<br />

rilevanti<br />

29<br />

n° documenti non<br />

rilevanti<br />

r n-r n<br />

R-r N-n-R+r N-n<br />

R N-R N<br />

ci si rende conto che i pesi assegnati da Sparck Jones equivalgono aggli oddsterm<br />

che abbiamo calcolato in precedenza.<br />

Dalle elaborazioni matematiche di cui si è parlato prima si ricava anche che<br />

odds<br />

( A | B)<br />

( A | B)<br />

P<br />

=<br />

1−<br />

P(<br />

A | B)<br />

Quindi, tornando al nostro caso, abbiamo che il documento in esame ha una<br />

probabilità di essere rilevante pari a<br />

15 15<br />

=<br />

1+<br />

15 16<br />

Per la trattazione precedente si è fatta l’assunzione che gli index term fossero<br />

stocasticamente indipendenti; nella realtà non è così, per cui tutte le equazioni<br />

viste non sarebbero più valide: si assume però l’indipendenza perchè altrimenti si<br />

andrebbe incontro ad una trattazione matematica troppo complessa.<br />

3.7 Genetic algorithm<br />

Negli ultimi anni si è cercato in una vasta serie di campi di passare dai<br />

performance system, cioè sistemi che si limitavano ad eseguire le operazioni per<br />

le quali erano stati programmati (quindi senza alcuna capacità di autoapprendimento),<br />

ai machine learning system, cioè a sistemi in grado di acquisire<br />

informazioni direttamente dagli esempi che venivano loro trasmessi. Uno dei<br />

paradigmi seguiti è quello degli algoritmi genetici, basati cioè su processi<br />

naturali, in cui sopravvivono gli elementi che meglio si adattano alle condizioni<br />

imposte.


3 – Strategie di retrieval<br />

In letteratura si possono trovare numerosi esempi di algoritmi genetici utilizzati in<br />

information retrieval per risolvere svariati problemi.<br />

Un algoritmo genetico si può riassumere in una serie abbastanza standard di passi:<br />

1. Si inizia con una collezione più o meno casuale di organismi<br />

2. Si eliminano gli elementi poco “adatti”, nel nostro caso quelli che<br />

risulterebbero in un basso valore di precision/recall<br />

3. Si hanno degli accoppiamenti tra i vari individui (nel caso in cui gli<br />

individui siano dei vettori ciò consiste nell’effettuare degli swap tra i loro<br />

elementi) e si sostituisce una generazione con quella dei suoi discendenti<br />

(crossover)<br />

4. Si hanno delle mutazioni casuali su alcuni organismi (sempre nel caso di<br />

vettori ciò equivale ad avere un peso che cambia in maniera random)<br />

5. Si ripete il processo dal punto 2 fino a che la popolazione non raggiunge il<br />

livello di qualità desiderato<br />

Un algoritmo genetico mantiene ad ogni iterazione t una popolazione P(t)={X1 ,<br />

X2 , ... , Xn} dove ogni individuo rappresenta una potenziale soluzione del<br />

problema ed è implementato mediante una struttura dati S più o meno complessa.<br />

Ogni possibile soluzione Xi viene valutata in modo da determinare una misura di<br />

fitness che indica quanto sia vicina alla soluzione del problema. Abbiamo già<br />

visto che alcuni membri della popolazione subiscono delle trasformazioni in modo<br />

da generare nuove soluzioni: ci sono trasformazioni unarie Mi (mutazioni) che<br />

generano nuovi individui mediante un piccolo cambiamento in un singolo<br />

individuo, e trasformazioni di ordine più alto Ci (crossover) che originano nuovi<br />

individui combinando tra di loro parti provenienti da due o più elementi. Per<br />

esempio, se i genitori sono rappresentati da vettori a cinque dimensioni (a1 , a2 , a3<br />

, a4 , a5) e (b1 , b2 , b3 , b4 , b5), allora un crossover darà origine ad un nuovo<br />

individuo costituito da (a1 , a2 , b3 , b4 , b5) e (b1 , b2 , a3 , a4 , a5); l’operazione<br />

eseguita durante il crossover il crossover è lo scambio di informazioni tra due o<br />

più potenziali soluzioni. Dopo un certo numero di iterazioni il programma<br />

30


3 – Strategie di retrieval<br />

converge verso la soluzione finale e questa dovrebbe rappresentare la soluzione<br />

ottima al problema.<br />

Gli algoritmi genetici utilizzano un vocabolario che deriva da quello della<br />

genetica naturale, quindi si parla di geni (o bit), cromosomi o individui (o stringhe<br />

di bit).<br />

L’algorimo che analizziamo è costituito dai seguenti passi:<br />

1. Inizializzazione della popolazione e valutazione del fitness<br />

In pratica consiste nel decidere il numero di geni per ogni individuo ed il<br />

numero totale di cromosomi (popsize) della popolazione iniziale. La<br />

popolazione iniziale contiene un set di documenti considerati rilevanti da parte<br />

di un utente (ad esempio selezionati tra quelli restituiti da una precedente<br />

query); lo scopo dell’algoritmo è quello di trovare il set ottimo di documenti<br />

che rispondono alle richieste dell’utente. La funzione utilizzata per calcolare il<br />

fitness dei vari individui si basa sul coefficiente di Jaccard: questo indica il<br />

grado di similarità tra due set di dati (nel caso di applicazioni di information<br />

retrieval generalmente si tratta di index term) e vale:<br />

X ∩ Y<br />

dove | S | indica la cardinalità di un determinato set S.<br />

X ∪Y<br />

2. Riproduzione (selezione)<br />

La riproduzione è la selezione di una nuova popolazione in base al valore di<br />

fitness dei vari individui. Allo scopo si definisce una funzione che in maniera<br />

assolutamente casuale sorteggi i vari cromosomi (generalmente in numero<br />

eguale alla cardinalità attuale della popolazione) che debbono dare vita alla<br />

nuova generazione (ovviamente bisogna costruire tale funzione in modo che la<br />

probabilità di un cromosoma di venire sorteggiato sia direttamente<br />

proporzionale al proprio valore di fitness); uno stesso cromosoma può venire<br />

sorteggiato più di una volta. Questo modo di procedere segue la logica<br />

dell’ereditarità del mondo naturale: i cromosomi migliori danno origine a più<br />

31


3 – Strategie di retrieval<br />

copie, quelli di livello medio rimangono in numero all’incirca costante mentre<br />

quelli peggiori muoiono.<br />

3. Ricombinazione (crossover e mutazioni)<br />

A questo punto si procede ad applicare gli operatori di ricombinazione: per il<br />

crossover viene generato per ogni cromosoma un numero random r compreso<br />

tra 0 ed 1, se r < pc (dove pc è la probabilità di crossover ed è un parametro<br />

determinato a priori) allora il cromosoma viene selezionato per il crossover. Si<br />

procede quindi ad unire tra di loro coppie casuali di cromosomi; per ciascuna<br />

coppia si genera un numero random pos nel range (1 , ... , m - 1) dove m è il<br />

numero totale di geni dei cromosomi. Ogni coppia di cromosomi si scambia<br />

quindi i geni a partire dal crossing point nel modo visto in precedenza.<br />

Il secondo operatore di ricombinazione, ossia la mutazione, opera invece su<br />

una base costituita da un singolo bit; anche qui si determina a priori una<br />

probabilità di mutazione pm che è uguale per tutti i bit in tutti i cromosomi<br />

della popolazione. Per ogni bit si genera un numero random r variabile tra 0 ed<br />

1: se r < pm allora il bit muta, ossia passa da 0 ad 1 o viceversa.<br />

Valori tipici per pc sono tra 0.7 e 0.9 mentre per pm si va da 0.01 a 0.03.<br />

4. Convergenza<br />

Dopo tutte le operazioni viste finora si ha una nuova generazione della<br />

popolazione; l’evoluzione procede attraverso ripetizioni cicliche dei passi<br />

precedenti finchè non si è generato un certo numero di nuove generazioni<br />

oppure converge verso una situazione stabile.<br />

Per una presentazione pratica di questo algoritmo si rimanda al paragrafo 4.1.<br />

32


Capitolo 4<br />

Utility<br />

Lo scopo dei sistemi di information (text) retrieval è di associare le query degli<br />

utenti con i documenti che “contengono gli stessi concetti”.<br />

Le strategie viste finora cercano di svolgere questo compito confrontando i<br />

termini presenti nelle query con quelli che si trovano nei documenti; abbiamo<br />

visto che le strategie più usate sono quelle che ordinano i documenti in base ai<br />

risultati di questi confronti. In questo capitolo vengono presentate quelle che in<br />

letteratura sono generalmente indicate come utility; le utility sono tecniche che<br />

permettono di migliorare l’accuratezza del retrieval e possono essere usate in<br />

cooperazione con le strategie viste in precedenza. Fondamentalmente queste<br />

tecniche hanno lo scopo di determinare se una parola può essere un termine<br />

rappresentativo di un documento o no. Finora abbiamo assunto che gli index term<br />

fossero delle singole parole, o parti di esse; in realtà un index term andrebbe visto<br />

più correttamente come un’unità di informazione, quindi potrebbe trattarsi anche<br />

di una coppia di parole, di una frase, o anche di una collezione di termini i cui<br />

significati sono in relazione l’uno con l’altro.<br />

Le utility più frequentemente usate sono:<br />

• Relevance feedback: dopo aver valutato il risultato di una ricerca, la<br />

query viene ridefinita aggiungendo o sottraendo termini, oppure<br />

modificando i pesi assegnati ai vari termini sulla base dei documenti che<br />

sono giudicati rilevanti; si procede quindi ad un nuovo retrieval<br />

• Clustering: i documenti vengono organizzati in gruppi sulla base del loro<br />

contenuto<br />

• Passage based retrieval: i documenti vengono suddivisi in unità più<br />

piccole che vengono poi ordinate e presentate all’utente<br />

• N-grams: si usano delle stringhe di lunghezza N come termini in modo da<br />

fornire una tolleranza agli errori e facilitare le ricerche con i caratteri jolly<br />

33


4 - Utility<br />

• <strong>The</strong>sauri: le query vengono automaticamente espanse utilizzando dei<br />

sinonimi dei termini presenti in esse<br />

• Parsing: permette di identificare delle frasi, gruppi di parole o parti di esse<br />

come termini significativi<br />

• Regression analysis: permette di correggere i parametri del sistema in<br />

modo da migliorare le performance, il tutto a partire da un set di<br />

documenti che sono considerati rilevanti.<br />

4.1 Relevance feedback<br />

Abbiamo visto in precedenza che per molti utenti risulta difficoltoso esprimere le<br />

proprie esigenze informative mediante una query da sottoporre ad un sistema di<br />

IR; questo suggerisce che la prima operazione dovrebbe essere considerata<br />

soltanto un tentativo, in modo da ottenere un primo insieme di documenti da<br />

valutare. Partendo dal contenuto di tali documenti si potrebbe modificare la query<br />

di partenza, ad esempio aggiungendo nuovi termini suggeriti dal primo set di<br />

documenti, in modo da migliorare la ricerca nella collezione; l’ideale sarebbe che<br />

questa operazione venisse eseguita in automatico dal sistema, senza caricare<br />

l’utente di ulteriore lavoro.<br />

Su questo concetto si basa la tecnica di relevance feedback: l’idea principale<br />

consiste nello scegliere i termini o le espressioni importanti dei documenti che un<br />

utente ha identificato come rilevanti e nel mettere in risalto tali termini in una<br />

successiva formulazione della query di ricerca; analogamente i termini che sono<br />

presenti nei documenti giudicati non rilevanti vengono eliminati (o perlomeno<br />

posti in secondo piano) quando la query viene riformulata. Il risultato di questo<br />

processo è di “muovere” la query, nel caso di una nuova ricerca, in direzione dei<br />

documenti rilevanti e di allontanarla da quelli che risultano poco interessanti.<br />

Il tutto porta i seguenti vantaggi:<br />

• l’utente non è obbligato a conoscere nel dettaglio i documenti per costruire<br />

delle query efficaci<br />

34


4 - Utility<br />

• si spezza il processo di ricerca in tanti piccoli passi, in modo da arrivare al<br />

risultato desiderato in maniera graduale.<br />

Il primo modello per cui è stato proposto il processo di relevance feedback è il<br />

vector space model, in cui una query può essere espressa mediante un vettore<br />

Q =<br />

(<br />

q<br />

1<br />

,<br />

q<br />

35<br />

2<br />

,...,<br />

dove qi rappresenta il peso assegnato al termine i-esimo nella query; tali pesi<br />

generalmente variano tra 0 e 1. Data la query precedente il processo di relevance<br />

feedback genera un nuovo vettore<br />

q<br />

t<br />

)<br />

, ,..., ) q q q Q ′ ′ ′ = ′<br />

( 1 2 t<br />

dove q′ i rappresenta il peso alterato assegnato al termine i-esimo. Vengono<br />

introdotti nuovi termini assegnando un peso positivo dove prima era 0 ed<br />

eventualmente eliminati alcuni di quelli presenti riportando a 0 i pesi inizialmente<br />

non nulli. Il processo di feedback può essere rappresentato graficamente come uno<br />

spostamento del vettore della queryda un’area ad un’altra nello spazio t-<br />

dimensionale definito dai t termini che costituiscono il vocabolario. Vediamo ora i<br />

vari passi di un processo di relevance feedback: abbiamo visto che possiamo<br />

rappresentare sia i documenti D, sia le richieste di informazione Q mediante dei<br />

vettori t-dimensionali della forma<br />

( 1, 2,...,<br />

t ) w w w D =<br />

, ,..., ) q q q Q =<br />

( 1 2 t<br />

dove wi e qi rappresentano il peso assegnato al termine i-esimo nel documento e<br />

nella query rispettivamente.<br />

Una volta ordinati i documenti in base alla query e dopo che l’utente ha<br />

selezionato n1 documenti rilevanti (supponiamo che n2 indichi invece il numero di<br />

documenti non rilevanti) si può procedere a riformulare la query<br />

1<br />

Q′<br />

= Q+<br />

n<br />

Di<br />

1<br />

∑ −<br />

D n<br />

1 doc. i<br />

rilevanti<br />

∑<br />

Di<br />

D<br />

2 doc. NON i<br />

rilevanti


4 - Utility<br />

Una formula simile alla precedente che si incontra spesso in letteratura è la<br />

formula di Rocchio<br />

dove , γ ∈ [ 0,<br />

1]<br />

β e β + γ = 1.<br />

Di<br />

Q′<br />

= Q + β ∑ −γ<br />

n<br />

doc.<br />

1<br />

rilevanti<br />

36<br />

∑<br />

D<br />

n<br />

doc.<br />

NON 2<br />

rilevanti<br />

I valori dei due parametri vengono scelti in base a quanto si vuole che incidano in<br />

fase di feedback i documenti rilevanti (per inserire nuovi termini nella query),<br />

piuttosto che quelli non rilevanti (per eliminare i termini che non sono<br />

significativi per la ricerca).<br />

Vediamo brevemente un’applicazione che esegue una sorta di relevance feedback<br />

associato all’algoritmo genetico introdotto al paragrafo 3.7. Si è visto che con le<br />

tecniche di relevance feedback l’utente sottopone una query al sistema e questo<br />

risponde proponendo una serie di documenti in risposta; il sistema può però anche<br />

procedere ad una analisi dei documenti che l’utente considera rilevanti in modo da<br />

estrarre quelli che sono i concetti presenti in tali documenti e proporre all’utente<br />

stesso una nuova query di ricerca (o addirittura modificare automaticamente<br />

quella originaria) che dovrebbe, teoricamente, eseguire una ricerca più mirata su<br />

tutta la collezione.<br />

Supponiamo che, un utente abbia selezionato da un elenco i cinque documenti<br />

rappresentati dalle seguenti liste di index term:<br />

• DOC0: DATA RETRIEVAL, DATABASE, COMPUTER NETWORKS,<br />

IMPROVEMENTS, INFORMATION RETRIEVAL, METHOD,<br />

NETWORK, MULTIPLE, QUERY, RELATION, RELATIONAL,<br />

RETRIEVAL, QUERIES, RELATIONAL DATABASES,<br />

RELATIONAL DATABASE, US, CARAT.DAT, GQP.DAT,<br />

ORUS.DAT, QUERY.OPT<br />

• DOC1: INFORMATION, INFORMATIONAL RETRIEVAL,<br />

INFORMATION STORAGE, INDEXING, RETRIEVAL, STORAGE,<br />

US, KEVIN.HOT<br />

• DOC2: ARTIFICIAL INTELLIGENCE, INFORMATION RETRIEVAL<br />

SYSTEMS, INFORMATION RETRIEVAL, INDEXING, NATURAL<br />

LANGUAGE PROCESSING, US, DBMS.AI, GQP.DAT<br />

i


4 - Utility<br />

• DOC3: FUZZY SET THEORY, INFORMATION RETRIEVAL<br />

SYSTEMS, INDEXING, PERFORMANCE, RETRIEVAL SYSTEMS,<br />

RETRIEVAL, QUERIES, US, KEVIN.HOT<br />

• DOC4: INFORMATION RETRIEVAL SYSTEMS, INDEXING,<br />

RETRIEVAL, STAIRS, US, KEVIN.HOT<br />

L’elenco totale di concetti, o index term, è il seguente:<br />

DATA RETRIEVAL, DATABASE, COMPUTER NETWORKS,<br />

IMPROVEMENTS, INFORMATION RETRIEVAL, METHOD, NETWORK,<br />

MULTIPLE, QUERY, RELATION, RELATIONAL, RETRIEVAL, QUERIES,<br />

RELATIONAL DATABSES, RELATIONAL DATABSE, US, CARAT.DAT,<br />

GQP.DAT, ORUS.DAT, QUERY.OPT, INFORMATION, INFORMATION<br />

STORAGE, INDEXING, STORAGE, KEVIN.HOT, ARTIFICIAL<br />

INTELLIGENCE, INFORMATION RETRIEVAL SYSTEMS, NATURAL<br />

LANGUAGE PROCESSING, DBMS.AI, FUZZY SET THEORY,<br />

PERFORMANCE, RETRIEVAL SYSTEMS, STAIRS.<br />

Se rappresentiamo ogni documento mediante una stringa in cui i vari bit a 0 o 1<br />

indicano l’assenza o la presenza di un determinato concetto, otteniamo:<br />

• DOC0 : 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0<br />

• DOC1 : 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0<br />

• DOC2 : 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 1 1 1 0 0 0 0<br />

• DOC3 : 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0<br />

• DOC4 : 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1<br />

Andiamo ora a calcolare il valore di fitness per i vari documenti: allo scopo si<br />

calcola quanto ogni documento sia similare agli altri nel set utilizzando il<br />

coefficiente di Jaccard e facendo poi la media dei valori trovati su tutto il set. Se<br />

ragioniamo su una coppia di documenti, un valore alto di tale coefficiente indica<br />

che i due documenti risultano essere strettamente correlati per quel che riguarda i<br />

concetti espressi; se invece ci riferiamo a tutto il set, un valore alto del<br />

coefficiente medio indica che tutti i documenti condividono parecchi concetti.<br />

Nel caso in esame si ha:<br />

• coefficiente di Jaccard tra DOC0 e DOC0 = 1.000000<br />

• coefficiente di Jaccard tra DOC0 e DOC1 = 0.120000<br />

• coefficiente di Jaccard tra DOC0 e DOC2 = 0.120000<br />

• coefficiente di Jaccard tra DOC0 e DOC3 = 0.115384<br />

• coefficiente di Jaccard tra DOC0 e DOC4 = 0.083333<br />

37


4 - Utility<br />

Facendo la media dei valori calcolati si ottiene il valore della misura di fitness per<br />

DOC0 che vale 0.287744; procedendo in maniera analoga per tutti cinque i<br />

documenti si ha:<br />

• fitness per DOC0 = 0.287744<br />

• fitness per DOC1 = 0.411692<br />

• fitness per DOC2 = 0.367556<br />

• fitness per DOC3 = 0.427473<br />

• fitness per DOC4 = 0.451212<br />

Partendo da questa situazione, attraverso le successive generazioni il sistema<br />

evolve verso la seguente soluzione: 000000000001000100000010101000001; in<br />

essa sono presenti sei keywords: RETRIEVAL, US, INDEXING, KEVIN.HOT,<br />

INFORMATION RETRIEVAL SYSTEMS, STAIRS; sono quelle che meglio<br />

rappresentano il set iniziale di documenti. Utilizzando queste keywords<br />

“ottimizzate” per la ricerca, il sistema di information retrieval dovrebbe restituire<br />

un set di documenti ottimizzato rispetto a quelle che sono le esigenze dell’utente.<br />

4.2 Parsing<br />

Le tecniche di parsing vengono utilizzate in fase di preprocessing, quando si<br />

analizza il testo piatto e si cerca di strutturarlo in maniera che il sistema di IR<br />

possa effettuare in modo conveniente le ricerche. In particolare si procede ad<br />

estrarre i token, o unità di informazione, che verranno poi organizzati in<br />

opportune strutture, come si vedrà più avanti.<br />

Esistono numerose tecniche di parsing, alcune di esse sono convenienti e vengono<br />

largamente utilizzate, altre invece sono difficili da implementare,<br />

computazionalmente espensive e non apportano grossi vantaggi, per cui sono<br />

raramente usate nei sistemi di IR.<br />

Le tecniche di parsing che possiamo incontrare nei sistemi di IR sono:<br />

• Stemming: consiste nel rimuovere i prefissi ed i suffissi comuni a più<br />

parole (ad esempio –s, -ed, -ing, ecc. nel caso della lingua inglese) in<br />

38


4 - Utility<br />

modo da poter raggruppare le parole che hanno la stessa radice. Le regole<br />

adottate variano a seconda del linguaggio in esame e trovano largo<br />

impiego<br />

• Phrasing: molto semplicemente si tratta ogni coppia di parole consecutive<br />

come un singolo termine; alla fine si considerano solo le coppie che si<br />

presentano oltre un determinato numero di volte, tutte le restanti<br />

combinazioni invece possono presumibilmente venire mappate con dei<br />

termini singoli. Questa tecnica viene utilizzata qualche volta, seppure non<br />

molto sovente<br />

• Part-of-speech taggers: questi sistemi sono in grado di identificare nomi,<br />

verbi ed aggettivi, e di metterli in relazione se hanno il medesimo<br />

significato. Si tratta di sistemi pesanti da implementare e per questo sono<br />

usati molto di rado<br />

• Syntactic parsing: permette di identificare alcune strutture nel testo che<br />

hanno il medesimo significato, ma sono espresse in maniera differente.<br />

Esempio: “President of America”=”American president”. Si tratta di<br />

sistemi estremamente complessi, allo stato attuale solo in fase di studio<br />

4.2.1 Stemming<br />

Vediamo ora più in particolare la più usata tra le tecniche a cui si è accennato,<br />

ossia lo stemming. L’assunzione che sta alla base dello stemming è che termini<br />

con una radice (stem) comune solitamente hanno un significato simile, ad esempio<br />

CONNECT<br />

CONNECTED<br />

CONNECTING<br />

CONNECTION<br />

CONNECTIONS.<br />

Molto spesso le performance di un sistema di IR possono essere migliorate se<br />

gruppi di termini come quelli appena visti vengono collassati in un singolo<br />

39


4 - Utility<br />

termine (le tecniche di stemming vengono sempre associate con quelle di<br />

conflation). Questo può essere fatto rimuovendo i vari suffissi –ed, -ing, -ion, -<br />

ions e lasciando soltanto il termine “connect”. Così facendo si riduce il numero<br />

totale di termini che il sistema di IR deve gestire, con conseguente diminuzione<br />

della quantità e della complessità dei dati nel sistema.<br />

Vi sono quattro tipologie di algoritmi di stemming:<br />

• Affix removal algorithms: rimuovono prefissi e/o suffissi dei termini in<br />

base a regole predeterminate e mappate nell’algoritmo; questi metodi<br />

sovente modificano anche lo stem ottenuto<br />

• Successor variety stemmers: utilizzano come base per lo stemming la<br />

frequenza con cui compaiono determinate sequenze di lettere nel testo<br />

• N-grams methods: raggruppano i termini in base al numero di n-gram (=<br />

gruppi di lettere) che condividono. In realtà non è correttissimo definirli<br />

algoritmi di stemming perchè sono più che altro dei metodi di conflation<br />

• Lookup table: i vari termini ed i corrispondenti stem vengono<br />

memorizzati in una tabella ad-hoc<br />

Vediamo ora più in particolare le varie tipologie.<br />

LOOKUP TABLES (Bentley, 1982)<br />

Il primo metodo che può venire in mente è quello di mantenere una tabella con<br />

tutti gli index term ed i corrispondenti stem.<br />

TERMINE STEM<br />

engineering engineer<br />

engineered engineer<br />

engineer engineer<br />

.... ....<br />

I termini presenti nelle query e nel testo vengono troncati utilizzando una tabella<br />

simile come base; la tabella potrebbe essere mantenuta utilizzando un B-tree o una<br />

40


4 - Utility<br />

hash table, il che garantirebbe tempi di accesso ridotti. Gli svantaggi di una simile<br />

implementazione risultano evidenti: innanzitutto è necessario un overhead<br />

notevole per mantenere la struttura dati; inoltre la tabella andrebbe compilata a<br />

priori, se non proprio a mano, quasi.<br />

SUCCESSOR VARIETY STEMMER (Hafer – Weiss, 1974)<br />

Questo algoritmo si basa esclusivamente sulla distribuzione delle lettere<br />

dell’alfabeto nel testo: non necessita di alcuna precompilazione umana. In parole<br />

povere la “varietà di successori di una stringa” (successor variety of a string, da<br />

qui in avanti lo indicheremo con SV) è il numero di differenti caratteri che<br />

seguono una determinata stringa nelle parole del testo in esame. Ad esempio<br />

supponiamo di voler determinare i valori di SV per la parola “apple” e di avere<br />

come campione un testo composto da: “able”,“axle”,“accident”,“ape”,“about”. La<br />

prima lettera che compone la nostra parola, ossia la ‘a’, nel testo è seguita da ‘b’,<br />

‘x’, ‘c’ e ‘p’, per cui il suo valore di SV è 4. Se andiamo avanti troviamo che il<br />

valore di SV per la sottostringa “ap” vale 1 perchè nel testo campione la<br />

sottostringa “ap” è presente una sola volta e seguita dal carattere ‘e’, e così via.<br />

Se consideriamo un testo campione sufficientemente lungo, generalmente i valori<br />

di SV hanno un andamento abbastanza caratteristico: SV diminuisce man mano<br />

che la sottostringa aumenta di lunghezza finchè si raggiunge un valore limite; da<br />

qui in avanti SV torna a salire rapidamente. Questa informazione (ossia il punto in<br />

cui si raggiunge il minimo) viene utilizzato per segmentare la parola in due<br />

sottostringhe; per fare questo si può usare uno di tre metodi seguenti:<br />

a) Cutoff method: si fissa a priori un valore limite (cutoff) per SV e si<br />

divide la parola in corrispondenza del punto in cui si raggiunge tale<br />

limite. C’è il problema tipico di tutti questi tipi di sistemi, vale a dire<br />

trovare una quantità adatta per il valore di soglia.<br />

b) Peak and plateau method: si divide il termine quando si incontra un<br />

carattere per cui il valore di SV eccede sia quello del carattere<br />

immediatamente precedente, sia quello del carattere immediatamente<br />

successivo<br />

41


4 - Utility<br />

c) Complete word method: si fissa un break quando si incontra una<br />

stringa che è anche una parola completa nel testo campione<br />

Es.<br />

Problema: determinare lo stem della parola READABLE<br />

Testo campione: ABLE, APE, BEATABLE, FIXABLE, READ, READABLE,<br />

READING, READS, RED, ROPE, RIPE.<br />

PREFISSO SUCCESSOR VARIETY LETTERE<br />

R 3 E, I, O<br />

RE 2 A, D<br />

REA 1 D<br />

READ 3 A, I, S<br />

READA 1 B<br />

READAB 1 L<br />

READABL 1 E<br />

READABLE 1 blank<br />

Utilizzando il complete word segmentation method la parola viene suddivisa in<br />

READ e ABLE, poichè READ appare come una parola nel testo campione; lo<br />

stesso risultato si ottiene con il metodo peak and plateau.<br />

Dopo che una parola è stata segmentata bisogna selezionare il segmento da usare<br />

come stem: Hafer e Weiss proposero il seguente metodo empirico<br />

if first segment occurs in n


4 - Utility<br />

a) Determinare i valori di SV per una parola<br />

b) Utilizzare le informazionio al punto (a) per dividere la parola in due<br />

segmenti<br />

c) Selezionare uno dei due segmenti come stem<br />

SHARED DIGRAMS METHOD (Adamson - Boreham)<br />

Un digramma è una coppia di lettere consecutive tra quelle che formano una<br />

parola; questi metodi calcolano opportune misure di associazione tra le varie<br />

coppie di termini basate sul numero di digrammi che queste hanno in comune.<br />

Es.<br />

Statistics st ta at ti is st ti ic cs Digrammi unici : at cs ic is st ta ti<br />

Statistical st ta at ti is st ti ic ca al Digrammi unici : al at ca ic<br />

is st ta ti<br />

Una volta identificati i digrammi unici per i due termini si calcola la loro<br />

similarità sulla base del coefficiente di Dice<br />

S ( x,<br />

y)<br />

= 2<br />

x ∩ y<br />

x + y<br />

dove x = insieme dei digrammi unici del primo termine<br />

y = insieme dei digrammi unici del secondo termine<br />

Una misura di similarità come questa viene calcolata per ogni coppia di termini da<br />

analizzare e si ottiene così una matrice triangolare di similarità; una volta riempita<br />

la matrice si raggruppano i termini che hanno un valore di similarità maggiore o<br />

uguale di un determinato valore di soglia e si collocano nella medesima classe.<br />

Quello appena visto non è quindi propriamente un algoritmo di stemming (non<br />

calcola infatti la radice per i termini che si analizzano) bensì un algoritmo di<br />

conflation.<br />

AFFIX REMOVAL STEMMERS<br />

questa tipologia di algoritmi opera rimuovendo i suffissi e/o i prefissi dai termini<br />

analizzati lasciando uno stem; alcuni di essi inoltre modificano anche gli stem<br />

43


4 - Utility<br />

risultanti dall’elaborazione. Un algoritmo di questo tipo assai banale è quello che<br />

rimuove i plurali dei termini; le regole che costituiscono tale algoritmo (sempre<br />

riferendosi alla lingua inglese) sono le seguenti:<br />

• se una parola termina in -ies ma non in -eies o -aies: sostituire –ies con –y<br />

• se una parola termina con –es ma non con –aes, -ees, -oes: sostituire –es<br />

con –e<br />

• se una parola termina con –s ma non con –us o –ss: sostituire –s con<br />

NULL<br />

La maggior parte degli stemmers appartenenti a questa tipologia sono degli<br />

iterative longest match stemmers: essi rimuovono dai termini la più lunga stringa<br />

di caratteri possibile in base ad un certo set di regole; questo processo viene<br />

ripetuto fino a che non può più essere eliminato alcun carattere. Esempi di<br />

algoritmi molto utilizzati sono quelli proposti da Lovins (1968), Salton (1968),<br />

Dalton (1974), Porter (1980) e Paice (1990).<br />

Algoritmo di Porter<br />

Più che di un algoritmo si tratta di una serie di regole (una sessantina circa); ogni<br />

regola rappresente una possibile struttura che può avere un determinato termine, e<br />

per ognuna di queste regole è indicata una trasformazione che da eseguire sulla<br />

parola in esame; ogni regola quindi è costituita da una tripla del genere:<br />

Condizione Vecchio suffisso Nuovo suffisso (può<br />

anche essere blank, il<br />

che significa che il<br />

suffisso va eliminato)<br />

Dove la condizione viene espressa con una particolare notazione formale.<br />

Le regole sono divise in una serie di step; le regole in ogni step vengono valutate<br />

in sequenza e sono strutturate in modo che una sola di essa possa eventualmente<br />

trovare applicazione; le regole sono ordinate in modo tale che ad ogni step venga<br />

rimosso il più lungo suffisso possibile.<br />

44


4 - Utility<br />

4.3 Clustering – Classificazione dei documenti<br />

Nell’ambito dell’information retrieval si definisce cluster un gruppo omogeneo di<br />

documenti che sono tra loro più fortemente associati di quanto lo siano con<br />

documenti in altri gruppi; quindi, a grandi linee, un processo di clustering si può<br />

vedere come l’organizzazione degli oggetti in gruppi i cui membri sono similari in<br />

qualche modo.<br />

Prima di descrivere i vari metodi di classificazione che vengono adottati mi<br />

sembra opportuno citare l’enunciato che sta alla base del loro utilizzo e che in<br />

letteratura viene indicato come Cluster Hypothesis: i documenti che sono simili<br />

l’uno con l’altro tendono ad essere rilevanti per le medesime query.<br />

Per la ricerca risulta conveniente assegnare ad ogni cluster un elemento<br />

rappresentativo, generalmente chiamato centroide, che rappresenta in qualche<br />

modo la media dei documenti appartenenti a quel determinato cluster; anzichè<br />

confrontare la query dell’utente con tutti i documenti della collezione la si<br />

confronta con i vari centroidi e come risultato si restituisce il cluster, o i cluster,<br />

che risulta essere più rispondente alla query. A questo punto si può eventualmente<br />

procedere ad una ricerca ulteriore tra i documenti appartenenti al cluster<br />

selezionato.<br />

Per organizzare i documenti in cluster bisogna innanzitutto definire una qualche<br />

misura di similarità tra i documenti e in secondo luogo definire i metodi per<br />

suddividere in classi questi ultimi. Nell’ipotesi di rappresentare i documenti<br />

mediante vettori, una misura di similarità potrebbe essere il coseno dell’angolo<br />

che intercorre tra le varie coppie di vettori, oppure si possono adottare i<br />

coefficienti di Dice o di Jaccard già visti in precedenza. Alcuni studi hanno<br />

dimostrato che la scelta della misura di similarità ha un impatto qualitativo<br />

trascurabile rispetto a quello legato alla scelta dell’algoritmo di clustering vero e<br />

proprio.<br />

Una volta scelta la misura di similarità da adottare e compilata la matrice delle<br />

similarità tra i documenti, si può procedere alla loro suddivisione. Ci sono due tipi<br />

45


4 - Utility<br />

principali di classificazioni che possono essere adottate: la prima è una<br />

suddivisione piatta in gruppi mutuamente esclusivi, la seconda è una<br />

classificazione gerarchica su più livelli; in questo caso ogni documento fa parte di<br />

un gruppo che a sua volta appartiene ad un gruppo più generale, e così via. A loro<br />

volta gli algoritmi di clustering gerarchico si dividono in due grandi categorie: gli<br />

algoritmi divisivi e quelli agglomerativi. Gli algoritmi divisivi iniziano<br />

considerando l’intera collezione come un unico gruppo, il quale viene suddiviso in<br />

sottogruppi; ciascuno di questi sottogruppi viene a sua volta diviso in gruppi più<br />

piccoli e così via fino a che ogni oggetto costituisce un gruppo a sè. Viceversa gli<br />

algoritmi agglomerativi iniziano dalla situazione in cui ogni oggetto costituisce un<br />

gruppo e i vari gruppi vengono via via combinati fino a che non ne rimane uno<br />

unico. Si avranno quindi dei cluster piccoli ad un estremo della gerarchia<br />

contenenti documenti molto simili tra di loro e cluster via via più grandi man<br />

mano che ci si sposta verso l’estremo opposto, contenenti documenti sempre più<br />

distanti l’uno dallaltro.<br />

Documento 1<br />

Documento 9<br />

Documento 5<br />

Documento 3<br />

Documento 8<br />

Documento 2<br />

Documento 6<br />

Documento 10<br />

Documento 4<br />

Documento 7<br />

Figura 9 - Esempio di dendogramma<br />

46


4 - Utility<br />

Il risultato dell’applicazione di questi algoritmi viene solitamente descritto<br />

mediante un particolare albero binario detto dendogramma: i documenti vengono<br />

rappresentati come nodi mentre i vari archi indicano come gli algoritmi di<br />

clustering costruiscono i gruppi contenenti i vari oggetti.<br />

Nel caso di una suddivisione in partizioni si confronta la query con i vari centroidi<br />

e viene restituito come risultato il cluster, o i cluster, il cui centroide si avvicina di<br />

più alla query (anche qui spesso si realizza un ordinamento dei cluster in base alla<br />

loro vicinanza alla query); nel caso di una suddivisione gerarchica, invece, si<br />

inizia ad analizzare la gerarchia a partire da un estremo e si procede ad analizzare<br />

il dendogramma finchè non si raggiunge una certa stop condition o stopping rule ;<br />

il subtree che si apre a partire dal punto di stop viene restituito come risultato.<br />

Generalmente la ricerca parte dal nodo radice e si procede valutando una<br />

matching function tra la query ed i nodi immediatamente discendenti (ogni nodo<br />

corrisponde al centroide del cluster associato al sottoalbero che parte da tale<br />

nodo). Se ad un determinato livello ho più di un nodo (= più cluster) si procederà<br />

ovviamente ad espandere quello per cui si ha la matching function più alta; si ha<br />

la stop condition che interrompe la navigazione quando, ad un determinato livello,<br />

tutte le matching function risultano inferiori a quella del livello padre.<br />

Passiamo ora ad analizzare gli algoritmi che realizzano una classificazione<br />

gerarchica di una collezione di documenti, ed in particolare tre di questi:<br />

• single link clustering<br />

• complete link clustering<br />

• group average link clustering<br />

La differenza tra i tre metodi sta fondamentalmente nel modo in cui viene valutata<br />

la distanza tra le varie coppie di cluster composti: nell’algoritmo single link si<br />

prende come distanza la minima tra quelle esistenti tra le varie coppie di oggetti<br />

appartenenti a gruppi diversi. Nell’algoritmo complete link, viceversa, la distanza<br />

tra due cluster risulta essere la massima distanza tra due oggetti appartenenti uno<br />

al primo cluster e l’altro al secondo; infine nell’algoritmo group average link si<br />

47


4 - Utility<br />

considera come distanza tra due gruppi la media delle distanze tra le varie coppie<br />

di oggetti appartenenti agli opposti cluster.<br />

Vedremo che, quando si parla di clustering, ci si riferisce indifferentemente sia<br />

alla similarità, sia alla distanza tra i documenti; ovviamente alla massima distanza<br />

corrisponde la minima similarità e viceversa.<br />

Vediamo ora una breve classificazione dei clustering method.<br />

4.3.1 Single link<br />

Un documento qualsiasi viene inserito nella gerarchia, quindi si inizializza un<br />

vettore con i valori di similarità tra il documento selezionato ed i rimanenti N-1<br />

della collezione (tali valori vengono presi dalla matrice di similarità). Se il<br />

documento i-esimo non è ancora stato inserito nella gerarchia la i-esima entry nel<br />

vettore conterrà la maggiore delle similarità, o equivalentemente la minore<br />

distanza, tra il documento i ed ogni altro documento nella gerarchia, oltre al<br />

numero di documento della gerarchia con la massima similarità. Il documento<br />

associato con la entry più alta nel vettore viene quindi inserito nella gerarchia ed<br />

ogni entry j del vettore viene ricalcolata considerando la più alta tra sim(j,d)<br />

(sempre prese dalla matrice di similarità) ed il valore corrente della entry. Il<br />

processo viene ripetuto finchè tutti i documenti non sono nella gerarchia.<br />

Supponiamo ad esempio di partire dalla seguente matrice di similarità:<br />

A B C D E<br />

B 0.3<br />

C 0.5 0.4<br />

D 0.6 0.5 0.3<br />

E 0.8 0.7 0.5 0.4<br />

F 0.9 0.8 0.2 0.1 0.3<br />

48


4 - Utility<br />

Se si inizia inserendo il documento A nella gerarchia, lo stato iniziale del sistema<br />

è rappresentato dalla figura 10.a; la massima similarità tra un documento nella<br />

gerarchia ed uno non ancora nella gerarchia è tra la coppia A e F, quindi il<br />

documento F viene inserito nella gerarchia e il vettore delle similarità viene<br />

ricalcolato in base ai valori contenuti nella matrice di similarità (10.b). Poichè il<br />

documento B ha una similarità più alta con F piuttosto che con A, la entry<br />

corrispondente viene modificata. A questo punto la più alta similarità si ha per le<br />

coppie A,E e B,F e vale 0.8: si decide arbitrariamente di inserire il documento B<br />

nella gerarchia (10.c).<br />

Figura 10 - Costruzione di una single link hierarchy<br />

49


4 - Utility<br />

Nei passi successivi il documento più simile con uno di quelli appartenenti alla<br />

gerarchia viene aggiunto a quest’ultima, fino a che non è stato inserito l’ultimo<br />

documento della collezione(10.f)<br />

Vediamo ora una pseudocodifica dell’algoritmo. Vengono utilizzate due<br />

procedure: ComputeSim(did) e InsertHierarchy(did1,did2,sim); la prima calcola la<br />

similarità tra il documento did e tutti gli altri documenti nella collezione ed<br />

inserisce la similarità tra il documento did ed il documento j nel j-esimo elemento<br />

dell’array sim; la InsertHierarchy invece inserisce did1 nella gerarchia.<br />

for(i:=2 to CollectionSize)<br />

{<br />

info[i].sim:=0;<br />

info[i].InHierarchy:=FALSE;<br />

info[i].nn:=UNDEF;<br />

}<br />

/* Inizializza la gerarchia inserendo il documento 1 */<br />

CurrentDid:=1;<br />

/* Ad ogni passo inserisco nella gerarchia il documento<br />

con la massima similarità con un documento già presente<br />

in essa fino a che tutti i documenti non sono stati<br />

inseriti */<br />

while (CurrentDid!=UNDEF)<br />

{<br />

info[CurrentDid].InHierarchy=TRUE;<br />

ComputeSims(CurrentDid);<br />

MaxSim=0;<br />

NextDid=UNDEF;<br />

/* Aggiorno i valori di similarità per tutti i<br />

documenti non ancora inseriti nella gerarchia */<br />

for(i=1 to CollectionSize)<br />

{<br />

if(not info[i].InHierarchy)<br />

{<br />

if(sims[i]>info[i].sim)<br />

{<br />

info[i].sim:=sims[i];<br />

info[i].nn:=CurrentDid;<br />

}<br />

if(info[i].sim>MaxSim)<br />

50


}<br />

4 - Utility<br />

{<br />

MaxSim:=info[i].sim;<br />

NextDid:=i;<br />

}<br />

}<br />

}<br />

if(NextDid!=UNDEF)<br />

{<br />

InsertHierarchy(NextDid,info[NextDid],MaxSim);<br />

}<br />

CurrentDid:=NextDid;<br />

4.3.2 <strong>Group</strong> average link<br />

L’algoritmo mantiene una lista dei cluster attivi: un cluster è attivo se non è<br />

ancora stato unito con un altro; ad esempio se<br />

r=merge(p,q)<br />

allora p e q sono dei cluster attivi prima del merge (e r non esiste); dopo il merge<br />

invece p e q non sono più attivi mentre r sì. Le informazioni sui cluster attivi<br />

includono la rappresentazione del centroide del cluster, il cluster attivo a cui<br />

quello corrente è più simile ed il valore della similarità.<br />

All’inizio ogni documento è anche il centroide del cluster di cui è anche l’unico<br />

componente e tutti i cluster risultano attivi; i cluster con la più alta similarità<br />

vengono uniti, viene calcolato un nuovo centroide ed il cluster viene inserito nella<br />

gerarchia. Infine viene ricalcolato il vettore delle similarità ed aggiornato con il<br />

nuovo insieme di cluster attivi; il processo viene reiterato fino a che non rimane<br />

un solo cluster attivo.<br />

51


4 - Utility<br />

Figura 11 - Costruzione di una group average link hierarchy (I parte)<br />

52


4 - Utility<br />

Figura 12 - Costruzione di una group average link hierarchy (II parte)<br />

Vediamo ora la pseudocodifica per l’algoritmo:<br />

/* Inizializzazione */<br />

MaxSim:=0;<br />

for(i=1 to CollectionSize)<br />

{<br />

/* Creo un cluster per ogni documento */<br />

info[i].centroid:=documento i;<br />

ComputeSim(i,nn,sim);<br />

info[i].nn:=nn;<br />

info[i].sim:=sim;<br />

info[i].size:=1<br />

53


4 - Utility<br />

if(sim>MaxSim)<br />

{<br />

id1:=i;<br />

id2:=nn;<br />

MaxSim:=sim;<br />

}<br />

}<br />

NumActive:=CollectionSize;<br />

for(i=1 to NumActive)<br />

{<br />

active[i]:=i;<br />

}<br />

/* Eseguo il merge dei cluster finchè non rimane un<br />

solo cluster oppure tutte le similarità sono pari a 0<br />

*/<br />

while(MaxSim>0 and NumActive>1)<br />

{<br />

smaller:=MIN(id1,id2);<br />

larger:=MAX(id1,id2);<br />

}<br />

info[smaller].centroid:=MergeCentroids<br />

(smaller,larger);<br />

info[smaller].size:=info[smaller].size+<br />

info[smaller].size;<br />

a:=index of larger in active;<br />

active[a]:=active[NumActive];<br />

NumActive:=NumActive-1;<br />

MergeClusters(smaller,larger,MaxSim);<br />

MaxSim:=0;<br />

for(each cluster a in active)<br />

{<br />

if(info[a].nn=larger or info[a].nn=smaller)<br />

{<br />

FindMaxSim(a,nn,sim);<br />

info[a].nn:=nn;<br />

info[a].sim:=sim;<br />

}<br />

if(info[a].sim>MaxSim)<br />

{<br />

id1:=a;<br />

id2:=info[a].nn;<br />

MaxSim:=info[a].sim;<br />

}<br />

}<br />

54


4 - Utility<br />

Il ciclo principale esegue il merge dei cluster con la massima similarità finchè non<br />

resta un solo cluster; per fare questo si utilizzano due procedure: la<br />

FindMaxSim(cid,nn,sim) e la MergeCentroids(cid1,cid2). L’inizializzazione viene<br />

realizzata usando una terza procedura ComputeSim(did,nn,Sim). La ComputeSim<br />

calcola le similarità tra il documento did e gli altri documenti nella collezione;<br />

restituisce l’identificativo del documento più simile a did in nn ed il valore della<br />

misura di similarità tra i due documenti nella variabile Sim. FindMax è simile a<br />

ComputeSim: calcola il valore della similarità tra il cluster cid e tutti gli altri<br />

cluster attivi e restituisce l’identificativo del cluster più vicino a cid ed il valore<br />

della similarità tra i due. La similarità viene calcolata usando i centroidi dei<br />

cluster. La funzione MergeCentroids, infine, crea un nuovo centroide partendo da<br />

quelli dei cluster cid1 e cid2; se indichiamo con wi1 e wi2 i pesi assegnati al<br />

termine i-esimo nei vettori rappresentanti i due centroidi e con size1 e size2 le<br />

dimensioni di questi ultimi, una soluzione proposta per il peso wi new del centroide<br />

risultante è la seguente:<br />

( * size ) + ( w * size )<br />

wi1 1 i2<br />

size<br />

1<br />

+ size<br />

Un’altra ipotesi è quella di mantenere nel centroide risultante solo quei termini<br />

che sono presenti in entrambi i centroidi di partenza, con un peso ottenuto da una<br />

media opportuna dei due originali.<br />

L’algoritmo di complete linkè analogo a quello per il single link, con l’unica<br />

variante costituita dal diverso modo di ricalcolare il vettore delle similarità:<br />

anzichè considerare il massimo valore di similarità tra ogni documento non ancora<br />

nella gerarchia, si prende invece il minore; in tal modo si costruiscono i cluster in<br />

modo da limitare la similarità minima tra i documenti di ogni gruppo.<br />

Un secondo algoritmo di complete link citato in letteratura è stato elaborato da<br />

Buckley: per approfondimenti si rimanda all’articolo di E. Voorhees<br />

“Implementing agglomerative hierarchic clustering algorithms for use in<br />

document retrieval”.<br />

55<br />

2<br />

2


4 - Utility<br />

Un punto che gioca a sfavore degli algoritmi di clustering gerarchico è costituito<br />

dalla loro elevata complessità; infatti un algoritmo di hierarchical clustering<br />

generalmente richiede<br />

• ( )<br />

2<br />

O n passi per calcolare la matrice di similarità tra i documenti<br />

• O (n)<br />

passi per inserire gli n documenti nella collezione<br />

• O (n)<br />

passi per ricalcolare il vettore delle similarità ogni volta un nuovo<br />

documentro viene inserito nella gerarchia<br />

(dove n è ovviamente il numero di documenti che costituiscono la collezione) .<br />

In totale abbiamo quindi una complessità pari a<br />

2<br />

O( n ) + O(<br />

n)<br />

O(<br />

n)<br />

≅ O(<br />

n<br />

2<br />

)<br />

che risulta essere alquanto elevata: nel caso di 500.000 documenti si renderebbero<br />

necessari circa 250.000.000.000 passi.<br />

4.3.3 Una visione alternativa del problema: SCATTER/GATHER<br />

Come già visto, una delle maggiori obiezioni che vengono mosse agli algoritmi di<br />

clustering gerarchico è la loro complessità computazionale troppo alta, quindi<br />

risultano troppo lenti per grandi quantità di dati e non portano miglioramenti<br />

apprezzabili al processo di retrieval.<br />

Alcuni studiosi però sostengono che questa argomentazione sia valida solo se si<br />

vede il clustering come un artifizio per cercare di migliorare altre tecniche di<br />

ricerca convenzionali: a tal proposito hanno quindi introdotto un nuovo modello<br />

(o paradigma, come si trova spesso indicato in letteratura) in cui il clustering è<br />

l’operazione primaria nella ricerca dei documenti.<br />

La formulazione standard del processo di information retrieval prevede che venga<br />

sottoposta al sistema una query che è l’espressione dell’information need<br />

dell’utente; si procede quindi ad una ricerca selettiva tra i documenti per trovare<br />

quelli che soddisfano tale richiesta. Abbiamo già visto però come spesso sia<br />

56


4 - Utility<br />

difficile da parte dell’utente esprimere quelle che sono le proprie necessità:<br />

potrebbe non avere familiarità con il vocabolario appropriato per descrivere<br />

l’argomento di interesse, potrebbe utilizzare dei termini sbagliati, potrebbe anche<br />

non avere ben chiare le sue reali esigenze.<br />

È nata quindi l’idea di non concentrarsi essenzialmente sulla fase di searching,<br />

ma di realizzare una fase di browsing, in cui viene presentata all’utente una<br />

visione d’insieme della collezione con una prima suddivisione ad alto livello dei<br />

contenuti. L’utente inizia quindi con un obiettivo generico, che viene via via<br />

definendosi man mano che si conosce più in dettaglio il contenuto dei documenti<br />

a disposizione. Si è quindi pensato ad un modello di information access detto<br />

Scatter/Gather (letteralmente sparpagliare/raccogliere) che fa uso di un sistema<br />

di clustering per estrarre i concetti comuni ai documenti e navigare la collezione.<br />

Si inizia con una fase di scatter in cui la collezione viene suddivisa in un piccolo<br />

numero di gruppi e all’utente viene proposto un breve sommario del contenuto del<br />

cluster. Basandosi su tali riassunti l’utente seleziona uno o più di questi gruppi per<br />

un ulteriore studio: i gruppi scelti vengono estratti nella fase di gather e diventano<br />

una sub collezione che è il nuovo oggetto dell’analisi. Il sistema procede ad una<br />

nuova fase di scatter suddividendo nuovamente i documenti rimanenti in una serie<br />

di gruppi che condividono argomenti più dettagliati e che vengono nuovamente<br />

presentati all’utente. Il processo va avanti con iterazioni successive, i gruppi<br />

diventano via via più piccoli e più dettagliati; quando i gruppi diventano<br />

sufficientemente piccoli si sposta l’attenzione sui singoli documenti.<br />

Per questo modello si utilizzano algoritmi di clustering piatto, che partizionano la<br />

collezione in una serie di gruppi mutuamente esclusivi ed esaustivi (vengono<br />

anche detti k-means algorithms). Questi algoritmi hanno il vantaggio di essere<br />

meno complessi di quelli gerarchici (alcuni arrivano all’ordine di O (kn)<br />

), però<br />

sono non deterministici (a differenza di quelli gerarchici), ossia il risultato finale<br />

cambia a seconda dell’ordine in cui vengono analizzati i documenti.<br />

Generalmente gli algoritmi di partitional clustering sono costituiti da tre fasi:<br />

1. Individuare k centri (dove k è il numero richiesto di cluster)<br />

57


4 - Utility<br />

2. Associare ogni documento della collezione ad un centro<br />

3. Rifinire le partizioni costruite<br />

Alcuni esempi di algoritmi per identificare i centri iniziali sono il Buckshot<br />

Algorithm ed il Fractional Algorithm; entrambi assumono che esista una qualche<br />

routine di clustering su cui appoggiarsi e fanno uso di questa.<br />

Intera<br />

collezione<br />

Scatter<br />

Cluster 11 Cluster 21 ..... Cluster n1<br />

Sub<br />

Collection<br />

Scatter<br />

Figura 13 - Processo di scatter/gather<br />

Buckshot Algorithm<br />

Si sceglie in maniera assolutamente casuale un sottoinsieme campione di<br />

documenti (di dimensione kn dove k=numero di cluster desiderati e<br />

58<br />

Gather<br />

Cluster 12 Cluster 22 ..... Cluster m2<br />

......<br />

Gather


4 - Utility<br />

n=cardinalità della collezione) e si applica a tale sottoinsieme la clustering<br />

subroutine; il risultato è costituito dai centroidi dei cluster così calcolati. Tale<br />

algoritmo ha una complessità pari a O (kn)<br />

.<br />

Fractional Algorithm<br />

Questo algoritmo identifica k centri dividendo inizialmente la collezione in n/m<br />

gruppi di dimensione fissa m. Ad ognuno di essi si applica separatamente la<br />

clustering subroutine in modo da agglomerare i documenti singoli in gruppi in<br />

maniera tale da avere una riduzione di individui pari ad un fattore ρ . Questi<br />

gruppi vengono poi trattati come individui singoli e l’intero processo ripetuto<br />

finchè non restano soltanto k gruppi. La complessità di questo algoritmo è pari a<br />

O (mn)<br />

.<br />

Una volta identificati i k centri, si tratta di trovare un criterio per assegnare i vari<br />

documenti della collezione ad uno di questi. Il più semplice algoritmo che si può<br />

applicare è quello Assign-to-nearest, che consiste nell’assegnare ogni documento<br />

al centro più vicino.<br />

Una volta determinato un primo clustering si tratta di rifinirlo in qualche maniera;<br />

vediamo alcune soluzioni possibili:<br />

• Iterare l’algoritmo Assign-to-nearest: una volta determinato il primo<br />

clustering si generano i centroidi per ogni gruppo, quindi si riassegna ogni<br />

documento al più vicino centro in modo da formare dei nuovi cluster.<br />

Tipicamente questo processo porta i maggiori cambiamenti alle prime<br />

iterazioni, per cui è sufficiente un piccolo numero di step.<br />

• Utilizzare l’algoritmo di Split: questo algoritmo divide in due ulteriori<br />

partizioni quei cluster i cui documenti sono poco correlati tra di loro in<br />

base ad un qualche criterio di similarità. Uno di questi criteri è la<br />

cosiddetta self-similarity del cluster, ossia il valore medio di similarità tra i<br />

documenti del cluster.<br />

Un’altra misura di similarità è quella che calcola la similarità media tra i<br />

59


4 - Utility<br />

documenti del cluster ed il centroide che lo rappresenta. I cluster per cui la<br />

misura di similarità è sotto una determinata soglia fissata ad-hoc vengono<br />

bipartiti (usando ad esempio l’algoritmo di buckshot).<br />

• Utilizzare l’algoritmo di Join: questo algoritmo esegue un merge dei<br />

gruppi i cui centroidi hanno una distanza al di sotto di una certa soglia<br />

Un altro esempio di algoritmo di clustering a singolo livello senza overlap è<br />

l’algoritmo a passo singolo (single-pass), così detto in quanto ogni documento<br />

viene esaminato una sola volta e, una volta asseganto ad un cluster, non viene più<br />

riallocato. A differenza degli algoritmi visti in precedenza, dove era determinato a<br />

priori il numero di cluster da ottenere, in questo caso tale numero non è<br />

imponibile, ma risulta del tutto casuale. L’algoritmo fa uso di una misura di<br />

similarità SIM(doci,docj), di un valore di soglia STHR (definito a priori) e di<br />

centroidi CK ottenuti come media dei vettori assegnato al cluster k-esimo ClusK.<br />

Vediamone una breve descrizione:<br />

assegna doc1 a C1<br />

per ogni docj (j=2,3,...,n)<br />

{<br />

per ogni ClusK<br />

{<br />

calcola SIM(docj,CK)<br />

se SIM(docj,CK)>STHR allora<br />

assegna docj a ClusK e aggiorna CK<br />

altrimenti<br />

crea un nuovo cluster con docj come centroide<br />

}<br />

}<br />

4.4 Latent Semantic Indexing (LSI)<br />

Si tratta di un metodo nato per risolvere un problema molto importante legato alle<br />

tecniche di retrieval basate sul matching tra i termini delle query ed i termini nei<br />

documenti. In un sistema di IR l’utente dovrebbe in teoria poter effettuare una<br />

60


4 - Utility<br />

ricerca basandosi sui concetti contenuti nei documenti anzichè basarsi sui singoli<br />

termini; infatti generalmente ci sono più modi per esprimere un determinato<br />

concetto ed è possibile che i termini contenuti nella query non corrispondano a<br />

quelli utilizzati nei documenti. In altre parole, con questo metodo si cerca di<br />

superare i problemi legati a due caratteristiche del linguaggio parlato, ossia:<br />

• SINONIMIA = esistono più nomi per riferirsi ad un medesimo oggetto o<br />

idea<br />

• POLISEMIA = molte parole possiedono più di un significato<br />

La polisemia ha l’effetto di ridurre la precision delle ricerche in quanto vengono<br />

restituiti anche dei documenti che risultano irrilevanti per l’argomento in esame;<br />

viceversa la sinonimia può causare una riduzione del recall per una data ricerca in<br />

quanto alcuni documenti che sono rilevanti possono essere tralasciati solo perchè<br />

non utilizzano le parole “giuste” per esprimere un determinato concetto. Per<br />

cercare di ridurre il problema della sinonimia si è sovente fatto ricorso a tecniche<br />

di term expansion oppure a thesauri; queste tecniche portano ad un miglioramento<br />

del recall, accompagnato però da una diminuzione della precision dovuta alla<br />

polisemia: infatti i termini introdotti possono avere più significati e quindi<br />

recuperare anche documenti irrilevanti ai fini della ricerca corrente.<br />

La polisemia risulta assai più difficile da affrontare in quanto legata alla naturale<br />

ambiguità del linguaggio normale. Un approccio che è stato tentato consiste<br />

nell’utilizzare un vocabolario controllato nella costruzione delle query in modo da<br />

eliminare le ambiguità; un tale metodo ha un ovvio problema di usabilità in<br />

quanto un vocabolario controllato risulta innaturale e difficile da ricordare.<br />

Il concetto chiave su cui si basa il metodo di latent semantic indexing è che,<br />

anzichè ricercare nel testo dei termini specifici, si effettua una ricerca basandosi<br />

sui concetti contenuti nei documenti. Un altro modo di vedere questo metodo è<br />

quello di pensare i documenti e le query mappati in uno spazio a m dimensioni,<br />

dove m è il numero dei concetti, anzichè in uno spazio a t dimensioni, dove t è il<br />

numero dei termini osservati. Il risultato è un’evidente diminuzione della<br />

complessità, dato che m


Terms<br />

4 - Utility<br />

decomposition (SVD). Il latent semantic indexing non è altro che un metodo di<br />

retrieval basato su informazioni di tipo statistico; esso cerca di determinare uno<br />

spazio di concetti artificiali analizzando se e quanto di frequente determinate<br />

parole vengono usate insieme. Vediamola così: è probabile che le parole<br />

“macchina” e “automobile” compaiano in una collezione di documenti sempre<br />

con le medesime parole (es. “motore”, “modello”, “veicolo”, “carrozzeria”,<br />

“cilindrata”, ecc.), quindi tali termini avranno una rappresentazione similare nello<br />

spazio dei concetti. L’idea principale nel LSI è di modellare le relazioni che<br />

intercorrono tra i vari termini e di utilizzare queste informazioni per migliorare il<br />

retrieval.<br />

Il primo passo nel processo di singular value decomposition consiste nel generare<br />

una matrice termini per documenti A; ogni termine analizzato è rappresentato da<br />

una riga nella matrice A e ogni documento è rappresentato da una colonna ; ogni<br />

elemento aij in A rappresenta quindi la frequenza del termine i nel documento j.<br />

Documents<br />

A<br />

t x d<br />

=<br />

Terms<br />

T<br />

t x m<br />

Figura 14 - Singular value decomposition<br />

Il metodo di singular value decomposition viene utilizzato per decomporre la<br />

matrice A in tre matrici separate: la prima è una matrice termini per concetti, la<br />

seconda è una matrice concetti per concetti (diagonale, di dimensione m x m,<br />

dove m è il rango di A) e la terza è una matrice concetti per documenti.<br />

La matrice S può poi essere ridotta alle dimensioni k x k (con k


4 - Utility<br />

essere considerato come il numero di concetti su cui vogliamo mappare i<br />

documenti della collezione. In teoria questa approssimazione risulterebbe positiva<br />

in quanto eliminerebbe il “rumore” contenuto nei documenti e manterrebbe<br />

soltanto le caratteristiche concettuali più salienti. Il valore di k dovrebbe essere<br />

sufficientemente grande da catturare tutti i concetti importanti e, allo stesso<br />

tempo, sufficientemente piccolo da escludere tutti i dettagli poco rilevanti.<br />

Una volta che la decomposizione (e la eventuale approssimazione) è stata<br />

effettuata, è possibile utilizzare il modello per le ricerche. In questo modello una<br />

query, così come un qualsiasi documento, è inizialmente un semplice set di<br />

parole; una query viene vista come uno pseudo-documento che deve essere<br />

mappato nello spazio dei concetti; una volta sistemata la query nello spazio si<br />

procederà a restituire i documenti ad essa più vicini. Per poter confrontare una<br />

query o pseudo-documento q con gli altri documenti della collezione dobbiamo<br />

quindi partire dal vettore dei termini Xq che la rappresenta, da questo dobbiamo<br />

derivare una rappresentazione Dq nello spazio dei concetti equivalente ad una<br />

colonna della matrice D. A questo punto è possibile calcolare il coseno<br />

dell’angolo formato dal vettore rappresentante la query e i vari vettori<br />

rappresentanti i documenti della collezione e restituire quelli per cui il coseno<br />

supera un certo valore di soglia.<br />

Questo metodo presenta una serie di problemi: il primo è che lo spazio dei<br />

concetti non è di facile comprensione; un altro problema è legato alle prestazioni<br />

2 3<br />

di questo sistema: l’algoritmo SVD ha una complessità quadratica O ( N k ) , dove<br />

N è dato dalla somma dei termini e dei documenti mentre k è il numero di<br />

dimensioni dello spazio dei concetti. Quest’ultimo, in particolare, fa sì che il<br />

metodo LSI risulti inadatto per grandi collezioni che vengono aggiornate<br />

frequentemente (in quanto bisognerebbe applicare l’algoritmo SVD ogni volta che<br />

viene aggiunto o eliminato un documento della collezione e quindi cambia la<br />

matrice A).<br />

63


Capitolo 5<br />

Implementazioni<br />

Un sistema di IR è costituito da due parti principali: una collezione di documenti e<br />

un metodo (strutture dati + algoritmi) di accesso a tale collezione. In questo<br />

capitolo vedremo alcuni dei metodi di accesso che sono stati proposti e<br />

sperimentati e ci soffermeremo in particolare sulle strutture dati necessarie per<br />

realizzarli.<br />

La soluzione che viene quasi universalmente adottata è quella di costruire un<br />

indice per la collezione: in tale modo è possibile ricercare i documenti che<br />

soddisfano una determinata query senza dover accedere ai documenti veri e<br />

propri, velocizzando così notevolmente le operazioni.<br />

L’utilizzo di un indice richiede un overhead legato alla costruzione e al<br />

mantenimento di quest’ultimo, oltre ovviamente allo spazio fisico per la sua<br />

memorizzazione, ma tutto ciò viene messo in secondo piano di fronte alla<br />

velocizzazione che si ha nella fase di ricerca e di accesso ai documenti, in risposta<br />

alle query dell’utente.<br />

5.1 Inverted index<br />

La maggior parte dei metodi di ricerca di tipo free-text visti finora (standard<br />

boolean, extended boolean, proximity search e relevance ranking) possono essere<br />

implementati in maniera efficiente mediante l’utilizzo di un inverted index (in<br />

letteratura vengono spesso indicati anche come inverse index o inverted file). Al<br />

momento gli inverted index costituiscono lo standard de facto per l’indicizzazione<br />

word-based dei documenti.<br />

Un inverse index è una struttura dati che associa un termine, o un’unità atomica di<br />

informazione, con il set di documenti che contengono tale unità di informazione;<br />

64


Term m<br />

Term n<br />

5 - Implementazioni<br />

questo insieme di documenti viene detto posting list.<br />

La struttura logica di un inverse index può essere rappresentata come in figura; in<br />

letteratura abbiamo incontrato poi diversi modi di implementare questa struttura:<br />

Index file<br />

Posting list m<br />

Posting list n<br />

Posting file<br />

Figura 15 - Struttura logica di un inverted index<br />

La posting list non è altro che una lista associata con ognuno degli index term<br />

considerati; in tale lista possiamo trovare talvolta una semplice indicazione binaria<br />

riguardo la presenza di un certo termine in un determinato documento, spesso<br />

però è presente una serie di informazioni aggiuntive quali la frequenza con cui la<br />

parola in esame compare nel documento, oppure l’offset del termine rispetto<br />

all’inizio del testo; queste informazioni aggiuntive sono necessarie per poter<br />

implementare alcuni degli algoritmi di ricerca non booleana visti in precedenza.<br />

L’utilizzo di un indice riduce drasticamente il numero di operazioni di I/O<br />

richieste per soddisfare le query di ricerca: una volta ricevuta la query si<br />

recuperano le posting list necessarie e si ordinano i documenti in base alle<br />

informazioni in esse contenute.<br />

65<br />

Doc. 1<br />

Doc. 2<br />

Doc. 3<br />

Doc. i<br />

Doc. i+1<br />

Documents file


cat<br />

giraffe<br />

5 - Implementazioni<br />

Molto spesso gli indici (index file + posting file) hanno dimensioni paragonabili a<br />

quelle della collezione a cui si riferiscono, per cui è impensabile mantenerli in<br />

memoria centrale; dato che la parte più consistente (circa il 90%) è costituita dal<br />

posting file, la soluzione più logica consiste nel memorizzare quest’ultimo in<br />

memoria di massa, mantenendo l’index file in memoria centrale.<br />

L’operazione principale che generalmente si effettua su di un indice è la ricerca,<br />

per cui un inverted index deve sicuramente avere un response time il più basso<br />

possibile: poichè l’accesso avviene sulla base di una singola chiave (ossia il<br />

termine da ricercare), un modo per garantire un accesso veloce consiste nel<br />

mantenere l’indice ordinato, in modo da poter eseguire una ricerca dicotomica,<br />

oppure organizzarlo come una hash table. Utilizzando una tabella hash,<br />

nell’ipotesi di riuscire a definire un perfect hashing (o comunque una funzione che<br />

si avvicini ad esso), si avrebbe una complessità della fase di ricerca dell’ordine di<br />

O () 1 .<br />

dog<br />

goat<br />

eel<br />

gerbil<br />

iguana<br />

horse<br />

koala<br />

carp<br />

lion<br />

okapi<br />

frog<br />

Figura 16 - Esempio di un B-tree<br />

Nel caso in cui l’indice abbia dimensioni molto grandi, tali da non poter essere<br />

mantenuto in memoria centrale, bisogna adottare una struttura dati che permetta di<br />

66<br />

racoon<br />

rat<br />

lizard<br />

tiger<br />

sea lion<br />

mouse<br />

snail<br />

nut-hatch<br />

wolf<br />

otter<br />

woodpecker<br />

panda<br />

zebra<br />

pigeon


5 - Implementazioni<br />

minimizzare il numero di accessi al disco necessari per recuperare la entry<br />

dell’indice desiderata e, con essa, il riferimento alla posting list associata; alcune<br />

tra le strutture che meglio si adattano a questa esigenza (e per questo molto<br />

diffuse) sono quelle basate su B-tree o B + -tree.<br />

Ogni nodo del B-tree include una serie di index-term che dividono l’indice, o una<br />

parte di esso, in diverse frazioni; in altre parole le chiavi fungono da punti di<br />

divisione per l’indice, il cui ordinamento è incorporato nella struttura dell’albero.<br />

Ogni chiave, ad ogni livello, punta ad un nodo al livello inferiore: questo conterrà<br />

gli index term che riempiono il gap tra quelli presenti nel nodo padre.<br />

Per ottenere l’elenco ordinato di tutti i termini presenti nel B-tree bisogna<br />

procedere con una visita preorder: per ogni sottoalbero si visita la radice (intesa<br />

qui come un singolo termine del nodo) poi i sottoalberi figli, procedendo da<br />

sinistra verso destra.<br />

Poichè l’indice viene mappato usando il B-tree, ad ogni chiave nei vari nodi<br />

dovranno anche essere associate le posting list corrispondenti e le informazioni<br />

relative ai pesi dei termini; se si adotta un B + -tree le posting list verranno<br />

associate soltanto ai nodi foglia.<br />

I nodi dell’albero vengono mantenuti in memoria di massa e risulta conveniente<br />

far corrispondere ad ogni nodo una pagina su disco; gli algoritmi di bilanciamento<br />

dei B-tree consentono di effettuare le operazioni di ricerca con O(logb N)<br />

accessi<br />

al disco, dove b rappresenta il branching factor del B-tree (ossia il numero<br />

massimo di figli di un nodo), mentre N è il numero di entry contenute del B-tree<br />

(ossia il numero di index term trattati).<br />

Il branching factor b è collegato con la dimensione delle pagine fisiche su disco ed<br />

in genere è un valore piuttosto alto: un valore tipico è dell’ordine delle centinaia;<br />

supponendo di avere un numero di entry dell’ordine del milione, una qualsiasi di<br />

queste può essere raggiunta con tre accessi al disco al massimo (tale numero può<br />

essere ulteriormente diminuito mantenendo in memoria il nodo radice, oppure<br />

applicando delle strategie di caching di tipo LRU dei nodi del B-tree, ecc.).<br />

67


5 - Implementazioni<br />

Un occhio di riguardo deve essere riservato anche alla fase di aggiornamento<br />

dell’indice: infatti la collezione in esame potrebbe venire modificata, potrebbero<br />

venire aggiunti nuovi documenti o (meno probabile) eliminati alcuni di quelli<br />

presenti; in questo caso l’indice deve essere aggiornato e questa operazione,<br />

ovviamente, deve produrre il minor overhead possibile; nel caso di una struttura<br />

B-tree si ha un numero di accessi al disco paragonabile a quello visto per la<br />

ricerca, ossia O(logb N)<br />

.<br />

5.1.1 Procedura di ricerca<br />

La procedura di ricerca all’interno di un inverted index è legata al modello di IR<br />

system che si vuole realizzare. Se si sta implementando un sistema basato sulla<br />

ricerca booleana pura e semplice si procede a ricercare nell’indice le entry<br />

corrispondenti ai termini della query e si esaminano le posting list associate: nel<br />

caso di una query congiuntiva (AND) si procede ad intersecare queste ultime,<br />

mentre se la query è di tipo congiuntivo (OR) bisogna effettuare un merge delle<br />

singole liste; in tal modo si ottiene il set dei documenti soddisfacenti la query.<br />

Supponiamo ora di utilizzare un inverted index in associazione con il modello<br />

vector space: come abbiamo già visto, sia i documenti che le query possono essere<br />

visti come punti in uno spazio n-dimensionale; il problema del retrieval è quindi<br />

un nearest neighbour searching, ossia dato un set di punti Di nello spazio, trovare<br />

quelli più vicini al punto Q rappresentante la query.<br />

Abbiamo già visto che la misura di similarità tra i documenti e la query è data da:<br />

S ( D , Q ) =<br />

i<br />

n<br />

∑<br />

q<br />

× t<br />

j ij<br />

j = 1<br />

j = 1<br />

n<br />

2<br />

q j ×<br />

n<br />

j = 1 j = 1<br />

∑ ∑<br />

68<br />

t<br />

2<br />

ij<br />

=<br />

n<br />

∑<br />

L<br />

Q<br />

q<br />

j<br />

× t<br />

× L<br />

dove LQ e LD indicano la lunghezza dei vettori rappresentanti la query ed il<br />

documento.<br />

D<br />

ij


5 - Implementazioni<br />

Utilizzando un inverted index non è più necessario calcolare il valore di tale<br />

similarità per tutti i documenti della collezione, in quanto si avrà S( Di<br />

, Q)<br />

≠ 0 se<br />

e solo se la query ed il documento hanno almeno un termine in comune; questo<br />

vuol dire che bisogna prendere in considerazione soltanto quei documenti che<br />

appaiono almeno in una delle posting list associate ai termini della query.<br />

Un primo algoritmo fu proposto da Noreault; l’idea base è di scorrere le liste<br />

relative ai termini della query e di allocare un contatore inizializzato a uno per<br />

ogni nuovo documento incontrato; se lo stesso documento viene nuovamente<br />

incontrato in una delle liste seguenti, il suo contatore viene incrementato di uno. Il<br />

risultato finale è che in ogni contatore si ha il numero di termini comuni al<br />

documento e alla query; se ai termini sono associati dei pesi, i contatori verranno<br />

incrementati di un valore pari al prodotto di tali pesi.<br />

Vediamo una pseudocodifica per l’algoritmo:<br />

Procedure Search;<br />

for each QueryTerm qj do<br />

Read InvertedList; /*composed of couples(Di,wi)*/<br />

for each Document Di in the list do<br />

if NewDocument then<br />

AllocateCounter C(Di);<br />

C(Di):=0;<br />

endif;<br />

C(Di):=C(Di) + (qj * wj);<br />

endloop;<br />

endloop;<br />

for eachCounter C(Di) do<br />

C(Di):=C(Di) / (LQ * LDi); /*evaluation of Sfunction*/<br />

endloop<br />

Sort C(Di) in decreasing order;<br />

Present the top r documents;<br />

end Search.<br />

L’algoritmo appena visto calcola la similarità tra la query e tutti i documenti che<br />

condividono almeno un termine con quest’ultima; tale numero potrebbe essere<br />

molto alto, tuttavia è plausibile pensare che un buon numero dei documenti<br />

interessati abbia una bassa similarità con la query.<br />

69


5 - Implementazioni<br />

L’algoritmo precedente quindi spende un considerevole numero di passi nel<br />

calcolare similarità per documenti che non saranno nel set di quelli restituiti.<br />

Partendo da queste considerazioni sono stati apportati alcuni miglioramenti alla<br />

procedura seguita per la ricerca; lo scopo è stato quello di minimizzare il numero<br />

di posting list da valutare: se ci si accorge, prima della fine, di avere già ottenuto il<br />

set di documenti ottimo, non è necessario controllare le rimanenti posting list.<br />

Come primo passo i termini della query vengono ordinati in ordine decrescente di<br />

peso: supponendo di utilizzare il sistema di pesatura tf x idf, si ha come<br />

conseguenza che i termini presenti in un basso numero di documenti vengono a<br />

trovarsi in cima all’elenco; quindi verranno processate prima le liste più brevi,<br />

mentre quelle più lunghe verranno eventualmente processate tardi. Supponiamo<br />

ora di avere già processato m liste su un totale di n e di aver ottenuto un closest set<br />

R composto dai documenti D1, D2, ..., Dr in ordine decrescente di similarità.<br />

Dobbiamo ora processare la m+1 esima lista: per ogni documento Di presente in<br />

tale lista si assume che contenga anche tutti i termini della query che non sono<br />

ancora stati analizzati e si calcola un upper bound per il valore di similarità; se il<br />

valore così ottenuto è inferiore a quello per il documento Dr, significa che il<br />

documento Di non raggiungerà mai il closest set R e quindi posso evitare di<br />

considerarlo ulteriormente; posso inoltre terminare l’algoritmo se il documento<br />

Dr+1, il primo tra quelli che non rientrano in R, ha un upperbound inferiore a<br />

quello di Dr.<br />

Procedure Search;<br />

sort QueryTerms in decreasing order of weight;<br />

repeat /*for each query term qj*/<br />

Read InvertedList; /*composed of couples(Di,wi)*/<br />

for each Document Di in the list do<br />

if RelSetNotFull then<br />

Compute C(Di);<br />

Enter Di into the RelSet;<br />

else<br />

Compute U(Di);<br />

if U(Di)


5 - Implementazioni<br />

else<br />

Compute C(Di);<br />

if C(Di)>C(LastDocIn) then<br />

Enter Di into RelSet;<br />

endif;<br />

endif;<br />

endif;<br />

endloop;<br />

Compute U(FirsDocOut);<br />

until LastQueryTerm or U(FirstDocOut)


5 - Implementazioni<br />

collisione e bisogna procedere ad aggiornare la posting list, che, come già visto, è<br />

generalmente costituita da una lista linkata in cui i nuovi documenti (o meglio, i<br />

riferimenti ad essi) vengono inseriti in testa. Si effettua quindi un controllo sulla<br />

prima entry della lista per verificare se l’identificativo del documento corrisponde<br />

a quello in esame: in caso affermativo si incrementa il contatore delle occorrenze<br />

del termine nel documento (se si necessita di tale informazione per implementare<br />

la ricerca), altrimenti significa che è la prima occorrenza del termine nel<br />

documento, per cui si inserisce una nuova entry in testa alla posting list in esame.<br />

In questo processo le posting list dovrebbero venire mantenute interamente in<br />

memoria; poichè un inverted index con le posting list associate può arrivare a<br />

richiedere uno spazio dello stesso ordine di grandezza di quello necessario per la<br />

collezione, è impensabile che tutto il processo possa avvenire interamente in<br />

memoria centrale. Ogni volta che viene allocata una parte di memoria durante il<br />

processo, si controlla di non superare la quota ad esso riservata e in caso<br />

affermativo si trasferiscono tutte le posting list su disco; ogni volta che si compie<br />

questa operazione si procede anche a linkare le liste in memoria con quelle già<br />

presenti su disco che si riferiscono ai medesimi termini. La costruzione dell’indice<br />

termina quando tutti gli index term sono stati processati; a questo punto si hanno a<br />

disposizione anche le informazioni sulla totalità dei documenti e, se necessario, si<br />

procede a calcolare i pesi da assegnare agli index term, in particolare il valore di tf<br />

x idf.<br />

Nell’allocare lo spazio su disco per le liste si possono seguire due politiche: la<br />

prima è pensata per ottimizzare il tempo in fase di scrittura (update time) e<br />

consiste nell’accodare i nuovi dati sequenzialmente a quelli già presenti su disco;<br />

così facendo si ottimizza la fase di scrittura in quanto il disco non dve compiere<br />

alcuna operazione di seek. La seconda politica ha l’obiettivo di ottimizzare la fase<br />

di lettura delle liste durante la ricerca (query time): quando si deve aggiornare la<br />

lista relativa ad un determinato termine w si legge la posting list L ad esso<br />

associata, si accoda la nuova entry, quindi si riscrive L in una nuova locazione del<br />

disco; così facendo si minimizza il query time perchè ogni lista può essere letta<br />

con un’unica operazione di seek.<br />

72


5 - Implementazioni<br />

5.1.3 Compressione di un inverted index<br />

Uno degli obiettivi che si hanno quando si sviluppa un sistema di information<br />

retrieval è quello di ridurre il più possibile l’overhead dovuto alle operazioni di<br />

I/O; tale overhead è ovviamente proporzionale alle dimensioni dell’index file,<br />

quindi una delle vie per ridurre il processing time consiste nel cercare di ottenere<br />

degli indici il più compatti possibile. In letteratura viene dato ampio spazio alle<br />

tecniche di compressione; le due aree su cui si focalizzano le tecniche proposte<br />

sono la compressione dell’indice dei termini e la compressione delle posting list;<br />

una maggiore attenzione verrà dedicata a quest’ultima poichè le posting list<br />

costituiscono il grosso della struttura di un inverted index, per cui le tecniche per<br />

la loro compressione sono quelle che potenzialmente possono portare i maggiori<br />

vantaggi.<br />

Fixed length index compression: questa tecnica può essere applicata se le entry<br />

in ogni posting list vengono memorizzate in ordine crescente o decrescente di<br />

identificativo dei documenti; così facendo è sufficiente memorizzare in ogni entry<br />

soltanto la differenza tra il valore corrente e quello contenuto nella entry<br />

immediatamente precedente. In tal modo è possibile ottenere dei valori<br />

relativamente bassi, che possono essere memorizzati utilizzando un numero<br />

ridotto di bit. La tabella seguente indica i range di valori che si possono ottenere<br />

conuno, due, tre e quattro byte:<br />

Range di valori Num. di byte necessari<br />

0 ≤ X < 64 1<br />

64 ≤ X < 16384 2<br />

16384 ≤ X < 4194304 3<br />

4194304 ≤ X < 1073741824 4<br />

Un esempio di compressione di tipo byte-aligned (BA) utilizza i due bit più alti<br />

per indicare il numero di byte utilizzati per codificare effettivamente il valore, che<br />

73


5 - Implementazioni<br />

viene mappato a questo punto su 6, 14, 22 o 30 bit. Nella migliore delle ipotesi si<br />

ottiene una compressione del volume di dati fino a quattro volte, infatti il caso<br />

ottimo sarebbe quello in cui tutti i valori da codificare fossero inferiori a 2 6 =64 e<br />

potessero quindi venire memorizzati usando un singolo byte mentre, senza<br />

compressione, si utilizzerebbero sempre comunque quattro byte per ogni entry<br />

della posting list.<br />

Variable length compression: la tecnica che vedremo ora presuppone<br />

nuovamente che in ogni entry venga mantenuta soltanto la differenza tra<br />

l’identificativo corrente e quello nella entry precedente e utilizza per la<br />

compressione di tali valori un codice detto Elias encoding. Questo codice<br />

rappresenta un certo intero x utilizzando 2⎣log2 x ⎦ + 1 bit; i primi ⎣ 2 x⎦<br />

la rappresentazione unaria del valore ⎣ 2 x⎦<br />

74<br />

log bit sono<br />

log (la rappresentazione unaria è una<br />

rappresentazione degli interi usando solo il digit 1), questa rappresentazione<br />

unaria viene poi seguita da uno stop bit a 0; a questo punto abbiamo rappresentato<br />

la più alta potenza di 2 che non superi il nostro valore x; i restanti ⎣ 2 x⎦<br />

rappresentano il valore<br />

k<br />

x− 2 (dove k ⎣log2 x⎦<br />

Supponiamo di dover codificare il numero 14:<br />

= ) in binario.<br />

1. ⎣log2 14⎦=<br />

3 va rappresentato in unario: 111<br />

2. Si inserisce uno stop bit a 0: 1110<br />

3. Si codifica il resto 2 14 8 6<br />

3<br />

− = − =<br />

110<br />

log bit<br />

x in binario usando ⎣ 14⎦<br />

3<br />

log 2 = bit:<br />

4. Si concatenano le codifiche parziali ottenute ai punti 1), 2) e 3) e si ottiene<br />

quindi 1110110<br />

La decodifica viene eseguita in un singolo passo perchè si sa che per un numero<br />

con n bit prima dello stop bit a 0, ci saranno n bit successivi a tale stop bit.<br />

Gamma encoding: questo schema è basato su un vettore V contenente dei valori<br />

interi positivi vi ordinati in modo crescente tali che ∑vi ≥ N (dove N è il<br />

massimo valore che si deve poter codificare); per codificare un numero intero x ≥<br />

1 relativamente a V occorre trovare quel valore di k tale che


5 - Implementazioni<br />

k −1<br />

∑<br />

j = 1<br />

v<br />

j<br />

< x ≤<br />

ossia trovare il primo componente di V tale che la somma di tutti i componenti<br />

precedenti sia maggiore o uguale al valore x da codificare.<br />

Supponiamo ad esempio di avere x=7 e V={1, 2, 4, 8, 16, 32}. Allora i primi tre<br />

componenti di V, cioè {1, 2, 4} sono quelli necessari per ottenere t, quindi k=3; a<br />

questo punto il valore di k viene rappresentato con una qualche codifica<br />

(tipicamente quella unaria), seguita dalla differenza<br />

d<br />

1<br />

= − ∑ − k<br />

x<br />

75<br />

j = 1<br />

k<br />

∑<br />

v<br />

j = 1<br />

j<br />

v<br />

j<br />

−1<br />

Nel nostro caso d=7-(1+2)-1=3, che viene codificato in ⎡ v ⎤= ⎡log 4⎤=<br />

2<br />

log2 k<br />

2<br />

bit. Una scelta tipica è quella di avere un vettore V composto da potenze di 2,<br />

ossia {1, 2, 4, 8, ...}, chiaramente però si può modificare il vettore V in modo da<br />

dare caratteristiche diverse alla compressione.<br />

5.2 Signature file<br />

Una possibile implementazione di un sistema di information retrieval molto citata<br />

in letteratura è quella che fa uso dei cosiddetti signature file.<br />

Un signature file memorizza sotto forma di stringhe binarie delle astrazioni<br />

(signature appunto) dei documenti (o parti di essi) che vengono poi confrontate<br />

con una corrispondente signature della query di ricerca.<br />

I vari termini presenti nel documento vengono codificati mediante una funzione<br />

hash, quindi combinati in modo da ottenere una bitstring (di lunghezza fissa o<br />

variabile) che rappresenta il documento in esame.<br />

La tecnica di recupero basata sui signature files è di tipo booleano, cioè si cercano<br />

i documenti che contengono i termini espressi nella query.


0100101101001010<br />

1100010110101000<br />

1000101101100011<br />

....<br />

....<br />

signature file pointer<br />

file<br />

5 - Implementazioni<br />

Figura 17 - Sistema di IR basato su signature file<br />

Le query subiscono lo stesso trattamento dei documenti: si codificano i vari<br />

termini mediante una funzione hash e si combinano i valori ottenuti in modo da<br />

generare una stringa binaria. A questo punto si confrontano le signature dei vari<br />

documenti con quella della query: ogni record contenente una signature in cui<br />

sono a “1” tutti i bit corrispondenti a quelli a “1” della query indica un documento<br />

che potenzialmente soddisfa la query di ricerca. Si è detto potenzialmente, infatti è<br />

inevitabile che più documenti abbiano le signature in cui risultano settati gli stessi<br />

bit che sono a “1” nella codifica della query ma che in realtà non contengono i<br />

termini indicati in essa. Quando si verifica questa condizione si ha un false drop;<br />

ovviamente quando si studia un sistema di signature uno degli obiettivi a cui si<br />

punta è quello di minimizzare la probabilità di avere dei false drop. In fase di<br />

ricerca quindi bisogna effettuare un’ulteriore analisi per verificare se i record<br />

restituiti corrispondono ad un false match oppure ad un true match; tale analisi<br />

può essere fatta decodificando opportunamente le signature recuperate oppure,<br />

ove questo non fosse possibile, effettuando una ricerca full-text sul subset di<br />

documenti restituiti.<br />

76<br />

doc. #1<br />

doc. #2<br />

doc. #3<br />

....<br />

document file


5 - Implementazioni<br />

Faremo ora una rapida carrellata delle principali tecniche per ottenere un signature<br />

file.<br />

5.2.1 Metodo WS (Word Signature)<br />

Si genera la signature di ogni termine (significativo) del documento mediante una<br />

funzione hash, in modo da ottenere per ognuno una stringa di fT bit; la signature di<br />

un documento è una stringa di f bit ottenuta concatenando tutte le D signature dei<br />

singoli termini (quindi f = D * fT<br />

). Vediamo un esempio:<br />

TERMINE signature extraction method<br />

SIGNATURE 0100 0111 1011<br />

La signature del documento completo risulta 0100 0111 1011 (D=3 ; fT=4 ; f=12).<br />

Questo metodo ha il vantaggio di preservare l’ordine dei termini, ma presenta una<br />

serie di inconvenienti: il primo è ovviamente quello di generare signature di<br />

dimensioni variabili, il che complica la fase di ricerca.<br />

La probabilità di false drop vale:<br />

F<br />

d<br />

≈<br />

2<br />

D<br />

f<br />

D<br />

dove D=numero di word signature per documento, f=numero di bit per signature,<br />

fT=numero di bit per ogni word signature (D e f sono valori medi).<br />

Esempio: con D=40 termini per signature e fT=25, cioè f=1000 bit assegnati ad<br />

ogni documento (in media), la probabilità di false drops per una query di un<br />

−6<br />

termine risulta pari a Fd = 1.<br />

2 * 10 , cioè un false drop per milione di documenti.<br />

77<br />

=<br />

2<br />

D<br />

fT


5.2.2 Superimposed coding<br />

5 - Implementazioni<br />

Il metodo di superimposed coding è di gran lunga il più diffuso tra i vari signature<br />

method, grazie alla sua velocità in fase di ricerca ed al limitato overhead di<br />

memoria (dal 10% al 20% del file dei documenti).<br />

Ogni termine, mediante una funzione hash, pone a “1” un determinato numero m<br />

di bit di una stringa di lunghezza fissa f; la signature del documento è ottenuta<br />

facendo l’OR delle signature dei singoli termini.<br />

TERMINE SIGNATURE DEL TERMINE<br />

signature 010 000 100 001<br />

extraction 010 010 010 000<br />

method 000 100 010 001<br />

SIGNATURE DEL DOCUMENTO = 010 110 110 001<br />

In fase di ricerca la signature S associata ad un determinato documento soddisfa la<br />

query se e solo se, data la signature q della query generata allo stesso modo, si ha<br />

S AND q = q, ovvero se e solo se la signature S del documento contiene tutti “1”<br />

nelle posizioni in cui q vale “1”. Le conjunctive query, ossia le query contenenti<br />

termini in AND, vengono trasformate nello stesso modo visto per i documenti; le<br />

disjunctive query, ossia quelle contenenti termini in OR, vengono invece mappate<br />

mediante un insieme di signature distinte, una per ogni blocco in OR: tali<br />

signature sono trattate separatamente e si procede poi ad effettuare il merge dei<br />

risultati parziali così ottenuti.<br />

La probabilità di false drop per una query con un singolo termine è data da:<br />

F<br />

d<br />

⎡<br />

≈ ⎢1<br />

− e<br />

⎢⎣<br />

78<br />

m D<br />

−<br />

f<br />

*<br />

ed è pari alla probabilità che una signature abbia a “1” tutti gli m bit specificati<br />

nella query. Si può notare che Fd, per valori fissati di D e f , dipende dal numero<br />

m di bit settati a “1” (tale valore viene spesso indicato come peso della signature);<br />

⎤<br />

⎥<br />

⎥⎦<br />

m


5 - Implementazioni<br />

in particolare si può dimostrare che Fd aumenta sia se m è troppo grande (quindi<br />

se la signature del documento ha troppi bit a “1”), sia se è troppo piccolo (e quindi<br />

si hanno pochi “1” nella signature). A fronte di queste considerazioni si deduce<br />

che esiste un valore ottimale di m; tale valore si ottiene a partire dalla formula<br />

f<br />

precedente mediante alcuni passaggi matematici e vale mopt = ln 2 , con cui si<br />

D<br />

ottiene<br />

Fd<br />

−m<br />

opt<br />

= 2 .<br />

Operativamente si è visto che, con il valore di m appena ottenuto, le signature dei<br />

documenti avevano mediamente la metà dei bit a “1”.<br />

Esempio: supponiamo di avere signature di f=1024 bit ed un numero D=40 di<br />

termini. Si ottiene mopt=18 e la probabilità di false drop risulta pari a<br />

−6<br />

F d = 4.<br />

6 * 10 , ossia una query con un solo termine produce in media 5 false<br />

drops su un milione di documenti.<br />

5.2.3 Metodi basati su compressione<br />

Questi metodi fanno uso di signature sparse, cioè contenenti un basso numero di<br />

bit a “1”, che vengono poi compresse con diverse tecniche. Questi metodi<br />

permettono di ottenere signature file di dimensioni assai ridotte e probabilità di<br />

false drop inferiori a quelle viste per i casi precedenti; il tempo di ricerca, però,<br />

risulta abbastanza elevato.<br />

Vediamo ad esempio la tecnica di Bit-Block Compression: essa fa uso della<br />

tecnica di superimposed coding, ma con signature di dimensione B molto grande<br />

divise in blocchi contenenti b bit che vengono poi compressi separatamente.<br />

TERMINE<br />

SIGNATURE DEL TERMINE<br />

(B=20; b=4; m=1)<br />

signature 0000 0000 0010 0000 0000<br />

extraction 0001 0000 0000 0000 0000<br />

method 1000 0000 0000 0000 0000<br />

79


5 - Implementazioni<br />

SIGNATURE SPARSA = 1001 0000 0010 0000 0000<br />

A questo punto si procede alla compressione della signature: la signature<br />

compressa è costituita da tre parti, una per ogni blocco:<br />

A. un bit a “1” o a 0 a seconda che esista oppure no un bit settato nel blocco<br />

B. il numero di bit a “1” nel blocco meno 1, il tutto espresso in notazione<br />

unaria, più uno “0” terminale<br />

C. la posizione dei bit a “1” nel blocco (espressa usando log2b bit per ogni<br />

posizione).<br />

Partendo dall’esempio precedente si avrebbe:<br />

SIGNATURE SPARSA 1001 0000 0010 0000 0000<br />

PARTE A 1 0 1 0 0<br />

PARTE B 10 0<br />

PARTE C 0011 10<br />

La signature compressa può venire memorizzata in due modi:<br />

1. BCG (per gruppi-blocchi): 1100011 0 1010 0 0<br />

2. BCP (per parti): 10100 100 001110<br />

Il metodo BCP è quello che richiede meno confronti in fase di ricerca, in quanto<br />

l’esame dei soli bit della parte A è sufficiente per eliminare molte signature dal<br />

risultato.<br />

Utilizzando questi metodi si ottiene una probabilità di false drop pari a:<br />

F d<br />

≈ 1 . 913*<br />

m−<br />

Esempio: con m=1, D=40 e f=1024 si ottiene<br />

quindi, di quella ottenuta con gli altri metodi.<br />

80<br />

f<br />

D<br />

−8<br />

F d = 4.<br />

5*<br />

10 , molto più bassa,<br />

Le signature relative ai documenti che costituiscono la collezione vengono<br />

ovviamente mantenute in uno o più file separati; le dimensioni di questi file<br />

generalmente sono assai inferiori a quelle della collezione a cui si riferiscono e la<br />

scansione risulta assai più veloce rispetto a quella dell’intero set di documenti. Le


5 - Implementazioni<br />

due strutture più utilizzate e più citate in letteratura sono quella sequenziale (SSF,<br />

Sequential Signature Files) e quella Bit-Sliced (BSSF, Bit Sliced Signature Files).<br />

L’organizzazione sequenziale è quella più semplice, ma allo stesso tempo risulta<br />

inadeguata per grandi database a causa della lentezza nella scansione. Per ovviare<br />

a questo problema sono state ideate diverse soluzioni che sfruttano l’idea di base<br />

di suddividere in più parti il signature file.<br />

La classificazione principale delle tecniche sopracitate distingue innanzitutto tra<br />

organizzazioni basate su:<br />

PARTIZIONAMENTO VERTICALE<br />

Idea di base: Signature file memorizzato per colonne<br />

Vantaggio: Si esaminano solo alcune colonne<br />

Svantaggio: Gli inserimenti sono onerosi<br />

Esempi: bit-sliced, frame sliced<br />

PARTIZIONAMENTO ORIZZONTALE<br />

Idea di base: Signature simili raggruppate in bucket<br />

Vantaggio: Si devono esaminare solo alcuni bucket<br />

Svantaggio: Tende a SSF per query con peso basso<br />

Esempi: S-tree, Key based<br />

Vediamo ora più in dettaglio alcuni dei metodi citati.<br />

5.2.4 Bit-sliced signature file<br />

Questo metodo fa uso di f file, uno per ogni posizione dei bit nella signature (o,<br />

per vederla in un’altra maniera, uno per ogni colonna del signature file). Il<br />

vantaggio sta nel fatto che in fase di ricerca si accede soltanto ai file relativi alle<br />

colonne in cui i bit della signature della query sono a “1”; a questo punto si<br />

81


5 - Implementazioni<br />

restituiscono i documenti per cui tutti i bit del sottoinsieme così ottenuto sono a<br />

“1”.<br />

Supponiamo ad esempio di avere un file costituito dalle seguenti signature (f=8):<br />

s1: 00011110<br />

s2: 11010001<br />

s3: 00111100<br />

s4: 11000011<br />

s5: 00110110<br />

s6: 11001001<br />

Organizzandolo con una struttura bit-sliced si ottengono 8 file, ognuno<br />

corrispondente ad una colonna del signature file, e cioè:<br />

c1: 010101<br />

c2: 010101<br />

c3: 001010<br />

c4: 111010<br />

c5: 101001<br />

c6: 101010<br />

c7: 100110<br />

c8: 010101<br />

Se dovessimo analizzare una query con signature q=00100010 sarebbe sufficiente<br />

quindi accedere ai file c3 e c7 e restituire quei documenti i cui bit della signature<br />

presenti nei file considerati sono tutti a 1.<br />

Questo metodo risulta particolarmente efficace nel caso di query con basso peso,<br />

ma presenta dei costi di inserimento elevati: bisogna infatti fare accesso a f file<br />

diversi ogni volta che si inserisce un nuovo documento nella collezione; questa<br />

tecnica risulta quindi poco efficiente se si hanno database fortemente dinamici.<br />

Un modo ulteriore per ottimizzare la ricerca potrebbe essere quello di selezionare<br />

le slice in ordine crescente di densità, dalle più sparse alle più dense, in modo che<br />

le prime riducano subito il campo di ricerca; una simile implementazione richiede<br />

ovviamente che ad ogni slice venga associata una qualche indicazione sulla sua<br />

densità.<br />

Con i bitsliced signature file ci si trova spesso di fronte a problemi di scala:<br />

collezioni con un grande numero di documenti hanno delle slice molto lunghe,<br />

che richiedono quindi un notevole overhead in termini di I/O per essere lette;<br />

un’eventuale compressione delle slice porterebbe dei benefici in termini di<br />

occupazione di spazio (sperimentalmente si è visto che si arriva ad una riduzione<br />

82


5 - Implementazioni<br />

del 50% delle dimensioni), ma la successiva fase di decodifica renderebbe<br />

estremamente lento l’intero processo (le tecniche di compressionedecompressione<br />

che possono essere utilizzate con le slice risultano infatti assai<br />

più complesse di quelle utilizzabili con gli index file).<br />

5.2.5 Frame-sliced signature file<br />

L’idea di questo metodo è quella di forzare a “1” i bit di un termine in una zona<br />

ristretta della signature (frame, composto da s =<br />

f<br />

bit); la signature del<br />

k<br />

documento viene poi ottenuta come nel superimposed coding, realizzando ciè<br />

l’OR delle signature relative ad ogni singolo termine. Si ha ancora un<br />

partizionamento verticale del signature file, ma ora le partizioni non sono più a<br />

livello di singola colonna, bensì a livello di frame.<br />

In fase di ricerca, per una query di n termini saranno richiesti al massimo n accessi<br />

su disco, poichè al massimo n frame della query signature conterranno dei bit a<br />

“1”; rispetto al metodo bit-sliced si ha il vantaggio che, in fase di inserimento, gli<br />

accessi saranno solo k (=numero di frame) e non più f (=numero di colonne).<br />

TERMINE SIGNATURE DEL TERMINE<br />

signature 1010 0000 0000<br />

extraction 0000 1100 0000<br />

method 1001 0000 0000<br />

SIGNATURE DEL DOCUMENTO = 1011 1100 0000<br />

5.2.6 S-Tree<br />

Un signature tree è un’organizzazione a partizionamento orizzontale multilivello.<br />

Ogni foglia dell’S-tree contiene signature “simili”, ossia con distanza di Hamming<br />

bassa, oltre ai puntatoriai documenti; l’OR di queste signature costituisce la<br />

83


5 - Implementazioni<br />

chiave della foglia, che viene riportata in un nodo al livello superiore dell’albero<br />

assieme al puntatore alla foglia.<br />

Sempre partendo dal signature file visto in precedenza si otterrebbe un signature<br />

tree come quello in figura (supponendo di avere nodi con capacità di 3 signature):<br />

00111110<br />

11011011<br />

B s1: 00011110<br />

s3: 00111100<br />

s5: 00110110<br />

C<br />

Figura 18 - Esempio di S-Tree<br />

La query con signature q=00100010 porta ad accedere inizialmente al nodo A,<br />

quindi al nodo foglia B.<br />

I signature tree presentano alcuni grossi inconvenienti: uno di questi sta nel fatto<br />

che i nodi ai livelli superiori tendono a “saturare” generando signature con molti<br />

“1”, che sono quindi inutili per guidare la ricerca. Nel caso precedente, se<br />

avessimo avuto una query con signature q1=00011010, il nodo radice non sarebbe<br />

stato in grado di indirizzare la ricerca ad uno dei due nodi foglia; in una tale<br />

situazione i nodi foglia avrebbero dovuto necessariamente essere letti in maniera<br />

sequenziale.<br />

5.2.7 Organizzazioni “Key-based”<br />

A<br />

L’idea comune a queste organizzazioni è quella di raggruppare in bucket le<br />

signature con uno stesso valore di chiave, definita come il valore di una parte<br />

della signature. In fase di ricerca, se un bucket ha chiave Kb e la query ha chiave<br />

Kq, allora si accede a tale bucket se e solo se Kb AND Kq = Kq.<br />

84<br />

s2: 11010001<br />

s4: 11000011<br />

s6: 11001001


5 - Implementazioni<br />

Vediamo ora alcuni esempi di organizzazioni “Key-Based”:<br />

ORGANIZZAZIONE DESCRIZIONE<br />

Fixed Key (o Fixed Prefix) Usa una chiave di k bit<br />

Extended Key<br />

Floating Key<br />

Usa una chiave con un numero fisso, z, di bit<br />

a “0”<br />

La chiave è la prima stringa di k bit con il<br />

minimo numero di bit a “1”<br />

Ad ognuna di queste organizzazioni corrisponderebbero le seguenti suddivisioni<br />

del signature file di esempio:<br />

Fixed Key (k=2)<br />

s1: 00011110<br />

s3: 00111100<br />

s5: 00110110<br />

Key=”00” Key=”11”<br />

Extended Key (z=2)<br />

s1: 00011110<br />

s3: 00111100<br />

s5: 00110110<br />

Floating Key (k=2)<br />

Ovviamente, nel caso di un’organizzazione key-based si può pensare di<br />

memorizzare le varie chiavi in una key-table sufficientemente piccola da poter<br />

essere mantenuta in memoria centrale, in modo da rendere ancora più efficiente e<br />

veloce la fase di ricerca.<br />

85<br />

s2: 11010001<br />

s4: 11000011<br />

s6: 11001001<br />

s2: 11010001 s4: 11000011<br />

s6: 11001001<br />

Key=”00” Key=”11010” Key=”1100”<br />

s1: 00011110<br />

s3: 00111100<br />

s5: 00110110<br />

s2: 11010001 s4: 11000011<br />

s6: 11001001<br />

Key=”00” Key=”****00” Key=”**00”


Capitolo 6<br />

Integrazione tra IR e database<br />

I due campi dei database e dell’information retrieval si sono evoluti separatamente<br />

per un lungo periodo, questo a causa delle differenze tra i rispettivi argomenti di<br />

studio: mentre l’IR si occupa di testi in linguaggio naturale (quindi dati non<br />

formattati) e recupero incerto di informazioni, l’applicazione e lo studio dei<br />

database si focalizza su data model (quindi informazioni strutturate), query<br />

language, ossia linguaggi dichiarativi, e recupero booleano delle informazioni.<br />

Con l’andare del tempo però si è arrivati ad una sempre maggiore integrazione tra<br />

i due campi a causa di una serie di motivi. Alcuni di questi sono di tipo<br />

funzionale, in quanto sempre più applicazioni richiedono di poter accedere ad una<br />

combinazione di dati formattati e non; tali applicazioni vengono sovente indicate<br />

in letteratura come textual database e fondamentalmente sono dei repository di<br />

documenti. I textual database forniscono una combinazione di content<br />

management, ossia gestione del contenuto dei documenti, e manipolazione di dati<br />

formattati: queste due parti vengono generalmente indicate come content structure<br />

e logical structure di un documento. Consideriamo ad esempio una richiesta,<br />

sottoposta ad una qualche raccolta digitale, dei “Rapporti tecnici del CNR a<br />

partire dal 1990 sull’attività eruttiva del Vesuvio” (posto che il CNR si occupi di<br />

queste cose!): in questo esempio abbiamo sia delle informazioni associate ad<br />

attributi degli oggetti presenti nella raccolta, ossia “Rapporto tecnico” (= tipo di<br />

documento), “CNR” (= redattore del documento), “a partire dal 1990” (= periodo<br />

di pubblicazione), sia delle informazioni legate al loro contenuto, l’ “attività<br />

eruttiva del Vesuvio”.<br />

Altri argomenti a favore dell’integrazione sono di natura tecnologica, in quanto un<br />

DBMS offre un indispensabile supporto per la risoluzione di una serie di problemi<br />

che un sistema di IR, come qualsiasi altra applicazione, deve affrontare, vale a<br />

dire:<br />

86


concurrency control<br />

recovery<br />

indexing dei dati<br />

6 – Integrazione tra IR e database<br />

parallel processing.<br />

I campi qui elencati, nell’ambito dei database vantano anni di esperienza, studi ed<br />

implementazioni.<br />

Argomento di questo capitolo è l’integrazione tra i sistemi di IR ed i database di<br />

tipo relazionale. Il modello relazionale è basato sul concetto di tabella, che viene<br />

anche chiamata relazione: una singola colonna di una relazione viene detta<br />

attributo, una relazione, infine, è un set di tuple; come requisito fondamentale,<br />

una relazione deve essere in prima forma normale (tipicamente indicata 1NF),<br />

cioè tutti i valori degli attributi devono essere atomici. Il linguaggio standard di<br />

interrogazione di un database relazionale è SQL (Structured Query Language): si<br />

tratta di un linguaggio dichiarativo, ossia uno statement SQL specifica solo quale<br />

debba essere il risultato e non quali operazioni devono essere eseguite per<br />

ottenerlo.<br />

L’uso dei database relazionali ha una serie di vantaggi, ma anche una serie di<br />

problemi non indifferenti: il primo sta nel fatto che, anche per richieste al sistema<br />

relativamente semplici, le interrogazioni SQL che ne derivano possono essere<br />

molto complicate; per questa ragione il linguaggio SQL risulta poco adatto in<br />

un’interfaccia utente come linguaggio di interrogazione a disposizione degli<br />

utilizzatori del sistema: si dovrà prevedere un qualche parser che trasformi le<br />

richieste dell’utente, espresse in un qualche linguaggio ad esso più congeniale, nei<br />

corrispondenti statement di interrogazione per il motore di database.<br />

Il secondo inconveniente è legato al fatto che le relazioni debbano essere in 1NF:<br />

dovendo utilizzare dei database relazionali bisogna decidere quale debba essere<br />

l’unità atomica di informazione da registrare in ogni singola tupla. Un database<br />

relazionale consiste di un insieme di tabelle (o relazioni), ogni tabella consiste di<br />

un set di tuple, ogni tupla consiste di una sequenza di attributi il cui valore deve<br />

87


6 – Integrazione tra IR e database<br />

essere atomico. I dati di un sistema di IR sono molto più complessi: al livello più<br />

alto si ha una collezione di documenti e ogni documento può essere composto da<br />

una serie di campi; oltre questo livello di dettaglio la struttura dei dati diventa<br />

diversa: anzichè essere atomico, un campo di un documento (potrebbe essere un<br />

abstract, il corpo del documento, l’indice) contiene una sequenza di frasi che a<br />

loro volta sono composte da più parole; ogni parola, in conclusione, è una<br />

sequenza di valori atomici, ossia le lettere. La soluzione più ovvia è quella di<br />

associare ad ogni tupla una singola parola del testo (anche in considerazione dei<br />

tipi di dati standard presenti nei DBMS sul mercato); questa soluzione, unita al<br />

vincolo che le tabelle devono essere devono essere in 1NF fa sì che gli oggetti del<br />

modello di IR (in particolare i documenti) siano “spalmati” su più relazioni. Tutto<br />

questo fa sì che le query di interrogazione risultino alquanto complesse da<br />

scrivere; inoltre queste ultime richiederanno una lunga serie di join per poter<br />

essere valutate, join che rallentano il processo di ricerca: se ne deduce quindi che<br />

la normalizzazione delle relazioni è accompagnata da una perdita di efficienza.<br />

Le ultime generazioni di database relazionali supportano anche tipi di dati non<br />

tradizionali, come testi complessi o dati multimediali (i cosiddetti campi di tipo<br />

BLOB, Binary Large OBject), per cui si potrebbe pensare di memorizzare in una<br />

singola tupla un intero documento o una parte di esso; tutto questo risulterebbe<br />

però alquanto inefficiente, in quanto sarebbe assai problematico per il DBMS<br />

gestire degli indici su tali campi e le ricerche si risolverebbero in una scansione<br />

sequenziale del testo, con prestazioni decisamente insoddisfacenti. In realtà<br />

vedremo più avanti che questo tipo di soluzione è molto utilizzata, sono però<br />

necessarie delle estensioni dei database al fine di migliorarne l’efficienza.<br />

Individuato nella prima forma normale uno dei problemi maggiori del modello<br />

relazionale (limitatamente all’ambito dell’IR ovviamente), alcuni studiosi hanno<br />

proposto delle estensioni di quest’ultimo che, nelle loro ipotesi, dovevano favorire<br />

la gestione di documenti testuali; riportiamo questi studi anche se non abbiamo<br />

trovato informazioni riguardo ad implementazioni o prototipi basati (direttamente)<br />

su di essi.<br />

88


6 – Integrazione tra IR e database<br />

Schek e Pistor hanno introdotto un modello relazionale in cui le relazioni non<br />

erano più necessariamente in prima forma normale: un singolo attributo poteva<br />

essere a sua volta una relazione, ossia un set di tuple. Tale modello risultava<br />

quindi essere in non-first-normal-form (NF 2 ).<br />

Supponendo di voler mantenere le informazioni bibliografiche su una collezione<br />

di libri, una soluzione possibile con il modello NF 2 potrebbe essere la seguente:<br />

BOOKS<br />

Authors Title Price Descriptors<br />

A1, A2 T1 P1 D1, D2<br />

A2 T2 P2 D1, D4<br />

A1 T3 P1 D1, D2, D3<br />

Figura 19 - Esempio di relazione in non-first-normal-form<br />

A causa della presenza di più valori per gli attributi Autors e Descriptors questa<br />

tabella viola la condizione 1NF del modello relazionale; per adattarla al modello<br />

classico dovrebbe essere ristrutturata nel modo seguente:<br />

BOOKS<br />

BNO Title Price<br />

1 T1 P1<br />

2 T2 P2<br />

3 T3 P1<br />

AUTHORS<br />

BNO Author<br />

1 A1<br />

1 A2<br />

2 A2<br />

3 A1<br />

89


6 – Integrazione tra IR e database<br />

DESCRIPTORS<br />

BNO Descriptor<br />

1 D1<br />

1 D2<br />

2 D1<br />

2 D4<br />

3 D1<br />

3 D2<br />

3 D3<br />

Figura 20 - Normalizzazione di una relazione in non-first- normal-form<br />

E’ indubbio che la prima soluzione sia quella di impatto più immediato in fatto di<br />

chiarezza delle informazioni.<br />

Schek e Pistor proposero anche una nuova definizione per alcuni degli operatori<br />

standard dell’algebra relazionale, in modo da poter essere usati nel nuovo<br />

modello; in particolare per l’operatore di selezione σ si potevano ora utilizzare<br />

delle costanti che in realtà erano oggetti composti (ossia insiemi di termini),<br />

mentre alle operazioni di confronto si aggiungevano quelle di appartenenza e<br />

inclusione importate dalla teoria degli insiemi (⊂, ⊆, ⊇, ⊃, ∈).<br />

Le operazioni di boolean retrieval potevano ora essere formulate mediante un<br />

nuovo linguaggio SQL-NF 2 ; tornando all’esempio di fig. 19, una query per<br />

cercare i titoli dei libri il cui descrittore contenesse i termini D1 e D2 sarebbe stata<br />

del tipo<br />

SELECT Title FROM Books WHERE descriptors ⊇ {D1, D2}<br />

o, analogamente<br />

90


6 – Integrazione tra IR e database<br />

SELECT Title FROM Books WHERE D1 ∈ descriptors AND D2<br />

∈ descriptors<br />

Un esempio leggermente più complicato è quello seguente, in cui ad ogni libro<br />

vengono associati gli index term con i relativi pesi associati:<br />

BOOKS_WD<br />

BNO Authors Title Price<br />

1 A1, A2 T1 P1<br />

2 A2 T2 P2<br />

3 A1 T3 P1<br />

91<br />

WDesc<br />

Descriptor WGT<br />

D1<br />

D2<br />

D1<br />

D4<br />

D1<br />

D2<br />

D3<br />

W1<br />

W2<br />

W3<br />

W1<br />

W3<br />

W2<br />

W4<br />

Supponiamo ora di voler trovare tutti i titoli dei libri scritti dall’autore A1 in cui<br />

l’index term D1 compare con peso maggiore o uguale a 0.5 :<br />

SELECT Title FROM BOOKS_WD WHERE A1 ∈ Authors AND<br />

(SELECT * FROM WDesc WHERE Descriptor=D1 AND WGT ≥ 0.5)<br />

≠ {}<br />

Gli operatori più interessanti dell’algebra sono probabilmente quelli chiamati<br />

“NEST” e “UNNEST”, che vengono usati per trasformare una relazione 1NF in<br />

una in NF 2 e viceversa. Per vedere come funzionano supponiamo di dover definire<br />

una vista, partendo dalla tabella AUTHORS di Fig. 20, che contenga per ogni<br />

libro la lista degli autori che lo hanno scritto:<br />

DEFINE VIEW Authors_NF2 (bookno, authors) AS<br />

SELECT BNO, NEST(Author) FROM AUTHORS


6 – Integrazione tra IR e database<br />

Questo statement raggruppa il set degli autori che hanno in comune<br />

l’identificativo del libro.<br />

Supponiamo ora di voler eseguire l’operazione inversa, ossia mappare in 1NF una<br />

tabella che è in NF 2 ; si può ottenere tale risultato mediante la seguente query:<br />

DEFINE VIEW Authors_1NF (bookno, author) AS<br />

SELECT BNO, UNNEST(authors) FROM Authors_NF2<br />

Il modello NF 2 si integra molto bene con le applicazioni di IR poichè i documenti<br />

possono essere rappresentati in una singola relazione annidata; inoltre il<br />

linguaggio di interrogazione risulta essere molto potente e ricerche anche<br />

complicate possono essere effettuate mediante un unico, semplice statement SQL-<br />

NF 2 . Il problema principale risulta essere la costruzione e la gestione degli indici:<br />

dato che i valori degli attributi possono essere non-atomici, anche le chiavi degli<br />

indici avranno un dominio complesso (come vedremo più avanti, questo risulta<br />

essere uno dei principali ambiti di studio nel campo dei database).<br />

Un altro modello per la gestione di un testo strutturato che viene sovente citato in<br />

letteratura è quello proposto da Clarke, Cormack e Burkowski. Nel loro modello è<br />

prevista la gestione di documenti strutturati e la struttura viene descritta viene<br />

descritta mediante l’uso di appositi tag che delimitano i vari elementi strutturali<br />

del documento (un pò come avviene, ad esempio, per il linguaggio HTML). Gli<br />

oggetti atomici, in questo modello, sono nuovamente i vari termini del<br />

documento, a cui vengono però associati i tag che eventualmente si aprono e si<br />

chiudono immediatamente prima o dopo il termine in questione. Tale modello<br />

prevede poi una index function che associa ai vari termini (o, come vengono<br />

chiamati dagli autori, simboli del text alphabet) la corrispondente posizione nel<br />

database; una funzione analoga viene usata per mappare i vari tag (o simboli del<br />

markup alphabet) nel database. L’aspetto interessante di questo modello sta<br />

nell’uso dei tag per descrivere la struttura del documento e nel loro utilizzo nelle<br />

primitive dell’algebra. Si tratta nuovamente di un modello concettuale: non viene<br />

92


6 – Integrazione tra IR e database<br />

spiegato come dovrebbe venire implementato e non viene fatto alcun riferimento<br />

ad un’eventuale grammatica per un linguaggio di interrogazione simil-SQL; gli<br />

autori si limitano a dire che il loro modello può coesistere con quello relazionale e<br />

che le interrogazioni possono venire sottoposte tramite query SQL standard.<br />

Un terzo modello che cerca di riempire il gap esistente tra i database ed i sistemi<br />

di information retrieval è quello proposto da Fuhr. Quest’ultimo parte dalla<br />

considerazione che la differenza fondamentale tra i due campi sta nel fatto che in<br />

IR si ha a che fare con query vaghe e dati imprecisi ed incompleti, mentre<br />

l’assunzione basilare nell’area dei DB è che le query sono precise ed i dati esatti, e<br />

propone di combinare l’algebra relazionale con il probabilistic retrieval; il<br />

risultato è quello che l’autore definisce come Probabilistic Relational Algebra<br />

(PRA).<br />

Data una relazione R, si introduce una funzione di probabilità ( r)<br />

∈ [ 0,<br />

1]<br />

93<br />

ς tale<br />

che, se r ∈ dom(R), allora ς () r = P(<br />

r ∈ R)<br />

, cioè ς (r)<br />

indica la probabilità che<br />

R<br />

la tupla r appartenga alla relazione R, ossia la probabilità dell’event expression r<br />

∈ R. L’autore procede poi alla ridefinizione delle operazioni<br />

dell’algebrarelazionale; tali operazioni vengono ridefinite basandosi su<br />

combinazioni booleane delle event expression associate agli operatori (ossia alle<br />

tuple coinvolte nell’operazione).<br />

La probabilistic relational algebra rappresenta un’estensione del modello<br />

relazionale in modo che questo possa trattare anche informazioni e predicati vaghi<br />

o incerti; la base su cui opera è però sempre il modello relazionale che, come già<br />

messo in evidenza precedentemente, risulta piuttosto inadatto se combinato con<br />

un sistema di IR. L’autore propone quindi un’ulteriore evoluzione in cui associa i<br />

concetti probabilistici con il modello NF 2 : nuovamente il concetto di base è<br />

quello di associare ad ogni tupla una funzione di probabilità; vengono poi<br />

nuovamente ridefiniti gli operatori dell’algebra relazionale. Si ottiene così un<br />

modello probabilistico che fa uso di relazioni annidate (probabilistic non-firstnormal-form).<br />

R<br />

R


6 – Integrazione tra IR e database<br />

Se mi è permesso muovere una critica a questo modello, come a tutti i modelli di<br />

sistemi di IR di tipo probabilistico, vorrei dire che sono molto rigorosi e precisi,<br />

ma partono sempre dal presupposto che siano note le probabilità associate ai vari<br />

eventi elementari: nessuno dà una spiegazione esauriente e definitiva riguardo a<br />

come dovrebbero venire effettivamente calcolate queste probabilità.<br />

Dopo aver fatto una breve panoramica su alcuni modelli concettuali che integrano<br />

IR e database relazionali, passiamo ad analizzare alcune soluzioni implementate<br />

mediante prototipi oppure nei database commerciali. Gli approcci che vengono<br />

seguiti sono principalmente tre:<br />

combinare i sistemi di IR e RDBMS esistenti: i dati strutturati vengono<br />

salvati nel database relazionale, mentre quelli non strutturati vengono<br />

mantenuti nel sistema di IR; bisogna poi creare un’interfaccia in grado di<br />

estrarre dalle query le richieste di dati per ogni sottosistema, indirizzarle e<br />

combinare poi le risposte provenienti dalle singole parti<br />

modificare un sistema di IR in modo che sia in grado di gestire query<br />

relazionali, oppure estendere un RDBMS in modo che possa trattare query<br />

su oggetti di tipo testuale. Il secondo è l’approccio seguito nei database<br />

relazionali presenti in commercio: vengono aggiunte delle estensioni al<br />

linguaggio SQL in modo da poter gestire dati strutturati predefiniti o anche<br />

definiti ex-novo dall’utente. Tutto questo non viene realizzato<br />

specificatamente per le applicazioni di information retrieval, ma queste<br />

possono trarre un indubbio vantaggio dalle evoluzioni introdotte nei<br />

sistemi in commercio<br />

implementare un IR system come applicazione di un database relazionale:<br />

la soluzione più gettonata è quella di rappresentare l’inverted index<br />

associato ad una collezione di documenti mediante un set di tabelle.<br />

94


6 – Integrazione tra IR e database<br />

6.1 Integrazione di sistemi esistenti<br />

Questa soluzione consiste nel memorizzare la parte strutturata dei dati in un<br />

DBMS commerciale e quella non strutturata in un sistema di IR preesistente o<br />

realizzato ad-hoc. Bisogna prevedere un’interfaccia che:<br />

1. effettui il parsing dell’interrogazione sottoposta al sistema in un qualche<br />

linguaggio specifico<br />

2. la divida in due parti, una strutturata e una non<br />

3. traduca ognuna delle due parti (tipicamente in una query SQL ed in una<br />

query booleana)<br />

4. invii ognuna delle due parti al sottosistema opportuno<br />

5. esegua un merge dei due risultati parziali restituiti dai sottosistemi.<br />

Il vantaggio sta nel fatto che si sfrutta il lavoro che è stato già fatto nei due singoli<br />

campi; i problemi sono legati soprattutto alla comunicazione tra i due<br />

sottosistemi: ad esempio potrebbe avvenire un update nel sistema di IR mentre la<br />

corrispondente operazione nel DBMS è stata interrotta e ha subito un rollback.<br />

Inoltre l’ottimizzazione delle query non è molto agevole in quanto l’ottimizzatore<br />

del DBMS ha solo delle informazioni parziali sulla richiesta sottoposta al sistema<br />

e può solo lavorare sulla propria parte di query.<br />

Un esempio di questo tipo di implementazione è costituita dal progetto CORDIS<br />

(Community <strong>Research</strong> and Development Information Service; si tratta del servizio<br />

comunitario di informazione in materia di ricerca e sviluppo fornito dalla<br />

commissione europea: www.cordis.lu).<br />

95


6 – Integrazione tra IR e database<br />

Figura 21 - Architettura di sistema di CORDIS<br />

Il sistema è diviso in una parte definita host (un database relazionale Sybase) ed<br />

una parte subordinata (costituita da una serie di inverted file), integrate in modo<br />

da formare un IR database. Le ricerche e le valutazioni sui dati testuali vengono<br />

effettuate utilizzando un sistema basato sul modello INQUERY; quest’ultimo è un<br />

sistema di information retrieval che fa uso di reti di inferenza di tipo bayesiano<br />

per valutare la rispondenza di un certo set di informazioni ad una determinata<br />

richiesta.<br />

Figura 22 - Collegamento tra i due sottosistemi di CORDIS<br />

I dati strutturati sono memorizzati in un RDBMS Sybase, il collegamento con le<br />

parti testuali viene mantenuto mediante puntatori ai corrispondenti blocchi di testo<br />

negli INQUERY DB.<br />

96


6 – Integrazione tra IR e database<br />

Per integrare le possibilità di interrogazione di un RDBMS e di INQUERY è stata<br />

definita un’estensione del linguaggio SQL chiamata E-SQL; in tale linguaggio<br />

vengono integrate le funzionalità di INQUERY nell’SQL standard.<br />

Un esempio di query E-SQL potrebbe essere il seguente:<br />

SELECT * FROM publications WHERE<br />

probability_rate(“information retieval”, publications)<br />

> 0.5<br />

AND publication.project_acronym=”ESPRIT 2”<br />

Questa query restituirà tutte le informazioni riguardo le pubblicazioni relative al<br />

progetto ESPRIT 2 che risultano rilevanti rispetto alle keyword “information<br />

retrieval” con un indice di rilevanza superiore a 0.5. La parte relativa al calcolo di<br />

probability_rate viene inviata al sottosistema INQUERY, che restituirà<br />

come risultato una tabella temporanea in Sybase ordinata per valore di rilevanza;<br />

in particolare la tabella temporanea conterrà una chiave esterna verso i record<br />

relativi alle pubblicazioni. A questo punto verrà costruita una nuova query Sybase<br />

del tipo<br />

SELECT publication.*<br />

FROM publication, publication_INQUERY<br />

WHERE publication.project_acronym=”ESPRIT 2”<br />

AND publication.code=publication_INQUERY.code<br />

6.2 Estensione di RDBMS con aggiunta di funzioni di<br />

IR<br />

Le applicazioni di information retrieval hanno tratto un indubbio vantaggio dalle<br />

ultime evoluzioni della tecnologia nel campo dei database; infatti le ultime<br />

generazioni di RDBMS permettono una gestione intelligente di dati complessi,<br />

intendendo per dati complessi testi, immagini, video ed ogni tipo di dati user-<br />

97


6 – Integrazione tra IR e database<br />

defined. Queste nuove piattaforme vengono sovente indicate come object<br />

relational DBMS.<br />

La possibilità di definire dei nuovi data type, sia che si tratti di dati molto<br />

semplici, sia che questi nascondano strutture interne ed attributi anche complessi,<br />

presuppone però tutta una serie di caratteristiche molto importanti che i DBMS<br />

devono garantire: una volta che si hanno dei nuovi tipi di dati bisogna anche<br />

riuscire a manipolarli e ad effettuare ricerche su di essi in maniera efficiente; ecco<br />

allora che un object relational DBMS deve necessariamente garantire:<br />

la possibilità di definire delle funzioni da parte dell’utente (User Defined<br />

Functions, UDF) mediante le quali le applicazioni possono creare,<br />

manipolare e ricercare i nuovi data type<br />

la possibilità di definire delle index structure che permettano di accedere<br />

in maniera efficiente a dati complessi quali testi, immagini o altro, in<br />

quanto i metodi di indirizzamento standard dei RDBMS risultano<br />

inadeguati per queste tipologie di dati<br />

un ottimizzatore in grado di valutare il costo delle funzioni utente e<br />

l’efficacia delle index structure per determinare l’execution plan ottimale<br />

per le query.<br />

Queste sono le tre caratteristiche che vengono da tutti riconosciute indispensabili<br />

per un object relational DBMS, altre sono l’abilità di accedere a tutti i tipi di dati e<br />

di funzioni con una singola query e di non interferire con le funzionalità esistenti<br />

del RDBMS.<br />

Alcuni database, oltre a permettere agli sviluppatori di definire degli user defined<br />

type “well suited” per le loro applicazioni, forniscono già delle architetture e<br />

delle API in forma di plug-in per l’integrazione di dati testuali e content<br />

management. E’ il caso ad esempio del DB2 Universal Database dell’IBM: questo<br />

prodotto mette a disposizione una serie di moduli chiamati DB2 Relational<br />

Extenders che forniscono una serie di abstract data type predefiniti per la gestione<br />

di testi, immagini e video. In particolare il DB2 Text Extender permette di<br />

definire una serie di indici full text e fornisce una vasta gamma di funzioni di<br />

98


6 – Integrazione tra IR e database<br />

ricerca sul testo (prossimità, wild cards, ecc.) oltre alla possibilità di ordinare i<br />

documenti in base alla loro rilevanza rispetto ai criteri di ricerca impostati.<br />

Un altro database commerciale che offre delle funzionalità fortemente orientate<br />

verso un sistema di information retrieval è l’Universal Server di Informix (siamo<br />

sempre comunque nell’orbita IBM), la cui architettura è espandibile con dei plugin<br />

chiamati DataBlade.<br />

Figura 23 - Architettura Informix Universal Server<br />

Un modulo DataBlade è un componente che indica al server come gestire nuovi<br />

data type, nuove funzioni e nuove index structure per migliorare l’accesso ai dati<br />

complessi; anche qui è presente un modulo pensato specificatamente per la<br />

gestione di dati testuali: contiene una serie di data type definiti ad hoc, funzioni di<br />

ricerca basate su concetti di prossimità e rilevanza, la possibilità di gestire un<br />

inverted index sul testo.<br />

Un discorso simile può essere fatto anche per l’ Universal Server di Oracle: qui i<br />

plug-in vengono chiamati Data Cartridge e il modulo dedicato alla gestione dei<br />

dati testuali è il ConText Cartridge che, come i precedenti, fornisce una serie di<br />

funzioni di text analysis e retrieval technology.<br />

99


6 – Integrazione tra IR e database<br />

Questo trend si ritrova anche nelle ultime evoluzioni dello standard SQL, vale a<br />

dire il progetto SQL/MM (SQL multimedia and application package), da cui è<br />

derivato l’ultimo SQL3. Lo standard SQL3 specifica le estensioni del linguaggio<br />

per definire degli user data type complessi; il progetto SQL/MM in particolare<br />

cerca di standardizzare la definizione di ADT (abstract data type) di tipo testuale,<br />

oltre alla loro interfaccia funzionale, ossia alle proprietà ed ai metodi loro<br />

associati.<br />

Ad esempio viene introdotto l’ADT FullText, oltre ad un certo numero di funzioni<br />

operanti su di esso; una volta definito questo nuovo data type, l’utente può creare<br />

delle tabelle facendovi riferimento come se fosse uno dei tipi standard di dati<br />

dell’SQL:<br />

CREATE TABLE projects(<br />

project_no integer,<br />

title varchar(50),<br />

budget integer,<br />

description FullText)<br />

Inoltre la specifica SQL/MM definisce una serie di funzioni operanti con dati di<br />

tipo FullText: ad esempio la funzione contains, che viene usata per effettuare<br />

ricerche testuali su colonne del suddetto tipo:<br />

SELECT proj_no, title FROM projects<br />

WHERE contains(description, ‘“database” IN SAME<br />

SENTENCE AS “object relational”’)<br />

La query precedente restituirà tutti i progetti a cui è associata una descrizione<br />

testuale contenente i termini “database” e “object relational” nella medesima<br />

frase.<br />

Il DB2 Text Extender di cui abbiamo parlato in precedenza supporta alcune delle<br />

caratteristiche introdotte dallo standard SQL3 che permettono di integrare ricerche<br />

testuali all’interno di statement SQL.<br />

Supponiamo di avere la seguente tabella:<br />

100


6 – Integrazione tra IR e database<br />

CREATE TABLE projects(<br />

project_no integer,<br />

title varchar(50),<br />

budget integer,<br />

description_id db2text)<br />

(dove il tipo db2texth è un tipo predefinito di Text Extender che serve per<br />

identificare in maniera univoca i vari documenti della collezione in esame) e<br />

riprendiamo in esame la query introdotta precedentemente, che risulta ora<br />

leggermente modificata poichè la tabella contiene un riferimento al testo, anzichè<br />

il testo vero e proprio; la query sarà:<br />

SELECT proj_no, title FROM projects<br />

WHERE contains (description_id, ‘”database” IN SAME<br />

SENTENCE AS “object relational”’)<br />

La figura seguente mostra l’architettura del modulo Text Extender per quel che<br />

riguarda l’interazione del motore di database con il motore di ricerca del testo:<br />

Figura 24 - Integrazione tra DB2 Engine e Text Search Engine<br />

Per ogni riga della tabella projects il motore DB2 richiama la funzione contains<br />

passandole come parametri l’identificatore della colonna contenente i riferimenti<br />

ai documenti ed il pattern da ricercare; in pratica la ricerca all’interno dei dati<br />

testuali viene eseguita soltanto una volta, durante la prima chiamata della<br />

101


6 – Integrazione tra IR e database<br />

funzione. Il motore di ricerca nel database testuale genera una lista di<br />

identificatori di documenti, l’UDF (user defined function) controlla se<br />

l’identificatore passatole dal motore del database è presente in tale lista e<br />

restituisce a questo il risultato opportuno (true o false). Basandosi sui risultati<br />

delle chiamate alla funzione, il DB engine costruisce quindi il set risultato della<br />

query. Questo modo di procedere ha però il grosso difetto che, comunque, bisogna<br />

effettuare una scansione completa sulla tabella dei progetti: sarebbe auspicabile<br />

invece che il set di identificatori recuperati dal text search engine diventasse una<br />

sorta di index lookup, in modo da evitare la scansione completa della tabella. Per<br />

fare questo bisogna definire una nuova UDF containing che, anzichè restituire un<br />

valore booleano, restituisca una tabella:<br />

CREATE FUNCTION containing(<br />

schema VARCHAR(10)<br />

table VARCHAR(10)<br />

column VARCHAR(10)<br />

searcharg LONG VARCHAR)<br />

RETURNS TABLE (resultid db2texth)<br />

Il risultato della chiamata della funzione sarà, come già detto, una tabella<br />

contenente i documenti per cui si ha un match con le condizioni di ricerca; la<br />

nuova query sarà quindi:<br />

SELECT proj_no, title FROM projects<br />

WHERE description_id IN<br />

(SELECT resultid FROM<br />

TABLE(containing(‘COMPSCHEMA’,’PROJECTS’,’DESCRIPTION_I<br />

D’,‘”database” IN SAME SENTENCE AS “object<br />

relational’))<br />

AS restab(resultid))<br />

Questa query produce il medesimo risultato di quella in cui si faceva uso<br />

dell’UDF contains, con la differenza che in questo secondo caso la funzione<br />

containing produce un set di identificatori che può essere usato come una qualsiasi<br />

tabella del database.<br />

102


6 – Integrazione tra IR e database<br />

Una forma alternativa per l’uso della funzione containing è quella usata nella<br />

seguente query, che utilizza un join anzichè una subquery:<br />

SELECT proj_no, title<br />

FROM<br />

projects,TABLE(containing(‘COMPSCHEMA’,’PROJECTS’,’DESC<br />

RIPTION_ID,‘”database” IN SAME SENTENCE AS “object<br />

relational”’)) AS restab(resultid)<br />

Il vantaggio significativo nell’uso di una funzione di tipo “tabella” quale la<br />

funzione containing sta nel fatto che gli identificatori che questa restituisce<br />

possono venire utilizzati dal motore del database per localizzare le tuple nella<br />

tabella dei progetti; gli indici del text engine vengono ora realmente sfruttati<br />

anche dal motore di database (ovviamente bisognerà definire un indice sulla<br />

colonna description_id al fine di permettere un lookup veloce): si ha quindi<br />

un’integrazione completa tra il DB engine ed il text search engine. E’ anche<br />

possibile istruire l’ottimizzatore del DBMS in modo che sostituisca, dove<br />

possibile, una funzione scalare con una equivalente che restituisca invece un set di<br />

record.<br />

6.3 Implementazione di un IRS come applicazione di<br />

un RDBMS<br />

Per poter effettuare delle ricerche full-text in un database relazionale in modo<br />

efficiente bisogna utilizzare una opportuna struttura di accesso ai dati. La struttura<br />

più comune è quella che fa uso di un inverted index: vedremo ora come<br />

quest’ultimo possa essere mappato in un database relazionale e come utilizzarlo<br />

per effettuare alcune operazioni di text retrieval. Di seguito presentiamo quale<br />

potrebbe essere lo schema logico di massima di un database in cui implementare<br />

un simile sistema :<br />

103


6 – Integrazione tra IR e database<br />

DOC (doc_id, doc_name, date)<br />

DOC_TERM (doc_id, term, tf)<br />

DOC_TERM_PROX (doc_id, term, offset)<br />

IDF (term, idf)<br />

QUERY (term, tf)<br />

STOP_TERMS (term)<br />

La tabella DOC contiene le informazioni strutturate riguardanti i documenti della<br />

collezione, DOC_TERMS invece viene usata per modellare l’inverted index: le<br />

tuple con lo stesso valore dell’attributo term corrispondono alla posting list<br />

dell’index term contenuto in tale attributo; la tabella QUERY, infine, contiene i<br />

termini presenti nella richiesta che viene sottomessa al sistema. Quelle appena<br />

viste sono le tabelle principali per realizzare il sistema, altre tabelle meno<br />

importanti sono DOC_TERM_PROX che è usata per ricerche di prossimità e IDF<br />

che contiene un peso assegnato ad ogni termine usato come index term (il peso<br />

usato, come suggerisce il nome, è l’Inverted Document Frequency, di cui si è già<br />

parlato). La tabella STOP_TERMS, infine, contiene i termini che compaiono<br />

troppo frequentemente nel testo e può essere usata in fase di preprocessing per<br />

eliminare questi ultimi dalle tabella DOC_TERM e DOC_TERM_PROX.<br />

E’ importante l’uso della tabella QUERY per contenere i termini presenti nella<br />

richiesta sottomessa al sistema; se non ci fosse, per implementare l’AND di n<br />

termini input_term_1, input_term_2, ..., input_term_n sarebbe necessaria una<br />

query come la seguente:<br />

SELECT d.doc_id FROM DOC_TERM WHERE term=input_term_1<br />

INTERSECT<br />

SELECT d.doc_id FROM DOC_TERM WHERE term=input_term_2<br />

INTERSECT<br />

....<br />

SELECT d.doc_id FROM DOC_TERM WHERE term=input_term_N<br />

Il problema di un tale statement è che la lunghezza della query cresce con il<br />

numero di termini da ricercare: alcuni sistemi in commercio limitano la lunghezza<br />

sintattica della query e quindi ne precluderebbero l’uso; si avrebbero inoltre dei<br />

104


6 – Integrazione tra IR e database<br />

problemi nel caso in cui le parole da ricercare fossero molto frequenti nel testo e<br />

quindi poco selettive: il tempo necessario per l’intersezione dei set restituiti dalle<br />

subquery potrebbe risultare molto alto, per cui il sistema avrebbe delle<br />

performance non accettabili.<br />

Utilizzando invece una tabella in cui si ha una tupla per ogni termine presente nel<br />

pattern da ricercare, si ottengono delle query la cui lunghezza sintattica è costante<br />

(in letteratura si parla di unchanged SQL); la seguente query, ad esempio, realizza<br />

una ricerca booleana con un AND di una serie di termini (che si suppone siano<br />

stati caricati nella tabella QUERY):<br />

SELECT d.doc_id FROM DOC_TERM d, QUERY q<br />

WHERE d.term=q.term<br />

GROUP BY d.doc_id<br />

HAVING COUNT(d.term)=(SELECT COUNT(*) FROM QUERY)<br />

La condizione WHERE elimina tutti i termini di DOC_TERM che non sono<br />

presenti in QUERY; per un documento di che contiene k termini (t1, t2, ...,tk) tra<br />

quelli presenti in QUERY, nel set risultante saranno presenti le seguenti tuple:<br />

doc_id term<br />

di<br />

di<br />

105<br />

t1<br />

t2<br />

... ...<br />

di<br />

Il GROUP BY partiziona il risultato in una serie di subset e la clausola HAVING<br />

elimina tutti i gruppi con una cardinalità diversa da quella di QUERY (= gruppi<br />

che non contengono tutti i termini presenti in QUERY). Affinchè il tutto funzioni<br />

bisogna ovviamente imporre che la tabella QUERY non contenga duplicati e che<br />

DOC_TERM non abbia termini duplicati per il medesimo documento .<br />

tk


6 – Integrazione tra IR e database<br />

Una richiesta in cui fosse presente un OR di una serie di termini può venire<br />

mappata eliminando la clausola HAVING dalla query precedente, mentre per un<br />

TAND (ossia un threshold AND, che restituisce i documenti contenenti almeno k<br />

dei termini specificati) la query è la seguente:<br />

SELECT d.doc_id FROM DOC_TERM d, QUERY q<br />

WHERE d.term=q.term<br />

GROUP BY d.doc_id HAVING COUNT(d.term) ≥ k<br />

Molti sistemi di IR forniscono la possibilità di eseguire delle ricerche basate su<br />

prossimità (proximity search); una proximity search restituisce tutti i documenti<br />

che contengono n termini specificati in una term window di dimensione width.<br />

Nel modello che abbiamo preso come esempio, per implementare delle proximity<br />

search si utilizza la relazione DOC_TERM_PROX che contiene, tra l’altro,<br />

l’offset di ogni index term rispetto all’inizio del documento in cui è presente:<br />

SELECT a.doc_id FROM DOC_TERM_PROX a, DOC_TERM_PROX b<br />

WHERE a.term IN (SELECT q.term FROM QUERY q) AND<br />

b.term IN (SELECT q.term FROM QUERY q) AND<br />

a.doc_id=b.doc_id AND<br />

(b.offset-a.offset) BETWEEN 0 AND (width-1)<br />

GROUP BY a.doc_id, a.term<br />

HAVING COUNT(b.term)=(SELECT COUNT(*) FROM QUERY)<br />

Finora abbiamo visto delle query che realizzavano delle ricerche di tipo booleano;<br />

supponiamo avere implementato un modello vector space e di voler effettuare un<br />

relevance ranking dei documenti: la query che utilizziamo deve fare riferimento<br />

anche alla tabella IDF, che contiene il valore dell’inverse document frequency per<br />

ogni index term:<br />

SELECT d.doc_id, SUM((q.tf*i.idf)*(d.tf*i.idf))<br />

FROM QUERY q, DOC_TERM d, IDF i<br />

WHERE q.term=i.term AND d.term=i.term<br />

GROUP BY d.doc_id<br />

ORDER BY 2 DESC<br />

106


6 – Integrazione tra IR e database<br />

Ricordiamo che nel modello vector space ogni documento o query viene<br />

rappresentato mediante un vettore contenente un peso per ogni index term<br />

presente nella collezione (ovviamente i termini che non sono presenti nel<br />

documento vengono rappresentati con peso 0). Uno dei metodi per effettuare un<br />

relevance ranking consiste nel calcolare la distanza cartesiana tra il vettore della<br />

query e quello di ogni documento. La query precedente calcola il prodotto scalare<br />

tra i vettori e ordina il set risultante in base a tale valore; si potrebbe però ordinare<br />

in base ad altre funzioni, come ad esempio il coefficiente di Dice o quello di<br />

Jaccard, entrambi già introdotti.<br />

Le implementazioni di questo tipo di sistema hanno dimostrato che le prestazioni<br />

sono influenzate pesantemente dalla selettività dei termini presenti nella query;<br />

nel caso tali termini siano sufficientemente selettivi si ottengono prestazioni<br />

equiparabili a quelle di sistemi di IR realizzati ad-hoc.<br />

Molti DB, oltre ai tipi di dati di base, permettono di memorizzare degli oggetti<br />

non strutturati chiamati BLOB (Binary Large OBject); una soluzione alternativa<br />

per implementare un inverted index mediante un database relazionale consiste nel<br />

memorizzare le posting list associate ai vari index term come oggetti BLOB. In<br />

pratica ogni BLOB viene visto come una bitlist in cui il bit i-esimo è settato se il<br />

documento i-esimo della collezione contiene l’index term in questione.<br />

L’inverted index verrà mappato mediante una tabella simile a quella che segue:<br />

INDEX TERM POSTING LIST<br />

INFORMATION 0001001...<br />

RETRIEVAL 0011000...<br />

SYSTEM 1000001...<br />

.... ....<br />

Un’ulteriore soluzione è quella proposta da Putz: nel suo modello l’inverted index<br />

viene implementato in maniera analoga alla precedente, ossia mediante una tabella<br />

che associa ad ogni index term la corrispondente posting list. Quest’ultima viene<br />

107


6 – Integrazione tra IR e database<br />

però implementata utilizzando dei campi di lunghezza fissa (nell’esempio<br />

presentato si utilizza un campo VARCHAR(255) su un database Sybase) anzichè<br />

lasciare la possibilità di avere campi di lunghezza arbitraria. Per ogni documento<br />

contenente l’index term viene riservata una certa “fetta” della posting list in cui<br />

memorizzare il proprio identificativo, più altri dati come ad esempio la frequenza<br />

del termine al proprio interno o l’offset di quest’ultimo rispetto all’inizio del testo.<br />

Man mano che si inseriscono nuove informazioni in una posting list, questa può<br />

diventare troppo lunga per essere contenuta in un singolo blocco: tale lista viene<br />

allora spezzata e vengono aggiunti nuovi record nel database. Poichè la maggior<br />

parte degli index term generalmente hanno una bassa frequenza nel testo, le<br />

posting list risultano essere in media relativamente corte e possono quindi essere<br />

contenute in una singola tupla; operativamente si è visto che circa il 5% dei<br />

termini richiedeva più righe per memorizzare la corrispondente posting list.<br />

Ovviamente questa soluzione richiede un’ulteriore fase di decodifica dei dati<br />

restituiti dalle query di ricerca in quanto, come detto, le informazioni presenti<br />

nelle posting list vengono codificate per ridurre l’occupazione di memoria.<br />

108


Capitolo 7<br />

Parallel information retrieval system<br />

Le applicazioni di document retrieval si prestano molto bene ad essere eseguite in<br />

un ambiente parallelo; ad esempio è possibile dividere la collezione in esame in<br />

una serie di porzioni che vengono esaminate indipendentemente in fase di ricerca,<br />

salvo provvedere poi ad un merge dei risultati parziali così ottenuti. In teoria, se si<br />

ottengono N sub-collezioni che vengono esaminate in contemporanea da N<br />

“lettori” diversi, la ricerca dovrebbe essere N volte più veloce rispetto ad un<br />

sistema di un solo processore. In realtà non è così perchè entrano in gioco una<br />

serie di fattori che rallentano le prestazioni di un tale sistema ideale:<br />

INTERFERENZA: rallentamento imposto da un processo a tutti gli altri<br />

durante l’accesso ad eventuali risorse condivise<br />

SBILANCIAMENTO DEL CARICO (data skewness): la durata<br />

complessiva di un lavoro suddiviso in passi eseguibili in parallelo è<br />

vincolata alla durata del passo più lento<br />

Bisogna poi tenere in considerazione la legge di Amdahl secondo cui lo speedup<br />

S(n), ossia il rapporto tra il tempo di esecuzione di un medesimo test in una<br />

macchina parallela con parallelismo n e su una macchina sequenziale, è dato da<br />

n<br />

S(<br />

n)<br />

=<br />

1+<br />

( n −1)<br />

* f<br />

dove f indica la frazione di istruzioni ad operazioni non parallelizzabili. Nel caso<br />

di un sistema con m=80 processori e circa il 20% delle operazioni che devono<br />

essere forzatamente essere eseguite in maniera sequenziale, si ottiene un valore di<br />

speedup che indica come il sistema parallelo arrivi ad essere solo circa 5 volte più<br />

veloce di quello sequenziale.<br />

109


7 – Parallel information retrieval system<br />

Un altro concetto che è opportuno introdurre perchè verrà ripreso più volte è<br />

quello logato alla differenza da sistemi di tipo MIMD e di tipo SIMD<br />

(classificazione di Flynn). Una macchina di tipo SIMD (Single Instruction stream,<br />

Multiple Data stream) consiste in un master controller ed una serie di processori<br />

slave; il master controller invia in broadcast un’istruzione a tutti gli slave in modo<br />

che questi possano eseguirla simultaneamente. Questo tipo di soluzione è adatta<br />

quando tutti i processori devono eseguire le medesime istruzioni su dati differenti.<br />

Una macchina di tipo MIMD (Multiple Instruction stream, Multiple Data stream)<br />

invece è costituita da più processori che possono anche eseguire programmi<br />

indipendenti; i vari processori comunicano sia attraverso una memoria condivisa,<br />

sia tramite il passaggio di messaggi. I sistemi di information retrieval vengono<br />

prevalentemente implementati su architetture di tipo MIMD perchè generalmente i<br />

vari nodi devono compiere operazioni diverse.<br />

Il primo esempio di sistema parallelo analizzato è quello costutuito dal progetto<br />

PADRE (PArallel Document Retrieval Engine), proposto da Hawking. Partendo<br />

da due assunzioni di base, ossia:<br />

1. una macchina parallela con un alto grado di parallelismo può operare<br />

sufficientemente veloce in full text scanning in modo da rendere non<br />

necessario l’uso di indici sul testo<br />

2. una buona percentuale delle collezioni tra quelle disponibili in formato<br />

elettronico hanno dimensioni tale da poter essere contenute nella memoria<br />

RAM di un discreto numero di calcolatori paralleli<br />

l’autore ha sviluppato un motore di ricerca su un sistema parallelo basato su<br />

metodi di full text scanning e in cui i documenti sono tutti contenuti nella RAM<br />

del sistema.<br />

Si utilizza un calcolatore Fujitsu AP1000, una macchina parallela a memoria<br />

distribuita con 1024 processori SPARC (chiamati celle), interconnessi mediante<br />

una rete broadcast a 50 Mbyte/sec; ogni cella è equipaggiata con 16 Mbyte di<br />

RAM, quindi il sistema ha una configurazione massima di 16 Gigabyte. Tutto<br />

l’I/O è controllato da una stazione front-end della SUN che viene chiamata host.<br />

110


7 – Parallel information retrieval system<br />

PADRE consiste di un “programma host” che viene replicato su ognuna delle<br />

celle dell’ AP1000; i programmi cella accettano dati e comandi dall’host,<br />

eseguono le operazioni sulle porzioni di dati che hanno in memoria, infine<br />

trasmettono i propri risultati parziali all’ host.<br />

Non viene fatto alcun riferimento all’algoritmo seguito per effettuare il ranking<br />

dei documenti; a tal proposito occorre dire che da più parti in letteratura si pone<br />

l’accento sul fatto che i sistemi paralleli vengono utilizzati dove i requisiti di<br />

efficiency sono molto rigidi (detto in altre parole: dove si vogliono tempi di<br />

risposta molto bassi), mentre si può accettare di avere un’effectiveness non<br />

ottimale.<br />

Come già accennato in precedenza, si cerca di avere un load balancing del<br />

sistema: il tempo che occorre per effettuare un full-text scanning nel sistema in<br />

esame coincide con il tempo impiegato dalla cella più lenta per esaminare la<br />

propria porzione di dati, e la cella più lenta sarà quella con la maggior quantità di<br />

teste da controllare. Il sistema prevede quindi una fase di load balancing in cui le<br />

varie celle comunicano a tutte le altre le dimensioni del proprio chunk di dati in<br />

modo che ognuna possa costruirsi una tabella contenente le dimensioni di tutte le<br />

porzioni di testo; tale tabella è ordinata per dimensione del chunk e la prima cella<br />

viene associata all’ultima, la seconda alla penultima, e così via. A questo punto le<br />

celle di ogni coppia negoziano sui documenti che eventualmente possono<br />

scambiarsi in modo da avere ognuna una quantità il più possibile simile di testo.<br />

La condizioni che un documento non possa venire suddiviso tra due celle fa sì che<br />

sia praticamente impossibile raggiungere un load balancing perfetto.<br />

Passiamo ora ad analizzare il progetto PFIRE (Parallel Full Information Retrieval<br />

Engine) sviluppato presso il Computer Technology Institute di Patrasso. Si tratta<br />

di un sistema basato sul vector space model ed implementato su un calcolatore<br />

Parsytec GCe13/512; si tratta di una macchina parallela di tipo MIMD costituita<br />

da 512 processori RISC a 30MHz, ognuno con una memoria locale di 4 MByte. I<br />

processori sono organizzati fisicamente in una rete interconnessa di dimensione<br />

32*16 (la terminologia adatta è 2D-mesh structured network), però è possibile<br />

111


7 – Parallel information retrieval system<br />

creare dei link virtuali tra i vari nodi della rete in modo da organizzare i processori<br />

in una struttura ad albero; una tale struttura è molto diffusa nei sistemi paralleli,<br />

poichè permette di parallelizzare in maniera efficiente la fase di calcolo e di<br />

mantenere basso il totale dei tempi di comunicazione poichè questi ventono<br />

distribuiti sui vari livelli dell’albero.<br />

L’algoritmo utilizzato per la ricerca si basa sulle seguenti assunzioni:<br />

1. ogni documento è rappresentato da un vettore di termini (Di); le query<br />

dell’utente sono rappresentate da un vettore di temini (qi) dello stesso tipo<br />

2. il retrieval task consiste nelle operazioni classiche di calcolo della<br />

similarità e ordinamento dei documenti in base a questa. La similarità<br />

viene valutata calcolando il prodotto scalare tra il vettore della query e<br />

quelli dei documenti<br />

3. uno dei processori (Ph) costituisce l’host processor, mentre P processori<br />

(Pi, i=1, ..., P) costituiscono i working processor; tra i working processor<br />

ce n’è uno particolare (Pir) che costituisce la radice dell’albero<br />

4. tutti i processori accedono ad uno spazio comune su disco contenente tutti<br />

i vettori dei documenti (D= numero totale di vettori)<br />

L’host processor ed i working processor eseguono algoritmi diversi:<br />

Host processor Ph<br />

1: Formula il query vector qi<br />

2: Invia qi al nodo radice Pir<br />

3: Attendi di ricevere il ranked set finale da Pir in<br />

RDh<br />

4: Presenta gli X documenti più rilevanti all’utente<br />

Working processor Pi, i=1,..., P=2 h -1<br />

(dove h=numero di livelli dell’albero di processori)<br />

1: IF (NOT(nodo radice)) THEN<br />

Ricevi il query vector qi dal nodo padre<br />

2: IF (NOT(nodo foglia)) THEN<br />

112


7 – Parallel information retrieval system<br />

Invia il query vector qi ai nodi figli<br />

3: Calcola il prodotto scalare tra qi ed i D/P<br />

document vector che gestisci<br />

4: Ordina il risultato nel set RDi (considerando solo<br />

gli X documenti più rilevanti)<br />

5: IF (NOT(nodo foglia)) THEN<br />

5.1: Ricevi i set RD da ognuno dei nodi figli<br />

5.2: Esegui il merge dei set ricevuti nel set RDi<br />

locale(mantenendo solo gli X documenti più<br />

rilevanti)<br />

6: IF (NOT(nodo radice)) THEN<br />

Invia il set RDi locale al nodo padre<br />

ELSE<br />

Invia il set RDi locale all’host processor<br />

Ogni node processor invia il vettore della query qi ai propri figli, fichè qi non<br />

arriva ai processori foglia; a questo punto i processori foglia calcolano la<br />

similarità tra qi ed i propri D/P vettori di documenti e generano una tabella RD<br />

con il risultato parziale. A questo punto si esegue progressivamente il merge dei<br />

risultati attraverso i vari livelli dell’albero: ogni node processor riceve i set RD<br />

dai propri nodi figli e li fonde nel proprio set RD che viene trasmesso al modo<br />

padre; si ripete questo passo per ogni livello fino a che non si raggiunge il nodo<br />

radice in cui verrà costruito il ranking set definitivo.<br />

Figura 25 - Esecuzione dell'algoritmo lungo i nodi dell'albero<br />

Vediamo ora il progetto PANDORA (PArallel DOcumentation Retrieval<br />

Architecture) proposto da Kopesky; il prototipo è stato implementato su un<br />

calcolatore parallelo CRAY T3D, un sistema MIMD con 2048 processori; si è<br />

lavorato sulla gestione parallela dell’inverted index di una collezione.<br />

113


7 – Parallel information retrieval system<br />

Figura 26 - Architettura del sistema PANDORA<br />

Molto brevemente, i processori sono stati suddivisi un tre classi: query node, index<br />

node e score node.<br />

QUERY NODE: sono i nodi responsabili dell’interazione con l’utente,<br />

nel senso che comunicano con l’interfaccia utente, ricevono un input le<br />

query di ricerca e comunicano i ranked set ottenuti dall’elaborazione.<br />

Oltre a questo trasmettono agli index node gli index term della query<br />

per cui i vari index node sono responsabili (più altre informazioni che<br />

potrebbero essere loro utili, come ad esempio i pesi assegnati ai vary<br />

query term)<br />

114


7 – Parallel information retrieval system<br />

INDEX NODE: ogni index node è responsabile di una porzione<br />

dell’inverted index; accetta dai query node una lista di keyword<br />

appartenenti alla propria porzione, accede all’inverted index e<br />

restituisce le informazioni contenute nelle posting list allo score node<br />

responsabile di ogni documento della posting list<br />

SCORE NODE: ogni score node è responsabile per uno specifico set<br />

di documenti; riceve in input dagli index node le informazioni<br />

contenute nelle posting list ed esegue l’ordinamento del subset di<br />

documenti su cui ha visibilità. Gli score node, infine, cooperano con i<br />

query node per effettuare il merge dei risultati parziali ottenuti in modo<br />

da avere un ranking sull’intera collezione.<br />

L’ultimo sistema che citiamo è quello proposto da Pamegopoulos e Faloutsos per<br />

implementare un bit-sliced sigmature file su una macchina parallela di tipo SIMD;<br />

nel loro studio si ipotizza che il sistema non abbia memoria sufficiente per<br />

mantenere tutte le bit slice e si propone come soluzione un algoritmo di swapping<br />

chiamato partial fetch. Purtroppo anche in questo caso non viene fatto alcun<br />

cenno all’algoritmo di ricerca vero e proprio; dalle varia bibliografie che abbiamo<br />

esaminato pare che una delle massime autorità in questo campo sia Craig Stanfill<br />

della Thinking Machines Corporation, purtroppo però non è stato possibile<br />

recuperare nessuno dei suoi articoli.<br />

115


Capitolo 8<br />

Information retrieval e Web<br />

Con l’enorme crescita di internet, sempre più informazioni sono disponibili sul<br />

web: la ricerca di informazioni è una delle attività più comuni tra gli utenti della<br />

rete, ma anche una delle più frustranti.<br />

Le tecniche di ricerca tradizionali, basate sulla ricerca full text delle keyword<br />

richieste all’interno delle pagine web, solitamente restituiscono troppi documenti,<br />

di questi solo una piccola parte risulta essere rilevante per le necessità dell’utente<br />

e spesso i documenti rilevanti non compaiono in cima alla lista presentata.<br />

Gli algoritmi di retrieval e di ranking tradizionali, infatti, sono stati sviluppati per<br />

collezioni isolate (e il più delle volte statiche) e non è detto che siano adatti alle<br />

applicazioni su internet.<br />

Due delle maggiori differenze tra i metodi di retrieval classici e quelli basati sul<br />

web sono il numero di utenti che possono accedere simultaneamente agli<br />

strumenti di ricerca ed il numero di documenti a cui si deve poter accedere;<br />

entrambi infatti superano di diversi ordini di grandezza i valori associati alle<br />

applicazioni di IR tradizionali, ed entrambi crescono a ritmi impressionanti.<br />

Inoltre i sistemi di web information retrieval lavorano con dati completamente<br />

diversi da quelli delle collezioni tradizionali; le differenze possono essere<br />

riassunte nei seguenti punti:<br />

dimensione: secondo stime il numero di pagine sul web ad Aprile del 2001<br />

si aggirava sui 4 miliardi; di queste i motori di ricerca ne coprono circa il<br />

15% (Google, ad esempio costruisce i propri indici in 560 milioni di<br />

pagine)<br />

cescita continua: come già detto, il numero di pagine e documenti<br />

disponibili in rete cresce continuamente, mentre i metodi di IR tradizionali<br />

erano rivolti a collezioni statiche<br />

116


8 – Information retrieval e Web<br />

eterogeneità: il web contiene una grande varietà di tipi di dati, documenti<br />

testuali, immagini, audio, video, ecc...<br />

varietà di linguaggi: più di 100 linguaggi usati<br />

dati duplicati: si stima che circa il 30% delle pagine web siano duplicate<br />

documenti collegati tra loro: ogni documento ha in media 8 link verso altre<br />

pagine<br />

Altre particolarità importanti dei sistemi di web information retrieval che devono<br />

essere tenute in considerazione sono:<br />

formato delle query: da uno studio esegiuto da Jamsen e Pooch sui log di<br />

alcuni tra i motori di ricerca più importanti si è visto che le query<br />

sottoposte sono generalmente molto brevi (più del 50% delle query sono<br />

sostituite da uno o due termini nel caso di Altavista)<br />

comportamenti particolari: si stima che quasi l’85% degli utenti controlli<br />

soltanto la prima schermata degli elenchi restituiti dai motori di ricerca; il<br />

78% invece non esegue una seconda ricerca modificando la prima query<br />

dopo aver verificato il set restituito<br />

Sono state proposte diverse misure per valutare i sistemi di information retrieval<br />

classici, molte delle quali possono essere estere anche ai web search engine; gli<br />

utenti del web però tendono a dare molta importanza ad alcune caratteristiche che<br />

non erano di primissimo piano nei sistemi tradizionali: l’aspetto più importante è<br />

un response time basso, seguito dall’abilità di presentare il maggior numero di siti<br />

altamente rilevanti nella prima videata dell’elenco, in modo da non doversi<br />

muovere tra le pagine per trovare il risultato cercato.<br />

Faremo ora un rapido accenno ad alcune tra le tecniche di web searcing che sono<br />

state proposte e vedremo poi come vengono applicate in pratica in uno dei motori<br />

di ricerca disponibili in rete.<br />

117


8.1 Indexing<br />

8 – Information retrieval e Web<br />

Qui per indexing si intende il provesso di costruzione di una struttura dati che<br />

permetta di velocizzare la ricerca dei dati richiesti dall’utente.<br />

I servizi di web searching che vengono messi a disposizione degli utenti della rete<br />

si dividono in due grandi categorie:<br />

1. i motori di ricerca propriamente detti (genuine searchengine in letteratura),<br />

che creano automaticamente i propri indici (Altavista, Excite, Google per<br />

citarne alcuni)<br />

2. i directory le cui liste vengono compilate ed organizzate dall’uomo (il più<br />

famoso directory è sicuramente Yahoo). Questa pratica avrà, secondo gli<br />

esperti, sempre meno successo con l’andare del tempo a causa della<br />

velocità con cui cresce il numero di pagine sul web e quindi<br />

all’impossibilità da parte degli operatori di effettuare un’analisi e una<br />

classificazione accettabile dei dati disponibili. Questo tipo di approccio è<br />

oggetto di molte discussioni: da una parte c’è che mette in evidenza la<br />

diversità con cui gli indexer organizzano le informazioni recuperate (si è<br />

visto che meno del 20% delle informazioni vengono trattate nello stesso<br />

modo); dall’altra c’è che fa notare che, se confrontati con liste create<br />

automaticamente, i directory facilitano molto il processo di ricerca perchè<br />

gli indexer umani selezionano con molta più cura le informazioni. Diverso<br />

è anche il formato con cui questi sistemi presentano le informazioni<br />

all’utente: i siti vengono infatti divisi in varie categorie, organizzati in un<br />

modo simile alle comuni “pagine gialle”.<br />

Non mancano poi i sistemi ibridi, costituiti da entrambe le parti.<br />

Un ulteriore approccio molto trattato in letteratura è quello che fa uso dei<br />

cosiddetti web querying language: si utilizzano delle query con degli operatori<br />

118


8 – Information retrieval e Web<br />

che permettono di selezionare singole URL o gruppi di queste per ridurre il<br />

dominio della ricerca; potenzialmente offrono buoni risultati ma sono molto<br />

complessi, ragione per cui il loro utilizzo, almeno su larga scala, è ancora oggi<br />

quasi nullo.<br />

8.2 Crawler/robot<br />

Un crawler è un programma che restituisce delle pagine web, tipicamente per<br />

essere utilizzate da un motore di ricerca (per la costruzione automatica di un<br />

indice); in letteratura questi processi vengono chiamati in diversi modi: il termine<br />

più comune è crawler, ma si può trovare anche bot, robot, spider e worm.<br />

In pratica esso parte da una pagina iniziale P0, estrae tutti gli URL a cui si fa<br />

riferimento in tale pagina e li inserisce in un’apposita coda di indirizzi da<br />

controllare. Il crawler quindi recupera gli URL dalla coda, accede alle pagine e<br />

ripete il processo; ogni pagina controllata viene inviata ad un processo client che<br />

la salva, crea un indice o ne analizza il contenuto.<br />

A meno che disponga di risorse illimitate per quel che riguarda lo spazio su disco<br />

e il CPU time, un crawler deve decidere a quali URL accedere ed in quale ordine,<br />

in modo da recuperare le pagine web più importanti; deve inoltre decidere quanto<br />

frequentemente rivisitare una determinata pagina in modo da mantenere il<br />

processo client aggiornato sui cambiamenti apportati.<br />

Come già detto non tutte le pagine sono ugualmente importanti per il client<br />

associato al crawler: Cho, Garcia-Molina e Page presentano una serie di parametri<br />

che possono essere utilizzati da un crawler per scegliere quali URL visitare prima.<br />

Data una pagina P, è possibile definire l’importanza della pagina, I (P), in uno dei<br />

seguenti modi:<br />

Similarità con una query guida Q (similarità calcolata con uno dei metodi<br />

tradizionali visti precedentemente)<br />

119


8 – Information retrieval e Web<br />

Backlink Count: il valore di I(P) è dato dal numero di link verso P che<br />

compaiono nel web; intuitivamente, una pagina è tanto più importante<br />

quante più pagine fanno riferimento ad essa. Ovviamente è impossibile<br />

effettuare un calcolo su tutto il web, per cui ci si basa sul subset visitato<br />

fino a quel punto<br />

PageRank: il metodo precedente tratta tutti i link nello stesso modo, così<br />

un link sulla home page di Yahoo ha lo stesso peso di uno sulla mia home<br />

page personale. L’algoritmo pagerRank definisce in maniera ricorsiva il<br />

peso dei link di una pagina come la somma dei pesi dei link che puntano a<br />

quest’ultimo. Vedremo più avanti nel dettaglio questo algoritmo.<br />

Location metric: questa tecnica calcola l’importanza di una pagina in base<br />

al suo URL, anzichè in base al contenuto. Ad esempio si dà la precedenza<br />

alle locazioni che terminano con “.com” oppure a quelle che contengono la<br />

stringa “home”, e così via.<br />

Ovviamente, anche quì è possibile avere delle combinazioni pesate dei vari valori.<br />

8.3 Clustering<br />

Abbiamo già visto che il clustering consiste nel raggruppare i documenti simili<br />

per velocizzare le operazioni di information retrieval; i maggiori motori di ricerca<br />

utilizzano tecniche di clustering, anche se non sono noti, come è facile capire, gli<br />

algoritmi seguiti per raggruppare i documenti.<br />

Zamir, Etzione, Madani, Karp hanno proposto tre algoritmi di clustering per<br />

documenti e pagine del web; il primo viene detto word-intersection clustering<br />

method e raggruppa i vari documenti in base alle parole condivise da questi,<br />

creando un centroide costituito dall’insieme dei termini comuni.<br />

Il secondo metodo proposto è il phrase-intersection clustering method: trattando i<br />

documenti semplicemente come delle sequenze di parole si possono perdere delle<br />

informazioni importanti legate alle occorrenze di determinate frasi, quindi in<br />

120


8 – Information retrieval e Web<br />

questo approccio le unità atomiche di informazione sono le le frasi e quelle<br />

comuni ai documenti sono usate come indice per valutare la loro coesione.<br />

Un terzo algoritmo è il suffix-tree clustering algorithm: esso si basa<br />

fondamentalmente sul medesimo concetto del precedente, ma fa uso di una<br />

struttura dati particolare (un suffix-tree per l’appunto) che permette di ridurre la<br />

complessità e con essa il tempo di esecuzione dell’algoritmo.<br />

Modha e Spangler, infine, hanno proposto un’algoritmo di clustering che è basato<br />

sui termini contenuti nei documenti, sugli outlink che partono da questi e sugli inlink<br />

entranti.<br />

8.4 Metasearch navigator<br />

Come abbiamo già accennato in precedenza, nessuno dei motori di ricerca<br />

disponibili è in grado di coprire interamente il web, per cui utilizzando un motore<br />

piuttosto che un altro si rischia di non poter accedere a delle informazioni<br />

importanti. I metasearch engine inviano le query che hanno in input ad una serie<br />

di motori di ricerca, analizzano e combinano le risposte di questi ultimi e<br />

presentano all’utente il risultato di questa integrazione. Ovviamente la maggiore<br />

copertura del web va a scapito della velocità di risposta.<br />

Figura 27 - Metasearch engine<br />

121


8 – Information retrieval e Web<br />

Come si vede dalla figura , un metasearch engine è composto da tre componenti<br />

principali:<br />

DISPATCH: determina a quale o quali motori di ricerca deve essere<br />

inviata una determinata query<br />

INTERFACE: adatta il formato della query utente a quello richiesto dai<br />

singoli motori<br />

DISPLAY: analizza i risultati parziali di ogni singolo motore e li integra<br />

per presentarli poi all’utente.<br />

8.5 Ranking algorithm<br />

In letteratura non sono disponibili informazioni dettagliate riguardo agli algoritmi<br />

di ranking utilizzati dai maggiori motori di ricerca, anche se molti studiosi<br />

concordano nell’affermare che l’approccio più usato consiste nell’utilizzare il<br />

modello vector space opportunamente modificato, magari in collaborazione con<br />

tecniche di latent semantic indexing per ridurre il numero di dimensioni dello<br />

spazio vettoriale.<br />

Tutti gli algoritmi, comunque, sembrano basarsi pesantemente su una peculiarità<br />

dei documenti presenti sul web, ossia la presenza di link tra le varie pagine. Una<br />

base teorica per questo appoggio si può trovare nell’articolo di Kleinberg: l’autore<br />

parte dalla considerazione che i motori di ricerca soffrono del cosiddetto<br />

abundance problem, ossia restituiscono agli utenti un numero di pagine troppo<br />

alto perchè questi riescano a valutarle in modo efficiente e, soprattutto, veloce.<br />

Perchè le ricerche siano veramente efficaci, bisognerebbe riuscire a filtrare un<br />

piccolo set di pagine effettivamente importanti: quelle che l’autore chiama<br />

authoritative o definitive pages. Per fare questo bisognerebbe essere in grado di<br />

valutare la qualità delle varie pagine: questo però è un concetto umano e non è<br />

possibile tradurlo in una funzione matematica. A questo punto l’autore fa notare<br />

che, analizzando i link ed i collegamenti tra le varie pagine è possibile estrarre una<br />

122


8 – Information retrieval e Web<br />

qualche valutazione riguardo al giudizio degli utenti della rete rispetto ad una<br />

determinata pagina: in poche parole, se esiste un numero molto alto di pagine che<br />

puntano ad una certa pagina P, allora è probabile che P sia considerata molto<br />

interessante ed il suo contenuto significativo; gli autori di tali pagine hanno<br />

implicitamente conferito “autorità” a P. Ovviamente questo approccio presenta<br />

una serie di controindicazioni in quanto i link possono essere creati per una lunga<br />

serie di ragioni, molte delle quali hanno poco o nulla a che fare con il concetto di<br />

authority: molti link ad esempio vengono utilizzati unicamente per aiutare la<br />

navigazione (“Click here to return to the home page”, “Back”, ecc.). A<br />

prescindere da queste controindicazioni, questo approccio è stato considerato<br />

molto interessante e oggi gli algoritmi di link analysis, assieme alle tecniche<br />

tradizionali di IR, costituiscono la base per numerosi motori di ricerca.<br />

Vediamo ora due dei più importanti algoritmi utilizzati per l’analisi dei link.<br />

8.5.1 Algoritmo PageRank<br />

Questo algoritmo è stato proposto da Brin e Page e viene utilizzato da Google. Si<br />

basa fondamentalmente sul conteggio dei backlink verso le pagine, però estende<br />

questa tecnica in quanto non assegna lo stesso valore a tutti i link: il valore di un<br />

link dipende dall’importanza della pagina da cui parte e dal numero di link che<br />

sono presenti in tale pagina; si tratta quindi di un algoritmo recursivo.<br />

L’algoritmo è basato sulla seguente definizione:<br />

Si assuma che la pagina A abbia n pagine T1, ..., Tn che puntano ad essa.<br />

C(A) sia definito come il numero di link che partono dalla pagina A.<br />

Il valore di PageRank per la pagina A è dato da:<br />

⎡ PR(<br />

T<br />

⎤<br />

1)<br />

PR(<br />

Tn<br />

)<br />

PR ( A)<br />

= ( 1−<br />

d)<br />

+ d ⎢ + ... + ⎥<br />

⎣ C(<br />

T1)<br />

C(<br />

Tn<br />

) ⎦<br />

I valori di PageRank vengono calcolati usando tecniche di tipo matriciale in cui si<br />

costruisce una matrice dei link presenti tra le pagine web che costituiscono il<br />

repository su cui si lavora; gli autori fanno notare che i valori di PageRank per un<br />

set di 25 milioni di pagine possono venire calcolati in poche ore su una<br />

123


8 – Information retrieval e Web<br />

workstation di media potenza (ovviamente il calcolo di tali valori viene eseguito<br />

off-line). Si tratta di valori generali: non sono riferiti ad una specifica query, ma<br />

all’importanza delle varie pagine in base ai link esistenti. La giustificazione<br />

intuitiva degli autori è che questo algoritmo può essere visto come un modello del<br />

comportamento di un certo utente ideale che naviga il web; si suppone infatti di<br />

avere un “random surfer” che parte da una pagina a caso e, cliccando sui vari link,<br />

naviga tra le pagine del web. Tale utente non esegue mai un “back” sulla pagina<br />

precedente, ma ad un certo punto può stufarsi e ricominciare nuovamente la<br />

navigazione da una pagina a caso (il parametro d è proprio la probabilitò che il<br />

random surfer si annoi e richieda una nuova starting page casuale); la probabilità<br />

che un utente visiti una determinata pagina è proprio il valore di PageRank di<br />

quest’ultima.<br />

8.5.2 Algoritmo HITS<br />

Questo algoritmo è stato proposto da Kleinberg e, a differenza del precedente,<br />

calcola l’importanza delle varie pagine rispetto a una specifica query di ricerca;<br />

data una query, HITS dovrebbe individuare le pagine le pagine il cui contenuto è<br />

rilevante per la query (definite authority) e le pagine contenenti dei link utili<br />

rispetto alla richiesta della query (definite hub).<br />

Prima di applicare l’algoritmo vero e proprio, bisogna decidere su quale set di<br />

pagine tale algoritmo lavorerà; idealmente si vorrebbe una collezione Sσ di pagine<br />

con le seguenti proprietà:<br />

1. Sσ relativamente piccolo<br />

2. Sσ ricco di pagine rilevanti<br />

3. Sσ contenente molte authority<br />

L’autore suggerisce la seguente soluzione per determinare la collezione iniziale di<br />

pagine: dato un parametro t (si è visto che i risultati migliori si ottengono con<br />

t≈200), si prendono le t pagine con il più alto rank che vengono restituite da un<br />

qualsiasi motore di ricerca in risposta alla query di riferimento σ. Tali pagine<br />

124


8 – Information retrieval e Web<br />

vengono indicate come root set Rσ; si procede quindi ad aumentare il numero di<br />

presunte authority nel sottografo espandendo Rσ in base ai link entranti ed<br />

uscenti, utilizzando il seguente algoritmo:<br />

Subgraph(σ,ε,t,d)<br />

σ: query string<br />

ε: text-based search engine<br />

t,d: natural numbers<br />

Let Rσ=top t results of σ on ε<br />

Set Sσ:=Rσ<br />

For each page p ∈ Rσ<br />

Let Γ + (p)=set of all pages p points to<br />

Let Γ – (p)=set of all pages pointing to p<br />

Add pages in Γ + (p) to Sσ<br />

If |Γ - (p)| ≤d then<br />

Add pages in Γ - (p) to Sσ<br />

Else<br />

Add an arbitrary set of d pages from Γ - (p) to<br />

Sσ<br />

End if<br />

Next p<br />

Return Sσ<br />

Possiamo utilizzare un’euristica per evitare di considerare i link che servono<br />

soltanto per funzioni di navigazione; allo scopo bisogna distinguere tra due tipi di<br />

link: i link transverse sono quelli tra pagine con lnomi di dominio diversi, mentre<br />

quelli intrinsic sono quelli tra pagine con lo stesso nome di dominio (per nome del<br />

dominio si intende il primo livello nell’URL associato alla pagina). Gli intrinsic<br />

link spesso svolgono puramente funzioni di navigazione all’interno di un sito, per<br />

cui portano molte meno informazioni dei transvere link per quel che riguarda<br />

l’authority delle pagine: tali link possono quindi venire ignorati quando si espande<br />

il sub-grafo Rσ.<br />

HITS associa ad ogni pagina due pesi: un authority weight x ed un hup weight<br />

y ; entrambi i pesi sono non negativi e sono normalizzati, così che la somma dei<br />

loro quadrati sul subset Sσ vale 1:<br />

125


8 – Information retrieval e Web<br />

∑<br />

p∈S<br />

∑<br />

p∈S<br />

σ<br />

σ<br />

< p><br />

2<br />

( x ) = 1<br />

< p><br />

2<br />

( y ) = 1<br />

I due pesi si rafforzano mutuamente: se p punta a tante pagine con dei valori di x<br />

alti, avrà un valore di y alto; se p viene referenziata da tante pagine con dei buoni<br />

valori di y, avrà un valore alto di x.<br />

Figura 28 - Calcolo dei pesi con l'algoritmo HITS<br />

Vengono ora definite le due operazioni fondamentali sui pesi delle pagine:<br />

l’operazione α aggiorna i pesi x nel modo seguente:<br />

x<br />

∑ < p><br />

< q><br />

← y<br />

p:<br />

∈E<br />

126<br />

( p,<br />

q)<br />

mentre l’operazione β esegue l’aggiornamento dei pesi y:<br />

y<br />

∑ < p><br />

< q><br />

← x<br />

p:<br />

∈E<br />

( p,<br />

q)


8 – Information retrieval e Web<br />

Vediamo ora l’algoritmo per calcolare i vari pesi; si rappresenta il set dei valori<br />

x come un vettore X avente una coordinata per ogni pagina della collezione in<br />

esame Gσ, analogamente si rappresenta il set dei valori y come un vettore Y:<br />

Iterate(G,k)<br />

G: collection of n linked pages<br />

k: natural number<br />

Let Z=the vector (1,1,1,...,1) ∈R n<br />

Set X0:=Z<br />

Set Y0:=Z<br />

For i=1,2,...,k<br />

Apply α to (Xi-1,Yi-1), obtaining new x-weights<br />

Xi’<br />

Apply β to (Xi’,yi-1), obtaining new y-weights Yi’<br />

Normalize Xi’, obtaining Xi<br />

Normalize Yi’, obtaining Yi<br />

Next i<br />

Return (Xk,Yk)<br />

8.6 Direzioni di ricerca future<br />

Alcuni studiosi hanno proposto alcune idee piuttosto innovative per migliorare le<br />

qualità delle ricerche delle pagine sul web; si tratta di progetti che affrontano<br />

problemi completamente diversi dai metodi tradizionali di IR:<br />

Lawrence propone un client based personalized search service che tenga<br />

traccia dei documenti creati o visionati dall’utente e che crei un vero e<br />

proprio modello degli interessi di quest’ultimo. Basandosi su un tale<br />

profilo i client potrebbero modificare le query dell’utente o selezionare un<br />

particolare motore di ricerca specializzato, o ancora modificare<br />

l’ordinamento delle pagine restituite. Tutto questo richiederebbe<br />

ovviamente una grande quantità di risorse per mantenere il profilo dei vari<br />

utenti (oltre a dover affrontare infiniti problemi legati alla privacy):<br />

l’autore fa notare che l’evoluzione dei sistemi potrebbe rendere possibile<br />

127


8 – Information retrieval e Web<br />

l’implementazione di server di ricerca su larga scala personalizzati entro<br />

breve tempo. In tal modo verrà superato il concetto su cui si basano oggi i<br />

motori di ricerca:”one size fits all”, tutti gli utenti ricevono la medesima<br />

risposta a fronte di una stessa query.<br />

Questi sistemi non esistono solo sulla carta: alcune compagnie infatti<br />

iniziano a dedicare delle risorse per mantenere informazioni sul profilo dei<br />

propri utenti da utilizzare in fase di ricerca (DriveWay,<br />

www.driveway.com oppure Xdrive, www.xdrive.com).<br />

Lawrence e Giles propongono un modello di motore di ricerca che sia in<br />

grado di riconoscere le query espresse in forma generica e di trasformarle<br />

in una forma che possa incrementare il valore di precision della ricerca.<br />

Ad esempio “What does NASDAQ stand for ?” potrebbe venire<br />

trasformata in “NASDAQ is the acronym for”; in pratica un tale motore<br />

dovrebbe convertire le query nella loro specific expressive form, ossia<br />

nella forma più espressiva ai fini della ricerca<br />

Zhu e Gauch introducono il concetto di qualità delle pagine web e<br />

propongono un approccio che combini le metodologie di ranking<br />

tradizionali con dei metodi di quality ranking. I valori che vengono<br />

proposti per misurare la qualità delle pagine sono:<br />

1. currency: indica il tempo trascorso dall’ultima modifica della<br />

pagina<br />

2. availability: calcolata come il numero di link interrotti nella<br />

pagina, diviso per il numero totale di link che questa contiene<br />

3. information-to-noise ratio: rapporto tra il numero di index term<br />

ottenuti nella pagina dopo una fase di preprocessing e la lunghezza<br />

totale della pagina<br />

4. authority: autorità di una pagina, basata sul servizio Yahoo Internet<br />

Life (YIL) di ZDNet (www.zdnet.com/yil). Tale servizio assegna<br />

un punteggio da 2 a 4 ai siti che analizza; se un sito non è ancora<br />

stato analizzato gli viene assegnato come punteggio 0<br />

128


8 – Information retrieval e Web<br />

5. popularity: il numero di link che puntano ad una pagina web è<br />

indice della popolarità di quest’ultima. Una tale informazione è<br />

recuperabile, ad esempio, dal sito Altavista<br />

6. cohesiveness: viene definita un’euristica per individuare gli<br />

argomenti più importanti in una pagina e per determinare quanto<br />

siano correlati tra di loro.<br />

8.7 Architettura di un motore di ricerca<br />

In questa parte viene presentato un possibile modello di un sistema per la<br />

costruzione e la gestione di un inverted index per il web, assieme ai problemi che<br />

si devono affrontare e ad alcune possibili soluzioni. Infine verrano presentate<br />

l’architettura ed il funzionamento di Google, uno dei motori di ricerca più<br />

utilizzati sul web.<br />

Come anche per i sistemi di IR, gli inverted index sono la struttura dati più usata<br />

dai motori di ricerca; anche se si sta diffondendo la tendenza ad utilizzare la<br />

struttura dei link tra le varie pagine e la loro analisi semantica per produrre<br />

risultati di alta qualità per le ricerche on-line, le tecniche di retrieval text-based<br />

restano il metodo principale per identificare le pagine rilevanti a fronte di una<br />

query dell’utente: in molti motori di ricerca viene infatti utilizzata una<br />

combinazione di metodi text-based e link-based. I searchengine solitamente<br />

utilizzano delle custom network architecture e dell’hardware ad alte performance<br />

per rispondere alle query in tempi dell’ordine di pochi secondi.<br />

Si può quindi modellare un sistema di indexing per un motore di ricerca come<br />

un’architettura shared-nothing distribuita, costituita da una collezione di nodi<br />

(workstation) collegati da una rete locale:<br />

129


8 – Information retrieval e Web<br />

Figura 29 - Architettura di un sistema per la costruzione di un inverted index<br />

In questo sistema si possono identificare tre tipi di nodi:<br />

DISTRIBUTOR: questi nodi memorizzano sui propri dischi la collezione<br />

di pagine web che devono essere indicizzate<br />

INDEXER: nodi dedicati alla costruzione dell’inverted index<br />

QUERY SERVER: ognuno di questi nodi memorizza una parte<br />

dell’inverted index finale; a seconda dell’organizzazione di tale indice,<br />

uno o più di questi server possono venire coinvolti nella risposta ad una<br />

determinata query di ricerca.<br />

L’input per il sistema di indexing è una collezione di pagine web che vengono<br />

memorizzate sui nodi distributor; in output viene prodotto un set di coppie<br />

(inverted index, lexicon), uno per ogni query server. L’inverted index su un query<br />

server copre un subset dei documenti della collezione oppure un subset degli<br />

index term considerati, mentre il lexicon elenca tutti gli index term presenti<br />

nell’indice associato, oltre ai dati statistici che vengono usati per il ranking.<br />

L’indice viene costruito in due passi, nel primo passo ogni distributor node esegue<br />

un distributor process che suddivide la collezione di pagine web tra i vari indexer;<br />

ogni indexer riceve un subset di pagine disgiunto dagli altri, esegue un parsing del<br />

130


8 – Information retrieval e Web<br />

testo, costruisce le posting list per i vari termini, le ordina e le memorizza in una<br />

struttura temporanea su disco. Nel secondo passo queste strutture temporanee<br />

vengono unite e riordinate per creare uno o più inverted index con il relativo<br />

lexicon. Ogni coppia (inverted index, lexicon) può anche essere memorizzata in<br />

più query server, nel caso si voglia avere una replica delle strutture dati.<br />

In un sistema distribuito ci sono due possibili strategie per distribuire un inverted<br />

index tra più query server:<br />

partizionare la collezione di documenti in modo che ogni query server sia<br />

responsabile di un set di documenti disgiunto dagli altri (solitamente si<br />

parla di local inverted index)<br />

partizionare l’inverted index in modo che oqni query server contenga le<br />

posting list di un subset degli index term presenti nella collezione (in<br />

questo caso si parla di global inverted index)<br />

Gli inverted index possono essere memorizzati e manipolati utilizzando strutture<br />

dati create ad hoc, oppure usando i database relazionali o ad oggetti offerti dal<br />

mercato. Il vantaggio di un’implementazione di tipo custom è che permette di<br />

realizzare un sistema fortemente ottimizzato (es. caching delle posting list usate<br />

più di frequente, compressione di quelle usate raramente in modo da ottimizzare<br />

lo spazio, anche a scapito delle performance, ecc.); se si utilizzano sistemi di tipo<br />

commerciale non è possibile avere un controllo così spinto, ma si ha il vantaggio<br />

di ridurre la complessità del sistema ed i tempi di sviluppo.<br />

Vediamo ora alcuni problemi che devono essere affrontati quando si costruisce<br />

un inverted index su un’architettura distribuita:<br />

1. page distribution: quando e come distribuire le pagine agli indexing node<br />

2. collecting global statistic: quando, come e dove calcolare le statistiche<br />

generali sull’intera collezione in esame.<br />

131


8 – Information retrieval e Web<br />

Page distribution. Molto spesso la collezione di pagine web si trova su un set di<br />

nodi disgiunto dai nodi usati per l’indexing; ci sono due strategie per far<br />

comunicare i nodi distributor e gli indexer:<br />

1. distribuzione a priori: tutte le pagine vengono trasferite dai distributor agli<br />

indexer prima che inizi la fase di indexing. Durante l’indexing, il processo<br />

che funge da index-builder riceve le pagine dal disco locale anzichè dalla<br />

rete<br />

2. distribuzione runtime: in questa strategia la distribuzione della collezione<br />

avviene in concorrenza con l’index-building. Il processo index-builder<br />

opera quindi sulle pagine non appena queste arrivano attraverso la rete dai<br />

distributor.<br />

Con la distribuzione runtime è possibile realizzare una sorta di load balancing dei<br />

vari indexer: i processi distributor vengono progettati per inviare le pagine agli<br />

indexer a diverse velocità, a seconda del processing speed di ogni nodo indexer.<br />

Con il secondo metodo, inoltre, i nodi indexer ricevono i dati da elaborare dalla<br />

rete e scrivono i risultati temporanei su disco: non vi è il rischio che ci siano<br />

conflitti sulle risorse; nel primo caso invece i processi devono leggere e scrivere<br />

su disco e le due fasi potrebbero interferire tra di loro. La distribuzione runtime ha<br />

però lo svantaggio di richiedere una gestione più complessa nel caso di<br />

malfunzionamento di un nodo indexer, perchè si perde il subset di pagine che<br />

questo aveva in memoria e che aveva già processato: bisogna quindi recuperare<br />

questo subset dai nodi indexer e ritrasmetterlo.<br />

Collecting global statistic. Alcuni autori suggeriscono di calcolare le statistiche<br />

globali sulla collezione al momento della ricerca (query time); questo approccio<br />

richiede però che i vari query server si scambino le statistiche sul proprio subset<br />

mantenute nel lexicon: dato che il query response time è un parametro critico del<br />

sistema, un simile approccio potrebbe introdurre un ritardo non accettabile dovuto<br />

alle comunicazioni sulla rete locale tra i vari server.<br />

132


8 – Information retrieval e Web<br />

Una soluzione alternativa consiste nell’avere un server dedicato che viene usato<br />

per il calcolo dei dati statistici: in tal modo tutte le attività di calcolo vengono<br />

eseguite in parallelo con le altre operazioni di indexing.<br />

Presentiamo per concludere l’architettura di Google, le sue strutture generali e<br />

come queste interagiscono tra di loro; la scelta di Google non è dovuta al fatto che<br />

sia migliore degli altri motori di ricerca (opinione comunque sostenuta da molti),<br />

ma per il semplice motivo che, essendo parte di un progetto accademico (portato<br />

avanti dall’università di Stanford), è l’unico per cui siano disponibili informazioni<br />

dettagliate.<br />

Figura 30 - Architettura di Google<br />

133


8 – Information retrieval e Web<br />

Il crawling del web viene eseguito da diversi crawler distribuiti e comandati da un<br />

URL server che invia la lista degli URL che ogni crawler deve recuperare. Le<br />

pagine web che vengono scaricate sono poi inviate allo store server che le<br />

comprime e le memorizza in un repository; ogni pagina web ha un identificatore<br />

univoco chiamato docID che viene assegnato ogni volta che un URL viene<br />

identificato su una pagina qualsiasi.<br />

La funzione di indexing viene svolta da un indexer e un sorter; il primo legge il<br />

repository, decomprime i documenti e ne esegue il parsing, ogni documento viene<br />

convertito in un set di occorrenze di termini chiamate hit; gli hit sono degli oggetti<br />

che memorizzano il termine, la sua posizione nel documento, le dimensioni del<br />

font, se si trova in un titolo, sottotitolo, ecc.<br />

L’indexer distribuisce questi hit in un set di barrels, creando una sorta di indice<br />

parzialmente ordinato; l’indexer inoltre esegue il parsing di tutti i link presenti<br />

nelle pagine e memorizza le informazioni così ottenute in anchor file (in fase di<br />

ricerca viene anche valutato il contenuto testuale dei link).<br />

L’URL resolver legge l’anchor file, memorizza il testo dei link nel forward index<br />

e lo associa con il docID a cui punta il link; inoltre genera un database in cui<br />

memorizza, per ogni link, il docID associato alla pagine web su cui si trova e<br />

quello della pagina a cui punta. Tale database viene utilizzato per calcolare il<br />

valore di PageRank per i vari documenti.<br />

Il sorter analizza i barrel, li ordina per wordID e genera l’inverted index vero e<br />

proprio; un programma chiamato DumpLexicon associa una serie di informazioni<br />

presenti nell’inverted index con quelle generate dall’indexer e crea un nuovo<br />

lexicon che verrà utilizzato dal searcher.<br />

Il searcher gira su un web server ed utilizza il lexicon, l’inverted index e le<br />

informazioni generate da PageRank per risolvere le query dell’utente.<br />

134


Bibliografia<br />

GROSSMAN, FRIEDER, Information retrieval: algorithms and heuristics<br />

– Kluver Publishers, 1998<br />

VAN RIJSBERGEN, Information retrieval<br />

Capitolo 1 Concetti generali<br />

DELLA ROCCA, Sistemi a tecnologia avanzata per l’acquisizione,<br />

l’elaborazione ed il recupero dell’informazione bibliografica<br />

WEISS, Glossary for informazion retrieval (1997)<br />

1.1 Schema di un information retrieval system<br />

1.2 Effectiveness ed efficiency<br />

Capitolo 2 Automatic text analysis<br />

SALTON, BUCKLEY, Approaches to text retrieval for structured<br />

documents (1990)<br />

Capitolo 3 Strategie di retrieval<br />

CIACCIA, Dispense del corso di sistemi informativi II, Università<br />

di Bologna (1999)<br />

YAN, GARCIA-MOLINA, Index structures for information<br />

filtering under the vector space model<br />

3.1 Boolean query<br />

3.2 Extended (Weighted) boolean query<br />

3.3 Modelli booleani estesi – MMM=Mixed Min and Max<br />

3.4 Inference network<br />

3.5 Vector space model<br />

BERRY, DRMAC, JESSUP, Matrices, vector spaces and<br />

information retrieval<br />

3.6 Probabilistic retrieval<br />

135


Bibliografia<br />

LAFFERTY, ZHAI, Probabilistic IR models based on document<br />

and query generation<br />

ROLLEKE, BLOMER, Probabilistic logical information retrieval<br />

for content, hypertext and database querying<br />

3.7 Genetic algorithm<br />

CHEN, Machine learning for information retrieval: neural<br />

networks, sysmbolic learning and genetic algorithms<br />

Capitolo 4 Utility<br />

BAEZA-YATES, Text Retrieval: theory and practice<br />

JING, CROFT, An association thesaurus for information retrieval<br />

4.1 Relevance feedback<br />

4.2 Parsing<br />

FOX B., FOX C.J., Efficient stemmer generation<br />

PORTER, An algorithm for suffix striping (1980)<br />

RILOFF, Little words can make a big difference for text<br />

classification<br />

SADAKANE, A fast algorithm for making suffix arrays<br />

4.3 Clustering – Classificazione dei documenti<br />

CUTTING, PEDERSEN, KARGER, TUKEY, Scatter/gather: a<br />

cluster-based approach to browsing large document collections<br />

(1992)<br />

FASULO, An analysis of recent work on clustering algorithms<br />

(1999)<br />

JOACHIMS, A probabilistic analysis of the Rocchio algorithm<br />

with TFIDF for text categorization (1996)<br />

LEVSKI, ALLAN, Improving interactive retrieval by combining<br />

ranked lists and clustering<br />

136


Bibliografia<br />

MAKOTO, TAKENOBU, Hierarchical bayesian clustering for<br />

automatic text classification (1995)<br />

RAJARAMAN, PAN, Document clustering using 3-tuples<br />

SALTON, ARAYA, On the use of clustered file organization in<br />

information search and retrieval (1989)<br />

SALTON, BUCKLEY, Approaches to global text analysis (1990)<br />

STOCKBURGER, Cluster analysis<br />

VOORHEES, Implementing agglomerative hierarchic clustering<br />

algorithms for use in document retrieval (1986)<br />

VOORHEES, <strong>The</strong> cluster hypotesis revisted (1985)<br />

VOORHEES, <strong>The</strong> efficiency of inverted index and cluster searches<br />

4.4 Latent semantic indexing (LSI)<br />

ASHWORTH, An overview of latent semantic indexing (2001)<br />

BERRY, DUMAIS, O’BRIEN, Using linear algebra for intelligent<br />

information retrieval (1994)<br />

BERRY, DUMAIS, SHIPPY, A case study of latent semantic<br />

indexing (1995)<br />

DEERWESTER, DUMAIS, Indexing by latent semantic indexing<br />

HONG, An overview of latent semantic indexing (2000)<br />

Capitolo 5 Implementazioni<br />

5.1 Inverted index<br />

CLARKE, CORMACK, Dynamic inverted indexes for a<br />

distributed full-text retrieval system<br />

CUTTING, PEDERSEN, Optimizations for dynamic inverted<br />

index maintenance<br />

FRIEDER G., GROSSMAN, FRIEDER G., CHOWDHURY,<br />

Efficiency considerations for scalable information retrieval servers<br />

LEE, YOO, YOON, Index structures for structured documents<br />

LUCARELLA, A search strategy for large document bases<br />

137


Bibliografia<br />

MOFFAT, ZOBEL, Compression and fast indexing for multi-<br />

gigabyte text databases<br />

TOMASIC, GARCIA-MOLINA, SHOENS, Incremental updates<br />

of inverted lists for text document retrieval<br />

WONG, LEE, Implementations of partial document ranking using<br />

inverted files (1992)<br />

YAN, GARCIA-MOLINA, Index structures for selective<br />

dissemination of information under the boolean model (1993)<br />

ZOBEL, MOFFAT, RAMAMOHANARAO, Inverted files versus<br />

signature files for text indexing (1998)<br />

ZOBEL, MOFFAT, SACKS-DAVIS, An efficient indexing<br />

technique for full-text database systems (1992)<br />

5.2 Signature file<br />

DERVOS, MANOLOPOULOS, LINARDIS, Comparison of<br />

signature file models with superimposed coding (1998)<br />

LEE, KIM, PATEL, Efficient signature file methods for text<br />

retrieval (1995)<br />

NORVAG, Efficient use of signature in object-oriented database<br />

systems<br />

RINFRET, O’NEIL P., O’NEIL E., Bit-sliced index arithmetic<br />

(2001)<br />

Capitolo 6 Integrazione tra IR e database<br />

BAEZA-YATES, NAVARRO, Integrating contents and structure<br />

in text retrieval<br />

CLARKE, CORMACK, BURKOWSKI, An algebra for structured<br />

text search and a framework for its implementation (1994)<br />

DE VRIES, WILSCHUT, On the integration of IR and databases<br />

FUHR, A probabilistic relational model for the integration of IR<br />

and databases<br />

138


Bibliografia<br />

FUHR, Logical and conceptual models for the integration of<br />

information retrieval and database systems<br />

FUHR, Models for integrated information retrieval and database<br />

systems<br />

FUHR, ROLLEKE, A probabilistic NF2 relational algebra for<br />

integrated information retrieval and database systems (1996)<br />

GOLDMAN, SHIVAKUMAR, GARCIA-MOLINA, Proximity<br />

search in databases<br />

GOLDMAN, WIDOM, Interactive query and search in<br />

semistructured databases<br />

GROSSMAN, FRIEDER, HOLMES, ROBERTS, Integrating<br />

structured data and text: a retrieval approach<br />

GROSSMAN, Integrating structured data and text: a relational<br />

approach (1995)<br />

SCHEK, PISTOR, Data structures for an integrated database<br />

management and information retrieval system (1982)<br />

6.1 Integrazione di sistemi esistenti<br />

CALLAN, CROFT, HARDING, <strong>The</strong> INQUERY retrieval system<br />

GU, THIEL, ZHAO,Efficient retrieval of complex objects: query<br />

processing in a hybrid DB and IR system<br />

6.2 Estensione di RDBMS con aggiunta di funzioni di IR<br />

BALOWNEW, BODE, CREMERS, KALINSKI, WOLFF,<br />

ROTTMANN, Maintaining library catalogues with an RDBMS –<br />

A performance study<br />

CHAUDURI, SHIM, Query optimization in the presence of foreign<br />

functions<br />

COTTON, SQL multimedia and application packages (SQL/MM)<br />

project plan (1994)<br />

DAVIS, Creating an extensible, object-relational data management<br />

environment – IBM’S DB2 Universal Database (1996)<br />

139


Bibliografia<br />

DAVIS, Informix Universal Server – Extending the relational<br />

DBMS to manage complex data (1996)<br />

DESSLOCH, MATTOS, Integrating SQL databases with content-<br />

specific search engines<br />

EISENBERG, MELTON, SQL standardization: the next steps<br />

PUTZ, Using a retrieval database for an inverted text index<br />

STONEBRAKER, ANTON, HANSON, Extending a database<br />

system with procedures<br />

STONEBRAKER, Inclusion of new types in relational database<br />

systems<br />

STONEBRAKER, WONG, <strong>The</strong> empire strikes back: DB2<br />

universal database<br />

ZHANG, NAUGHTON, DEWITT, LUO, LOHMAN, On<br />

supporting containment queries in retrieval database management<br />

systems<br />

6.3 Implementazione di un IRS come applicazione di un<br />

RDBMS<br />

KAUFMANN, SCHEK, Text search using database systems<br />

revisted<br />

Capitolo 7 Parallel information retrieval system<br />

BAILEY, HAWKING, A parallel architecture for query processing<br />

over a terabyte of text<br />

CAHOON, McKINLEY, Performance analysis of distributed<br />

information retrieval architectures<br />

FRIEDER G., GROSSMAN, FRIEDER G., CHOWDHURY,<br />

Efficiency considerations for scalable information retrieval servers<br />

GROSSMAN, HOLMES, FRIEDER, A parallel DBMS approach<br />

to IR in TREC-3<br />

140


Bibliografia<br />

HAWKING, <strong>The</strong> design and implementation of a parallel<br />

document retrieval engine<br />

KOPESKY, PANDORA: parallel documentation retrieval<br />

architecture (1996)<br />

LU, McKINLEY, CAHOON, A performance evaluation of parallel<br />

information retrieval on symmetrical multiprocessors<br />

MAMALIS, SPIRAKIS, TOMPAKAS, High performance paralle<br />

text retrieval over large scale document collections: the PFIRE<br />

system<br />

MAMALIS, SPIRAKIS, TOMPAKAS, Optimal high performance<br />

parallel text retrieval via fat trees<br />

MAMALIS, SPIRAKIS, TOMPAKAS, Parallel techniques for<br />

efficient searching over very large text collections<br />

PANAGOPOULOS, FALOUTSOS, Bit-sliced signature files for<br />

very large text databases on a parallel machine architecture<br />

SALTON, BERGMARK, Parallel computations in information<br />

retrieval<br />

SALTON, BUCKLEY, Parallel text search methods<br />

Capitolo 8 Information retrieval e Web<br />

ABITEBOUL, VIANU, Queries and computation on the web<br />

AMATO, RABITTI, SAVINO, Multimedia document search on<br />

the web<br />

AROCENA, MENDELZON, MIHAILA, Applications of a web<br />

query language<br />

BAILEY, HAWKING, Server selection on the world wide web<br />

CARRIERE, KAZMAN, WebQuery: searching and visualizing the<br />

web through connectivity<br />

COOLEY, MOBASHER, SRIVASTAVA, Web mining:<br />

information and pattern discovery on the world wide web<br />

141


Bibliografia<br />

DEAN, HENZINGER, Finding related pages in the world wide<br />

web<br />

FENG, Integrating database and www technologies<br />

FLORESCU, LEVY, MENDELZON, Database techniques for the<br />

world wide web: a survey<br />

FRIEDER G., GROSSMAN, FRIEDER G., CHOWDHURY,<br />

Efficiency considerations for scalable information retrieval servers<br />

HU, CHEN, SCHMALZ, RITTER, An overview of world wide<br />

web search technologies<br />

HUANG, A survey on web information retrieval technologies<br />

KOBAYASHI, TAKEDA, Information retrieval on the web<br />

KONOPNICKI, SHMUELI, Bringing database functionality on the<br />

WWW<br />

LAWRENCE, GILES, BOLLACKER, Digital libraries and<br />

autonomous citation indexing (1999)<br />

LAWRENCE, GILES, Searching the world wide web (1998)<br />

MAY, LAUSEN, Information extraction from the web (2000)<br />

MENDELZON, MIHAILA, MILO, Querying the world wide web<br />

8.1 Indexing<br />

8.2 Crawler/robot<br />

CHO, GARCIA-MOLINA, PAGE, Efficient crawling through<br />

URL ordering<br />

8.3 Clustering<br />

MODHA, SPANGLER, Clustering hypertext with applications to<br />

web searching<br />

ZAMIR, ETZIONI, Web document clustering: a feasibility<br />

demonstration<br />

ZAMIR, ETZIONI, MADANI, KARP, Fast and intuitive clustering<br />

of web documents<br />

8.4 Metasearch navigator<br />

142


Bibliografia<br />

SVIDZINSKA, A world wide web meta search engine using an<br />

automatic query routing algorithm (2001)<br />

8.5 Ranking algorithm<br />

BHARAT, HENZINGER, Improved algorithms for topic<br />

distillation in a hyperlinked environment<br />

CUTLER, SHIH, MENG, Using the structure of HTML documents<br />

to improve retrieval<br />

HENZINGER, HEYDON, MITZENMAKER, NAJORK,<br />

Measuring index quality using random walks on the web<br />

KING, KOBAYASHI, Information retrieval and ranking the web:<br />

benchmarking studies (1999)<br />

KLEINBERG, Authoritative source in a hyperlinked environment<br />

LJOSLAND, Evaluation of web search engines and search for<br />

better ranking algorithms (1999)<br />

PAGE, <strong>The</strong> PageRank citation ranking: bringing order to the web<br />

(1998)<br />

ZHANG, DONG, An efficient algorithm to rank web resources<br />

ZHENG, JORDAN, Stable algorithms for link analysis<br />

8.6 Direzioni di ricerca futura<br />

JAMES, POOCH, A review of web searching studies and a<br />

framework for future research (2000)<br />

LAWRENCE, Context in web search (2000)<br />

LAWRENCE, GILES, Context and page analysis for improved<br />

web search (1998)<br />

ZHU, GAUCH, Incorporating quality metrics in<br />

centralized/distributed information retrieval on the world wide web<br />

8.7 Architettura di un motore di ricerca<br />

BRIN, PAGE, <strong>The</strong> anatomy of a large-scale hypertextual web<br />

search engine<br />

143


Bibliografia<br />

JEONG, OMIECINSKI, Inverted file partitioning schemes in<br />

multiple disk systems (1993)<br />

KWOK, ETZIONI, WELD, Scaling question answering to the web<br />

LU, Scalable distributed architectures for information retrieval<br />

MELNIK, RAGHAVAN, YANG, GARCIA-MOLINA, Building a<br />

distributed full-text index for the web<br />

TOMASIC, GARCIA-MOLINA, Caching and database scaling in<br />

distributed shared-nothing information retrieval systems<br />

TOMASIC, GARCIA-MOLINA, Performance of inverted indices<br />

in distributed text document retrieval systems<br />

TOMASIC, GARCIA-MOLINA, Performance of inverted indices<br />

in shared-nothing distributed text document information retrieval<br />

systems<br />

TOMASIC, GARCIA-MOLINA, Query processing and inverted<br />

indices in shared-nothing distributed text document information<br />

retrieval systems (1992)<br />

La maggior parte degli articoli citati è reperibile sui seguenti siti:<br />

• <strong>Research</strong>index – <strong>The</strong> NECI Scientific <strong>Lite</strong>rature Digital Library<br />

http://citeseer.nj.nec.com/cs<br />

• Stanford University Database <strong>Group</strong><br />

http://www-db.stanford.edu<br />

144

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!